diff --git a/.codecov.yml b/.codecov.yml index fead3ad004f72c..0a5b8d6c8fa7de 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -5,7 +5,7 @@ coverage: status: project: default: - threshold: 0.2% + threshold: 2.0% ignore: - lib/spack/spack/test/.* diff --git a/.devcontainer/devcontainer.json b/.devcontainer/ubuntu20.04/devcontainer.json similarity index 84% rename from .devcontainer/devcontainer.json rename to .devcontainer/ubuntu20.04/devcontainer.json index ec4c2690b70e72..325e6e57fdc109 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/ubuntu20.04/devcontainer.json @@ -1,4 +1,5 @@ { + "name": "Ubuntu 20.04", "image": "ghcr.io/spack/ubuntu20.04-runner-amd64-gcc-11.4:2023.08.01", "postCreateCommand": "./.devcontainer/postCreateCommand.sh" } diff --git a/.devcontainer/ubuntu22.04/devcontainer.json b/.devcontainer/ubuntu22.04/devcontainer.json new file mode 100644 index 00000000000000..c4b5d24302bff2 --- /dev/null +++ b/.devcontainer/ubuntu22.04/devcontainer.json @@ -0,0 +1,5 @@ +{ + "name": "Ubuntu 22.04", + "image": "ghcr.io/spack/ubuntu-22.04:v2024-05-07", + "postCreateCommand": "./.devcontainer/postCreateCommand.sh" +} diff --git a/.github/workflows/audit.yaml b/.github/workflows/audit.yaml index 69f1781f5370d5..4cd04440215408 100644 --- a/.github/workflows/audit.yaml +++ b/.github/workflows/audit.yaml @@ -28,7 +28,7 @@ jobs: run: shell: ${{ matrix.system.shell }} steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 with: python-version: ${{inputs.python_version}} @@ -40,6 +40,8 @@ jobs: run: | python -m pip install --upgrade pywin32 - name: Package audits (with coverage) + env: + COVERAGE_FILE: coverage/.coverage-audits-${{ matrix.system.os }} if: ${{ inputs.with_coverage == 'true' && runner.os != 'Windows' }} run: | . share/spack/setup-env.sh @@ -47,27 +49,26 @@ jobs: coverage run $(which spack) audit configs coverage run $(which spack) -d audit externals coverage combine - coverage xml - name: Package audits (without coverage) if: ${{ inputs.with_coverage == 'false' && runner.os != 'Windows' }} run: | - . share/spack/setup-env.sh + . share/spack/setup-env.sh spack -d audit packages spack -d audit configs spack -d audit externals - name: Package audits (without coverage) if: ${{ runner.os == 'Windows' }} run: | - . share/spack/setup-env.sh + . share/spack/setup-env.sh spack -d audit packages ./share/spack/qa/validate_last_exit.ps1 spack -d audit configs ./share/spack/qa/validate_last_exit.ps1 spack -d audit externals ./share/spack/qa/validate_last_exit.ps1 - - uses: codecov/codecov-action@e28ff129e5465c2c0dcc6f003fc735cb6ae0c673 - if: ${{ inputs.with_coverage == 'true' }} + - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 + if: ${{ inputs.with_coverage == 'true' && runner.os != 'Windows' }} with: - flags: unittests,audits - token: ${{ secrets.CODECOV_TOKEN }} - verbose: true + name: coverage-audits-${{ matrix.system.os }} + path: coverage + include-hidden-files: true diff --git a/.github/workflows/bootstrap.yml b/.github/workflows/bootstrap.yml index 8e220b12bfdb0c..c9e69d3026df58 100644 --- a/.github/workflows/bootstrap.yml +++ b/.github/workflows/bootstrap.yml @@ -37,7 +37,7 @@ jobs: make patch unzip which xz python3 python3-devel tree \ cmake bison - name: Checkout - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 with: fetch-depth: 0 - name: Bootstrap clingo @@ -53,33 +53,27 @@ jobs: runs-on: ${{ matrix.runner }} strategy: matrix: - runner: ['macos-13', 'macos-14', "ubuntu-latest", "windows-latest"] + runner: ['macos-13', 'macos-14', "ubuntu-latest"] steps: - name: Setup macOS - if: ${{ matrix.runner != 'ubuntu-latest' && matrix.runner != 'windows-latest' }} + if: ${{ matrix.runner != 'ubuntu-latest' }} run: | brew install cmake bison tree - name: Checkout - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 with: fetch-depth: 0 - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 with: python-version: "3.12" - name: Bootstrap clingo - env: - SETUP_SCRIPT_EXT: ${{ matrix.runner == 'windows-latest' && 'ps1' || 'sh' }} - SETUP_SCRIPT_SOURCE: ${{ matrix.runner == 'windows-latest' && './' || 'source ' }} - USER_SCOPE_PARENT_DIR: ${{ matrix.runner == 'windows-latest' && '$env:userprofile' || '$HOME' }} - VALIDATE_LAST_EXIT: ${{ matrix.runner == 'windows-latest' && './share/spack/qa/validate_last_exit.ps1' || '' }} run: | - ${{ env.SETUP_SCRIPT_SOURCE }}share/spack/setup-env.${{ env.SETUP_SCRIPT_EXT }} + source share/spack/setup-env.sh spack bootstrap disable github-actions-v0.5 spack bootstrap disable github-actions-v0.4 spack external find --not-buildable cmake bison spack -d solve zlib - ${{ env.VALIDATE_LAST_EXIT }} - tree ${{ env.USER_SCOPE_PARENT_DIR }}/.spack/bootstrap/store/ + tree $HOME/.spack/bootstrap/store/ gnupg-sources: runs-on: ${{ matrix.runner }} @@ -96,7 +90,7 @@ jobs: if: ${{ matrix.runner == 'ubuntu-latest' }} run: sudo rm -rf $(command -v gpg gpg2 patchelf) - name: Checkout - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 with: fetch-depth: 0 - name: Bootstrap GnuPG @@ -125,7 +119,7 @@ jobs: run: | sudo rm -rf $(which gpg) $(which gpg2) $(which patchelf) - name: Checkout - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 with: fetch-depth: 0 - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 @@ -167,4 +161,45 @@ jobs: run: | source share/spack/setup-env.sh spack -d gpg list - tree ~/.spack/bootstrap/store/ + tree $HOME/.spack/bootstrap/store/ + - name: Bootstrap File + run: | + source share/spack/setup-env.sh + spack -d python share/spack/qa/bootstrap-file.py + tree $HOME/.spack/bootstrap/store/ + + windows: + runs-on: "windows-latest" + steps: + - name: Checkout + uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 + with: + fetch-depth: 0 + - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 + with: + python-version: "3.12" + - name: Setup Windows + run: | + Remove-Item -Path (Get-Command gpg).Path + Remove-Item -Path (Get-Command file).Path + - name: Bootstrap clingo + run: | + ./share/spack/setup-env.ps1 + spack bootstrap disable github-actions-v0.5 + spack bootstrap disable github-actions-v0.4 + spack external find --not-buildable cmake bison + spack -d solve zlib + ./share/spack/qa/validate_last_exit.ps1 + tree $env:userprofile/.spack/bootstrap/store/ + - name: Bootstrap GnuPG + run: | + ./share/spack/setup-env.ps1 + spack -d gpg list + ./share/spack/qa/validate_last_exit.ps1 + tree $env:userprofile/.spack/bootstrap/store/ + - name: Bootstrap File + run: | + ./share/spack/setup-env.ps1 + spack -d python share/spack/qa/bootstrap-file.py + ./share/spack/qa/validate_last_exit.ps1 + tree $env:userprofile/.spack/bootstrap/store/ diff --git a/.github/workflows/build-containers.yml b/.github/workflows/build-containers.yml index a9a84a30371517..a2d76855353096 100644 --- a/.github/workflows/build-containers.yml +++ b/.github/workflows/build-containers.yml @@ -55,7 +55,7 @@ jobs: if: github.repository == 'spack/spack' steps: - name: Checkout - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 - uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 id: docker_meta @@ -87,7 +87,7 @@ jobs: fi - name: Upload Dockerfile - uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 with: name: dockerfiles_${{ matrix.dockerfile[0] }} path: dockerfiles @@ -96,7 +96,7 @@ jobs: uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf - name: Set up Docker Buildx - uses: docker/setup-buildx-action@988b5a0280414f521da01fcc63a27aeeb4b104db + uses: docker/setup-buildx-action@c47758b77c9736f4b2ef4073d4d51994fabfe349 - name: Log in to GitHub Container Registry uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 @@ -113,7 +113,7 @@ jobs: password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build & Deploy ${{ matrix.dockerfile[0] }} - uses: docker/build-push-action@5cd11c3a4ced054e52742c5fd54dca954e0edd85 + uses: docker/build-push-action@4f58ea79222b3b9dc2c8bbdd6debcef730109a75 with: context: dockerfiles/${{ matrix.dockerfile[0] }} platforms: ${{ matrix.dockerfile[1] }} @@ -126,7 +126,7 @@ jobs: needs: deploy-images steps: - name: Merge Artifacts - uses: actions/upload-artifact/merge@50769540e7f4bd5e21e526ee35c689e35e0d6874 + uses: actions/upload-artifact/merge@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 with: name: dockerfiles pattern: dockerfiles_* diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b9e4deec37f869..18e914713bc668 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -15,18 +15,6 @@ concurrency: cancel-in-progress: true jobs: - prechecks: - needs: [ changes ] - uses: ./.github/workflows/valid-style.yml - secrets: inherit - with: - with_coverage: ${{ needs.changes.outputs.core }} - all-prechecks: - needs: [ prechecks ] - runs-on: ubuntu-latest - steps: - - name: Success - run: "true" # Check which files have been updated by the PR changes: runs-on: ubuntu-latest @@ -36,7 +24,7 @@ jobs: core: ${{ steps.filter.outputs.core }} packages: ${{ steps.filter.outputs.packages }} steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 if: ${{ github.event_name == 'push' }} with: fetch-depth: 0 @@ -79,13 +67,34 @@ jobs: needs: [ prechecks, changes ] uses: ./.github/workflows/bootstrap.yml secrets: inherit + unit-tests: if: ${{ github.repository == 'spack/spack' && needs.changes.outputs.core == 'true' }} needs: [ prechecks, changes ] uses: ./.github/workflows/unit_tests.yaml secrets: inherit + + prechecks: + needs: [ changes ] + uses: ./.github/workflows/valid-style.yml + secrets: inherit + with: + with_coverage: ${{ needs.changes.outputs.core }} + + all-prechecks: + needs: [ prechecks ] + runs-on: ubuntu-latest + steps: + - name: Success + run: "true" + + coverage: + needs: [ unit-tests, prechecks ] + uses: ./.github/workflows/coverage.yml + secrets: inherit + all: - needs: [ unit-tests, bootstrap ] + needs: [ coverage, bootstrap ] runs-on: ubuntu-latest steps: - name: Success diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml new file mode 100644 index 00000000000000..1456645b2a63d8 --- /dev/null +++ b/.github/workflows/coverage.yml @@ -0,0 +1,34 @@ +name: coverage + +on: + workflow_call: + +jobs: + # Upload coverage reports to codecov once as a single bundle + upload: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 + - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 + with: + python-version: '3.11' + cache: 'pip' + + - name: Install python dependencies + run: pip install -r .github/workflows/requirements/coverage/requirements.txt + + - name: Download coverage artifact files + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 + with: + pattern: coverage-* + path: coverage + merge-multiple: true + + - run: ls -la coverage + - run: coverage combine -a coverage/.coverage* + - run: coverage xml + + - name: "Upload coverage report to CodeCov" + uses: codecov/codecov-action@b9fd7d16f6d7d1b5d2bec1a2887e65ceed900238 + with: + verbose: true diff --git a/.github/workflows/nightly-win-builds.yml b/.github/workflows/nightly-win-builds.yml index 4c6a236ac3416a..4e040a05ea2a6a 100644 --- a/.github/workflows/nightly-win-builds.yml +++ b/.github/workflows/nightly-win-builds.yml @@ -14,7 +14,7 @@ jobs: build-paraview-deps: runs-on: windows-latest steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 with: fetch-depth: 0 - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 diff --git a/.github/workflows/requirements/coverage/requirements.txt b/.github/workflows/requirements/coverage/requirements.txt new file mode 100644 index 00000000000000..1bf0f9a76bf272 --- /dev/null +++ b/.github/workflows/requirements/coverage/requirements.txt @@ -0,0 +1 @@ +coverage==7.6.1 diff --git a/.github/workflows/unit_tests.yaml b/.github/workflows/unit_tests.yaml index 742d2508d083bd..7167c14426e7e6 100644 --- a/.github/workflows/unit_tests.yaml +++ b/.github/workflows/unit_tests.yaml @@ -40,7 +40,7 @@ jobs: on_develop: false steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 with: fetch-depth: 0 - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 @@ -76,19 +76,20 @@ jobs: SPACK_PYTHON: python SPACK_TEST_PARALLEL: 2 COVERAGE: true + COVERAGE_FILE: coverage/.coverage-${{ matrix.os }}-python${{ matrix.python-version }} UNIT_TEST_COVERAGE: ${{ matrix.python-version == '3.11' }} run: | share/spack/qa/run-unit-tests - - uses: codecov/codecov-action@e28ff129e5465c2c0dcc6f003fc735cb6ae0c673 + - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 with: - flags: unittests,linux,${{ matrix.concretizer }} - token: ${{ secrets.CODECOV_TOKEN }} - verbose: true + name: coverage-${{ matrix.os }}-python${{ matrix.python-version }} + path: coverage + include-hidden-files: true # Test shell integration shell: runs-on: ubuntu-latest steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 with: fetch-depth: 0 - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 @@ -112,11 +113,11 @@ jobs: COVERAGE: true run: | share/spack/qa/run-shell-tests - - uses: codecov/codecov-action@e28ff129e5465c2c0dcc6f003fc735cb6ae0c673 + - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 with: - flags: shelltests,linux - token: ${{ secrets.CODECOV_TOKEN }} - verbose: true + name: coverage-shell + path: coverage + include-hidden-files: true # Test RHEL8 UBI with platform Python. This job is run # only on PRs modifying core Spack @@ -129,7 +130,7 @@ jobs: dnf install -y \ bzip2 curl file gcc-c++ gcc gcc-gfortran git gnupg2 gzip \ make patch tcl unzip which xz - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 - name: Setup repo and non-root user run: | git --version @@ -148,7 +149,7 @@ jobs: clingo-cffi: runs-on: ubuntu-latest steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 with: fetch-depth: 0 - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 @@ -170,13 +171,14 @@ jobs: - name: Run unit tests (full suite with coverage) env: COVERAGE: true + COVERAGE_FILE: coverage/.coverage-clingo-cffi run: | share/spack/qa/run-unit-tests - - uses: codecov/codecov-action@e28ff129e5465c2c0dcc6f003fc735cb6ae0c673 + - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 with: - flags: unittests,linux,clingo - token: ${{ secrets.CODECOV_TOKEN }} - verbose: true + name: coverage-clingo-cffi + path: coverage + include-hidden-files: true # Run unit tests on MacOS macos: runs-on: ${{ matrix.os }} @@ -185,7 +187,7 @@ jobs: os: [macos-13, macos-14] python-version: ["3.11"] steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 with: fetch-depth: 0 - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 @@ -197,10 +199,11 @@ jobs: pip install --upgrade pytest coverage[toml] pytest-xdist pytest-cov - name: Setup Homebrew packages run: | - brew install dash fish gcc gnupg2 kcov + brew install dash fish gcc gnupg kcov - name: Run unit tests env: SPACK_TEST_PARALLEL: 4 + COVERAGE_FILE: coverage/.coverage-${{ matrix.os }}-python${{ matrix.python-version }} run: | git --version . .github/workflows/bin/setup_git.sh @@ -209,11 +212,11 @@ jobs: $(which spack) solve zlib common_args=(--dist loadfile --tx '4*popen//python=./bin/spack-tmpconfig python -u ./bin/spack python' -x) $(which spack) unit-test --verbose --cov --cov-config=pyproject.toml --cov-report=xml:coverage.xml "${common_args[@]}" - - uses: codecov/codecov-action@e28ff129e5465c2c0dcc6f003fc735cb6ae0c673 + - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 with: - flags: unittests,macos - token: ${{ secrets.CODECOV_TOKEN }} - verbose: true + name: coverage-${{ matrix.os }}-python${{ matrix.python-version }} + path: coverage + include-hidden-files: true # Run unit tests on Windows windows: defaults: @@ -222,7 +225,7 @@ jobs: powershell Invoke-Expression -Command "./share/spack/qa/windows_test_setup.ps1"; {0} runs-on: windows-latest steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 with: fetch-depth: 0 - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 @@ -235,13 +238,13 @@ jobs: run: | ./.github/workflows/bin/setup_git.ps1 - name: Unit Test + env: + COVERAGE_FILE: coverage/.coverage-windows run: | spack unit-test -x --verbose --cov --cov-config=pyproject.toml ./share/spack/qa/validate_last_exit.ps1 - coverage combine -a - coverage xml - - uses: codecov/codecov-action@e28ff129e5465c2c0dcc6f003fc735cb6ae0c673 + - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 with: - flags: unittests,windows - token: ${{ secrets.CODECOV_TOKEN }} - verbose: true + name: coverage-windows + path: coverage + include-hidden-files: true diff --git a/.github/workflows/valid-style.yml b/.github/workflows/valid-style.yml index feaa64484e3ef2..d107fdb1978b1d 100644 --- a/.github/workflows/valid-style.yml +++ b/.github/workflows/valid-style.yml @@ -18,7 +18,7 @@ jobs: validate: runs-on: ubuntu-latest steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 with: python-version: '3.11' @@ -35,7 +35,7 @@ jobs: style: runs-on: ubuntu-latest steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 with: fetch-depth: 0 - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 @@ -70,7 +70,7 @@ jobs: dnf install -y \ bzip2 curl file gcc-c++ gcc gcc-gfortran git gnupg2 gzip \ make patch tcl unzip which xz - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 + - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 - name: Setup repo and non-root user run: | git --version @@ -85,5 +85,64 @@ jobs: source share/spack/setup-env.sh spack debug report spack -d bootstrap now --dev - spack style -t black + spack -d style -t black spack unit-test -V + import-check: + runs-on: ubuntu-latest + steps: + - uses: julia-actions/setup-julia@v2 + with: + version: '1.10' + - uses: julia-actions/cache@v2 + + # PR: use the base of the PR as the old commit + - name: Checkout PR base commit + if: github.event_name == 'pull_request' + uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 + with: + ref: ${{ github.event.pull_request.base.sha }} + path: old + # not a PR: use the previous commit as the old commit + - name: Checkout previous commit + if: github.event_name != 'pull_request' + uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 + with: + fetch-depth: 2 + path: old + - name: Checkout previous commit + if: github.event_name != 'pull_request' + run: git -C old reset --hard HEAD^ + + - name: Checkout new commit + uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 + with: + path: new + - name: Install circular import checker + uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 + with: + repository: haampie/circular-import-fighter + ref: 555519c6fd5564fd2eb844e7b87e84f4d12602e2 + path: circular-import-fighter + - name: Install dependencies + working-directory: circular-import-fighter + run: make -j dependencies + - name: Import cycles before + working-directory: circular-import-fighter + run: make SPACK_ROOT=../old && cp solution solution.old + - name: Import cycles after + working-directory: circular-import-fighter + run: make clean-graph && make SPACK_ROOT=../new && cp solution solution.new + - name: Compare import cycles + working-directory: circular-import-fighter + run: | + edges_before="$(grep -oP 'edges to delete: \K\d+' solution.old)" + edges_after="$(grep -oP 'edges to delete: \K\d+' solution.new)" + if [ "$edges_after" -gt "$edges_before" ]; then + printf '\033[1;31mImport check failed: %s imports need to be deleted, ' "$edges_after" + printf 'previously this was %s\033[0m\n' "$edges_before" + printf 'Compare \033[1;97m"Import cycles before"\033[0m and ' + printf '\033[1;97m"Import cycles after"\033[0m to see problematic imports.\n' + exit 1 + else + printf '\033[1;32mImport check passed: %s <= %s\033[0m\n' "$edges_after" "$edges_before" + fi diff --git a/CHANGELOG.md b/CHANGELOG.md index e3d45218ac6ddf..b39f065e045e89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,64 @@ +# v0.22.2 (2024-09-21) + +## Bugfixes +- Forward compatibility with Spack 0.23 packages with language dependencies (#45205, #45191) +- Forward compatibility with `urllib` from Python 3.12.6+ (#46453, #46483) +- Bump vendored `archspec` for better aarch64 support (#45721, #46445) +- Support macOS Sequoia (#45018, #45127) +- Fix regression in `{variants.X}` and `{variants.X.value}` format strings (#46206) +- Ensure shell escaping of environment variable values in load and activate commands (#42780) +- Fix an issue where `spec[pkg]` considers specs outside the current DAG (#45090) +- Do not halt concretization on unknown variants in externals (#45326) +- Improve validation of `develop` config section (#46485) +- Explicitly disable `ccache` if turned off in config, to avoid cache pollution (#45275) +- Improve backwards compatibility in `include_concrete` (#45766) +- Fix issue where package tags were sometimes repeated (#45160) +- Make `setup-env.sh` "sourced only" by dropping execution bits (#45641) +- Make certain source/binary fetch errors recoverable instead of a hard error (#45683) +- Remove debug statements in package hash computation (#45235) +- Remove redundant clingo warnings (#45269) +- Remove hard-coded layout version (#45645) +- Do not initialize previous store state in `use_store` (#45268) +- Docs improvements (#46475) + +## Package updates +- `chapel` major update (#42197, #44931, #45304) + +# v0.22.1 (2024-07-04) + +## Bugfixes +- Fix reuse of externals on Linux (#44316) +- Ensure parent gcc-runtime version >= child (#44834, #44870) +- Ensure the latest gcc-runtime is rpath'ed when multiple exist among link deps (#44219) +- Improve version detection of glibc (#44154) +- Improve heuristics for solver (#44893, #44976, #45023) +- Make strong preferences override reuse (#44373) +- Reduce verbosity when C compiler is missing (#44182) +- Make missing ccache executable an error when required (#44740) +- Make every environment view containing `python` a `venv` (#44382) +- Fix external detection for compilers with os but no target (#44156) +- Fix version optimization for roots (#44272) +- Handle common implementations of pagination of tags in OCI build caches (#43136) +- Apply fetched patches to develop specs (#44950) +- Avoid Windows wrappers for filesystem utilities on non-Windows (#44126) +- Fix issue with long filenames in build caches on Windows (#43851) +- Fix formatting issue in `spack audit` (#45045) +- CI fixes (#44582, #43965, #43967, #44279, #44213) + +## Package updates +- protobuf: fix 3.4:3.21 patch checksum (#44443) +- protobuf: update hash for patch needed when="@3.4:3.21" (#44210) +- git: bump v2.39 to 2.45; deprecate unsafe versions (#44248) +- gcc: use -rpath {rpath_dir} not -rpath={rpath dir} (#44315) +- Remove mesa18 and libosmesa (#44264) +- Enforce consistency of `gl` providers (#44307) +- Require libiconv for iconv (#44335, #45026). + Notice that glibc/musl also provide iconv, but are not guaranteed to be + complete. Set `packages:iconv:require:[glibc]` to restore the old behavior. +- py-matplotlib: qualify when to do a post install (#44191) +- rust: fix v1.78.0 instructions (#44127) +- suite-sparse: improve setting of the `libs` property (#44214) +- netlib-lapack: provide blas and lapack together (#44981) # v0.22.0 (2024-05-12) @@ -319,6 +380,16 @@ * 344 committers to packages * 45 committers to core +# v0.21.3 (2024-10-02) + +## Bugfixes +- Forward compatibility with Spack 0.23 packages with language dependencies (#45205, #45191) +- Forward compatibility with `urllib` from Python 3.12.6+ (#46453, #46483) +- Bump `archspec` to 0.2.5-dev for better aarch64 and Windows support (#42854, #44005, + #45721, #46445) +- Support macOS Sequoia (#45018, #45127, #43862) +- CI and test maintenance (#42909, #42728, #46711, #41943, #43363) + # v0.21.2 (2024-03-01) ## Bugfixes diff --git a/README.md b/README.md index 5d39b117b93a33..af2ee583de74e7 100644 --- a/README.md +++ b/README.md @@ -46,13 +46,18 @@ See the [Feature Overview](https://spack.readthedocs.io/en/latest/features.html) for examples and highlights. -To install spack and your first package, make sure you have Python. +To install spack and your first package, make sure you have Python & Git. Then: - $ git clone -c feature.manyFiles=true 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 +> [!TIP] +> `-c feature.manyFiles=true` improves git's performance on repositories with 1,000+ files. +> +> `--depth=2` prunes the git history to reduce the size of the Spack installation. + Documentation ---------------- diff --git a/etc/spack/defaults/config.yaml b/etc/spack/defaults/config.yaml index 686575f8fc01d5..b9c4aee64eee3c 100644 --- a/etc/spack/defaults/config.yaml +++ b/etc/spack/defaults/config.yaml @@ -115,12 +115,6 @@ config: suppress_gpg_warnings: false - # If set to true, Spack will attempt to build any compiler on the spec - # that is not already available. If set to False, Spack will only use - # compilers already configured in compilers.yaml - install_missing_compilers: false - - # If set to true, Spack will always check checksums after downloading # archives. If false, Spack skips the checksum step. checksum: true diff --git a/lib/spack/docs/basic_usage.rst b/lib/spack/docs/basic_usage.rst index 69cbefc083db4d..171a82b6ea1e37 100644 --- a/lib/spack/docs/basic_usage.rst +++ b/lib/spack/docs/basic_usage.rst @@ -1175,6 +1175,17 @@ unspecified version, but packages can depend on other packages with could depend on ``mpich@1.2:`` if it can only build with version ``1.2`` or higher of ``mpich``. +.. note:: Windows Spec Syntax Caveats + Windows has a few idiosyncrasies when it comes to the Spack spec syntax and the use of certain shells + Spack's spec dependency syntax uses the carat (``^``) character, however this is an escape string in CMD + so it must be escaped with an additional carat (i.e. ``^^``). + CMD also will attempt to interpret strings with ``=`` characters in them. Any spec including this symbol + must double quote the string. + + Note: All of these issues are unique to CMD, they can be avoided by using Powershell. + + For more context on these caveats see the related issues: `carat `_ and `equals `_ + Below are more details about the specifiers that you can add to specs. .. _version-specifier: diff --git a/lib/spack/docs/build_settings.rst b/lib/spack/docs/build_settings.rst index d545c70d18dcb3..97c81bf17a40ea 100644 --- a/lib/spack/docs/build_settings.rst +++ b/lib/spack/docs/build_settings.rst @@ -166,3 +166,74 @@ while `py-numpy` still needs an older version: Up to Spack v0.20 ``duplicates:strategy:none`` was the default (and only) behavior. From Spack v0.21 the default behavior is ``duplicates:strategy:minimal``. + +-------- +Splicing +-------- + +The ``splice`` key covers config attributes for splicing specs in the solver. + +"Splicing" is a method for replacing a dependency with another spec +that provides the same package or virtual. There are two types of +splices, referring to different behaviors for shared dependencies +between the root spec and the new spec replacing a dependency: +"transitive" and "intransitive". A "transitive" splice is one that +resolves all conflicts by taking the dependency from the new node. An +"intransitive" splice is one that resolves all conflicts by taking the +dependency from the original root. From a theory perspective, hybrid +splices are possible but are not modeled by Spack. + +All spliced specs retain a ``build_spec`` attribute that points to the +original Spec before any splice occurred. The ``build_spec`` for a +non-spliced spec is itself. + +The figure below shows examples of transitive and intransitive splices: + +.. figure:: images/splices.png + :align: center + +The concretizer can be configured to explicitly splice particular +replacements for a target spec. Splicing will allow the user to make +use of generically built public binary caches, while swapping in +highly optimized local builds for performance critical components +and/or components that interact closely with the specific hardware +details of the system. The most prominent candidate for splicing is +MPI providers. MPI packages have relatively well-understood ABI +characteristics, and most High Performance Computing facilities deploy +highly optimized MPI packages tailored to their particular +hardware. The following config block configures Spack to replace +whatever MPI provider each spec was concretized to use with the +particular package of ``mpich`` with the hash that begins ``abcdef``. + +.. code-block:: yaml + + concretizer: + splice: + explicit: + - target: mpi + replacement: mpich/abcdef + transitive: false + +.. warning:: + + When configuring an explicit splice, you as the user take on the + responsibility for ensuring ABI compatibility between the specs + matched by the target and the replacement you provide. If they are + not compatible, Spack will not warn you and your application will + fail to run. + +The ``target`` field of an explicit splice can be any abstract +spec. The ``replacement`` field must be a spec that includes the hash +of a concrete spec, and the replacement must either be the same +package as the target, provide the virtual that is the target, or +provide a virtual that the target provides. The ``transitive`` field +is optional -- by default, splices will be transitive. + +.. note:: + + With explicit splices configured, it is possible for Spack to + concretize to a spec that does not satisfy the input. For example, + with the config above ``hdf5 ^mvapich2`` will concretize to user + ``mpich/abcdef`` instead of ``mvapich2`` as the MPI provider. Spack + will warn the user in this case, but will not fail the + concretization. diff --git a/lib/spack/docs/build_systems/custompackage.rst b/lib/spack/docs/build_systems/custompackage.rst index 35475fc8ecb2f6..cf5862d6a0db95 100644 --- a/lib/spack/docs/build_systems/custompackage.rst +++ b/lib/spack/docs/build_systems/custompackage.rst @@ -130,14 +130,19 @@ before or after a particular phase. For example, in ``perl``, we see: @run_after("install") def install_cpanm(self): - spec = self.spec - - if spec.satisfies("+cpanm"): - with working_dir(join_path("cpanm", "cpanm")): - perl = spec["perl"].command - perl("Makefile.PL") - make() - make("install") + spec = self.spec + maker = make + cpan_dir = join_path("cpanm", "cpanm") + if sys.platform == "win32": + maker = nmake + cpan_dir = join_path(self.stage.source_path, cpan_dir) + cpan_dir = windows_sfn(cpan_dir) + if "+cpanm" in spec: + with working_dir(cpan_dir): + perl = spec["perl"].command + perl("Makefile.PL") + maker() + maker("install") This extra step automatically installs ``cpanm`` in addition to the base Perl installation. @@ -176,8 +181,14 @@ In the ``perl`` package, we can see: @run_after("build") @on_package_attributes(run_tests=True) - def test(self): - make("test") + def build_test(self): + if sys.platform == "win32": + win32_dir = os.path.join(self.stage.source_path, "win32") + win32_dir = windows_sfn(win32_dir) + with working_dir(win32_dir): + nmake("test", ignore_quotes=True) + else: + make("test") As you can guess, this runs ``make test`` *after* building the package, if and only if testing is requested. Again, this is not specific to diff --git a/lib/spack/docs/build_systems/sconspackage.rst b/lib/spack/docs/build_systems/sconspackage.rst index 8200d0998d73eb..5e4b888c1c239c 100644 --- a/lib/spack/docs/build_systems/sconspackage.rst +++ b/lib/spack/docs/build_systems/sconspackage.rst @@ -49,14 +49,14 @@ following phases: #. ``install`` - install the package Package developers often add unit tests that can be invoked with -``scons test`` or ``scons check``. Spack provides a ``test`` method +``scons test`` or ``scons check``. Spack provides a ``build_test`` method to handle this. Since we don't know which one the package developer -chose, the ``test`` method does nothing by default, but can be easily +chose, the ``build_test`` method does nothing by default, but can be easily overridden like so: .. code-block:: python - def test(self): + def build_test(self): scons("check") diff --git a/lib/spack/docs/chain.rst b/lib/spack/docs/chain.rst index bd0241c8bb81fc..46300e6681a1fd 100644 --- a/lib/spack/docs/chain.rst +++ b/lib/spack/docs/chain.rst @@ -5,9 +5,9 @@ .. chain: -============================ -Chaining Spack Installations -============================ +============================================= +Chaining Spack Installations (upstreams.yaml) +============================================= You can point your Spack installation to another installation to use any packages that are installed there. To register the other Spack instance, diff --git a/lib/spack/docs/conf.py b/lib/spack/docs/conf.py index 9819d6f4d3039f..4873e3e104d6b3 100644 --- a/lib/spack/docs/conf.py +++ b/lib/spack/docs/conf.py @@ -218,6 +218,10 @@ def setup(sphinx): ("py:class", "spack.spec.SpecfileReaderBase"), ("py:class", "spack.install_test.Pb"), ("py:class", "spack.filesystem_view.SimpleFilesystemView"), + ("py:class", "spack.traverse.EdgeAndDepth"), + ("py:class", "archspec.cpu.microarchitecture.Microarchitecture"), + # TypeVar that is not handled correctly + ("py:class", "llnl.util.lang.T"), ] # The reST default role (used for this markup: `text`) to use for all documents. diff --git a/lib/spack/docs/configuration.rst b/lib/spack/docs/configuration.rst index 47cb9e11d244cd..7d2ceee9583444 100644 --- a/lib/spack/docs/configuration.rst +++ b/lib/spack/docs/configuration.rst @@ -286,7 +286,7 @@ When spack queries for configuration parameters, it searches in higher-precedence scopes first. So, settings in a higher-precedence file can override those with the same key in a lower-precedence one. For list-valued settings, Spack *prepends* higher-precedence settings to -lower-precedence settings. Completely ignoring higher-level configuration +lower-precedence settings. Completely ignoring lower-precedence configuration options is supported with the ``::`` notation for keys (see :ref:`config-overrides` below). diff --git a/lib/spack/docs/contribution_guide.rst b/lib/spack/docs/contribution_guide.rst index 68a381be9f7f80..97f181b85b7387 100644 --- a/lib/spack/docs/contribution_guide.rst +++ b/lib/spack/docs/contribution_guide.rst @@ -316,6 +316,215 @@ documentation tests to make sure there are no errors. Documentation changes can in some obfuscated warning messages. If you don't understand what they mean, feel free to ask when you submit your PR. +.. _spack-builders-and-pipelines: + +^^^^^^^^^ +GitLab CI +^^^^^^^^^ + +"""""""""""""""""" +Build Cache Stacks +"""""""""""""""""" + +Spack welcomes the contribution of software stacks of interest to the community. These +stacks are used to test package recipes and generate publicly available build caches. +Spack uses GitLab CI for managing the orchestration of build jobs. + +GitLab Entry Point +~~~~~~~~~~~~~~~~~~ + +Add stack entrypoint to the ``share/spack/gitlab/cloud_pipelines/.gitlab-ci.yml``. There +are two stages required for each new stack, the generation stage and the build stage. + +The generate stage is defined using the job template ``.generate`` configured with +environment variables defining the name of the stack in ``SPACK_CI_STACK_NAME`` and the +platform (``SPACK_TARGET_PLATFORM``) and architecture (``SPACK_TARGET_ARCH``) configuration, +and the tags associated with the class of runners to build on. + +.. note:: + + The ``SPACK_CI_STACK_NAME`` must match the name of the directory containing the + stacks ``spack.yaml``. + + +.. note:: + + The platform and architecture variables are specified in order to select the + correct configurations from the generic configurations used in Spack CI. The + configurations currently available are: + + * ``.cray_rhel_zen4`` + * ``.cray_sles_zen4`` + * ``.darwin_aarch64`` + * ``.darwin_x86_64`` + * ``.linux_aarch64`` + * ``.linux_icelake`` + * ``.linux_neoverse_n1`` + * ``.linux_neoverse_v1`` + * ``.linux_neoverse_v2`` + * ``.linux_power`` + * ``.linux_skylake`` + * ``.linux_x86_64`` + * ``.linux_x86_64_v4`` + + New configurations can be added to accommodate new platforms and architectures. + + +The build stage is defined as a trigger job that consumes the GitLab CI pipeline generated in +the generate stage for this stack. Build stage jobs use the ``.build`` job template which +handles the basic configuration. + +An example entry point for a new stack called ``my-super-cool-stack`` + +.. code-block:: yaml + + .my-super-cool-stack: + extends: [ ".linux_x86_64_v3" ] + variables: + SPACK_CI_STACK_NAME: my-super-cool-stack + tags: [ "all", "tags", "your", "job", "needs"] + + my-super-cool-stack-generate: + extends: [ ".generate", ".my-super-cool-stack" ] + image: my-super-cool-stack-image:0.0.1 + + my-super-cool-stack-build: + extends: [ ".build", ".my-super-cool-stack" ] + trigger: + include: + - artifact: jobs_scratch_dir/cloud-ci-pipeline.yml + job: my-super-cool-stack-generate + strategy: depend + needs: + - artifacts: True + job: my-super-cool-stack-generate + + +Stack Configuration +~~~~~~~~~~~~~~~~~~~ + +The stack configuration is a spack environment file with two additional sections added. +Stack configurations should be located in ``share/spack/gitlab/cloud_pipelines/stacks//spack.yaml``. + +The ``ci`` section is generally used to define stack specific mappings such as image or tags. +For more information on what can go into the ``ci`` section refer to the docs on pipelines. + +The ``cdash`` section is used for defining where to upload the results of builds. Spack configures +most of the details for posting pipeline results to +`cdash.spack.io `_. The only +requirement in the stack configuration is to define a ``build-group`` that is unique, +this is usually the long name of the stack. + +An example stack that builds ``zlib``. + +.. code-block:: yaml + + spack: + view: false + packages: + all: + require: ["%gcc", "target=x86_64_v3"] + specs: + - zlib + + ci: + pipeline-gen + - build-job: + image: my-super-cool-stack-image:0.0.1 + + cdash: + build-group: My Super Cool Stack + +.. note:: + + The ``image`` used in the ``*-generate`` job must match exactly the ``image`` used in the ``build-job``. + When the images do not match the build job may fail. + + +""""""""""""""""""" +Registering Runners +""""""""""""""""""" + +Contributing computational resources to Spack's CI build farm is one way to help expand the +capabilities and offerings of the public Spack build caches. Currently, Spack utilizes linux runners +from AWS, Google, and the University of Oregon (UO). + +Runners require three key peices: +* Runner Registration Token +* Accurate tags +* OIDC Authentication script +* GPG keys + + +Minimum GitLab Runner Version: ``16.1.0`` +`Intallation instructions `_ + +Registration Token +~~~~~~~~~~~~~~~~~~ + +The first step to contribute new runners is to open an issue in the `spack infrastructure `_ +project. This will be reported to the spack infrastructure team who will guide users through the process +of registering new runners for Spack CI. + +The information needed to register a runner is the motivation for the new resources, a semi-detailed description of +the runner, and finallly the point of contact for maintaining the software on the runner. + +The point of contact will then work with the infrastruture team to obtain runner registration token(s) for interacting with +with Spack's GitLab instance. Once the runner is active, this point of contact will also be responsible for updating the +GitLab runner software to keep pace with Spack's Gitlab. + +Tagging +~~~~~~~ + +In the initial stages of runner registration it is important to **exclude** the special tag ``spack``. This will prevent +the new runner(s) from being picked up for production CI jobs while it is configured and evaluated. Once it is determined +that the runner is ready for production use the ``spack`` tag will be added. + +Because gitlab has no concept of tag exclustion, runners that provide specialized resource also require specialized tags. +For example, a basic CPU only x86_64 runner may have a tag ``x86_64`` associated with it. However, a runner containing an +CUDA capable GPU may have the tag ``x86_64-cuda`` to denote that it should only be used for packages that will benefit from +a CUDA capable resource. + +OIDC +~~~~ + +Spack runners use OIDC authentication for connecting to the appropriate AWS bucket +which is used for coordinating the communication of binaries between build jobs. In +order to configure OIDC authentication, Spack CI runners use a python script with minimal +dependencies. This script can be configured for runners as seen here using the ``pre_build_script``. + +.. code-block:: toml + + [[runners]] + pre_build_script = """ + echo 'Executing Spack pre-build setup script' + + for cmd in "${PY3:-}" python3 python; do + if command -v > /dev/null "$cmd"; then + export PY3="$(command -v "$cmd")" + break + fi + done + + if [ -z "${PY3:-}" ]; then + echo "Unable to find python3 executable" + exit 1 + fi + + $PY3 -c "import urllib.request;urllib.request.urlretrieve('https://raw.githubusercontent.com/spack/spack-infrastructure/main/scripts/gitlab_runner_pre_build/pre_build.py', 'pre_build.py')" + $PY3 pre_build.py > envvars + + . ./envvars + rm -f envvars + unset GITLAB_OIDC_TOKEN + """ + +GPG Keys +~~~~~~~~ + +Runners that may be utilized for ``protected`` CI require the registration of an intermediate signing key that +can be used to sign packages. For more information on package signing read :ref:`key_architecture`. + -------- Coverage -------- diff --git a/lib/spack/docs/developer_guide.rst b/lib/spack/docs/developer_guide.rst index 91550f795fd86c..134f0f540f63c8 100644 --- a/lib/spack/docs/developer_guide.rst +++ b/lib/spack/docs/developer_guide.rst @@ -181,10 +181,6 @@ Spec-related modules :mod:`spack.parser` Contains :class:`~spack.parser.SpecParser` and functions related to parsing specs. -:mod:`spack.concretize` - Contains :class:`~spack.concretize.Concretizer` implementation, - which allows site administrators to change Spack's :ref:`concretization-policies`. - :mod:`spack.version` Implements a simple :class:`~spack.version.Version` class with simple comparison semantics. Also implements :class:`~spack.version.VersionRange` diff --git a/lib/spack/docs/environments.rst b/lib/spack/docs/environments.rst index a8dd75831cac19..f2eb0fa9a0466a 100644 --- a/lib/spack/docs/environments.rst +++ b/lib/spack/docs/environments.rst @@ -5,49 +5,56 @@ .. _environments: -========================= -Environments (spack.yaml) -========================= - -An environment is used to group together a set of specs for the -purpose of building, rebuilding and deploying in a coherent fashion. -Environments provide a number of advantages over the *à la carte* -approach of building and loading individual Spack modules: - -#. Environments separate the steps of (a) choosing what to - install, (b) concretizing, and (c) installing. This allows - Environments to remain stable and repeatable, even if Spack packages - are upgraded: specs are only re-concretized when the user - explicitly asks for it. It is even possible to reliably - transport environments between different computers running - different versions of Spack! -#. Environments allow several specs to be built at once; a more robust - solution than ad-hoc scripts making multiple calls to ``spack - install``. -#. An Environment that is built as a whole can be loaded as a whole - into the user environment. An Environment can be built to maintain - a filesystem view of its packages, and the environment can load - that view into the user environment at activation time. Spack can - also generate a script to load all modules related to an - environment. +===================================== +Environments (spack.yaml, spack.lock) +===================================== + +An environment is used to group a set of specs intended for some purpose +to be built, rebuilt, and deployed in a coherent fashion. Environments +define aspects of the installation of the software, such as: + +#. *which* specs to install; +#. *how* those specs are configured; and +#. *where* the concretized software will be installed. + +Aggregating this information into an environment for processing has advantages +over the *à la carte* approach of building and loading individual Spack modules. + +With environments, you concretize, install, or load (activate) all of the +specs with a single command. Concretization fully configures the specs +and dependencies of the environment in preparation for installing the +software. This is a more robust solution than ad-hoc installation scripts. +And you can share an environment or even re-use it on a different computer. + +Environment definitions, especially *how* specs are configured, allow the +software to remain stable and repeatable even when Spack packages are upgraded. Changes are only picked up when the environment is explicitly re-concretized. + +Defining *where* specs are installed supports a filesystem view of the +environment. Yet Spack maintains a single installation of the software that +can be re-used across multiple environments. + +Activating an environment determines *when* all of the associated (and +installed) specs are loaded so limits the software loaded to those specs +actually needed by the environment. Spack can even generate a script to +load all modules related to an environment. Other packaging systems also provide environments that are similar in some ways to Spack environments; for example, `Conda environments `_ or `Python Virtual Environments `_. Spack environments -provide some distinctive features: +provide some distinctive features though: #. A spec installed "in" an environment is no different from the same - spec installed anywhere else in Spack. Environments are assembled - simply by collecting together a set of specs. -#. Spack Environments may contain more than one spec of the same + spec installed anywhere else in Spack. +#. Spack environments may contain more than one spec of the same package. Spack uses a "manifest and lock" model similar to `Bundler gemfiles -`_ and other package -managers. The user input file is named ``spack.yaml`` and the lock -file is named ``spack.lock`` +`_ and other package managers. +The environment's user input file (or manifest), is named ``spack.yaml``. +The lock file, which contains the fully configured and concretized specs, +is named ``spack.lock``. .. _environments-using: @@ -68,55 +75,60 @@ An environment is created by: $ spack env create myenv -Spack then creates the directory ``var/spack/environments/myenv``. +The directory ``$SPACK_ROOT/var/spack/environments/myenv`` is created +to manage the environment. .. note:: - All managed environments by default are stored in the ``var/spack/environments`` folder. - This location can be changed by setting the ``environments_root`` variable in ``config.yaml``. - -In the ``var/spack/environments/myenv`` directory, Spack creates the -file ``spack.yaml`` and the hidden directory ``.spack-env``. + All managed environments by default are stored in the + ``$SPACK_ROOT/var/spack/environments`` folder. This location can be changed + by setting the ``environments_root`` variable in ``config.yaml``. -Spack stores metadata in the ``.spack-env`` directory. User -interaction will occur through the ``spack.yaml`` file and the Spack -commands that affect it. When the environment is concretized, Spack -will create a file ``spack.lock`` with the concrete information for +Spack creates the file ``spack.yaml``, hidden directory ``.spack-env``, and +``spack.lock`` file under ``$SPACK_ROOT/var/spack/environments/myenv``. User +interaction occurs through the ``spack.yaml`` file and the Spack commands +that affect it. Metadata and, by default, the view are stored in the +``.spack-env`` directory. When the environment is concretized, Spack creates +the ``spack.lock`` file with the fully configured specs and dependencies for the environment. -In addition to being the default location for the view associated with -an Environment, the ``.spack-env`` directory also contains: +The ``.spack-env`` subdirectory also contains: - * ``repo/``: A repo consisting of the Spack packages used in this - environment. This allows the environment to build the same, in - theory, even on different versions of Spack with different + * ``repo/``: A subdirectory acting as the repo consisting of the Spack + packages used in the environment. It allows the environment to build + the same, in theory, even on different versions of Spack with different packages! - * ``logs/``: A directory containing the build logs for the packages - in this Environment. + * ``logs/``: A subdirectory containing the build logs for the packages + in this environment. -Spack Environments can also be created from either a manifest file -(usually but not necessarily named, ``spack.yaml``) or a lockfile. -To create an Environment from a manifest: +Spack Environments can also be created from either the user input, or +manifest, file or the lockfile. Create an environment from a manifest using: .. code-block:: console $ spack env create myenv spack.yaml -To create an Environment from a ``spack.lock`` lockfile: +The resulting environment is guaranteed to have the same root specs as +the original but may concretize differently in the presence of different +explicit or default configuration settings (e.g., a different version of +Spack or for a different user account). + +Create an environment from a ``spack.lock`` file using: .. code-block:: console $ spack env create myenv spack.lock -Either of these commands can also take a full path to the -initialization file. +The resulting environment, when on the same or a compatible machine, is +guaranteed to initially have the same concrete specs as the original. + +.. note:: + + Environment creation also accepts a full path to the file. -A Spack Environment created from a ``spack.yaml`` manifest is -guaranteed to have the same root specs as the original Environment, -but may concretize differently. A Spack Environment created from a -``spack.lock`` lockfile is guaranteed to have the same concrete specs -as the original Environment. Either may obviously then differ as the -user modifies it. + If the path is not under the ``$SPACK_ROOT/var/spack/environments`` + directory then the source is referred to as an + :ref:`independent environment `. ^^^^^^^^^^^^^^^^^^^^^^^^^ Activating an Environment @@ -129,7 +141,7 @@ To activate an environment, use the following command: $ spack env activate myenv By default, the ``spack env activate`` will load the view associated -with the Environment into the user environment. The ``-v, +with the environment into the user environment. The ``-v, --with-view`` argument ensures this behavior, and the ``-V, --without-view`` argument activates the environment without changing the user environment variables. @@ -142,8 +154,11 @@ user's prompt to begin with the environment name in brackets. $ spack env activate -p myenv [myenv] $ ... -The ``activate`` command can also be used to create a new environment if it does not already -exist. +The ``activate`` command can also be used to create a new environment, if it is +not already defined, by adding the ``--create`` flag. Managed and independent +environments can both be created using the same flags that `spack env create` +accepts. If an environment already exists then spack will simply activate it +and ignore the create-specific flags. .. code-block:: console @@ -168,49 +183,50 @@ or the shortcut alias If the environment was activated with its view, deactivating the environment will remove the view from the user environment. -^^^^^^^^^^^^^^^^^^^^^^ -Anonymous Environments -^^^^^^^^^^^^^^^^^^^^^^ +.. _independent_environments: -Apart from managed environments, Spack also supports anonymous environments. +^^^^^^^^^^^^^^^^^^^^^^^^ +Independent Environments +^^^^^^^^^^^^^^^^^^^^^^^^ -Anonymous environments can be placed in any directory of choice. +Independent environments can be located in any directory outside of Spack. .. note:: When uninstalling packages, Spack asks the user to confirm the removal of packages - that are still used in a managed environment. This is not the case for anonymous + that are still used in a managed environment. This is not the case for independent environments. -To create an anonymous environment, use one of the following commands: +To create an independent environment, use one of the following commands: .. code-block:: console $ spack env create --dir my_env $ spack env create ./my_env -As a shorthand, you can also create an anonymous environment upon activation if it does not +As a shorthand, you can also create an independent environment upon activation if it does not already exist: .. code-block:: console $ spack env activate --create ./my_env -For convenience, Spack can also place an anonymous environment in a temporary directory for you: +For convenience, Spack can also place an independent environment in a temporary directory for you: .. code-block:: console $ spack env activate --temp -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Environment Sensitive Commands -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Environment-Aware Commands +^^^^^^^^^^^^^^^^^^^^^^^^^^ -Spack commands are environment sensitive. For example, the ``find`` -command shows only the specs in the active Environment if an -Environment has been activated. Similarly, the ``install`` and -``uninstall`` commands act on the active environment. +Spack commands are environment-aware. For example, the ``find`` +command shows only the specs in the active environment if an +environment has been activated. Otherwise it shows all specs in +the Spack instance. The same rule applies to the ``install`` and +``uninstall`` commands. .. code-block:: console @@ -255,32 +271,33 @@ Environment has been activated. Similarly, the ``install`` and Note that when we installed the abstract spec ``zlib@1.2.8``, it was -presented as a root of the Environment. All explicitly installed -packages will be listed as roots of the Environment. +presented as a root of the environment. All explicitly installed +packages will be listed as roots of the environment. All of the Spack commands that act on the list of installed specs are -Environment-sensitive in this way, including ``install``, -``uninstall``, ``find``, ``extensions``, and more. In the +environment-aware in this way, including ``install``, +``uninstall``, ``find``, ``extensions``, etcetera. In the :ref:`environment-configuration` section we will discuss -Environment-sensitive commands further. +environment-aware commands further. ^^^^^^^^^^^^^^^^^^^^^ Adding Abstract Specs ^^^^^^^^^^^^^^^^^^^^^ -An abstract spec is the user-specified spec before Spack has applied -any defaults or dependency information. +An abstract spec is the user-specified spec before Spack applies +defaults or dependency information. -Users can add abstract specs to an Environment using the ``spack add`` -command. The most important component of an Environment is a list of +Users can add abstract specs to an environment using the ``spack add`` +command. The most important component of an environment is a list of abstract specs. -Adding a spec adds to the manifest (the ``spack.yaml`` file), which is -used to define the roots of the Environment, but does not affect the -concrete specs in the lockfile, nor does it install the spec. +Adding a spec adds it as a root spec of the environment in the user +input file (``spack.yaml``). It does not affect the concrete specs +in the lock file (``spack.lock``) and it does not install the spec. -The ``spack add`` command is environment aware. It adds to the -currently active environment. All environment aware commands can also +The ``spack add`` command is environment-aware. It adds the spec to the +currently active environment. An error is generated if there isn't an +active environment. All environment-aware commands can also be called using the ``spack -e`` flag to specify the environment. .. code-block:: console @@ -300,11 +317,11 @@ or Concretizing ^^^^^^^^^^^^ -Once some user specs have been added to an environment, they can be concretized. -There are at the moment three different modes of operation to concretize an environment, -which are explained in details in :ref:`environments_concretization_config`. -Regardless of which mode of operation has been chosen, the following -command will ensure all the root specs are concretized according to the +Once user specs have been added to an environment, they can be concretized. +There are three different modes of operation to concretize an environment, +explained in detail in :ref:`environments_concretization_config`. +Regardless of which mode of operation is chosen, the following +command will ensure all of the root specs are concretized according to the constraints that are prescribed in the configuration: .. code-block:: console @@ -313,16 +330,15 @@ constraints that are prescribed in the configuration: In the case of specs that are not concretized together, the command above will concretize only the specs that were added and not yet -concretized. Forcing a re-concretization of all the specs can be done -instead with this command: +concretized. Forcing a re-concretization of all of the specs can be done +by adding the ``-f`` option: .. code-block:: console [myenv]$ spack concretize -f -When the ``-f`` flag is not used to reconcretize all specs, Spack -guarantees that already concretized specs are unchanged in the -environment. +Without the option, Spack guarantees that already concretized specs are +unchanged in the environment. The ``concretize`` command does not install any packages. For packages that have already been installed outside of the environment, the @@ -355,16 +371,16 @@ installed specs using the ``-c`` (``--concretized``) flag. Installing an Environment ^^^^^^^^^^^^^^^^^^^^^^^^^ -In addition to installing individual specs into an Environment, one -can install the entire Environment at once using the command +In addition to adding individual specs to an environment, one +can install the entire environment at once using the command .. code-block:: console [myenv]$ spack install -If the Environment has been concretized, Spack will install the -concretized specs. Otherwise, ``spack install`` will first concretize -the Environment and then install the concretized specs. +If the environment has been concretized, Spack will install the +concretized specs. Otherwise, ``spack install`` will concretize +the environment before installing the concretized specs. .. note:: @@ -385,17 +401,17 @@ the Environment and then install the concretized specs. As it installs, ``spack install`` creates symbolic links in the -``logs/`` directory in the Environment, allowing for easy inspection +``logs/`` directory in the environment, allowing for easy inspection of build logs related to that environment. The ``spack install`` command also stores a Spack repo containing the ``package.py`` file used at install time for each package in the ``repos/`` directory in -the Environment. +the environment. The ``--no-add`` option can be used in a concrete environment to tell spack to install specs already present in the environment but not to add any new root specs to the environment. For root specs provided to ``spack install`` on the command line, ``--no-add`` is the default, -while for dependency specs on the other hand, it is optional. In other +while for dependency specs, it is optional. In other words, if there is an unambiguous match in the active concrete environment for a root spec provided to ``spack install`` on the command line, spack does not require you to specify the ``--no-add`` option to prevent the spec @@ -414,7 +430,13 @@ default, it will also clone the package to a subdirectory in the environment. This package will have a special variant ``dev_path`` set, and Spack will ensure the package and its dependents are rebuilt any time the environment is installed if the package's local source -code has been modified. Spack ensures that all instances of a +code has been modified. Spack's native implementation to check for modifications +is to check if ``mtime`` is newer than the installation. +A custom check can be created by overriding the ``detect_dev_src_change`` method +in your package class. This is particularly useful for projects using custom spack repo's +to drive development and want to optimize performance. + +Spack ensures that all instances of a developed package in the environment are concretized to match the version (and other constraints) passed as the spec argument to the ``spack develop`` command. @@ -424,7 +446,7 @@ 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 the ``main`` branch of the package, and ``spack install`` will install from that git clone if ``foo`` is in the environment. -Further development on ``foo`` can be tested by reinstalling the environment, +Further development on ``foo`` can be tested by re-installing the environment, and eventually committed and pushed to the upstream git repo. If the package being developed supports out-of-source builds then users can use the @@ -609,7 +631,7 @@ manipulate configuration inline in the ``spack.yaml`` file. Inline configurations ^^^^^^^^^^^^^^^^^^^^^ -Inline Environment-scope configuration is done using the same yaml +Inline environment-scope configuration is done using the same yaml format as standard Spack configuration scopes, covered in the :ref:`configuration` section. Each section is contained under a top-level yaml object with it's name. For example, a ``spack.yaml`` @@ -634,7 +656,7 @@ Included configurations Spack environments allow an ``include`` heading in their yaml schema. This heading pulls in external configuration files and applies -them to the Environment. +them to the environment. .. code-block:: yaml @@ -661,7 +683,7 @@ have higher precedence, as the included configs are applied in reverse order. Manually Editing the Specs List ------------------------------- -The list of abstract/root specs in the Environment is maintained in +The list of abstract/root specs in the environment is maintained in the ``spack.yaml`` manifest under the heading ``specs``. .. code-block:: yaml @@ -769,7 +791,7 @@ evaluates to the cross-product of those specs. Spec matrices also contain an ``excludes`` directive, which eliminates certain combinations from the evaluated result. -The following two Environment manifests are identical: +The following two environment manifests are identical: .. code-block:: yaml @@ -844,7 +866,7 @@ files are identical. In short files like the example, it may be easier to simply list the included specs. However for more complicated examples involving many packages across many toolchains, separately factored lists make -Environments substantially more manageable. +environments substantially more manageable. Additionally, the ``-l`` option to the ``spack add`` command allows one to add to named lists in the definitions section of the manifest @@ -893,9 +915,8 @@ The valid variables for a ``when`` clause are: #. ``env``. The user environment (usually ``os.environ`` in Python). -#. ``hostname``. The hostname of the system. - -#. ``full_hostname``. The fully qualified hostname of the system. +#. ``hostname``. The hostname of the system (if ``hostname`` is an + executable in the user's PATH). ^^^^^^^^^^^^^^^^^^^^^^^^ SpecLists as Constraints @@ -1061,7 +1082,7 @@ true``). The argument ``--without-view`` can be used to create an environment without any view configured. The ``spack env view`` command can be used to change the manage views -of an Environment. The subcommand ``spack env view enable`` will add a +of an environment. The subcommand ``spack env view enable`` will add a view named ``default`` to an environment. It takes an optional argument to specify the path for the new default view. The subcommand ``spack env view disable`` will remove the view named ``default`` from @@ -1229,7 +1250,7 @@ gets installed and is available for use in the ``env`` target. $(SPACK) -e . env depfile -o $@ --make-prefix spack env: spack/env - $(info Environment installed!) + $(info environment installed!) clean: rm -rf spack.lock env.mk spack/ diff --git a/lib/spack/docs/getting_started.rst b/lib/spack/docs/getting_started.rst index 4cbd1efee7a549..cb8a586e3c94c4 100644 --- a/lib/spack/docs/getting_started.rst +++ b/lib/spack/docs/getting_started.rst @@ -61,10 +61,15 @@ Getting Spack is easy. You can clone it from the `github repository .. code-block:: console - $ git clone -c feature.manyFiles=true https://github.com/spack/spack.git + $ git clone -c feature.manyFiles=true --depth=2 https://github.com/spack/spack.git This will create a directory called ``spack``. +.. note:: + ``-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. + .. _shell-support: ^^^^^^^^^^^^^ @@ -1475,16 +1480,14 @@ in a Windows CMD prompt. Step 3: Run and configure Spack ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -To use Spack, run ``bin\spack_cmd.bat`` (you may need to Run as Administrator) from the top-level spack -directory. This will provide a Windows command prompt with an environment properly set up with Spack -and its prerequisites. If you receive a warning message that Python is not in your ``PATH`` +On Windows, Spack supports both primary native shells, Powershell and the traditional command prompt. +To use Spack, pick your favorite shell, and run ``bin\spack_cmd.bat`` or ``share/spack/setup-env.ps1`` +(you may need to Run as Administrator) from the top-level spack +directory. This will provide a Spack enabled shell. If you receive a warning message that Python is not in your ``PATH`` (which may happen if you installed Python from the website and not the Windows Store) add the location of the Python executable to your ``PATH`` now. You can permanently add Python to your ``PATH`` variable by using the ``Edit the system environment variables`` utility in Windows Control Panel. -.. note:: - Alternatively, Powershell can be used in place of CMD - To configure Spack, first run the following command inside the Spack console: .. code-block:: console @@ -1549,7 +1552,7 @@ and not tabs, so ensure that this is the case when editing one directly. .. note:: Cygwin The use of Cygwin is not officially supported by Spack and is not tested. - However Spack will not throw an error, so use if choosing to use Spack + However Spack will not prevent this, so use if choosing to use Spack with Cygwin, know that no functionality is garunteed. ^^^^^^^^^^^^^^^^^ @@ -1563,21 +1566,12 @@ Spack console via: spack install cpuinfo -If in the previous step, you did not have CMake or Ninja installed, running the command above should bootstrap both packages - -""""""""""""""""""""""""""" -Windows Compatible Packages -""""""""""""""""""""""""""" +If in the previous step, you did not have CMake or Ninja installed, running the command above should install both packages -Not all spack packages currently have Windows support. Some are inherently incompatible with the -platform, and others simply have yet to be ported. To view the current set of packages with Windows -support, the list command should be used via `spack list -t windows`. If there's a package you'd like -to install on Windows but is not in that list, feel free to reach out to request the port or contribute -the port yourself. +.. note:: Spec Syntax Caveats + Windows has a few idiosyncrasies when it comes to the Spack spec syntax and the use of certain shells + See the Spack spec syntax doc for more information -.. note:: - This is by no means a comprehensive list, some packages may have ports that were not tagged - while others may just work out of the box on Windows and have not been tagged as such. ^^^^^^^^^^^^^^ For developers @@ -1587,6 +1581,3 @@ The intent is to provide a Windows installer that will automatically set up Python, Git, and Spack, instead of requiring the user to do so manually. Instructions for creating the installer are at https://github.com/spack/spack/blob/develop/lib/spack/spack/cmd/installer/README.md - -Alternatively a pre-built copy of the Windows installer is available as an artifact of Spack's Windows CI -available at each run of the CI on develop or any PR. diff --git a/lib/spack/docs/images/splices.png b/lib/spack/docs/images/splices.png new file mode 100644 index 00000000000000..b2a3e998373478 Binary files /dev/null and b/lib/spack/docs/images/splices.png differ diff --git a/lib/spack/docs/index.rst b/lib/spack/docs/index.rst index 410cb8e41c77bd..e2c7219e7b38f2 100644 --- a/lib/spack/docs/index.rst +++ b/lib/spack/docs/index.rst @@ -39,10 +39,15 @@ package: .. code-block:: console - $ git clone -c feature.manyFiles=true 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 libelf +.. note:: + ``-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. + If you're new to spack and want to start using it, see :doc:`getting_started`, or refer to the full manual below. diff --git a/lib/spack/docs/pipelines.rst b/lib/spack/docs/pipelines.rst index 0a72793a891d6b..bfcf1572d79e9a 100644 --- a/lib/spack/docs/pipelines.rst +++ b/lib/spack/docs/pipelines.rst @@ -663,11 +663,7 @@ build the package. When including a bootstrapping phase as in the example above, the result is that the bootstrapped compiler packages will be pushed to the binary mirror (and the -local artifacts mirror) before the actual release specs are built. In this case, -the jobs corresponding to subsequent release specs are configured to -``install_missing_compilers``, so that if spack is asked to install a package -with a compiler it doesn't know about, it can be quickly installed from the -binary mirror first. +local artifacts mirror) before the actual release specs are built. Since bootstrapping compilers is optional, those items can be left out of the environment/stack file, and in that case no bootstrapping will be done (only the diff --git a/lib/spack/docs/requirements.txt b/lib/spack/docs/requirements.txt index 58877fcfc27d87..a8f853e3cf1a36 100644 --- a/lib/spack/docs/requirements.txt +++ b/lib/spack/docs/requirements.txt @@ -5,7 +5,7 @@ sphinx-rtd-theme==2.0.0 python-levenshtein==0.25.1 docutils==0.21.2 pygments==2.18.0 -urllib3==2.2.2 +urllib3==2.2.3 pytest==8.3.3 isort==5.13.2 black==24.8.0 diff --git a/lib/spack/external/__init__.py b/lib/spack/external/__init__.py index f6f481a6ae47c3..672bf17f80895c 100644 --- a/lib/spack/external/__init__.py +++ b/lib/spack/external/__init__.py @@ -18,7 +18,7 @@ * Homepage: https://pypi.python.org/pypi/archspec * Usage: Labeling, comparison and detection of microarchitectures -* Version: 0.2.5-dev (commit 7e6740012b897ae4a950f0bba7e9726b767e921f) +* Version: 0.2.5 (commit 38ce485258ffc4fc6dd6688f8dc90cb269478c47) astunparse ---------------- diff --git a/lib/spack/external/archspec/cpu/microarchitecture.py b/lib/spack/external/archspec/cpu/microarchitecture.py index 1ffe51d9184087..bb85b9f37c0966 100644 --- a/lib/spack/external/archspec/cpu/microarchitecture.py +++ b/lib/spack/external/archspec/cpu/microarchitecture.py @@ -81,8 +81,13 @@ def __init__(self, name, parents, vendor, features, compilers, generation=0, cpu self.generation = generation # Only relevant for AArch64 self.cpu_part = cpu_part - # Cache the ancestor computation + + # Cache the "ancestor" computation self._ancestors = None + # Cache the "generic" computation + self._generic = None + # Cache the "family" computation + self._family = None @property def ancestors(self): @@ -115,6 +120,9 @@ def __eq__(self, other): and self.cpu_part == other.cpu_part ) + def __hash__(self): + return hash(self.name) + @coerce_target_names def __ne__(self, other): return not self == other @@ -171,18 +179,22 @@ def __contains__(self, feature): @property def family(self): """Returns the architecture family a given target belongs to""" - roots = [x for x in [self] + self.ancestors if not x.ancestors] - msg = "a target is expected to belong to just one architecture family" - msg += f"[found {', '.join(str(x) for x in roots)}]" - assert len(roots) == 1, msg + if self._family is None: + roots = [x for x in [self] + self.ancestors if not x.ancestors] + msg = "a target is expected to belong to just one architecture family" + msg += f"[found {', '.join(str(x) for x in roots)}]" + assert len(roots) == 1, msg + self._family = roots.pop() - return roots.pop() + return self._family @property def generic(self): """Returns the best generic architecture that is compatible with self""" - generics = [x for x in [self] + self.ancestors if x.vendor == "generic"] - return max(generics, key=lambda x: len(x.ancestors)) + if self._generic is None: + generics = [x for x in [self] + self.ancestors if x.vendor == "generic"] + self._generic = max(generics, key=lambda x: len(x.ancestors)) + return self._generic def to_dict(self): """Returns a dictionary representation of this object.""" diff --git a/lib/spack/external/archspec/json/cpu/microarchitectures.json b/lib/spack/external/archspec/json/cpu/microarchitectures.json index 5e1b2851e80125..9275422ef4da53 100644 --- a/lib/spack/external/archspec/json/cpu/microarchitectures.json +++ b/lib/spack/external/archspec/json/cpu/microarchitectures.json @@ -1482,7 +1482,6 @@ "cldemote", "movdir64b", "movdiri", - "pdcm", "serialize", "waitpkg" ], @@ -2237,6 +2236,84 @@ ] } }, + "zen5": { + "from": ["zen4"], + "vendor": "AuthenticAMD", + "features": [ + "abm", + "aes", + "avx", + "avx2", + "avx512_bf16", + "avx512_bitalg", + "avx512bw", + "avx512cd", + "avx512dq", + "avx512f", + "avx512ifma", + "avx512vbmi", + "avx512_vbmi2", + "avx512vl", + "avx512_vnni", + "avx512_vp2intersect", + "avx512_vpopcntdq", + "avx_vnni", + "bmi1", + "bmi2", + "clflushopt", + "clwb", + "clzero", + "cppc", + "cx16", + "f16c", + "flush_l1d", + "fma", + "fsgsbase", + "gfni", + "ibrs_enhanced", + "mmx", + "movbe", + "movdir64b", + "movdiri", + "pclmulqdq", + "popcnt", + "rdseed", + "sse", + "sse2", + "sse4_1", + "sse4_2", + "sse4a", + "ssse3", + "tsc_adjust", + "vaes", + "vpclmulqdq", + "xsavec", + "xsaveopt" + ], + "compilers": { + "gcc": [ + { + "versions": "14.1:", + "name": "znver5", + "flags": "-march={name} -mtune={name}" + } + ], + "aocc": [ + { + "versions": "5.0:", + "name": "znver5", + "flags": "-march={name} -mtune={name}" + } + ], + "clang": [ + { + "versions": "19.1:", + "name": "znver5", + "flags": "-march={name} -mtune={name}" + } + ] + } + }, "ppc64": { "from": [], "vendor": "generic", @@ -2844,8 +2921,7 @@ "asimdrdm", "lrcpc", "dcpop", - "asimddp", - "ssbs" + "asimddp" ], "compilers" : { "gcc": [ @@ -2942,7 +3018,6 @@ "uscat", "ilrcpc", "flagm", - "ssbs", "dcpodp", "svei8mm", "svebf16", @@ -3010,7 +3085,7 @@ }, { "versions": "11:", - "flags" : "-march=armv8.4-a+sve+ssbs+fp16+bf16+crypto+i8mm+rng" + "flags" : "-march=armv8.4-a+sve+fp16+bf16+crypto+i8mm+rng" }, { "versions": "12:", @@ -3066,7 +3141,6 @@ "uscat", "ilrcpc", "flagm", - "ssbs", "sb", "dcpodp", "sve2", @@ -3179,7 +3253,6 @@ "uscat", "ilrcpc", "flagm", - "ssbs", "sb", "dcpodp", "sve2", diff --git a/lib/spack/llnl/string.py b/lib/spack/llnl/string.py index d2995f34c1b6a9..0ad67d6775fc71 100644 --- a/lib/spack/llnl/string.py +++ b/lib/spack/llnl/string.py @@ -41,6 +41,20 @@ def comma_and(sequence: List[str]) -> str: return comma_list(sequence, "and") +def ordinal(number: int) -> str: + """Return the ordinal representation (1st, 2nd, 3rd, etc.) for the provided number. + + Args: + number: int to convert to ordinal number + + Returns: number's corresponding ordinal + """ + idx = (number % 10) << 1 + tens = number % 100 // 10 + suffix = "th" if tens == 1 or idx > 6 else "thstndrd"[idx : idx + 2] + return f"{number}{suffix}" + + def quote(sequence: List[str], q: str = "'") -> List[str]: """Quotes each item in the input list with the quote character passed as second argument.""" return [f"{q}{e}{q}" for e in sequence] diff --git a/lib/spack/llnl/util/filesystem.py b/lib/spack/llnl/util/filesystem.py index 61d3628a10bc38..ec7cc13c7d4237 100644 --- a/lib/spack/llnl/util/filesystem.py +++ b/lib/spack/llnl/util/filesystem.py @@ -27,8 +27,6 @@ from llnl.util.lang import dedupe, memoized from llnl.util.symlink import islink, readlink, resolve_link_target_relative_to_the_link, symlink -from spack.util.executable import Executable, which - from ..path import path_to_os_path, system_path_filter if sys.platform != "win32": @@ -49,11 +47,11 @@ "copy_mode", "filter_file", "find", + "find_first", "find_headers", "find_all_headers", "find_libraries", "find_system_libraries", - "fix_darwin_install_name", "force_remove", "force_symlink", "getuid", @@ -248,42 +246,6 @@ def path_contains_subdirectory(path, root): return norm_path.startswith(norm_root) -@memoized -def file_command(*args): - """Creates entry point to `file` system command with provided arguments""" - file_cmd = which("file", required=True) - for arg in args: - file_cmd.add_default_arg(arg) - return file_cmd - - -@memoized -def _get_mime_type(): - """Generate method to call `file` system command to aquire mime type - for a specified path - """ - if sys.platform == "win32": - # -h option (no-dereference) does not exist in Windows - return file_command("-b", "--mime-type") - else: - return file_command("-b", "-h", "--mime-type") - - -def mime_type(filename): - """Returns the mime type and subtype of a file. - - Args: - filename: file to be analyzed - - Returns: - Tuple containing the MIME type and subtype - """ - output = _get_mime_type()(filename, output=str, error=str).strip() - tty.debug("==> " + output) - type, _, subtype = output.partition("/") - return type, subtype - - #: This generates the library filenames that may appear on any OS. library_extensions = ["a", "la", "so", "tbd", "dylib"] @@ -1679,41 +1641,6 @@ def safe_remove(*files_or_dirs): raise -@system_path_filter -def fix_darwin_install_name(path): - """Fix install name of dynamic libraries on Darwin to have full path. - - There are two parts of this task: - - 1. Use ``install_name('-id', ...)`` to change install name of a single lib - 2. Use ``install_name('-change', ...)`` to change the cross linking between - libs. The function assumes that all libraries are in one folder and - currently won't follow subfolders. - - Parameters: - path (str): directory in which .dylib files are located - """ - libs = glob.glob(join_path(path, "*.dylib")) - for lib in libs: - # fix install name first: - install_name_tool = Executable("install_name_tool") - install_name_tool("-id", lib, lib) - otool = Executable("otool") - long_deps = otool("-L", lib, output=str).split("\n") - deps = [dep.partition(" ")[0][1::] for dep in long_deps[2:-1]] - # fix all dependencies: - for dep in deps: - for loc in libs: - # We really want to check for either - # dep == os.path.basename(loc) or - # dep == join_path(builddir, os.path.basename(loc)), - # but we don't know builddir (nor how symbolic links look - # in builddir). We thus only compare the basenames. - if os.path.basename(dep) == os.path.basename(loc): - install_name_tool("-change", dep, loc, lib) - break - - def find_first(root: str, files: Union[Iterable[str], str], bfs_depth: int = 2) -> Optional[str]: """Find the first file matching a pattern. diff --git a/lib/spack/llnl/util/lang.py b/lib/spack/llnl/util/lang.py index 736013fe5802f4..5efe27b8b119f4 100644 --- a/lib/spack/llnl/util/lang.py +++ b/lib/spack/llnl/util/lang.py @@ -12,7 +12,7 @@ import sys import traceback from datetime import datetime, timedelta -from typing import Any, Callable, Iterable, List, Tuple +from typing import Callable, Iterable, List, Tuple, TypeVar # Ignore emacs backups when listing modules ignore_modules = r"^\.#|~$" @@ -879,9 +879,12 @@ def enum(**kwargs): return type("Enum", (object,), kwargs) +T = TypeVar("T") + + def stable_partition( - input_iterable: Iterable, predicate_fn: Callable[[Any], bool] -) -> Tuple[List[Any], List[Any]]: + input_iterable: Iterable[T], predicate_fn: Callable[[T], bool] +) -> Tuple[List[T], List[T]]: """Partition the input iterable according to a custom predicate. Args: @@ -893,12 +896,13 @@ def stable_partition( Tuple of the list of elements evaluating to True, and list of elements evaluating to False. """ - true_items, false_items = [], [] + true_items: List[T] = [] + false_items: List[T] = [] for item in input_iterable: if predicate_fn(item): true_items.append(item) - continue - false_items.append(item) + else: + false_items.append(item) return true_items, false_items diff --git a/lib/spack/spack/__init__.py b/lib/spack/spack/__init__.py index b37c63b5bd955f..cf7d62c7fd02e1 100644 --- a/lib/spack/spack/__init__.py +++ b/lib/spack/spack/__init__.py @@ -3,6 +3,13 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) +import os +import re +from typing import Optional + +import spack.paths +import spack.util.git + #: PEP440 canonical ... string __version__ = "0.23.0.dev0" spack_version = __version__ @@ -19,4 +26,47 @@ def __try_int(v): spack_version_info = tuple([__try_int(v) for v in __version__.split(".")]) -__all__ = ["spack_version_info", "spack_version"] +def get_spack_commit() -> Optional[str]: + """Get the Spack git commit sha. + + Returns: + (str or None) the commit sha if available, otherwise None + """ + git_path = os.path.join(spack.paths.prefix, ".git") + if not os.path.exists(git_path): + return None + + git = spack.util.git.git() + if not git: + return None + + rev = git( + "-C", + spack.paths.prefix, + "rev-parse", + "HEAD", + output=str, + error=os.devnull, + fail_on_error=False, + ) + if git.returncode != 0: + return None + + match = re.match(r"[a-f\d]{7,}$", rev) + return match.group(0) if match else None + + +def get_version() -> str: + """Get a descriptive version of this instance of Spack. + + Outputs ' ()'. + + The commit sha is only added when available. + """ + commit = get_spack_commit() + if commit: + return f"{spack_version} ({commit})" + return spack_version + + +__all__ = ["spack_version_info", "spack_version", "get_version", "get_spack_commit"] diff --git a/lib/spack/spack/audit.py b/lib/spack/spack/audit.py index 9ff3e8dd29713d..3ccdd5b9cd651f 100644 --- a/lib/spack/spack/audit.py +++ b/lib/spack/spack/audit.py @@ -39,6 +39,7 @@ def _search_duplicate_compilers(error_cls): import collections import collections.abc import glob +import inspect import io import itertools import os @@ -46,11 +47,15 @@ def _search_duplicate_compilers(error_cls): import pickle import re import warnings +from typing import Iterable, List, Set, Tuple from urllib.request import urlopen import llnl.util.lang +from llnl.string import plural +import spack.builder import spack.config +import spack.fetch_strategy import spack.patch import spack.repo import spack.spec @@ -73,7 +78,9 @@ def __init__(self, summary, details): self.details = tuple(details) def __str__(self): - return self.summary + "\n" + "\n".join([" " + detail for detail in self.details]) + if self.details: + return f"{self.summary}\n" + "\n".join(f" {detail}" for detail in self.details) + return self.summary def __eq__(self, other): if self.summary != other.summary or self.details != other.details: @@ -257,40 +264,6 @@ def _search_duplicate_specs_in_externals(error_cls): return errors -@config_packages -def _deprecated_preferences(error_cls): - """Search package preferences deprecated in v0.21 (and slated for removal in v0.23)""" - # TODO (v0.23): remove this audit as the attributes will not be allowed in config - errors = [] - packages_yaml = spack.config.CONFIG.get_config("packages") - - def make_error(attribute_name, config_data, summary): - s = io.StringIO() - s.write("Occurring in the following file:\n") - dict_view = syaml.syaml_dict((k, v) for k, v in config_data.items() if k == attribute_name) - syaml.dump_config(dict_view, stream=s, blame=True) - return error_cls(summary=summary, details=[s.getvalue()]) - - if "all" in packages_yaml and "version" in packages_yaml["all"]: - summary = "Using the deprecated 'version' attribute under 'packages:all'" - errors.append(make_error("version", packages_yaml["all"], summary)) - - for package_name in packages_yaml: - if package_name == "all": - continue - - package_conf = packages_yaml[package_name] - for attribute in ("compiler", "providers", "target"): - if attribute not in package_conf: - continue - summary = ( - f"Using the deprecated '{attribute}' attribute " f"under 'packages:{package_name}'" - ) - errors.append(make_error(attribute, package_conf, summary)) - - return errors - - @config_packages def _avoid_mismatched_variants(error_cls): """Warns if variant preferences have mismatched types or names.""" @@ -311,7 +284,7 @@ def _avoid_mismatched_variants(error_cls): pkg_cls = spack.repo.PATH.get_pkg_class(pkg_name) for variant in current_spec.variants.values(): # Variant does not exist at all - if variant.name not in pkg_cls.variants: + if variant.name not in pkg_cls.variant_names(): summary = ( f"Setting a preference for the '{pkg_name}' package to the " f"non-existing variant '{variant.name}'" @@ -320,9 +293,8 @@ def _avoid_mismatched_variants(error_cls): continue # Variant cannot accept this value - s = spack.spec.Spec(pkg_name) try: - s.update_variant_validate(variant.name, variant.value) + spack.variant.prevalidate_variant_value(pkg_cls, variant, strict=True) except Exception: summary = ( f"Setting the variant '{variant.name}' of the '{pkg_name}' package " @@ -416,6 +388,14 @@ def _make_config_error(config_data, summary, error_cls): ) +package_deprecated_attributes = AuditClass( + group="packages", + tag="PKG-DEPRECATED-ATTRIBUTES", + description="Sanity checks to preclude use of deprecated package attributes", + kwargs=("pkgs",), +) + + package_properties = AuditClass( group="packages", tag="PKG-PROPERTIES", @@ -434,22 +414,23 @@ def _make_config_error(config_data, summary, error_cls): ) -@package_directives +@package_properties def _check_build_test_callbacks(pkgs, error_cls): - """Ensure stand-alone test method is not included in build-time callbacks""" + """Ensure stand-alone test methods are not included in build-time callbacks. + + Test methods are for checking the installed software as stand-alone tests. + They could also be called during the post-install phase of a build. + """ errors = [] for pkg_name in pkgs: pkg_cls = spack.repo.PATH.get_pkg_class(pkg_name) test_callbacks = getattr(pkg_cls, "build_time_test_callbacks", None) - # TODO (post-34236): "test*"->"test_*" once remove deprecated methods - # TODO (post-34236): "test"->"test_" once remove deprecated methods - has_test_method = test_callbacks and any([m.startswith("test") for m in test_callbacks]) + has_test_method = test_callbacks and any([m.startswith("test_") for m in test_callbacks]) if has_test_method: - msg = '{0} package contains "test*" method(s) in ' "build_time_test_callbacks" - instr = 'Remove all methods whose names start with "test" from: [{0}]'.format( - ", ".join(test_callbacks) - ) + msg = f"Package {pkg_name} includes stand-alone test methods in build-time checks." + callbacks = ", ".join(test_callbacks) + instr = f"Remove the following from 'build_time_test_callbacks': {callbacks}" errors.append(error_cls(msg.format(pkg_name), [instr])) return errors @@ -547,6 +528,46 @@ def _search_for_reserved_attributes_names_in_packages(pkgs, error_cls): return errors +@package_deprecated_attributes +def _search_for_deprecated_package_methods(pkgs, error_cls): + """Ensure the package doesn't define or use deprecated methods""" + DEPRECATED_METHOD = (("test", "a name starting with 'test_'"),) + DEPRECATED_USE = ( + ("self.cache_extra_test_sources(", "cache_extra_test_sources(self, ..)"), + ("self.install_test_root(", "install_test_root(self, ..)"), + ("self.run_test(", "test_part(self, ..)"), + ) + errors = [] + for pkg_name in pkgs: + pkg_cls = spack.repo.PATH.get_pkg_class(pkg_name) + methods = inspect.getmembers(pkg_cls, predicate=lambda x: inspect.isfunction(x)) + method_errors = collections.defaultdict(list) + for name, function in methods: + for deprecated_name, alternate in DEPRECATED_METHOD: + if name == deprecated_name: + msg = f"Rename '{deprecated_name}' method to {alternate} instead." + method_errors[name].append(msg) + + source = inspect.getsource(function) + for deprecated_name, alternate in DEPRECATED_USE: + if deprecated_name in source: + msg = f"Change '{deprecated_name}' to '{alternate}' in '{name}' method." + method_errors[name].append(msg) + + num_methods = len(method_errors) + if num_methods > 0: + methods = plural(num_methods, "method", show_n=False) + error_msg = ( + f"Package '{pkg_name}' implements or uses unsupported deprecated {methods}." + ) + instr = [f"Make changes to '{pkg_cls.__module__}':"] + for name in sorted(method_errors): + instr.extend([f" {msg}" for msg in method_errors[name]]) + errors.append(error_cls(error_msg, instr)) + + return errors + + @package_properties def _ensure_all_package_names_are_lowercase(pkgs, error_cls): """Ensure package names are lowercase and consistent""" @@ -692,9 +713,15 @@ def _ensure_env_methods_are_ported_to_builders(pkgs, error_cls): errors = [] for pkg_name in pkgs: pkg_cls = spack.repo.PATH.get_pkg_class(pkg_name) - buildsystem_variant, _ = pkg_cls.variants["build_system"] - buildsystem_names = [getattr(x, "value", x) for x in buildsystem_variant.values] - builder_cls_names = [spack.builder.BUILDER_CLS[x].__name__ for x in buildsystem_names] + + # values are either Value objects (for conditional values) or the values themselves + build_system_names = set( + v.value if isinstance(v, spack.variant.Value) else v + for _, variant in pkg_cls.variant_definitions("build_system") + for v in variant.values + ) + builder_cls_names = [spack.builder.BUILDER_CLS[x].__name__ for x in build_system_names] + module = pkg_cls.module has_builders_in_package_py = any( getattr(module, name, False) for name in builder_cls_names @@ -713,6 +740,171 @@ def _ensure_env_methods_are_ported_to_builders(pkgs, error_cls): return errors +class DeprecatedMagicGlobals(ast.NodeVisitor): + def __init__(self, magic_globals: Iterable[str]): + super().__init__() + + self.magic_globals: Set[str] = set(magic_globals) + + # State to track whether we're in a class function + self.depth: int = 0 + self.in_function: bool = False + self.path = (ast.Module, ast.ClassDef, ast.FunctionDef) + + # Defined locals in the current function (heuristically at least) + self.locals: Set[str] = set() + + # List of (name, lineno) tuples for references to magic globals + self.references_to_globals: List[Tuple[str, int]] = [] + + def descend_in_function_def(self, node: ast.AST) -> None: + if not isinstance(node, self.path[self.depth]): + return + self.depth += 1 + if self.depth == len(self.path): + self.in_function = True + super().generic_visit(node) + if self.depth == len(self.path): + self.in_function = False + self.locals.clear() + self.depth -= 1 + + def generic_visit(self, node: ast.AST) -> None: + # Recurse into function definitions + if self.depth < len(self.path): + return self.descend_in_function_def(node) + elif not self.in_function: + return + elif isinstance(node, ast.Global): + for name in node.names: + if name in self.magic_globals: + self.references_to_globals.append((name, node.lineno)) + elif isinstance(node, ast.Assign): + # visit the rhs before lhs + super().visit(node.value) + for target in node.targets: + super().visit(target) + elif isinstance(node, ast.Name) and node.id in self.magic_globals: + if isinstance(node.ctx, ast.Load) and node.id not in self.locals: + self.references_to_globals.append((node.id, node.lineno)) + elif isinstance(node.ctx, ast.Store): + self.locals.add(node.id) + else: + super().generic_visit(node) + + +@package_properties +def _uses_deprecated_globals(pkgs, error_cls): + """Ensure that packages do not use deprecated globals""" + errors = [] + + for pkg_name in pkgs: + # some packages scheduled to be removed in v0.23 are not worth fixing. + pkg_cls = spack.repo.PATH.get_pkg_class(pkg_name) + if all(v.get("deprecated", False) for v in pkg_cls.versions.values()): + continue + + file = spack.repo.PATH.filename_for_package_name(pkg_name) + tree = ast.parse(open(file).read()) + visitor = DeprecatedMagicGlobals(("std_cmake_args",)) + visitor.visit(tree) + if visitor.references_to_globals: + errors.append( + error_cls( + f"Package '{pkg_name}' uses deprecated globals", + [ + f"{file}:{line} references '{name}'" + for name, line in visitor.references_to_globals + ], + ) + ) + + return errors + + +@package_properties +def _ensure_test_docstring(pkgs, error_cls): + """Ensure stand-alone test methods have a docstring. + + The docstring of a test method is implicitly used as the description of + the corresponding test part during test results reporting. + """ + doc_regex = r'\s+("""[^"]+""")' + + errors = [] + for pkg_name in pkgs: + pkg_cls = spack.repo.PATH.get_pkg_class(pkg_name) + methods = inspect.getmembers(pkg_cls, predicate=lambda x: inspect.isfunction(x)) + method_names = [] + for name, test_fn in methods: + if not name.startswith("test_"): + continue + + # Ensure the test method has a docstring + source = inspect.getsource(test_fn) + match = re.search(doc_regex, source) + if match is None or len(match.group(0).replace('"', "").strip()) == 0: + method_names.append(name) + + num_methods = len(method_names) + if num_methods > 0: + methods = plural(num_methods, "method", show_n=False) + docstrings = plural(num_methods, "docstring", show_n=False) + msg = f"Package {pkg_name} has test {methods} with empty or missing {docstrings}." + names = ", ".join(method_names) + instr = [ + "Docstrings are used as descriptions in test outputs.", + f"Add a concise summary to the following {methods} in '{pkg_cls.__module__}':", + f"{names}", + ] + errors.append(error_cls(msg, instr)) + + return errors + + +@package_properties +def _ensure_test_implemented(pkgs, error_cls): + """Ensure stand-alone test methods are implemented. + + The test method is also required to be non-empty. + """ + + def skip(line): + ln = line.strip() + return ln.startswith("#") or "pass" in ln + + doc_regex = r'\s+("""[^"]+""")' + + errors = [] + for pkg_name in pkgs: + pkg_cls = spack.repo.PATH.get_pkg_class(pkg_name) + methods = inspect.getmembers(pkg_cls, predicate=lambda x: inspect.isfunction(x)) + method_names = [] + for name, test_fn in methods: + if not name.startswith("test_"): + continue + + source = inspect.getsource(test_fn) + + # Attempt to ensure the test method is implemented. + impl = re.sub(doc_regex, r"", source).splitlines()[1:] + lines = [ln.strip() for ln in impl if not skip(ln)] + if not lines: + method_names.append(name) + + num_methods = len(method_names) + if num_methods > 0: + methods = plural(num_methods, "method", show_n=False) + msg = f"Package {pkg_name} has empty or missing test {methods}." + names = ", ".join(method_names) + instr = [ + f"Implement or remove the following {methods} from '{pkg_cls.__module__}': {names}" + ] + errors.append(error_cls(msg, instr)) + + return errors + + @package_https_directives def _linting_package_file(pkgs, error_cls): """Check for correctness of links""" @@ -879,20 +1071,22 @@ def check_virtual_with_variants(spec, msg): # check variants dependency_variants = dep.spec.variants - for name, value in dependency_variants.items(): + for name, variant in dependency_variants.items(): try: - v, _ = dependency_pkg_cls.variants[name] - v.validate_or_raise(value, pkg_cls=dependency_pkg_cls) + spack.variant.prevalidate_variant_value( + dependency_pkg_cls, variant, dep.spec, strict=True + ) except Exception as e: summary = ( f"{pkg_name}: wrong variant used for dependency in 'depends_on()'" ) + error_msg = str(e) if isinstance(e, KeyError): error_msg = ( f"variant {str(e).strip()} does not exist in package {dep_name}" + f" in package '{dep_name}'" ) - error_msg += f" in package '{dep_name}'" errors.append( error_cls(summary=summary, details=[error_msg, f"in {filename}"]) @@ -904,39 +1098,38 @@ def check_virtual_with_variants(spec, msg): @package_directives def _ensure_variant_defaults_are_parsable(pkgs, error_cls): """Ensures that variant defaults are present and parsable from cli""" - errors = [] - for pkg_name in pkgs: - pkg_cls = spack.repo.PATH.get_pkg_class(pkg_name) - for variant_name, entry in pkg_cls.variants.items(): - variant, _ = entry - default_is_parsable = ( - # Permitting a default that is an instance on 'int' permits - # to have foo=false or foo=0. Other falsish values are - # not allowed, since they can't be parsed from cli ('foo=') - isinstance(variant.default, int) - or variant.default - ) - if not default_is_parsable: - error_msg = "Variant '{}' of package '{}' has a bad default value" - errors.append(error_cls(error_msg.format(variant_name, pkg_name), [])) - continue - try: - vspec = variant.make_default() - except spack.variant.MultipleValuesInExclusiveVariantError: - error_msg = "Cannot create a default value for the variant '{}' in package '{}'" - errors.append(error_cls(error_msg.format(variant_name, pkg_name), [])) - continue + def check_variant(pkg_cls, variant, vname): + # bool is a subclass of int in python. Permitting a default that is an instance + # of 'int' means both foo=false and foo=0 are accepted. Other falsish values are + # not allowed, since they can't be parsed from CLI ('foo=') + default_is_parsable = isinstance(variant.default, int) or variant.default - try: - variant.validate_or_raise(vspec, pkg_cls=pkg_cls) - except spack.variant.InvalidVariantValueError: - error_msg = ( - "The default value of the variant '{}' in package '{}' failed validation" - ) - question = "Is it among the allowed values?" - errors.append(error_cls(error_msg.format(variant_name, pkg_name), [question])) + if not default_is_parsable: + msg = f"Variant '{vname}' of package '{pkg_cls.name}' has an unparsable default value" + return [error_cls(msg, [])] + + try: + vspec = variant.make_default() + except spack.variant.MultipleValuesInExclusiveVariantError: + msg = f"Can't create default value for variant '{vname}' in package '{pkg_cls.name}'" + return [error_cls(msg, [])] + try: + variant.validate_or_raise(vspec, pkg_cls.name) + except spack.variant.InvalidVariantValueError: + msg = "Default value of variant '{vname}' in package '{pkg.name}' is invalid" + question = "Is it among the allowed values?" + return [error_cls(msg, [question])] + + return [] + + errors = [] + for pkg_name in pkgs: + pkg_cls = spack.repo.PATH.get_pkg_class(pkg_name) + for vname in pkg_cls.variant_names(): + for _, variant_def in pkg_cls.variant_definitions(vname): + errors.extend(check_variant(pkg_cls, variant_def, vname)) return errors @@ -946,11 +1139,11 @@ def _ensure_variants_have_descriptions(pkgs, error_cls): errors = [] for pkg_name in pkgs: pkg_cls = spack.repo.PATH.get_pkg_class(pkg_name) - for variant_name, entry in pkg_cls.variants.items(): - variant, _ = entry - if not variant.description: - error_msg = "Variant '{}' in package '{}' is missing a description" - errors.append(error_cls(error_msg.format(variant_name, pkg_name), [])) + for name in pkg_cls.variant_names(): + for when, variant in pkg_cls.variant_definitions(name): + if not variant.description: + msg = f"Variant '{name}' in package '{pkg_name}' is missing a description" + errors.append(error_cls(msg, [])) return errors @@ -1007,29 +1200,26 @@ def _version_constraints_are_satisfiable_by_some_version_in_repo(pkgs, error_cls def _analyze_variants_in_directive(pkg, constraint, directive, error_cls): - variant_exceptions = ( - spack.variant.InconsistentValidationError, - spack.variant.MultipleValuesInExclusiveVariantError, - spack.variant.InvalidVariantValueError, - KeyError, - ) errors = [] - for name, v in constraint.variants.items(): - try: - variant, _ = pkg.variants[name] - variant.validate_or_raise(v, pkg_cls=pkg) - except variant_exceptions as e: - summary = pkg.name + ': wrong variant in "{0}" directive' - summary = summary.format(directive) - filename = spack.repo.PATH.filename_for_package_name(pkg.name) - - error_msg = str(e).strip() - if isinstance(e, KeyError): - error_msg = "the variant {0} does not exist".format(error_msg) + variant_names = pkg.variant_names() + summary = f"{pkg.name}: wrong variant in '{directive}' directive" + filename = spack.repo.PATH.filename_for_package_name(pkg.name) - err = error_cls(summary=summary, details=[error_msg, "in " + filename]) + for name, v in constraint.variants.items(): + if name not in variant_names: + msg = f"variant {name} does not exist in {pkg.name}" + errors.append(error_cls(summary=summary, details=[msg, f"in {filename}"])) + continue - errors.append(err) + try: + spack.variant.prevalidate_variant_value(pkg, v, constraint, strict=True) + except ( + spack.variant.InconsistentValidationError, + spack.variant.MultipleValuesInExclusiveVariantError, + spack.variant.InvalidVariantValueError, + ) as e: + msg = str(e).strip() + errors.append(error_cls(summary=summary, details=[msg, f"in {filename}"])) return errors @@ -1067,9 +1257,10 @@ def _extracts_errors(triggers, summary): for dname in dnames ) - for vname, (variant, triggers) in pkg_cls.variants.items(): - summary = f"{pkg_name}: wrong 'when=' condition for the '{vname}' variant" - errors.extend(_extracts_errors(triggers, summary)) + for when, variants_by_name in pkg_cls.variants.items(): + for vname, variant in variants_by_name.items(): + summary = f"{pkg_name}: wrong 'when=' condition for the '{vname}' variant" + errors.extend(_extracts_errors([when], summary)) for when, providers, details in _error_items(pkg_cls.provided): errors.extend( diff --git a/lib/spack/spack/binary_distribution.py b/lib/spack/spack/binary_distribution.py index 8d3c3cfb7a0b37..1f0d33f00eea1d 100644 --- a/lib/spack/spack/binary_distribution.py +++ b/lib/spack/spack/binary_distribution.py @@ -33,9 +33,9 @@ from llnl.util.symlink import readlink import spack.caches -import spack.cmd import spack.config as config import spack.database as spack_db +import spack.deptypes as dt import spack.error import spack.hash_types as ht import spack.hooks @@ -44,9 +44,9 @@ import spack.oci.image import spack.oci.oci import spack.oci.opener +import spack.paths import spack.platforms import spack.relocate as relocate -import spack.repo import spack.spec import spack.stage import spack.store @@ -54,6 +54,7 @@ import spack.util.archive import spack.util.crypto import spack.util.file_cache as file_cache +import spack.util.filesystem as ssys import spack.util.gpg import spack.util.parallel import spack.util.path @@ -687,7 +688,7 @@ def get_buildfile_manifest(spec): # Non-symlinks. for rel_path in visitor.files: abs_path = os.path.join(root, rel_path) - m_type, m_subtype = fsys.mime_type(abs_path) + m_type, m_subtype = ssys.mime_type(abs_path) if relocate.needs_binary_relocation(m_type, m_subtype): # Why is this branch not part of needs_binary_relocation? :( @@ -712,15 +713,32 @@ def get_buildfile_manifest(spec): return data -def hashes_to_prefixes(spec): - """Return a dictionary of hashes to prefixes for a spec and its deps, excluding externals""" - return { - s.dag_hash(): str(s.prefix) +def deps_to_relocate(spec): + """Return the transitive link and direct run dependencies of the spec. + + This is a special traversal for dependencies we need to consider when relocating a package. + + Package binaries, scripts, and other files may refer to the prefixes of dependencies, so + we need to rewrite those locations when dependencies are in a different place at install time + than they were at build time. + + This traversal covers transitive link dependencies and direct run dependencies because: + + 1. Spack adds RPATHs for transitive link dependencies so that packages can find needed + dependency libraries. + 2. Packages may call any of their *direct* run dependencies (and may bake their paths into + binaries or scripts), so we also need to search for run dependency prefixes when relocating. + + This returns a deduplicated list of transitive link dependencies and direct run dependencies. + """ + deps = [ + s for s in itertools.chain( spec.traverse(root=True, deptype="link"), spec.dependencies(deptype="run") ) if not s.external - } + ] + return llnl.util.lang.dedupe(deps, key=lambda s: s.dag_hash()) def get_buildinfo_dict(spec): @@ -736,7 +754,7 @@ def get_buildinfo_dict(spec): "relocate_binaries": manifest["binary_to_relocate"], "relocate_links": manifest["link_to_relocate"], "hardlinks_deduped": manifest["hardlinks_deduped"], - "hash_to_prefix": hashes_to_prefixes(spec), + "hash_to_prefix": {d.dag_hash(): str(d.prefix) for d in deps_to_relocate(spec)}, } @@ -1446,7 +1464,9 @@ def _oci_push_pkg_blob( filename = os.path.join(tmpdir, f"{spec.dag_hash()}.tar.gz") # Create an oci.image.layer aka tarball of the package - compressed_tarfile_checksum, tarfile_checksum = spack.oci.oci.create_tarball(spec, filename) + compressed_tarfile_checksum, tarfile_checksum = _do_create_tarball( + filename, spec.prefix, get_buildinfo_dict(spec) + ) blob = spack.oci.oci.Blob( Digest.from_sha256(compressed_tarfile_checksum), @@ -1629,7 +1649,6 @@ def _oci_push( Dict[str, spack.oci.oci.Blob], List[Tuple[Spec, BaseException]], ]: - # Spec dag hash -> blob checksums: Dict[str, spack.oci.oci.Blob] = {} @@ -2199,11 +2218,36 @@ def relocate_package(spec): # First match specific prefix paths. Possibly the *local* install prefix # of some dependency is in an upstream, so we cannot assume the original # spack store root can be mapped uniformly to the new spack store root. - for dag_hash, new_dep_prefix in hashes_to_prefixes(spec).items(): - if dag_hash in hash_to_old_prefix: - old_dep_prefix = hash_to_old_prefix[dag_hash] - prefix_to_prefix_bin[old_dep_prefix] = new_dep_prefix - prefix_to_prefix_text[old_dep_prefix] = new_dep_prefix + # + # If the spec is spliced, we need to handle the simultaneous mapping + # from the old install_tree to the new install_tree and from the build_spec + # to the spliced spec. + # Because foo.build_spec is foo for any non-spliced spec, we can simplify + # by checking for spliced-in nodes by checking for nodes not in the build_spec + # without any explicit check for whether the spec is spliced. + # An analog in this algorithm is any spec that shares a name or provides the same virtuals + # in the context of the relevant root spec. This ensures that the analog for a spec s + # is the spec that s replaced when we spliced. + relocation_specs = deps_to_relocate(spec) + build_spec_ids = set(id(s) for s in spec.build_spec.traverse(deptype=dt.ALL & ~dt.BUILD)) + for s in relocation_specs: + analog = s + if id(s) not in build_spec_ids: + analogs = [ + d + for d in spec.build_spec.traverse(deptype=dt.ALL & ~dt.BUILD) + if s._splice_match(d, self_root=spec, other_root=spec.build_spec) + ] + if analogs: + # Prefer same-name analogs and prefer higher versions + # This matches the preferences in Spec.splice, so we will find same node + analog = max(analogs, key=lambda a: (a.name == s.name, a.version)) + + lookup_dag_hash = analog.dag_hash() + if lookup_dag_hash in hash_to_old_prefix: + old_dep_prefix = hash_to_old_prefix[lookup_dag_hash] + prefix_to_prefix_bin[old_dep_prefix] = str(s.prefix) + prefix_to_prefix_text[old_dep_prefix] = str(s.prefix) # Only then add the generic fallback of install prefix -> install prefix. prefix_to_prefix_text[old_prefix] = new_prefix @@ -2541,10 +2585,10 @@ def install_root_node(spec, unsigned=False, force=False, sha256=None): warnings.warn("Package for spec {0} already installed.".format(spec.format())) return - download_result = download_tarball(spec, unsigned) + download_result = download_tarball(spec.build_spec, unsigned) if not download_result: msg = 'download of binary cache file for spec "{0}" failed' - raise RuntimeError(msg.format(spec.format())) + raise RuntimeError(msg.format(spec.build_spec.format())) if sha256: checker = spack.util.crypto.Checker(sha256) @@ -2563,6 +2607,11 @@ def install_root_node(spec, unsigned=False, force=False, sha256=None): with spack.util.path.filter_padding(): tty.msg('Installing "{0}" from a buildcache'.format(spec.format())) extract_tarball(spec, download_result, force) + spec.package.windows_establish_runtime_linkage() + if spec.spliced: # overwrite old metadata with new + spack.store.STORE.layout.write_spec( + spec, spack.store.STORE.layout.spec_file_path(spec) + ) spack.hooks.post_install(spec, False) spack.store.STORE.db.add(spec) @@ -2696,6 +2745,9 @@ def get_keys(install=False, trust=False, force=False, mirrors=None): for mirror in mirror_collection.values(): fetch_url = mirror.fetch_url + # TODO: oci:// does not support signing. + if fetch_url.startswith("oci://"): + continue keys_url = url_util.join( fetch_url, BUILD_CACHE_RELATIVE_PATH, BUILD_CACHE_KEYS_RELATIVE_PATH ) diff --git a/lib/spack/spack/bootstrap/__init__.py b/lib/spack/spack/bootstrap/__init__.py index 85935cd0e021b2..d710caee68cc2f 100644 --- a/lib/spack/spack/bootstrap/__init__.py +++ b/lib/spack/spack/bootstrap/__init__.py @@ -9,6 +9,7 @@ all_core_root_specs, ensure_clingo_importable_or_raise, ensure_core_dependencies, + ensure_file_in_path_or_raise, ensure_gpg_in_path_or_raise, ensure_patchelf_in_path_or_raise, ) @@ -19,6 +20,7 @@ "is_bootstrapping", "ensure_bootstrap_configuration", "ensure_core_dependencies", + "ensure_file_in_path_or_raise", "ensure_gpg_in_path_or_raise", "ensure_clingo_importable_or_raise", "ensure_patchelf_in_path_or_raise", diff --git a/lib/spack/spack/bootstrap/config.py b/lib/spack/spack/bootstrap/config.py index 0078191e26b476..929f9b5b82152b 100644 --- a/lib/spack/spack/bootstrap/config.py +++ b/lib/spack/spack/bootstrap/config.py @@ -14,6 +14,7 @@ import spack.compilers import spack.config import spack.environment +import spack.modules import spack.paths import spack.platforms import spack.repo diff --git a/lib/spack/spack/bootstrap/core.py b/lib/spack/spack/bootstrap/core.py index 62b6b86570c3a8..6f1d9fdb9dff52 100644 --- a/lib/spack/spack/bootstrap/core.py +++ b/lib/spack/spack/bootstrap/core.py @@ -37,21 +37,16 @@ import spack.binary_distribution import spack.config import spack.detection -import spack.environment -import spack.modules -import spack.paths import spack.platforms -import spack.platforms.linux -import spack.repo import spack.spec import spack.store import spack.user_environment -import spack.util.environment import spack.util.executable import spack.util.path import spack.util.spack_yaml import spack.util.url import spack.version +from spack.installer import PackageInstaller from ._common import _executables_in_store, _python_import, _root_spec, _try_import_from_store from .clingo import ClingoBootstrapConcretizer @@ -283,7 +278,7 @@ def try_import(self, module: str, abstract_spec_str: str) -> bool: # Install the spec that should make the module importable with spack.config.override(self.mirror_scope): - concrete_spec.package.do_install(fail_fast=True) + PackageInstaller([concrete_spec.package], fail_fast=True).install() if _try_import_from_store(module, query_spec=concrete_spec, query_info=info): self.last_search = info @@ -306,7 +301,7 @@ def try_search_path(self, executables: Tuple[str], abstract_spec_str: str) -> bo msg = "[BOOTSTRAP] Try installing '{0}' from sources" tty.debug(msg.format(abstract_spec_str)) with spack.config.override(self.mirror_scope): - concrete_spec.package.do_install() + PackageInstaller([concrete_spec.package], fail_fast=True).install() if _executables_in_store(executables, concrete_spec, query_info=info): self.last_search = info return True @@ -472,7 +467,8 @@ def ensure_clingo_importable_or_raise() -> None: def gnupg_root_spec() -> str: """Return the root spec used to bootstrap GnuPG""" - return _root_spec("gnupg@2.3:") + root_spec_name = "win-gpg" if IS_WINDOWS else "gnupg" + return _root_spec(f"{root_spec_name}@2.3:") def ensure_gpg_in_path_or_raise() -> None: @@ -482,6 +478,19 @@ def ensure_gpg_in_path_or_raise() -> None: ) +def file_root_spec() -> str: + """Return the root spec used to bootstrap file""" + root_spec_name = "win-file" if IS_WINDOWS else "file" + return _root_spec(root_spec_name) + + +def ensure_file_in_path_or_raise() -> None: + """Ensure file is in the PATH or raise""" + return ensure_executables_in_path_or_raise( + executables=["file"], abstract_spec=file_root_spec() + ) + + def patchelf_root_spec() -> str: """Return the root spec used to bootstrap patchelf""" # 0.13.1 is the last version not to require C++17. @@ -565,14 +574,15 @@ def ensure_core_dependencies() -> None: """Ensure the presence of all the core dependencies.""" if sys.platform.lower() == "linux": ensure_patchelf_in_path_or_raise() - if not IS_WINDOWS: - ensure_gpg_in_path_or_raise() + elif sys.platform == "win32": + ensure_file_in_path_or_raise() + ensure_gpg_in_path_or_raise() ensure_clingo_importable_or_raise() def all_core_root_specs() -> List[str]: """Return a list of all the core root specs that may be used to bootstrap Spack""" - return [clingo_root_spec(), gnupg_root_spec(), patchelf_root_spec()] + return [clingo_root_spec(), gnupg_root_spec(), patchelf_root_spec(), file_root_spec()] def bootstrapping_sources(scope: Optional[str] = None): diff --git a/lib/spack/spack/bootstrap/environment.py b/lib/spack/spack/bootstrap/environment.py index 13942ba86f4693..39c8aa2fa5cbc5 100644 --- a/lib/spack/spack/bootstrap/environment.py +++ b/lib/spack/spack/bootstrap/environment.py @@ -14,9 +14,9 @@ from llnl.util import tty import spack.environment +import spack.spec import spack.tengine -import spack.util.cpus -import spack.util.executable +import spack.util.path from ._common import _root_spec from .config import root_path, spec_for_current_python, store_path diff --git a/lib/spack/spack/bootstrap/prototypes/clingo-darwin-aarch64.json b/lib/spack/spack/bootstrap/prototypes/clingo-darwin-aarch64.json index ed94121b19e8f9..f313e4544fa94a 100644 --- a/lib/spack/spack/bootstrap/prototypes/clingo-darwin-aarch64.json +++ b/lib/spack/spack/bootstrap/prototypes/clingo-darwin-aarch64.json @@ -1 +1 @@ -{"spec":{"_meta":{"version":4},"nodes":[{"name":"clingo-bootstrap","version":"spack","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"cmake","build_type":"Release","docs":false,"generator":"make","ipo":true,"optimized":false,"python":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"677q63cwqryynuiid4piwkdfx2y4sujizh35x5vv5pokofsidsoa====","dependencies":[{"name":"bison","hash":"usieka7hqtluag2n5avq33dzcx5fywas","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"cmake","hash":"l5u7o7gwhxg4n7zxbp75x4mvocxy45iy","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"python","hash":"xfvnoiytjpkpxuvayzx73junhbjlo76z","parameters":{"deptypes":["build","link","run"],"virtuals":[]}},{"name":"python-venv","hash":"qpn2suueaqg3p2xfcw3ruqfngnv6wfwt","parameters":{"deptypes":["build","run"],"virtuals":[]}},{"name":"re2c","hash":"5dtluxfskylswcrd7se47q6vowlb4t2r","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"oyppt4jowtz4mghkbbonp5vkup4ocgyo"},{"name":"bison","version":"3.8.2","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","color":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"d4j62fwvuxqbiez32ltjnhu47ac425wjebsy6fhoptv6saxazcxq====","dependencies":[{"name":"diffutils","hash":"4xrfasii3yrxkt7rasfshoevsstiuhoa","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"m4","hash":"7q76qbncpm6mducfafctabgeavuvmype","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"hash":"usieka7hqtluag2n5avq33dzcx5fywas"},{"name":"diffutils","version":"3.10","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kbmzdy7mgklc24qx55cvx7kq7hceby2yav4fnf64gfdo7epdghwa====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"2ozelkl3vfy3eppsgocj37domutujqg5","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}}],"hash":"4xrfasii3yrxkt7rasfshoevsstiuhoa"},{"name":"gmake","version":"4.4.1","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","guile":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ghstvqlc3r7kgiikwx24xhcxdxcqdk5viinrzgm2mssqigfonika====","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc"},{"name":"gnuconfig","version":"2022-09-17","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"2gikx4ks5wrf2cct3kt2ras4snqcrgwicovqmrn7sfac5g55qzdq====","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf"},{"name":"libiconv","version":"1.17","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"hx2hgtfxuafavkaf2rp3hjq7ttx4zuoyareduhx25lb4a5b64sua====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"2ozelkl3vfy3eppsgocj37domutujqg5"},{"name":"m4","version":"1.4.19","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["9dc5fbd0d5cb1037ab1e6d0ecc74a30df218d0a94bdd5a02759a97f62daca573","bfdffa7c2eb01021d5849b36972c069693654ad826c1a20b53534009a4ec7a89"],"sigsegv":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bfdffa7c2eb01021d5849b36972c069693654ad826c1a20b53534009a4ec7a89","9dc5fbd0d5cb1037ab1e6d0ecc74a30df218d0a94bdd5a02759a97f62daca573"],"package_hash":"npb7a53yz7wqx4nvnasxwgzxaoiks6sdjz2eugrgkjxs4ml24xea====","dependencies":[{"name":"diffutils","hash":"4xrfasii3yrxkt7rasfshoevsstiuhoa","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libsigsegv","hash":"kspd6u5yi5436so33e36qnnaz7k55o4s","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"7q76qbncpm6mducfafctabgeavuvmype"},{"name":"libsigsegv","version":"2.14","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ypp3sciaprcyojozq2c5gqugtewmr5ytjbfpycyhu6wivtky7rja====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"kspd6u5yi5436so33e36qnnaz7k55o4s"},{"name":"cmake","version":"3.29.6","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","build_type":"Release","doc":false,"ncurses":true,"ownlibs":true,"patches":["dbc3892939348c71f35973dd30e74c4a84bc7a2446c6930523c9723b88a597d1"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["dbc3892939348c71f35973dd30e74c4a84bc7a2446c6930523c9723b88a597d1"],"package_hash":"pbk2rknzfgc2vpxstkdbcoxv5xboiwe72owtgemfxhbuer6pcbbq====","dependencies":[{"name":"curl","hash":"2hsifykculvqj6jqwhr6qhq4avgufc45","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"bo55ydm3qpkjtuh64uuuyrdxghgmf6lo","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"orq5smllpn6ex3qp2qula5uvxmuvatas","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"l5u7o7gwhxg4n7zxbp75x4mvocxy45iy"},{"name":"curl","version":"8.7.1","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","gssapi":false,"ldap":false,"libidn2":false,"librtmp":false,"libs":["shared","static"],"libssh":false,"libssh2":false,"nghttp2":true,"tls":["secure_transport"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kcgsfmigaqmusztsy67k2gfkizipob2uj5o5yub2i4onsxph454q====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"nghttp2","hash":"h4puzdoh6vqddnhnbdquelff6ccukjpp","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"perl","hash":"bc6njsov5kfa4vkqlsbg3hzin7zcwpi4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"oezw2hhb5ejauxkepuvwcjee5dqo2jlf","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"zlib-ng","hash":"orq5smllpn6ex3qp2qula5uvxmuvatas","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"2hsifykculvqj6jqwhr6qhq4avgufc45"},{"name":"nghttp2","version":"1.62.0","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5b4v4lpftbuslseu6whtdgpswnmbjd7hjj564rxnkfgdnylfro7q====","dependencies":[{"name":"diffutils","hash":"4xrfasii3yrxkt7rasfshoevsstiuhoa","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"oezw2hhb5ejauxkepuvwcjee5dqo2jlf","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"h4puzdoh6vqddnhnbdquelff6ccukjpp"},{"name":"pkgconf","version":"2.2.0","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"gl6tpyarjlclzsal6wa4dtc7cdzprq36nbibalai4a6wgzblrseq====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"oezw2hhb5ejauxkepuvwcjee5dqo2jlf"},{"name":"perl","version":"5.38.2","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","cpanm":true,"opcode":true,"open":true,"patches":["714e4d1c7496e6b23834e7c88da3d69139418860fbc488fe82fd226b450a4be7"],"shared":true,"threads":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["714e4d1c7496e6b23834e7c88da3d69139418860fbc488fe82fd226b450a4be7"],"package_hash":"i5drmbzpsmo7jrmibmrmahee6y5rtiuo37vmdjda2kfgvfgy6ziq====","dependencies":[{"name":"berkeley-db","hash":"owpo7sp32vczfk2nahlfzzkhm4od7b2y","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"bzip2","hash":"4sagfutlgwl35so2sa52kzoi6h2nrhdm","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gdbm","hash":"qugf72xw7oi4dlrxmchddrdn4v7cle7t","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"orq5smllpn6ex3qp2qula5uvxmuvatas","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"bc6njsov5kfa4vkqlsbg3hzin7zcwpi4"},{"name":"berkeley-db","version":"18.1.40","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cxx":true,"docs":false,"patches":["26090f418891757af46ac3b89a9f43d6eb5989f7a3dce3d1cfc99fba547203b3","b231fcc4d5cff05e5c3a4814f6a5af0e9a966428dc2176540d2c05aff41de522"],"stl":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["b231fcc4d5cff05e5c3a4814f6a5af0e9a966428dc2176540d2c05aff41de522","26090f418891757af46ac3b89a9f43d6eb5989f7a3dce3d1cfc99fba547203b3"],"package_hash":"h57ydfn33zevvzctzzioiiwjwe362izbbwncb6a26dfeno4y7tda====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"owpo7sp32vczfk2nahlfzzkhm4od7b2y"},{"name":"bzip2","version":"1.0.8","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","debug":false,"pic":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"wa33h4h2abj7tx5cndixz7bdwu5fspdaf2kjlqsinnearayw6fra====","dependencies":[{"name":"diffutils","hash":"4xrfasii3yrxkt7rasfshoevsstiuhoa","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"4sagfutlgwl35so2sa52kzoi6h2nrhdm"},{"name":"gdbm","version":"1.23","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"liepxl6phlcxbgfmibxafhewtihlgaa4x3hko37ckqlafhxkrgdq====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"pzu53iejjjzqsuxjduvc752t2rx46md4","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"qugf72xw7oi4dlrxmchddrdn4v7cle7t"},{"name":"readline","version":"8.2","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"package_hash":"oww6dmr7xqgg6j7iiluonxbcl4irqnnrip4vfkjdwujncwnuhwuq====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"ncurses","hash":"bo55ydm3qpkjtuh64uuuyrdxghgmf6lo","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"pzu53iejjjzqsuxjduvc752t2rx46md4"},{"name":"ncurses","version":"6.5","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"abi":"none","build_system":"autotools","patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"symlinks":false,"termlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"package_hash":"rlqzqxoau3wwzu62x6qxlf4flon6b4n3p4zesnc6t2oyybrvnkwq====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"oezw2hhb5ejauxkepuvwcjee5dqo2jlf","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"bo55ydm3qpkjtuh64uuuyrdxghgmf6lo"},{"name":"zlib-ng","version":"2.2.1","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","compat":true,"new_strategies":true,"opt":true,"pic":true,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"jvdtkihgu4ykt4dwkunpk3ql7tcnl4wtxmhbd3vfl5o7hemoi4gq====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"orq5smllpn6ex3qp2qula5uvxmuvatas"},{"name":"python","version":"3.11.9","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","bz2":true,"crypt":true,"ctypes":true,"dbm":true,"debug":false,"libxml2":true,"lzma":true,"nis":false,"optimizations":false,"patches":["13fa8bfa3e852cbf2e7b02a0313009df484bb39f55a50ada00e1a5599e956ac9","b0615b2fc96bb0cf7f180b107183b194b83b34c7614dcd6121e4a76bbf168155","ebdca648c9c1d25f586d7e2a495b62e6d91973b55264a13d89eda1beff72ef56","f2fd060afc4b4618fe8104c4c5d771f36dc55b1db5a4623785a4ea707ec72fb4"],"pic":true,"pyexpat":true,"pythoncmd":true,"readline":true,"shared":true,"sqlite3":true,"ssl":true,"tkinter":false,"uuid":true,"zlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["f2fd060afc4b4618fe8104c4c5d771f36dc55b1db5a4623785a4ea707ec72fb4","b0615b2fc96bb0cf7f180b107183b194b83b34c7614dcd6121e4a76bbf168155","13fa8bfa3e852cbf2e7b02a0313009df484bb39f55a50ada00e1a5599e956ac9","ebdca648c9c1d25f586d7e2a495b62e6d91973b55264a13d89eda1beff72ef56"],"package_hash":"t65rlqtklu5oqlcnkc62ld3dpxgvevfm2h5hfgp36ptz2uefx2sq====","dependencies":[{"name":"apple-libuuid","hash":"pjmzrksnrtzuxyeeef66hehcoffzb7qq","parameters":{"deptypes":["build","link"],"virtuals":["uuid"]}},{"name":"bzip2","hash":"4sagfutlgwl35so2sa52kzoi6h2nrhdm","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"expat","hash":"647zzgfka4pilqx4rbosr4efrbcdbk3s","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gdbm","hash":"qugf72xw7oi4dlrxmchddrdn4v7cle7t","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gettext","hash":"3c5kdgak36exx3n4rrjrbd4ggporhbxl","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libffi","hash":"5bf24m3l7qoj3mlajk7mlk66n5d5f5sx","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"libxcrypt","hash":"u3f5iif7nopr6xnh4ps6n233mgyzxonv","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"bo55ydm3qpkjtuh64uuuyrdxghgmf6lo","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"sp7ylb5lyleunjkdinknplmansaazm33","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"pkgconf","hash":"oezw2hhb5ejauxkepuvwcjee5dqo2jlf","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"readline","hash":"pzu53iejjjzqsuxjduvc752t2rx46md4","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"sqlite","hash":"yumq26wifcmlqyvoysnly3dcplzc7h4l","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"xz","hash":"nrzvy3emno3sqpjnhppe2xfq7okvzyml","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"orq5smllpn6ex3qp2qula5uvxmuvatas","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"xfvnoiytjpkpxuvayzx73junhbjlo76z"},{"name":"apple-libuuid","version":"1353.100.2","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"bundle","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"external":{"path":"/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk","module":null,"extra_attributes":{}},"package_hash":"rv7eeukm7m2umg6ulafeco2qz2kvaqpx2bjoita6g27hrs6vfmiq====","hash":"pjmzrksnrtzuxyeeef66hehcoffzb7qq"},{"name":"expat","version":"2.6.2","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","libbsd":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zeyjv42sx5l6mjqie4smh2uxzfhsxvsnw7udjwg2sl5bcnc66req====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"647zzgfka4pilqx4rbosr4efrbcdbk3s"},{"name":"gettext","version":"0.22.5","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","bzip2":true,"curses":true,"git":true,"libunistring":false,"libxml2":true,"pic":true,"shared":true,"tar":true,"xz":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5bhbkykxueimk2h42d6gb7dumldhutohav3x2r23rsalexcgy42a====","dependencies":[{"name":"bzip2","hash":"4sagfutlgwl35so2sa52kzoi6h2nrhdm","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"2ozelkl3vfy3eppsgocj37domutujqg5","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"libxml2","hash":"nyu7k62i347svjpkbtpyjhsw5afrz3xo","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"bo55ydm3qpkjtuh64uuuyrdxghgmf6lo","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"tar","hash":"dmnxmihjkv7iu53k5xffbycatl7jmnij","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"nrzvy3emno3sqpjnhppe2xfq7okvzyml","parameters":{"deptypes":["build","link","run"],"virtuals":[]}}],"hash":"3c5kdgak36exx3n4rrjrbd4ggporhbxl"},{"name":"libxml2","version":"2.10.3","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","pic":true,"python":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"squqo2aayigwxdusu3q3syojwit5gqdh6q4un576652hy4gytxcq====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"2ozelkl3vfy3eppsgocj37domutujqg5","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pkgconf","hash":"oezw2hhb5ejauxkepuvwcjee5dqo2jlf","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"xz","hash":"nrzvy3emno3sqpjnhppe2xfq7okvzyml","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"orq5smllpn6ex3qp2qula5uvxmuvatas","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"nyu7k62i347svjpkbtpyjhsw5afrz3xo"},{"name":"xz","version":"5.4.6","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"pic":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zt5vu2vph2v2qjwgdbe7btgcz7axpyalorcsqiuxhrg5grwgrrvq====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"nrzvy3emno3sqpjnhppe2xfq7okvzyml"},{"name":"tar","version":"1.34","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","zip":"pigz","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"cpgzon3rxegbd3xdnmhrmxvzaq5hyvpzz4y6egmhghhydvefupuq====","dependencies":[{"name":"bzip2","hash":"4sagfutlgwl35so2sa52kzoi6h2nrhdm","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"2ozelkl3vfy3eppsgocj37domutujqg5","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pigz","hash":"ttzjdjlimt4nrngxhd5wclhawnmskz4i","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"nrzvy3emno3sqpjnhppe2xfq7okvzyml","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"zstd","hash":"belg3dt3cvlblwuzu7twitbrpzscocdk","parameters":{"deptypes":["run"],"virtuals":[]}}],"hash":"dmnxmihjkv7iu53k5xffbycatl7jmnij"},{"name":"pigz","version":"2.8","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"makefile","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"4w67lflje4giekjg4ie2vpyuiunjcumo6geofykvon3hodllp42q====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"orq5smllpn6ex3qp2qula5uvxmuvatas","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"ttzjdjlimt4nrngxhd5wclhawnmskz4i"},{"name":"zstd","version":"1.5.6","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"makefile","compression":["none"],"libs":["shared","static"],"programs":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"uvmrov4c6unft6o4yd3jk3uqvweua3uhwdli4sw7h5wvklaf5t3q====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"belg3dt3cvlblwuzu7twitbrpzscocdk"},{"name":"libffi","version":"3.4.6","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"umhsnvoj5ooa3glffnkk2hp3txmrsjvqbpfq2hbk4mhcvhza7gaa====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"5bf24m3l7qoj3mlajk7mlk66n5d5f5sx"},{"name":"libxcrypt","version":"4.4.35","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","obsolete_api":false,"patches":["4885da3afc027999d7cc3c231de7fc6f3c8b119847536e0fc106bc846c617b9b"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["4885da3afc027999d7cc3c231de7fc6f3c8b119847536e0fc106bc846c617b9b"],"package_hash":"dam6cqot2l4nfh6nk3jidk7u2pr2p534tw7446ejqwttqitr4zea====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"bc6njsov5kfa4vkqlsbg3hzin7zcwpi4","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"u3f5iif7nopr6xnh4ps6n233mgyzxonv"},{"name":"openssl","version":"3.3.1","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","certs":"mozilla","docs":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"aqjwgxmqs2b7jublxelhue7n75puejodvhn2cbnpjjmq7xttex7a====","dependencies":[{"name":"ca-certificates-mozilla","hash":"zlwt7pdv4hpflspaoq2mielortiyhy63","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"bc6njsov5kfa4vkqlsbg3hzin7zcwpi4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"orq5smllpn6ex3qp2qula5uvxmuvatas","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"sp7ylb5lyleunjkdinknplmansaazm33"},{"name":"ca-certificates-mozilla","version":"2023-05-30","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"63npvwqwo2x7i6emvnklh4mhcn45gx2qzveorybh5h2inwr55sea====","hash":"zlwt7pdv4hpflspaoq2mielortiyhy63"},{"name":"sqlite","version":"3.43.2","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","column_metadata":true,"dynamic_extensions":true,"fts":true,"functions":false,"rtree":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"3isun23rg3ucob7vs355eq7r5eyee4f2xperdje7xoxv5wayrqzq====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"pzu53iejjjzqsuxjduvc752t2rx46md4","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"orq5smllpn6ex3qp2qula5uvxmuvatas","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"yumq26wifcmlqyvoysnly3dcplzc7h4l"},{"name":"python-venv","version":"1.0","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"bvjgntlwbvi343x5ctophqqvq6nbx2h4ggbxnjrvnjb3jneitahq====","dependencies":[{"name":"python","hash":"xfvnoiytjpkpxuvayzx73junhbjlo76z","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"hash":"qpn2suueaqg3p2xfcw3ruqfngnv6wfwt"},{"name":"re2c","version":"3.0","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kuhq5ne7cdx2pca57zwnn57fezjovywffswkkryt4usm4zekw3yq====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"5dtluxfskylswcrd7se47q6vowlb4t2r"}]}} +{"spec":{"_meta":{"version":4},"nodes":[{"name":"clingo-bootstrap","version":"spack","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"cmake","build_type":"Release","docs":false,"generator":"make","ipo":true,"optimized":false,"python":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"677q63cwqryynuiid4piwkdfx2y4sujizh35x5vv5pokofsidsoa====","dependencies":[{"name":"bison","hash":"usieka7hqtluag2n5avq33dzcx5fywas","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"cmake","hash":"l5u7o7gwhxg4n7zxbp75x4mvocxy45iy","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"python","hash":"xfvnoiytjpkpxuvayzx73junhbjlo76z","parameters":{"deptypes":["build","link","run"],"virtuals":[]}},{"name":"python-venv","hash":"qpn2suueaqg3p2xfcw3ruqfngnv6wfwt","parameters":{"deptypes":["build","run"],"virtuals":[]}},{"name":"re2c","hash":"5dtluxfskylswcrd7se47q6vowlb4t2r","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"oyppt4jowtz4mghkbbonp5vkup4ocgyo"},{"name":"bison","version":"3.8.2","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","color":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"d4j62fwvuxqbiez32ltjnhu47ac425wjebsy6fhoptv6saxazcxq====","dependencies":[{"name":"diffutils","hash":"4xrfasii3yrxkt7rasfshoevsstiuhoa","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"m4","hash":"7q76qbncpm6mducfafctabgeavuvmype","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"hash":"usieka7hqtluag2n5avq33dzcx5fywas"},{"name":"diffutils","version":"3.10","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kbmzdy7mgklc24qx55cvx7kq7hceby2yav4fnf64gfdo7epdghwa====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"2ozelkl3vfy3eppsgocj37domutujqg5","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}}],"hash":"4xrfasii3yrxkt7rasfshoevsstiuhoa"},{"name":"gmake","version":"4.4.1","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","guile":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ghstvqlc3r7kgiikwx24xhcxdxcqdk5viinrzgm2mssqigfonika====","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc"},{"name":"gnuconfig","version":"2022-09-17","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"2gikx4ks5wrf2cct3kt2ras4snqcrgwicovqmrn7sfac5g55qzdq====","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf"},{"name":"libiconv","version":"1.17","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"hx2hgtfxuafavkaf2rp3hjq7ttx4zuoyareduhx25lb4a5b64sua====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"2ozelkl3vfy3eppsgocj37domutujqg5"},{"name":"m4","version":"1.4.19","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["9dc5fbd0d5cb1037ab1e6d0ecc74a30df218d0a94bdd5a02759a97f62daca573","bfdffa7c2eb01021d5849b36972c069693654ad826c1a20b53534009a4ec7a89"],"sigsegv":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bfdffa7c2eb01021d5849b36972c069693654ad826c1a20b53534009a4ec7a89","9dc5fbd0d5cb1037ab1e6d0ecc74a30df218d0a94bdd5a02759a97f62daca573"],"package_hash":"npb7a53yz7wqx4nvnasxwgzxaoiks6sdjz2eugrgkjxs4ml24xea====","dependencies":[{"name":"diffutils","hash":"4xrfasii3yrxkt7rasfshoevsstiuhoa","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libsigsegv","hash":"kspd6u5yi5436so33e36qnnaz7k55o4s","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"7q76qbncpm6mducfafctabgeavuvmype"},{"name":"libsigsegv","version":"2.14","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ypp3sciaprcyojozq2c5gqugtewmr5ytjbfpycyhu6wivtky7rja====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"kspd6u5yi5436so33e36qnnaz7k55o4s"},{"name":"cmake","version":"3.29.6","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","build_type":"Release","doc":false,"ncurses":true,"ownlibs":true,"patches":["dbc3892939348c71f35973dd30e74c4a84bc7a2446c6930523c9723b88a597d1"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["dbc3892939348c71f35973dd30e74c4a84bc7a2446c6930523c9723b88a597d1"],"package_hash":"pbk2rknzfgc2vpxstkdbcoxv5xboiwe72owtgemfxhbuer6pcbbq====","dependencies":[{"name":"curl","hash":"2hsifykculvqj6jqwhr6qhq4avgufc45","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"bo55ydm3qpkjtuh64uuuyrdxghgmf6lo","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"orq5smllpn6ex3qp2qula5uvxmuvatas","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"l5u7o7gwhxg4n7zxbp75x4mvocxy45iy"},{"name":"curl","version":"8.7.1","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","gssapi":false,"ldap":false,"libidn2":false,"librtmp":false,"libs":["shared","static"],"libssh":false,"libssh2":false,"nghttp2":true,"tls":["secure_transport"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kcgsfmigaqmusztsy67k2gfkizipob2uj5o5yub2i4onsxph454q====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"nghttp2","hash":"h4puzdoh6vqddnhnbdquelff6ccukjpp","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"perl","hash":"bc6njsov5kfa4vkqlsbg3hzin7zcwpi4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"oezw2hhb5ejauxkepuvwcjee5dqo2jlf","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"zlib-ng","hash":"orq5smllpn6ex3qp2qula5uvxmuvatas","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"2hsifykculvqj6jqwhr6qhq4avgufc45"},{"name":"nghttp2","version":"1.62.0","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5b4v4lpftbuslseu6whtdgpswnmbjd7hjj564rxnkfgdnylfro7q====","dependencies":[{"name":"diffutils","hash":"4xrfasii3yrxkt7rasfshoevsstiuhoa","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"oezw2hhb5ejauxkepuvwcjee5dqo2jlf","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"h4puzdoh6vqddnhnbdquelff6ccukjpp"},{"name":"pkgconf","version":"2.2.0","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"gl6tpyarjlclzsal6wa4dtc7cdzprq36nbibalai4a6wgzblrseq====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"oezw2hhb5ejauxkepuvwcjee5dqo2jlf"},{"name":"perl","version":"5.38.2","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","cpanm":true,"opcode":true,"open":true,"patches":["714e4d1c7496e6b23834e7c88da3d69139418860fbc488fe82fd226b450a4be7"],"shared":true,"threads":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["714e4d1c7496e6b23834e7c88da3d69139418860fbc488fe82fd226b450a4be7"],"package_hash":"i5drmbzpsmo7jrmibmrmahee6y5rtiuo37vmdjda2kfgvfgy6ziq====","dependencies":[{"name":"berkeley-db","hash":"owpo7sp32vczfk2nahlfzzkhm4od7b2y","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"bzip2","hash":"4sagfutlgwl35so2sa52kzoi6h2nrhdm","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gdbm","hash":"qugf72xw7oi4dlrxmchddrdn4v7cle7t","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"orq5smllpn6ex3qp2qula5uvxmuvatas","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"bc6njsov5kfa4vkqlsbg3hzin7zcwpi4"},{"name":"berkeley-db","version":"18.1.40","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cxx":true,"docs":false,"patches":["26090f418891757af46ac3b89a9f43d6eb5989f7a3dce3d1cfc99fba547203b3","b231fcc4d5cff05e5c3a4814f6a5af0e9a966428dc2176540d2c05aff41de522"],"stl":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["b231fcc4d5cff05e5c3a4814f6a5af0e9a966428dc2176540d2c05aff41de522","26090f418891757af46ac3b89a9f43d6eb5989f7a3dce3d1cfc99fba547203b3"],"package_hash":"h57ydfn33zevvzctzzioiiwjwe362izbbwncb6a26dfeno4y7tda====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"owpo7sp32vczfk2nahlfzzkhm4od7b2y"},{"name":"bzip2","version":"1.0.8","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","debug":false,"pic":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"wa33h4h2abj7tx5cndixz7bdwu5fspdaf2kjlqsinnearayw6fra====","dependencies":[{"name":"diffutils","hash":"4xrfasii3yrxkt7rasfshoevsstiuhoa","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"4sagfutlgwl35so2sa52kzoi6h2nrhdm"},{"name":"gdbm","version":"1.23","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"liepxl6phlcxbgfmibxafhewtihlgaa4x3hko37ckqlafhxkrgdq====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"pzu53iejjjzqsuxjduvc752t2rx46md4","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"qugf72xw7oi4dlrxmchddrdn4v7cle7t"},{"name":"readline","version":"8.2","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"package_hash":"oww6dmr7xqgg6j7iiluonxbcl4irqnnrip4vfkjdwujncwnuhwuq====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"ncurses","hash":"bo55ydm3qpkjtuh64uuuyrdxghgmf6lo","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"pzu53iejjjzqsuxjduvc752t2rx46md4"},{"name":"ncurses","version":"6.5","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"abi":"none","build_system":"autotools","patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"symlinks":false,"termlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"package_hash":"rlqzqxoau3wwzu62x6qxlf4flon6b4n3p4zesnc6t2oyybrvnkwq====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"oezw2hhb5ejauxkepuvwcjee5dqo2jlf","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"bo55ydm3qpkjtuh64uuuyrdxghgmf6lo"},{"name":"zlib-ng","version":"2.2.1","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","compat":true,"new_strategies":true,"opt":true,"pic":true,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"jvdtkihgu4ykt4dwkunpk3ql7tcnl4wtxmhbd3vfl5o7hemoi4gq====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"orq5smllpn6ex3qp2qula5uvxmuvatas"},{"name":"python","version":"3.11.9","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","bz2":true,"crypt":true,"ctypes":true,"dbm":true,"debug":false,"libxml2":true,"lzma":true,"nis":false,"optimizations":false,"patches":["13fa8bfa3e852cbf2e7b02a0313009df484bb39f55a50ada00e1a5599e956ac9","b0615b2fc96bb0cf7f180b107183b194b83b34c7614dcd6121e4a76bbf168155","ebdca648c9c1d25f586d7e2a495b62e6d91973b55264a13d89eda1beff72ef56","f2fd060afc4b4618fe8104c4c5d771f36dc55b1db5a4623785a4ea707ec72fb4"],"pic":true,"pyexpat":true,"pythoncmd":true,"readline":true,"shared":true,"sqlite3":true,"ssl":true,"tkinter":false,"uuid":true,"zlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["f2fd060afc4b4618fe8104c4c5d771f36dc55b1db5a4623785a4ea707ec72fb4","b0615b2fc96bb0cf7f180b107183b194b83b34c7614dcd6121e4a76bbf168155","13fa8bfa3e852cbf2e7b02a0313009df484bb39f55a50ada00e1a5599e956ac9","ebdca648c9c1d25f586d7e2a495b62e6d91973b55264a13d89eda1beff72ef56"],"package_hash":"t65rlqtklu5oqlcnkc62ld3dpxgvevfm2h5hfgp36ptz2uefx2sq====","dependencies":[{"name":"apple-libuuid","hash":"pjmzrksnrtzuxyeeef66hehcoffzb7qq","parameters":{"deptypes":["build","link"],"virtuals":["uuid"]}},{"name":"bzip2","hash":"4sagfutlgwl35so2sa52kzoi6h2nrhdm","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"expat","hash":"647zzgfka4pilqx4rbosr4efrbcdbk3s","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gdbm","hash":"qugf72xw7oi4dlrxmchddrdn4v7cle7t","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gettext","hash":"3c5kdgak36exx3n4rrjrbd4ggporhbxl","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libffi","hash":"5bf24m3l7qoj3mlajk7mlk66n5d5f5sx","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"libxcrypt","hash":"u3f5iif7nopr6xnh4ps6n233mgyzxonv","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"bo55ydm3qpkjtuh64uuuyrdxghgmf6lo","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"sp7ylb5lyleunjkdinknplmansaazm33","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"pkgconf","hash":"oezw2hhb5ejauxkepuvwcjee5dqo2jlf","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"readline","hash":"pzu53iejjjzqsuxjduvc752t2rx46md4","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"sqlite","hash":"yumq26wifcmlqyvoysnly3dcplzc7h4l","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"xz","hash":"nrzvy3emno3sqpjnhppe2xfq7okvzyml","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"orq5smllpn6ex3qp2qula5uvxmuvatas","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"xfvnoiytjpkpxuvayzx73junhbjlo76z"},{"name":"apple-libuuid","version":"1353.100.2","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"bundle","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"external":{"path":"/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk","module":null,"extra_attributes":{}},"package_hash":"rv7eeukm7m2umg6ulafeco2qz2kvaqpx2bjoita6g27hrs6vfmiq====","hash":"pjmzrksnrtzuxyeeef66hehcoffzb7qq"},{"name":"expat","version":"2.6.2","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","libbsd":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zeyjv42sx5l6mjqie4smh2uxzfhsxvsnw7udjwg2sl5bcnc66req====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"647zzgfka4pilqx4rbosr4efrbcdbk3s"},{"name":"gettext","version":"0.22.5","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","bzip2":true,"curses":true,"git":true,"libunistring":false,"libxml2":true,"pic":true,"shared":true,"tar":true,"xz":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5bhbkykxueimk2h42d6gb7dumldhutohav3x2r23rsalexcgy42a====","dependencies":[{"name":"bzip2","hash":"4sagfutlgwl35so2sa52kzoi6h2nrhdm","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"2ozelkl3vfy3eppsgocj37domutujqg5","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"libxml2","hash":"nyu7k62i347svjpkbtpyjhsw5afrz3xo","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"bo55ydm3qpkjtuh64uuuyrdxghgmf6lo","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"tar","hash":"dmnxmihjkv7iu53k5xffbycatl7jmnij","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"nrzvy3emno3sqpjnhppe2xfq7okvzyml","parameters":{"deptypes":["build","link","run"],"virtuals":[]}}],"hash":"3c5kdgak36exx3n4rrjrbd4ggporhbxl"},{"name":"libxml2","version":"2.10.3","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","pic":true,"python":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"squqo2aayigwxdusu3q3syojwit5gqdh6q4un576652hy4gytxcq====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"2ozelkl3vfy3eppsgocj37domutujqg5","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pkgconf","hash":"oezw2hhb5ejauxkepuvwcjee5dqo2jlf","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"xz","hash":"nrzvy3emno3sqpjnhppe2xfq7okvzyml","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"orq5smllpn6ex3qp2qula5uvxmuvatas","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"nyu7k62i347svjpkbtpyjhsw5afrz3xo"},{"name":"xz","version":"5.4.6","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"pic":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zt5vu2vph2v2qjwgdbe7btgcz7axpyalorcsqiuxhrg5grwgrrvq====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"nrzvy3emno3sqpjnhppe2xfq7okvzyml"},{"name":"tar","version":"1.34","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","zip":"pigz","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"cpgzon3rxegbd3xdnmhrmxvzaq5hyvpzz4y6egmhghhydvefupuq====","dependencies":[{"name":"bzip2","hash":"4sagfutlgwl35so2sa52kzoi6h2nrhdm","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"2ozelkl3vfy3eppsgocj37domutujqg5","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pigz","hash":"ttzjdjlimt4nrngxhd5wclhawnmskz4i","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"nrzvy3emno3sqpjnhppe2xfq7okvzyml","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"zstd","hash":"belg3dt3cvlblwuzu7twitbrpzscocdk","parameters":{"deptypes":["run"],"virtuals":[]}}],"hash":"dmnxmihjkv7iu53k5xffbycatl7jmnij"},{"name":"pigz","version":"2.8","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"makefile","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"4w67lflje4giekjg4ie2vpyuiunjcumo6geofykvon3hodllp42q====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"orq5smllpn6ex3qp2qula5uvxmuvatas","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"ttzjdjlimt4nrngxhd5wclhawnmskz4i"},{"name":"zstd","version":"1.5.6","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"makefile","compression":["none"],"libs":["shared","static"],"programs":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"uvmrov4c6unft6o4yd3jk3uqvweua3uhwdli4sw7h5wvklaf5t3q====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"belg3dt3cvlblwuzu7twitbrpzscocdk"},{"name":"libffi","version":"3.4.6","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"umhsnvoj5ooa3glffnkk2hp3txmrsjvqbpfq2hbk4mhcvhza7gaa====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"5bf24m3l7qoj3mlajk7mlk66n5d5f5sx"},{"name":"libxcrypt","version":"4.4.35","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","obsolete_api":false,"patches":["4885da3afc027999d7cc3c231de7fc6f3c8b119847536e0fc106bc846c617b9b"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["4885da3afc027999d7cc3c231de7fc6f3c8b119847536e0fc106bc846c617b9b"],"package_hash":"dam6cqot2l4nfh6nk3jidk7u2pr2p534tw7446ejqwttqitr4zea====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"bc6njsov5kfa4vkqlsbg3hzin7zcwpi4","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"u3f5iif7nopr6xnh4ps6n233mgyzxonv"},{"name":"openssl","version":"3.3.1","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","certs":"mozilla","docs":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"aqjwgxmqs2b7jublxelhue7n75puejodvhn2cbnpjjmq7xttex7a====","dependencies":[{"name":"ca-certificates-mozilla","hash":"zlwt7pdv4hpflspaoq2mielortiyhy63","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"bc6njsov5kfa4vkqlsbg3hzin7zcwpi4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"orq5smllpn6ex3qp2qula5uvxmuvatas","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"sp7ylb5lyleunjkdinknplmansaazm33"},{"name":"ca-certificates-mozilla","version":"2023-05-30","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"63npvwqwo2x7i6emvnklh4mhcn45gx2qzveorybh5h2inwr55sea====","hash":"zlwt7pdv4hpflspaoq2mielortiyhy63"},{"name":"sqlite","version":"3.43.2","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","column_metadata":true,"dynamic_extensions":true,"fts":true,"functions":false,"rtree":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"3isun23rg3ucob7vs355eq7r5eyee4f2xperdje7xoxv5wayrqzq====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"q4jkyjbnmakcww365ua75wiemnsta6zf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"pzu53iejjjzqsuxjduvc752t2rx46md4","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"orq5smllpn6ex3qp2qula5uvxmuvatas","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"yumq26wifcmlqyvoysnly3dcplzc7h4l"},{"name":"python-venv","version":"1.0","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"bvjgntlwbvi343x5ctophqqvq6nbx2h4ggbxnjrvnjb3jneitahq====","dependencies":[{"name":"python","hash":"xfvnoiytjpkpxuvayzx73junhbjlo76z","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"hash":"qpn2suueaqg3p2xfcw3ruqfngnv6wfwt"},{"name":"re2c","version":"3.0","arch":{"platform":"darwin","platform_os":"ventura","target":"aarch64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kuhq5ne7cdx2pca57zwnn57fezjovywffswkkryt4usm4zekw3yq====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"5dtluxfskylswcrd7se47q6vowlb4t2r"}]}} diff --git a/lib/spack/spack/bootstrap/prototypes/clingo-darwin-x86_64.json b/lib/spack/spack/bootstrap/prototypes/clingo-darwin-x86_64.json index c713d5662df944..7251eef5160850 100644 --- a/lib/spack/spack/bootstrap/prototypes/clingo-darwin-x86_64.json +++ b/lib/spack/spack/bootstrap/prototypes/clingo-darwin-x86_64.json @@ -1 +1 @@ -{"spec":{"_meta":{"version":4},"nodes":[{"name":"clingo-bootstrap","version":"spack","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"cmake","build_type":"Release","docs":false,"generator":"make","ipo":true,"optimized":false,"python":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"677q63cwqryynuiid4piwkdfx2y4sujizh35x5vv5pokofsidsoa====","dependencies":[{"name":"bison","hash":"tcstiesejoijdcxvwpmmghqwxgyvadyi","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"cmake","hash":"ncmbvgmldvjq2ct7bdb36pa7rorgr6ia","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"python","hash":"46skxysjiafgqvyk2cqj2cithhkloj2g","parameters":{"deptypes":["build","link","run"],"virtuals":[]}},{"name":"python-venv","hash":"p2betn6fduff6uhcmslks6lwdxdllaqx","parameters":{"deptypes":["build","run"],"virtuals":[]}},{"name":"re2c","hash":"tpv4lkit3ekpahcziwmpeawdnioucyut","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"yebuzmu45zxhlfnurot7f5fydgv4ujen"},{"name":"bison","version":"3.8.2","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","color":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"d4j62fwvuxqbiez32ltjnhu47ac425wjebsy6fhoptv6saxazcxq====","dependencies":[{"name":"diffutils","hash":"tllsflj5qmdgizkpd2d2vnum6jycfaak","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"m4","hash":"7f5bvgqhvzuhog5fjzjhc52boqpo4eg4","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"hash":"tcstiesejoijdcxvwpmmghqwxgyvadyi"},{"name":"diffutils","version":"3.10","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kbmzdy7mgklc24qx55cvx7kq7hceby2yav4fnf64gfdo7epdghwa====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"mctiikna6qibnfutgekl6h3h747nhl73","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}}],"hash":"tllsflj5qmdgizkpd2d2vnum6jycfaak"},{"name":"gmake","version":"4.4.1","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","guile":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ghstvqlc3r7kgiikwx24xhcxdxcqdk5viinrzgm2mssqigfonika====","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz"},{"name":"libiconv","version":"1.17","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"hx2hgtfxuafavkaf2rp3hjq7ttx4zuoyareduhx25lb4a5b64sua====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"mctiikna6qibnfutgekl6h3h747nhl73"},{"name":"m4","version":"1.4.19","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["9dc5fbd0d5cb1037ab1e6d0ecc74a30df218d0a94bdd5a02759a97f62daca573","bfdffa7c2eb01021d5849b36972c069693654ad826c1a20b53534009a4ec7a89"],"sigsegv":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bfdffa7c2eb01021d5849b36972c069693654ad826c1a20b53534009a4ec7a89","9dc5fbd0d5cb1037ab1e6d0ecc74a30df218d0a94bdd5a02759a97f62daca573"],"package_hash":"npb7a53yz7wqx4nvnasxwgzxaoiks6sdjz2eugrgkjxs4ml24xea====","dependencies":[{"name":"diffutils","hash":"tllsflj5qmdgizkpd2d2vnum6jycfaak","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libsigsegv","hash":"2ab3ieebereandqjennaq6bobs5ggc4y","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"7f5bvgqhvzuhog5fjzjhc52boqpo4eg4"},{"name":"libsigsegv","version":"2.14","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ypp3sciaprcyojozq2c5gqugtewmr5ytjbfpycyhu6wivtky7rja====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"2ab3ieebereandqjennaq6bobs5ggc4y"},{"name":"cmake","version":"3.29.6","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","build_type":"Release","doc":false,"ncurses":true,"ownlibs":true,"patches":["dbc3892939348c71f35973dd30e74c4a84bc7a2446c6930523c9723b88a597d1"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["dbc3892939348c71f35973dd30e74c4a84bc7a2446c6930523c9723b88a597d1"],"package_hash":"pbk2rknzfgc2vpxstkdbcoxv5xboiwe72owtgemfxhbuer6pcbbq====","dependencies":[{"name":"curl","hash":"5midcs5brhx4h6vnh2bryqh7qipzww6p","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"bfptmetyuv567sjav5haen57waanfxyc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"xmqusd2jqtdty6qzkksuxmi4yi6jvdi5","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"ncmbvgmldvjq2ct7bdb36pa7rorgr6ia"},{"name":"curl","version":"8.7.1","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","gssapi":false,"ldap":false,"libidn2":false,"librtmp":false,"libs":["shared","static"],"libssh":false,"libssh2":false,"nghttp2":true,"tls":["secure_transport"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kcgsfmigaqmusztsy67k2gfkizipob2uj5o5yub2i4onsxph454q====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"nghttp2","hash":"22mzwts36yiedkziivh5sdgyjogb2it2","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"perl","hash":"5dub5yhb4fwo2o6iuos2ph5t5hg3yfwb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"gutczpsbpaqctk6gm5rzrxtqdwsi7qxc","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"zlib-ng","hash":"xmqusd2jqtdty6qzkksuxmi4yi6jvdi5","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"5midcs5brhx4h6vnh2bryqh7qipzww6p"},{"name":"nghttp2","version":"1.62.0","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5b4v4lpftbuslseu6whtdgpswnmbjd7hjj564rxnkfgdnylfro7q====","dependencies":[{"name":"diffutils","hash":"tllsflj5qmdgizkpd2d2vnum6jycfaak","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"gutczpsbpaqctk6gm5rzrxtqdwsi7qxc","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"22mzwts36yiedkziivh5sdgyjogb2it2"},{"name":"pkgconf","version":"2.2.0","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"gl6tpyarjlclzsal6wa4dtc7cdzprq36nbibalai4a6wgzblrseq====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"gutczpsbpaqctk6gm5rzrxtqdwsi7qxc"},{"name":"perl","version":"5.38.2","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","cpanm":true,"opcode":true,"open":true,"patches":["714e4d1c7496e6b23834e7c88da3d69139418860fbc488fe82fd226b450a4be7"],"shared":true,"threads":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["714e4d1c7496e6b23834e7c88da3d69139418860fbc488fe82fd226b450a4be7"],"package_hash":"i5drmbzpsmo7jrmibmrmahee6y5rtiuo37vmdjda2kfgvfgy6ziq====","dependencies":[{"name":"berkeley-db","hash":"upn52ynxcbgarg2trkmqwm4ppbdkx3zs","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"bzip2","hash":"kvv2ofd7xftv7shuuhvsr5pcln2htiwg","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gdbm","hash":"wik3tgroytjrfvy5poap2gairb2nabxp","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"xmqusd2jqtdty6qzkksuxmi4yi6jvdi5","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"5dub5yhb4fwo2o6iuos2ph5t5hg3yfwb"},{"name":"berkeley-db","version":"18.1.40","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cxx":true,"docs":false,"patches":["26090f418891757af46ac3b89a9f43d6eb5989f7a3dce3d1cfc99fba547203b3","b231fcc4d5cff05e5c3a4814f6a5af0e9a966428dc2176540d2c05aff41de522"],"stl":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["b231fcc4d5cff05e5c3a4814f6a5af0e9a966428dc2176540d2c05aff41de522","26090f418891757af46ac3b89a9f43d6eb5989f7a3dce3d1cfc99fba547203b3"],"package_hash":"h57ydfn33zevvzctzzioiiwjwe362izbbwncb6a26dfeno4y7tda====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"upn52ynxcbgarg2trkmqwm4ppbdkx3zs"},{"name":"bzip2","version":"1.0.8","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","debug":false,"pic":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"wa33h4h2abj7tx5cndixz7bdwu5fspdaf2kjlqsinnearayw6fra====","dependencies":[{"name":"diffutils","hash":"tllsflj5qmdgizkpd2d2vnum6jycfaak","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"kvv2ofd7xftv7shuuhvsr5pcln2htiwg"},{"name":"gdbm","version":"1.23","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"liepxl6phlcxbgfmibxafhewtihlgaa4x3hko37ckqlafhxkrgdq====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"amnbyrmtafl2pyypogji6gharv46lkrp","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"wik3tgroytjrfvy5poap2gairb2nabxp"},{"name":"readline","version":"8.2","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"package_hash":"oww6dmr7xqgg6j7iiluonxbcl4irqnnrip4vfkjdwujncwnuhwuq====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"ncurses","hash":"bfptmetyuv567sjav5haen57waanfxyc","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"amnbyrmtafl2pyypogji6gharv46lkrp"},{"name":"ncurses","version":"6.5","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"abi":"none","build_system":"autotools","patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"symlinks":false,"termlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"package_hash":"rlqzqxoau3wwzu62x6qxlf4flon6b4n3p4zesnc6t2oyybrvnkwq====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"gutczpsbpaqctk6gm5rzrxtqdwsi7qxc","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"bfptmetyuv567sjav5haen57waanfxyc"},{"name":"zlib-ng","version":"2.2.1","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","compat":true,"new_strategies":true,"opt":true,"pic":true,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"jvdtkihgu4ykt4dwkunpk3ql7tcnl4wtxmhbd3vfl5o7hemoi4gq====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"xmqusd2jqtdty6qzkksuxmi4yi6jvdi5"},{"name":"python","version":"3.11.9","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","bz2":true,"crypt":true,"ctypes":true,"dbm":true,"debug":false,"libxml2":true,"lzma":true,"nis":false,"optimizations":false,"patches":["13fa8bfa3e852cbf2e7b02a0313009df484bb39f55a50ada00e1a5599e956ac9","b0615b2fc96bb0cf7f180b107183b194b83b34c7614dcd6121e4a76bbf168155","ebdca648c9c1d25f586d7e2a495b62e6d91973b55264a13d89eda1beff72ef56","f2fd060afc4b4618fe8104c4c5d771f36dc55b1db5a4623785a4ea707ec72fb4"],"pic":true,"pyexpat":true,"pythoncmd":true,"readline":true,"shared":true,"sqlite3":true,"ssl":true,"tkinter":false,"uuid":true,"zlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["f2fd060afc4b4618fe8104c4c5d771f36dc55b1db5a4623785a4ea707ec72fb4","b0615b2fc96bb0cf7f180b107183b194b83b34c7614dcd6121e4a76bbf168155","13fa8bfa3e852cbf2e7b02a0313009df484bb39f55a50ada00e1a5599e956ac9","ebdca648c9c1d25f586d7e2a495b62e6d91973b55264a13d89eda1beff72ef56"],"package_hash":"t65rlqtklu5oqlcnkc62ld3dpxgvevfm2h5hfgp36ptz2uefx2sq====","dependencies":[{"name":"apple-libuuid","hash":"zdktedsebu7zjozb4wqhr45hfr665tlh","parameters":{"deptypes":["build","link"],"virtuals":["uuid"]}},{"name":"bzip2","hash":"kvv2ofd7xftv7shuuhvsr5pcln2htiwg","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"expat","hash":"ewxodvrjxwjn4gayblrayq4mxp4todqu","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gdbm","hash":"wik3tgroytjrfvy5poap2gairb2nabxp","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gettext","hash":"qatrw6nst2iqufrcjszou2zlbri6nphm","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libffi","hash":"ffu7cslh3j3fi4pnszo6kjfu7optpzzb","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"libxcrypt","hash":"wi4esgdayal4yyw3mcxqueiift2rvs2n","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"bfptmetyuv567sjav5haen57waanfxyc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"us6qb6xd62jhohhzq6uvwrkgtwazxdvf","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"pkgconf","hash":"gutczpsbpaqctk6gm5rzrxtqdwsi7qxc","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"readline","hash":"amnbyrmtafl2pyypogji6gharv46lkrp","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"sqlite","hash":"mmdphtu7zomdlsupofpcuur3l2hobahc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"xz","hash":"bspvdxfryax3wnxlua26ghowojosrzaa","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"xmqusd2jqtdty6qzkksuxmi4yi6jvdi5","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"46skxysjiafgqvyk2cqj2cithhkloj2g"},{"name":"apple-libuuid","version":"1353.100.2","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"bundle","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"external":{"path":"/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk","module":null,"extra_attributes":{}},"package_hash":"rv7eeukm7m2umg6ulafeco2qz2kvaqpx2bjoita6g27hrs6vfmiq====","hash":"zdktedsebu7zjozb4wqhr45hfr665tlh"},{"name":"expat","version":"2.6.2","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","libbsd":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zeyjv42sx5l6mjqie4smh2uxzfhsxvsnw7udjwg2sl5bcnc66req====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"ewxodvrjxwjn4gayblrayq4mxp4todqu"},{"name":"gettext","version":"0.22.5","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","bzip2":true,"curses":true,"git":true,"libunistring":false,"libxml2":true,"pic":true,"shared":true,"tar":true,"xz":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5bhbkykxueimk2h42d6gb7dumldhutohav3x2r23rsalexcgy42a====","dependencies":[{"name":"bzip2","hash":"kvv2ofd7xftv7shuuhvsr5pcln2htiwg","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"mctiikna6qibnfutgekl6h3h747nhl73","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"libxml2","hash":"mqe3367abnu4eijzq4akvplrxvef62f3","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"bfptmetyuv567sjav5haen57waanfxyc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"tar","hash":"jm53r4fgccnjp77x6ktjui5moishomnh","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"bspvdxfryax3wnxlua26ghowojosrzaa","parameters":{"deptypes":["build","link","run"],"virtuals":[]}}],"hash":"qatrw6nst2iqufrcjszou2zlbri6nphm"},{"name":"libxml2","version":"2.10.3","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","pic":true,"python":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"squqo2aayigwxdusu3q3syojwit5gqdh6q4un576652hy4gytxcq====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"mctiikna6qibnfutgekl6h3h747nhl73","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pkgconf","hash":"gutczpsbpaqctk6gm5rzrxtqdwsi7qxc","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"xz","hash":"bspvdxfryax3wnxlua26ghowojosrzaa","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"xmqusd2jqtdty6qzkksuxmi4yi6jvdi5","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"mqe3367abnu4eijzq4akvplrxvef62f3"},{"name":"xz","version":"5.4.6","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"pic":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zt5vu2vph2v2qjwgdbe7btgcz7axpyalorcsqiuxhrg5grwgrrvq====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"bspvdxfryax3wnxlua26ghowojosrzaa"},{"name":"tar","version":"1.34","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","zip":"pigz","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"cpgzon3rxegbd3xdnmhrmxvzaq5hyvpzz4y6egmhghhydvefupuq====","dependencies":[{"name":"bzip2","hash":"kvv2ofd7xftv7shuuhvsr5pcln2htiwg","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"mctiikna6qibnfutgekl6h3h747nhl73","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pigz","hash":"73zuxkusbtdu7v52fgeiyhwuuaihvkhz","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"bspvdxfryax3wnxlua26ghowojosrzaa","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"zstd","hash":"54a5z2cqsezl7q7cudyonywh3tcth5m7","parameters":{"deptypes":["run"],"virtuals":[]}}],"hash":"jm53r4fgccnjp77x6ktjui5moishomnh"},{"name":"pigz","version":"2.8","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"makefile","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"4w67lflje4giekjg4ie2vpyuiunjcumo6geofykvon3hodllp42q====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"xmqusd2jqtdty6qzkksuxmi4yi6jvdi5","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"73zuxkusbtdu7v52fgeiyhwuuaihvkhz"},{"name":"zstd","version":"1.5.6","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"makefile","compression":["none"],"libs":["shared","static"],"programs":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"uvmrov4c6unft6o4yd3jk3uqvweua3uhwdli4sw7h5wvklaf5t3q====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"54a5z2cqsezl7q7cudyonywh3tcth5m7"},{"name":"libffi","version":"3.4.6","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"umhsnvoj5ooa3glffnkk2hp3txmrsjvqbpfq2hbk4mhcvhza7gaa====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"ffu7cslh3j3fi4pnszo6kjfu7optpzzb"},{"name":"libxcrypt","version":"4.4.35","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","obsolete_api":false,"patches":["4885da3afc027999d7cc3c231de7fc6f3c8b119847536e0fc106bc846c617b9b"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["4885da3afc027999d7cc3c231de7fc6f3c8b119847536e0fc106bc846c617b9b"],"package_hash":"dam6cqot2l4nfh6nk3jidk7u2pr2p534tw7446ejqwttqitr4zea====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"5dub5yhb4fwo2o6iuos2ph5t5hg3yfwb","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"wi4esgdayal4yyw3mcxqueiift2rvs2n"},{"name":"openssl","version":"3.3.1","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","certs":"mozilla","docs":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"aqjwgxmqs2b7jublxelhue7n75puejodvhn2cbnpjjmq7xttex7a====","dependencies":[{"name":"ca-certificates-mozilla","hash":"rzhpcobyanwb5cncuh7o7zr23zbo3vr2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"5dub5yhb4fwo2o6iuos2ph5t5hg3yfwb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"xmqusd2jqtdty6qzkksuxmi4yi6jvdi5","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"us6qb6xd62jhohhzq6uvwrkgtwazxdvf"},{"name":"ca-certificates-mozilla","version":"2023-05-30","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"63npvwqwo2x7i6emvnklh4mhcn45gx2qzveorybh5h2inwr55sea====","hash":"rzhpcobyanwb5cncuh7o7zr23zbo3vr2"},{"name":"sqlite","version":"3.43.2","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","column_metadata":true,"dynamic_extensions":true,"fts":true,"functions":false,"rtree":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"3isun23rg3ucob7vs355eq7r5eyee4f2xperdje7xoxv5wayrqzq====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"amnbyrmtafl2pyypogji6gharv46lkrp","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"xmqusd2jqtdty6qzkksuxmi4yi6jvdi5","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"mmdphtu7zomdlsupofpcuur3l2hobahc"},{"name":"python-venv","version":"1.0","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"bvjgntlwbvi343x5ctophqqvq6nbx2h4ggbxnjrvnjb3jneitahq====","dependencies":[{"name":"python","hash":"46skxysjiafgqvyk2cqj2cithhkloj2g","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"hash":"p2betn6fduff6uhcmslks6lwdxdllaqx"},{"name":"re2c","version":"3.0","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kuhq5ne7cdx2pca57zwnn57fezjovywffswkkryt4usm4zekw3yq====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"tpv4lkit3ekpahcziwmpeawdnioucyut"}]}} +{"spec":{"_meta":{"version":4},"nodes":[{"name":"clingo-bootstrap","version":"spack","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"cmake","build_type":"Release","docs":false,"generator":"make","ipo":true,"optimized":false,"python":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"677q63cwqryynuiid4piwkdfx2y4sujizh35x5vv5pokofsidsoa====","dependencies":[{"name":"bison","hash":"tcstiesejoijdcxvwpmmghqwxgyvadyi","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"cmake","hash":"ncmbvgmldvjq2ct7bdb36pa7rorgr6ia","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"python","hash":"46skxysjiafgqvyk2cqj2cithhkloj2g","parameters":{"deptypes":["build","link","run"],"virtuals":[]}},{"name":"python-venv","hash":"p2betn6fduff6uhcmslks6lwdxdllaqx","parameters":{"deptypes":["build","run"],"virtuals":[]}},{"name":"re2c","hash":"tpv4lkit3ekpahcziwmpeawdnioucyut","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"yebuzmu45zxhlfnurot7f5fydgv4ujen"},{"name":"bison","version":"3.8.2","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","color":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"d4j62fwvuxqbiez32ltjnhu47ac425wjebsy6fhoptv6saxazcxq====","dependencies":[{"name":"diffutils","hash":"tllsflj5qmdgizkpd2d2vnum6jycfaak","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"m4","hash":"7f5bvgqhvzuhog5fjzjhc52boqpo4eg4","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"hash":"tcstiesejoijdcxvwpmmghqwxgyvadyi"},{"name":"diffutils","version":"3.10","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kbmzdy7mgklc24qx55cvx7kq7hceby2yav4fnf64gfdo7epdghwa====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"mctiikna6qibnfutgekl6h3h747nhl73","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}}],"hash":"tllsflj5qmdgizkpd2d2vnum6jycfaak"},{"name":"gmake","version":"4.4.1","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","guile":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ghstvqlc3r7kgiikwx24xhcxdxcqdk5viinrzgm2mssqigfonika====","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz"},{"name":"libiconv","version":"1.17","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"hx2hgtfxuafavkaf2rp3hjq7ttx4zuoyareduhx25lb4a5b64sua====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"mctiikna6qibnfutgekl6h3h747nhl73"},{"name":"m4","version":"1.4.19","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["9dc5fbd0d5cb1037ab1e6d0ecc74a30df218d0a94bdd5a02759a97f62daca573","bfdffa7c2eb01021d5849b36972c069693654ad826c1a20b53534009a4ec7a89"],"sigsegv":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bfdffa7c2eb01021d5849b36972c069693654ad826c1a20b53534009a4ec7a89","9dc5fbd0d5cb1037ab1e6d0ecc74a30df218d0a94bdd5a02759a97f62daca573"],"package_hash":"npb7a53yz7wqx4nvnasxwgzxaoiks6sdjz2eugrgkjxs4ml24xea====","dependencies":[{"name":"diffutils","hash":"tllsflj5qmdgizkpd2d2vnum6jycfaak","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libsigsegv","hash":"2ab3ieebereandqjennaq6bobs5ggc4y","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"7f5bvgqhvzuhog5fjzjhc52boqpo4eg4"},{"name":"libsigsegv","version":"2.14","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ypp3sciaprcyojozq2c5gqugtewmr5ytjbfpycyhu6wivtky7rja====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"2ab3ieebereandqjennaq6bobs5ggc4y"},{"name":"cmake","version":"3.29.6","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","build_type":"Release","doc":false,"ncurses":true,"ownlibs":true,"patches":["dbc3892939348c71f35973dd30e74c4a84bc7a2446c6930523c9723b88a597d1"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["dbc3892939348c71f35973dd30e74c4a84bc7a2446c6930523c9723b88a597d1"],"package_hash":"pbk2rknzfgc2vpxstkdbcoxv5xboiwe72owtgemfxhbuer6pcbbq====","dependencies":[{"name":"curl","hash":"5midcs5brhx4h6vnh2bryqh7qipzww6p","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"bfptmetyuv567sjav5haen57waanfxyc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"xmqusd2jqtdty6qzkksuxmi4yi6jvdi5","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"ncmbvgmldvjq2ct7bdb36pa7rorgr6ia"},{"name":"curl","version":"8.7.1","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","gssapi":false,"ldap":false,"libidn2":false,"librtmp":false,"libs":["shared","static"],"libssh":false,"libssh2":false,"nghttp2":true,"tls":["secure_transport"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kcgsfmigaqmusztsy67k2gfkizipob2uj5o5yub2i4onsxph454q====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"nghttp2","hash":"22mzwts36yiedkziivh5sdgyjogb2it2","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"perl","hash":"5dub5yhb4fwo2o6iuos2ph5t5hg3yfwb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"gutczpsbpaqctk6gm5rzrxtqdwsi7qxc","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"zlib-ng","hash":"xmqusd2jqtdty6qzkksuxmi4yi6jvdi5","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"5midcs5brhx4h6vnh2bryqh7qipzww6p"},{"name":"nghttp2","version":"1.62.0","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5b4v4lpftbuslseu6whtdgpswnmbjd7hjj564rxnkfgdnylfro7q====","dependencies":[{"name":"diffutils","hash":"tllsflj5qmdgizkpd2d2vnum6jycfaak","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"gutczpsbpaqctk6gm5rzrxtqdwsi7qxc","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"22mzwts36yiedkziivh5sdgyjogb2it2"},{"name":"pkgconf","version":"2.2.0","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"gl6tpyarjlclzsal6wa4dtc7cdzprq36nbibalai4a6wgzblrseq====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"gutczpsbpaqctk6gm5rzrxtqdwsi7qxc"},{"name":"perl","version":"5.38.2","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","cpanm":true,"opcode":true,"open":true,"patches":["714e4d1c7496e6b23834e7c88da3d69139418860fbc488fe82fd226b450a4be7"],"shared":true,"threads":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["714e4d1c7496e6b23834e7c88da3d69139418860fbc488fe82fd226b450a4be7"],"package_hash":"i5drmbzpsmo7jrmibmrmahee6y5rtiuo37vmdjda2kfgvfgy6ziq====","dependencies":[{"name":"berkeley-db","hash":"upn52ynxcbgarg2trkmqwm4ppbdkx3zs","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"bzip2","hash":"kvv2ofd7xftv7shuuhvsr5pcln2htiwg","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gdbm","hash":"wik3tgroytjrfvy5poap2gairb2nabxp","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"xmqusd2jqtdty6qzkksuxmi4yi6jvdi5","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"5dub5yhb4fwo2o6iuos2ph5t5hg3yfwb"},{"name":"berkeley-db","version":"18.1.40","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cxx":true,"docs":false,"patches":["26090f418891757af46ac3b89a9f43d6eb5989f7a3dce3d1cfc99fba547203b3","b231fcc4d5cff05e5c3a4814f6a5af0e9a966428dc2176540d2c05aff41de522"],"stl":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["b231fcc4d5cff05e5c3a4814f6a5af0e9a966428dc2176540d2c05aff41de522","26090f418891757af46ac3b89a9f43d6eb5989f7a3dce3d1cfc99fba547203b3"],"package_hash":"h57ydfn33zevvzctzzioiiwjwe362izbbwncb6a26dfeno4y7tda====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"upn52ynxcbgarg2trkmqwm4ppbdkx3zs"},{"name":"bzip2","version":"1.0.8","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","debug":false,"pic":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"wa33h4h2abj7tx5cndixz7bdwu5fspdaf2kjlqsinnearayw6fra====","dependencies":[{"name":"diffutils","hash":"tllsflj5qmdgizkpd2d2vnum6jycfaak","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"kvv2ofd7xftv7shuuhvsr5pcln2htiwg"},{"name":"gdbm","version":"1.23","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"liepxl6phlcxbgfmibxafhewtihlgaa4x3hko37ckqlafhxkrgdq====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"amnbyrmtafl2pyypogji6gharv46lkrp","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"wik3tgroytjrfvy5poap2gairb2nabxp"},{"name":"readline","version":"8.2","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"package_hash":"oww6dmr7xqgg6j7iiluonxbcl4irqnnrip4vfkjdwujncwnuhwuq====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"ncurses","hash":"bfptmetyuv567sjav5haen57waanfxyc","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"amnbyrmtafl2pyypogji6gharv46lkrp"},{"name":"ncurses","version":"6.5","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"abi":"none","build_system":"autotools","patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"symlinks":false,"termlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"package_hash":"rlqzqxoau3wwzu62x6qxlf4flon6b4n3p4zesnc6t2oyybrvnkwq====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"gutczpsbpaqctk6gm5rzrxtqdwsi7qxc","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"bfptmetyuv567sjav5haen57waanfxyc"},{"name":"zlib-ng","version":"2.2.1","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","compat":true,"new_strategies":true,"opt":true,"pic":true,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"jvdtkihgu4ykt4dwkunpk3ql7tcnl4wtxmhbd3vfl5o7hemoi4gq====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"xmqusd2jqtdty6qzkksuxmi4yi6jvdi5"},{"name":"python","version":"3.11.9","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","bz2":true,"crypt":true,"ctypes":true,"dbm":true,"debug":false,"libxml2":true,"lzma":true,"nis":false,"optimizations":false,"patches":["13fa8bfa3e852cbf2e7b02a0313009df484bb39f55a50ada00e1a5599e956ac9","b0615b2fc96bb0cf7f180b107183b194b83b34c7614dcd6121e4a76bbf168155","ebdca648c9c1d25f586d7e2a495b62e6d91973b55264a13d89eda1beff72ef56","f2fd060afc4b4618fe8104c4c5d771f36dc55b1db5a4623785a4ea707ec72fb4"],"pic":true,"pyexpat":true,"pythoncmd":true,"readline":true,"shared":true,"sqlite3":true,"ssl":true,"tkinter":false,"uuid":true,"zlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["f2fd060afc4b4618fe8104c4c5d771f36dc55b1db5a4623785a4ea707ec72fb4","b0615b2fc96bb0cf7f180b107183b194b83b34c7614dcd6121e4a76bbf168155","13fa8bfa3e852cbf2e7b02a0313009df484bb39f55a50ada00e1a5599e956ac9","ebdca648c9c1d25f586d7e2a495b62e6d91973b55264a13d89eda1beff72ef56"],"package_hash":"t65rlqtklu5oqlcnkc62ld3dpxgvevfm2h5hfgp36ptz2uefx2sq====","dependencies":[{"name":"apple-libuuid","hash":"zdktedsebu7zjozb4wqhr45hfr665tlh","parameters":{"deptypes":["build","link"],"virtuals":["uuid"]}},{"name":"bzip2","hash":"kvv2ofd7xftv7shuuhvsr5pcln2htiwg","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"expat","hash":"ewxodvrjxwjn4gayblrayq4mxp4todqu","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gdbm","hash":"wik3tgroytjrfvy5poap2gairb2nabxp","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gettext","hash":"qatrw6nst2iqufrcjszou2zlbri6nphm","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libffi","hash":"ffu7cslh3j3fi4pnszo6kjfu7optpzzb","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"libxcrypt","hash":"wi4esgdayal4yyw3mcxqueiift2rvs2n","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"bfptmetyuv567sjav5haen57waanfxyc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"us6qb6xd62jhohhzq6uvwrkgtwazxdvf","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"pkgconf","hash":"gutczpsbpaqctk6gm5rzrxtqdwsi7qxc","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"readline","hash":"amnbyrmtafl2pyypogji6gharv46lkrp","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"sqlite","hash":"mmdphtu7zomdlsupofpcuur3l2hobahc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"xz","hash":"bspvdxfryax3wnxlua26ghowojosrzaa","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"xmqusd2jqtdty6qzkksuxmi4yi6jvdi5","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"46skxysjiafgqvyk2cqj2cithhkloj2g"},{"name":"apple-libuuid","version":"1353.100.2","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"bundle","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"external":{"path":"/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk","module":null,"extra_attributes":{}},"package_hash":"rv7eeukm7m2umg6ulafeco2qz2kvaqpx2bjoita6g27hrs6vfmiq====","hash":"zdktedsebu7zjozb4wqhr45hfr665tlh"},{"name":"expat","version":"2.6.2","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","libbsd":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zeyjv42sx5l6mjqie4smh2uxzfhsxvsnw7udjwg2sl5bcnc66req====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"ewxodvrjxwjn4gayblrayq4mxp4todqu"},{"name":"gettext","version":"0.22.5","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","bzip2":true,"curses":true,"git":true,"libunistring":false,"libxml2":true,"pic":true,"shared":true,"tar":true,"xz":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5bhbkykxueimk2h42d6gb7dumldhutohav3x2r23rsalexcgy42a====","dependencies":[{"name":"bzip2","hash":"kvv2ofd7xftv7shuuhvsr5pcln2htiwg","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"mctiikna6qibnfutgekl6h3h747nhl73","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"libxml2","hash":"mqe3367abnu4eijzq4akvplrxvef62f3","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"bfptmetyuv567sjav5haen57waanfxyc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"tar","hash":"jm53r4fgccnjp77x6ktjui5moishomnh","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"bspvdxfryax3wnxlua26ghowojosrzaa","parameters":{"deptypes":["build","link","run"],"virtuals":[]}}],"hash":"qatrw6nst2iqufrcjszou2zlbri6nphm"},{"name":"libxml2","version":"2.10.3","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","pic":true,"python":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"squqo2aayigwxdusu3q3syojwit5gqdh6q4un576652hy4gytxcq====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"mctiikna6qibnfutgekl6h3h747nhl73","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pkgconf","hash":"gutczpsbpaqctk6gm5rzrxtqdwsi7qxc","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"xz","hash":"bspvdxfryax3wnxlua26ghowojosrzaa","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"xmqusd2jqtdty6qzkksuxmi4yi6jvdi5","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"mqe3367abnu4eijzq4akvplrxvef62f3"},{"name":"xz","version":"5.4.6","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"pic":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zt5vu2vph2v2qjwgdbe7btgcz7axpyalorcsqiuxhrg5grwgrrvq====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"bspvdxfryax3wnxlua26ghowojosrzaa"},{"name":"tar","version":"1.34","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","zip":"pigz","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"cpgzon3rxegbd3xdnmhrmxvzaq5hyvpzz4y6egmhghhydvefupuq====","dependencies":[{"name":"bzip2","hash":"kvv2ofd7xftv7shuuhvsr5pcln2htiwg","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"mctiikna6qibnfutgekl6h3h747nhl73","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pigz","hash":"73zuxkusbtdu7v52fgeiyhwuuaihvkhz","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"bspvdxfryax3wnxlua26ghowojosrzaa","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"zstd","hash":"54a5z2cqsezl7q7cudyonywh3tcth5m7","parameters":{"deptypes":["run"],"virtuals":[]}}],"hash":"jm53r4fgccnjp77x6ktjui5moishomnh"},{"name":"pigz","version":"2.8","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"makefile","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"4w67lflje4giekjg4ie2vpyuiunjcumo6geofykvon3hodllp42q====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"xmqusd2jqtdty6qzkksuxmi4yi6jvdi5","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"73zuxkusbtdu7v52fgeiyhwuuaihvkhz"},{"name":"zstd","version":"1.5.6","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"makefile","compression":["none"],"libs":["shared","static"],"programs":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"uvmrov4c6unft6o4yd3jk3uqvweua3uhwdli4sw7h5wvklaf5t3q====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"54a5z2cqsezl7q7cudyonywh3tcth5m7"},{"name":"libffi","version":"3.4.6","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"umhsnvoj5ooa3glffnkk2hp3txmrsjvqbpfq2hbk4mhcvhza7gaa====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"ffu7cslh3j3fi4pnszo6kjfu7optpzzb"},{"name":"libxcrypt","version":"4.4.35","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","obsolete_api":false,"patches":["4885da3afc027999d7cc3c231de7fc6f3c8b119847536e0fc106bc846c617b9b"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["4885da3afc027999d7cc3c231de7fc6f3c8b119847536e0fc106bc846c617b9b"],"package_hash":"dam6cqot2l4nfh6nk3jidk7u2pr2p534tw7446ejqwttqitr4zea====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"5dub5yhb4fwo2o6iuos2ph5t5hg3yfwb","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"wi4esgdayal4yyw3mcxqueiift2rvs2n"},{"name":"openssl","version":"3.3.1","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","certs":"mozilla","docs":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"aqjwgxmqs2b7jublxelhue7n75puejodvhn2cbnpjjmq7xttex7a====","dependencies":[{"name":"ca-certificates-mozilla","hash":"rzhpcobyanwb5cncuh7o7zr23zbo3vr2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"5dub5yhb4fwo2o6iuos2ph5t5hg3yfwb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"xmqusd2jqtdty6qzkksuxmi4yi6jvdi5","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"us6qb6xd62jhohhzq6uvwrkgtwazxdvf"},{"name":"ca-certificates-mozilla","version":"2023-05-30","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"63npvwqwo2x7i6emvnklh4mhcn45gx2qzveorybh5h2inwr55sea====","hash":"rzhpcobyanwb5cncuh7o7zr23zbo3vr2"},{"name":"sqlite","version":"3.43.2","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","column_metadata":true,"dynamic_extensions":true,"fts":true,"functions":false,"rtree":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"3isun23rg3ucob7vs355eq7r5eyee4f2xperdje7xoxv5wayrqzq====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"amnbyrmtafl2pyypogji6gharv46lkrp","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"xmqusd2jqtdty6qzkksuxmi4yi6jvdi5","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"mmdphtu7zomdlsupofpcuur3l2hobahc"},{"name":"python-venv","version":"1.0","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"bvjgntlwbvi343x5ctophqqvq6nbx2h4ggbxnjrvnjb3jneitahq====","dependencies":[{"name":"python","hash":"46skxysjiafgqvyk2cqj2cithhkloj2g","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"hash":"p2betn6fduff6uhcmslks6lwdxdllaqx"},{"name":"re2c","version":"3.0","arch":{"platform":"darwin","platform_os":"sonoma","target":"x86_64"},"compiler":{"name":"apple-clang","version":"15.0.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kuhq5ne7cdx2pca57zwnn57fezjovywffswkkryt4usm4zekw3yq====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"tpv4lkit3ekpahcziwmpeawdnioucyut"}]}} diff --git a/lib/spack/spack/bootstrap/prototypes/clingo-freebsd-amd64.json b/lib/spack/spack/bootstrap/prototypes/clingo-freebsd-amd64.json index 414a0a2071be02..ba661aa4f859d7 100644 --- a/lib/spack/spack/bootstrap/prototypes/clingo-freebsd-amd64.json +++ b/lib/spack/spack/bootstrap/prototypes/clingo-freebsd-amd64.json @@ -1 +1 @@ -{"spec":{"_meta":{"version":4},"nodes":[{"name":"clingo-bootstrap","version":"spack","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"cmake","build_type":"Release","docs":false,"generator":"make","ipo":false,"optimized":false,"python":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"677q63cwqryynuiid4piwkdfx2y4sujizh35x5vv5pokofsidsoa====","dependencies":[{"name":"bison","hash":"3wdklrcdn74jrtsre32c2fw7rugodnhp","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"cmake","hash":"bwpbzabluu6b4cifqacnggfj325hhygp","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"python","hash":"7lm43ao2uclf2zc74fyuiy43v4gtzk7a","parameters":{"deptypes":["build","link","run"],"virtuals":[]}},{"name":"python-venv","hash":"elm263xl5rvuph7tksslsoxtr5ldsckf","parameters":{"deptypes":["build","run"],"virtuals":[]}},{"name":"re2c","hash":"g6rvrl5tghnxmldvsrjpye46y7nfa2it","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"d73jzr7ocsvpbwpbdfit6myiwe5soyd4"},{"name":"bison","version":"3.8.2","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","color":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"d4j62fwvuxqbiez32ltjnhu47ac425wjebsy6fhoptv6saxazcxq====","dependencies":[{"name":"diffutils","hash":"2jg7xlirln67iqw2owirghpez2vfhotd","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"m4","hash":"3bfqnppsvbrfgxfd2xhjvcwtz5xulzdh","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"hash":"3wdklrcdn74jrtsre32c2fw7rugodnhp"},{"name":"diffutils","version":"3.10","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kbmzdy7mgklc24qx55cvx7kq7hceby2yav4fnf64gfdo7epdghwa====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"w5p56ykqczhy7l6h435qvjheivk36qy4","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}}],"hash":"2jg7xlirln67iqw2owirghpez2vfhotd"},{"name":"gmake","version":"4.4.1","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"generic","guile":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"rpzjfobv7qh3wevti34nlbd2emtw5mnyszqmkyiq5jiq33xm7qzq====","hash":"wydxawduinvosugi5pwkm7dbsxqltryg"},{"name":"libiconv","version":"1.17","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"hx2hgtfxuafavkaf2rp3hjq7ttx4zuoyareduhx25lb4a5b64sua====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"w5p56ykqczhy7l6h435qvjheivk36qy4"},{"name":"m4","version":"1.4.19","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["9dc5fbd0d5cb1037ab1e6d0ecc74a30df218d0a94bdd5a02759a97f62daca573","bfdffa7c2eb01021d5849b36972c069693654ad826c1a20b53534009a4ec7a89"],"sigsegv":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bfdffa7c2eb01021d5849b36972c069693654ad826c1a20b53534009a4ec7a89","9dc5fbd0d5cb1037ab1e6d0ecc74a30df218d0a94bdd5a02759a97f62daca573"],"package_hash":"npb7a53yz7wqx4nvnasxwgzxaoiks6sdjz2eugrgkjxs4ml24xea====","dependencies":[{"name":"diffutils","hash":"2jg7xlirln67iqw2owirghpez2vfhotd","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libsigsegv","hash":"byc3ga7ez2d7jmzyao32x266cgubesqq","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"3bfqnppsvbrfgxfd2xhjvcwtz5xulzdh"},{"name":"libsigsegv","version":"2.14","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ypp3sciaprcyojozq2c5gqugtewmr5ytjbfpycyhu6wivtky7rja====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"byc3ga7ez2d7jmzyao32x266cgubesqq"},{"name":"cmake","version":"3.29.6","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"generic","build_type":"Release","doc":false,"ncurses":true,"ownlibs":true,"patches":["dbc3892939348c71f35973dd30e74c4a84bc7a2446c6930523c9723b88a597d1"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["dbc3892939348c71f35973dd30e74c4a84bc7a2446c6930523c9723b88a597d1"],"package_hash":"pbk2rknzfgc2vpxstkdbcoxv5xboiwe72owtgemfxhbuer6pcbbq====","dependencies":[{"name":"curl","hash":"3eurdl4v6krpmgbfvqaivosebv5xyiis","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"6dhzcjbmiru3plbe6iaqpt63ivhsr73u","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"7ztxp7zriik3rwsye5u7f3hrmykk6yj6","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"bwpbzabluu6b4cifqacnggfj325hhygp"},{"name":"curl","version":"8.7.1","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","gssapi":false,"ldap":false,"libidn2":false,"librtmp":false,"libs":["shared","static"],"libssh":false,"libssh2":false,"nghttp2":true,"tls":["openssl"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kcgsfmigaqmusztsy67k2gfkizipob2uj5o5yub2i4onsxph454q====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"nghttp2","hash":"ffcpmjsfc6rao2hylcfws5zedgekf5vz","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"7g3tlrp5kiroaak364nmsy2syb4zmvbs","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"perl","hash":"pdpqvtmsot4linjoftvfkds3q3kqk7xr","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"xixt5k4vsilk3mfkwnjilvd7zn7poeup","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"zlib-ng","hash":"7ztxp7zriik3rwsye5u7f3hrmykk6yj6","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"3eurdl4v6krpmgbfvqaivosebv5xyiis"},{"name":"nghttp2","version":"1.62.0","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5b4v4lpftbuslseu6whtdgpswnmbjd7hjj564rxnkfgdnylfro7q====","dependencies":[{"name":"diffutils","hash":"2jg7xlirln67iqw2owirghpez2vfhotd","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"xixt5k4vsilk3mfkwnjilvd7zn7poeup","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"ffcpmjsfc6rao2hylcfws5zedgekf5vz"},{"name":"pkgconf","version":"2.2.0","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"gl6tpyarjlclzsal6wa4dtc7cdzprq36nbibalai4a6wgzblrseq====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"xixt5k4vsilk3mfkwnjilvd7zn7poeup"},{"name":"openssl","version":"3.3.1","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"generic","certs":"mozilla","docs":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"aqjwgxmqs2b7jublxelhue7n75puejodvhn2cbnpjjmq7xttex7a====","dependencies":[{"name":"ca-certificates-mozilla","hash":"orkemgy3ncctka6e5wuhjmvv4hqf57dk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"pdpqvtmsot4linjoftvfkds3q3kqk7xr","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"7ztxp7zriik3rwsye5u7f3hrmykk6yj6","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"7g3tlrp5kiroaak364nmsy2syb4zmvbs"},{"name":"ca-certificates-mozilla","version":"2023-05-30","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"63npvwqwo2x7i6emvnklh4mhcn45gx2qzveorybh5h2inwr55sea====","hash":"orkemgy3ncctka6e5wuhjmvv4hqf57dk"},{"name":"perl","version":"5.38.2","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"generic","cpanm":true,"opcode":true,"open":true,"patches":["714e4d1c7496e6b23834e7c88da3d69139418860fbc488fe82fd226b450a4be7"],"shared":true,"threads":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["714e4d1c7496e6b23834e7c88da3d69139418860fbc488fe82fd226b450a4be7"],"package_hash":"i5drmbzpsmo7jrmibmrmahee6y5rtiuo37vmdjda2kfgvfgy6ziq====","dependencies":[{"name":"berkeley-db","hash":"jk6dyv372wyksasduryfojgn55tugtie","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"bzip2","hash":"uozy6txh4p3kq44rycstcadu7m5l36eh","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gdbm","hash":"mhn6tszi6hsltchugtzrcssvynz57csg","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"7ztxp7zriik3rwsye5u7f3hrmykk6yj6","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"pdpqvtmsot4linjoftvfkds3q3kqk7xr"},{"name":"berkeley-db","version":"18.1.40","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","cxx":true,"docs":false,"patches":["26090f418891757af46ac3b89a9f43d6eb5989f7a3dce3d1cfc99fba547203b3","b231fcc4d5cff05e5c3a4814f6a5af0e9a966428dc2176540d2c05aff41de522"],"stl":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["b231fcc4d5cff05e5c3a4814f6a5af0e9a966428dc2176540d2c05aff41de522","26090f418891757af46ac3b89a9f43d6eb5989f7a3dce3d1cfc99fba547203b3"],"package_hash":"h57ydfn33zevvzctzzioiiwjwe362izbbwncb6a26dfeno4y7tda====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"jk6dyv372wyksasduryfojgn55tugtie"},{"name":"bzip2","version":"1.0.8","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"generic","debug":false,"pic":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"wa33h4h2abj7tx5cndixz7bdwu5fspdaf2kjlqsinnearayw6fra====","dependencies":[{"name":"diffutils","hash":"2jg7xlirln67iqw2owirghpez2vfhotd","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"uozy6txh4p3kq44rycstcadu7m5l36eh"},{"name":"gdbm","version":"1.23","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"liepxl6phlcxbgfmibxafhewtihlgaa4x3hko37ckqlafhxkrgdq====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"cdsre6iv6m4if3gx7k27ynraamwducqj","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"mhn6tszi6hsltchugtzrcssvynz57csg"},{"name":"readline","version":"8.2","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"package_hash":"oww6dmr7xqgg6j7iiluonxbcl4irqnnrip4vfkjdwujncwnuhwuq====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"ncurses","hash":"6dhzcjbmiru3plbe6iaqpt63ivhsr73u","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"cdsre6iv6m4if3gx7k27ynraamwducqj"},{"name":"ncurses","version":"6.5","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"abi":"none","build_system":"autotools","patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"symlinks":false,"termlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"package_hash":"rlqzqxoau3wwzu62x6qxlf4flon6b4n3p4zesnc6t2oyybrvnkwq====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"xixt5k4vsilk3mfkwnjilvd7zn7poeup","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"6dhzcjbmiru3plbe6iaqpt63ivhsr73u"},{"name":"zlib-ng","version":"2.2.1","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","compat":true,"new_strategies":true,"opt":true,"pic":true,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"jvdtkihgu4ykt4dwkunpk3ql7tcnl4wtxmhbd3vfl5o7hemoi4gq====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"7ztxp7zriik3rwsye5u7f3hrmykk6yj6"},{"name":"python","version":"3.11.9","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"generic","bz2":true,"ctypes":true,"dbm":true,"debug":false,"libxml2":true,"lzma":true,"nis":false,"optimizations":false,"patches":["13fa8bfa3e852cbf2e7b02a0313009df484bb39f55a50ada00e1a5599e956ac9","b0615b2fc96bb0cf7f180b107183b194b83b34c7614dcd6121e4a76bbf168155","ebdca648c9c1d25f586d7e2a495b62e6d91973b55264a13d89eda1beff72ef56","f2fd060afc4b4618fe8104c4c5d771f36dc55b1db5a4623785a4ea707ec72fb4"],"pic":true,"pyexpat":true,"pythoncmd":true,"readline":true,"shared":true,"sqlite3":true,"ssl":true,"tkinter":false,"uuid":true,"zlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["f2fd060afc4b4618fe8104c4c5d771f36dc55b1db5a4623785a4ea707ec72fb4","b0615b2fc96bb0cf7f180b107183b194b83b34c7614dcd6121e4a76bbf168155","13fa8bfa3e852cbf2e7b02a0313009df484bb39f55a50ada00e1a5599e956ac9","ebdca648c9c1d25f586d7e2a495b62e6d91973b55264a13d89eda1beff72ef56"],"package_hash":"t65rlqtklu5oqlcnkc62ld3dpxgvevfm2h5hfgp36ptz2uefx2sq====","dependencies":[{"name":"bzip2","hash":"uozy6txh4p3kq44rycstcadu7m5l36eh","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"expat","hash":"cjcphxa5agystc6egs7x2zfv6s7kt52p","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gdbm","hash":"mhn6tszi6hsltchugtzrcssvynz57csg","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gettext","hash":"ch2bcvngtps62qfxns4pzbleye7ic57c","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libffi","hash":"kkc7oupodtd67dlhjugfuzw3g7tvcuno","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"6dhzcjbmiru3plbe6iaqpt63ivhsr73u","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"7g3tlrp5kiroaak364nmsy2syb4zmvbs","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"pkgconf","hash":"xixt5k4vsilk3mfkwnjilvd7zn7poeup","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"readline","hash":"cdsre6iv6m4if3gx7k27ynraamwducqj","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"sqlite","hash":"qgog7nkb6ubobruuhcvyv5vbraferneg","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"util-linux-uuid","hash":"u3rkbgitzhddldu75y6od4qcjad7h2a3","parameters":{"deptypes":["build","link"],"virtuals":["uuid"]}},{"name":"xz","hash":"umkf2v3ieee4orna3pe3mx7rhwzcx7dv","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"7ztxp7zriik3rwsye5u7f3hrmykk6yj6","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"7lm43ao2uclf2zc74fyuiy43v4gtzk7a"},{"name":"expat","version":"2.6.2","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","libbsd":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zeyjv42sx5l6mjqie4smh2uxzfhsxvsnw7udjwg2sl5bcnc66req====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"cjcphxa5agystc6egs7x2zfv6s7kt52p"},{"name":"gettext","version":"0.22.5","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","bzip2":true,"curses":true,"git":true,"libunistring":false,"libxml2":true,"pic":true,"shared":true,"tar":true,"xz":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5bhbkykxueimk2h42d6gb7dumldhutohav3x2r23rsalexcgy42a====","dependencies":[{"name":"bzip2","hash":"uozy6txh4p3kq44rycstcadu7m5l36eh","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"w5p56ykqczhy7l6h435qvjheivk36qy4","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"libxml2","hash":"uu3uyudar6cz5tmenmmk376i54alwmwl","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"6dhzcjbmiru3plbe6iaqpt63ivhsr73u","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"tar","hash":"3on36tpbw5355v3czpeyn2vokzbttigm","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"umkf2v3ieee4orna3pe3mx7rhwzcx7dv","parameters":{"deptypes":["build","link","run"],"virtuals":[]}}],"hash":"ch2bcvngtps62qfxns4pzbleye7ic57c"},{"name":"libxml2","version":"2.10.3","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","pic":true,"python":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"squqo2aayigwxdusu3q3syojwit5gqdh6q4un576652hy4gytxcq====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"w5p56ykqczhy7l6h435qvjheivk36qy4","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pkgconf","hash":"xixt5k4vsilk3mfkwnjilvd7zn7poeup","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"xz","hash":"umkf2v3ieee4orna3pe3mx7rhwzcx7dv","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"7ztxp7zriik3rwsye5u7f3hrmykk6yj6","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"uu3uyudar6cz5tmenmmk376i54alwmwl"},{"name":"xz","version":"5.4.6","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"pic":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zt5vu2vph2v2qjwgdbe7btgcz7axpyalorcsqiuxhrg5grwgrrvq====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"umkf2v3ieee4orna3pe3mx7rhwzcx7dv"},{"name":"tar","version":"1.34","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","zip":"pigz","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"cpgzon3rxegbd3xdnmhrmxvzaq5hyvpzz4y6egmhghhydvefupuq====","dependencies":[{"name":"bzip2","hash":"uozy6txh4p3kq44rycstcadu7m5l36eh","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"w5p56ykqczhy7l6h435qvjheivk36qy4","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pigz","hash":"n6urcuk2bvv6q32udka2ldaf3ap345a4","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"umkf2v3ieee4orna3pe3mx7rhwzcx7dv","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"zstd","hash":"aejhse4tyvwvgywcz26ai4l4zxe4jvg2","parameters":{"deptypes":["run"],"virtuals":[]}}],"hash":"3on36tpbw5355v3czpeyn2vokzbttigm"},{"name":"pigz","version":"2.8","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"makefile","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"4w67lflje4giekjg4ie2vpyuiunjcumo6geofykvon3hodllp42q====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"7ztxp7zriik3rwsye5u7f3hrmykk6yj6","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"n6urcuk2bvv6q32udka2ldaf3ap345a4"},{"name":"zstd","version":"1.5.6","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"makefile","compression":["none"],"libs":["shared","static"],"programs":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"uvmrov4c6unft6o4yd3jk3uqvweua3uhwdli4sw7h5wvklaf5t3q====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"aejhse4tyvwvgywcz26ai4l4zxe4jvg2"},{"name":"libffi","version":"3.4.6","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"umhsnvoj5ooa3glffnkk2hp3txmrsjvqbpfq2hbk4mhcvhza7gaa====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"kkc7oupodtd67dlhjugfuzw3g7tvcuno"},{"name":"sqlite","version":"3.43.2","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","column_metadata":true,"dynamic_extensions":true,"fts":true,"functions":false,"rtree":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"lpes7bwf6khi6o2fswt6rex4o6jo5jipwzh4iq4hdfgnqp6wqxwq====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"cdsre6iv6m4if3gx7k27ynraamwducqj","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"7ztxp7zriik3rwsye5u7f3hrmykk6yj6","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"qgog7nkb6ubobruuhcvyv5vbraferneg"},{"name":"util-linux-uuid","version":"2.40.2","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"wnzs7tzbnlmwedntxawri35345ejg3cj2tj7jmpsvauet5hfi5yq====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"xixt5k4vsilk3mfkwnjilvd7zn7poeup","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"u3rkbgitzhddldu75y6od4qcjad7h2a3"},{"name":"python-venv","version":"1.0","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"bvjgntlwbvi343x5ctophqqvq6nbx2h4ggbxnjrvnjb3jneitahq====","dependencies":[{"name":"python","hash":"7lm43ao2uclf2zc74fyuiy43v4gtzk7a","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"hash":"elm263xl5rvuph7tksslsoxtr5ldsckf"},{"name":"re2c","version":"3.0","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kuhq5ne7cdx2pca57zwnn57fezjovywffswkkryt4usm4zekw3yq====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"g6rvrl5tghnxmldvsrjpye46y7nfa2it"}]}} +{"spec":{"_meta":{"version":4},"nodes":[{"name":"clingo-bootstrap","version":"spack","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"cmake","build_type":"Release","docs":false,"generator":"make","ipo":false,"optimized":false,"python":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"677q63cwqryynuiid4piwkdfx2y4sujizh35x5vv5pokofsidsoa====","dependencies":[{"name":"bison","hash":"3wdklrcdn74jrtsre32c2fw7rugodnhp","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"cmake","hash":"bwpbzabluu6b4cifqacnggfj325hhygp","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"python","hash":"7lm43ao2uclf2zc74fyuiy43v4gtzk7a","parameters":{"deptypes":["build","link","run"],"virtuals":[]}},{"name":"python-venv","hash":"elm263xl5rvuph7tksslsoxtr5ldsckf","parameters":{"deptypes":["build","run"],"virtuals":[]}},{"name":"re2c","hash":"g6rvrl5tghnxmldvsrjpye46y7nfa2it","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"d73jzr7ocsvpbwpbdfit6myiwe5soyd4"},{"name":"bison","version":"3.8.2","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","color":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"d4j62fwvuxqbiez32ltjnhu47ac425wjebsy6fhoptv6saxazcxq====","dependencies":[{"name":"diffutils","hash":"2jg7xlirln67iqw2owirghpez2vfhotd","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"m4","hash":"3bfqnppsvbrfgxfd2xhjvcwtz5xulzdh","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"hash":"3wdklrcdn74jrtsre32c2fw7rugodnhp"},{"name":"diffutils","version":"3.10","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kbmzdy7mgklc24qx55cvx7kq7hceby2yav4fnf64gfdo7epdghwa====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"w5p56ykqczhy7l6h435qvjheivk36qy4","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}}],"hash":"2jg7xlirln67iqw2owirghpez2vfhotd"},{"name":"gmake","version":"4.4.1","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"generic","guile":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"rpzjfobv7qh3wevti34nlbd2emtw5mnyszqmkyiq5jiq33xm7qzq====","hash":"wydxawduinvosugi5pwkm7dbsxqltryg"},{"name":"libiconv","version":"1.17","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"hx2hgtfxuafavkaf2rp3hjq7ttx4zuoyareduhx25lb4a5b64sua====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"w5p56ykqczhy7l6h435qvjheivk36qy4"},{"name":"m4","version":"1.4.19","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["9dc5fbd0d5cb1037ab1e6d0ecc74a30df218d0a94bdd5a02759a97f62daca573","bfdffa7c2eb01021d5849b36972c069693654ad826c1a20b53534009a4ec7a89"],"sigsegv":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bfdffa7c2eb01021d5849b36972c069693654ad826c1a20b53534009a4ec7a89","9dc5fbd0d5cb1037ab1e6d0ecc74a30df218d0a94bdd5a02759a97f62daca573"],"package_hash":"npb7a53yz7wqx4nvnasxwgzxaoiks6sdjz2eugrgkjxs4ml24xea====","dependencies":[{"name":"diffutils","hash":"2jg7xlirln67iqw2owirghpez2vfhotd","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libsigsegv","hash":"byc3ga7ez2d7jmzyao32x266cgubesqq","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"3bfqnppsvbrfgxfd2xhjvcwtz5xulzdh"},{"name":"libsigsegv","version":"2.14","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ypp3sciaprcyojozq2c5gqugtewmr5ytjbfpycyhu6wivtky7rja====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"byc3ga7ez2d7jmzyao32x266cgubesqq"},{"name":"cmake","version":"3.29.6","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"generic","build_type":"Release","doc":false,"ncurses":true,"ownlibs":true,"patches":["dbc3892939348c71f35973dd30e74c4a84bc7a2446c6930523c9723b88a597d1"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["dbc3892939348c71f35973dd30e74c4a84bc7a2446c6930523c9723b88a597d1"],"package_hash":"pbk2rknzfgc2vpxstkdbcoxv5xboiwe72owtgemfxhbuer6pcbbq====","dependencies":[{"name":"curl","hash":"3eurdl4v6krpmgbfvqaivosebv5xyiis","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"6dhzcjbmiru3plbe6iaqpt63ivhsr73u","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"7ztxp7zriik3rwsye5u7f3hrmykk6yj6","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"bwpbzabluu6b4cifqacnggfj325hhygp"},{"name":"curl","version":"8.7.1","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","gssapi":false,"ldap":false,"libidn2":false,"librtmp":false,"libs":["shared","static"],"libssh":false,"libssh2":false,"nghttp2":true,"tls":["openssl"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kcgsfmigaqmusztsy67k2gfkizipob2uj5o5yub2i4onsxph454q====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"nghttp2","hash":"ffcpmjsfc6rao2hylcfws5zedgekf5vz","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"7g3tlrp5kiroaak364nmsy2syb4zmvbs","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"perl","hash":"pdpqvtmsot4linjoftvfkds3q3kqk7xr","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"xixt5k4vsilk3mfkwnjilvd7zn7poeup","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"zlib-ng","hash":"7ztxp7zriik3rwsye5u7f3hrmykk6yj6","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"3eurdl4v6krpmgbfvqaivosebv5xyiis"},{"name":"nghttp2","version":"1.62.0","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5b4v4lpftbuslseu6whtdgpswnmbjd7hjj564rxnkfgdnylfro7q====","dependencies":[{"name":"diffutils","hash":"2jg7xlirln67iqw2owirghpez2vfhotd","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"xixt5k4vsilk3mfkwnjilvd7zn7poeup","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"ffcpmjsfc6rao2hylcfws5zedgekf5vz"},{"name":"pkgconf","version":"2.2.0","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"gl6tpyarjlclzsal6wa4dtc7cdzprq36nbibalai4a6wgzblrseq====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"xixt5k4vsilk3mfkwnjilvd7zn7poeup"},{"name":"openssl","version":"3.3.1","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"generic","certs":"mozilla","docs":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"aqjwgxmqs2b7jublxelhue7n75puejodvhn2cbnpjjmq7xttex7a====","dependencies":[{"name":"ca-certificates-mozilla","hash":"orkemgy3ncctka6e5wuhjmvv4hqf57dk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"pdpqvtmsot4linjoftvfkds3q3kqk7xr","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"7ztxp7zriik3rwsye5u7f3hrmykk6yj6","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"7g3tlrp5kiroaak364nmsy2syb4zmvbs"},{"name":"ca-certificates-mozilla","version":"2023-05-30","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"63npvwqwo2x7i6emvnklh4mhcn45gx2qzveorybh5h2inwr55sea====","hash":"orkemgy3ncctka6e5wuhjmvv4hqf57dk"},{"name":"perl","version":"5.38.2","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"generic","cpanm":true,"opcode":true,"open":true,"patches":["714e4d1c7496e6b23834e7c88da3d69139418860fbc488fe82fd226b450a4be7"],"shared":true,"threads":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["714e4d1c7496e6b23834e7c88da3d69139418860fbc488fe82fd226b450a4be7"],"package_hash":"i5drmbzpsmo7jrmibmrmahee6y5rtiuo37vmdjda2kfgvfgy6ziq====","dependencies":[{"name":"berkeley-db","hash":"jk6dyv372wyksasduryfojgn55tugtie","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"bzip2","hash":"uozy6txh4p3kq44rycstcadu7m5l36eh","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gdbm","hash":"mhn6tszi6hsltchugtzrcssvynz57csg","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"7ztxp7zriik3rwsye5u7f3hrmykk6yj6","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"pdpqvtmsot4linjoftvfkds3q3kqk7xr"},{"name":"berkeley-db","version":"18.1.40","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","cxx":true,"docs":false,"patches":["26090f418891757af46ac3b89a9f43d6eb5989f7a3dce3d1cfc99fba547203b3","b231fcc4d5cff05e5c3a4814f6a5af0e9a966428dc2176540d2c05aff41de522"],"stl":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["b231fcc4d5cff05e5c3a4814f6a5af0e9a966428dc2176540d2c05aff41de522","26090f418891757af46ac3b89a9f43d6eb5989f7a3dce3d1cfc99fba547203b3"],"package_hash":"h57ydfn33zevvzctzzioiiwjwe362izbbwncb6a26dfeno4y7tda====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"jk6dyv372wyksasduryfojgn55tugtie"},{"name":"bzip2","version":"1.0.8","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"generic","debug":false,"pic":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"wa33h4h2abj7tx5cndixz7bdwu5fspdaf2kjlqsinnearayw6fra====","dependencies":[{"name":"diffutils","hash":"2jg7xlirln67iqw2owirghpez2vfhotd","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"uozy6txh4p3kq44rycstcadu7m5l36eh"},{"name":"gdbm","version":"1.23","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"liepxl6phlcxbgfmibxafhewtihlgaa4x3hko37ckqlafhxkrgdq====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"cdsre6iv6m4if3gx7k27ynraamwducqj","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"mhn6tszi6hsltchugtzrcssvynz57csg"},{"name":"readline","version":"8.2","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"package_hash":"oww6dmr7xqgg6j7iiluonxbcl4irqnnrip4vfkjdwujncwnuhwuq====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"ncurses","hash":"6dhzcjbmiru3plbe6iaqpt63ivhsr73u","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"cdsre6iv6m4if3gx7k27ynraamwducqj"},{"name":"ncurses","version":"6.5","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"abi":"none","build_system":"autotools","patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"symlinks":false,"termlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"package_hash":"rlqzqxoau3wwzu62x6qxlf4flon6b4n3p4zesnc6t2oyybrvnkwq====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"xixt5k4vsilk3mfkwnjilvd7zn7poeup","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"6dhzcjbmiru3plbe6iaqpt63ivhsr73u"},{"name":"zlib-ng","version":"2.2.1","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","compat":true,"new_strategies":true,"opt":true,"pic":true,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"jvdtkihgu4ykt4dwkunpk3ql7tcnl4wtxmhbd3vfl5o7hemoi4gq====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"7ztxp7zriik3rwsye5u7f3hrmykk6yj6"},{"name":"python","version":"3.11.9","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"generic","bz2":true,"ctypes":true,"dbm":true,"debug":false,"libxml2":true,"lzma":true,"nis":false,"optimizations":false,"patches":["13fa8bfa3e852cbf2e7b02a0313009df484bb39f55a50ada00e1a5599e956ac9","b0615b2fc96bb0cf7f180b107183b194b83b34c7614dcd6121e4a76bbf168155","ebdca648c9c1d25f586d7e2a495b62e6d91973b55264a13d89eda1beff72ef56","f2fd060afc4b4618fe8104c4c5d771f36dc55b1db5a4623785a4ea707ec72fb4"],"pic":true,"pyexpat":true,"pythoncmd":true,"readline":true,"shared":true,"sqlite3":true,"ssl":true,"tkinter":false,"uuid":true,"zlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["f2fd060afc4b4618fe8104c4c5d771f36dc55b1db5a4623785a4ea707ec72fb4","b0615b2fc96bb0cf7f180b107183b194b83b34c7614dcd6121e4a76bbf168155","13fa8bfa3e852cbf2e7b02a0313009df484bb39f55a50ada00e1a5599e956ac9","ebdca648c9c1d25f586d7e2a495b62e6d91973b55264a13d89eda1beff72ef56"],"package_hash":"t65rlqtklu5oqlcnkc62ld3dpxgvevfm2h5hfgp36ptz2uefx2sq====","dependencies":[{"name":"bzip2","hash":"uozy6txh4p3kq44rycstcadu7m5l36eh","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"expat","hash":"cjcphxa5agystc6egs7x2zfv6s7kt52p","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gdbm","hash":"mhn6tszi6hsltchugtzrcssvynz57csg","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gettext","hash":"ch2bcvngtps62qfxns4pzbleye7ic57c","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libffi","hash":"kkc7oupodtd67dlhjugfuzw3g7tvcuno","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"6dhzcjbmiru3plbe6iaqpt63ivhsr73u","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"7g3tlrp5kiroaak364nmsy2syb4zmvbs","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"pkgconf","hash":"xixt5k4vsilk3mfkwnjilvd7zn7poeup","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"readline","hash":"cdsre6iv6m4if3gx7k27ynraamwducqj","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"sqlite","hash":"qgog7nkb6ubobruuhcvyv5vbraferneg","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"util-linux-uuid","hash":"u3rkbgitzhddldu75y6od4qcjad7h2a3","parameters":{"deptypes":["build","link"],"virtuals":["uuid"]}},{"name":"xz","hash":"umkf2v3ieee4orna3pe3mx7rhwzcx7dv","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"7ztxp7zriik3rwsye5u7f3hrmykk6yj6","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"7lm43ao2uclf2zc74fyuiy43v4gtzk7a"},{"name":"expat","version":"2.6.2","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","libbsd":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zeyjv42sx5l6mjqie4smh2uxzfhsxvsnw7udjwg2sl5bcnc66req====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"cjcphxa5agystc6egs7x2zfv6s7kt52p"},{"name":"gettext","version":"0.22.5","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","bzip2":true,"curses":true,"git":true,"libunistring":false,"libxml2":true,"pic":true,"shared":true,"tar":true,"xz":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5bhbkykxueimk2h42d6gb7dumldhutohav3x2r23rsalexcgy42a====","dependencies":[{"name":"bzip2","hash":"uozy6txh4p3kq44rycstcadu7m5l36eh","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"w5p56ykqczhy7l6h435qvjheivk36qy4","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"libxml2","hash":"uu3uyudar6cz5tmenmmk376i54alwmwl","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"6dhzcjbmiru3plbe6iaqpt63ivhsr73u","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"tar","hash":"3on36tpbw5355v3czpeyn2vokzbttigm","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"umkf2v3ieee4orna3pe3mx7rhwzcx7dv","parameters":{"deptypes":["build","link","run"],"virtuals":[]}}],"hash":"ch2bcvngtps62qfxns4pzbleye7ic57c"},{"name":"libxml2","version":"2.10.3","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","pic":true,"python":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"squqo2aayigwxdusu3q3syojwit5gqdh6q4un576652hy4gytxcq====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"w5p56ykqczhy7l6h435qvjheivk36qy4","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pkgconf","hash":"xixt5k4vsilk3mfkwnjilvd7zn7poeup","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"xz","hash":"umkf2v3ieee4orna3pe3mx7rhwzcx7dv","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"7ztxp7zriik3rwsye5u7f3hrmykk6yj6","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"uu3uyudar6cz5tmenmmk376i54alwmwl"},{"name":"xz","version":"5.4.6","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"pic":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zt5vu2vph2v2qjwgdbe7btgcz7axpyalorcsqiuxhrg5grwgrrvq====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"umkf2v3ieee4orna3pe3mx7rhwzcx7dv"},{"name":"tar","version":"1.34","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","zip":"pigz","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"cpgzon3rxegbd3xdnmhrmxvzaq5hyvpzz4y6egmhghhydvefupuq====","dependencies":[{"name":"bzip2","hash":"uozy6txh4p3kq44rycstcadu7m5l36eh","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"w5p56ykqczhy7l6h435qvjheivk36qy4","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pigz","hash":"n6urcuk2bvv6q32udka2ldaf3ap345a4","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"umkf2v3ieee4orna3pe3mx7rhwzcx7dv","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"zstd","hash":"aejhse4tyvwvgywcz26ai4l4zxe4jvg2","parameters":{"deptypes":["run"],"virtuals":[]}}],"hash":"3on36tpbw5355v3czpeyn2vokzbttigm"},{"name":"pigz","version":"2.8","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"makefile","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"4w67lflje4giekjg4ie2vpyuiunjcumo6geofykvon3hodllp42q====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"7ztxp7zriik3rwsye5u7f3hrmykk6yj6","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"n6urcuk2bvv6q32udka2ldaf3ap345a4"},{"name":"zstd","version":"1.5.6","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"makefile","compression":["none"],"libs":["shared","static"],"programs":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"uvmrov4c6unft6o4yd3jk3uqvweua3uhwdli4sw7h5wvklaf5t3q====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"aejhse4tyvwvgywcz26ai4l4zxe4jvg2"},{"name":"libffi","version":"3.4.6","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"umhsnvoj5ooa3glffnkk2hp3txmrsjvqbpfq2hbk4mhcvhza7gaa====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"kkc7oupodtd67dlhjugfuzw3g7tvcuno"},{"name":"sqlite","version":"3.43.2","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","column_metadata":true,"dynamic_extensions":true,"fts":true,"functions":false,"rtree":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"lpes7bwf6khi6o2fswt6rex4o6jo5jipwzh4iq4hdfgnqp6wqxwq====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"cdsre6iv6m4if3gx7k27ynraamwducqj","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"7ztxp7zriik3rwsye5u7f3hrmykk6yj6","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"qgog7nkb6ubobruuhcvyv5vbraferneg"},{"name":"util-linux-uuid","version":"2.40.2","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"wnzs7tzbnlmwedntxawri35345ejg3cj2tj7jmpsvauet5hfi5yq====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"xixt5k4vsilk3mfkwnjilvd7zn7poeup","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"u3rkbgitzhddldu75y6od4qcjad7h2a3"},{"name":"python-venv","version":"1.0","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"bvjgntlwbvi343x5ctophqqvq6nbx2h4ggbxnjrvnjb3jneitahq====","dependencies":[{"name":"python","hash":"7lm43ao2uclf2zc74fyuiy43v4gtzk7a","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"hash":"elm263xl5rvuph7tksslsoxtr5ldsckf"},{"name":"re2c","version":"3.0","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"compiler":{"name":"clang","version":"18.1.5"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kuhq5ne7cdx2pca57zwnn57fezjovywffswkkryt4usm4zekw3yq====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"g6rvrl5tghnxmldvsrjpye46y7nfa2it"}]}} diff --git a/lib/spack/spack/bootstrap/prototypes/clingo-linux-aarch64.json b/lib/spack/spack/bootstrap/prototypes/clingo-linux-aarch64.json index ce0d63abc72fa3..d0692a81963011 100644 --- a/lib/spack/spack/bootstrap/prototypes/clingo-linux-aarch64.json +++ b/lib/spack/spack/bootstrap/prototypes/clingo-linux-aarch64.json @@ -1 +1 @@ -{"spec":{"_meta":{"version":4},"nodes":[{"name":"clingo-bootstrap","version":"spack","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"cmake","build_type":"Release","docs":false,"generator":"make","ipo":true,"optimized":false,"python":true,"static_libstdcpp":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"677q63cwqryynuiid4piwkdfx2y4sujizh35x5vv5pokofsidsoa====","dependencies":[{"name":"bison","hash":"hnyddubugwyhntjpc5cflgtyyxesplfc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"cmake","hash":"ofd6tvbbzgk2oga4qlrbfnisfiyhkibe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"python","hash":"mgeapxgv3p333s676cdztm2khprm74c2","parameters":{"deptypes":["build","link","run"],"virtuals":[]}},{"name":"python-venv","hash":"qup6txvaopzzxrih4wyskfbgsfrbw47g","parameters":{"deptypes":["build","run"],"virtuals":[]}},{"name":"re2c","hash":"ab6idsf3epl2usyp5beguihyxdya5y7y","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"ruwcurd3t7tlujwpawnxmize6uyzi52g"},{"name":"bison","version":"3.8.2","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","color":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"d4j62fwvuxqbiez32ltjnhu47ac425wjebsy6fhoptv6saxazcxq====","dependencies":[{"name":"diffutils","hash":"f7tfxfx22v2xl6egzdd5pi2xiqhvh4rp","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"m4","hash":"msmyb5twiltq3za5olk25etbbtmmxr2p","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"hash":"hnyddubugwyhntjpc5cflgtyyxesplfc"},{"name":"diffutils","version":"3.10","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kbmzdy7mgklc24qx55cvx7kq7hceby2yav4fnf64gfdo7epdghwa====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"2pbt2grycmnobdpzrx66rzvu22kz5kqp","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}}],"hash":"f7tfxfx22v2xl6egzdd5pi2xiqhvh4rp"},{"name":"gcc-runtime","version":"11.4.1","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"se7e7lu5ega7wrxwwnhpwjp2fsl4u277hopdz2lw7bwhatp22soq====","dependencies":[{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe"},{"name":"glibc","version":"2.34","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"external":{"path":"/usr","module":null,"extra_attributes":{}},"package_hash":"4z35ntbdhytzlhaviffrorrqxvspd6k6jf3pqj7gbday4c2hld5q====","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu"},{"name":"gmake","version":"4.4.1","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"generic","guile":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ghstvqlc3r7kgiikwx24xhcxdxcqdk5viinrzgm2mssqigfonika====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7"},{"name":"gnuconfig","version":"2022-09-17","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"2gikx4ks5wrf2cct3kt2ras4snqcrgwicovqmrn7sfac5g55qzdq====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p"},{"name":"libiconv","version":"1.17","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"hx2hgtfxuafavkaf2rp3hjq7ttx4zuoyareduhx25lb4a5b64sua====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"2pbt2grycmnobdpzrx66rzvu22kz5kqp"},{"name":"m4","version":"1.4.19","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["9dc5fbd0d5cb1037ab1e6d0ecc74a30df218d0a94bdd5a02759a97f62daca573","bfdffa7c2eb01021d5849b36972c069693654ad826c1a20b53534009a4ec7a89"],"sigsegv":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bfdffa7c2eb01021d5849b36972c069693654ad826c1a20b53534009a4ec7a89","9dc5fbd0d5cb1037ab1e6d0ecc74a30df218d0a94bdd5a02759a97f62daca573"],"package_hash":"npb7a53yz7wqx4nvnasxwgzxaoiks6sdjz2eugrgkjxs4ml24xea====","dependencies":[{"name":"diffutils","hash":"f7tfxfx22v2xl6egzdd5pi2xiqhvh4rp","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libsigsegv","hash":"bqrwa4grh7j4dbhmao2gwq5li7otidvp","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"msmyb5twiltq3za5olk25etbbtmmxr2p"},{"name":"libsigsegv","version":"2.14","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ypp3sciaprcyojozq2c5gqugtewmr5ytjbfpycyhu6wivtky7rja====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"bqrwa4grh7j4dbhmao2gwq5li7otidvp"},{"name":"cmake","version":"3.29.6","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"generic","build_type":"Release","doc":false,"ncurses":true,"ownlibs":true,"patches":["dbc3892939348c71f35973dd30e74c4a84bc7a2446c6930523c9723b88a597d1"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["dbc3892939348c71f35973dd30e74c4a84bc7a2446c6930523c9723b88a597d1"],"package_hash":"pbk2rknzfgc2vpxstkdbcoxv5xboiwe72owtgemfxhbuer6pcbbq====","dependencies":[{"name":"curl","hash":"nevz7fogpskla4ygnbaa5dmigdk7ivtm","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"xc5iptcuczyojtt6jjg7x7h5ryipu7wi","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"rtfnw3rbazozyqi7jmp6ffk6dg3krvdb","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"ofd6tvbbzgk2oga4qlrbfnisfiyhkibe"},{"name":"curl","version":"8.7.1","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","gssapi":false,"ldap":false,"libidn2":false,"librtmp":false,"libs":["shared","static"],"libssh":false,"libssh2":false,"nghttp2":true,"tls":["openssl"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kcgsfmigaqmusztsy67k2gfkizipob2uj5o5yub2i4onsxph454q====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"nghttp2","hash":"4pc2aydqr6xvckmsqpscnbpbvynb7akb","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"lrcxk5wcodfzti2eembel774vg2mqpdr","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"perl","hash":"3lfg2qhin325sous4tomgjbrjezdokfd","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"wkhpj3qzsi4h7fmjhfngnz3upqyain5p","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"zlib-ng","hash":"rtfnw3rbazozyqi7jmp6ffk6dg3krvdb","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"nevz7fogpskla4ygnbaa5dmigdk7ivtm"},{"name":"nghttp2","version":"1.62.0","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5b4v4lpftbuslseu6whtdgpswnmbjd7hjj564rxnkfgdnylfro7q====","dependencies":[{"name":"diffutils","hash":"f7tfxfx22v2xl6egzdd5pi2xiqhvh4rp","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"wkhpj3qzsi4h7fmjhfngnz3upqyain5p","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"4pc2aydqr6xvckmsqpscnbpbvynb7akb"},{"name":"pkgconf","version":"2.2.0","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"gl6tpyarjlclzsal6wa4dtc7cdzprq36nbibalai4a6wgzblrseq====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"wkhpj3qzsi4h7fmjhfngnz3upqyain5p"},{"name":"openssl","version":"3.3.1","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"generic","certs":"mozilla","docs":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"aqjwgxmqs2b7jublxelhue7n75puejodvhn2cbnpjjmq7xttex7a====","dependencies":[{"name":"ca-certificates-mozilla","hash":"ldkgus2vincr7rsth3icgpbud5dd3fvr","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"3lfg2qhin325sous4tomgjbrjezdokfd","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"rtfnw3rbazozyqi7jmp6ffk6dg3krvdb","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"lrcxk5wcodfzti2eembel774vg2mqpdr"},{"name":"ca-certificates-mozilla","version":"2023-05-30","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"63npvwqwo2x7i6emvnklh4mhcn45gx2qzveorybh5h2inwr55sea====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"hash":"ldkgus2vincr7rsth3icgpbud5dd3fvr"},{"name":"perl","version":"5.38.2","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"generic","cpanm":true,"opcode":true,"open":true,"patches":["714e4d1c7496e6b23834e7c88da3d69139418860fbc488fe82fd226b450a4be7"],"shared":true,"threads":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["714e4d1c7496e6b23834e7c88da3d69139418860fbc488fe82fd226b450a4be7"],"package_hash":"i5drmbzpsmo7jrmibmrmahee6y5rtiuo37vmdjda2kfgvfgy6ziq====","dependencies":[{"name":"berkeley-db","hash":"m4lrsz6xzcylkgacr64jour6kiyqk6mf","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"bzip2","hash":"nfcexfnktluw4pmijv4fy5tuv5mv3k4j","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"gdbm","hash":"ib2pxjrvkjirkmyostemesulmlapdmdz","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"rtfnw3rbazozyqi7jmp6ffk6dg3krvdb","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"3lfg2qhin325sous4tomgjbrjezdokfd"},{"name":"berkeley-db","version":"18.1.40","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","cxx":true,"docs":false,"patches":["26090f418891757af46ac3b89a9f43d6eb5989f7a3dce3d1cfc99fba547203b3","b231fcc4d5cff05e5c3a4814f6a5af0e9a966428dc2176540d2c05aff41de522"],"stl":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["b231fcc4d5cff05e5c3a4814f6a5af0e9a966428dc2176540d2c05aff41de522","26090f418891757af46ac3b89a9f43d6eb5989f7a3dce3d1cfc99fba547203b3"],"package_hash":"h57ydfn33zevvzctzzioiiwjwe362izbbwncb6a26dfeno4y7tda====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"m4lrsz6xzcylkgacr64jour6kiyqk6mf"},{"name":"bzip2","version":"1.0.8","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"generic","debug":false,"pic":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"wa33h4h2abj7tx5cndixz7bdwu5fspdaf2kjlqsinnearayw6fra====","dependencies":[{"name":"diffutils","hash":"f7tfxfx22v2xl6egzdd5pi2xiqhvh4rp","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"nfcexfnktluw4pmijv4fy5tuv5mv3k4j"},{"name":"gdbm","version":"1.23","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"liepxl6phlcxbgfmibxafhewtihlgaa4x3hko37ckqlafhxkrgdq====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"xumzexii6opul35g6g67ohj4boco35hp","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"ib2pxjrvkjirkmyostemesulmlapdmdz"},{"name":"readline","version":"8.2","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"package_hash":"oww6dmr7xqgg6j7iiluonxbcl4irqnnrip4vfkjdwujncwnuhwuq====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"ncurses","hash":"xc5iptcuczyojtt6jjg7x7h5ryipu7wi","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"xumzexii6opul35g6g67ohj4boco35hp"},{"name":"ncurses","version":"6.5","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"abi":"none","build_system":"autotools","patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"symlinks":false,"termlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"package_hash":"rlqzqxoau3wwzu62x6qxlf4flon6b4n3p4zesnc6t2oyybrvnkwq====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"wkhpj3qzsi4h7fmjhfngnz3upqyain5p","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"xc5iptcuczyojtt6jjg7x7h5ryipu7wi"},{"name":"zlib-ng","version":"2.2.1","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","compat":true,"new_strategies":true,"opt":true,"pic":true,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"jvdtkihgu4ykt4dwkunpk3ql7tcnl4wtxmhbd3vfl5o7hemoi4gq====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"rtfnw3rbazozyqi7jmp6ffk6dg3krvdb"},{"name":"python","version":"3.11.9","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"generic","bz2":true,"crypt":true,"ctypes":true,"dbm":true,"debug":false,"libxml2":true,"lzma":true,"nis":false,"optimizations":false,"patches":["13fa8bfa3e852cbf2e7b02a0313009df484bb39f55a50ada00e1a5599e956ac9","b0615b2fc96bb0cf7f180b107183b194b83b34c7614dcd6121e4a76bbf168155","ebdca648c9c1d25f586d7e2a495b62e6d91973b55264a13d89eda1beff72ef56","f2fd060afc4b4618fe8104c4c5d771f36dc55b1db5a4623785a4ea707ec72fb4"],"pic":true,"pyexpat":true,"pythoncmd":true,"readline":true,"shared":true,"sqlite3":true,"ssl":true,"tkinter":false,"uuid":true,"zlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["f2fd060afc4b4618fe8104c4c5d771f36dc55b1db5a4623785a4ea707ec72fb4","b0615b2fc96bb0cf7f180b107183b194b83b34c7614dcd6121e4a76bbf168155","13fa8bfa3e852cbf2e7b02a0313009df484bb39f55a50ada00e1a5599e956ac9","ebdca648c9c1d25f586d7e2a495b62e6d91973b55264a13d89eda1beff72ef56"],"package_hash":"t65rlqtklu5oqlcnkc62ld3dpxgvevfm2h5hfgp36ptz2uefx2sq====","dependencies":[{"name":"bzip2","hash":"nfcexfnktluw4pmijv4fy5tuv5mv3k4j","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"expat","hash":"jrsnxzjej3vxqehewuelz4nwvqgyrv2l","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"gdbm","hash":"ib2pxjrvkjirkmyostemesulmlapdmdz","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gettext","hash":"sityderlvnhfgmj6qmg23hgjkt2mvgn7","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libffi","hash":"6ztlwxyvhquaekh3ggnax4gxjcm7z5xs","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"libxcrypt","hash":"ff6j37dfruzkftuo2vpxxuvgsguuircg","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"xc5iptcuczyojtt6jjg7x7h5ryipu7wi","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"lrcxk5wcodfzti2eembel774vg2mqpdr","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"pkgconf","hash":"wkhpj3qzsi4h7fmjhfngnz3upqyain5p","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"readline","hash":"xumzexii6opul35g6g67ohj4boco35hp","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"sqlite","hash":"ssuidmgnu4g4rxns4yhsc2i35wm6w4nm","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"util-linux-uuid","hash":"u7tzv4v6hjmqwraas2fg4g4bggsg54hn","parameters":{"deptypes":["build","link"],"virtuals":["uuid"]}},{"name":"xz","hash":"etawlzc7h4tcznfr2fkinr3lreskf7xc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"rtfnw3rbazozyqi7jmp6ffk6dg3krvdb","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"mgeapxgv3p333s676cdztm2khprm74c2"},{"name":"expat","version":"2.6.2","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","libbsd":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zeyjv42sx5l6mjqie4smh2uxzfhsxvsnw7udjwg2sl5bcnc66req====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libbsd","hash":"2asjwudpsolmnvtvy2klrx4423zxfb46","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"jrsnxzjej3vxqehewuelz4nwvqgyrv2l"},{"name":"libbsd","version":"0.12.2","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"debyg3en7sgggswkdhcyd6lbp7arawzmyujthyyuaiad5jqd5msa====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libmd","hash":"5g3gadwxtaklyslka2absv2ey5nvu7qp","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"2asjwudpsolmnvtvy2klrx4423zxfb46"},{"name":"libmd","version":"1.0.4","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zs2e7fqr4dzthpj5fascqvfn7xcahf7dtc5bzdwfv6vqkzi7oncq====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"5g3gadwxtaklyslka2absv2ey5nvu7qp"},{"name":"gettext","version":"0.22.5","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","bzip2":true,"curses":true,"git":true,"libunistring":false,"libxml2":true,"pic":true,"shared":true,"tar":true,"xz":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5bhbkykxueimk2h42d6gb7dumldhutohav3x2r23rsalexcgy42a====","dependencies":[{"name":"bzip2","hash":"nfcexfnktluw4pmijv4fy5tuv5mv3k4j","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"2pbt2grycmnobdpzrx66rzvu22kz5kqp","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"libxml2","hash":"qok6mvtsef3v5oziizc5ypldokgfoufi","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"xc5iptcuczyojtt6jjg7x7h5ryipu7wi","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"tar","hash":"vwkyj52hs7kfnk6ui4gtaav55zxlotm3","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"etawlzc7h4tcznfr2fkinr3lreskf7xc","parameters":{"deptypes":["build","link","run"],"virtuals":[]}}],"hash":"sityderlvnhfgmj6qmg23hgjkt2mvgn7"},{"name":"libxml2","version":"2.10.3","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","pic":true,"python":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"squqo2aayigwxdusu3q3syojwit5gqdh6q4un576652hy4gytxcq====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"2pbt2grycmnobdpzrx66rzvu22kz5kqp","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pkgconf","hash":"wkhpj3qzsi4h7fmjhfngnz3upqyain5p","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"xz","hash":"etawlzc7h4tcznfr2fkinr3lreskf7xc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"rtfnw3rbazozyqi7jmp6ffk6dg3krvdb","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"qok6mvtsef3v5oziizc5ypldokgfoufi"},{"name":"xz","version":"5.4.6","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"pic":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zt5vu2vph2v2qjwgdbe7btgcz7axpyalorcsqiuxhrg5grwgrrvq====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"etawlzc7h4tcznfr2fkinr3lreskf7xc"},{"name":"tar","version":"1.34","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","zip":"pigz","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"cpgzon3rxegbd3xdnmhrmxvzaq5hyvpzz4y6egmhghhydvefupuq====","dependencies":[{"name":"bzip2","hash":"nfcexfnktluw4pmijv4fy5tuv5mv3k4j","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"2pbt2grycmnobdpzrx66rzvu22kz5kqp","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pigz","hash":"l5sst3uni4hkaetfv5ep2knougpbpsvz","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"etawlzc7h4tcznfr2fkinr3lreskf7xc","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"zstd","hash":"xbn4zwa6afke6acunbztswy72j5khy5v","parameters":{"deptypes":["run"],"virtuals":[]}}],"hash":"vwkyj52hs7kfnk6ui4gtaav55zxlotm3"},{"name":"pigz","version":"2.8","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"makefile","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"4w67lflje4giekjg4ie2vpyuiunjcumo6geofykvon3hodllp42q====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"rtfnw3rbazozyqi7jmp6ffk6dg3krvdb","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"l5sst3uni4hkaetfv5ep2knougpbpsvz"},{"name":"zstd","version":"1.5.6","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"makefile","compression":["none"],"libs":["shared","static"],"programs":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"uvmrov4c6unft6o4yd3jk3uqvweua3uhwdli4sw7h5wvklaf5t3q====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"xbn4zwa6afke6acunbztswy72j5khy5v"},{"name":"libffi","version":"3.4.6","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"umhsnvoj5ooa3glffnkk2hp3txmrsjvqbpfq2hbk4mhcvhza7gaa====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"6ztlwxyvhquaekh3ggnax4gxjcm7z5xs"},{"name":"libxcrypt","version":"4.4.35","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","obsolete_api":false,"patches":["4885da3afc027999d7cc3c231de7fc6f3c8b119847536e0fc106bc846c617b9b"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["4885da3afc027999d7cc3c231de7fc6f3c8b119847536e0fc106bc846c617b9b"],"package_hash":"dam6cqot2l4nfh6nk3jidk7u2pr2p534tw7446ejqwttqitr4zea====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"3lfg2qhin325sous4tomgjbrjezdokfd","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"ff6j37dfruzkftuo2vpxxuvgsguuircg"},{"name":"sqlite","version":"3.43.2","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","column_metadata":true,"dynamic_extensions":true,"fts":true,"functions":false,"rtree":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"3isun23rg3ucob7vs355eq7r5eyee4f2xperdje7xoxv5wayrqzq====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"xumzexii6opul35g6g67ohj4boco35hp","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"rtfnw3rbazozyqi7jmp6ffk6dg3krvdb","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"ssuidmgnu4g4rxns4yhsc2i35wm6w4nm"},{"name":"util-linux-uuid","version":"2.40.2","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"wnzs7tzbnlmwedntxawri35345ejg3cj2tj7jmpsvauet5hfi5yq====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"wkhpj3qzsi4h7fmjhfngnz3upqyain5p","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"u7tzv4v6hjmqwraas2fg4g4bggsg54hn"},{"name":"python-venv","version":"1.0","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"bvjgntlwbvi343x5ctophqqvq6nbx2h4ggbxnjrvnjb3jneitahq====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"python","hash":"mgeapxgv3p333s676cdztm2khprm74c2","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"hash":"qup6txvaopzzxrih4wyskfbgsfrbw47g"},{"name":"re2c","version":"3.0","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kuhq5ne7cdx2pca57zwnn57fezjovywffswkkryt4usm4zekw3yq====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"ab6idsf3epl2usyp5beguihyxdya5y7y"}]}} +{"spec":{"_meta":{"version":4},"nodes":[{"name":"clingo-bootstrap","version":"spack","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"cmake","build_type":"Release","docs":false,"generator":"make","ipo":true,"optimized":false,"python":true,"static_libstdcpp":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"677q63cwqryynuiid4piwkdfx2y4sujizh35x5vv5pokofsidsoa====","dependencies":[{"name":"bison","hash":"hnyddubugwyhntjpc5cflgtyyxesplfc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"cmake","hash":"ofd6tvbbzgk2oga4qlrbfnisfiyhkibe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"python","hash":"mgeapxgv3p333s676cdztm2khprm74c2","parameters":{"deptypes":["build","link","run"],"virtuals":[]}},{"name":"python-venv","hash":"qup6txvaopzzxrih4wyskfbgsfrbw47g","parameters":{"deptypes":["build","run"],"virtuals":[]}},{"name":"re2c","hash":"ab6idsf3epl2usyp5beguihyxdya5y7y","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"ruwcurd3t7tlujwpawnxmize6uyzi52g"},{"name":"bison","version":"3.8.2","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","color":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"d4j62fwvuxqbiez32ltjnhu47ac425wjebsy6fhoptv6saxazcxq====","dependencies":[{"name":"diffutils","hash":"f7tfxfx22v2xl6egzdd5pi2xiqhvh4rp","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"m4","hash":"msmyb5twiltq3za5olk25etbbtmmxr2p","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"hash":"hnyddubugwyhntjpc5cflgtyyxesplfc"},{"name":"diffutils","version":"3.10","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kbmzdy7mgklc24qx55cvx7kq7hceby2yav4fnf64gfdo7epdghwa====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"2pbt2grycmnobdpzrx66rzvu22kz5kqp","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}}],"hash":"f7tfxfx22v2xl6egzdd5pi2xiqhvh4rp"},{"name":"gcc-runtime","version":"11.4.1","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"se7e7lu5ega7wrxwwnhpwjp2fsl4u277hopdz2lw7bwhatp22soq====","dependencies":[{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe"},{"name":"glibc","version":"2.34","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"external":{"path":"/usr","module":null,"extra_attributes":{}},"package_hash":"4z35ntbdhytzlhaviffrorrqxvspd6k6jf3pqj7gbday4c2hld5q====","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu"},{"name":"gmake","version":"4.4.1","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"generic","guile":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ghstvqlc3r7kgiikwx24xhcxdxcqdk5viinrzgm2mssqigfonika====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7"},{"name":"gnuconfig","version":"2022-09-17","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"2gikx4ks5wrf2cct3kt2ras4snqcrgwicovqmrn7sfac5g55qzdq====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p"},{"name":"libiconv","version":"1.17","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"hx2hgtfxuafavkaf2rp3hjq7ttx4zuoyareduhx25lb4a5b64sua====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"2pbt2grycmnobdpzrx66rzvu22kz5kqp"},{"name":"m4","version":"1.4.19","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["9dc5fbd0d5cb1037ab1e6d0ecc74a30df218d0a94bdd5a02759a97f62daca573","bfdffa7c2eb01021d5849b36972c069693654ad826c1a20b53534009a4ec7a89"],"sigsegv":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bfdffa7c2eb01021d5849b36972c069693654ad826c1a20b53534009a4ec7a89","9dc5fbd0d5cb1037ab1e6d0ecc74a30df218d0a94bdd5a02759a97f62daca573"],"package_hash":"npb7a53yz7wqx4nvnasxwgzxaoiks6sdjz2eugrgkjxs4ml24xea====","dependencies":[{"name":"diffutils","hash":"f7tfxfx22v2xl6egzdd5pi2xiqhvh4rp","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libsigsegv","hash":"bqrwa4grh7j4dbhmao2gwq5li7otidvp","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"msmyb5twiltq3za5olk25etbbtmmxr2p"},{"name":"libsigsegv","version":"2.14","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ypp3sciaprcyojozq2c5gqugtewmr5ytjbfpycyhu6wivtky7rja====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"bqrwa4grh7j4dbhmao2gwq5li7otidvp"},{"name":"cmake","version":"3.29.6","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"generic","build_type":"Release","doc":false,"ncurses":true,"ownlibs":true,"patches":["dbc3892939348c71f35973dd30e74c4a84bc7a2446c6930523c9723b88a597d1"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["dbc3892939348c71f35973dd30e74c4a84bc7a2446c6930523c9723b88a597d1"],"package_hash":"pbk2rknzfgc2vpxstkdbcoxv5xboiwe72owtgemfxhbuer6pcbbq====","dependencies":[{"name":"curl","hash":"nevz7fogpskla4ygnbaa5dmigdk7ivtm","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"xc5iptcuczyojtt6jjg7x7h5ryipu7wi","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"rtfnw3rbazozyqi7jmp6ffk6dg3krvdb","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"ofd6tvbbzgk2oga4qlrbfnisfiyhkibe"},{"name":"curl","version":"8.7.1","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","gssapi":false,"ldap":false,"libidn2":false,"librtmp":false,"libs":["shared","static"],"libssh":false,"libssh2":false,"nghttp2":true,"tls":["openssl"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kcgsfmigaqmusztsy67k2gfkizipob2uj5o5yub2i4onsxph454q====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"nghttp2","hash":"4pc2aydqr6xvckmsqpscnbpbvynb7akb","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"lrcxk5wcodfzti2eembel774vg2mqpdr","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"perl","hash":"3lfg2qhin325sous4tomgjbrjezdokfd","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"wkhpj3qzsi4h7fmjhfngnz3upqyain5p","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"zlib-ng","hash":"rtfnw3rbazozyqi7jmp6ffk6dg3krvdb","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"nevz7fogpskla4ygnbaa5dmigdk7ivtm"},{"name":"nghttp2","version":"1.62.0","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5b4v4lpftbuslseu6whtdgpswnmbjd7hjj564rxnkfgdnylfro7q====","dependencies":[{"name":"diffutils","hash":"f7tfxfx22v2xl6egzdd5pi2xiqhvh4rp","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"wkhpj3qzsi4h7fmjhfngnz3upqyain5p","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"4pc2aydqr6xvckmsqpscnbpbvynb7akb"},{"name":"pkgconf","version":"2.2.0","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"gl6tpyarjlclzsal6wa4dtc7cdzprq36nbibalai4a6wgzblrseq====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"wkhpj3qzsi4h7fmjhfngnz3upqyain5p"},{"name":"openssl","version":"3.3.1","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"generic","certs":"mozilla","docs":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"aqjwgxmqs2b7jublxelhue7n75puejodvhn2cbnpjjmq7xttex7a====","dependencies":[{"name":"ca-certificates-mozilla","hash":"ldkgus2vincr7rsth3icgpbud5dd3fvr","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"3lfg2qhin325sous4tomgjbrjezdokfd","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"rtfnw3rbazozyqi7jmp6ffk6dg3krvdb","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"lrcxk5wcodfzti2eembel774vg2mqpdr"},{"name":"ca-certificates-mozilla","version":"2023-05-30","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"63npvwqwo2x7i6emvnklh4mhcn45gx2qzveorybh5h2inwr55sea====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"hash":"ldkgus2vincr7rsth3icgpbud5dd3fvr"},{"name":"perl","version":"5.38.2","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"generic","cpanm":true,"opcode":true,"open":true,"patches":["714e4d1c7496e6b23834e7c88da3d69139418860fbc488fe82fd226b450a4be7"],"shared":true,"threads":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["714e4d1c7496e6b23834e7c88da3d69139418860fbc488fe82fd226b450a4be7"],"package_hash":"i5drmbzpsmo7jrmibmrmahee6y5rtiuo37vmdjda2kfgvfgy6ziq====","dependencies":[{"name":"berkeley-db","hash":"m4lrsz6xzcylkgacr64jour6kiyqk6mf","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"bzip2","hash":"nfcexfnktluw4pmijv4fy5tuv5mv3k4j","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"gdbm","hash":"ib2pxjrvkjirkmyostemesulmlapdmdz","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"rtfnw3rbazozyqi7jmp6ffk6dg3krvdb","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"3lfg2qhin325sous4tomgjbrjezdokfd"},{"name":"berkeley-db","version":"18.1.40","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","cxx":true,"docs":false,"patches":["26090f418891757af46ac3b89a9f43d6eb5989f7a3dce3d1cfc99fba547203b3","b231fcc4d5cff05e5c3a4814f6a5af0e9a966428dc2176540d2c05aff41de522"],"stl":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["b231fcc4d5cff05e5c3a4814f6a5af0e9a966428dc2176540d2c05aff41de522","26090f418891757af46ac3b89a9f43d6eb5989f7a3dce3d1cfc99fba547203b3"],"package_hash":"h57ydfn33zevvzctzzioiiwjwe362izbbwncb6a26dfeno4y7tda====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"m4lrsz6xzcylkgacr64jour6kiyqk6mf"},{"name":"bzip2","version":"1.0.8","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"generic","debug":false,"pic":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"wa33h4h2abj7tx5cndixz7bdwu5fspdaf2kjlqsinnearayw6fra====","dependencies":[{"name":"diffutils","hash":"f7tfxfx22v2xl6egzdd5pi2xiqhvh4rp","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"nfcexfnktluw4pmijv4fy5tuv5mv3k4j"},{"name":"gdbm","version":"1.23","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"liepxl6phlcxbgfmibxafhewtihlgaa4x3hko37ckqlafhxkrgdq====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"xumzexii6opul35g6g67ohj4boco35hp","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"ib2pxjrvkjirkmyostemesulmlapdmdz"},{"name":"readline","version":"8.2","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"package_hash":"oww6dmr7xqgg6j7iiluonxbcl4irqnnrip4vfkjdwujncwnuhwuq====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"ncurses","hash":"xc5iptcuczyojtt6jjg7x7h5ryipu7wi","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"xumzexii6opul35g6g67ohj4boco35hp"},{"name":"ncurses","version":"6.5","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"abi":"none","build_system":"autotools","patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"symlinks":false,"termlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"package_hash":"rlqzqxoau3wwzu62x6qxlf4flon6b4n3p4zesnc6t2oyybrvnkwq====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"wkhpj3qzsi4h7fmjhfngnz3upqyain5p","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"xc5iptcuczyojtt6jjg7x7h5ryipu7wi"},{"name":"zlib-ng","version":"2.2.1","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","compat":true,"new_strategies":true,"opt":true,"pic":true,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"jvdtkihgu4ykt4dwkunpk3ql7tcnl4wtxmhbd3vfl5o7hemoi4gq====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"rtfnw3rbazozyqi7jmp6ffk6dg3krvdb"},{"name":"python","version":"3.11.9","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"generic","bz2":true,"crypt":true,"ctypes":true,"dbm":true,"debug":false,"libxml2":true,"lzma":true,"nis":false,"optimizations":false,"patches":["13fa8bfa3e852cbf2e7b02a0313009df484bb39f55a50ada00e1a5599e956ac9","b0615b2fc96bb0cf7f180b107183b194b83b34c7614dcd6121e4a76bbf168155","ebdca648c9c1d25f586d7e2a495b62e6d91973b55264a13d89eda1beff72ef56","f2fd060afc4b4618fe8104c4c5d771f36dc55b1db5a4623785a4ea707ec72fb4"],"pic":true,"pyexpat":true,"pythoncmd":true,"readline":true,"shared":true,"sqlite3":true,"ssl":true,"tkinter":false,"uuid":true,"zlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["f2fd060afc4b4618fe8104c4c5d771f36dc55b1db5a4623785a4ea707ec72fb4","b0615b2fc96bb0cf7f180b107183b194b83b34c7614dcd6121e4a76bbf168155","13fa8bfa3e852cbf2e7b02a0313009df484bb39f55a50ada00e1a5599e956ac9","ebdca648c9c1d25f586d7e2a495b62e6d91973b55264a13d89eda1beff72ef56"],"package_hash":"t65rlqtklu5oqlcnkc62ld3dpxgvevfm2h5hfgp36ptz2uefx2sq====","dependencies":[{"name":"bzip2","hash":"nfcexfnktluw4pmijv4fy5tuv5mv3k4j","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"expat","hash":"jrsnxzjej3vxqehewuelz4nwvqgyrv2l","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"gdbm","hash":"ib2pxjrvkjirkmyostemesulmlapdmdz","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gettext","hash":"sityderlvnhfgmj6qmg23hgjkt2mvgn7","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libffi","hash":"6ztlwxyvhquaekh3ggnax4gxjcm7z5xs","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"libxcrypt","hash":"ff6j37dfruzkftuo2vpxxuvgsguuircg","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"xc5iptcuczyojtt6jjg7x7h5ryipu7wi","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"lrcxk5wcodfzti2eembel774vg2mqpdr","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"pkgconf","hash":"wkhpj3qzsi4h7fmjhfngnz3upqyain5p","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"readline","hash":"xumzexii6opul35g6g67ohj4boco35hp","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"sqlite","hash":"ssuidmgnu4g4rxns4yhsc2i35wm6w4nm","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"util-linux-uuid","hash":"u7tzv4v6hjmqwraas2fg4g4bggsg54hn","parameters":{"deptypes":["build","link"],"virtuals":["uuid"]}},{"name":"xz","hash":"etawlzc7h4tcznfr2fkinr3lreskf7xc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"rtfnw3rbazozyqi7jmp6ffk6dg3krvdb","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"mgeapxgv3p333s676cdztm2khprm74c2"},{"name":"expat","version":"2.6.2","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","libbsd":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zeyjv42sx5l6mjqie4smh2uxzfhsxvsnw7udjwg2sl5bcnc66req====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libbsd","hash":"2asjwudpsolmnvtvy2klrx4423zxfb46","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"jrsnxzjej3vxqehewuelz4nwvqgyrv2l"},{"name":"libbsd","version":"0.12.2","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"debyg3en7sgggswkdhcyd6lbp7arawzmyujthyyuaiad5jqd5msa====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libmd","hash":"5g3gadwxtaklyslka2absv2ey5nvu7qp","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"2asjwudpsolmnvtvy2klrx4423zxfb46"},{"name":"libmd","version":"1.0.4","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zs2e7fqr4dzthpj5fascqvfn7xcahf7dtc5bzdwfv6vqkzi7oncq====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"5g3gadwxtaklyslka2absv2ey5nvu7qp"},{"name":"gettext","version":"0.22.5","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","bzip2":true,"curses":true,"git":true,"libunistring":false,"libxml2":true,"pic":true,"shared":true,"tar":true,"xz":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5bhbkykxueimk2h42d6gb7dumldhutohav3x2r23rsalexcgy42a====","dependencies":[{"name":"bzip2","hash":"nfcexfnktluw4pmijv4fy5tuv5mv3k4j","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"2pbt2grycmnobdpzrx66rzvu22kz5kqp","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"libxml2","hash":"qok6mvtsef3v5oziizc5ypldokgfoufi","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"xc5iptcuczyojtt6jjg7x7h5ryipu7wi","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"tar","hash":"vwkyj52hs7kfnk6ui4gtaav55zxlotm3","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"etawlzc7h4tcznfr2fkinr3lreskf7xc","parameters":{"deptypes":["build","link","run"],"virtuals":[]}}],"hash":"sityderlvnhfgmj6qmg23hgjkt2mvgn7"},{"name":"libxml2","version":"2.10.3","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","pic":true,"python":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"squqo2aayigwxdusu3q3syojwit5gqdh6q4un576652hy4gytxcq====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"2pbt2grycmnobdpzrx66rzvu22kz5kqp","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pkgconf","hash":"wkhpj3qzsi4h7fmjhfngnz3upqyain5p","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"xz","hash":"etawlzc7h4tcznfr2fkinr3lreskf7xc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"rtfnw3rbazozyqi7jmp6ffk6dg3krvdb","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"qok6mvtsef3v5oziizc5ypldokgfoufi"},{"name":"xz","version":"5.4.6","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"pic":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zt5vu2vph2v2qjwgdbe7btgcz7axpyalorcsqiuxhrg5grwgrrvq====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"etawlzc7h4tcznfr2fkinr3lreskf7xc"},{"name":"tar","version":"1.34","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","zip":"pigz","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"cpgzon3rxegbd3xdnmhrmxvzaq5hyvpzz4y6egmhghhydvefupuq====","dependencies":[{"name":"bzip2","hash":"nfcexfnktluw4pmijv4fy5tuv5mv3k4j","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"2pbt2grycmnobdpzrx66rzvu22kz5kqp","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pigz","hash":"l5sst3uni4hkaetfv5ep2knougpbpsvz","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"etawlzc7h4tcznfr2fkinr3lreskf7xc","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"zstd","hash":"xbn4zwa6afke6acunbztswy72j5khy5v","parameters":{"deptypes":["run"],"virtuals":[]}}],"hash":"vwkyj52hs7kfnk6ui4gtaav55zxlotm3"},{"name":"pigz","version":"2.8","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"makefile","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"4w67lflje4giekjg4ie2vpyuiunjcumo6geofykvon3hodllp42q====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"rtfnw3rbazozyqi7jmp6ffk6dg3krvdb","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"l5sst3uni4hkaetfv5ep2knougpbpsvz"},{"name":"zstd","version":"1.5.6","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"makefile","compression":["none"],"libs":["shared","static"],"programs":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"uvmrov4c6unft6o4yd3jk3uqvweua3uhwdli4sw7h5wvklaf5t3q====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"xbn4zwa6afke6acunbztswy72j5khy5v"},{"name":"libffi","version":"3.4.6","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"umhsnvoj5ooa3glffnkk2hp3txmrsjvqbpfq2hbk4mhcvhza7gaa====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"6ztlwxyvhquaekh3ggnax4gxjcm7z5xs"},{"name":"libxcrypt","version":"4.4.35","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","obsolete_api":false,"patches":["4885da3afc027999d7cc3c231de7fc6f3c8b119847536e0fc106bc846c617b9b"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["4885da3afc027999d7cc3c231de7fc6f3c8b119847536e0fc106bc846c617b9b"],"package_hash":"dam6cqot2l4nfh6nk3jidk7u2pr2p534tw7446ejqwttqitr4zea====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"3lfg2qhin325sous4tomgjbrjezdokfd","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"ff6j37dfruzkftuo2vpxxuvgsguuircg"},{"name":"sqlite","version":"3.43.2","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","column_metadata":true,"dynamic_extensions":true,"fts":true,"functions":false,"rtree":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"3isun23rg3ucob7vs355eq7r5eyee4f2xperdje7xoxv5wayrqzq====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"xumzexii6opul35g6g67ohj4boco35hp","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"rtfnw3rbazozyqi7jmp6ffk6dg3krvdb","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"ssuidmgnu4g4rxns4yhsc2i35wm6w4nm"},{"name":"util-linux-uuid","version":"2.40.2","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"wnzs7tzbnlmwedntxawri35345ejg3cj2tj7jmpsvauet5hfi5yq====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"thrso55rw6rilvdzm4tnqiy34yqvg25p","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"wkhpj3qzsi4h7fmjhfngnz3upqyain5p","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"u7tzv4v6hjmqwraas2fg4g4bggsg54hn"},{"name":"python-venv","version":"1.0","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"bvjgntlwbvi343x5ctophqqvq6nbx2h4ggbxnjrvnjb3jneitahq====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"python","hash":"mgeapxgv3p333s676cdztm2khprm74c2","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"hash":"qup6txvaopzzxrih4wyskfbgsfrbw47g"},{"name":"re2c","version":"3.0","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"compiler":{"name":"gcc","version":"11.4.1"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kuhq5ne7cdx2pca57zwnn57fezjovywffswkkryt4usm4zekw3yq====","dependencies":[{"name":"gcc-runtime","hash":"ztmwas7bacybmqzed5crdvdvrtgr7cwe","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"apvfuyfvngdhqsi5i5omavjav4n6hybu","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"2dj2qwyj5k52za5grdc2ap44jkyppct7","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"ab6idsf3epl2usyp5beguihyxdya5y7y"}]}} diff --git a/lib/spack/spack/bootstrap/prototypes/clingo-linux-ppc64le.json b/lib/spack/spack/bootstrap/prototypes/clingo-linux-ppc64le.json index 3a2ed4c635817e..9e170a92bb3566 100644 --- a/lib/spack/spack/bootstrap/prototypes/clingo-linux-ppc64le.json +++ b/lib/spack/spack/bootstrap/prototypes/clingo-linux-ppc64le.json @@ -1 +1 @@ -{"spec":{"_meta":{"version":4},"nodes":[{"name":"clingo-bootstrap","version":"spack","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"cmake","build_type":"Release","docs":false,"generator":"make","ipo":true,"optimized":false,"python":true,"static_libstdcpp":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"677q63cwqryynuiid4piwkdfx2y4sujizh35x5vv5pokofsidsoa====","dependencies":[{"name":"bison","hash":"zlf5po3jq7ewnyqvmijdqvezidjkewwc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"cmake","hash":"fhs7nnfo4fpelnw47cnlq2ta3gonoybi","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"python","hash":"kaunhs7qjatcib7dxtdumk6ti5rtkwhi","parameters":{"deptypes":["build","link","run"],"virtuals":[]}},{"name":"python-venv","hash":"rscwjgp3i7lrkw425i554hugfqtbpmcz","parameters":{"deptypes":["build","run"],"virtuals":[]}},{"name":"re2c","hash":"g36e7tmo7u3lrs5n3kn26xtdzsgnsjmf","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"e5azl4x62b2ttfez7tgh2amsaufw5kxf"},{"name":"bison","version":"3.8.2","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","color":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"d4j62fwvuxqbiez32ltjnhu47ac425wjebsy6fhoptv6saxazcxq====","dependencies":[{"name":"diffutils","hash":"b7h3d4u5334hxyhyrpm3lo4goxwrksyc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"m4","hash":"k5nvhktsfld5k75nydtshmgqxt6vnd7z","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"hash":"zlf5po3jq7ewnyqvmijdqvezidjkewwc"},{"name":"diffutils","version":"3.10","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kbmzdy7mgklc24qx55cvx7kq7hceby2yav4fnf64gfdo7epdghwa====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"psjili5a534fgwzmso7e525glphp4cig","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}}],"hash":"b7h3d4u5334hxyhyrpm3lo4goxwrksyc"},{"name":"gcc-runtime","version":"8.5.0","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"se7e7lu5ega7wrxwwnhpwjp2fsl4u277hopdz2lw7bwhatp22soq====","dependencies":[{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw"},{"name":"glibc","version":"2.28","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"external":{"path":"/usr","module":null,"extra_attributes":{}},"package_hash":"riktbfk2yybad7tgbvdkntk5c5msjcm5pk3x7naszgbvfm57h4rq====","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh"},{"name":"gmake","version":"4.4.1","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","guile":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ghstvqlc3r7kgiikwx24xhcxdxcqdk5viinrzgm2mssqigfonika====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"hash":"vlaspdtbomyzueuolydbhrmouikifc35"},{"name":"gnuconfig","version":"2022-09-17","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"2gikx4ks5wrf2cct3kt2ras4snqcrgwicovqmrn7sfac5g55qzdq====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb"},{"name":"libiconv","version":"1.17","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"hx2hgtfxuafavkaf2rp3hjq7ttx4zuoyareduhx25lb4a5b64sua====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"psjili5a534fgwzmso7e525glphp4cig"},{"name":"m4","version":"1.4.19","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["9dc5fbd0d5cb1037ab1e6d0ecc74a30df218d0a94bdd5a02759a97f62daca573","bfdffa7c2eb01021d5849b36972c069693654ad826c1a20b53534009a4ec7a89"],"sigsegv":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bfdffa7c2eb01021d5849b36972c069693654ad826c1a20b53534009a4ec7a89","9dc5fbd0d5cb1037ab1e6d0ecc74a30df218d0a94bdd5a02759a97f62daca573"],"package_hash":"npb7a53yz7wqx4nvnasxwgzxaoiks6sdjz2eugrgkjxs4ml24xea====","dependencies":[{"name":"diffutils","hash":"b7h3d4u5334hxyhyrpm3lo4goxwrksyc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libsigsegv","hash":"wcibv54gmuzs7r7ixxzou7unrzn7pa3w","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"k5nvhktsfld5k75nydtshmgqxt6vnd7z"},{"name":"libsigsegv","version":"2.14","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ypp3sciaprcyojozq2c5gqugtewmr5ytjbfpycyhu6wivtky7rja====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"wcibv54gmuzs7r7ixxzou7unrzn7pa3w"},{"name":"cmake","version":"3.29.6","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","build_type":"Release","doc":false,"ncurses":true,"ownlibs":true,"patches":["dbc3892939348c71f35973dd30e74c4a84bc7a2446c6930523c9723b88a597d1"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["dbc3892939348c71f35973dd30e74c4a84bc7a2446c6930523c9723b88a597d1"],"package_hash":"pbk2rknzfgc2vpxstkdbcoxv5xboiwe72owtgemfxhbuer6pcbbq====","dependencies":[{"name":"curl","hash":"vtskoiw5dhhv3kwxv27lc4cdxkdcxvwb","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"t3htmu6hhog5z2ysti2a7gzrcr7psjoc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"5dxeptlo7lvlexgkmufa4ayy6v7eaiix","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"fhs7nnfo4fpelnw47cnlq2ta3gonoybi"},{"name":"curl","version":"8.7.1","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","gssapi":false,"ldap":false,"libidn2":false,"librtmp":false,"libs":["shared","static"],"libssh":false,"libssh2":false,"nghttp2":true,"tls":["openssl"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kcgsfmigaqmusztsy67k2gfkizipob2uj5o5yub2i4onsxph454q====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"nghttp2","hash":"35pubyn2mdls6gppiymahqxlmjib5bzc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"otlr7jk6mle7jbxemw2jgouv6whcmbro","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"perl","hash":"jj4e2lsaidvevufbtp2gsgzh7yt7yqn2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"c6nn3cov3ksz6hgqu4cjq3272anhkvke","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"zlib-ng","hash":"5dxeptlo7lvlexgkmufa4ayy6v7eaiix","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"vtskoiw5dhhv3kwxv27lc4cdxkdcxvwb"},{"name":"nghttp2","version":"1.62.0","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5b4v4lpftbuslseu6whtdgpswnmbjd7hjj564rxnkfgdnylfro7q====","dependencies":[{"name":"diffutils","hash":"b7h3d4u5334hxyhyrpm3lo4goxwrksyc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"c6nn3cov3ksz6hgqu4cjq3272anhkvke","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"35pubyn2mdls6gppiymahqxlmjib5bzc"},{"name":"pkgconf","version":"2.2.0","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"gl6tpyarjlclzsal6wa4dtc7cdzprq36nbibalai4a6wgzblrseq====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"c6nn3cov3ksz6hgqu4cjq3272anhkvke"},{"name":"openssl","version":"3.3.1","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","certs":"mozilla","docs":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"aqjwgxmqs2b7jublxelhue7n75puejodvhn2cbnpjjmq7xttex7a====","dependencies":[{"name":"ca-certificates-mozilla","hash":"k6us4tbfauthyaqlndg2335pdgy4lu2i","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"jj4e2lsaidvevufbtp2gsgzh7yt7yqn2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"5dxeptlo7lvlexgkmufa4ayy6v7eaiix","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"otlr7jk6mle7jbxemw2jgouv6whcmbro"},{"name":"ca-certificates-mozilla","version":"2023-05-30","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"63npvwqwo2x7i6emvnklh4mhcn45gx2qzveorybh5h2inwr55sea====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"hash":"k6us4tbfauthyaqlndg2335pdgy4lu2i"},{"name":"perl","version":"5.38.2","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","cpanm":true,"opcode":true,"open":true,"patches":["714e4d1c7496e6b23834e7c88da3d69139418860fbc488fe82fd226b450a4be7"],"shared":true,"threads":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["714e4d1c7496e6b23834e7c88da3d69139418860fbc488fe82fd226b450a4be7"],"package_hash":"i5drmbzpsmo7jrmibmrmahee6y5rtiuo37vmdjda2kfgvfgy6ziq====","dependencies":[{"name":"berkeley-db","hash":"h3eno322vommoajsv332gkscxlcublqi","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"bzip2","hash":"7zi73iaio2aqbdf5kxkbq6so3ggc5nvo","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"gdbm","hash":"nuzlj7idsicuuwlbhl2mtbgzx37ioumc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"5dxeptlo7lvlexgkmufa4ayy6v7eaiix","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"jj4e2lsaidvevufbtp2gsgzh7yt7yqn2"},{"name":"berkeley-db","version":"18.1.40","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cxx":true,"docs":false,"patches":["26090f418891757af46ac3b89a9f43d6eb5989f7a3dce3d1cfc99fba547203b3","b231fcc4d5cff05e5c3a4814f6a5af0e9a966428dc2176540d2c05aff41de522"],"stl":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["b231fcc4d5cff05e5c3a4814f6a5af0e9a966428dc2176540d2c05aff41de522","26090f418891757af46ac3b89a9f43d6eb5989f7a3dce3d1cfc99fba547203b3"],"package_hash":"h57ydfn33zevvzctzzioiiwjwe362izbbwncb6a26dfeno4y7tda====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"h3eno322vommoajsv332gkscxlcublqi"},{"name":"bzip2","version":"1.0.8","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","debug":false,"pic":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"wa33h4h2abj7tx5cndixz7bdwu5fspdaf2kjlqsinnearayw6fra====","dependencies":[{"name":"diffutils","hash":"b7h3d4u5334hxyhyrpm3lo4goxwrksyc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"7zi73iaio2aqbdf5kxkbq6so3ggc5nvo"},{"name":"gdbm","version":"1.23","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"liepxl6phlcxbgfmibxafhewtihlgaa4x3hko37ckqlafhxkrgdq====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"fqda7pllzy6k5eexjkyk2vawuxjvboxv","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"nuzlj7idsicuuwlbhl2mtbgzx37ioumc"},{"name":"readline","version":"8.2","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"package_hash":"oww6dmr7xqgg6j7iiluonxbcl4irqnnrip4vfkjdwujncwnuhwuq====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"ncurses","hash":"t3htmu6hhog5z2ysti2a7gzrcr7psjoc","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"fqda7pllzy6k5eexjkyk2vawuxjvboxv"},{"name":"ncurses","version":"6.5","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"abi":"none","build_system":"autotools","patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"symlinks":false,"termlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"package_hash":"rlqzqxoau3wwzu62x6qxlf4flon6b4n3p4zesnc6t2oyybrvnkwq====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"c6nn3cov3ksz6hgqu4cjq3272anhkvke","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"t3htmu6hhog5z2ysti2a7gzrcr7psjoc"},{"name":"zlib-ng","version":"2.2.1","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","compat":true,"new_strategies":true,"opt":true,"pic":true,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"jvdtkihgu4ykt4dwkunpk3ql7tcnl4wtxmhbd3vfl5o7hemoi4gq====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"5dxeptlo7lvlexgkmufa4ayy6v7eaiix"},{"name":"python","version":"3.11.9","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","bz2":true,"crypt":true,"ctypes":true,"dbm":true,"debug":false,"libxml2":true,"lzma":true,"nis":false,"optimizations":false,"patches":["13fa8bfa3e852cbf2e7b02a0313009df484bb39f55a50ada00e1a5599e956ac9","b0615b2fc96bb0cf7f180b107183b194b83b34c7614dcd6121e4a76bbf168155","ebdca648c9c1d25f586d7e2a495b62e6d91973b55264a13d89eda1beff72ef56","f2fd060afc4b4618fe8104c4c5d771f36dc55b1db5a4623785a4ea707ec72fb4"],"pic":true,"pyexpat":true,"pythoncmd":true,"readline":true,"shared":true,"sqlite3":true,"ssl":true,"tkinter":false,"uuid":true,"zlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["f2fd060afc4b4618fe8104c4c5d771f36dc55b1db5a4623785a4ea707ec72fb4","b0615b2fc96bb0cf7f180b107183b194b83b34c7614dcd6121e4a76bbf168155","13fa8bfa3e852cbf2e7b02a0313009df484bb39f55a50ada00e1a5599e956ac9","ebdca648c9c1d25f586d7e2a495b62e6d91973b55264a13d89eda1beff72ef56"],"package_hash":"t65rlqtklu5oqlcnkc62ld3dpxgvevfm2h5hfgp36ptz2uefx2sq====","dependencies":[{"name":"bzip2","hash":"7zi73iaio2aqbdf5kxkbq6so3ggc5nvo","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"expat","hash":"nm6tjs4hxbxgbxgrgwk5m6p3cv5f2xp6","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"gdbm","hash":"nuzlj7idsicuuwlbhl2mtbgzx37ioumc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gettext","hash":"lwsm4syj2fwaqauv765cbio3xmtecfh6","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libffi","hash":"7dro2wwskvjqmoknz4qqefn6dcypxvo3","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"libxcrypt","hash":"plkpy2gwretmhc2pncx4jxr3snyvrtl2","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"t3htmu6hhog5z2ysti2a7gzrcr7psjoc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"otlr7jk6mle7jbxemw2jgouv6whcmbro","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"pkgconf","hash":"c6nn3cov3ksz6hgqu4cjq3272anhkvke","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"readline","hash":"fqda7pllzy6k5eexjkyk2vawuxjvboxv","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"sqlite","hash":"bgz5kp2p7vv4t3efvnn5ebsu3zvsa7xu","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"util-linux-uuid","hash":"4zecuq35tj72zffmsonlxkrefs6nlind","parameters":{"deptypes":["build","link"],"virtuals":["uuid"]}},{"name":"xz","hash":"wip3erpa25ivm7n6ovmcmz32dq7kcghj","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"5dxeptlo7lvlexgkmufa4ayy6v7eaiix","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"kaunhs7qjatcib7dxtdumk6ti5rtkwhi"},{"name":"expat","version":"2.6.2","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","libbsd":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zeyjv42sx5l6mjqie4smh2uxzfhsxvsnw7udjwg2sl5bcnc66req====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libbsd","hash":"kdvtk2gxo5qzxdqyotv3tja77tmq4vut","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"nm6tjs4hxbxgbxgrgwk5m6p3cv5f2xp6"},{"name":"libbsd","version":"0.12.2","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"debyg3en7sgggswkdhcyd6lbp7arawzmyujthyyuaiad5jqd5msa====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libmd","hash":"y5jvp4qgm7obwftbvdkwpgc3jrabrwap","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"kdvtk2gxo5qzxdqyotv3tja77tmq4vut"},{"name":"libmd","version":"1.0.4","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zs2e7fqr4dzthpj5fascqvfn7xcahf7dtc5bzdwfv6vqkzi7oncq====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"y5jvp4qgm7obwftbvdkwpgc3jrabrwap"},{"name":"gettext","version":"0.22.5","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","bzip2":true,"curses":true,"git":true,"libunistring":false,"libxml2":true,"pic":true,"shared":true,"tar":true,"xz":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5bhbkykxueimk2h42d6gb7dumldhutohav3x2r23rsalexcgy42a====","dependencies":[{"name":"bzip2","hash":"7zi73iaio2aqbdf5kxkbq6so3ggc5nvo","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"psjili5a534fgwzmso7e525glphp4cig","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"libxml2","hash":"xubldvubx7oe3oux3uaogjydl2ejnw6t","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"t3htmu6hhog5z2ysti2a7gzrcr7psjoc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"tar","hash":"7c7264uajtdc3onu5rxa5yf5uxtdzkox","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"wip3erpa25ivm7n6ovmcmz32dq7kcghj","parameters":{"deptypes":["build","link","run"],"virtuals":[]}}],"hash":"lwsm4syj2fwaqauv765cbio3xmtecfh6"},{"name":"libxml2","version":"2.10.3","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","pic":true,"python":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"squqo2aayigwxdusu3q3syojwit5gqdh6q4un576652hy4gytxcq====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"psjili5a534fgwzmso7e525glphp4cig","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pkgconf","hash":"c6nn3cov3ksz6hgqu4cjq3272anhkvke","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"xz","hash":"wip3erpa25ivm7n6ovmcmz32dq7kcghj","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"5dxeptlo7lvlexgkmufa4ayy6v7eaiix","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"xubldvubx7oe3oux3uaogjydl2ejnw6t"},{"name":"xz","version":"5.4.6","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"pic":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zt5vu2vph2v2qjwgdbe7btgcz7axpyalorcsqiuxhrg5grwgrrvq====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"wip3erpa25ivm7n6ovmcmz32dq7kcghj"},{"name":"tar","version":"1.34","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","zip":"pigz","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"cpgzon3rxegbd3xdnmhrmxvzaq5hyvpzz4y6egmhghhydvefupuq====","dependencies":[{"name":"bzip2","hash":"7zi73iaio2aqbdf5kxkbq6so3ggc5nvo","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"psjili5a534fgwzmso7e525glphp4cig","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pigz","hash":"ouuobfwhka4oby6ajleqfj74jewljbn3","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"wip3erpa25ivm7n6ovmcmz32dq7kcghj","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"zstd","hash":"iozznbkczpkeh2l73kzyq4s3rq2vfd6p","parameters":{"deptypes":["run"],"virtuals":[]}}],"hash":"7c7264uajtdc3onu5rxa5yf5uxtdzkox"},{"name":"pigz","version":"2.8","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"makefile","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"4w67lflje4giekjg4ie2vpyuiunjcumo6geofykvon3hodllp42q====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"5dxeptlo7lvlexgkmufa4ayy6v7eaiix","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"ouuobfwhka4oby6ajleqfj74jewljbn3"},{"name":"zstd","version":"1.5.6","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"makefile","compression":["none"],"libs":["shared","static"],"programs":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"uvmrov4c6unft6o4yd3jk3uqvweua3uhwdli4sw7h5wvklaf5t3q====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"iozznbkczpkeh2l73kzyq4s3rq2vfd6p"},{"name":"libffi","version":"3.4.6","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"umhsnvoj5ooa3glffnkk2hp3txmrsjvqbpfq2hbk4mhcvhza7gaa====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"7dro2wwskvjqmoknz4qqefn6dcypxvo3"},{"name":"libxcrypt","version":"4.4.35","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","obsolete_api":false,"patches":["4885da3afc027999d7cc3c231de7fc6f3c8b119847536e0fc106bc846c617b9b"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["4885da3afc027999d7cc3c231de7fc6f3c8b119847536e0fc106bc846c617b9b"],"package_hash":"dam6cqot2l4nfh6nk3jidk7u2pr2p534tw7446ejqwttqitr4zea====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"jj4e2lsaidvevufbtp2gsgzh7yt7yqn2","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"plkpy2gwretmhc2pncx4jxr3snyvrtl2"},{"name":"sqlite","version":"3.43.2","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","column_metadata":true,"dynamic_extensions":true,"fts":true,"functions":false,"rtree":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"3isun23rg3ucob7vs355eq7r5eyee4f2xperdje7xoxv5wayrqzq====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"fqda7pllzy6k5eexjkyk2vawuxjvboxv","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"5dxeptlo7lvlexgkmufa4ayy6v7eaiix","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"bgz5kp2p7vv4t3efvnn5ebsu3zvsa7xu"},{"name":"util-linux-uuid","version":"2.40.2","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"wnzs7tzbnlmwedntxawri35345ejg3cj2tj7jmpsvauet5hfi5yq====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"c6nn3cov3ksz6hgqu4cjq3272anhkvke","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"4zecuq35tj72zffmsonlxkrefs6nlind"},{"name":"python-venv","version":"1.0","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"bvjgntlwbvi343x5ctophqqvq6nbx2h4ggbxnjrvnjb3jneitahq====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"python","hash":"kaunhs7qjatcib7dxtdumk6ti5rtkwhi","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"hash":"rscwjgp3i7lrkw425i554hugfqtbpmcz"},{"name":"re2c","version":"3.0","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kuhq5ne7cdx2pca57zwnn57fezjovywffswkkryt4usm4zekw3yq====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"g36e7tmo7u3lrs5n3kn26xtdzsgnsjmf"}]}} +{"spec":{"_meta":{"version":4},"nodes":[{"name":"clingo-bootstrap","version":"spack","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"cmake","build_type":"Release","docs":false,"generator":"make","ipo":true,"optimized":false,"python":true,"static_libstdcpp":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"677q63cwqryynuiid4piwkdfx2y4sujizh35x5vv5pokofsidsoa====","dependencies":[{"name":"bison","hash":"zlf5po3jq7ewnyqvmijdqvezidjkewwc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"cmake","hash":"fhs7nnfo4fpelnw47cnlq2ta3gonoybi","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"python","hash":"kaunhs7qjatcib7dxtdumk6ti5rtkwhi","parameters":{"deptypes":["build","link","run"],"virtuals":[]}},{"name":"python-venv","hash":"rscwjgp3i7lrkw425i554hugfqtbpmcz","parameters":{"deptypes":["build","run"],"virtuals":[]}},{"name":"re2c","hash":"g36e7tmo7u3lrs5n3kn26xtdzsgnsjmf","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"e5azl4x62b2ttfez7tgh2amsaufw5kxf"},{"name":"bison","version":"3.8.2","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","color":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"d4j62fwvuxqbiez32ltjnhu47ac425wjebsy6fhoptv6saxazcxq====","dependencies":[{"name":"diffutils","hash":"b7h3d4u5334hxyhyrpm3lo4goxwrksyc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"m4","hash":"k5nvhktsfld5k75nydtshmgqxt6vnd7z","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"hash":"zlf5po3jq7ewnyqvmijdqvezidjkewwc"},{"name":"diffutils","version":"3.10","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kbmzdy7mgklc24qx55cvx7kq7hceby2yav4fnf64gfdo7epdghwa====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"psjili5a534fgwzmso7e525glphp4cig","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}}],"hash":"b7h3d4u5334hxyhyrpm3lo4goxwrksyc"},{"name":"gcc-runtime","version":"8.5.0","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"se7e7lu5ega7wrxwwnhpwjp2fsl4u277hopdz2lw7bwhatp22soq====","dependencies":[{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw"},{"name":"glibc","version":"2.28","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"external":{"path":"/usr","module":null,"extra_attributes":{}},"package_hash":"riktbfk2yybad7tgbvdkntk5c5msjcm5pk3x7naszgbvfm57h4rq====","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh"},{"name":"gmake","version":"4.4.1","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","guile":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ghstvqlc3r7kgiikwx24xhcxdxcqdk5viinrzgm2mssqigfonika====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"hash":"vlaspdtbomyzueuolydbhrmouikifc35"},{"name":"gnuconfig","version":"2022-09-17","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"2gikx4ks5wrf2cct3kt2ras4snqcrgwicovqmrn7sfac5g55qzdq====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb"},{"name":"libiconv","version":"1.17","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"hx2hgtfxuafavkaf2rp3hjq7ttx4zuoyareduhx25lb4a5b64sua====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"psjili5a534fgwzmso7e525glphp4cig"},{"name":"m4","version":"1.4.19","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["9dc5fbd0d5cb1037ab1e6d0ecc74a30df218d0a94bdd5a02759a97f62daca573","bfdffa7c2eb01021d5849b36972c069693654ad826c1a20b53534009a4ec7a89"],"sigsegv":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bfdffa7c2eb01021d5849b36972c069693654ad826c1a20b53534009a4ec7a89","9dc5fbd0d5cb1037ab1e6d0ecc74a30df218d0a94bdd5a02759a97f62daca573"],"package_hash":"npb7a53yz7wqx4nvnasxwgzxaoiks6sdjz2eugrgkjxs4ml24xea====","dependencies":[{"name":"diffutils","hash":"b7h3d4u5334hxyhyrpm3lo4goxwrksyc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libsigsegv","hash":"wcibv54gmuzs7r7ixxzou7unrzn7pa3w","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"k5nvhktsfld5k75nydtshmgqxt6vnd7z"},{"name":"libsigsegv","version":"2.14","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ypp3sciaprcyojozq2c5gqugtewmr5ytjbfpycyhu6wivtky7rja====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"wcibv54gmuzs7r7ixxzou7unrzn7pa3w"},{"name":"cmake","version":"3.29.6","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","build_type":"Release","doc":false,"ncurses":true,"ownlibs":true,"patches":["dbc3892939348c71f35973dd30e74c4a84bc7a2446c6930523c9723b88a597d1"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["dbc3892939348c71f35973dd30e74c4a84bc7a2446c6930523c9723b88a597d1"],"package_hash":"pbk2rknzfgc2vpxstkdbcoxv5xboiwe72owtgemfxhbuer6pcbbq====","dependencies":[{"name":"curl","hash":"vtskoiw5dhhv3kwxv27lc4cdxkdcxvwb","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"t3htmu6hhog5z2ysti2a7gzrcr7psjoc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"5dxeptlo7lvlexgkmufa4ayy6v7eaiix","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"fhs7nnfo4fpelnw47cnlq2ta3gonoybi"},{"name":"curl","version":"8.7.1","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","gssapi":false,"ldap":false,"libidn2":false,"librtmp":false,"libs":["shared","static"],"libssh":false,"libssh2":false,"nghttp2":true,"tls":["openssl"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kcgsfmigaqmusztsy67k2gfkizipob2uj5o5yub2i4onsxph454q====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"nghttp2","hash":"35pubyn2mdls6gppiymahqxlmjib5bzc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"otlr7jk6mle7jbxemw2jgouv6whcmbro","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"perl","hash":"jj4e2lsaidvevufbtp2gsgzh7yt7yqn2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"c6nn3cov3ksz6hgqu4cjq3272anhkvke","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"zlib-ng","hash":"5dxeptlo7lvlexgkmufa4ayy6v7eaiix","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"vtskoiw5dhhv3kwxv27lc4cdxkdcxvwb"},{"name":"nghttp2","version":"1.62.0","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5b4v4lpftbuslseu6whtdgpswnmbjd7hjj564rxnkfgdnylfro7q====","dependencies":[{"name":"diffutils","hash":"b7h3d4u5334hxyhyrpm3lo4goxwrksyc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"c6nn3cov3ksz6hgqu4cjq3272anhkvke","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"35pubyn2mdls6gppiymahqxlmjib5bzc"},{"name":"pkgconf","version":"2.2.0","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"gl6tpyarjlclzsal6wa4dtc7cdzprq36nbibalai4a6wgzblrseq====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"c6nn3cov3ksz6hgqu4cjq3272anhkvke"},{"name":"openssl","version":"3.3.1","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","certs":"mozilla","docs":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"aqjwgxmqs2b7jublxelhue7n75puejodvhn2cbnpjjmq7xttex7a====","dependencies":[{"name":"ca-certificates-mozilla","hash":"k6us4tbfauthyaqlndg2335pdgy4lu2i","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"jj4e2lsaidvevufbtp2gsgzh7yt7yqn2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"5dxeptlo7lvlexgkmufa4ayy6v7eaiix","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"otlr7jk6mle7jbxemw2jgouv6whcmbro"},{"name":"ca-certificates-mozilla","version":"2023-05-30","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"63npvwqwo2x7i6emvnklh4mhcn45gx2qzveorybh5h2inwr55sea====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"hash":"k6us4tbfauthyaqlndg2335pdgy4lu2i"},{"name":"perl","version":"5.38.2","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","cpanm":true,"opcode":true,"open":true,"patches":["714e4d1c7496e6b23834e7c88da3d69139418860fbc488fe82fd226b450a4be7"],"shared":true,"threads":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["714e4d1c7496e6b23834e7c88da3d69139418860fbc488fe82fd226b450a4be7"],"package_hash":"i5drmbzpsmo7jrmibmrmahee6y5rtiuo37vmdjda2kfgvfgy6ziq====","dependencies":[{"name":"berkeley-db","hash":"h3eno322vommoajsv332gkscxlcublqi","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"bzip2","hash":"7zi73iaio2aqbdf5kxkbq6so3ggc5nvo","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"gdbm","hash":"nuzlj7idsicuuwlbhl2mtbgzx37ioumc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"5dxeptlo7lvlexgkmufa4ayy6v7eaiix","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"jj4e2lsaidvevufbtp2gsgzh7yt7yqn2"},{"name":"berkeley-db","version":"18.1.40","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cxx":true,"docs":false,"patches":["26090f418891757af46ac3b89a9f43d6eb5989f7a3dce3d1cfc99fba547203b3","b231fcc4d5cff05e5c3a4814f6a5af0e9a966428dc2176540d2c05aff41de522"],"stl":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["b231fcc4d5cff05e5c3a4814f6a5af0e9a966428dc2176540d2c05aff41de522","26090f418891757af46ac3b89a9f43d6eb5989f7a3dce3d1cfc99fba547203b3"],"package_hash":"h57ydfn33zevvzctzzioiiwjwe362izbbwncb6a26dfeno4y7tda====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"h3eno322vommoajsv332gkscxlcublqi"},{"name":"bzip2","version":"1.0.8","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","debug":false,"pic":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"wa33h4h2abj7tx5cndixz7bdwu5fspdaf2kjlqsinnearayw6fra====","dependencies":[{"name":"diffutils","hash":"b7h3d4u5334hxyhyrpm3lo4goxwrksyc","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"7zi73iaio2aqbdf5kxkbq6so3ggc5nvo"},{"name":"gdbm","version":"1.23","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"liepxl6phlcxbgfmibxafhewtihlgaa4x3hko37ckqlafhxkrgdq====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"fqda7pllzy6k5eexjkyk2vawuxjvboxv","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"nuzlj7idsicuuwlbhl2mtbgzx37ioumc"},{"name":"readline","version":"8.2","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"package_hash":"oww6dmr7xqgg6j7iiluonxbcl4irqnnrip4vfkjdwujncwnuhwuq====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"ncurses","hash":"t3htmu6hhog5z2ysti2a7gzrcr7psjoc","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"fqda7pllzy6k5eexjkyk2vawuxjvboxv"},{"name":"ncurses","version":"6.5","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"abi":"none","build_system":"autotools","patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"symlinks":false,"termlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"package_hash":"rlqzqxoau3wwzu62x6qxlf4flon6b4n3p4zesnc6t2oyybrvnkwq====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"c6nn3cov3ksz6hgqu4cjq3272anhkvke","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"t3htmu6hhog5z2ysti2a7gzrcr7psjoc"},{"name":"zlib-ng","version":"2.2.1","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","compat":true,"new_strategies":true,"opt":true,"pic":true,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"jvdtkihgu4ykt4dwkunpk3ql7tcnl4wtxmhbd3vfl5o7hemoi4gq====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"5dxeptlo7lvlexgkmufa4ayy6v7eaiix"},{"name":"python","version":"3.11.9","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","bz2":true,"crypt":true,"ctypes":true,"dbm":true,"debug":false,"libxml2":true,"lzma":true,"nis":false,"optimizations":false,"patches":["13fa8bfa3e852cbf2e7b02a0313009df484bb39f55a50ada00e1a5599e956ac9","b0615b2fc96bb0cf7f180b107183b194b83b34c7614dcd6121e4a76bbf168155","ebdca648c9c1d25f586d7e2a495b62e6d91973b55264a13d89eda1beff72ef56","f2fd060afc4b4618fe8104c4c5d771f36dc55b1db5a4623785a4ea707ec72fb4"],"pic":true,"pyexpat":true,"pythoncmd":true,"readline":true,"shared":true,"sqlite3":true,"ssl":true,"tkinter":false,"uuid":true,"zlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["f2fd060afc4b4618fe8104c4c5d771f36dc55b1db5a4623785a4ea707ec72fb4","b0615b2fc96bb0cf7f180b107183b194b83b34c7614dcd6121e4a76bbf168155","13fa8bfa3e852cbf2e7b02a0313009df484bb39f55a50ada00e1a5599e956ac9","ebdca648c9c1d25f586d7e2a495b62e6d91973b55264a13d89eda1beff72ef56"],"package_hash":"t65rlqtklu5oqlcnkc62ld3dpxgvevfm2h5hfgp36ptz2uefx2sq====","dependencies":[{"name":"bzip2","hash":"7zi73iaio2aqbdf5kxkbq6so3ggc5nvo","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"expat","hash":"nm6tjs4hxbxgbxgrgwk5m6p3cv5f2xp6","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"gdbm","hash":"nuzlj7idsicuuwlbhl2mtbgzx37ioumc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gettext","hash":"lwsm4syj2fwaqauv765cbio3xmtecfh6","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libffi","hash":"7dro2wwskvjqmoknz4qqefn6dcypxvo3","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"libxcrypt","hash":"plkpy2gwretmhc2pncx4jxr3snyvrtl2","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"t3htmu6hhog5z2ysti2a7gzrcr7psjoc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"otlr7jk6mle7jbxemw2jgouv6whcmbro","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"pkgconf","hash":"c6nn3cov3ksz6hgqu4cjq3272anhkvke","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"readline","hash":"fqda7pllzy6k5eexjkyk2vawuxjvboxv","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"sqlite","hash":"bgz5kp2p7vv4t3efvnn5ebsu3zvsa7xu","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"util-linux-uuid","hash":"4zecuq35tj72zffmsonlxkrefs6nlind","parameters":{"deptypes":["build","link"],"virtuals":["uuid"]}},{"name":"xz","hash":"wip3erpa25ivm7n6ovmcmz32dq7kcghj","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"5dxeptlo7lvlexgkmufa4ayy6v7eaiix","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"kaunhs7qjatcib7dxtdumk6ti5rtkwhi"},{"name":"expat","version":"2.6.2","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","libbsd":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zeyjv42sx5l6mjqie4smh2uxzfhsxvsnw7udjwg2sl5bcnc66req====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libbsd","hash":"kdvtk2gxo5qzxdqyotv3tja77tmq4vut","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"nm6tjs4hxbxgbxgrgwk5m6p3cv5f2xp6"},{"name":"libbsd","version":"0.12.2","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"debyg3en7sgggswkdhcyd6lbp7arawzmyujthyyuaiad5jqd5msa====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libmd","hash":"y5jvp4qgm7obwftbvdkwpgc3jrabrwap","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"kdvtk2gxo5qzxdqyotv3tja77tmq4vut"},{"name":"libmd","version":"1.0.4","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zs2e7fqr4dzthpj5fascqvfn7xcahf7dtc5bzdwfv6vqkzi7oncq====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"y5jvp4qgm7obwftbvdkwpgc3jrabrwap"},{"name":"gettext","version":"0.22.5","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","bzip2":true,"curses":true,"git":true,"libunistring":false,"libxml2":true,"pic":true,"shared":true,"tar":true,"xz":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5bhbkykxueimk2h42d6gb7dumldhutohav3x2r23rsalexcgy42a====","dependencies":[{"name":"bzip2","hash":"7zi73iaio2aqbdf5kxkbq6so3ggc5nvo","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"psjili5a534fgwzmso7e525glphp4cig","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"libxml2","hash":"xubldvubx7oe3oux3uaogjydl2ejnw6t","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"t3htmu6hhog5z2ysti2a7gzrcr7psjoc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"tar","hash":"7c7264uajtdc3onu5rxa5yf5uxtdzkox","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"wip3erpa25ivm7n6ovmcmz32dq7kcghj","parameters":{"deptypes":["build","link","run"],"virtuals":[]}}],"hash":"lwsm4syj2fwaqauv765cbio3xmtecfh6"},{"name":"libxml2","version":"2.10.3","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","pic":true,"python":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"squqo2aayigwxdusu3q3syojwit5gqdh6q4un576652hy4gytxcq====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"psjili5a534fgwzmso7e525glphp4cig","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pkgconf","hash":"c6nn3cov3ksz6hgqu4cjq3272anhkvke","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"xz","hash":"wip3erpa25ivm7n6ovmcmz32dq7kcghj","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"5dxeptlo7lvlexgkmufa4ayy6v7eaiix","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"xubldvubx7oe3oux3uaogjydl2ejnw6t"},{"name":"xz","version":"5.4.6","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"pic":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zt5vu2vph2v2qjwgdbe7btgcz7axpyalorcsqiuxhrg5grwgrrvq====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"wip3erpa25ivm7n6ovmcmz32dq7kcghj"},{"name":"tar","version":"1.34","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","zip":"pigz","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"cpgzon3rxegbd3xdnmhrmxvzaq5hyvpzz4y6egmhghhydvefupuq====","dependencies":[{"name":"bzip2","hash":"7zi73iaio2aqbdf5kxkbq6so3ggc5nvo","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"psjili5a534fgwzmso7e525glphp4cig","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pigz","hash":"ouuobfwhka4oby6ajleqfj74jewljbn3","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"wip3erpa25ivm7n6ovmcmz32dq7kcghj","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"zstd","hash":"iozznbkczpkeh2l73kzyq4s3rq2vfd6p","parameters":{"deptypes":["run"],"virtuals":[]}}],"hash":"7c7264uajtdc3onu5rxa5yf5uxtdzkox"},{"name":"pigz","version":"2.8","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"makefile","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"4w67lflje4giekjg4ie2vpyuiunjcumo6geofykvon3hodllp42q====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"5dxeptlo7lvlexgkmufa4ayy6v7eaiix","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"ouuobfwhka4oby6ajleqfj74jewljbn3"},{"name":"zstd","version":"1.5.6","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"makefile","compression":["none"],"libs":["shared","static"],"programs":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"uvmrov4c6unft6o4yd3jk3uqvweua3uhwdli4sw7h5wvklaf5t3q====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"iozznbkczpkeh2l73kzyq4s3rq2vfd6p"},{"name":"libffi","version":"3.4.6","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"umhsnvoj5ooa3glffnkk2hp3txmrsjvqbpfq2hbk4mhcvhza7gaa====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"7dro2wwskvjqmoknz4qqefn6dcypxvo3"},{"name":"libxcrypt","version":"4.4.35","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","obsolete_api":false,"patches":["4885da3afc027999d7cc3c231de7fc6f3c8b119847536e0fc106bc846c617b9b"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["4885da3afc027999d7cc3c231de7fc6f3c8b119847536e0fc106bc846c617b9b"],"package_hash":"dam6cqot2l4nfh6nk3jidk7u2pr2p534tw7446ejqwttqitr4zea====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"jj4e2lsaidvevufbtp2gsgzh7yt7yqn2","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"plkpy2gwretmhc2pncx4jxr3snyvrtl2"},{"name":"sqlite","version":"3.43.2","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","column_metadata":true,"dynamic_extensions":true,"fts":true,"functions":false,"rtree":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"3isun23rg3ucob7vs355eq7r5eyee4f2xperdje7xoxv5wayrqzq====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"fqda7pllzy6k5eexjkyk2vawuxjvboxv","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"5dxeptlo7lvlexgkmufa4ayy6v7eaiix","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"bgz5kp2p7vv4t3efvnn5ebsu3zvsa7xu"},{"name":"util-linux-uuid","version":"2.40.2","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"wnzs7tzbnlmwedntxawri35345ejg3cj2tj7jmpsvauet5hfi5yq====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"4ubm556zacirs3jeepcg6jukvp4qw7lb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"c6nn3cov3ksz6hgqu4cjq3272anhkvke","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"4zecuq35tj72zffmsonlxkrefs6nlind"},{"name":"python-venv","version":"1.0","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"bvjgntlwbvi343x5ctophqqvq6nbx2h4ggbxnjrvnjb3jneitahq====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"python","hash":"kaunhs7qjatcib7dxtdumk6ti5rtkwhi","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"hash":"rscwjgp3i7lrkw425i554hugfqtbpmcz"},{"name":"re2c","version":"3.0","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kuhq5ne7cdx2pca57zwnn57fezjovywffswkkryt4usm4zekw3yq====","dependencies":[{"name":"gcc-runtime","hash":"wdaw23psnntxjme66ftiuc6k2oti2rsw","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"73pbegdbzx3jsjyz2b4jcb3cofiebkbh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vlaspdtbomyzueuolydbhrmouikifc35","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"g36e7tmo7u3lrs5n3kn26xtdzsgnsjmf"}]}} diff --git a/lib/spack/spack/bootstrap/prototypes/clingo-linux-x86_64.json b/lib/spack/spack/bootstrap/prototypes/clingo-linux-x86_64.json index 704ee73689aaff..a1c94c3b93b0b2 100644 --- a/lib/spack/spack/bootstrap/prototypes/clingo-linux-x86_64.json +++ b/lib/spack/spack/bootstrap/prototypes/clingo-linux-x86_64.json @@ -1 +1 @@ -{"spec":{"_meta":{"version":4},"nodes":[{"name":"clingo-bootstrap","version":"spack","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"cmake","build_type":"Release","docs":false,"generator":"make","ipo":true,"optimized":false,"python":true,"static_libstdcpp":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"677q63cwqryynuiid4piwkdfx2y4sujizh35x5vv5pokofsidsoa====","dependencies":[{"name":"bison","hash":"ddgl3onrbfkboqpjskzdaiwpomvppwgt","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"cmake","hash":"l2qxvjavbdyl4gh6it743qrknlgpaeu6","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"python","hash":"ipb4su3jaocbbxxn7ronvotabz4dkbgp","parameters":{"deptypes":["build","link","run"],"virtuals":[]}},{"name":"python-venv","hash":"wt5iofmuq447aul5r6ydidmhv2rtepfg","parameters":{"deptypes":["build","run"],"virtuals":[]}},{"name":"re2c","hash":"ncrrgeaeg65l63s4n2ele3gssfbelqei","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"nf64noutpg25ptisllb435k3u3qgwgim"},{"name":"bison","version":"3.8.2","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","color":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"d4j62fwvuxqbiez32ltjnhu47ac425wjebsy6fhoptv6saxazcxq====","dependencies":[{"name":"diffutils","hash":"7r6i2y3dxeqpflb54mpqnn5otoq2ivbe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"m4","hash":"hckrrjzj7upowvamvgbqux6s4hxfirbc","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"hash":"ddgl3onrbfkboqpjskzdaiwpomvppwgt"},{"name":"diffutils","version":"3.10","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kbmzdy7mgklc24qx55cvx7kq7hceby2yav4fnf64gfdo7epdghwa====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"cvbsirp3vg7iuzzhddpebygekjj445ek","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}}],"hash":"7r6i2y3dxeqpflb54mpqnn5otoq2ivbe"},{"name":"gcc-runtime","version":"8.5.0","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"se7e7lu5ega7wrxwwnhpwjp2fsl4u277hopdz2lw7bwhatp22soq====","dependencies":[{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv"},{"name":"glibc","version":"2.28","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"external":{"path":"/usr","module":null,"extra_attributes":{}},"package_hash":"riktbfk2yybad7tgbvdkntk5c5msjcm5pk3x7naszgbvfm57h4rq====","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn"},{"name":"gmake","version":"4.4.1","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","guile":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ghstvqlc3r7kgiikwx24xhcxdxcqdk5viinrzgm2mssqigfonika====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2"},{"name":"libiconv","version":"1.17","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"hx2hgtfxuafavkaf2rp3hjq7ttx4zuoyareduhx25lb4a5b64sua====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"cvbsirp3vg7iuzzhddpebygekjj445ek"},{"name":"m4","version":"1.4.19","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["9dc5fbd0d5cb1037ab1e6d0ecc74a30df218d0a94bdd5a02759a97f62daca573","bfdffa7c2eb01021d5849b36972c069693654ad826c1a20b53534009a4ec7a89"],"sigsegv":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bfdffa7c2eb01021d5849b36972c069693654ad826c1a20b53534009a4ec7a89","9dc5fbd0d5cb1037ab1e6d0ecc74a30df218d0a94bdd5a02759a97f62daca573"],"package_hash":"npb7a53yz7wqx4nvnasxwgzxaoiks6sdjz2eugrgkjxs4ml24xea====","dependencies":[{"name":"diffutils","hash":"7r6i2y3dxeqpflb54mpqnn5otoq2ivbe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libsigsegv","hash":"a7utmadxdq5pwbyzzsqufc5z4c5dzil3","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"hckrrjzj7upowvamvgbqux6s4hxfirbc"},{"name":"libsigsegv","version":"2.14","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ypp3sciaprcyojozq2c5gqugtewmr5ytjbfpycyhu6wivtky7rja====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"a7utmadxdq5pwbyzzsqufc5z4c5dzil3"},{"name":"cmake","version":"3.29.6","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","build_type":"Release","doc":false,"ncurses":true,"ownlibs":true,"patches":["dbc3892939348c71f35973dd30e74c4a84bc7a2446c6930523c9723b88a597d1"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["dbc3892939348c71f35973dd30e74c4a84bc7a2446c6930523c9723b88a597d1"],"package_hash":"pbk2rknzfgc2vpxstkdbcoxv5xboiwe72owtgemfxhbuer6pcbbq====","dependencies":[{"name":"curl","hash":"tx4uqyb24um2fbkztpv45vte25ddwirm","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"qdrdnglnycx5usajs354nmxy763r5jd6","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"4rjyysplubcoslfbmi23u2voobghr4jy","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"l2qxvjavbdyl4gh6it743qrknlgpaeu6"},{"name":"curl","version":"8.7.1","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","gssapi":false,"ldap":false,"libidn2":false,"librtmp":false,"libs":["shared","static"],"libssh":false,"libssh2":false,"nghttp2":true,"tls":["openssl"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kcgsfmigaqmusztsy67k2gfkizipob2uj5o5yub2i4onsxph454q====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"nghttp2","hash":"izrdxl4retiy57ugtdmppsol5xlhiapb","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"3ox4v5cseir7gcx7s6ygygoktdej4bfr","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"perl","hash":"ewzhcgygpqpqoayw2fgcgart76wet4jn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"bsrcmcbzidzseycq7emkkxo3t4ywt2tx","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"zlib-ng","hash":"4rjyysplubcoslfbmi23u2voobghr4jy","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"tx4uqyb24um2fbkztpv45vte25ddwirm"},{"name":"nghttp2","version":"1.62.0","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5b4v4lpftbuslseu6whtdgpswnmbjd7hjj564rxnkfgdnylfro7q====","dependencies":[{"name":"diffutils","hash":"7r6i2y3dxeqpflb54mpqnn5otoq2ivbe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"bsrcmcbzidzseycq7emkkxo3t4ywt2tx","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"izrdxl4retiy57ugtdmppsol5xlhiapb"},{"name":"pkgconf","version":"2.2.0","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"gl6tpyarjlclzsal6wa4dtc7cdzprq36nbibalai4a6wgzblrseq====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"bsrcmcbzidzseycq7emkkxo3t4ywt2tx"},{"name":"openssl","version":"3.3.1","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","certs":"mozilla","docs":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"aqjwgxmqs2b7jublxelhue7n75puejodvhn2cbnpjjmq7xttex7a====","dependencies":[{"name":"ca-certificates-mozilla","hash":"4diyktn6tmoj6iurlz7gieu3ub5q5trh","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"ewzhcgygpqpqoayw2fgcgart76wet4jn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"4rjyysplubcoslfbmi23u2voobghr4jy","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"3ox4v5cseir7gcx7s6ygygoktdej4bfr"},{"name":"ca-certificates-mozilla","version":"2023-05-30","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"63npvwqwo2x7i6emvnklh4mhcn45gx2qzveorybh5h2inwr55sea====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"hash":"4diyktn6tmoj6iurlz7gieu3ub5q5trh"},{"name":"perl","version":"5.38.2","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","cpanm":true,"opcode":true,"open":true,"patches":["714e4d1c7496e6b23834e7c88da3d69139418860fbc488fe82fd226b450a4be7"],"shared":true,"threads":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["714e4d1c7496e6b23834e7c88da3d69139418860fbc488fe82fd226b450a4be7"],"package_hash":"i5drmbzpsmo7jrmibmrmahee6y5rtiuo37vmdjda2kfgvfgy6ziq====","dependencies":[{"name":"berkeley-db","hash":"2zsffebnfhcjdsjgn6x7ydsrwf7yfxjq","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"bzip2","hash":"ypik55ez75ipc2357brsnfr6ns4zibrk","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"gdbm","hash":"tduhe6zd7urqpt7i7rej5vzoaxa4ze3t","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"4rjyysplubcoslfbmi23u2voobghr4jy","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"ewzhcgygpqpqoayw2fgcgart76wet4jn"},{"name":"berkeley-db","version":"18.1.40","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cxx":true,"docs":false,"patches":["26090f418891757af46ac3b89a9f43d6eb5989f7a3dce3d1cfc99fba547203b3","b231fcc4d5cff05e5c3a4814f6a5af0e9a966428dc2176540d2c05aff41de522"],"stl":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["b231fcc4d5cff05e5c3a4814f6a5af0e9a966428dc2176540d2c05aff41de522","26090f418891757af46ac3b89a9f43d6eb5989f7a3dce3d1cfc99fba547203b3"],"package_hash":"h57ydfn33zevvzctzzioiiwjwe362izbbwncb6a26dfeno4y7tda====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"2zsffebnfhcjdsjgn6x7ydsrwf7yfxjq"},{"name":"bzip2","version":"1.0.8","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","debug":false,"pic":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"wa33h4h2abj7tx5cndixz7bdwu5fspdaf2kjlqsinnearayw6fra====","dependencies":[{"name":"diffutils","hash":"7r6i2y3dxeqpflb54mpqnn5otoq2ivbe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"ypik55ez75ipc2357brsnfr6ns4zibrk"},{"name":"gdbm","version":"1.23","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"liepxl6phlcxbgfmibxafhewtihlgaa4x3hko37ckqlafhxkrgdq====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"knome32natgdwoyv6rlbqb6w5um5jzqa","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"tduhe6zd7urqpt7i7rej5vzoaxa4ze3t"},{"name":"readline","version":"8.2","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"package_hash":"oww6dmr7xqgg6j7iiluonxbcl4irqnnrip4vfkjdwujncwnuhwuq====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"ncurses","hash":"qdrdnglnycx5usajs354nmxy763r5jd6","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"knome32natgdwoyv6rlbqb6w5um5jzqa"},{"name":"ncurses","version":"6.5","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"abi":"none","build_system":"autotools","patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"symlinks":false,"termlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"package_hash":"rlqzqxoau3wwzu62x6qxlf4flon6b4n3p4zesnc6t2oyybrvnkwq====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"bsrcmcbzidzseycq7emkkxo3t4ywt2tx","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"qdrdnglnycx5usajs354nmxy763r5jd6"},{"name":"zlib-ng","version":"2.2.1","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","compat":true,"new_strategies":true,"opt":true,"pic":true,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"jvdtkihgu4ykt4dwkunpk3ql7tcnl4wtxmhbd3vfl5o7hemoi4gq====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"4rjyysplubcoslfbmi23u2voobghr4jy"},{"name":"python","version":"3.11.9","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","bz2":true,"crypt":true,"ctypes":true,"dbm":true,"debug":false,"libxml2":true,"lzma":true,"nis":false,"optimizations":false,"patches":["13fa8bfa3e852cbf2e7b02a0313009df484bb39f55a50ada00e1a5599e956ac9","b0615b2fc96bb0cf7f180b107183b194b83b34c7614dcd6121e4a76bbf168155","ebdca648c9c1d25f586d7e2a495b62e6d91973b55264a13d89eda1beff72ef56","f2fd060afc4b4618fe8104c4c5d771f36dc55b1db5a4623785a4ea707ec72fb4"],"pic":true,"pyexpat":true,"pythoncmd":true,"readline":true,"shared":true,"sqlite3":true,"ssl":true,"tkinter":false,"uuid":true,"zlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["f2fd060afc4b4618fe8104c4c5d771f36dc55b1db5a4623785a4ea707ec72fb4","b0615b2fc96bb0cf7f180b107183b194b83b34c7614dcd6121e4a76bbf168155","13fa8bfa3e852cbf2e7b02a0313009df484bb39f55a50ada00e1a5599e956ac9","ebdca648c9c1d25f586d7e2a495b62e6d91973b55264a13d89eda1beff72ef56"],"package_hash":"t65rlqtklu5oqlcnkc62ld3dpxgvevfm2h5hfgp36ptz2uefx2sq====","dependencies":[{"name":"bzip2","hash":"ypik55ez75ipc2357brsnfr6ns4zibrk","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"expat","hash":"hzopg2h3vpjkpb4gqcygzvvfb4wjquu3","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"gdbm","hash":"tduhe6zd7urqpt7i7rej5vzoaxa4ze3t","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gettext","hash":"yvb5vlha6yr2lwfkzkqz6mtzzz7wdiyv","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libffi","hash":"wmoq7qgzlbf7ebxnji4nro6gn7g25dt5","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"libxcrypt","hash":"2yxrh2umuxhtymwd2gxlkgogwxjy2epx","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"qdrdnglnycx5usajs354nmxy763r5jd6","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"3ox4v5cseir7gcx7s6ygygoktdej4bfr","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"pkgconf","hash":"bsrcmcbzidzseycq7emkkxo3t4ywt2tx","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"readline","hash":"knome32natgdwoyv6rlbqb6w5um5jzqa","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"sqlite","hash":"kcdye5hn4jwz3a7u4ck4konz7747bn4w","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"util-linux-uuid","hash":"ws5pwa6qz45lahc75zo27ovgldtlmnpm","parameters":{"deptypes":["build","link"],"virtuals":["uuid"]}},{"name":"xz","hash":"gwc3azaaupc5dbpodqiab2dssvmk5no6","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"4rjyysplubcoslfbmi23u2voobghr4jy","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"ipb4su3jaocbbxxn7ronvotabz4dkbgp"},{"name":"expat","version":"2.6.2","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","libbsd":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zeyjv42sx5l6mjqie4smh2uxzfhsxvsnw7udjwg2sl5bcnc66req====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libbsd","hash":"ut2bfnjpiaw35lvt6efz5y62fjpah6ow","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"hzopg2h3vpjkpb4gqcygzvvfb4wjquu3"},{"name":"libbsd","version":"0.12.2","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"debyg3en7sgggswkdhcyd6lbp7arawzmyujthyyuaiad5jqd5msa====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libmd","hash":"4yumgzpllawj3dfsg6ezog4lvblkc2cl","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"ut2bfnjpiaw35lvt6efz5y62fjpah6ow"},{"name":"libmd","version":"1.0.4","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zs2e7fqr4dzthpj5fascqvfn7xcahf7dtc5bzdwfv6vqkzi7oncq====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"4yumgzpllawj3dfsg6ezog4lvblkc2cl"},{"name":"gettext","version":"0.22.5","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","bzip2":true,"curses":true,"git":true,"libunistring":false,"libxml2":true,"pic":true,"shared":true,"tar":true,"xz":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5bhbkykxueimk2h42d6gb7dumldhutohav3x2r23rsalexcgy42a====","dependencies":[{"name":"bzip2","hash":"ypik55ez75ipc2357brsnfr6ns4zibrk","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"cvbsirp3vg7iuzzhddpebygekjj445ek","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"libxml2","hash":"dvhrxtvvpg2m4jyoex7qtn26zjrxmikg","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"qdrdnglnycx5usajs354nmxy763r5jd6","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"tar","hash":"eygw75slf4egmw4pwyshieddjurkp2ph","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"gwc3azaaupc5dbpodqiab2dssvmk5no6","parameters":{"deptypes":["build","link","run"],"virtuals":[]}}],"hash":"yvb5vlha6yr2lwfkzkqz6mtzzz7wdiyv"},{"name":"libxml2","version":"2.10.3","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","pic":true,"python":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"squqo2aayigwxdusu3q3syojwit5gqdh6q4un576652hy4gytxcq====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"cvbsirp3vg7iuzzhddpebygekjj445ek","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pkgconf","hash":"bsrcmcbzidzseycq7emkkxo3t4ywt2tx","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"xz","hash":"gwc3azaaupc5dbpodqiab2dssvmk5no6","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"4rjyysplubcoslfbmi23u2voobghr4jy","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"dvhrxtvvpg2m4jyoex7qtn26zjrxmikg"},{"name":"xz","version":"5.4.6","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"pic":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zt5vu2vph2v2qjwgdbe7btgcz7axpyalorcsqiuxhrg5grwgrrvq====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"gwc3azaaupc5dbpodqiab2dssvmk5no6"},{"name":"tar","version":"1.34","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","zip":"pigz","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"cpgzon3rxegbd3xdnmhrmxvzaq5hyvpzz4y6egmhghhydvefupuq====","dependencies":[{"name":"bzip2","hash":"ypik55ez75ipc2357brsnfr6ns4zibrk","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"cvbsirp3vg7iuzzhddpebygekjj445ek","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pigz","hash":"sh3u7ctgnbf567fhrrivyx3h5rgir4sy","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"gwc3azaaupc5dbpodqiab2dssvmk5no6","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"zstd","hash":"zpktnpdo632qhcmiqavbu757gc3ze6te","parameters":{"deptypes":["run"],"virtuals":[]}}],"hash":"eygw75slf4egmw4pwyshieddjurkp2ph"},{"name":"pigz","version":"2.8","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"makefile","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"4w67lflje4giekjg4ie2vpyuiunjcumo6geofykvon3hodllp42q====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"4rjyysplubcoslfbmi23u2voobghr4jy","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"sh3u7ctgnbf567fhrrivyx3h5rgir4sy"},{"name":"zstd","version":"1.5.6","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"makefile","compression":["none"],"libs":["shared","static"],"programs":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"uvmrov4c6unft6o4yd3jk3uqvweua3uhwdli4sw7h5wvklaf5t3q====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"zpktnpdo632qhcmiqavbu757gc3ze6te"},{"name":"libffi","version":"3.4.6","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"umhsnvoj5ooa3glffnkk2hp3txmrsjvqbpfq2hbk4mhcvhza7gaa====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"wmoq7qgzlbf7ebxnji4nro6gn7g25dt5"},{"name":"libxcrypt","version":"4.4.35","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","obsolete_api":false,"patches":["4885da3afc027999d7cc3c231de7fc6f3c8b119847536e0fc106bc846c617b9b"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["4885da3afc027999d7cc3c231de7fc6f3c8b119847536e0fc106bc846c617b9b"],"package_hash":"dam6cqot2l4nfh6nk3jidk7u2pr2p534tw7446ejqwttqitr4zea====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"ewzhcgygpqpqoayw2fgcgart76wet4jn","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"2yxrh2umuxhtymwd2gxlkgogwxjy2epx"},{"name":"sqlite","version":"3.43.2","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","column_metadata":true,"dynamic_extensions":true,"fts":true,"functions":false,"rtree":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"3isun23rg3ucob7vs355eq7r5eyee4f2xperdje7xoxv5wayrqzq====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"knome32natgdwoyv6rlbqb6w5um5jzqa","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"4rjyysplubcoslfbmi23u2voobghr4jy","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"kcdye5hn4jwz3a7u4ck4konz7747bn4w"},{"name":"util-linux-uuid","version":"2.40.2","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"wnzs7tzbnlmwedntxawri35345ejg3cj2tj7jmpsvauet5hfi5yq====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"bsrcmcbzidzseycq7emkkxo3t4ywt2tx","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"ws5pwa6qz45lahc75zo27ovgldtlmnpm"},{"name":"python-venv","version":"1.0","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"bvjgntlwbvi343x5ctophqqvq6nbx2h4ggbxnjrvnjb3jneitahq====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"python","hash":"ipb4su3jaocbbxxn7ronvotabz4dkbgp","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"hash":"wt5iofmuq447aul5r6ydidmhv2rtepfg"},{"name":"re2c","version":"3.0","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kuhq5ne7cdx2pca57zwnn57fezjovywffswkkryt4usm4zekw3yq====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"ncrrgeaeg65l63s4n2ele3gssfbelqei"}]}} +{"spec":{"_meta":{"version":4},"nodes":[{"name":"clingo-bootstrap","version":"spack","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"cmake","build_type":"Release","docs":false,"generator":"make","ipo":true,"optimized":false,"python":true,"static_libstdcpp":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"677q63cwqryynuiid4piwkdfx2y4sujizh35x5vv5pokofsidsoa====","dependencies":[{"name":"bison","hash":"ddgl3onrbfkboqpjskzdaiwpomvppwgt","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"cmake","hash":"l2qxvjavbdyl4gh6it743qrknlgpaeu6","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"python","hash":"ipb4su3jaocbbxxn7ronvotabz4dkbgp","parameters":{"deptypes":["build","link","run"],"virtuals":[]}},{"name":"python-venv","hash":"wt5iofmuq447aul5r6ydidmhv2rtepfg","parameters":{"deptypes":["build","run"],"virtuals":[]}},{"name":"re2c","hash":"ncrrgeaeg65l63s4n2ele3gssfbelqei","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"nf64noutpg25ptisllb435k3u3qgwgim"},{"name":"bison","version":"3.8.2","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","color":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"d4j62fwvuxqbiez32ltjnhu47ac425wjebsy6fhoptv6saxazcxq====","dependencies":[{"name":"diffutils","hash":"7r6i2y3dxeqpflb54mpqnn5otoq2ivbe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"m4","hash":"hckrrjzj7upowvamvgbqux6s4hxfirbc","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"hash":"ddgl3onrbfkboqpjskzdaiwpomvppwgt"},{"name":"diffutils","version":"3.10","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kbmzdy7mgklc24qx55cvx7kq7hceby2yav4fnf64gfdo7epdghwa====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"cvbsirp3vg7iuzzhddpebygekjj445ek","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}}],"hash":"7r6i2y3dxeqpflb54mpqnn5otoq2ivbe"},{"name":"gcc-runtime","version":"8.5.0","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"se7e7lu5ega7wrxwwnhpwjp2fsl4u277hopdz2lw7bwhatp22soq====","dependencies":[{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv"},{"name":"glibc","version":"2.28","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"external":{"path":"/usr","module":null,"extra_attributes":{}},"package_hash":"riktbfk2yybad7tgbvdkntk5c5msjcm5pk3x7naszgbvfm57h4rq====","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn"},{"name":"gmake","version":"4.4.1","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","guile":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ghstvqlc3r7kgiikwx24xhcxdxcqdk5viinrzgm2mssqigfonika====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2"},{"name":"libiconv","version":"1.17","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"hx2hgtfxuafavkaf2rp3hjq7ttx4zuoyareduhx25lb4a5b64sua====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"cvbsirp3vg7iuzzhddpebygekjj445ek"},{"name":"m4","version":"1.4.19","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["9dc5fbd0d5cb1037ab1e6d0ecc74a30df218d0a94bdd5a02759a97f62daca573","bfdffa7c2eb01021d5849b36972c069693654ad826c1a20b53534009a4ec7a89"],"sigsegv":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bfdffa7c2eb01021d5849b36972c069693654ad826c1a20b53534009a4ec7a89","9dc5fbd0d5cb1037ab1e6d0ecc74a30df218d0a94bdd5a02759a97f62daca573"],"package_hash":"npb7a53yz7wqx4nvnasxwgzxaoiks6sdjz2eugrgkjxs4ml24xea====","dependencies":[{"name":"diffutils","hash":"7r6i2y3dxeqpflb54mpqnn5otoq2ivbe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libsigsegv","hash":"a7utmadxdq5pwbyzzsqufc5z4c5dzil3","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"hckrrjzj7upowvamvgbqux6s4hxfirbc"},{"name":"libsigsegv","version":"2.14","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ypp3sciaprcyojozq2c5gqugtewmr5ytjbfpycyhu6wivtky7rja====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"a7utmadxdq5pwbyzzsqufc5z4c5dzil3"},{"name":"cmake","version":"3.29.6","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","build_type":"Release","doc":false,"ncurses":true,"ownlibs":true,"patches":["dbc3892939348c71f35973dd30e74c4a84bc7a2446c6930523c9723b88a597d1"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["dbc3892939348c71f35973dd30e74c4a84bc7a2446c6930523c9723b88a597d1"],"package_hash":"pbk2rknzfgc2vpxstkdbcoxv5xboiwe72owtgemfxhbuer6pcbbq====","dependencies":[{"name":"curl","hash":"tx4uqyb24um2fbkztpv45vte25ddwirm","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"qdrdnglnycx5usajs354nmxy763r5jd6","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"4rjyysplubcoslfbmi23u2voobghr4jy","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"l2qxvjavbdyl4gh6it743qrknlgpaeu6"},{"name":"curl","version":"8.7.1","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","gssapi":false,"ldap":false,"libidn2":false,"librtmp":false,"libs":["shared","static"],"libssh":false,"libssh2":false,"nghttp2":true,"tls":["openssl"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kcgsfmigaqmusztsy67k2gfkizipob2uj5o5yub2i4onsxph454q====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"nghttp2","hash":"izrdxl4retiy57ugtdmppsol5xlhiapb","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"3ox4v5cseir7gcx7s6ygygoktdej4bfr","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"perl","hash":"ewzhcgygpqpqoayw2fgcgart76wet4jn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"bsrcmcbzidzseycq7emkkxo3t4ywt2tx","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"zlib-ng","hash":"4rjyysplubcoslfbmi23u2voobghr4jy","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"tx4uqyb24um2fbkztpv45vte25ddwirm"},{"name":"nghttp2","version":"1.62.0","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5b4v4lpftbuslseu6whtdgpswnmbjd7hjj564rxnkfgdnylfro7q====","dependencies":[{"name":"diffutils","hash":"7r6i2y3dxeqpflb54mpqnn5otoq2ivbe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"bsrcmcbzidzseycq7emkkxo3t4ywt2tx","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"izrdxl4retiy57ugtdmppsol5xlhiapb"},{"name":"pkgconf","version":"2.2.0","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"gl6tpyarjlclzsal6wa4dtc7cdzprq36nbibalai4a6wgzblrseq====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"bsrcmcbzidzseycq7emkkxo3t4ywt2tx"},{"name":"openssl","version":"3.3.1","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","certs":"mozilla","docs":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"aqjwgxmqs2b7jublxelhue7n75puejodvhn2cbnpjjmq7xttex7a====","dependencies":[{"name":"ca-certificates-mozilla","hash":"4diyktn6tmoj6iurlz7gieu3ub5q5trh","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"ewzhcgygpqpqoayw2fgcgart76wet4jn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"4rjyysplubcoslfbmi23u2voobghr4jy","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"3ox4v5cseir7gcx7s6ygygoktdej4bfr"},{"name":"ca-certificates-mozilla","version":"2023-05-30","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"63npvwqwo2x7i6emvnklh4mhcn45gx2qzveorybh5h2inwr55sea====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"hash":"4diyktn6tmoj6iurlz7gieu3ub5q5trh"},{"name":"perl","version":"5.38.2","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","cpanm":true,"opcode":true,"open":true,"patches":["714e4d1c7496e6b23834e7c88da3d69139418860fbc488fe82fd226b450a4be7"],"shared":true,"threads":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["714e4d1c7496e6b23834e7c88da3d69139418860fbc488fe82fd226b450a4be7"],"package_hash":"i5drmbzpsmo7jrmibmrmahee6y5rtiuo37vmdjda2kfgvfgy6ziq====","dependencies":[{"name":"berkeley-db","hash":"2zsffebnfhcjdsjgn6x7ydsrwf7yfxjq","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"bzip2","hash":"ypik55ez75ipc2357brsnfr6ns4zibrk","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"gdbm","hash":"tduhe6zd7urqpt7i7rej5vzoaxa4ze3t","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"4rjyysplubcoslfbmi23u2voobghr4jy","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"ewzhcgygpqpqoayw2fgcgart76wet4jn"},{"name":"berkeley-db","version":"18.1.40","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cxx":true,"docs":false,"patches":["26090f418891757af46ac3b89a9f43d6eb5989f7a3dce3d1cfc99fba547203b3","b231fcc4d5cff05e5c3a4814f6a5af0e9a966428dc2176540d2c05aff41de522"],"stl":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["b231fcc4d5cff05e5c3a4814f6a5af0e9a966428dc2176540d2c05aff41de522","26090f418891757af46ac3b89a9f43d6eb5989f7a3dce3d1cfc99fba547203b3"],"package_hash":"h57ydfn33zevvzctzzioiiwjwe362izbbwncb6a26dfeno4y7tda====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"2zsffebnfhcjdsjgn6x7ydsrwf7yfxjq"},{"name":"bzip2","version":"1.0.8","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","debug":false,"pic":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"wa33h4h2abj7tx5cndixz7bdwu5fspdaf2kjlqsinnearayw6fra====","dependencies":[{"name":"diffutils","hash":"7r6i2y3dxeqpflb54mpqnn5otoq2ivbe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"ypik55ez75ipc2357brsnfr6ns4zibrk"},{"name":"gdbm","version":"1.23","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"liepxl6phlcxbgfmibxafhewtihlgaa4x3hko37ckqlafhxkrgdq====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"knome32natgdwoyv6rlbqb6w5um5jzqa","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"tduhe6zd7urqpt7i7rej5vzoaxa4ze3t"},{"name":"readline","version":"8.2","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"package_hash":"oww6dmr7xqgg6j7iiluonxbcl4irqnnrip4vfkjdwujncwnuhwuq====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"ncurses","hash":"qdrdnglnycx5usajs354nmxy763r5jd6","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"knome32natgdwoyv6rlbqb6w5um5jzqa"},{"name":"ncurses","version":"6.5","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"abi":"none","build_system":"autotools","patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"symlinks":false,"termlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"package_hash":"rlqzqxoau3wwzu62x6qxlf4flon6b4n3p4zesnc6t2oyybrvnkwq====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"bsrcmcbzidzseycq7emkkxo3t4ywt2tx","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"qdrdnglnycx5usajs354nmxy763r5jd6"},{"name":"zlib-ng","version":"2.2.1","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","compat":true,"new_strategies":true,"opt":true,"pic":true,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"jvdtkihgu4ykt4dwkunpk3ql7tcnl4wtxmhbd3vfl5o7hemoi4gq====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"4rjyysplubcoslfbmi23u2voobghr4jy"},{"name":"python","version":"3.11.9","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","bz2":true,"crypt":true,"ctypes":true,"dbm":true,"debug":false,"libxml2":true,"lzma":true,"nis":false,"optimizations":false,"patches":["13fa8bfa3e852cbf2e7b02a0313009df484bb39f55a50ada00e1a5599e956ac9","b0615b2fc96bb0cf7f180b107183b194b83b34c7614dcd6121e4a76bbf168155","ebdca648c9c1d25f586d7e2a495b62e6d91973b55264a13d89eda1beff72ef56","f2fd060afc4b4618fe8104c4c5d771f36dc55b1db5a4623785a4ea707ec72fb4"],"pic":true,"pyexpat":true,"pythoncmd":true,"readline":true,"shared":true,"sqlite3":true,"ssl":true,"tkinter":false,"uuid":true,"zlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["f2fd060afc4b4618fe8104c4c5d771f36dc55b1db5a4623785a4ea707ec72fb4","b0615b2fc96bb0cf7f180b107183b194b83b34c7614dcd6121e4a76bbf168155","13fa8bfa3e852cbf2e7b02a0313009df484bb39f55a50ada00e1a5599e956ac9","ebdca648c9c1d25f586d7e2a495b62e6d91973b55264a13d89eda1beff72ef56"],"package_hash":"t65rlqtklu5oqlcnkc62ld3dpxgvevfm2h5hfgp36ptz2uefx2sq====","dependencies":[{"name":"bzip2","hash":"ypik55ez75ipc2357brsnfr6ns4zibrk","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"expat","hash":"hzopg2h3vpjkpb4gqcygzvvfb4wjquu3","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"gdbm","hash":"tduhe6zd7urqpt7i7rej5vzoaxa4ze3t","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gettext","hash":"yvb5vlha6yr2lwfkzkqz6mtzzz7wdiyv","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libffi","hash":"wmoq7qgzlbf7ebxnji4nro6gn7g25dt5","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"libxcrypt","hash":"2yxrh2umuxhtymwd2gxlkgogwxjy2epx","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"qdrdnglnycx5usajs354nmxy763r5jd6","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"3ox4v5cseir7gcx7s6ygygoktdej4bfr","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"pkgconf","hash":"bsrcmcbzidzseycq7emkkxo3t4ywt2tx","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"readline","hash":"knome32natgdwoyv6rlbqb6w5um5jzqa","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"sqlite","hash":"kcdye5hn4jwz3a7u4ck4konz7747bn4w","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"util-linux-uuid","hash":"ws5pwa6qz45lahc75zo27ovgldtlmnpm","parameters":{"deptypes":["build","link"],"virtuals":["uuid"]}},{"name":"xz","hash":"gwc3azaaupc5dbpodqiab2dssvmk5no6","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"4rjyysplubcoslfbmi23u2voobghr4jy","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"ipb4su3jaocbbxxn7ronvotabz4dkbgp"},{"name":"expat","version":"2.6.2","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","libbsd":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zeyjv42sx5l6mjqie4smh2uxzfhsxvsnw7udjwg2sl5bcnc66req====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libbsd","hash":"ut2bfnjpiaw35lvt6efz5y62fjpah6ow","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"hzopg2h3vpjkpb4gqcygzvvfb4wjquu3"},{"name":"libbsd","version":"0.12.2","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"debyg3en7sgggswkdhcyd6lbp7arawzmyujthyyuaiad5jqd5msa====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libmd","hash":"4yumgzpllawj3dfsg6ezog4lvblkc2cl","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"ut2bfnjpiaw35lvt6efz5y62fjpah6ow"},{"name":"libmd","version":"1.0.4","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zs2e7fqr4dzthpj5fascqvfn7xcahf7dtc5bzdwfv6vqkzi7oncq====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"4yumgzpllawj3dfsg6ezog4lvblkc2cl"},{"name":"gettext","version":"0.22.5","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","bzip2":true,"curses":true,"git":true,"libunistring":false,"libxml2":true,"pic":true,"shared":true,"tar":true,"xz":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5bhbkykxueimk2h42d6gb7dumldhutohav3x2r23rsalexcgy42a====","dependencies":[{"name":"bzip2","hash":"ypik55ez75ipc2357brsnfr6ns4zibrk","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"cvbsirp3vg7iuzzhddpebygekjj445ek","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"libxml2","hash":"dvhrxtvvpg2m4jyoex7qtn26zjrxmikg","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"qdrdnglnycx5usajs354nmxy763r5jd6","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"tar","hash":"eygw75slf4egmw4pwyshieddjurkp2ph","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"gwc3azaaupc5dbpodqiab2dssvmk5no6","parameters":{"deptypes":["build","link","run"],"virtuals":[]}}],"hash":"yvb5vlha6yr2lwfkzkqz6mtzzz7wdiyv"},{"name":"libxml2","version":"2.10.3","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","pic":true,"python":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"squqo2aayigwxdusu3q3syojwit5gqdh6q4un576652hy4gytxcq====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"cvbsirp3vg7iuzzhddpebygekjj445ek","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pkgconf","hash":"bsrcmcbzidzseycq7emkkxo3t4ywt2tx","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"xz","hash":"gwc3azaaupc5dbpodqiab2dssvmk5no6","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"4rjyysplubcoslfbmi23u2voobghr4jy","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"dvhrxtvvpg2m4jyoex7qtn26zjrxmikg"},{"name":"xz","version":"5.4.6","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"pic":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zt5vu2vph2v2qjwgdbe7btgcz7axpyalorcsqiuxhrg5grwgrrvq====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"gwc3azaaupc5dbpodqiab2dssvmk5no6"},{"name":"tar","version":"1.34","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","zip":"pigz","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"cpgzon3rxegbd3xdnmhrmxvzaq5hyvpzz4y6egmhghhydvefupuq====","dependencies":[{"name":"bzip2","hash":"ypik55ez75ipc2357brsnfr6ns4zibrk","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"cvbsirp3vg7iuzzhddpebygekjj445ek","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pigz","hash":"sh3u7ctgnbf567fhrrivyx3h5rgir4sy","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"gwc3azaaupc5dbpodqiab2dssvmk5no6","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"zstd","hash":"zpktnpdo632qhcmiqavbu757gc3ze6te","parameters":{"deptypes":["run"],"virtuals":[]}}],"hash":"eygw75slf4egmw4pwyshieddjurkp2ph"},{"name":"pigz","version":"2.8","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"makefile","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"4w67lflje4giekjg4ie2vpyuiunjcumo6geofykvon3hodllp42q====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"4rjyysplubcoslfbmi23u2voobghr4jy","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"sh3u7ctgnbf567fhrrivyx3h5rgir4sy"},{"name":"zstd","version":"1.5.6","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"makefile","compression":["none"],"libs":["shared","static"],"programs":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"uvmrov4c6unft6o4yd3jk3uqvweua3uhwdli4sw7h5wvklaf5t3q====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"zpktnpdo632qhcmiqavbu757gc3ze6te"},{"name":"libffi","version":"3.4.6","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"umhsnvoj5ooa3glffnkk2hp3txmrsjvqbpfq2hbk4mhcvhza7gaa====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"wmoq7qgzlbf7ebxnji4nro6gn7g25dt5"},{"name":"libxcrypt","version":"4.4.35","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","obsolete_api":false,"patches":["4885da3afc027999d7cc3c231de7fc6f3c8b119847536e0fc106bc846c617b9b"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["4885da3afc027999d7cc3c231de7fc6f3c8b119847536e0fc106bc846c617b9b"],"package_hash":"dam6cqot2l4nfh6nk3jidk7u2pr2p534tw7446ejqwttqitr4zea====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"ewzhcgygpqpqoayw2fgcgart76wet4jn","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"2yxrh2umuxhtymwd2gxlkgogwxjy2epx"},{"name":"sqlite","version":"3.43.2","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","column_metadata":true,"dynamic_extensions":true,"fts":true,"functions":false,"rtree":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"3isun23rg3ucob7vs355eq7r5eyee4f2xperdje7xoxv5wayrqzq====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"knome32natgdwoyv6rlbqb6w5um5jzqa","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"4rjyysplubcoslfbmi23u2voobghr4jy","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"kcdye5hn4jwz3a7u4ck4konz7747bn4w"},{"name":"util-linux-uuid","version":"2.40.2","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"wnzs7tzbnlmwedntxawri35345ejg3cj2tj7jmpsvauet5hfi5yq====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"bsrcmcbzidzseycq7emkkxo3t4ywt2tx","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"hash":"ws5pwa6qz45lahc75zo27ovgldtlmnpm"},{"name":"python-venv","version":"1.0","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"bvjgntlwbvi343x5ctophqqvq6nbx2h4ggbxnjrvnjb3jneitahq====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"python","hash":"ipb4su3jaocbbxxn7ronvotabz4dkbgp","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"hash":"wt5iofmuq447aul5r6ydidmhv2rtepfg"},{"name":"re2c","version":"3.0","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"compiler":{"name":"gcc","version":"8.5.0"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kuhq5ne7cdx2pca57zwnn57fezjovywffswkkryt4usm4zekw3yq====","dependencies":[{"name":"gcc-runtime","hash":"6kj4wwnm3lhukjkf4edmrdyeiluqnywv","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"sh4kegrdwgfqa2tlalzlhjfvosro32nn","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"6vcsgmkhzd3xp5wce63hspfay6ivfvf2","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"ncrrgeaeg65l63s4n2ele3gssfbelqei"}]}} diff --git a/lib/spack/spack/bootstrap/prototypes/clingo-windows-x86_64.json b/lib/spack/spack/bootstrap/prototypes/clingo-windows-x86_64.json index 03760625574147..f95ffefd1cecc4 100644 --- a/lib/spack/spack/bootstrap/prototypes/clingo-windows-x86_64.json +++ b/lib/spack/spack/bootstrap/prototypes/clingo-windows-x86_64.json @@ -1 +1 @@ -{"spec":{"_meta":{"version":4},"nodes":[{"name":"clingo-bootstrap","version":"spack","arch":{"platform":"windows","platform_os":"windows10.0.20348","target":"x86_64"},"compiler":{"name":"msvc","version":"19.40.33811"},"namespace":"builtin","parameters":{"build_system":"cmake","build_type":"Release","docs":false,"generator":"ninja","ipo":true,"optimized":false,"patches":["311bd2ae3f2f5274d1d36a2d65f887dfdf4c309a3c6bb29a53bbafb82b42ba7a","4ccfd173d439ed1e23eff42d5a01a8fbb21341c632d86b5691242dc270dbf065","c5c4db292a920ded6eecfbb6749d88ce9c4f179500aee6aee3a417b93c7c5c7a"],"python":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["4ccfd173d439ed1e23eff42d5a01a8fbb21341c632d86b5691242dc270dbf065","311bd2ae3f2f5274d1d36a2d65f887dfdf4c309a3c6bb29a53bbafb82b42ba7a","c5c4db292a920ded6eecfbb6749d88ce9c4f179500aee6aee3a417b93c7c5c7a"],"package_hash":"hkhwttazqtgz7nw7e6yzka5nc7o6akrqe23kb3gkdl37dcmwjxkq====","dependencies":[{"name":"cmake","hash":"4ezjoethijaqxue2xt3nal4txe767xns","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"ninja","hash":"f5ggzol7zdybfonmhgh4ujmlb2or4ut6","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"python","hash":"6aoldahfjkgxhhqij3254wekxgkw76j7","parameters":{"deptypes":["build","link","run"],"virtuals":[]}},{"name":"python-venv","hash":"x6lyli3psq6zk3644k2wugm576lci33r","parameters":{"deptypes":["build","run"],"virtuals":[]}},{"name":"re2c","hash":"7bxfiqnxbqtqsyb2un5c7gqyeqeovmuk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"winbison","hash":"xvhc7don5aszzxvlizjiau2pbs4ar2a6","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"wfpfomrvcbtfjrjxjc2f3fi3nj22cyat"},{"name":"cmake","version":"3.29.6","arch":{"platform":"windows","platform_os":"windows10.0.20348","target":"x86_64"},"compiler":{"name":"msvc","version":"19.40.33811"},"namespace":"builtin","parameters":{"build_system":"generic","build_type":"Release","doc":false,"ncurses":false,"ownlibs":true,"patches":["d041289e3e9483cbdbbac46705a1fb01a7c40a8fc13e291229fb4fa2b071369b"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["d041289e3e9483cbdbbac46705a1fb01a7c40a8fc13e291229fb4fa2b071369b"],"package_hash":"6eevq4j4p722uva3cej3xbkvh57fv7ahuqg4pheefouecqh5rnxa====","dependencies":[{"name":"curl","hash":"jt3nq766b6qphqfhezutxbsls4r5ecf5","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ninja","hash":"f5ggzol7zdybfonmhgh4ujmlb2or4ut6","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib","hash":"xfzaydeo4udjmwno4hi5mehuje43mrp5","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"4ezjoethijaqxue2xt3nal4txe767xns"},{"name":"curl","version":"8.7.1","arch":{"platform":"windows","platform_os":"windows10.0.20348","target":"x86_64"},"compiler":{"name":"msvc","version":"19.40.33811"},"namespace":"builtin","parameters":{"build_system":"nmake","gssapi":false,"ldap":false,"libidn2":false,"librtmp":false,"libs":"shared","libssh":false,"libssh2":false,"nghttp2":false,"tls":["sspi"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kcgsfmigaqmusztsy67k2gfkizipob2uj5o5yub2i4onsxph454q====","dependencies":[{"name":"perl","hash":"pkljs7xtxfgvkcbczmygiubpdczoqrlb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib","hash":"xfzaydeo4udjmwno4hi5mehuje43mrp5","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"jt3nq766b6qphqfhezutxbsls4r5ecf5"},{"name":"perl","version":"5.38.2","arch":{"platform":"windows","platform_os":"windows10.0.20348","target":"x86_64"},"compiler":{"name":"msvc","version":"19.40.33811"},"namespace":"builtin","parameters":{"build_system":"generic","cpanm":true,"opcode":true,"open":true,"shared":true,"threads":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"xx43demwtox532nxdz7gqwrlx2g5ksgxfv62c7h4zqfpmclnrruq====","hash":"pkljs7xtxfgvkcbczmygiubpdczoqrlb"},{"name":"zlib","version":"1.3.1","arch":{"platform":"windows","platform_os":"windows10.0.20348","target":"x86_64"},"compiler":{"name":"msvc","version":"19.40.33811"},"namespace":"builtin","parameters":{"build_system":"generic","optimize":true,"pic":true,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"2jkvm4tfyhgosw533mwogyfqz2z32hvk4h5leguukrofpebi5xgq====","hash":"xfzaydeo4udjmwno4hi5mehuje43mrp5"},{"name":"ninja","version":"1.12.0","arch":{"platform":"windows","platform_os":"windows10.0.20348","target":"x86_64"},"compiler":{"name":"msvc","version":"19.40.33811"},"namespace":"builtin","parameters":{"build_system":"generic","re2c":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"jcf35uxhgv42a53liynorg4clnpbgbirydp5s3fjeobf7ur2obbq====","dependencies":[{"name":"python","hash":"6aoldahfjkgxhhqij3254wekxgkw76j7","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"f5ggzol7zdybfonmhgh4ujmlb2or4ut6"},{"name":"python","version":"3.11.9","arch":{"platform":"windows","platform_os":"windows10.0.20348","target":"x86_64"},"compiler":{"name":"msvc","version":"19.40.33811"},"namespace":"builtin","parameters":{"build_system":"generic","bz2":true,"ctypes":true,"dbm":true,"debug":false,"libxml2":true,"lzma":true,"nis":false,"optimizations":false,"patches":["01b5df08776d2c3ffeb75da4ccff144cd554b63fcf9962f27c6ecb5fca06a33d","7abb961432aa530349755d639c2902a342f3b5744d11103901e0acf88fae533e","bccfd87e518d2ebc1dafe5d009b9071c046fe8400d52d2f0283bda6904c4dbf1","fc5b6c586b1b654ac2ed00ba6417b1eb526bd24a0dc28074ce14ff56f6057f7c"],"pic":true,"pyexpat":true,"pythoncmd":false,"readline":false,"shared":true,"sqlite3":true,"ssl":true,"tkinter":false,"uuid":true,"zlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["01b5df08776d2c3ffeb75da4ccff144cd554b63fcf9962f27c6ecb5fca06a33d","fc5b6c586b1b654ac2ed00ba6417b1eb526bd24a0dc28074ce14ff56f6057f7c","bccfd87e518d2ebc1dafe5d009b9071c046fe8400d52d2f0283bda6904c4dbf1","7abb961432aa530349755d639c2902a342f3b5744d11103901e0acf88fae533e"],"package_hash":"u4pa2ashu6det7izfzs7hl7fhelecogvtit6mb3nzsn6gvzpnnoa====","hash":"6aoldahfjkgxhhqij3254wekxgkw76j7"},{"name":"python-venv","version":"1.0","arch":{"platform":"windows","platform_os":"windows10.0.20348","target":"x86_64"},"compiler":{"name":"msvc","version":"19.40.33811"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"bvjgntlwbvi343x5ctophqqvq6nbx2h4ggbxnjrvnjb3jneitahq====","dependencies":[{"name":"python","hash":"6aoldahfjkgxhhqij3254wekxgkw76j7","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"hash":"x6lyli3psq6zk3644k2wugm576lci33r"},{"name":"re2c","version":"3.0","arch":{"platform":"windows","platform_os":"windows10.0.20348","target":"x86_64"},"compiler":{"name":"msvc","version":"19.40.33811"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"e5avvdpvjibybyeqgefi3xrpxyzr2mejjap4mx7q2lgxmpqzco4q====","dependencies":[{"name":"cmake","hash":"4ezjoethijaqxue2xt3nal4txe767xns","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"7bxfiqnxbqtqsyb2un5c7gqyeqeovmuk"},{"name":"winbison","version":"2.5.25","arch":{"platform":"windows","platform_os":"windows10.0.20348","target":"x86_64"},"compiler":{"name":"msvc","version":"19.40.33811"},"namespace":"builtin","parameters":{"build_system":"cmake","build_type":"Release","generator":"ninja","ipo":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"t3g2slcnnleieqtz66oly6vsfe5ibje6b2wmamxv5chuewwds5la====","dependencies":[{"name":"cmake","hash":"4ezjoethijaqxue2xt3nal4txe767xns","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"ninja","hash":"f5ggzol7zdybfonmhgh4ujmlb2or4ut6","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"xvhc7don5aszzxvlizjiau2pbs4ar2a6"}]}} +{"spec":{"_meta":{"version":4},"nodes":[{"name":"clingo-bootstrap","version":"spack","arch":{"platform":"windows","platform_os":"windows10.0.20348","target":"x86_64"},"compiler":{"name":"msvc","version":"19.40.33811"},"namespace":"builtin","parameters":{"build_system":"cmake","build_type":"Release","docs":false,"generator":"ninja","ipo":true,"optimized":false,"patches":["311bd2ae3f2f5274d1d36a2d65f887dfdf4c309a3c6bb29a53bbafb82b42ba7a","4ccfd173d439ed1e23eff42d5a01a8fbb21341c632d86b5691242dc270dbf065","c5c4db292a920ded6eecfbb6749d88ce9c4f179500aee6aee3a417b93c7c5c7a"],"python":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["4ccfd173d439ed1e23eff42d5a01a8fbb21341c632d86b5691242dc270dbf065","311bd2ae3f2f5274d1d36a2d65f887dfdf4c309a3c6bb29a53bbafb82b42ba7a","c5c4db292a920ded6eecfbb6749d88ce9c4f179500aee6aee3a417b93c7c5c7a"],"package_hash":"hkhwttazqtgz7nw7e6yzka5nc7o6akrqe23kb3gkdl37dcmwjxkq====","dependencies":[{"name":"cmake","hash":"4ezjoethijaqxue2xt3nal4txe767xns","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"ninja","hash":"f5ggzol7zdybfonmhgh4ujmlb2or4ut6","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"python","hash":"6aoldahfjkgxhhqij3254wekxgkw76j7","parameters":{"deptypes":["build","link","run"],"virtuals":[]}},{"name":"python-venv","hash":"x6lyli3psq6zk3644k2wugm576lci33r","parameters":{"deptypes":["build","run"],"virtuals":[]}},{"name":"re2c","hash":"7bxfiqnxbqtqsyb2un5c7gqyeqeovmuk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"winbison","hash":"xvhc7don5aszzxvlizjiau2pbs4ar2a6","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"wfpfomrvcbtfjrjxjc2f3fi3nj22cyat"},{"name":"cmake","version":"3.29.6","arch":{"platform":"windows","platform_os":"windows10.0.20348","target":"x86_64"},"compiler":{"name":"msvc","version":"19.40.33811"},"namespace":"builtin","parameters":{"build_system":"generic","build_type":"Release","doc":false,"ncurses":false,"ownlibs":true,"patches":["d041289e3e9483cbdbbac46705a1fb01a7c40a8fc13e291229fb4fa2b071369b"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["d041289e3e9483cbdbbac46705a1fb01a7c40a8fc13e291229fb4fa2b071369b"],"package_hash":"6eevq4j4p722uva3cej3xbkvh57fv7ahuqg4pheefouecqh5rnxa====","dependencies":[{"name":"curl","hash":"jt3nq766b6qphqfhezutxbsls4r5ecf5","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ninja","hash":"f5ggzol7zdybfonmhgh4ujmlb2or4ut6","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib","hash":"xfzaydeo4udjmwno4hi5mehuje43mrp5","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"4ezjoethijaqxue2xt3nal4txe767xns"},{"name":"curl","version":"8.7.1","arch":{"platform":"windows","platform_os":"windows10.0.20348","target":"x86_64"},"compiler":{"name":"msvc","version":"19.40.33811"},"namespace":"builtin","parameters":{"build_system":"nmake","gssapi":false,"ldap":false,"libidn2":false,"librtmp":false,"libs":"shared","libssh":false,"libssh2":false,"nghttp2":false,"tls":["sspi"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kcgsfmigaqmusztsy67k2gfkizipob2uj5o5yub2i4onsxph454q====","dependencies":[{"name":"perl","hash":"pkljs7xtxfgvkcbczmygiubpdczoqrlb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib","hash":"xfzaydeo4udjmwno4hi5mehuje43mrp5","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"hash":"jt3nq766b6qphqfhezutxbsls4r5ecf5"},{"name":"perl","version":"5.38.2","arch":{"platform":"windows","platform_os":"windows10.0.20348","target":"x86_64"},"compiler":{"name":"msvc","version":"19.40.33811"},"namespace":"builtin","parameters":{"build_system":"generic","cpanm":true,"opcode":true,"open":true,"shared":true,"threads":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"xx43demwtox532nxdz7gqwrlx2g5ksgxfv62c7h4zqfpmclnrruq====","hash":"pkljs7xtxfgvkcbczmygiubpdczoqrlb"},{"name":"zlib","version":"1.3.1","arch":{"platform":"windows","platform_os":"windows10.0.20348","target":"x86_64"},"compiler":{"name":"msvc","version":"19.40.33811"},"namespace":"builtin","parameters":{"build_system":"generic","optimize":true,"pic":true,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"2jkvm4tfyhgosw533mwogyfqz2z32hvk4h5leguukrofpebi5xgq====","hash":"xfzaydeo4udjmwno4hi5mehuje43mrp5"},{"name":"ninja","version":"1.12.0","arch":{"platform":"windows","platform_os":"windows10.0.20348","target":"x86_64"},"compiler":{"name":"msvc","version":"19.40.33811"},"namespace":"builtin","parameters":{"build_system":"generic","re2c":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"jcf35uxhgv42a53liynorg4clnpbgbirydp5s3fjeobf7ur2obbq====","dependencies":[{"name":"python","hash":"6aoldahfjkgxhhqij3254wekxgkw76j7","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"f5ggzol7zdybfonmhgh4ujmlb2or4ut6"},{"name":"python","version":"3.11.9","arch":{"platform":"windows","platform_os":"windows10.0.20348","target":"x86_64"},"compiler":{"name":"msvc","version":"19.40.33811"},"namespace":"builtin","parameters":{"build_system":"generic","bz2":true,"ctypes":true,"dbm":true,"debug":false,"libxml2":true,"lzma":true,"nis":false,"optimizations":false,"patches":["01b5df08776d2c3ffeb75da4ccff144cd554b63fcf9962f27c6ecb5fca06a33d","7abb961432aa530349755d639c2902a342f3b5744d11103901e0acf88fae533e","bccfd87e518d2ebc1dafe5d009b9071c046fe8400d52d2f0283bda6904c4dbf1","fc5b6c586b1b654ac2ed00ba6417b1eb526bd24a0dc28074ce14ff56f6057f7c"],"pic":true,"pyexpat":true,"pythoncmd":false,"readline":false,"shared":true,"sqlite3":true,"ssl":true,"tkinter":false,"uuid":true,"zlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["01b5df08776d2c3ffeb75da4ccff144cd554b63fcf9962f27c6ecb5fca06a33d","fc5b6c586b1b654ac2ed00ba6417b1eb526bd24a0dc28074ce14ff56f6057f7c","bccfd87e518d2ebc1dafe5d009b9071c046fe8400d52d2f0283bda6904c4dbf1","7abb961432aa530349755d639c2902a342f3b5744d11103901e0acf88fae533e"],"package_hash":"u4pa2ashu6det7izfzs7hl7fhelecogvtit6mb3nzsn6gvzpnnoa====","hash":"6aoldahfjkgxhhqij3254wekxgkw76j7"},{"name":"python-venv","version":"1.0","arch":{"platform":"windows","platform_os":"windows10.0.20348","target":"x86_64"},"compiler":{"name":"msvc","version":"19.40.33811"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"bvjgntlwbvi343x5ctophqqvq6nbx2h4ggbxnjrvnjb3jneitahq====","dependencies":[{"name":"python","hash":"6aoldahfjkgxhhqij3254wekxgkw76j7","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"hash":"x6lyli3psq6zk3644k2wugm576lci33r"},{"name":"re2c","version":"3.0","arch":{"platform":"windows","platform_os":"windows10.0.20348","target":"x86_64"},"compiler":{"name":"msvc","version":"19.40.33811"},"namespace":"builtin","parameters":{"build_system":"cmake","build_type":"Release","generator":"ninja","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"e5avvdpvjibybyeqgefi3xrpxyzr2mejjap4mx7q2lgxmpqzco4q====","dependencies":[{"name":"cmake","hash":"4ezjoethijaqxue2xt3nal4txe767xns","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ninja","hash":"f5ggzol7zdybfonmhgh4ujmlb2or4ut6","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"7bxfiqnxbqtqsyb2un5c7gqyeqeovmuk"},{"name":"winbison","version":"2.5.25","arch":{"platform":"windows","platform_os":"windows10.0.20348","target":"x86_64"},"compiler":{"name":"msvc","version":"19.40.33811"},"namespace":"builtin","parameters":{"build_system":"cmake","build_type":"Release","generator":"ninja","ipo":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"t3g2slcnnleieqtz66oly6vsfe5ibje6b2wmamxv5chuewwds5la====","dependencies":[{"name":"cmake","hash":"4ezjoethijaqxue2xt3nal4txe767xns","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"ninja","hash":"f5ggzol7zdybfonmhgh4ujmlb2or4ut6","parameters":{"deptypes":["build"],"virtuals":[]}}],"hash":"xvhc7don5aszzxvlizjiau2pbs4ar2a6"}]}} diff --git a/lib/spack/spack/bootstrap/status.py b/lib/spack/spack/bootstrap/status.py index 582927af6ead95..6d3270b42c97ab 100644 --- a/lib/spack/spack/bootstrap/status.py +++ b/lib/spack/spack/bootstrap/status.py @@ -88,7 +88,7 @@ def _core_requirements() -> List[RequiredResponseType]: def _buildcache_requirements() -> List[RequiredResponseType]: _buildcache_exes = { - "file": _missing("file", "required to analyze files for buildcaches"), + "file": _missing("file", "required to analyze files for buildcaches", system_only=False), ("gpg2", "gpg"): _missing("gpg2", "required to sign/verify buildcaches", False), } if platform.system().lower() == "darwin": diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index e807bf6fd02234..af6d0f4e76da85 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -37,13 +37,16 @@ import multiprocessing import os import re +import stat import sys import traceback import types from collections import defaultdict from enum import Flag, auto from itertools import chain -from typing import Dict, List, Set, Tuple +from typing import Callable, Dict, List, Optional, Set, Tuple + +import archspec.cpu import llnl.util.tty as tty from llnl.string import plural @@ -53,6 +56,7 @@ from llnl.util.tty.color import cescape, colorize from llnl.util.tty.log import MultiProcessFd +import spack.build_systems._checks import spack.build_systems.cmake import spack.build_systems.meson import spack.build_systems.python @@ -61,26 +65,21 @@ import spack.config import spack.deptypes as dt import spack.error -import spack.main +import spack.multimethod import spack.package_base import spack.paths import spack.platforms -import spack.repo import spack.schema.environment import spack.spec import spack.stage import spack.store import spack.subprocess_context -import spack.user_environment import spack.util.executable -import spack.util.path -import spack.util.pattern +import spack.util.libc from spack import traverse from spack.context import Context -from spack.error import NoHeadersError, NoLibrariesError +from spack.error import InstallError, NoHeadersError, NoLibrariesError from spack.install_test import spack_install_test_log -from spack.installer import InstallError -from spack.util.cpus import determine_number_of_jobs from spack.util.environment import ( SYSTEM_DIR_CASE_ENTRY, EnvironmentModifications, @@ -92,7 +91,7 @@ ) from spack.util.executable import Executable from spack.util.log_parse import make_log_context, parse_log_events -from spack.util.module_cmd import load_module, path_from_modules +from spack.util.module_cmd import load_module # # This can be set by the user to globally disable parallel builds. @@ -363,7 +362,7 @@ def set_compiler_environment_variables(pkg, env): _add_werror_handling(keep_werror, env) # Set the target parameters that the compiler will add - isa_arg = spec.architecture.target.optimization_flags(compiler) + isa_arg = optimization_flags(compiler, spec.target) env.set("SPACK_TARGET_ARGS", isa_arg) # Trap spack-tracked compiler flags as appropriate. @@ -408,6 +407,65 @@ def set_compiler_environment_variables(pkg, env): return env +def optimization_flags(compiler, target): + if spack.compilers.is_mixed_toolchain(compiler): + msg = ( + "microarchitecture specific optimizations are not " + "supported yet on mixed compiler toolchains [check" + f" {compiler.name}@{compiler.version} for further details]" + ) + tty.debug(msg) + return "" + + # Try to check if the current compiler comes with a version number or + # has an unexpected suffix. If so, treat it as a compiler with a + # custom spec. + compiler_version = compiler.version + version_number, suffix = archspec.cpu.version_components(compiler.version) + if not version_number or suffix: + try: + compiler_version = compiler.real_version + except spack.util.executable.ProcessError as e: + # log this and just return compiler.version instead + tty.debug(str(e)) + + try: + result = target.optimization_flags(compiler.name, compiler_version.dotted_numeric_string) + except (ValueError, archspec.cpu.UnsupportedMicroarchitecture): + result = "" + + return result + + +class FilterDefaultDynamicLinkerSearchPaths: + """Remove rpaths to directories that are default search paths of the dynamic linker.""" + + def __init__(self, dynamic_linker: Optional[str]) -> None: + # Identify directories by (inode, device) tuple, which handles symlinks too. + self.default_path_identifiers: Set[Tuple[int, int]] = set() + if not dynamic_linker: + return + for path in spack.util.libc.default_search_paths_from_dynamic_linker(dynamic_linker): + try: + s = os.stat(path) + if stat.S_ISDIR(s.st_mode): + self.default_path_identifiers.add((s.st_ino, s.st_dev)) + except OSError: + continue + + def is_dynamic_loader_default_path(self, p: str) -> bool: + try: + s = os.stat(p) + return (s.st_ino, s.st_dev) in self.default_path_identifiers + except OSError: + return False + + def __call__(self, dirs: List[str]) -> List[str]: + if not self.default_path_identifiers: + return dirs + return [p for p in dirs if not self.is_dynamic_loader_default_path(p)] + + def set_wrapper_variables(pkg, env): """Set environment variables used by the Spack compiler wrapper (which have the prefix `SPACK_`) and also add the compiler wrappers to PATH. @@ -455,7 +513,7 @@ def set_wrapper_variables(pkg, env): env.set(SPACK_DEBUG, "TRUE") env.set(SPACK_SHORT_SPEC, pkg.spec.short_spec) env.set(SPACK_DEBUG_LOG_ID, pkg.spec.format("{name}-{hash:7}")) - env.set(SPACK_DEBUG_LOG_DIR, spack.main.spack_working_dir) + env.set(SPACK_DEBUG_LOG_DIR, spack.paths.spack_working_dir) if spack.config.get("config:ccache"): # Enable ccache in the compiler wrapper @@ -465,69 +523,71 @@ def set_wrapper_variables(pkg, env): env.set("CCACHE_DISABLE", "1") # Gather information about various types of dependencies - link_deps = set(pkg.spec.traverse(root=False, deptype=("link"))) - rpath_deps = get_rpath_deps(pkg) + rpath_hashes = set(s.dag_hash() for s in get_rpath_deps(pkg)) + link_deps = pkg.spec.traverse(root=False, order="topo", deptype=dt.LINK) + external_link_deps, nonexternal_link_deps = stable_partition(link_deps, lambda d: d.external) link_dirs = [] include_dirs = [] rpath_dirs = [] - def _prepend_all(list_to_modify, items_to_add): - # Update the original list (creating a new list would be faster but - # may not be convenient) - for item in reversed(list(items_to_add)): - list_to_modify.insert(0, item) - - def update_compiler_args_for_dep(dep): - if dep in link_deps and (not is_system_path(dep.prefix)): - query = pkg.spec[dep.name] - dep_link_dirs = list() - try: - # In some circumstances (particularly for externals) finding - # libraries packages can be time consuming, so indicate that - # we are performing this operation (and also report when it - # finishes). - tty.debug("Collecting libraries for {0}".format(dep.name)) - dep_link_dirs.extend(query.libs.directories) - tty.debug("Libraries for {0} have been collected.".format(dep.name)) - except NoLibrariesError: - tty.debug("No libraries found for {0}".format(dep.name)) - - for default_lib_dir in ["lib", "lib64"]: - default_lib_prefix = os.path.join(dep.prefix, default_lib_dir) - if os.path.isdir(default_lib_prefix): - dep_link_dirs.append(default_lib_prefix) - - _prepend_all(link_dirs, dep_link_dirs) - if dep in rpath_deps: - _prepend_all(rpath_dirs, dep_link_dirs) - - try: - _prepend_all(include_dirs, query.headers.directories) - except NoHeadersError: - tty.debug("No headers found for {0}".format(dep.name)) - - for dspec in pkg.spec.traverse(root=False, order="post"): - if dspec.external: - update_compiler_args_for_dep(dspec) - - # Just above, we prepended entries for -L/-rpath for externals. We - # now do this for non-external packages so that Spack-built packages - # are searched first for libraries etc. - for dspec in pkg.spec.traverse(root=False, order="post"): - if not dspec.external: - update_compiler_args_for_dep(dspec) - - # The top-level package is always RPATHed. It hasn't been installed yet - # so the RPATHs are added unconditionally (e.g. even though lib64/ may - # not be created for the install). - for libdir in ["lib64", "lib"]: + for dep in chain(external_link_deps, nonexternal_link_deps): + # TODO: is_system_path is wrong, but even if we knew default -L, -I flags from the compiler + # and default search dirs from the dynamic linker, it's not obvious how to avoid a possibly + # expensive search in `query.libs.directories` and `query.headers.directories`, which is + # what this branch is trying to avoid. + if is_system_path(dep.prefix): + continue + # TODO: as of Spack 0.22, multiple instances of the same package may occur among the link + # deps, so keying by name is wrong. In practice it is not problematic: we obtain the same + # gcc-runtime / glibc here, and repeatedly add the same dirs that are later deduped. + query = pkg.spec[dep.name] + dep_link_dirs = [] + try: + # Locating libraries can be time consuming, so log start and finish. + tty.debug(f"Collecting libraries for {dep.name}") + dep_link_dirs.extend(query.libs.directories) + tty.debug(f"Libraries for {dep.name} have been collected.") + except NoLibrariesError: + tty.debug(f"No libraries found for {dep.name}") + + for default_lib_dir in ("lib", "lib64"): + default_lib_prefix = os.path.join(dep.prefix, default_lib_dir) + if os.path.isdir(default_lib_prefix): + dep_link_dirs.append(default_lib_prefix) + + link_dirs[:0] = dep_link_dirs + if dep.dag_hash() in rpath_hashes: + rpath_dirs[:0] = dep_link_dirs + + try: + tty.debug(f"Collecting headers for {dep.name}") + include_dirs[:0] = query.headers.directories + tty.debug(f"Headers for {dep.name} have been collected.") + except NoHeadersError: + tty.debug(f"No headers found for {dep.name}") + + # The top-level package is heuristically rpath'ed. + for libdir in ("lib64", "lib"): lib_path = os.path.join(pkg.prefix, libdir) rpath_dirs.insert(0, lib_path) + filter_default_dynamic_linker_search_paths = FilterDefaultDynamicLinkerSearchPaths( + pkg.compiler.default_dynamic_linker + ) + + # TODO: filter_system_paths is again wrong (and probably unnecessary due to the is_system_path + # branch above). link_dirs should be filtered with entries from _parse_link_paths. link_dirs = list(dedupe(filter_system_paths(link_dirs))) include_dirs = list(dedupe(filter_system_paths(include_dirs))) rpath_dirs = list(dedupe(filter_system_paths(rpath_dirs))) + rpath_dirs = filter_default_dynamic_linker_search_paths(rpath_dirs) + + # TODO: implicit_rpaths is prefiltered by is_system_path, that should be removed in favor of + # just this filter. + implicit_rpaths = filter_default_dynamic_linker_search_paths(pkg.compiler.implicit_rpaths()) + if implicit_rpaths: + env.set("SPACK_COMPILER_IMPLICIT_RPATHS", ":".join(implicit_rpaths)) # Spack managed directories include the stage, store and upstream stores. We extend this with # their real paths to make it more robust (e.g. /tmp vs /private/tmp on macOS). @@ -562,7 +622,7 @@ def set_package_py_globals(pkg, context: Context = Context.BUILD): module.std_meson_args = spack.build_systems.meson.MesonBuilder.std_args(pkg) module.std_pip_args = spack.build_systems.python.PythonPipBuilder.std_args(pkg) - jobs = determine_number_of_jobs(parallel=pkg.parallel) + jobs = spack.config.determine_number_of_jobs(parallel=pkg.parallel) module.make_jobs = jobs # TODO: make these build deps that can be installed if not found. @@ -732,21 +792,6 @@ def get_rpath_deps(pkg: spack.package_base.PackageBase) -> List[spack.spec.Spec] return _get_rpath_deps_from_spec(pkg.spec, pkg.transitive_rpaths) -def get_rpaths(pkg): - """Get a list of all the rpaths for a package.""" - rpaths = [pkg.prefix.lib, pkg.prefix.lib64] - deps = get_rpath_deps(pkg) - rpaths.extend(d.prefix.lib for d in deps if os.path.isdir(d.prefix.lib)) - rpaths.extend(d.prefix.lib64 for d in deps if os.path.isdir(d.prefix.lib64)) - # Second module is our compiler mod name. We use that to get rpaths from - # module show output. - if pkg.compiler.modules and len(pkg.compiler.modules) > 1: - mod_rpath = path_from_modules([pkg.compiler.modules[1]]) - if mod_rpath: - rpaths.append(mod_rpath) - return list(dedupe(filter_system_paths(rpaths))) - - def load_external_modules(pkg): """Traverse a package's spec DAG and load any external modules. @@ -788,7 +833,6 @@ def setup_package(pkg, dirty, context: Context = Context.BUILD): # Platform specific setup goes before package specific setup. This is for setting # defaults like MACOSX_DEPLOYMENT_TARGET on macOS. platform = spack.platforms.by_name(pkg.spec.architecture.platform) - target = platform.target(pkg.spec.architecture.target) platform.setup_platform_environment(pkg, env_mods) tty.debug("setup_package: grabbing modifications from dependencies") @@ -813,15 +857,8 @@ def setup_package(pkg, dirty, context: Context = Context.BUILD): for mod in pkg.compiler.modules: load_module(mod) - if target and target.module_name: - load_module(target.module_name) - load_external_modules(pkg) - implicit_rpaths = pkg.compiler.implicit_rpaths() - if implicit_rpaths: - env_mods.set("SPACK_COMPILER_IMPLICIT_RPATHS", ":".join(implicit_rpaths)) - # Make sure nothing's strange about the Spack environment. validate(env_mods, tty.warn) env_mods.apply_modifications() @@ -1089,35 +1126,52 @@ def _make_runnable(self, dep: spack.spec.Spec, env: EnvironmentModifications): env.prepend_path("PATH", bin_dir) -def get_cmake_prefix_path(pkg): - # Note that unlike modifications_from_dependencies, this does not include - # any edits to CMAKE_PREFIX_PATH defined in custom - # setup_dependent_build_environment implementations of dependency packages - build_deps = set(pkg.spec.dependencies(deptype=("build", "test"))) - link_deps = set(pkg.spec.traverse(root=False, deptype=("link"))) - build_link_deps = build_deps | link_deps - spack_built = [] - externals = [] - # modifications_from_dependencies updates CMAKE_PREFIX_PATH by first - # prepending all externals and then all non-externals - for dspec in pkg.spec.traverse(root=False, order="post"): - if dspec in build_link_deps: - if dspec.external: - externals.insert(0, dspec) - else: - spack_built.insert(0, dspec) - - ordered_build_link_deps = spack_built + externals - cmake_prefix_path_entries = [] - for spec in ordered_build_link_deps: - cmake_prefix_path_entries.extend(spec.package.cmake_prefix_paths) - - return filter_system_paths(cmake_prefix_path_entries) - - def _setup_pkg_and_run( - serialized_pkg, function, kwargs, write_pipe, input_multiprocess_fd, jsfd1, jsfd2 + serialized_pkg: "spack.subprocess_context.PackageInstallContext", + function: Callable, + kwargs: Dict, + write_pipe: multiprocessing.connection.Connection, + input_multiprocess_fd: Optional[MultiProcessFd], + jsfd1: Optional[MultiProcessFd], + jsfd2: Optional[MultiProcessFd], ): + """Main entry point in the child process for Spack builds. + + ``_setup_pkg_and_run`` is called by the child process created in + ``start_build_process()``, and its main job is to run ``function()`` on behalf of + some Spack installation (see :ref:`spack.installer.PackageInstaller._install_task`). + + The child process is passed a ``write_pipe``, on which it's expected to send one of + the following: + + * ``StopPhase``: error raised by a build process indicating it's stopping at a + particular build phase. + + * ``BaseException``: any exception raised by a child build process, which will be + wrapped in ``ChildError`` (which adds a bunch of debug info and log context) and + raised in the parent. + + * The return value of ``function()``, which can be anything (except an exception). + This is returned to the caller. + + Note: ``jsfd1`` and ``jsfd2`` are passed solely to ensure that the child process + does not close these file descriptors. Some ``multiprocessing`` backends will close + them automatically in the child if they are not passed at process creation time. + + Arguments: + serialized_pkg: Spack package install context object (serialized form of the + package that we'll build in the child process). + function: function to call in the child process; serialized_pkg is passed to + this as the first argument. + kwargs: additional keyword arguments to pass to ``function()``. + write_pipe: multiprocessing ``Connection`` to the parent process, to which the + child *must* send a result (or an error) back to parent on. + input_multiprocess_fd: stdin from the parent (not passed currently on Windows) + jsfd1: gmake Jobserver file descriptor 1. + jsfd2: gmake Jobserver file descriptor 2. + + """ + context: str = kwargs.get("context", "build") try: @@ -1139,17 +1193,18 @@ def _setup_pkg_and_run( return_value = function(pkg, kwargs) write_pipe.send(return_value) - except StopPhase as e: + except spack.error.StopPhase as e: # Do not create a full ChildError from this, it's not an error # it's a control statement. write_pipe.send(e) - except BaseException: + except BaseException as e: # catch ANYTHING that goes wrong in the child process - exc_type, exc, tb = sys.exc_info() # Need to unwind the traceback in the child because traceback # objects can't be sent to the parent. - tb_string = traceback.format_exc() + exc_type = type(e) + tb = e.__traceback__ + tb_string = traceback.format_exception(exc_type, e, tb) # build up some context from the offending package so we can # show that, too. @@ -1166,8 +1221,8 @@ def _setup_pkg_and_run( elif context == "test": logfile = os.path.join(pkg.test_suite.stage, pkg.test_suite.test_log_name(pkg.spec)) - error_msg = str(exc) - if isinstance(exc, (spack.multimethod.NoSuchMethodError, AttributeError)): + error_msg = str(e) + if isinstance(e, (spack.multimethod.NoSuchMethodError, AttributeError)): process = "test the installation" if context == "test" else "build from sources" error_msg = ( "The '{}' package cannot find an attribute while trying to {}. " @@ -1177,7 +1232,7 @@ def _setup_pkg_and_run( "More information at https://spack.readthedocs.io/en/latest/packaging_guide.html#installation-procedure" ).format(pkg.name, process, context) error_msg = colorize("@*R{{{}}}".format(error_msg)) - error_msg = "{}\n\n{}".format(str(exc), error_msg) + error_msg = "{}\n\n{}".format(str(e), error_msg) # make a pickleable exception to send to parent. msg = "%s: %s" % (exc_type.__name__, error_msg) @@ -1300,7 +1355,7 @@ def exitcode_msg(p): p.join() # If returns a StopPhase, raise it - if isinstance(child_result, StopPhase): + if isinstance(child_result, spack.error.StopPhase): # do not print raise child_result @@ -1509,17 +1564,6 @@ def _make_child_error(msg, module, name, traceback, log, log_type, context): return ChildError(msg, module, name, traceback, log, log_type, context) -class StopPhase(spack.error.SpackError): - """Pickle-able exception to control stopped builds.""" - - def __reduce__(self): - return _make_stop_phase, (self.message, self.long_message) - - -def _make_stop_phase(msg, long_msg): - return StopPhase(msg, long_msg) - - def write_log_summary(out, log_type, log, last=None): errors, warnings = parse_log_events(log) nerr = len(errors) diff --git a/lib/spack/spack/build_systems/_checks.py b/lib/spack/spack/build_systems/_checks.py index dfda043fad08ef..e15409fc38d80d 100644 --- a/lib/spack/spack/build_systems/_checks.py +++ b/lib/spack/spack/build_systems/_checks.py @@ -8,7 +8,7 @@ import llnl.util.lang import spack.builder -import spack.installer +import spack.error import spack.relocate import spack.spec import spack.store @@ -34,7 +34,7 @@ def check_paths(path_list, filetype, predicate): if not predicate(abs_path): msg = "Install failed for {0}. No such {1} in prefix: {2}" msg = msg.format(pkg.name, filetype, path) - raise spack.installer.InstallError(msg) + raise spack.error.InstallError(msg) check_paths(pkg.sanity_check_is_file, "file", os.path.isfile) check_paths(pkg.sanity_check_is_dir, "directory", os.path.isdir) @@ -42,7 +42,7 @@ def check_paths(path_list, filetype, predicate): ignore_file = llnl.util.lang.match_predicate(spack.store.STORE.layout.hidden_file_regexes) if all(map(ignore_file, os.listdir(pkg.prefix))): msg = "Install failed for {0}. Nothing was installed!" - raise spack.installer.InstallError(msg.format(pkg.name)) + raise spack.error.InstallError(msg.format(pkg.name)) def apply_macos_rpath_fixups(builder: spack.builder.Builder): diff --git a/lib/spack/spack/build_systems/aspell_dict.py b/lib/spack/spack/build_systems/aspell_dict.py index e9fc4e14978e9e..6c55c363ab6678 100644 --- a/lib/spack/spack/build_systems/aspell_dict.py +++ b/lib/spack/spack/build_systems/aspell_dict.py @@ -2,10 +2,11 @@ # Spack Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) +import os + import llnl.util.filesystem as fs import spack.directives -import spack.package_base import spack.util.executable from .autotools import AutotoolsBuilder, AutotoolsPackage @@ -46,18 +47,12 @@ class AspellDictPackage(AutotoolsPackage): #: Override the default autotools builder AutotoolsBuilder = AspellBuilder - def view_destination(self, view): + def patch(self): aspell_spec = self.spec["aspell"] - if view.get_projection_for_spec(aspell_spec) != aspell_spec.prefix: - raise spack.package_base.ExtensionError( - "aspell does not support non-global extensions" - ) aspell = aspell_spec.command - return aspell("dump", "config", "dict-dir", output=str).strip() - - def view_source(self): - return self.prefix.lib - - def patch(self): - fs.filter_file(r"^dictdir=.*$", "dictdir=/lib", "configure") - fs.filter_file(r"^datadir=.*$", "datadir=/lib", "configure") + dictdir = aspell("dump", "config", "dict-dir", output=str).strip() + datadir = aspell("dump", "config", "data-dir", output=str).strip() + dictdir = os.path.relpath(dictdir, aspell_spec.prefix) + datadir = os.path.relpath(datadir, aspell_spec.prefix) + fs.filter_file(r"^dictdir=.*$", f"dictdir=/{dictdir}", "configure") + fs.filter_file(r"^datadir=.*$", f"datadir=/{datadir}", "configure") diff --git a/lib/spack/spack/build_systems/autotools.py b/lib/spack/spack/build_systems/autotools.py index b9b9ee2f2e139b..47911271fef860 100644 --- a/lib/spack/spack/build_systems/autotools.py +++ b/lib/spack/spack/build_systems/autotools.py @@ -13,6 +13,7 @@ import spack.build_environment import spack.builder +import spack.error import spack.package_base from spack.directives import build_system, conflicts, depends_on from spack.multimethod import when @@ -248,7 +249,7 @@ def runs_ok(script_abs_path): # An external gnuconfig may not not have a prefix. if gnuconfig_dir is None: - raise spack.build_environment.InstallError( + raise spack.error.InstallError( "Spack could not find substitutes for GNU config files because no " "prefix is available for the `gnuconfig` package. Make sure you set a " "prefix path instead of modules for external `gnuconfig`." @@ -268,7 +269,7 @@ def runs_ok(script_abs_path): msg += ( " or the `gnuconfig` package prefix is misconfigured as" " an external package" ) - raise spack.build_environment.InstallError(msg) + raise spack.error.InstallError(msg) # Filter working substitutes candidates = [f for f in candidates if runs_ok(f)] @@ -293,9 +294,7 @@ def runs_ok(script_abs_path): and set the prefix to the directory containing the `config.guess` and `config.sub` files. """ - raise spack.build_environment.InstallError( - msg.format(", ".join(to_be_found), self.name) - ) + raise spack.error.InstallError(msg.format(", ".join(to_be_found), self.name)) # Copy the good files over the bad ones for abs_path in to_be_patched: @@ -688,9 +687,8 @@ def _activate_or_not( variant = variant or name - # Defensively look that the name passed as argument is among - # variants - if variant not in self.pkg.variants: + # Defensively look that the name passed as argument is among variants + if not self.pkg.has_variant(variant): msg = '"{0}" is not a variant of "{1}"' raise KeyError(msg.format(variant, self.pkg.name)) @@ -699,27 +697,19 @@ def _activate_or_not( # Create a list of pairs. Each pair includes a configuration # option and whether or not that option is activated - variant_desc, _ = self.pkg.variants[variant] - if set(variant_desc.values) == set((True, False)): + vdef = self.pkg.get_variant(variant) + if set(vdef.values) == set((True, False)): # BoolValuedVariant carry information about a single option. # Nonetheless, for uniformity of treatment we'll package them # in an iterable of one element. - condition = "+{name}".format(name=variant) - options = [(name, condition in spec)] + options = [(name, f"+{variant}" in spec)] else: - condition = "{variant}={value}" # "feature_values" is used to track values which correspond to # features which can be enabled or disabled as understood by the # package's build system. It excludes values which have special # meanings and do not correspond to features (e.g. "none") - feature_values = ( - getattr(variant_desc.values, "feature_values", None) or variant_desc.values - ) - - options = [ - (value, condition.format(variant=variant, value=value) in spec) - for value in feature_values - ] + feature_values = getattr(vdef.values, "feature_values", None) or vdef.values + options = [(value, f"{variant}={value}" in spec) for value in feature_values] # For each allowed value in the list of values for option_value, activated in options: diff --git a/lib/spack/spack/build_systems/cached_cmake.py b/lib/spack/spack/build_systems/cached_cmake.py index aff54d7559e746..d9b415cbc76416 100644 --- a/lib/spack/spack/build_systems/cached_cmake.py +++ b/lib/spack/spack/build_systems/cached_cmake.py @@ -10,7 +10,6 @@ import llnl.util.filesystem as fs import llnl.util.tty as tty -import spack.build_environment import spack.builder from .cmake import CMakeBuilder, CMakePackage @@ -89,7 +88,7 @@ def define_cmake_cache_from_variant(self, cmake_var, variant=None, comment=""): if variant is None: variant = cmake_var.lower() - if variant not in self.pkg.variants: + if not self.pkg.has_variant(variant): raise KeyError('"{0}" is not a variant of "{1}"'.format(variant, self.pkg.name)) if variant not in self.pkg.spec.variants: @@ -297,18 +296,6 @@ def initconfig_hardware_entries(self): def std_initconfig_entries(self): cmake_prefix_path_env = os.environ["CMAKE_PREFIX_PATH"] cmake_prefix_path = cmake_prefix_path_env.replace(os.pathsep, ";") - cmake_rpaths_env = spack.build_environment.get_rpaths(self.pkg) - cmake_rpaths_path = ";".join(cmake_rpaths_env) - complete_rpath_list = cmake_rpaths_path - if "SPACK_COMPILER_EXTRA_RPATHS" in os.environ: - spack_extra_rpaths_env = os.environ["SPACK_COMPILER_EXTRA_RPATHS"] - spack_extra_rpaths_path = spack_extra_rpaths_env.replace(os.pathsep, ";") - complete_rpath_list = "{0};{1}".format(complete_rpath_list, spack_extra_rpaths_path) - - if "SPACK_COMPILER_IMPLICIT_RPATHS" in os.environ: - spack_implicit_rpaths_env = os.environ["SPACK_COMPILER_IMPLICIT_RPATHS"] - spack_implicit_rpaths_path = spack_implicit_rpaths_env.replace(os.pathsep, ";") - complete_rpath_list = "{0};{1}".format(complete_rpath_list, spack_implicit_rpaths_path) return [ "#------------------{0}".format("-" * 60), @@ -318,8 +305,6 @@ def std_initconfig_entries(self): "#------------------{0}\n".format("-" * 60), cmake_cache_string("CMAKE_PREFIX_PATH", cmake_prefix_path), cmake_cache_string("CMAKE_INSTALL_RPATH_USE_LINK_PATH", "ON"), - cmake_cache_string("CMAKE_BUILD_RPATH", complete_rpath_list), - cmake_cache_string("CMAKE_INSTALL_RPATH", complete_rpath_list), self.define_cmake_cache_from_variant("CMAKE_BUILD_TYPE", "build_type"), ] diff --git a/lib/spack/spack/build_systems/cmake.py b/lib/spack/spack/build_systems/cmake.py index 7c288ef6b72222..a32d92d3a6e713 100644 --- a/lib/spack/spack/build_systems/cmake.py +++ b/lib/spack/spack/build_systems/cmake.py @@ -8,18 +8,21 @@ import platform import re import sys -from typing import List, Optional, Tuple +from itertools import chain +from typing import List, Optional, Set, Tuple import archspec.cpu import llnl.util.filesystem as fs +from llnl.util.lang import stable_partition -import spack.build_environment import spack.builder import spack.deptypes as dt +import spack.error import spack.package_base from spack.directives import build_system, conflicts, depends_on, variant from spack.multimethod import when +from spack.util.environment import filter_system_paths from ._checks import BaseBuilder, execute_build_time_tests @@ -147,11 +150,30 @@ def _values(x): default=default, values=_values, description="the build system generator to use", + when="build_system=cmake", ) for x in not_used: conflicts(f"generator={x}") +def get_cmake_prefix_path(pkg: spack.package_base.PackageBase) -> List[str]: + """Obtain the CMAKE_PREFIX_PATH entries for a package, based on the cmake_prefix_path package + attribute of direct build/test and transitive link dependencies.""" + # Add direct build/test deps + selected: Set[str] = {s.dag_hash() for s in pkg.spec.dependencies(deptype=dt.BUILD | dt.TEST)} + # Add transitive link deps + selected.update(s.dag_hash() for s in pkg.spec.traverse(root=False, deptype=dt.LINK)) + # Separate out externals so they do not shadow Spack prefixes + externals, spack_built = stable_partition( + (s for s in pkg.spec.traverse(root=False, order="topo") if s.dag_hash() in selected), + lambda x: x.external, + ) + + return filter_system_paths( + path for spec in chain(spack_built, externals) for path in spec.package.cmake_prefix_paths + ) + + class CMakePackage(spack.package_base.PackageBase): """Specialized class for packages built using CMake @@ -346,7 +368,7 @@ def std_args(pkg, generator=None): msg = "Invalid CMake generator: '{0}'\n".format(generator) msg += "CMakePackage currently supports the following " msg += "primary generators: '{0}'".format("', '".join(valid_primary_generators)) - raise spack.package_base.InstallError(msg) + raise spack.error.InstallError(msg) try: build_type = pkg.spec.variants["build_type"].value @@ -358,6 +380,16 @@ def std_args(pkg, generator=None): "-G", generator, define("CMAKE_INSTALL_PREFIX", pathlib.Path(pkg.prefix).as_posix()), + define("CMAKE_INSTALL_RPATH_USE_LINK_PATH", True), + # only include the install prefix lib dirs; rpaths for deps are added by USE_LINK_PATH + define( + "CMAKE_INSTALL_RPATH", + [ + pathlib.Path(pkg.prefix, "lib").as_posix(), + pathlib.Path(pkg.prefix, "lib64").as_posix(), + ], + ), + define("CMAKE_PREFIX_PATH", get_cmake_prefix_path(pkg)), define("CMAKE_BUILD_TYPE", build_type), ] @@ -376,15 +408,6 @@ def std_args(pkg, generator=None): _conditional_cmake_defaults(pkg, args) _maybe_set_python_hints(pkg, args) - # Set up CMake rpath - args.extend( - [ - define("CMAKE_INSTALL_RPATH_USE_LINK_PATH", True), - define("CMAKE_INSTALL_RPATH", spack.build_environment.get_rpaths(pkg)), - define("CMAKE_PREFIX_PATH", spack.build_environment.get_cmake_prefix_path(pkg)), - ] - ) - return args @staticmethod @@ -510,7 +533,7 @@ def define_from_variant(self, cmake_var, variant=None): if variant is None: variant = cmake_var.lower() - if variant not in self.pkg.variants: + if not self.pkg.has_variant(variant): raise KeyError('"{0}" is not a variant of "{1}"'.format(variant, self.pkg.name)) if variant not in self.pkg.spec.variants: @@ -545,6 +568,13 @@ def cmake_args(self): def cmake(self, pkg, spec, prefix): """Runs ``cmake`` in the build directory""" + + # skip cmake phase if it is an incremental develop build + if spec.is_develop and os.path.isfile( + os.path.join(self.build_directory, "CMakeCache.txt") + ): + return + options = self.std_cmake_args options += self.cmake_args() options.append(os.path.abspath(self.root_cmakelists_dir)) diff --git a/lib/spack/spack/build_systems/compiler.py b/lib/spack/spack/build_systems/compiler.py index d441b57b2e88c4..65a85ecddff87e 100644 --- a/lib/spack/spack/build_systems/compiler.py +++ b/lib/spack/spack/build_systems/compiler.py @@ -14,6 +14,7 @@ import spack.compiler import spack.package_base +import spack.util.executable # Local "type" for type hints Path = Union[str, pathlib.Path] diff --git a/lib/spack/spack/build_systems/cuda.py b/lib/spack/spack/build_systems/cuda.py index 20f7ede13967b2..5bfe0cfcadf679 100644 --- a/lib/spack/spack/build_systems/cuda.py +++ b/lib/spack/spack/build_systems/cuda.py @@ -3,6 +3,9 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) +import re +from typing import Iterable, List + import spack.variant from spack.directives import conflicts, depends_on, variant from spack.multimethod import when @@ -44,6 +47,7 @@ class CudaPackage(PackageBase): "87", "89", "90", + "90a", ) # FIXME: keep cuda and cuda_arch separate to make usage easier until @@ -70,6 +74,27 @@ def cuda_flags(arch_list): for s in arch_list ] + @staticmethod + def compute_capabilities(arch_list: Iterable[str]) -> List[str]: + """Adds a decimal place to each CUDA arch. + + >>> compute_capabilities(['90', '90a']) + ['9.0', '9.0a'] + + Args: + arch_list: A list of integer strings, optionally followed by a suffix. + + Returns: + A list of float strings, optionally followed by a suffix + """ + pattern = re.compile(r"(\d+)") + capabilities = [] + for arch in arch_list: + _, number, letter = re.split(pattern, arch) + number = "{0:.1f}".format(float(number) / 10.0) + capabilities.append(number + letter) + return capabilities + depends_on("cuda", when="+cuda") # CUDA version vs Architecture @@ -85,8 +110,8 @@ def cuda_flags(arch_list): depends_on("cuda@5.0:10.2", when="cuda_arch=30") depends_on("cuda@5.0:10.2", when="cuda_arch=32") - depends_on("cuda@5.0:", when="cuda_arch=35") - depends_on("cuda@6.5:", when="cuda_arch=37") + depends_on("cuda@5.0:11.8", when="cuda_arch=35") + depends_on("cuda@6.5:11.8", when="cuda_arch=37") depends_on("cuda@6.0:", when="cuda_arch=50") depends_on("cuda@6.5:", when="cuda_arch=52") @@ -106,6 +131,7 @@ def cuda_flags(arch_list): depends_on("cuda@11.8:", when="cuda_arch=89") depends_on("cuda@12.0:", when="cuda_arch=90") + depends_on("cuda@12.0:", when="cuda_arch=90a") # From the NVIDIA install guide we know of conflicts for particular # platforms (linux, darwin), architectures (x86, powerpc) and compilers @@ -124,7 +150,6 @@ def cuda_flags(arch_list): # minimum supported versions conflicts("%gcc@:4", when="+cuda ^cuda@11.0:") conflicts("%gcc@:5", when="+cuda ^cuda@11.4:") - conflicts("%gcc@:7.2", when="+cuda ^cuda@12.4:") conflicts("%clang@:6", when="+cuda ^cuda@12.2:") # maximum supported version @@ -216,6 +241,11 @@ def cuda_flags(arch_list): conflicts("%intel@19.2:", when="+cuda ^cuda@:11.1.0") conflicts("%intel@2021:", when="+cuda ^cuda@:11.4.0") + # ARM + # https://github.com/spack/spack/pull/39666#issuecomment-2377609263 + # Might need to be expanded to other gcc versions + conflicts("%gcc@13.2.0", when="+cuda ^cuda@:12.4 target=aarch64:") + # XL is mostly relevant for ppc64le Linux conflicts("%xl@:12,14:", when="+cuda ^cuda@:9.1") conflicts("%xl@:12,14:15,17:", when="+cuda ^cuda@9.2") diff --git a/lib/spack/spack/build_systems/go.py b/lib/spack/spack/build_systems/go.py index 8bddd7548ea6e9..ae588789c774d5 100644 --- a/lib/spack/spack/build_systems/go.py +++ b/lib/spack/spack/build_systems/go.py @@ -44,16 +44,27 @@ class GoBuilder(BaseBuilder): +-----------------------------------------------+--------------------+ | **Method** | **Purpose** | +===============================================+====================+ - | :py:meth:`~.GoBuilder.build_args` | Specify arguments | + | :py:attr:`~.GoBuilder.build_args` | Specify arguments | | | to ``go build`` | +-----------------------------------------------+--------------------+ - | :py:meth:`~.GoBuilder.check_args` | Specify arguments | + | :py:attr:`~.GoBuilder.check_args` | Specify arguments | | | to ``go test`` | +-----------------------------------------------+--------------------+ """ phases = ("build", "install") + #: Names associated with package methods in the old build-system format + legacy_methods = ("check", "installcheck") + + #: Names associated with package attributes in the old build-system format + legacy_attributes = ( + "build_args", + "check_args", + "build_directory", + "install_time_test_callbacks", + ) + #: Callback names for install-time test install_time_test_callbacks = ["check"] diff --git a/lib/spack/spack/build_systems/intel.py b/lib/spack/spack/build_systems/intel.py index 5695a9dbeb32f9..9f82bae14d39b0 100644 --- a/lib/spack/spack/build_systems/intel.py +++ b/lib/spack/spack/build_systems/intel.py @@ -22,9 +22,10 @@ install, ) +import spack.builder import spack.error from spack.build_environment import dso_suffix -from spack.package_base import InstallError +from spack.error import InstallError from spack.util.environment import EnvironmentModifications from spack.util.executable import Executable from spack.util.prefix import Prefix diff --git a/lib/spack/spack/build_systems/oneapi.py b/lib/spack/spack/build_systems/oneapi.py index a0c8d4fc47f6b0..6d60a7ae4f329e 100644 --- a/lib/spack/spack/build_systems/oneapi.py +++ b/lib/spack/spack/build_systems/oneapi.py @@ -15,7 +15,7 @@ import spack.util.path from spack.build_environment import dso_suffix from spack.directives import conflicts, license, redistribute, variant -from spack.package_base import InstallError +from spack.error import InstallError from spack.util.environment import EnvironmentModifications from spack.util.executable import Executable diff --git a/lib/spack/spack/build_systems/python.py b/lib/spack/spack/build_systems/python.py index bd0c57520c2bb7..b951ec2a977814 100644 --- a/lib/spack/spack/build_systems/python.py +++ b/lib/spack/spack/build_systems/python.py @@ -24,6 +24,8 @@ import spack.detection import spack.multimethod import spack.package_base +import spack.platforms +import spack.repo import spack.spec import spack.store from spack.directives import build_system, depends_on, extends @@ -337,7 +339,7 @@ class PythonPackage(PythonExtension): legacy_buildsystem = "python_pip" #: Callback names for install-time test - install_time_test_callbacks = ["test"] + install_time_test_callbacks = ["test_imports"] build_system("python_pip") @@ -427,7 +429,7 @@ class PythonPipBuilder(BaseBuilder): phases = ("install",) #: Names associated with package methods in the old build-system format - legacy_methods = ("test",) + legacy_methods = ("test_imports",) #: Same as legacy_methods, but the signature is different legacy_long_methods = ("install_options", "global_options", "config_settings") @@ -436,7 +438,7 @@ class PythonPipBuilder(BaseBuilder): legacy_attributes = ("archive_files", "build_directory", "install_time_test_callbacks") #: Callback names for install-time test - install_time_test_callbacks = ["test"] + install_time_test_callbacks = ["test_imports"] @staticmethod def std_args(cls) -> List[str]: diff --git a/lib/spack/spack/build_systems/r.py b/lib/spack/spack/build_systems/r.py index 9950d670486797..07bdb3d0ae0bbd 100644 --- a/lib/spack/spack/build_systems/r.py +++ b/lib/spack/spack/build_systems/r.py @@ -5,6 +5,7 @@ from typing import Optional, Tuple import llnl.util.lang as lang +from llnl.util.filesystem import mkdirp from spack.directives import extends @@ -36,6 +37,7 @@ def configure_vars(self): def install(self, pkg, spec, prefix): """Installs an R package.""" + mkdirp(pkg.module.r_lib_dir) config_args = self.configure_args() config_vars = self.configure_vars() @@ -43,12 +45,12 @@ def install(self, pkg, spec, prefix): args = ["--vanilla", "CMD", "INSTALL"] if config_args: - args.append("--configure-args={0}".format(" ".join(config_args))) + args.append(f"--configure-args={' '.join(config_args)}") if config_vars: - args.append("--configure-vars={0}".format(" ".join(config_vars))) + args.append(f"--configure-vars={' '.join(config_vars)}") - args.extend(["--library={0}".format(self.pkg.module.r_lib_dir), self.stage.source_path]) + args.extend([f"--library={pkg.module.r_lib_dir}", self.stage.source_path]) pkg.module.R(*args) @@ -79,27 +81,21 @@ class RPackage(Package): @lang.classproperty def homepage(cls): if cls.cran: - return "https://cloud.r-project.org/package=" + cls.cran + return f"https://cloud.r-project.org/package={cls.cran}" elif cls.bioc: - return "https://bioconductor.org/packages/" + cls.bioc + return f"https://bioconductor.org/packages/{cls.bioc}" @lang.classproperty def url(cls): if cls.cran: - return ( - "https://cloud.r-project.org/src/contrib/" - + cls.cran - + "_" - + str(list(cls.versions)[0]) - + ".tar.gz" - ) + return f"https://cloud.r-project.org/src/contrib/{cls.cran}_{str(list(cls.versions)[0])}.tar.gz" @lang.classproperty def list_url(cls): if cls.cran: - return "https://cloud.r-project.org/src/contrib/Archive/" + cls.cran + "/" + return f"https://cloud.r-project.org/src/contrib/Archive/{cls.cran}/" @property def git(self): if self.bioc: - return "https://git.bioconductor.org/packages/" + self.bioc + return f"https://git.bioconductor.org/packages/{self.bioc}" diff --git a/lib/spack/spack/build_systems/racket.py b/lib/spack/spack/build_systems/racket.py index facac62032cf54..7e48f8b370f0b3 100644 --- a/lib/spack/spack/build_systems/racket.py +++ b/lib/spack/spack/build_systems/racket.py @@ -11,9 +11,9 @@ import spack.builder from spack.build_environment import SPACK_NO_PARALLEL_MAKE +from spack.config import determine_number_of_jobs from spack.directives import build_system, extends, maintainers from spack.package_base import PackageBase -from spack.util.cpus import determine_number_of_jobs from spack.util.environment import env_flag from spack.util.executable import Executable, ProcessError diff --git a/lib/spack/spack/builder.py b/lib/spack/spack/builder.py index 7590016c3326cf..098f583d534d2d 100644 --- a/lib/spack/spack/builder.py +++ b/lib/spack/spack/builder.py @@ -10,7 +10,7 @@ from llnl.util import lang -import spack.build_environment +import spack.error import spack.multimethod #: Builder classes, as registered by the "builder" decorator @@ -461,15 +461,13 @@ def _on_phase_start(self, instance): # If a phase has a matching stop_before_phase attribute, # stop the installation process raising a StopPhase if getattr(instance, "stop_before_phase", None) == self.name: - raise spack.build_environment.StopPhase( - "Stopping before '{0}' phase".format(self.name) - ) + raise spack.error.StopPhase("Stopping before '{0}' phase".format(self.name)) def _on_phase_exit(self, instance): # If a phase has a matching last_phase attribute, # stop the installation process raising a StopPhase if getattr(instance, "last_phase", None) == self.name: - raise spack.build_environment.StopPhase("Stopping at '{0}' phase".format(self.name)) + raise spack.error.StopPhase("Stopping at '{0}' phase".format(self.name)) def copy(self): return copy.deepcopy(self) @@ -523,10 +521,6 @@ def stage(self): def prefix(self): return self.pkg.prefix - def test(self): - # Defer tests to virtual and concrete packages - pass - def setup_build_environment(self, env): """Sets up the build environment for a package. diff --git a/lib/spack/spack/caches.py b/lib/spack/spack/caches.py index eda141ed15d544..58594059a58d09 100644 --- a/lib/spack/spack/caches.py +++ b/lib/spack/spack/caches.py @@ -11,9 +11,7 @@ from llnl.util.filesystem import mkdirp import spack.config -import spack.error import spack.fetch_strategy -import spack.mirror import spack.paths import spack.util.file_cache import spack.util.path diff --git a/lib/spack/spack/ci.py b/lib/spack/spack/ci.py index bc661e09701aed..f360137ede41bc 100644 --- a/lib/spack/spack/ci.py +++ b/lib/spack/spack/ci.py @@ -31,6 +31,7 @@ import spack import spack.binary_distribution as bindist +import spack.concretize import spack.config as cfg import spack.environment as ev import spack.main @@ -38,7 +39,6 @@ import spack.paths import spack.repo import spack.spec -import spack.stage import spack.util.git import spack.util.gpg as gpg_util import spack.util.spack_yaml as syaml @@ -1219,8 +1219,8 @@ def main_script_replacements(cmd): # Capture the version of Spack used to generate the pipeline, that can be # passed to `git checkout` for version consistency. If we aren't in a Git # repository, presume we are a Spack release and use the Git tag instead. - spack_version = spack.main.get_version() - version_to_clone = spack.main.get_spack_commit() or f"v{spack.spack_version}" + spack_version = spack.get_version() + version_to_clone = spack.get_spack_commit() or f"v{spack.spack_version}" output_object["variables"] = { "SPACK_ARTIFACTS_ROOT": rel_artifacts_root, @@ -1272,7 +1272,9 @@ def main_script_replacements(cmd): else: # No jobs were generated noop_job = spack_ci_ir["jobs"]["noop"]["attributes"] - noop_job["retry"] = service_job_retries + # If this job fails ignore the status and carry on + noop_job["retry"] = 0 + noop_job["allow_failure"] = True if copy_only_pipeline and config_deprecated: tty.debug("Generating no-op job as copy-only is unsupported here.") diff --git a/lib/spack/spack/cmd/__init__.py b/lib/spack/spack/cmd/__init__.py index 362dcb8d936593..c481e931312988 100644 --- a/lib/spack/spack/cmd/__init__.py +++ b/lib/spack/spack/cmd/__init__.py @@ -17,7 +17,7 @@ from llnl.util.tty.colify import colify from llnl.util.tty.color import colorize -import spack.config +import spack.config # breaks a cycle. import spack.environment as ev import spack.error import spack.extensions diff --git a/lib/spack/spack/cmd/arch.py b/lib/spack/spack/cmd/arch.py index 56f597d778d1d4..163478414863a7 100644 --- a/lib/spack/spack/cmd/arch.py +++ b/lib/spack/spack/cmd/arch.py @@ -11,6 +11,7 @@ import llnl.util.tty.color as color import spack.platforms +import spack.spec description = "print architecture information about this machine" section = "system" diff --git a/lib/spack/spack/cmd/audit.py b/lib/spack/spack/cmd/audit.py index 77bbbc5d82b7d4..e5512d9a903662 100644 --- a/lib/spack/spack/cmd/audit.py +++ b/lib/spack/spack/cmd/audit.py @@ -115,15 +115,11 @@ def audit(parser, args): def _process_reports(reports): for check, errors in reports: if errors: - msg = "{0}: {1} issue{2} found".format( - check, len(errors), "" if len(errors) == 1 else "s" - ) - header = "@*b{" + msg + "}" - print(cl.colorize(header)) + status = f"{len(errors)} issue{'' if len(errors) == 1 else 's'} found" + print(cl.colorize(f"{check}: @*r{{{status}}}")) + numdigits = len(str(len(errors))) for idx, error in enumerate(errors): - print(str(idx + 1) + ". " + str(error)) + print(f"{idx + 1:>{numdigits}}. {error}") raise SystemExit(1) else: - msg = "{0}: 0 issues found.".format(check) - header = "@*b{" + msg + "}" - print(cl.colorize(header)) + print(cl.colorize(f"{check}: @*g{{passed}}")) diff --git a/lib/spack/spack/cmd/bootstrap.py b/lib/spack/spack/cmd/bootstrap.py index c321b1213093be..8704f2c7a411e9 100644 --- a/lib/spack/spack/cmd/bootstrap.py +++ b/lib/spack/spack/cmd/bootstrap.py @@ -16,11 +16,11 @@ import spack.bootstrap.config import spack.bootstrap.core import spack.config -import spack.main import spack.mirror import spack.spec import spack.stage import spack.util.path +import spack.util.spack_yaml from spack.cmd.common import arguments description = "manage bootstrap configuration" diff --git a/lib/spack/spack/cmd/buildcache.py b/lib/spack/spack/cmd/buildcache.py index 7839f315129677..960f468c7d13b6 100644 --- a/lib/spack/spack/cmd/buildcache.py +++ b/lib/spack/spack/cmd/buildcache.py @@ -23,14 +23,9 @@ import spack.error import spack.mirror import spack.oci.oci -import spack.oci.opener -import spack.relocate -import spack.repo import spack.spec import spack.stage import spack.store -import spack.user_environment -import spack.util.crypto import spack.util.parallel import spack.util.url as url_util import spack.util.web as web_util diff --git a/lib/spack/spack/cmd/change.py b/lib/spack/spack/cmd/change.py index 9807d5cc55786c..d2c8d9ae5d7dbb 100644 --- a/lib/spack/spack/cmd/change.py +++ b/lib/spack/spack/cmd/change.py @@ -4,6 +4,7 @@ # SPDX-License-Identifier: (Apache-2.0 OR MIT) import spack.cmd +import spack.spec from spack.cmd.common import arguments description = "change an existing spec in an environment" diff --git a/lib/spack/spack/cmd/checksum.py b/lib/spack/spack/cmd/checksum.py index 44478c61ce7ea9..92413f6f0033fb 100644 --- a/lib/spack/spack/cmd/checksum.py +++ b/lib/spack/spack/cmd/checksum.py @@ -15,7 +15,6 @@ import spack.repo import spack.spec import spack.stage -import spack.util.crypto import spack.util.web as web_util from spack.cmd.common import arguments from spack.package_base import ( diff --git a/lib/spack/spack/cmd/ci.py b/lib/spack/spack/cmd/ci.py index 934acc0d4e1bed..44557488fef6d0 100644 --- a/lib/spack/spack/cmd/ci.py +++ b/lib/spack/spack/cmd/ci.py @@ -19,7 +19,6 @@ import spack.cmd.buildcache as buildcache import spack.config as cfg import spack.environment as ev -import spack.environment.depfile import spack.hash_types as ht import spack.mirror import spack.util.gpg as gpg_util diff --git a/lib/spack/spack/cmd/clean.py b/lib/spack/spack/cmd/clean.py index 9dd3efa45992fb..0b8fb6d6bbf6f2 100644 --- a/lib/spack/spack/cmd/clean.py +++ b/lib/spack/spack/cmd/clean.py @@ -10,11 +10,9 @@ import llnl.util.filesystem import llnl.util.tty as tty -import spack.bootstrap import spack.caches -import spack.cmd.test +import spack.cmd import spack.config -import spack.repo import spack.stage import spack.store import spack.util.path diff --git a/lib/spack/spack/cmd/commands.py b/lib/spack/spack/cmd/commands.py index c6e775dd4329c8..875d34ee3531cf 100644 --- a/lib/spack/spack/cmd/commands.py +++ b/lib/spack/spack/cmd/commands.py @@ -7,6 +7,7 @@ import copy import os import re +import shlex import sys from argparse import ArgumentParser, Namespace from typing import IO, Any, Callable, Dict, Iterable, List, Optional, Sequence, Set, Tuple, Union @@ -16,8 +17,10 @@ from llnl.util.tty.colify import colify import spack.cmd +import spack.config import spack.main import spack.paths +import spack.platforms from spack.main import section_descriptions description = "list available spack commands" @@ -139,7 +142,7 @@ def usage(self, usage: str) -> str: cmd = self.parser.prog.replace(" ", "-") if cmd in self.documented: - string += "\n:ref:`More documentation `\n".format(cmd) + string = f"{string}\n:ref:`More documentation `\n" return string @@ -249,33 +252,27 @@ def body( Function body. """ if positionals: - return """ + return f""" if $list_options then - {0} + {self.optionals(optionals)} else - {1} + {self.positionals(positionals)} fi -""".format( - self.optionals(optionals), self.positionals(positionals) - ) +""" elif subcommands: - return """ + return f""" if $list_options then - {0} + {self.optionals(optionals)} else - {1} + {self.subcommands(subcommands)} fi -""".format( - self.optionals(optionals), self.subcommands(subcommands) - ) +""" else: - return """ - {0} -""".format( - self.optionals(optionals) - ) + return f""" + {self.optionals(optionals)} +""" def positionals(self, positionals: Sequence[str]) -> str: """Return the syntax for reporting positional arguments. @@ -304,7 +301,7 @@ def optionals(self, optionals: Sequence[str]) -> str: Returns: Syntax for optional flags. """ - return 'SPACK_COMPREPLY="{0}"'.format(" ".join(optionals)) + return f'SPACK_COMPREPLY="{" ".join(optionals)}"' def subcommands(self, subcommands: Sequence[str]) -> str: """Return the syntax for reporting subcommands. @@ -315,7 +312,7 @@ def subcommands(self, subcommands: Sequence[str]) -> str: Returns: Syntax for subcommand parsers """ - return 'SPACK_COMPREPLY="{0}"'.format(" ".join(subcommands)) + return f'SPACK_COMPREPLY="{" ".join(subcommands)}"' # Map argument destination names to their complete commands @@ -395,7 +392,7 @@ def _fish_dest_get_complete(prog: str, dest: str) -> Optional[str]: subcmd = s[1] if len(s) == 2 else "" for (prog_key, pos_key), value in _dest_to_fish_complete.items(): - if subcmd.startswith(prog_key) and re.match("^" + pos_key + "$", dest): + if subcmd.startswith(prog_key) and re.match(f"^{pos_key}$", dest): return value return None @@ -427,24 +424,6 @@ def format(self, cmd: Command) -> str: + self.complete(cmd.prog, positionals, optionals, subcommands) ) - def _quote(self, string: str) -> str: - """Quote string and escape special characters if necessary. - - Args: - string: Input string. - - Returns: - Quoted string. - """ - # Goal here is to match fish_indent behavior - - # Strings without spaces (or other special characters) do not need to be escaped - if not any([sub in string for sub in [" ", "'", '"']]): - return string - - string = string.replace("'", r"\'") - return f"'{string}'" - def optspecs( self, prog: str, @@ -463,7 +442,7 @@ def optspecs( optspec_var = "__fish_spack_optspecs_" + prog.replace(" ", "_").replace("-", "_") if optionals is None: - return "set -g %s\n" % optspec_var + return f"set -g {optspec_var}\n" # Build optspec by iterating over options args = [] @@ -490,11 +469,11 @@ def optspecs( long = [f[2:] for f in flags if f.startswith("--")] while len(short) > 0 and len(long) > 0: - arg = "%s/%s%s" % (short.pop(), long.pop(), required) + arg = f"{short.pop()}/{long.pop()}{required}" while len(short) > 0: - arg = "%s/%s" % (short.pop(), required) + arg = f"{short.pop()}/{required}" while len(long) > 0: - arg = "%s%s" % (long.pop(), required) + arg = f"{long.pop()}{required}" args.append(arg) @@ -503,7 +482,7 @@ def optspecs( # indicate that such subcommand exists. args = " ".join(args) - return "set -g %s %s\n" % (optspec_var, args) + return f"set -g {optspec_var} {args}\n" @staticmethod def complete_head( @@ -524,12 +503,14 @@ def complete_head( subcmd = s[1] if len(s) == 2 else "" if index is None: - return "complete -c %s -n '__fish_spack_using_command %s'" % (s[0], subcmd) + return f"complete -c {s[0]} -n '__fish_spack_using_command {subcmd}'" elif nargs in [argparse.ZERO_OR_MORE, argparse.ONE_OR_MORE, argparse.REMAINDER]: - head = "complete -c %s -n '__fish_spack_using_command_pos_remainder %d %s'" + return ( + f"complete -c {s[0]} -n '__fish_spack_using_command_pos_remainder " + f"{index} {subcmd}'" + ) else: - head = "complete -c %s -n '__fish_spack_using_command_pos %d %s'" - return head % (s[0], index, subcmd) + return f"complete -c {s[0]} -n '__fish_spack_using_command_pos {index} {subcmd}'" def complete( self, @@ -597,25 +578,18 @@ def positionals( if choices is not None: # If there are choices, we provide a completion for all possible values. - commands.append(head + " -f -a %s" % self._quote(" ".join(choices))) + commands.append(f"{head} -f -a {shlex.quote(' '.join(choices))}") else: # Otherwise, we try to find a predefined completion for it value = _fish_dest_get_complete(prog, args) if value is not None: - commands.append(head + " " + value) + commands.append(f"{head} {value}") return "\n".join(commands) + "\n" def prog_comment(self, prog: str) -> str: - """Return a comment line for the command. - - Args: - prog: Program name. - - Returns: - Comment line. - """ - return "\n# %s\n" % prog + """Return a comment line for the command.""" + return f"\n# {prog}\n" def optionals( self, @@ -658,28 +632,28 @@ def optionals( for f in flags: if f.startswith("--"): long = f[2:] - prefix += " -l %s" % long + prefix = f"{prefix} -l {long}" elif f.startswith("-"): short = f[1:] assert len(short) == 1 - prefix += " -s %s" % short + prefix = f"{prefix} -s {short}" # Check if option require argument. # Currently multi-argument options are not supported, so we treat it like one argument. if nargs != 0: - prefix += " -r" + prefix = f"{prefix} -r" if dest is not None: # If there are choices, we provide a completion for all possible values. - commands.append(prefix + " -f -a %s" % self._quote(" ".join(dest))) + commands.append(f"{prefix} -f -a {shlex.quote(' '.join(dest))}") else: # Otherwise, we try to find a predefined completion for it value = _fish_dest_get_complete(prog, dest) if value is not None: - commands.append(prefix + " " + value) + commands.append(f"{prefix} {value}") if help: - commands.append(prefix + " -d %s" % self._quote(help)) + commands.append(f"{prefix} -d {shlex.quote(help)}") return "\n".join(commands) + "\n" @@ -697,11 +671,11 @@ def subcommands(self, prog: str, subcommands: List[Tuple[ArgumentParser, str, st head = self.complete_head(prog, 0) for _, subcommand, help in subcommands: - command = head + " -f -a %s" % self._quote(subcommand) + command = f"{head} -f -a {shlex.quote(subcommand)}" if help is not None and len(help) > 0: help = help.split("\n")[0] - command += " -d %s" % self._quote(help) + command = f"{command} -d {shlex.quote(help)}" commands.append(command) @@ -747,7 +721,7 @@ def rst_index(out: IO) -> None: for i, cmd in enumerate(sorted(commands)): description = description.capitalize() if i == 0 else "" - ref = ":ref:`%s `" % (cmd, cmd) + ref = f":ref:`{cmd} `" comma = "," if i != len(commands) - 1 else "" bar = "| " if i % 8 == 0 else " " out.write(line % (description, bar + ref + comma)) @@ -858,10 +832,10 @@ def _commands(parser: ArgumentParser, args: Namespace) -> None: # check header first so we don't open out files unnecessarily if args.header and not os.path.exists(args.header): - tty.die("No such file: '%s'" % args.header) + tty.die(f"No such file: '{args.header}'") if args.update: - tty.msg("Updating file: %s" % args.update) + tty.msg(f"Updating file: {args.update}") with open(args.update, "w") as f: prepend_header(args, f) formatter(args, f) diff --git a/lib/spack/spack/cmd/common/arguments.py b/lib/spack/spack/cmd/common/arguments.py index aa652919f84690..456ad0f5ac2260 100644 --- a/lib/spack/spack/cmd/common/arguments.py +++ b/lib/spack/spack/cmd/common/arguments.py @@ -15,7 +15,6 @@ import spack.deptypes as dt import spack.environment as ev import spack.mirror -import spack.modules import spack.reporters import spack.spec import spack.store diff --git a/lib/spack/spack/cmd/common/confirmation.py b/lib/spack/spack/cmd/common/confirmation.py index 8033e776b9ba07..7e805b196cbf72 100644 --- a/lib/spack/spack/cmd/common/confirmation.py +++ b/lib/spack/spack/cmd/common/confirmation.py @@ -9,6 +9,7 @@ import llnl.util.tty as tty import spack.cmd +import spack.spec display_args = {"long": True, "show_flags": False, "variants": False, "indent": 4} diff --git a/lib/spack/spack/cmd/common/env_utility.py b/lib/spack/spack/cmd/common/env_utility.py index 1d04e199d9cced..6371ef65a8365b 100644 --- a/lib/spack/spack/cmd/common/env_utility.py +++ b/lib/spack/spack/cmd/common/env_utility.py @@ -10,7 +10,6 @@ import spack.cmd import spack.deptypes as dt import spack.error -import spack.paths import spack.spec import spack.store from spack import build_environment, traverse diff --git a/lib/spack/spack/cmd/config.py b/lib/spack/spack/cmd/config.py index db82c68d54d601..63d3dbfdb5cbe0 100644 --- a/lib/spack/spack/cmd/config.py +++ b/lib/spack/spack/cmd/config.py @@ -13,9 +13,9 @@ import spack.config import spack.environment as ev -import spack.repo +import spack.error import spack.schema.env -import spack.schema.packages +import spack.spec import spack.store import spack.util.spack_yaml as syaml from spack.cmd.common import arguments @@ -281,7 +281,7 @@ def config_remove(args): existing.pop(value, None) else: # This should be impossible to reach - raise spack.config.ConfigError("Config has nested non-dict values") + raise spack.error.ConfigError("Config has nested non-dict values") spack.config.set(path, existing, scope) @@ -365,7 +365,7 @@ def _config_change(config_path, match_spec_str=None): if not changed: existing_requirements = spack.config.get(key_path) if isinstance(existing_requirements, str): - raise spack.config.ConfigError( + raise spack.error.ConfigError( "'config change' needs to append a requirement," " but existing require: config is not a list" ) @@ -561,11 +561,11 @@ def config_prefer_upstream(args): # Get and list all the variants that differ from the default. variants = [] for var_name, variant in spec.variants.items(): - if var_name in ["patches"] or var_name not in spec.package.variants: + if var_name in ["patches"] or not spec.package.has_variant(var_name): continue - variant_desc, _ = spec.package.variants[var_name] - if variant.value != variant_desc.default: + vdef = spec.package.get_variant(var_name) + if variant.value != vdef.default: variants.append(str(variant)) variants.sort() variants = " ".join(variants) diff --git a/lib/spack/spack/cmd/create.py b/lib/spack/spack/cmd/create.py index d19c740f38b034..b8253f4b8cb084 100644 --- a/lib/spack/spack/cmd/create.py +++ b/lib/spack/spack/cmd/create.py @@ -13,7 +13,6 @@ import spack.repo import spack.stage -import spack.util.web from spack.spec import Spec from spack.url import ( UndetectableNameError, diff --git a/lib/spack/spack/cmd/debug.py b/lib/spack/spack/cmd/debug.py index b1d33eb67df2a5..02c22c70fd325f 100644 --- a/lib/spack/spack/cmd/debug.py +++ b/lib/spack/spack/cmd/debug.py @@ -13,11 +13,12 @@ import llnl.util.tty as tty from llnl.util.filesystem import working_dir -import spack.config +import spack import spack.paths import spack.platforms +import spack.spec +import spack.store import spack.util.git -from spack.main import get_version from spack.util.executable import which description = "debugging commands for troubleshooting Spack" @@ -89,7 +90,7 @@ def report(args): host_os = host_platform.operating_system("frontend") host_target = host_platform.target("frontend") architecture = spack.spec.ArchSpec((str(host_platform), str(host_os), str(host_target))) - print("* **Spack:**", get_version()) + print("* **Spack:**", spack.get_version()) print("* **Python:**", platform.python_version()) print("* **Platform:**", architecture) diff --git a/lib/spack/spack/cmd/dependencies.py b/lib/spack/spack/cmd/dependencies.py index 676da2f089f8f5..51d2389f796d34 100644 --- a/lib/spack/spack/cmd/dependencies.py +++ b/lib/spack/spack/cmd/dependencies.py @@ -11,7 +11,6 @@ import spack.cmd import spack.environment as ev import spack.package_base -import spack.repo import spack.store from spack.cmd.common import arguments diff --git a/lib/spack/spack/cmd/deprecate.py b/lib/spack/spack/cmd/deprecate.py index d7c6c49338d981..abca550ccad4a0 100644 --- a/lib/spack/spack/cmd/deprecate.py +++ b/lib/spack/spack/cmd/deprecate.py @@ -20,6 +20,7 @@ import spack.cmd import spack.environment as ev +import spack.installer import spack.store from spack.cmd.common import arguments from spack.database import InstallStatuses @@ -142,4 +143,4 @@ def deprecate(parser, args): tty.die("Will not deprecate any packages.") for dcate, dcator in zip(all_deprecate, all_deprecators): - dcate.package.do_deprecate(dcator, symlink) + spack.installer.deprecate(dcate, dcator, symlink) diff --git a/lib/spack/spack/cmd/dev_build.py b/lib/spack/spack/cmd/dev_build.py index 0a8dc493098420..696c16f4dcd808 100644 --- a/lib/spack/spack/cmd/dev_build.py +++ b/lib/spack/spack/cmd/dev_build.py @@ -8,10 +8,13 @@ import llnl.util.tty as tty +import spack.build_environment import spack.cmd +import spack.cmd.common.arguments import spack.config import spack.repo from spack.cmd.common import arguments +from spack.installer import PackageInstaller description = "developer build: build from code in current working directory" section = "build" @@ -129,9 +132,9 @@ def dev_build(self, args): elif args.test == "root": tests = [spec.name for spec in specs] - spec.package.do_install( + PackageInstaller( + [spec.package], tests=tests, - make_jobs=args.jobs, keep_prefix=args.keep_prefix, install_deps=not args.ignore_deps, verbose=not args.quiet, @@ -139,7 +142,7 @@ def dev_build(self, args): stop_before=args.before, skip_patch=args.skip_patch, stop_at=args.until, - ) + ).install() # drop into the build environment of the package? if args.shell is not None: diff --git a/lib/spack/spack/cmd/develop.py b/lib/spack/spack/cmd/develop.py index cc181d9a926b82..0a9b7d13875ad3 100644 --- a/lib/spack/spack/cmd/develop.py +++ b/lib/spack/spack/cmd/develop.py @@ -10,7 +10,6 @@ import spack.cmd import spack.config import spack.fetch_strategy -import spack.package_base import spack.repo import spack.spec import spack.stage diff --git a/lib/spack/spack/cmd/diff.py b/lib/spack/spack/cmd/diff.py index a841986355b71f..3a9311e0e6f311 100644 --- a/lib/spack/spack/cmd/diff.py +++ b/lib/spack/spack/cmd/diff.py @@ -12,7 +12,6 @@ import spack.cmd import spack.environment as ev import spack.solver.asp as asp -import spack.util.environment import spack.util.spack_json as sjson from spack.cmd.common import arguments diff --git a/lib/spack/spack/cmd/env.py b/lib/spack/spack/cmd/env.py index b943f3d3bd3b81..c4596af469c15a 100644 --- a/lib/spack/spack/cmd/env.py +++ b/lib/spack/spack/cmd/env.py @@ -21,15 +21,12 @@ import spack.cmd import spack.cmd.common import spack.cmd.common.arguments -import spack.cmd.install import spack.cmd.modules -import spack.cmd.uninstall import spack.config import spack.environment as ev import spack.environment.depfile as depfile +import spack.environment.environment import spack.environment.shell -import spack.schema.env -import spack.spec import spack.tengine from spack.cmd.common import arguments from spack.util.environment import EnvironmentModifications @@ -273,7 +270,7 @@ def env_activate_setup_parser(subparser): nargs="?", default=None, help=( - "name of managed environment or directory of the anonymous env" + "name of managed environment or directory of the independent env" " (when using --dir/-d) to activate" ), ) @@ -543,7 +540,7 @@ def env_rename_setup_parser(subparser): def env_rename(args): """Rename an environment. - This renames a managed environment or moves an anonymous environment. + This renames a managed environment or moves an independent environment. """ # Directory option has been specified diff --git a/lib/spack/spack/cmd/external.py b/lib/spack/spack/cmd/external.py index 421685d42a3e30..ca32035cd77eec 100644 --- a/lib/spack/spack/cmd/external.py +++ b/lib/spack/spack/cmd/external.py @@ -18,9 +18,9 @@ import spack.cray_manifest as cray_manifest import spack.detection import spack.error +import spack.package_base import spack.repo import spack.spec -import spack.util.environment from spack.cmd.common import arguments description = "manage external packages in Spack configuration" diff --git a/lib/spack/spack/cmd/fetch.py b/lib/spack/spack/cmd/fetch.py index 0d794eb54787dc..ef831dd05413f4 100644 --- a/lib/spack/spack/cmd/fetch.py +++ b/lib/spack/spack/cmd/fetch.py @@ -8,7 +8,6 @@ import spack.cmd import spack.config import spack.environment as ev -import spack.repo import spack.traverse from spack.cmd.common import arguments diff --git a/lib/spack/spack/cmd/find.py b/lib/spack/spack/cmd/find.py index d09b2d84238553..2f25683c5ece6b 100644 --- a/lib/spack/spack/cmd/find.py +++ b/lib/spack/spack/cmd/find.py @@ -10,10 +10,11 @@ import llnl.util.tty as tty import llnl.util.tty.color as color -import spack.bootstrap import spack.cmd as cmd +import spack.config import spack.environment as ev import spack.repo +import spack.spec import spack.store from spack.cmd.common import arguments from spack.database import InstallStatuses diff --git a/lib/spack/spack/cmd/gc.py b/lib/spack/spack/cmd/gc.py index c7d023602e3f2d..63e7aacfb8aa18 100644 --- a/lib/spack/spack/cmd/gc.py +++ b/lib/spack/spack/cmd/gc.py @@ -41,7 +41,7 @@ def setup_parser(subparser): help="do not remove installed build-only dependencies of roots\n" "(default is to keep only link & run dependencies)", ) - spack.cmd.common.arguments.add_common_arguments(subparser, ["yes_to_all"]) + spack.cmd.common.arguments.add_common_arguments(subparser, ["yes_to_all", "constraint"]) def roots_from_environments(args, active_env): @@ -97,6 +97,12 @@ def gc(parser, args): root_hashes = None specs = spack.store.STORE.db.unused_specs(root_hashes=root_hashes, deptype=deptype) + + # limit search to constraint specs if provided + if args.constraint: + hashes = set(spec.dag_hash() for spec in args.specs()) + specs = [spec for spec in specs if spec.dag_hash() in hashes] + if not specs: tty.msg("There are no unused specs. Spack's store is clean.") return diff --git a/lib/spack/spack/cmd/info.py b/lib/spack/spack/cmd/info.py index c5d776212b8bf1..890b32b3002507 100644 --- a/lib/spack/spack/cmd/info.py +++ b/lib/spack/spack/cmd/info.py @@ -16,7 +16,7 @@ import spack.install_test import spack.repo import spack.spec -import spack.version +import spack.variant from spack.cmd.common import arguments from spack.package_base import preferred_version @@ -48,6 +48,7 @@ def setup_parser(subparser): options = [ ("--detectable", print_detectable.__doc__), ("--maintainers", print_maintainers.__doc__), + ("--namespace", print_namespace.__doc__), ("--no-dependencies", "do not " + print_dependencies.__doc__), ("--no-variants", "do not " + print_variants.__doc__), ("--no-versions", "do not " + print_versions.__doc__), @@ -189,6 +190,15 @@ def print_maintainers(pkg, args): color.cprint(section_title("Maintainers: ") + mnt) +def print_namespace(pkg, args): + """output package namespace""" + + repo = spack.repo.PATH.get_repo(pkg.namespace) + color.cprint("") + color.cprint(section_title("Namespace:")) + color.cprint(f" @c{{{repo.namespace}}} at {repo.root}") + + def print_phases(pkg, args): """output installation phases""" @@ -323,26 +333,6 @@ def _fmt_variant(variant, max_name_default_len, indent, when=None, out=None): out.write("\n") -def _variants_by_name_when(pkg): - """Adaptor to get variants keyed by { name: { when: { [Variant...] } }.""" - # TODO: replace with pkg.variants_by_name(when=True) when unified directive dicts are merged. - variants = {} - for name, (variant, whens) in sorted(pkg.variants.items()): - for when in whens: - variants.setdefault(name, {}).setdefault(when, []).append(variant) - return variants - - -def _variants_by_when_name(pkg): - """Adaptor to get variants keyed by { when: { name: Variant } }""" - # TODO: replace with pkg.variants when unified directive dicts are merged. - variants = {} - for name, (variant, whens) in pkg.variants.items(): - for when in whens: - variants.setdefault(when, {})[name] = variant - return variants - - def _print_variants_header(pkg): """output variants""" @@ -353,32 +343,22 @@ def _print_variants_header(pkg): color.cprint("") color.cprint(section_title("Variants:")) - variants_by_name = _variants_by_name_when(pkg) - # Calculate the max length of the "name [default]" part of the variant display # This lets us know where to print variant values. max_name_default_len = max( color.clen(_fmt_name_and_default(variant)) - for name, when_variants in variants_by_name.items() - for variants in when_variants.values() - for variant in variants + for name in pkg.variant_names() + for _, variant in pkg.variant_definitions(name) ) - return max_name_default_len, variants_by_name - - -def _unconstrained_ver_first(item): - """sort key that puts specs with open version ranges first""" - spec, _ = item - return (spack.version.any_version not in spec.versions, spec) + return max_name_default_len def print_variants_grouped_by_when(pkg): - max_name_default_len, _ = _print_variants_header(pkg) + max_name_default_len = _print_variants_header(pkg) indent = 4 - variants = _variants_by_when_name(pkg) - for when, variants_by_name in sorted(variants.items(), key=_unconstrained_ver_first): + for when, variants_by_name in pkg.variant_items(): padded_values = max_name_default_len + 4 start_indent = indent @@ -396,15 +376,14 @@ def print_variants_grouped_by_when(pkg): def print_variants_by_name(pkg): - max_name_default_len, variants_by_name = _print_variants_header(pkg) + max_name_default_len = _print_variants_header(pkg) max_name_default_len += 4 indent = 4 - for name, when_variants in variants_by_name.items(): - for when, variants in sorted(when_variants.items(), key=_unconstrained_ver_first): - for variant in variants: - _fmt_variant(variant, max_name_default_len, indent, when, out=sys.stdout) - sys.stdout.write("\n") + for name in pkg.variant_names(): + for when, variant in pkg.variant_definitions(name): + _fmt_variant(variant, max_name_default_len, indent, when, out=sys.stdout) + sys.stdout.write("\n") def print_variants(pkg, args): @@ -522,6 +501,7 @@ def info(parser, args): # Now output optional information in expected order sections = [ (args.all or args.maintainers, print_maintainers), + (args.all or args.namespace, print_namespace), (args.all or args.detectable, print_detectable), (args.all or args.tags, print_tags), (args.all or not args.no_versions, print_versions), diff --git a/lib/spack/spack/cmd/install.py b/lib/spack/spack/cmd/install.py index 8458e7ce050439..5040032f2bcd09 100644 --- a/lib/spack/spack/cmd/install.py +++ b/lib/spack/spack/cmd/install.py @@ -13,18 +13,15 @@ from llnl.string import plural from llnl.util import lang, tty -import spack.build_environment import spack.cmd import spack.config import spack.environment as ev -import spack.fetch_strategy -import spack.package_base import spack.paths import spack.report import spack.spec import spack.store from spack.cmd.common import arguments -from spack.error import SpackError +from spack.error import InstallError, SpackError from spack.installer import PackageInstaller description = "build and install packages" @@ -287,7 +284,7 @@ def require_user_confirmation_for_overwrite(concrete_specs, args): tty.die("Reinstallation aborted.") -def _dump_log_on_error(e: spack.build_environment.InstallError): +def _dump_log_on_error(e: InstallError): e.print_context() assert e.pkg, "Expected InstallError to include the associated package" if not os.path.exists(e.pkg.log_path): @@ -352,7 +349,7 @@ def reporter_factory(specs): install_with_active_env(env, args, install_kwargs, reporter_factory) else: install_without_active_env(args, install_kwargs, reporter_factory) - except spack.build_environment.InstallError as e: + except InstallError as e: if args.show_log_on_error: _dump_log_on_error(e) raise @@ -477,5 +474,5 @@ def install_without_active_env(args, install_kwargs, reporter_factory): installs = [s.package for s in concrete_specs] install_kwargs["explicit"] = [s.dag_hash() for s in concrete_specs] - builder = PackageInstaller(installs, install_kwargs) + builder = PackageInstaller(installs, **install_kwargs) builder.install() diff --git a/lib/spack/spack/cmd/load.py b/lib/spack/spack/cmd/load.py index 81f13194844de4..d88d4b771f10c9 100644 --- a/lib/spack/spack/cmd/load.py +++ b/lib/spack/spack/cmd/load.py @@ -6,11 +6,10 @@ import sys import spack.cmd -import spack.cmd.find +import spack.cmd.common import spack.environment as ev import spack.store import spack.user_environment as uenv -import spack.util.environment from spack.cmd.common import arguments description = "add package to the user environment" diff --git a/lib/spack/spack/cmd/mark.py b/lib/spack/spack/cmd/mark.py index cf816a21f544cf..38701b97475547 100644 --- a/lib/spack/spack/cmd/mark.py +++ b/lib/spack/spack/cmd/mark.py @@ -8,9 +8,6 @@ from llnl.util import tty import spack.cmd -import spack.error -import spack.package_base -import spack.repo import spack.store from spack.cmd.common import arguments from spack.database import InstallStatuses diff --git a/lib/spack/spack/cmd/mirror.py b/lib/spack/spack/cmd/mirror.py index d25a9018e88b71..af6a45e3990752 100644 --- a/lib/spack/spack/cmd/mirror.py +++ b/lib/spack/spack/cmd/mirror.py @@ -17,7 +17,6 @@ import spack.mirror import spack.repo import spack.spec -import spack.util.path import spack.util.web as web_util from spack.cmd.common import arguments from spack.error import SpackError diff --git a/lib/spack/spack/cmd/modules/__init__.py b/lib/spack/spack/cmd/modules/__init__.py index 1cb04189b9278a..b11063714f75c7 100644 --- a/lib/spack/spack/cmd/modules/__init__.py +++ b/lib/spack/spack/cmd/modules/__init__.py @@ -15,6 +15,7 @@ import spack.cmd import spack.config +import spack.error import spack.modules import spack.modules.common import spack.repo @@ -124,13 +125,13 @@ def check_module_set_name(name): names = [k for k in modules if k != "prefix_inspections"] if not names: - raise spack.config.ConfigError( + raise spack.error.ConfigError( f"Module set configuration is missing. Cannot use module set '{name}'" ) pretty_names = "', '".join(names) - raise spack.config.ConfigError( + raise spack.error.ConfigError( f"Cannot use invalid module set '{name}'.", f"Valid module set names are: '{pretty_names}'.", ) @@ -172,7 +173,7 @@ def loads(module_type, specs, args, out=None): modules = list( ( spec, - spack.modules.common.get_module( + spack.modules.get_module( module_type, spec, get_full_path=False, @@ -221,7 +222,7 @@ def find(module_type, specs, args): try: modules = [ - spack.modules.common.get_module( + spack.modules.get_module( module_type, spec, args.full_path, @@ -232,7 +233,7 @@ def find(module_type, specs, args): ] modules.append( - spack.modules.common.get_module( + spack.modules.get_module( module_type, single_spec, args.full_path, diff --git a/lib/spack/spack/cmd/patch.py b/lib/spack/spack/cmd/patch.py index b5805afd8058c6..885ff2f746c352 100644 --- a/lib/spack/spack/cmd/patch.py +++ b/lib/spack/spack/cmd/patch.py @@ -9,7 +9,6 @@ import spack.config import spack.environment as ev import spack.package_base -import spack.repo import spack.traverse from spack.cmd.common import arguments diff --git a/lib/spack/spack/cmd/pkg.py b/lib/spack/spack/cmd/pkg.py index b21313cbc498fb..fa4084437ffa78 100644 --- a/lib/spack/spack/cmd/pkg.py +++ b/lib/spack/spack/cmd/pkg.py @@ -12,7 +12,6 @@ from llnl.util.tty.colify import colify import spack.cmd -import spack.paths import spack.repo import spack.util.executable as exe import spack.util.package_hash as ph diff --git a/lib/spack/spack/cmd/python.py b/lib/spack/spack/cmd/python.py index a4f177fa38263e..6f96234642970f 100644 --- a/lib/spack/spack/cmd/python.py +++ b/lib/spack/spack/cmd/python.py @@ -78,8 +78,8 @@ def python(parser, args, unknown_args): # Run user choice of interpreter if args.python_interpreter == "ipython": - return spack.cmd.python.ipython_interpreter(args) - return spack.cmd.python.python_interpreter(args) + return ipython_interpreter(args) + return python_interpreter(args) def ipython_interpreter(args): diff --git a/lib/spack/spack/cmd/restage.py b/lib/spack/spack/cmd/restage.py index a21317405c459a..d3d596fa12915d 100644 --- a/lib/spack/spack/cmd/restage.py +++ b/lib/spack/spack/cmd/restage.py @@ -6,7 +6,6 @@ import llnl.util.tty as tty import spack.cmd -import spack.repo from spack.cmd.common import arguments description = "revert checked out package source code" diff --git a/lib/spack/spack/cmd/solve.py b/lib/spack/spack/cmd/solve.py index 2d6197f75846ad..f5a9c09c3d395c 100644 --- a/lib/spack/spack/cmd/solve.py +++ b/lib/spack/spack/cmd/solve.py @@ -12,11 +12,12 @@ import spack import spack.cmd +import spack.cmd.common.arguments import spack.config import spack.environment import spack.hash_types as ht -import spack.package_base import spack.solver.asp as asp +import spack.spec from spack.cmd.common import arguments description = "concretize a specs using an ASP solver" diff --git a/lib/spack/spack/cmd/spec.py b/lib/spack/spack/cmd/spec.py index ae08e1f9779143..e5cc951d695d40 100644 --- a/lib/spack/spack/cmd/spec.py +++ b/lib/spack/spack/cmd/spec.py @@ -14,6 +14,7 @@ import spack.hash_types as ht import spack.spec import spack.store +import spack.traverse from spack.cmd.common import arguments description = "show what would be installed, given a spec" diff --git a/lib/spack/spack/cmd/stage.py b/lib/spack/spack/cmd/stage.py index 10a94e34102c37..af5fa412ea7e1a 100644 --- a/lib/spack/spack/cmd/stage.py +++ b/lib/spack/spack/cmd/stage.py @@ -11,8 +11,6 @@ import spack.config import spack.environment as ev import spack.package_base -import spack.repo -import spack.stage import spack.traverse from spack.cmd.common import arguments diff --git a/lib/spack/spack/cmd/tags.py b/lib/spack/spack/cmd/tags.py index a4f9786b93de34..e43740abc72656 100644 --- a/lib/spack/spack/cmd/tags.py +++ b/lib/spack/spack/cmd/tags.py @@ -9,8 +9,8 @@ import llnl.util.tty as tty import llnl.util.tty.colify as colify +import spack.environment import spack.repo -import spack.store import spack.tag description = "show package tags and associated packages" diff --git a/lib/spack/spack/cmd/test.py b/lib/spack/spack/cmd/test.py index 5aded576b05e84..d3d45dbe463cc7 100644 --- a/lib/spack/spack/cmd/test.py +++ b/lib/spack/spack/cmd/test.py @@ -15,11 +15,12 @@ from llnl.util.tty import colify import spack.cmd +import spack.config import spack.environment as ev import spack.install_test -import spack.package_base import spack.repo import spack.report +import spack.store from spack.cmd.common import arguments description = "run spack's tests for an install" diff --git a/lib/spack/spack/cmd/tutorial.py b/lib/spack/spack/cmd/tutorial.py index 3dd7746f81b214..478ca52b7f565b 100644 --- a/lib/spack/spack/cmd/tutorial.py +++ b/lib/spack/spack/cmd/tutorial.py @@ -10,6 +10,7 @@ from llnl.util.filesystem import working_dir import spack +import spack.cmd import spack.config import spack.paths import spack.util.git diff --git a/lib/spack/spack/cmd/undevelop.py b/lib/spack/spack/cmd/undevelop.py index 539ddb850d0d8a..a4c6371ae591ca 100644 --- a/lib/spack/spack/cmd/undevelop.py +++ b/lib/spack/spack/cmd/undevelop.py @@ -6,6 +6,7 @@ import llnl.util.tty as tty import spack.cmd +import spack.config from spack.cmd.common import arguments description = "remove specs from an environment" diff --git a/lib/spack/spack/cmd/unit_test.py b/lib/spack/spack/cmd/unit_test.py index c46012d5dc86d3..4717c9ee9bd26b 100644 --- a/lib/spack/spack/cmd/unit_test.py +++ b/lib/spack/spack/cmd/unit_test.py @@ -10,6 +10,8 @@ import re import sys +import spack.extensions + try: import pytest except ImportError: diff --git a/lib/spack/spack/cmd/unload.py b/lib/spack/spack/cmd/unload.py index 65daabcd468181..f937ebd3138b6c 100644 --- a/lib/spack/spack/cmd/unload.py +++ b/lib/spack/spack/cmd/unload.py @@ -7,9 +7,10 @@ import sys import spack.cmd +import spack.cmd.common import spack.error +import spack.store import spack.user_environment as uenv -import spack.util.environment from spack.cmd.common import arguments description = "remove package from the user environment" diff --git a/lib/spack/spack/cmd/verify.py b/lib/spack/spack/cmd/verify.py index 383e9e046baaaf..57b30788324d61 100644 --- a/lib/spack/spack/cmd/verify.py +++ b/lib/spack/spack/cmd/verify.py @@ -6,6 +6,7 @@ import llnl.util.tty as tty +import spack.cmd import spack.environment as ev import spack.store import spack.verify diff --git a/lib/spack/spack/cmd/view.py b/lib/spack/spack/cmd/view.py index 103a6ffb0ea17f..374aa570d2e493 100644 --- a/lib/spack/spack/cmd/view.py +++ b/lib/spack/spack/cmd/view.py @@ -33,6 +33,8 @@ YamlFilesystemView. """ +import sys + import llnl.util.tty as tty from llnl.util.link_tree import MergeConflictError @@ -178,7 +180,12 @@ def setup_parser(sp): def view(parser, args): - "Produce a view of a set of packages." + """Produce a view of a set of packages.""" + + if sys.platform == "win32" and args.action in ("hardlink", "hard"): + # Hard-linked views are not yet allowed on Windows. + # See https://github.com/spack/spack/pull/46335#discussion_r1757411915 + tty.die("Hard linking is not supported on Windows. Please use symlinks or copy methods.") specs = spack.cmd.parse_specs(args.specs) path = args.path[0] diff --git a/lib/spack/spack/compiler.py b/lib/spack/spack/compiler.py index f24ccf679fe7c3..8ed125ae24fdfe 100644 --- a/lib/spack/spack/compiler.py +++ b/lib/spack/spack/compiler.py @@ -202,18 +202,6 @@ class Compiler: support for specific compilers, their possible names, arguments, and how to identify the particular type of compiler.""" - # Subclasses use possible names of C compiler - cc_names: List[str] = [] - - # Subclasses use possible names of C++ compiler - cxx_names: List[str] = [] - - # Subclasses use possible names of Fortran 77 compiler - f77_names: List[str] = [] - - # Subclasses use possible names of Fortran 90 compiler - fc_names: List[str] = [] - # Optional prefix regexes for searching for this type of compiler. # Prefixes are sometimes used for toolchains prefixes: List[str] = [] @@ -427,14 +415,19 @@ def implicit_rpaths(self) -> List[str]: return list(paths_containing_libs(link_dirs, all_required_libs)) @property - def default_libc(self) -> Optional["spack.spec.Spec"]: - """Determine libc targeted by the compiler from link line""" + def default_dynamic_linker(self) -> Optional[str]: + """Determine default dynamic linker from compiler link line""" output = self.compiler_verbose_output if not output: return None - dynamic_linker = spack.util.libc.parse_dynamic_linker(output) + return spack.util.libc.parse_dynamic_linker(output) + + @property + def default_libc(self) -> Optional["spack.spec.Spec"]: + """Determine libc targeted by the compiler from link line""" + dynamic_linker = self.default_dynamic_linker if not dynamic_linker: return None @@ -619,18 +612,6 @@ def extract_version_from_output(cls, output): def cc_version(cls, cc): return cls.default_version(cc) - @classmethod - def cxx_version(cls, cxx): - return cls.default_version(cxx) - - @classmethod - def f77_version(cls, f77): - return cls.default_version(f77) - - @classmethod - def fc_version(cls, fc): - return cls.default_version(fc) - @classmethod def search_regexps(cls, language): # Compile all the regular expressions used for files beforehand. diff --git a/lib/spack/spack/compilers/__init__.py b/lib/spack/spack/compilers/__init__.py index aec829cd0173ef..bfb781685f834a 100644 --- a/lib/spack/spack/compilers/__init__.py +++ b/lib/spack/spack/compilers/__init__.py @@ -8,6 +8,7 @@ """ import importlib import os +import re import sys import warnings from typing import Dict, List, Optional @@ -25,7 +26,6 @@ import spack.platforms import spack.repo import spack.spec -import spack.version from spack.operating_systems import windows_os from spack.util.environment import get_path from spack.util.naming import mod_to_class @@ -558,7 +558,7 @@ def get_compilers(config, cspec=None, arch_spec=None): except KeyError: # TODO: Check if this exception handling makes sense, or if we # TODO: need to change / refactor tests - family = arch_spec.target + family = str(arch_spec.target) except AttributeError: assert arch_spec is None @@ -632,37 +632,34 @@ def is_mixed_toolchain(compiler): Args: compiler (spack.compiler.Compiler): a valid compiler object """ - cc = os.path.basename(compiler.cc or "") - cxx = os.path.basename(compiler.cxx or "") - f77 = os.path.basename(compiler.f77 or "") - fc = os.path.basename(compiler.fc or "") + import spack.detection.path + + executables = [ + os.path.basename(compiler.cc or ""), + os.path.basename(compiler.cxx or ""), + os.path.basename(compiler.f77 or ""), + os.path.basename(compiler.fc or ""), + ] toolchains = set() - for compiler_cls in all_compiler_types(): - # Inspect all the compiler toolchain we know. If a compiler is the - # only compiler supported there it belongs to that toolchain. - def name_matches(name, name_list): - # This is such that 'gcc' matches variations - # like 'ggc-9' etc that are found in distros - name, _, _ = name.partition("-") - return len(name_list) == 1 and name and name in name_list - - if any( - [ - name_matches(cc, compiler_cls.cc_names), - name_matches(cxx, compiler_cls.cxx_names), - name_matches(f77, compiler_cls.f77_names), - name_matches(fc, compiler_cls.fc_names), - ] - ): - tty.debug("[TOOLCHAIN] MATCH {0}".format(compiler_cls.__name__)) - toolchains.add(compiler_cls.__name__) + finder = spack.detection.path.ExecutablesFinder() + + for pkg_name in spack.repo.PATH.packages_with_tags(COMPILER_TAG): + pkg_cls = spack.repo.PATH.get_pkg_class(pkg_name) + patterns = finder.search_patterns(pkg=pkg_cls) + if not patterns: + continue + joined_pattern = re.compile(r"|".join(patterns)) + + if any(joined_pattern.search(exe) for exe in executables): + tty.debug(f"[TOOLCHAIN] MATCH {pkg_name}") + toolchains.add(pkg_name) if len(toolchains) > 1: if ( - toolchains == set(["Clang", "AppleClang", "Aocc"]) + toolchains == {"llvm", "apple-clang", "aocc"} # Msvc toolchain uses Intel ifx - or toolchains == set(["Msvc", "Dpcpp", "Oneapi"]) + or toolchains == {"msvc", "intel-oneapi-compilers"} ): return False tty.debug("[TOOLCHAINS] {0}".format(toolchains)) @@ -806,12 +803,11 @@ def _extract_os_and_target(spec: "spack.spec.Spec"): if not spec.architecture: host_platform = spack.platforms.host() operating_system = host_platform.operating_system("default_os") - target = host_platform.target("default_target").microarchitecture + target = host_platform.target("default_target") else: target = spec.architecture.target if not target: target = spack.platforms.host().target("default_target") - target = target.microarchitecture operating_system = spec.os if not operating_system: diff --git a/lib/spack/spack/compilers/aocc.py b/lib/spack/spack/compilers/aocc.py index 26e0b7d893cb19..7ac861c745733d 100644 --- a/lib/spack/spack/compilers/aocc.py +++ b/lib/spack/spack/compilers/aocc.py @@ -13,18 +13,6 @@ class Aocc(Compiler): - # Subclasses use possible names of C compiler - cc_names = ["clang"] - - # Subclasses use possible names of C++ compiler - cxx_names = ["clang++"] - - # Subclasses use possible names of Fortran 77 compiler - f77_names = ["flang"] - - # Subclasses use possible names of Fortran 90 compiler - fc_names = ["flang"] - version_argument = "--version" @property diff --git a/lib/spack/spack/compilers/apple_clang.py b/lib/spack/spack/compilers/apple_clang.py index 9201b164027e48..7537620709ac2e 100644 --- a/lib/spack/spack/compilers/apple_clang.py +++ b/lib/spack/spack/compilers/apple_clang.py @@ -8,7 +8,6 @@ import spack.compiler import spack.compilers.clang -import spack.util.executable from spack.version import Version diff --git a/lib/spack/spack/compilers/arm.py b/lib/spack/spack/compilers/arm.py index 3bf40aec200519..84e661337bddd8 100644 --- a/lib/spack/spack/compilers/arm.py +++ b/lib/spack/spack/compilers/arm.py @@ -9,18 +9,6 @@ class Arm(spack.compiler.Compiler): - # Subclasses use possible names of C compiler - cc_names = ["armclang"] - - # Subclasses use possible names of C++ compiler - cxx_names = ["armclang++"] - - # Subclasses use possible names of Fortran 77 compiler - f77_names = ["armflang"] - - # Subclasses use possible names of Fortran 90 compiler - fc_names = ["armflang"] - # Named wrapper links within lib/spack/env link_paths = { "cc": os.path.join("arm", "armclang"), @@ -90,11 +78,3 @@ def fc_pic_flag(self): return "-fPIC" required_libs = ["libclang", "libflang"] - - @classmethod - def fc_version(cls, fc): - return cls.default_version(fc) - - @classmethod - def f77_version(cls, f77): - return cls.fc_version(f77) diff --git a/lib/spack/spack/compilers/cce.py b/lib/spack/spack/compilers/cce.py index ae3d9889a3a892..7082ffa3c98e82 100644 --- a/lib/spack/spack/compilers/cce.py +++ b/lib/spack/spack/compilers/cce.py @@ -19,18 +19,6 @@ def __init__(self, *args, **kwargs): if not self.is_clang_based: self.version_argument = "-V" - # Subclasses use possible names of C compiler - cc_names = ["craycc"] - - # Subclasses use possible names of C++ compiler - cxx_names = ["crayCC"] - - # Subclasses use possible names of Fortran 77 compiler - f77_names = ["crayftn"] - - # Subclasses use possible names of Fortran 90 compiler - fc_names = ["crayftn"] - # MacPorts builds gcc versions with prefixes and -mp-X.Y suffixes. suffixes = [r"-mp-\d\.\d"] diff --git a/lib/spack/spack/compilers/clang.py b/lib/spack/spack/compilers/clang.py index 577586cda110d4..98e00aa270f8a8 100644 --- a/lib/spack/spack/compilers/clang.py +++ b/lib/spack/spack/compilers/clang.py @@ -31,18 +31,6 @@ class Clang(Compiler): - # Subclasses use possible names of C compiler - cc_names = ["clang"] - - # Subclasses use possible names of C++ compiler - cxx_names = ["clang++"] - - # Subclasses use possible names of Fortran 77 compiler - f77_names = ["flang-new", "flang"] - - # Subclasses use possible names of Fortran 90 compiler - fc_names = ["flang-new", "flang"] - version_argument = "--version" @property diff --git a/lib/spack/spack/compilers/fj.py b/lib/spack/spack/compilers/fj.py index a9df7d2c23cfe9..54fa832fd70a81 100644 --- a/lib/spack/spack/compilers/fj.py +++ b/lib/spack/spack/compilers/fj.py @@ -9,18 +9,6 @@ class Fj(spack.compiler.Compiler): - # Subclasses use possible names of C compiler - cc_names = ["fcc"] - - # Subclasses use possible names of C++ compiler - cxx_names = ["FCC"] - - # Subclasses use possible names of Fortran 77 compiler - f77_names = ["frt"] - - # Subclasses use possible names of Fortran 90 compiler - fc_names = ["frt"] - # Named wrapper links within build_env_path link_paths = { "cc": os.path.join("fj", "fcc"), diff --git a/lib/spack/spack/compilers/gcc.py b/lib/spack/spack/compilers/gcc.py index 40ae01266b05c2..0b0450187d8774 100644 --- a/lib/spack/spack/compilers/gcc.py +++ b/lib/spack/spack/compilers/gcc.py @@ -4,7 +4,6 @@ # SPDX-License-Identifier: (Apache-2.0 OR MIT) import os -import re from llnl.util.filesystem import ancestor @@ -15,18 +14,6 @@ class Gcc(spack.compiler.Compiler): - # Subclasses use possible names of C compiler - cc_names = ["gcc"] - - # Subclasses use possible names of C++ compiler - cxx_names = ["g++"] - - # Subclasses use possible names of Fortran 77 compiler - f77_names = ["gfortran"] - - # Subclasses use possible names of Fortran 90 compiler - fc_names = ["gfortran"] - # MacPorts builds gcc versions with prefixes and -mp-X or -mp-X.Y suffixes. # Homebrew and Linuxbrew may build gcc with -X, -X.Y suffixes. # Old compatibility versions may contain XY suffixes. @@ -181,40 +168,6 @@ def default_version(cls, cc): version = cls.extract_version_from_output(output) return version - @classmethod - def fc_version(cls, fc): - """Older versions of gfortran use the ``-dumpversion`` option. - Output looks like this:: - - GNU Fortran (GCC) 4.4.7 20120313 (Red Hat 4.4.7-18) - Copyright (C) 2010 Free Software Foundation, Inc. - - or:: - - 4.8.5 - - In GCC 7, this option was changed to only return the major - version of the compiler:: - - 7 - - A new ``-dumpfullversion`` option was added that gives us - what we want:: - - 7.2.0 - """ - output = spack.compiler.get_compiler_version_output(fc, "-dumpversion") - match = re.search(r"(?:GNU Fortran \(GCC\) )?([\d.]+)", output) - version = match.group(match.lastindex) if match else "unknown" - if Version(version) >= Version("7"): - output = spack.compiler.get_compiler_version_output(fc, "-dumpfullversion") - version = cls.extract_version_from_output(output) - return version - - @classmethod - def f77_version(cls, f77): - return cls.fc_version(f77) - @property def stdcxx_libs(self): return ("-lstdc++",) diff --git a/lib/spack/spack/compilers/intel.py b/lib/spack/spack/compilers/intel.py index 1e8ad20afa8f59..4990da3cb06aa5 100644 --- a/lib/spack/spack/compilers/intel.py +++ b/lib/spack/spack/compilers/intel.py @@ -11,18 +11,6 @@ class Intel(Compiler): - # Subclasses use possible names of C compiler - cc_names = ["icc"] - - # Subclasses use possible names of C++ compiler - cxx_names = ["icpc"] - - # Subclasses use possible names of Fortran 77 compiler - f77_names = ["ifort"] - - # Subclasses use possible names of Fortran 90 compiler - fc_names = ["ifort"] - # Named wrapper links within build_env_path link_paths = { "cc": os.path.join("intel", "icc"), @@ -104,6 +92,14 @@ def c11_flag(self): else: return "-std=c1x" + @property + def c18_flag(self): + # c18 supported since oneapi 2022, which is classic version 2021.5.0 + if self.real_version < Version("21.5.0"): + raise UnsupportedCompilerFlag(self, "the C18 standard", "c18_flag", "< 21.5.0") + else: + return "-std=c18" + @property def cc_pic_flag(self): return "-fPIC" diff --git a/lib/spack/spack/compilers/msvc.py b/lib/spack/spack/compilers/msvc.py index e74bb4e307afaf..c3e9e13d71ea90 100644 --- a/lib/spack/spack/compilers/msvc.py +++ b/lib/spack/spack/compilers/msvc.py @@ -8,7 +8,7 @@ import subprocess import sys import tempfile -from typing import Dict, List +from typing import Dict import archspec.cpu @@ -117,18 +117,6 @@ def get_valid_fortran_pth(): class Msvc(Compiler): - # Subclasses use possible names of C compiler - cc_names: List[str] = ["cl"] - - # Subclasses use possible names of C++ compiler - cxx_names: List[str] = ["cl"] - - # Subclasses use possible names of Fortran 77 compiler - f77_names: List[str] = ["ifx"] - - # Subclasses use possible names of Fortran 90 compiler - fc_names: List[str] = ["ifx"] - # Named wrapper links within build_env_path # Due to the challenges of supporting compiler wrappers # in Windows, we leave these blank, and dynamically compute @@ -305,6 +293,17 @@ def platform_toolset_ver(self): vs22_toolset = Version(toolset_ver) > Version("142") return toolset_ver if not vs22_toolset else "143" + @property + def visual_studio_version(self): + """The four digit Visual Studio version (i.e. 2019 or 2022) + + Note: This differs from the msvc version or toolset version as + those properties track the compiler and build tools version + respectively, whereas this tracks the VS release associated + with a given MSVC compiler. + """ + return re.search(r"[0-9]{4}", self.cc).group(0) + def _compiler_version(self, compiler): """Returns version object for given compiler""" # ignore_errors below is true here due to ifx's @@ -393,7 +392,3 @@ def fc_version(cls, fc): ) clp = spack.util.executable.which_string("cl", path=sps) return cls.default_version(clp) if clp else fc_ver - - @classmethod - def f77_version(cls, f77): - return cls.fc_version(f77) diff --git a/lib/spack/spack/compilers/nag.py b/lib/spack/spack/compilers/nag.py index 6040b74a149ead..4c735c35624971 100644 --- a/lib/spack/spack/compilers/nag.py +++ b/lib/spack/spack/compilers/nag.py @@ -5,7 +5,6 @@ import os import re -from typing import List import llnl.util.lang @@ -13,18 +12,6 @@ class Nag(spack.compiler.Compiler): - # Subclasses use possible names of C compiler - cc_names: List[str] = [] - - # Subclasses use possible names of C++ compiler - cxx_names: List[str] = [] - - # Subclasses use possible names of Fortran 77 compiler - f77_names = ["nagfor"] - - # Subclasses use possible names of Fortran 90 compiler - fc_names = ["nagfor"] - # Named wrapper links within build_env_path # Use default wrappers for C and C++, in case provided in compilers.yaml link_paths = { diff --git a/lib/spack/spack/compilers/nvhpc.py b/lib/spack/spack/compilers/nvhpc.py index 813d14a6c2df5b..9031ee8fc35c32 100644 --- a/lib/spack/spack/compilers/nvhpc.py +++ b/lib/spack/spack/compilers/nvhpc.py @@ -9,18 +9,6 @@ class Nvhpc(Compiler): - # Subclasses use possible names of C compiler - cc_names = ["nvc"] - - # Subclasses use possible names of C++ compiler - cxx_names = ["nvc++"] - - # Subclasses use possible names of Fortran 77 compiler - f77_names = ["nvfortran"] - - # Subclasses use possible names of Fortran 90 compiler - fc_names = ["nvfortran"] - # Named wrapper links within build_env_path link_paths = { "cc": os.path.join("nvhpc", "nvc"), diff --git a/lib/spack/spack/compilers/oneapi.py b/lib/spack/spack/compilers/oneapi.py index e8edc227d8a35a..ee279433c321a4 100644 --- a/lib/spack/spack/compilers/oneapi.py +++ b/lib/spack/spack/compilers/oneapi.py @@ -13,18 +13,6 @@ class Oneapi(Compiler): - # Subclasses use possible names of C compiler - cc_names = ["icx"] - - # Subclasses use possible names of C++ compiler - cxx_names = ["icpx"] - - # Subclasses use possible names of Fortran 77 compiler - f77_names = ["ifx"] - - # Subclasses use possible names of Fortran 90 compiler - fc_names = ["ifx"] - # Named wrapper links within build_env_path link_paths = { "cc": os.path.join("oneapi", "icx"), diff --git a/lib/spack/spack/compilers/pgi.py b/lib/spack/spack/compilers/pgi.py index 1dd7eeed42a7cd..bb7f290be3bb7c 100644 --- a/lib/spack/spack/compilers/pgi.py +++ b/lib/spack/spack/compilers/pgi.py @@ -10,18 +10,6 @@ class Pgi(Compiler): - # Subclasses use possible names of C compiler - cc_names = ["pgcc"] - - # Subclasses use possible names of C++ compiler - cxx_names = ["pgc++", "pgCC"] - - # Subclasses use possible names of Fortran 77 compiler - f77_names = ["pgfortran", "pgf77"] - - # Subclasses use possible names of Fortran 90 compiler - fc_names = ["pgfortran", "pgf95", "pgf90"] - # Named wrapper links within build_env_path link_paths = { "cc": os.path.join("pgi", "pgcc"), diff --git a/lib/spack/spack/compilers/rocmcc.py b/lib/spack/spack/compilers/rocmcc.py index 5dc8d1c1d30590..04c3456066afd2 100644 --- a/lib/spack/spack/compilers/rocmcc.py +++ b/lib/spack/spack/compilers/rocmcc.py @@ -11,18 +11,6 @@ class Rocmcc(spack.compilers.clang.Clang): - # Subclasses use possible names of C compiler - cc_names = ["amdclang"] - - # Subclasses use possible names of C++ compiler - cxx_names = ["amdclang++"] - - # Subclasses use possible names of Fortran 77 compiler - f77_names = ["amdflang"] - - # Subclasses use possible names of Fortran 90 compiler - fc_names = ["amdflang"] - @property def link_paths(self): link_paths = { @@ -61,14 +49,6 @@ def extract_version_from_output(cls, output): if match: return ".".join(match.groups()) - @classmethod - def fc_version(cls, fortran_compiler): - return cls.default_version(fortran_compiler) - - @classmethod - def f77_version(cls, f77): - return cls.fc_version(f77) - @property def stdcxx_libs(self): return ("-lstdc++",) diff --git a/lib/spack/spack/compilers/xl.py b/lib/spack/spack/compilers/xl.py index 1c1be0e41b4378..f3232e5807ef69 100644 --- a/lib/spack/spack/compilers/xl.py +++ b/lib/spack/spack/compilers/xl.py @@ -10,18 +10,6 @@ class Xl(Compiler): - # Subclasses use possible names of C compiler - cc_names = ["xlc"] - - # Subclasses use possible names of C++ compiler - cxx_names = ["xlC", "xlc++"] - - # Subclasses use possible names of Fortran 77 compiler - f77_names = ["xlf"] - - # Subclasses use possible names of Fortran 90 compiler - fc_names = ["xlf90", "xlf95", "xlf2003", "xlf2008"] - # Named wrapper links within build_env_path link_paths = { "cc": os.path.join("xl", "xlc"), @@ -103,31 +91,3 @@ def fflags(self): # For Fortran 90 and beyond, it is set by default and has not impact. # Its use has no negative side effects. return "-qzerosize" - - @classmethod - def fc_version(cls, fc): - # The fortran and C/C++ versions of the XL compiler are always - # two units apart. By this we mean that the fortran release that - # goes with XL C/C++ 11.1 is 13.1. Having such a difference in - # version number is confusing spack quite a lot. Most notably - # if you keep the versions as is the default xl compiler will - # only have fortran and no C/C++. So we associate the Fortran - # compiler with the version associated to the C/C++ compiler. - # One last stumble. Version numbers over 10 have at least a .1 - # those under 10 a .0. There is no xlf 9.x or under currently - # available. BG/P and BG/L can such a compiler mix and possibly - # older version of AIX and linux on power. - fortran_version = cls.default_version(fc) - if fortran_version >= 16: - # Starting with version 16.1, the XL C and Fortran compilers - # have the same version. So no need to downgrade the Fortran - # compiler version to match that of the C compiler version. - return str(fortran_version) - c_version = float(fortran_version) - 2 - if c_version < 10: - c_version = c_version - 0.1 - return str(c_version) - - @classmethod - def f77_version(cls, f77): - return cls.fc_version(f77) diff --git a/lib/spack/spack/compilers/xl_r.py b/lib/spack/spack/compilers/xl_r.py index 15bcb7234f89b3..7a3007a9c4439a 100644 --- a/lib/spack/spack/compilers/xl_r.py +++ b/lib/spack/spack/compilers/xl_r.py @@ -9,18 +9,6 @@ class XlR(spack.compilers.xl.Xl): - # Subclasses use possible names of C compiler - cc_names = ["xlc_r"] - - # Subclasses use possible names of C++ compiler - cxx_names = ["xlC_r", "xlc++_r"] - - # Subclasses use possible names of Fortran 77 compiler - f77_names = ["xlf_r"] - - # Subclasses use possible names of Fortran 90 compiler - fc_names = ["xlf90_r", "xlf95_r", "xlf2003_r", "xlf2008_r"] - # Named wrapper links within build_env_path link_paths = { "cc": os.path.join("xl_r", "xlc_r"), diff --git a/lib/spack/spack/concretize.py b/lib/spack/spack/concretize.py index b8e61d53810780..387c7f2de27efd 100644 --- a/lib/spack/spack/concretize.py +++ b/lib/spack/spack/concretize.py @@ -8,46 +8,26 @@ from contextlib import contextmanager from itertools import chain -import spack.compilers import spack.config -import spack.environment import spack.error -import spack.platforms -import spack.repo -import spack.spec -import spack.target -import spack.tengine -import spack.util.path - -class Concretizer: - """(DEPRECATED) Only contains logic to enable/disable compiler existence checks.""" - - #: Controls whether we check that compiler versions actually exist - #: during concretization. Used for testing and for mirror creation - check_for_compiler_existence = None - - def __init__(self): - if Concretizer.check_for_compiler_existence is None: - Concretizer.check_for_compiler_existence = not spack.config.get( - "config:install_missing_compilers", False - ) +CHECK_COMPILER_EXISTENCE = True @contextmanager def disable_compiler_existence_check(): - saved = Concretizer.check_for_compiler_existence - Concretizer.check_for_compiler_existence = False + global CHECK_COMPILER_EXISTENCE + CHECK_COMPILER_EXISTENCE, saved = False, CHECK_COMPILER_EXISTENCE yield - Concretizer.check_for_compiler_existence = saved + CHECK_COMPILER_EXISTENCE = saved @contextmanager def enable_compiler_existence_check(): - saved = Concretizer.check_for_compiler_existence - Concretizer.check_for_compiler_existence = True + global CHECK_COMPILER_EXISTENCE + CHECK_COMPILER_EXISTENCE, saved = True, CHECK_COMPILER_EXISTENCE yield - Concretizer.check_for_compiler_existence = saved + CHECK_COMPILER_EXISTENCE = saved def find_spec(spec, condition, default=None): diff --git a/lib/spack/spack/config.py b/lib/spack/spack/config.py index 2626a28330c80b..a8b8d0b49d16d2 100644 --- a/lib/spack/spack/config.py +++ b/lib/spack/spack/config.py @@ -39,6 +39,7 @@ from llnl.util import filesystem, lang, tty +import spack.error import spack.paths import spack.platforms import spack.schema @@ -48,17 +49,19 @@ import spack.schema.compilers import spack.schema.concretizer import spack.schema.config +import spack.schema.definitions +import spack.schema.develop import spack.schema.env import spack.schema.mirrors import spack.schema.modules import spack.schema.packages import spack.schema.repos import spack.schema.upstreams +import spack.schema.view # Hacked yaml for configuration files preserves line numbers. import spack.util.spack_yaml as syaml import spack.util.web as web_util -from spack.error import SpackError from spack.util.cpus import cpus_available #: Dict from section names -> schema for that section @@ -167,7 +170,7 @@ def get_section(self, section: str) -> Optional[YamlConfigDict]: def _write_section(self, section: str) -> None: if not self.writable: - raise ConfigError(f"Cannot write to immutable scope {self}") + raise spack.error.ConfigError(f"Cannot write to immutable scope {self}") filename = self.get_section_filename(section) data = self.get_section(section) @@ -282,7 +285,7 @@ def get_section(self, section: str) -> Optional[YamlConfigDict]: def _write_section(self, section: str) -> None: if not self.writable: - raise ConfigError(f"Cannot write to immutable scope {self}") + raise spack.error.ConfigError(f"Cannot write to immutable scope {self}") data_to_write: Optional[YamlConfigDict] = self._raw_data # If there is no existing data, this section SingleFileScope has never @@ -709,7 +712,7 @@ def print_section(self, section: str, blame: bool = False, *, scope=None) -> Non data[section] = self.get_config(section, scope=scope) syaml.dump_config(data, stream=sys.stdout, default_flow_style=False, blame=blame) except (syaml.SpackYAMLError, OSError) as e: - raise ConfigError(f"cannot read '{section}' configuration") from e + raise spack.error.ConfigError(f"cannot read '{section}' configuration") from e @property def _non_platform_scopes(self): @@ -814,7 +817,7 @@ def _add_command_line_scopes( _add_platform_scopes(cfg, name, path, writable=False) continue else: - raise ConfigError(f"Invalid configuration scope: {path}") + raise spack.error.ConfigError(f"Invalid configuration scope: {path}") for scope in manifest.env_config_scopes: scope.name = f"{name}:{scope.name}" @@ -1026,7 +1029,7 @@ def change_or_add( if found: update_fn(section) - spack.config.set(section_name, section, scope=scope) + CONFIG.set(section_name, section, scope=scope) return # If no scope meets the criteria specified by ``find_fn``, @@ -1039,14 +1042,14 @@ def change_or_add( break if found: - spack.config.set(section_name, section, scope=scope) + CONFIG.set(section_name, section, scope=scope) return # If no scopes define any config for the named section, then # modify the highest-priority scope. scope, section = configs_by_section[0] update_fn(section) - spack.config.set(section_name, section, scope=scope) + CONFIG.set(section_name, section, scope=scope) def update_all(section_name: str, change_fn: Callable[[str], bool]) -> None: @@ -1058,7 +1061,7 @@ def update_all(section_name: str, change_fn: Callable[[str], bool]) -> None: for scope, section in configs_by_section: modified = change_fn(section) if modified: - spack.config.set(section_name, section, scope=scope) + CONFIG.set(section_name, section, scope=scope) def _validate_section_name(section: str) -> None: @@ -1232,7 +1235,7 @@ def get_valid_type(path): return types[schema_type]() else: return type(None) - raise ConfigError(f"Cannot determine valid type for path '{path}'.") + raise spack.error.ConfigError(f"Cannot determine valid type for path '{path}'.") def remove_yaml(dest, source): @@ -1275,7 +1278,7 @@ def they_are(t): unmerge = sk in dest old_dest_value = dest.pop(sk, None) - if unmerge and not spack.config._override(sk): + if unmerge and not _override(sk): dest[sk] = remove_yaml(old_dest_value, sv) return dest @@ -1712,25 +1715,37 @@ def get_mark_from_yaml_data(obj): return mark -def parse_spec_from_yaml_string(string: str) -> "spack.spec.Spec": - """Parse a spec from YAML and add file/line info to errors, if it's available. +def determine_number_of_jobs( + *, + parallel: bool = False, + max_cpus: int = cpus_available(), + config: Optional[Configuration] = None, +) -> int: + """ + Packages that require sequential builds need 1 job. Otherwise we use the + number of jobs set on the command line. If not set, then we use the config + defaults (which is usually set through the builtin config scope), but we + cap to the number of CPUs available to avoid oversubscription. + + Parameters: + parallel: true when package supports parallel builds + max_cpus: maximum number of CPUs to use (defaults to cpus_available()) + config: configuration object (defaults to global config) + """ + if not parallel: + return 1 - Parse a ``Spec`` from the supplied string, but also intercept any syntax errors and - add file/line information for debugging using file/line annotations from the string. + cfg = config or CONFIG - Arguments: - string: a string representing a ``Spec`` from config YAML. - - """ + # Command line overrides all try: - spec = spack.spec.Spec(string) - return spec - except spack.parser.SpecSyntaxError as e: - mark = spack.config.get_mark_from_yaml_data(string) - if mark: - msg = f"{mark.name}:{mark.line + 1}: {str(e)}" - raise spack.parser.SpecSyntaxError(msg) from e - raise e + command_line = cfg.get("config:build_jobs", default=None, scope="command_line") + if command_line is not None: + return command_line + except ValueError: + pass + + return min(max_cpus, cfg.get("config:build_jobs", 16)) def platform_scopes(name: str, path: str, writable: bool = True) -> Sequence[DirectoryConfigScope]: @@ -1756,19 +1771,15 @@ def platform_scopes(name: str, path: str, writable: bool = True) -> Sequence[Dir return scopes -class ConfigError(SpackError): - """Superclass for all Spack config related errors.""" - - -class ConfigSectionError(ConfigError): +class ConfigSectionError(spack.error.ConfigError): """Error for referring to a bad config section name in a configuration.""" -class ConfigFileError(ConfigError): +class ConfigFileError(spack.error.ConfigError): """Issue reading or accessing a configuration file.""" -class ConfigFormatError(ConfigError): +class ConfigFormatError(spack.error.ConfigError): """Raised when a configuration format does not match its schema.""" def __init__( diff --git a/lib/spack/spack/container/writers/__init__.py b/lib/spack/spack/container/writers.py similarity index 86% rename from lib/spack/spack/container/writers/__init__.py rename to lib/spack/spack/container/writers.py index cf186b57645cd1..0b5d14157c71de 100644 --- a/lib/spack/spack/container/writers/__init__.py +++ b/lib/spack/spack/container/writers.py @@ -6,6 +6,7 @@ convenience functions. """ import copy +import shlex from collections import namedtuple from typing import Optional @@ -15,7 +16,7 @@ import spack.tengine as tengine import spack.util.spack_yaml as syaml -from ..images import ( +from .images import ( bootstrap_template_for, build_info, checkout_command, @@ -308,8 +309,54 @@ def __call__(self): return t.render(**self.to_dict()) -import spack.container.writers.docker # noqa: E402 +@writer("docker") +class DockerContext(PathContext): + """Context used to instantiate a Dockerfile""" -# Import after function definition all the modules in this package, -# so that registration of writers will happen automatically -import spack.container.writers.singularity # noqa: E402 + #: Name of the template used for Dockerfiles + template_name = "container/Dockerfile" + + @tengine.context_property + def manifest(self): + manifest_str = super().manifest + # Docker doesn't support HEREDOC, so we need to resort to + # a horrible echo trick to have the manifest in the Dockerfile + echoed_lines = [] + for idx, line in enumerate(manifest_str.split("\n")): + quoted_line = shlex.quote(line) + if idx == 0: + echoed_lines.append("&& (echo " + quoted_line + " \\") + continue + echoed_lines.append("&& echo " + quoted_line + " \\") + + echoed_lines[-1] = echoed_lines[-1].replace(" \\", ")") + + return "\n".join(echoed_lines) + + +@writer("singularity") +class SingularityContext(PathContext): + """Context used to instantiate a Singularity definition file""" + + #: Name of the template used for Singularity definition files + template_name = "container/singularity.def" + + @property + def singularity_config(self): + return self.container_config.get("singularity", {}) + + @tengine.context_property + def runscript(self): + return self.singularity_config.get("runscript", "") + + @tengine.context_property + def startscript(self): + return self.singularity_config.get("startscript", "") + + @tengine.context_property + def test(self): + return self.singularity_config.get("test", "") + + @tengine.context_property + def help(self): + return self.singularity_config.get("help", "") diff --git a/lib/spack/spack/container/writers/docker.py b/lib/spack/spack/container/writers/docker.py deleted file mode 100644 index 287ef9d1ac79cc..00000000000000 --- a/lib/spack/spack/container/writers/docker.py +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other -# Spack Project Developers. See the top-level COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) -import shlex - -import spack.tengine as tengine - -from . import PathContext, writer - - -@writer("docker") -class DockerContext(PathContext): - """Context used to instantiate a Dockerfile""" - - #: Name of the template used for Dockerfiles - template_name = "container/Dockerfile" - - @tengine.context_property - def manifest(self): - manifest_str = super().manifest - # Docker doesn't support HEREDOC, so we need to resort to - # a horrible echo trick to have the manifest in the Dockerfile - echoed_lines = [] - for idx, line in enumerate(manifest_str.split("\n")): - quoted_line = shlex.quote(line) - if idx == 0: - echoed_lines.append("&& (echo " + quoted_line + " \\") - continue - echoed_lines.append("&& echo " + quoted_line + " \\") - - echoed_lines[-1] = echoed_lines[-1].replace(" \\", ")") - - return "\n".join(echoed_lines) diff --git a/lib/spack/spack/container/writers/singularity.py b/lib/spack/spack/container/writers/singularity.py deleted file mode 100644 index 5cbb055fd3fd5f..00000000000000 --- a/lib/spack/spack/container/writers/singularity.py +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other -# Spack Project Developers. See the top-level COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) -import spack.tengine as tengine - -from . import PathContext, writer - - -@writer("singularity") -class SingularityContext(PathContext): - """Context used to instantiate a Singularity definition file""" - - #: Name of the template used for Singularity definition files - template_name = "container/singularity.def" - - @property - def singularity_config(self): - return self.container_config.get("singularity", {}) - - @tengine.context_property - def runscript(self): - return self.singularity_config.get("runscript", "") - - @tengine.context_property - def startscript(self): - return self.singularity_config.get("startscript", "") - - @tengine.context_property - def test(self): - return self.singularity_config.get("test", "") - - @tengine.context_property - def help(self): - return self.singularity_config.get("help", "") diff --git a/lib/spack/spack/cray_manifest.py b/lib/spack/spack/cray_manifest.py index f71cf272b62b8d..41767bdf0649fa 100644 --- a/lib/spack/spack/cray_manifest.py +++ b/lib/spack/spack/cray_manifest.py @@ -132,7 +132,7 @@ def spec_from_entry(entry): variant_strs = list() for name, value in entry["parameters"].items(): # TODO: also ensure that the variant value is valid? - if not (name in pkg_cls.variants): + if not pkg_cls.has_variant(name): tty.debug( "Omitting variant {0} for entry {1}/{2}".format( name, entry["name"], entry["hash"][:7] diff --git a/lib/spack/spack/database.py b/lib/spack/spack/database.py index 5d19f73f6b81c6..907b73c5db71a6 100644 --- a/lib/spack/spack/database.py +++ b/lib/spack/spack/database.py @@ -50,6 +50,7 @@ pass import llnl.util.filesystem as fs +import llnl.util.lang import llnl.util.tty as tty import spack.deptypes as dt @@ -121,6 +122,17 @@ ) +@llnl.util.lang.memoized +def _getfqdn(): + """Memoized version of `getfqdn()`. + + If we call `getfqdn()` too many times, DNS can be very slow. We only need to call it + one time per process, so we cache it here. + + """ + return socket.getfqdn() + + def reader(version: vn.StandardVersion) -> Type["spack.spec.SpecfileReaderBase"]: reader_cls = { vn.Version("5"): spack.spec.SpecfileV1, @@ -207,12 +219,12 @@ class InstallRecord: def __init__( self, spec: "spack.spec.Spec", - path: str, + path: Optional[str], installed: bool, ref_count: int = 0, explicit: bool = False, installation_time: Optional[float] = None, - deprecated_for: Optional["spack.spec.Spec"] = None, + deprecated_for: Optional[str] = None, in_buildcache: bool = False, origin=None, ): @@ -845,7 +857,7 @@ def check(cond, msg): ): tty.warn(f"Spack database version changed from {version} to {_DB_VERSION}. Upgrading.") - self.reindex(spack.store.STORE.layout) + self.reindex() installs = dict( (k, v.to_dict(include_fields=self._record_fields)) for k, v in self._data.items() ) @@ -918,8 +930,6 @@ def reindex(self): if self.is_upstream: raise UpstreamDatabaseLockingError("Cannot reindex an upstream database") - error: Optional[CorruptDatabaseError] = None - # Special transaction to avoid recursive reindex calls and to # ignore errors if we need to rebuild a corrupt database. def _read_suppress_error(): @@ -927,99 +937,116 @@ def _read_suppress_error(): if os.path.isfile(self._index_path): self._read_from_file(self._index_path) except CorruptDatabaseError as e: - nonlocal error - error = e + tty.warn(f"Reindexing corrupt database, error was: {e}") self._data = {} self._installed_prefixes = set() - transaction = lk.WriteTransaction( - self.lock, acquire=_read_suppress_error, release=self._write - ) - - with transaction: - if error is not None: - tty.warn(f"Spack database was corrupt. Will rebuild. Error was: {error}") - - old_data = self._data - old_installed_prefixes = self._installed_prefixes + with lk.WriteTransaction(self.lock, acquire=_read_suppress_error, release=self._write): + old_installed_prefixes, self._installed_prefixes = self._installed_prefixes, set() + old_data, self._data = self._data, {} try: - self._construct_from_directory_layout(old_data) + self._reindex(old_data) except BaseException: # If anything explodes, restore old data, skip write. self._data = old_data self._installed_prefixes = old_installed_prefixes raise - def _construct_entry_from_directory_layout( - self, - old_data: Dict[str, InstallRecord], - spec: "spack.spec.Spec", - deprecator: Optional["spack.spec.Spec"] = None, - ): - # Try to recover explicit value from old DB, but - # default it to True if DB was corrupt. This is - # just to be conservative in case a command like - # "autoremove" is run by the user after a reindex. - tty.debug(f"Reconstructing from spec file: {spec}") - explicit = True - inst_time = os.stat(spec.prefix).st_ctime - if old_data is not None: - old_info = old_data.get(spec.dag_hash()) - if old_info is not None: - explicit = old_info.explicit - inst_time = old_info.installation_time - - self._add(spec, explicit=explicit, installation_time=inst_time) - if deprecator: - self._deprecate(spec, deprecator) - - def _construct_from_directory_layout(self, old_data: Dict[str, InstallRecord]): - # Read first the spec files in the prefixes. They should be considered authoritative with - # respect to DB reindexing, as entries in the DB may be corrupted in a way that still makes - # them readable. If we considered DB entries authoritative instead, we would perpetuate - # errors over a reindex. - assert self.layout is not None, "Cannot reindex a database without a known layout" - with self.layout.disable_upstream_check(): - # Initialize data in the reconstructed DB - self._data = {} - self._installed_prefixes = set() - - # Start inspecting the installed prefixes - processed_specs = set() - - for spec in self.layout.all_specs(): - self._construct_entry_from_directory_layout(old_data, spec) - processed_specs.add(spec) - - for spec, deprecator in self.layout.all_deprecated_specs(): - self._construct_entry_from_directory_layout(old_data, spec, deprecator) - processed_specs.add(spec) - - for entry in old_data.values(): - # We already took care of this spec using spec file from its prefix. - if entry.spec in processed_specs: - tty.debug( - f"Skipping reconstruction from old db: {entry.spec}" - " [already reconstructed from spec file]" - ) - continue + def _reindex(self, old_data: Dict[str, InstallRecord]): + # Specs on the file system are the source of truth for record.spec. The old database values + # if available are the source of truth for the rest of the record. + assert self.layout, "Database layout must be set to reindex" - # If we arrived here it very likely means that we have external specs that are not - # dependencies of other specs. This may be the case for externally installed - # compilers or externally installed applications. - tty.debug(f"Reconstructing from old db: {entry.spec}") - try: - self._add( - spec=entry.spec, - explicit=entry.explicit, - installation_time=entry.installation_time, - ) - processed_specs.add(entry.spec) - except Exception as e: - # Something went wrong, so the spec was not restored from old data - tty.debug(e) + specs_from_fs = self.layout.all_specs() + deprecated_for = self.layout.deprecated_for(specs_from_fs) - self._check_ref_counts() + known_specs: List[spack.spec.Spec] = [ + *specs_from_fs, + *(deprecated for _, deprecated in deprecated_for), + *(rec.spec for rec in old_data.values()), + ] + + upstream_hashes = { + dag_hash for upstream in self.upstream_dbs for dag_hash in upstream._data + } + upstream_hashes.difference_update(spec.dag_hash() for spec in known_specs) + + def create_node(edge: spack.spec.DependencySpec, is_upstream: bool): + if is_upstream: + return + + self._data[edge.spec.dag_hash()] = InstallRecord( + spec=edge.spec.copy(deps=False), + path=edge.spec.external_path if edge.spec.external else None, + installed=edge.spec.external, + ) + + # Store all nodes of known specs, excluding ones found in upstreams + tr.traverse_breadth_first_with_visitor( + known_specs, + tr.CoverNodesVisitor( + NoUpstreamVisitor(upstream_hashes, create_node), key=tr.by_dag_hash + ), + ) + + # Store the prefix and other information for specs were found on the file system + for s in specs_from_fs: + record = self._data[s.dag_hash()] + record.path = s.prefix + record.installed = True + record.explicit = True # conservative assumption + record.installation_time = os.stat(s.prefix).st_ctime + + # Deprecate specs + for new, old in deprecated_for: + self._data[old.dag_hash()].deprecated_for = new.dag_hash() + + # Copy data we have from the old database + for old_record in old_data.values(): + record = self._data[old_record.spec.dag_hash()] + record.explicit = old_record.explicit + record.installation_time = old_record.installation_time + record.origin = old_record.origin + record.deprecated_for = old_record.deprecated_for + + # Warn when the spec has been removed from the file system (i.e. it was not detected) + if not record.installed and old_record.installed: + tty.warn( + f"Spec {old_record.spec.short_spec} was marked installed in the database " + "but was not found on the file system. It is now marked as missing." + ) + + def create_edge(edge: spack.spec.DependencySpec, is_upstream: bool): + if not edge.parent: + return + parent_record = self._data[edge.parent.dag_hash()] + if is_upstream: + upstream, child_record = self.query_by_spec_hash(edge.spec.dag_hash()) + assert upstream and child_record, "Internal error: upstream spec not found" + else: + child_record = self._data[edge.spec.dag_hash()] + parent_record.spec._add_dependency( + child_record.spec, depflag=edge.depflag, virtuals=edge.virtuals + ) + + # Then store edges + tr.traverse_breadth_first_with_visitor( + known_specs, + tr.CoverEdgesVisitor( + NoUpstreamVisitor(upstream_hashes, create_edge), key=tr.by_dag_hash + ), + ) + + # Finally update the ref counts + for record in self._data.values(): + for dep in record.spec.dependencies(deptype=_TRACKED_DEPENDENCIES): + dep_record = self._data.get(dep.dag_hash()) + if dep_record: # dep might be upstream + dep_record.ref_count += 1 + if record.deprecated_for: + self._data[record.deprecated_for].ref_count += 1 + + self._check_ref_counts() def _check_ref_counts(self): """Ensure consistency of reference counts in the DB. @@ -1028,7 +1055,7 @@ def _check_ref_counts(self): Does no locking. """ - counts = {} + counts: Dict[str, int] = {} for key, rec in self._data.items(): counts.setdefault(key, 0) for dep in rec.spec.dependencies(deptype=_TRACKED_DEPENDENCIES): @@ -1069,7 +1096,7 @@ def _write(self, type, value, traceback): self._state_is_inconsistent = True return - temp_file = self._index_path + (".%s.%s.temp" % (socket.getfqdn(), os.getpid())) + temp_file = self._index_path + (".%s.%s.temp" % (_getfqdn(), os.getpid())) # Write a temporary database file them move it into place try: @@ -1199,7 +1226,7 @@ def _add( for dep in spec.edges_to_dependencies(depflag=_TRACKED_DEPENDENCIES): dkey = dep.spec.dag_hash() upstream, record = self.query_by_spec_hash(dkey) - assert record, f"Missing dependency {dep.spec} in DB" + assert record, f"Missing dependency {dep.spec.short_spec} in DB" new_spec._add_dependency(record.spec, depflag=dep.depflag, virtuals=dep.virtuals) if not upstream: record.ref_count += 1 @@ -1218,7 +1245,7 @@ def _add( self._data[key].explicit = explicit @_autospec - def add(self, spec: "spack.spec.Spec", *, explicit=False) -> None: + def add(self, spec: "spack.spec.Spec", *, explicit: bool = False) -> None: """Add spec at path to database, locking and reading DB to sync. ``add()`` will lock and read from the DB on disk. @@ -1229,7 +1256,7 @@ def add(self, spec: "spack.spec.Spec", *, explicit=False) -> None: with self.write_transaction(): self._add(spec, explicit=explicit) - def _get_matching_spec_key(self, spec, **kwargs): + def _get_matching_spec_key(self, spec: "spack.spec.Spec", **kwargs) -> str: """Get the exact spec OR get a single spec that matches.""" key = spec.dag_hash() upstream, record = self.query_by_spec_hash(key) @@ -1241,12 +1268,12 @@ def _get_matching_spec_key(self, spec, **kwargs): return key @_autospec - def get_record(self, spec, **kwargs): + def get_record(self, spec: "spack.spec.Spec", **kwargs) -> Optional[InstallRecord]: key = self._get_matching_spec_key(spec, **kwargs) upstream, record = self.query_by_spec_hash(key) return record - def _decrement_ref_count(self, spec): + def _decrement_ref_count(self, spec: "spack.spec.Spec") -> None: key = spec.dag_hash() if key not in self._data: @@ -1263,7 +1290,7 @@ def _decrement_ref_count(self, spec): for dep in spec.dependencies(deptype=_TRACKED_DEPENDENCIES): self._decrement_ref_count(dep) - def _increment_ref_count(self, spec): + def _increment_ref_count(self, spec: "spack.spec.Spec") -> None: key = spec.dag_hash() if key not in self._data: @@ -1272,14 +1299,14 @@ def _increment_ref_count(self, spec): rec = self._data[key] rec.ref_count += 1 - def _remove(self, spec): + def _remove(self, spec: "spack.spec.Spec") -> "spack.spec.Spec": """Non-locking version of remove(); does real work.""" key = self._get_matching_spec_key(spec) rec = self._data[key] # This install prefix is now free for other specs to use, even if the # spec is only marked uninstalled. - if not rec.spec.external and rec.installed: + if not rec.spec.external and rec.installed and rec.path: self._installed_prefixes.remove(rec.path) if rec.ref_count > 0: @@ -1303,7 +1330,7 @@ def _remove(self, spec): return rec.spec @_autospec - def remove(self, spec): + def remove(self, spec: "spack.spec.Spec") -> "spack.spec.Spec": """Removes a spec from the database. To be called on uninstall. Reads the database, then: @@ -1318,7 +1345,7 @@ def remove(self, spec): with self.write_transaction(): return self._remove(spec) - def deprecator(self, spec): + def deprecator(self, spec: "spack.spec.Spec") -> Optional["spack.spec.Spec"]: """Return the spec that the given spec is deprecated for, or None""" with self.read_transaction(): spec_key = self._get_matching_spec_key(spec) @@ -1329,14 +1356,14 @@ def deprecator(self, spec): else: return None - def specs_deprecated_by(self, spec): + def specs_deprecated_by(self, spec: "spack.spec.Spec") -> List["spack.spec.Spec"]: """Return all specs deprecated in favor of the given spec""" with self.read_transaction(): return [ rec.spec for rec in self._data.values() if rec.deprecated_for == spec.dag_hash() ] - def _deprecate(self, spec, deprecator): + def _deprecate(self, spec: "spack.spec.Spec", deprecator: "spack.spec.Spec") -> None: spec_key = self._get_matching_spec_key(spec) spec_rec = self._data[spec_key] @@ -1354,17 +1381,17 @@ def _deprecate(self, spec, deprecator): self._data[spec_key] = spec_rec @_autospec - def mark(self, spec, key, value): + def mark(self, spec: "spack.spec.Spec", key, value) -> None: """Mark an arbitrary record on a spec.""" with self.write_transaction(): return self._mark(spec, key, value) - def _mark(self, spec, key, value): + def _mark(self, spec: "spack.spec.Spec", key, value) -> None: record = self._data[self._get_matching_spec_key(spec)] setattr(record, key, value) @_autospec - def deprecate(self, spec, deprecator): + def deprecate(self, spec: "spack.spec.Spec", deprecator: "spack.spec.Spec") -> None: """Marks a spec as deprecated in favor of its deprecator""" with self.write_transaction(): return self._deprecate(spec, deprecator) @@ -1372,16 +1399,16 @@ def deprecate(self, spec, deprecator): @_autospec def installed_relatives( self, - spec, - direction="children", - transitive=True, + spec: "spack.spec.Spec", + direction: str = "children", + transitive: bool = True, deptype: Union[dt.DepFlag, dt.DepTypes] = dt.ALL, - ): + ) -> Set["spack.spec.Spec"]: """Return installed specs related to this one.""" if direction not in ("parents", "children"): raise ValueError("Invalid direction: %s" % direction) - relatives = set() + relatives: Set[spack.spec.Spec] = set() for spec in self.query(spec): if transitive: to_add = spec.traverse(direction=direction, root=False, deptype=deptype) @@ -1408,7 +1435,7 @@ def installed_relatives( return relatives @_autospec - def installed_extensions_for(self, extendee_spec): + def installed_extensions_for(self, extendee_spec: "spack.spec.Spec"): """Returns the specs of all packages that extend the given spec""" for spec in self.query(): if spec.package.extends(extendee_spec): @@ -1667,7 +1694,7 @@ def unused_specs( self, root_hashes: Optional[Container[str]] = None, deptype: Union[dt.DepFlag, dt.DepTypes] = dt.LINK | dt.RUN, - ) -> "List[spack.spec.Spec]": + ) -> List["spack.spec.Spec"]: """Return all specs that are currently installed but not needed by root specs. By default, roots are all explicit specs in the database. If a set of root @@ -1711,6 +1738,33 @@ def update_explicit(self, spec, explicit): rec.explicit = explicit +class NoUpstreamVisitor: + """Gives edges to upstream specs, but does follow edges from upstream specs.""" + + def __init__( + self, + upstream_hashes: Set[str], + on_visit: Callable[["spack.spec.DependencySpec", bool], None], + ): + self.upstream_hashes = upstream_hashes + self.on_visit = on_visit + + def accept(self, item: tr.EdgeAndDepth) -> bool: + self.on_visit(item.edge, self.is_upstream(item)) + return True + + def is_upstream(self, item: tr.EdgeAndDepth) -> bool: + return item.edge.spec.dag_hash() in self.upstream_hashes + + def neighbors(self, item: tr.EdgeAndDepth): + # Prune edges from upstream nodes, only follow database tracked dependencies + return ( + [] + if self.is_upstream(item) + else item.edge.spec.edges_to_dependencies(depflag=_TRACKED_DEPENDENCIES) + ) + + class UpstreamDatabaseLockingError(SpackError): """Raised when an operation would need to lock an upstream database""" diff --git a/lib/spack/spack/deptypes.py b/lib/spack/spack/deptypes.py index df965a87f12f6b..53e138e1c25460 100644 --- a/lib/spack/spack/deptypes.py +++ b/lib/spack/spack/deptypes.py @@ -43,6 +43,31 @@ ALL_FLAGS: Tuple[DepFlag, DepFlag, DepFlag, DepFlag] = (BUILD, LINK, RUN, TEST) +def compatible(flag1: DepFlag, flag2: DepFlag) -> bool: + """Returns True if two depflags can be dependencies from a Spec to deps of the same name. + + The only allowable separated dependencies are a build-only dependency, combined with a + non-build dependency. This separates our two process spaces, build time and run time. + + These dependency combinations are allowed: + single dep on name: [b], [l], [r], [bl], [br], [blr] + two deps on name: [b, l], [b, r], [b, lr] + + but none of these make any sense: + two build deps: [b, b], [b, br], [b, bl], [b, blr] + any two deps that both have an l or an r, i.e. [l, l], [r, r], [l, r], [bl, l], [bl, r]""" + # Cannot have overlapping build types to two different dependencies + if flag1 & flag2: + return False + + # Cannot have two different link/run dependencies for the same name + link_run = LINK | RUN + if flag1 & link_run and flag2 & link_run: + return False + + return True + + def flag_from_string(s: str) -> DepFlag: if s == "build": return BUILD diff --git a/lib/spack/spack/detection/common.py b/lib/spack/spack/detection/common.py index addcd1797dce5a..1b16aa6ccd434b 100644 --- a/lib/spack/spack/detection/common.py +++ b/lib/spack/spack/detection/common.py @@ -25,8 +25,10 @@ import llnl.util.tty import spack.config +import spack.error import spack.operating_systems.windows_os as winOs import spack.spec +import spack.util.environment import spack.util.spack_yaml import spack.util.windows_registry diff --git a/lib/spack/spack/detection/path.py b/lib/spack/spack/detection/path.py index ec94b71f141f95..e8081f6e3c6e18 100644 --- a/lib/spack/spack/detection/path.py +++ b/lib/spack/spack/detection/path.py @@ -18,10 +18,12 @@ import llnl.util.lang import llnl.util.tty +import spack.spec import spack.util.elf as elf_utils import spack.util.environment import spack.util.environment as environment import spack.util.ld_so_conf +import spack.util.parallel from .common import ( WindowsCompilerExternalPaths, @@ -64,6 +66,21 @@ def file_identifier(path): return s.st_dev, s.st_ino +def dedupe_paths(paths: List[str]) -> List[str]: + """Deduplicate paths based on inode and device number. In case the list contains first a + symlink and then the directory it points to, the symlink is replaced with the directory path. + This ensures that we pick for example ``/usr/bin`` over ``/bin`` if the latter is a symlink to + the former`.""" + seen: Dict[Tuple[int, int], str] = {} + for path in paths: + identifier = file_identifier(path) + if identifier not in seen: + seen[identifier] = path + elif not os.path.islink(path): + seen[identifier] = path + return list(seen.values()) + + def executables_in_path(path_hints: List[str]) -> Dict[str, str]: """Get the paths of all executables available from the current PATH. @@ -80,8 +97,7 @@ def executables_in_path(path_hints: List[str]) -> Dict[str, str]: """ search_paths = llnl.util.filesystem.search_paths_for_executables(*path_hints) # Make use we don't doubly list /usr/lib and /lib etc - search_paths = list(llnl.util.lang.dedupe(search_paths, key=file_identifier)) - return path_to_dict(search_paths) + return path_to_dict(dedupe_paths(search_paths)) def accept_elf(path, host_compat): @@ -142,7 +158,7 @@ def libraries_in_ld_and_system_library_path( search_paths = list(filter(os.path.isdir, search_paths)) # Make use we don't doubly list /usr/lib and /lib etc - search_paths = list(llnl.util.lang.dedupe(search_paths, key=file_identifier)) + search_paths = dedupe_paths(search_paths) try: host_compat = elf_utils.get_elf_compat(sys.executable) @@ -406,7 +422,7 @@ def by_path( result = collections.defaultdict(list) repository = spack.repo.PATH.ensure_unwrapped() - with concurrent.futures.ProcessPoolExecutor(max_workers=max_workers) as executor: + with spack.util.parallel.make_concurrent_executor(max_workers, require_fork=False) as executor: for pkg in packages_to_search: executable_future = executor.submit( executables_finder.find, diff --git a/lib/spack/spack/directives.py b/lib/spack/spack/directives.py index 613a43c561bdfc..c3db11a18b77ef 100644 --- a/lib/spack/spack/directives.py +++ b/lib/spack/spack/directives.py @@ -40,10 +40,8 @@ class OpenMpi(Package): import llnl.util.tty.color import spack.deptypes as dt -import spack.error import spack.patch import spack.spec -import spack.url import spack.util.crypto import spack.variant from spack.dependency import Dependency @@ -80,7 +78,6 @@ class OpenMpi(Package): "redistribute", ] - _patch_order_index = 0 @@ -705,22 +702,25 @@ def _raise_default_not_set(pkg): def _execute_variant(pkg): when_spec = _make_when_spec(when) - when_specs = [when_spec] if not re.match(spack.spec.IDENTIFIER_RE, name): directive = "variant" msg = "Invalid variant name in {0}: '{1}'" raise DirectiveError(directive, msg.format(pkg.name, name)) - if name in pkg.variants: - # We accumulate when specs, but replace the rest of the variant - # with the newer values - _, orig_when = pkg.variants[name] - when_specs += orig_when - - pkg.variants[name] = ( - spack.variant.Variant(name, default, description, values, multi, validator, sticky), - when_specs, + # variants are stored by condition then by name (so only the last variant of a + # given name takes precedence *per condition*). + # NOTE: variant defaults and values can conflict if when conditions overlap. + variants_by_name = pkg.variants.setdefault(when_spec, {}) + variants_by_name[name] = spack.variant.Variant( + name=name, + default=default, + description=description, + values=values, + multi=multi, + validator=validator, + sticky=sticky, + precedence=pkg.num_variant_definitions(), ) return _execute_variant diff --git a/lib/spack/spack/directory_layout.py b/lib/spack/spack/directory_layout.py index b094012fa6dcaf..19f5582bce4aac 100644 --- a/lib/spack/spack/directory_layout.py +++ b/lib/spack/spack/directory_layout.py @@ -4,21 +4,21 @@ # SPDX-License-Identifier: (Apache-2.0 OR MIT) import errno -import glob import os -import posixpath import re import shutil import sys -from contextlib import contextmanager from pathlib import Path +from typing import List, Optional, Tuple import llnl.util.filesystem as fs from llnl.util.symlink import readlink import spack.config import spack.hash_types as ht +import spack.projections import spack.spec +import spack.store import spack.util.spack_json as sjson from spack.error import SpackError @@ -33,6 +33,42 @@ def _check_concrete(spec): raise ValueError("Specs passed to a DirectoryLayout must be concrete!") +def _get_spec(prefix: str) -> Optional["spack.spec.Spec"]: + """Returns a spec if the prefix contains a spec file in the .spack subdir""" + for f in ("spec.json", "spec.yaml"): + try: + return spack.spec.Spec.from_specfile(os.path.join(prefix, ".spack", f)) + except Exception: + continue + return None + + +def specs_from_metadata_dirs(root: str) -> List["spack.spec.Spec"]: + stack = [root] + specs = [] + + while stack: + prefix = stack.pop() + + spec = _get_spec(prefix) + + if spec: + spec.prefix = prefix + specs.append(spec) + continue + + try: + scandir = os.scandir(prefix) + except OSError: + continue + + with scandir as entries: + for entry in entries: + if entry.is_dir(follow_symlinks=False): + stack.append(entry.path) + return specs + + class DirectoryLayout: """A directory layout is used to associate unique paths with specs. Different installations are going to want different layouts for their @@ -184,12 +220,6 @@ def deprecated_file_path(self, deprecated_spec, deprecator_spec=None): return yaml_path if os.path.exists(yaml_path) else json_path - @contextmanager - def disable_upstream_check(self): - self.check_upstream = False - yield - self.check_upstream = True - def metadata_path(self, spec): return os.path.join(spec.prefix, self.metadata_dir) @@ -244,53 +274,6 @@ def ensure_installed(self, spec): "Spec file in %s does not match hash!" % spec_file_path ) - def all_specs(self): - if not os.path.isdir(self.root): - return [] - - specs = [] - for _, path_scheme in self.projections.items(): - path_elems = ["*"] * len(path_scheme.split(posixpath.sep)) - # NOTE: Does not validate filename extension; should happen later - path_elems += [self.metadata_dir, "spec.json"] - pattern = os.path.join(self.root, *path_elems) - spec_files = glob.glob(pattern) - if not spec_files: # we're probably looking at legacy yaml... - path_elems += [self.metadata_dir, "spec.yaml"] - pattern = os.path.join(self.root, *path_elems) - spec_files = glob.glob(pattern) - specs.extend([self.read_spec(s) for s in spec_files]) - return specs - - def all_deprecated_specs(self): - if not os.path.isdir(self.root): - return [] - - deprecated_specs = set() - for _, path_scheme in self.projections.items(): - path_elems = ["*"] * len(path_scheme.split(posixpath.sep)) - # NOTE: Does not validate filename extension; should happen later - path_elems += [ - self.metadata_dir, - self.deprecated_dir, - "*_spec.*", - ] # + self.spec_file_name] - pattern = os.path.join(self.root, *path_elems) - spec_files = glob.glob(pattern) - get_depr_spec_file = lambda x: os.path.join( - os.path.dirname(os.path.dirname(x)), self.spec_file_name - ) - deprecated_specs |= set( - (self.read_spec(s), self.read_spec(get_depr_spec_file(s))) for s in spec_files - ) - return deprecated_specs - - def specs_by_hash(self): - by_hash = {} - for spec in self.all_specs(): - by_hash[spec.dag_hash()] = spec - return by_hash - def path_for_spec(self, spec): """Return absolute path from the root to a directory for the spec.""" _check_concrete(spec) @@ -356,6 +339,35 @@ def remove_install_directory(self, spec, deprecated=False): raise e path = os.path.dirname(path) + def all_specs(self) -> List["spack.spec.Spec"]: + """Returns a list of all specs detected in self.root, detected by `.spack` directories. + Their prefix is set to the directory containing the `.spack` directory. Note that these + specs may follow a different layout than the current layout if it was changed after + installation.""" + return specs_from_metadata_dirs(self.root) + + def deprecated_for( + self, specs: List["spack.spec.Spec"] + ) -> List[Tuple["spack.spec.Spec", "spack.spec.Spec"]]: + """Returns a list of tuples of specs (new, old) where new is deprecated for old""" + spec_with_deprecated = [] + for spec in specs: + try: + deprecated = os.scandir( + os.path.join(str(spec.prefix), self.metadata_dir, self.deprecated_dir) + ) + except OSError: + continue + + with deprecated as entries: + for entry in entries: + try: + deprecated_spec = spack.spec.Spec.from_specfile(entry.path) + spec_with_deprecated.append((spec, deprecated_spec)) + except Exception: + continue + return spec_with_deprecated + class DirectoryLayoutError(SpackError): """Superclass for directory layout errors.""" diff --git a/lib/spack/spack/environment/environment.py b/lib/spack/spack/environment/environment.py index 877e294b743e60..8837e2cecd8ee1 100644 --- a/lib/spack/spack/environment/environment.py +++ b/lib/spack/spack/environment/environment.py @@ -24,27 +24,24 @@ from llnl.util.link_tree import ConflictingSpecsError from llnl.util.symlink import readlink, symlink +import spack import spack.caches -import spack.cmd import spack.compilers import spack.concretize import spack.config import spack.deptypes as dt +import spack.environment import spack.error -import spack.fetch_strategy import spack.filesystem_view as fsv import spack.hash_types as ht -import spack.hooks -import spack.main import spack.paths import spack.repo import spack.schema.env +import spack.schema.merged import spack.spec -import spack.stage +import spack.spec_list import spack.store -import spack.subprocess_context import spack.user_environment as uenv -import spack.util.cpus import spack.util.environment import spack.util.hash import spack.util.lock as lk @@ -53,14 +50,12 @@ import spack.util.spack_json as sjson import spack.util.spack_yaml as syaml import spack.util.url -import spack.version from spack import traverse from spack.installer import PackageInstaller from spack.schema.env import TOP_LEVEL_KEY from spack.spec import Spec -from spack.spec_list import InvalidSpecConstraintError, SpecList +from spack.spec_list import SpecList from spack.util.path import substitute_path_variables -from spack.variant import UnknownVariantError #: environment variable used to indicate the active environment spack_env_var = "SPACK_ENV" @@ -551,8 +546,7 @@ def _is_dev_spec_and_has_changed(spec): last installation""" # First check if this is a dev build and in the process already try to get # the dev_path - dev_path_var = spec.variants.get("dev_path", None) - if not dev_path_var: + if not spec.variants.get("dev_path", None): return False # Now we can check whether the code changed since the last installation @@ -560,9 +554,10 @@ def _is_dev_spec_and_has_changed(spec): # Not installed -> nothing to compare against return False - _, record = spack.store.STORE.db.query_by_spec_hash(spec.dag_hash()) - mtime = fs.last_modification_time_recursive(dev_path_var.value) - return mtime > record.installation_time + # hook so packages can use to write their own method for checking the dev_path + # use package so attributes about concretization such as variant state can be + # utilized + return spec.package.detect_dev_src_change() def _error_on_nonempty_view_dir(new_root): @@ -1164,6 +1159,8 @@ def clear(self, re_read=False): # things that cannot be recreated from file self.new_specs = [] # write packages for these on write() + self.manifest.clear() + @property def active(self): """True if this environment is currently active.""" @@ -1625,10 +1622,10 @@ def _concretize_separately(self, tests=False): # Concretize any new user specs that we haven't concretized yet args, root_specs, i = [], [], 0 - for uspec, uspec_constraints in zip(self.user_specs, self.user_specs.specs_as_constraints): + for uspec in self.user_specs: if uspec not in old_concretized_user_specs: root_specs.append(uspec) - args.append((i, [str(x) for x in uspec_constraints], tests)) + args.append((i, str(uspec), tests)) i += 1 # Ensure we don't try to bootstrap clingo in parallel @@ -1652,7 +1649,7 @@ def _concretize_separately(self, tests=False): # Solve the environment in parallel on Linux start = time.time() - num_procs = min(len(args), spack.util.cpus.determine_number_of_jobs(parallel=True)) + num_procs = min(len(args), spack.config.determine_number_of_jobs(parallel=True)) # TODO: support parallel concretization on macOS and Windows msg = "Starting concretization" @@ -1971,7 +1968,7 @@ def install_specs(self, specs: Optional[List[Spec]] = None, **install_args): ) install_args["explicit"] = explicit - PackageInstaller([spec.package for spec in specs], install_args).install() + PackageInstaller([spec.package for spec in specs], **install_args).install() def all_specs_generator(self) -> Iterable[Spec]: """Returns a generator for all concrete specs""" @@ -2168,6 +2165,13 @@ def _concrete_specs_dict(self): # Assumes no legacy formats, since this was just created. spec_dict[ht.dag_hash.name] = s.dag_hash() concrete_specs[s.dag_hash()] = spec_dict + + if s.build_spec is not s: + for d in s.build_spec.traverse(): + build_spec_dict = d.node_dict_with_hashes(hash=ht.dag_hash) + build_spec_dict[ht.dag_hash.name] = d.dag_hash() + concrete_specs[d.dag_hash()] = build_spec_dict + return concrete_specs def _concrete_roots_dict(self): @@ -2180,7 +2184,7 @@ def _to_lockfile_dict(self): root_specs = self._concrete_roots_dict() spack_dict = {"version": spack.spack_version} - spack_commit = spack.main.get_spack_commit() + spack_commit = spack.get_spack_commit() if spack_commit: spack_dict["type"] = "git" spack_dict["commit"] = spack_commit @@ -2327,7 +2331,7 @@ def filter_specs(self, reader, json_specs_by_hash, order_concretized): specs_by_hash[lockfile_key] = spec # Second pass: For each spec, get its dependencies from the node dict - # and add them to the spec + # and add them to the spec, including build specs for lockfile_key, node_dict in json_specs_by_hash.items(): name, data = reader.name_and_data(node_dict) for _, dep_hash, deptypes, _, virtuals in reader.dependencies_from_node_dict(data): @@ -2335,6 +2339,10 @@ def filter_specs(self, reader, json_specs_by_hash, order_concretized): specs_by_hash[dep_hash], depflag=dt.canonicalize(deptypes), virtuals=virtuals ) + if "build_spec" in node_dict: + _, bhash, _ = reader.extract_build_spec_info_from_node_dict(node_dict) + specs_by_hash[lockfile_key]._build_spec = specs_by_hash[bhash] + # Traverse the root specs one at a time in the order they appear. # The first time we see each DAG hash, that's the one we want to # keep. This is only required as long as we support older lockfile @@ -2508,52 +2516,11 @@ def display_specs(specs): print(tree_string) -def _concretize_from_constraints(spec_constraints, tests=False): - # Accept only valid constraints from list and concretize spec - # Get the named spec even if out of order - root_spec = [s for s in spec_constraints if s.name] - if len(root_spec) != 1: - m = "The constraints %s are not a valid spec " % spec_constraints - m += "concretization target. all specs must have a single name " - m += "constraint for concretization." - raise InvalidSpecConstraintError(m) - spec_constraints.remove(root_spec[0]) - - invalid_constraints = [] - while True: - # Attach all anonymous constraints to one named spec - s = root_spec[0].copy() - for c in spec_constraints: - if c not in invalid_constraints: - s.constrain(c) - try: - return s.concretized(tests=tests) - except spack.spec.InvalidDependencyError as e: - invalid_deps_string = ["^" + d for d in e.invalid_deps] - invalid_deps = [ - c - for c in spec_constraints - if any(c.satisfies(invd) for invd in invalid_deps_string) - ] - if len(invalid_deps) != len(invalid_deps_string): - raise e - invalid_constraints.extend(invalid_deps) - except UnknownVariantError as e: - invalid_variants = e.unknown_variants - inv_variant_constraints = [ - c for c in spec_constraints if any(name in c.variants for name in invalid_variants) - ] - if len(inv_variant_constraints) != len(invalid_variants): - raise e - invalid_constraints.extend(inv_variant_constraints) - - def _concretize_task(packed_arguments) -> Tuple[int, Spec, float]: - index, spec_constraints, tests = packed_arguments - spec_constraints = [Spec(x) for x in spec_constraints] + index, spec_str, tests = packed_arguments with tty.SuppressOutput(msg_enabled=False): start = time.time() - spec = _concretize_from_constraints(spec_constraints, tests) + spec = Spec(spec_str).concretized(tests=tests) return index, spec, time.time() - start @@ -2835,6 +2802,11 @@ def remove_user_spec(self, user_spec: str) -> None: raise SpackEnvironmentError(msg) from e self.changed = True + def clear(self) -> None: + """Clear all user specs from the list of root specs""" + self.configuration["specs"] = [] + self.changed = True + def override_user_spec(self, user_spec: str, idx: int) -> None: """Overrides the user spec at index idx with the one passed as input. diff --git a/lib/spack/spack/error.py b/lib/spack/spack/error.py index 804dc6867b20f1..edb4b9e89fb262 100644 --- a/lib/spack/spack/error.py +++ b/lib/spack/spack/error.py @@ -132,3 +132,60 @@ def __init__(self, provided, required, constraint_type): class FetchError(SpackError): """Superclass for fetch-related errors.""" + + +class NoSuchPatchError(SpackError): + """Raised when a patch file doesn't exist.""" + + +class PatchDirectiveError(SpackError): + """Raised when the wrong arguments are suppled to the patch directive.""" + + +class PatchLookupError(NoSuchPatchError): + """Raised when a patch file cannot be located from sha256.""" + + +class SpecSyntaxError(Exception): + """Base class for Spec syntax errors""" + + +class PackageError(SpackError): + """Raised when something is wrong with a package definition.""" + + def __init__(self, message, long_msg=None): + super().__init__(message, long_msg) + + +class NoURLError(PackageError): + """Raised when someone tries to build a URL for a package with no URLs.""" + + def __init__(self, cls): + super().__init__("Package %s has no version with a URL." % cls.__name__) + + +class InstallError(SpackError): + """Raised when something goes wrong during install or uninstall. + + The error can be annotated with a ``pkg`` attribute to allow the + caller to get the package for which the exception was raised. + """ + + def __init__(self, message, long_msg=None, pkg=None): + super().__init__(message, long_msg) + self.pkg = pkg + + +class ConfigError(SpackError): + """Superclass for all Spack config related errors.""" + + +class StopPhase(SpackError): + """Pickle-able exception to control stopped builds.""" + + def __reduce__(self): + return _make_stop_phase, (self.message, self.long_message) + + +def _make_stop_phase(msg, long_msg): + return StopPhase(msg, long_msg) diff --git a/lib/spack/spack/extensions.py b/lib/spack/spack/extensions.py index a561c50ecf5f84..e13e3f17d42a0a 100644 --- a/lib/spack/spack/extensions.py +++ b/lib/spack/spack/extensions.py @@ -17,6 +17,7 @@ import llnl.util.lang +import spack.cmd import spack.config import spack.error import spack.util.path diff --git a/lib/spack/spack/fetch_strategy.py b/lib/spack/spack/fetch_strategy.py index f163f2cb3459fa..54e8a80b8af96a 100644 --- a/lib/spack/spack/fetch_strategy.py +++ b/lib/spack/spack/fetch_strategy.py @@ -24,6 +24,7 @@ """ import copy import functools +import http.client import os import os.path import re @@ -45,7 +46,6 @@ import spack.config import spack.error import spack.oci.opener -import spack.url import spack.util.archive import spack.util.crypto as crypto import spack.util.git @@ -59,19 +59,6 @@ #: List of all fetch strategies, created by FetchStrategy metaclass. all_strategies = [] -CONTENT_TYPE_MISMATCH_WARNING_TEMPLATE = ( - "The contents of {subject} look like {content_type}. Either the URL" - " you are trying to use does not exist or you have an internet gateway" - " issue. You can remove the bad archive using 'spack clean" - " ', then try again using the correct URL." -) - - -def warn_content_type_mismatch(subject, content_type="HTML"): - tty.warn( - CONTENT_TYPE_MISMATCH_WARNING_TEMPLATE.format(subject=subject, content_type=content_type) - ) - def _needs_stage(fun): """Many methods on fetch strategies require a stage to be set @@ -265,6 +252,7 @@ def __init__(self, *, url: str, checksum: Optional[str] = None, **kwargs) -> Non self.extra_options: dict = kwargs.get("fetch_options", {}) self._curl: Optional[Executable] = None self.extension: Optional[str] = kwargs.get("extension", None) + self._effective_url: Optional[str] = None @property def curl(self) -> Executable: @@ -320,7 +308,13 @@ def _check_headers(self, headers): # redirects properly. content_types = re.findall(r"Content-Type:[^\r\n]+", headers, flags=re.IGNORECASE) if content_types and "text/html" in content_types[-1]: - warn_content_type_mismatch(self.archive_file or "the archive") + msg = ( + f"The contents of {self.archive_file or 'the archive'} fetched from {self.url} " + " looks like HTML. This can indicate a broken URL, or an internet gateway issue." + ) + if self._effective_url != self.url: + msg += f" The URL redirected to {self._effective_url}." + tty.warn(msg) @_needs_stage def _fetch_urllib(self, url): @@ -346,6 +340,12 @@ def _fetch_urllib(self, url): with open(save_file, "wb") as f: shutil.copyfileobj(response, f) + # Save the redirected URL for error messages. Sometimes we're redirected to an arbitrary + # mirror that is broken, leading to spurious download failures. In that case it's helpful + # for users to know which URL was actually fetched. + if isinstance(response, http.client.HTTPResponse): + self._effective_url = response.geturl() + self._check_headers(str(response.headers)) @_needs_stage @@ -465,7 +465,7 @@ def check(self): if not self.digest: raise NoDigestError(f"Attempt to check {self.__class__.__name__} with no digest.") - verify_checksum(self.archive_file, self.digest) + verify_checksum(self.archive_file, self.digest, self.url, self._effective_url) @_needs_stage def reset(self): @@ -1433,21 +1433,26 @@ def expand(self): if len(files) != 1: raise ChecksumError(self, f"Expected a single file in {src_dir}.") - verify_checksum(os.path.join(src_dir, files[0]), self.expanded_sha256) + verify_checksum( + os.path.join(src_dir, files[0]), self.expanded_sha256, self.url, self._effective_url + ) -def verify_checksum(file, digest): +def verify_checksum(file: str, digest: str, url: str, effective_url: Optional[str]) -> None: checker = crypto.Checker(digest) if not checker.check(file): # On failure, provide some information about the file size and # contents, so that we can quickly see what the issue is (redirect # was not followed, empty file, text instead of binary, ...) size, contents = fs.filesummary(file) - raise ChecksumError( - f"{checker.hash_name} checksum failed for {file}", + long_msg = ( f"Expected {digest} but got {checker.sum}. " - f"File size = {size} bytes. Contents = {contents!r}", + f"File size = {size} bytes. Contents = {contents!r}. " + f"URL = {url}" ) + if effective_url and effective_url != url: + long_msg += f", redirected to = {effective_url}" + raise ChecksumError(f"{checker.hash_name} checksum failed for {file}", long_msg) def stable_target(fetcher): @@ -1536,7 +1541,7 @@ def _extrapolate(pkg, version): """Create a fetcher from an extrapolated URL for this version.""" try: return URLFetchStrategy(url=pkg.url_for_version(version), fetch_options=pkg.fetch_options) - except spack.package_base.NoURLError: + except spack.error.NoURLError: raise ExtrapolationError( f"Can't extrapolate a URL for version {version} because " f"package {pkg.name} defines no URLs" diff --git a/lib/spack/spack/filesystem_view.py b/lib/spack/spack/filesystem_view.py index 0e508a9bd89c46..2d5890c36389fc 100644 --- a/lib/spack/spack/filesystem_view.py +++ b/lib/spack/spack/filesystem_view.py @@ -100,10 +100,12 @@ def view_copy( spack.relocate.relocate_text(files=[dst], prefixes=prefix_to_projection) - try: - os.chown(dst, src_stat.st_uid, src_stat.st_gid) - except OSError: - tty.debug(f"Can't change the permissions for {dst}") + # The os module on Windows does not have a chown function. + if sys.platform != "win32": + try: + os.chown(dst, src_stat.st_uid, src_stat.st_gid) + except OSError: + tty.debug(f"Can't change the permissions for {dst}") #: supported string values for `link_type` in an env, mapped to canonical values diff --git a/lib/spack/spack/graph.py b/lib/spack/spack/graph.py index 684a6061fb2038..f4ac437df92b38 100644 --- a/lib/spack/spack/graph.py +++ b/lib/spack/spack/graph.py @@ -46,6 +46,7 @@ import spack.repo import spack.spec import spack.tengine +import spack.traverse def find(seq, predicate): diff --git a/lib/spack/spack/install_test.py b/lib/spack/spack/install_test.py index 559b5b389c1d2c..f21f4f8cde25bb 100644 --- a/lib/spack/spack/install_test.py +++ b/lib/spack/spack/install_test.py @@ -17,14 +17,23 @@ import llnl.util.filesystem as fs import llnl.util.tty as tty +import llnl.util.tty.log from llnl.string import plural from llnl.util.lang import nullcontext from llnl.util.tty.color import colorize +import spack.build_environment +import spack.builder +import spack.config import spack.error +import spack.package_base import spack.paths +import spack.repo +import spack.spec +import spack.util.executable +import spack.util.path import spack.util.spack_json as sjson -from spack.installer import InstallError +from spack.error import InstallError from spack.spec import Spec from spack.util.prefix import Prefix @@ -42,7 +51,7 @@ ListOrStringType = Union[str, List[str]] -LogType = Union["tty.log.nixlog", "tty.log.winlog"] +LogType = Union[llnl.util.tty.log.nixlog, llnl.util.tty.log.winlog] Pb = TypeVar("Pb", bound="spack.package_base.PackageBase") PackageObjectOrClass = Union[Pb, Type[Pb]] @@ -110,7 +119,7 @@ def cache_extra_test_sources(pkg: Pb, srcs: ListOrStringType): location(s) under the install testing directory. Raises: - spack.installer.InstallError: if any of the source paths are absolute + spack.error.InstallError: if any of the source paths are absolute or do not exist under the build stage """ @@ -280,7 +289,7 @@ def __init__(self, pkg: Pb): def logger(self) -> Optional[LogType]: """The current logger or, if none, sets to one.""" if not self._logger: - self._logger = tty.log.log_output(self.test_log_file) + self._logger = llnl.util.tty.log.log_output(self.test_log_file) return self._logger @@ -297,7 +306,7 @@ def test_logger(self, verbose: bool = False, externals: bool = False): fs.touch(self.test_log_file) # Otherwise log_parse complains fs.set_install_permissions(self.test_log_file) - with tty.log.log_output(self.test_log_file, verbose) as self._logger: + with llnl.util.tty.log.log_output(self.test_log_file, verbose) as self._logger: with self.logger.force_echo(): # type: ignore[union-attr] tty.msg("Testing package " + colorize(r"@*g{" + self.pkg_id + r"}")) @@ -363,8 +372,7 @@ def phase_tests( builder.pkg.test_suite.current_test_spec = builder.pkg.spec builder.pkg.test_suite.current_base_spec = builder.pkg.spec - # TODO (post-34236): "test"->"test_" once remove deprecated methods - have_tests = any(name.startswith("test") for name in method_names) + have_tests = any(name.startswith("test_") for name in method_names) if have_tests: copy_test_files(builder.pkg, builder.pkg.spec) @@ -468,16 +476,9 @@ def write_tested_status(self): def test_part(pkg: Pb, test_name: str, purpose: str, work_dir: str = ".", verbose: bool = False): wdir = "." if work_dir is None else work_dir tester = pkg.tester - # TODO (post-34236): "test"->"test_" once remove deprecated methods assert test_name and test_name.startswith( - "test" - ), f"Test name must start with 'test' but {test_name} was provided" - - if test_name == "test": - tty.warn( - "{}: the 'test' method is deprecated. Convert stand-alone " - "test(s) to methods with names starting 'test_'.".format(pkg.name) - ) + "test_" + ), f"Test name must start with 'test_' but {test_name} was provided" title = "test: {}: {}".format(test_name, purpose or "unspecified purpose") with fs.working_dir(wdir, create=True): @@ -637,28 +638,11 @@ def test_functions( except spack.repo.UnknownPackageError: tty.debug(f"{vname}: virtual does not appear to have a package file") - # TODO (post-34236): Remove if removing empty test method check - def skip(line): - # This should match the lines in the deprecated test() method - ln = line.strip() - return ln.startswith("#") or ("warn" in ln and "deprecated" in ln) - - doc_regex = r'\s+("""[\w\s\(\)\-\,\;\:]+""")' tests = [] for clss in classes: methods = inspect.getmembers(clss, predicate=lambda x: inspect.isfunction(x)) for name, test_fn in methods: - # TODO (post-34236): "test"->"test_" once remove deprecated methods - if not name.startswith("test"): - continue - - # TODO (post-34236): Could remove empty method check once remove - # TODO (post-34236): deprecated methods though some use cases, - # TODO (post-34236): such as checking packages have actual, non- - # TODO (post-34236): empty tests, may want this check to remain. - source = re.sub(doc_regex, r"", inspect.getsource(test_fn)).splitlines()[1:] - lines = [ln.strip() for ln in source if not skip(ln)] - if not lines: + if not name.startswith("test_"): continue tests.append((clss.__name__, test_fn)) # type: ignore[union-attr] diff --git a/lib/spack/spack/installer.py b/lib/spack/spack/installer.py index b6ac7a73ecce07..80fe9f2b038e58 100644 --- a/lib/spack/spack/installer.py +++ b/lib/spack/spack/installer.py @@ -2,8 +2,7 @@ # Spack Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) -""" -This module encapsulates package installation functionality. +"""This module encapsulates package installation functionality. The PackageInstaller coordinates concurrent builds of packages for the same Spack instance by leveraging the dependency DAG and file system locks. It @@ -17,16 +16,18 @@ File system locks enable coordination such that no two processes attempt to build the same or a failed dependency package. -Failures to install dependency packages result in removal of their dependents' -build tasks from the current process. A failure file is also written (and -locked) so that other processes can detect the failure and adjust their build -tasks accordingly. +If a dependency package fails to install, its dependents' tasks will be +removed from the installing process's queue. A failure file is also written +and locked. Other processes use this file to detect the failure and dequeue +its dependents. This module supports the coordination of local and distributed concurrent installations of packages in a Spack instance. + """ import copy +import enum import glob import heapq import io @@ -37,18 +38,18 @@ import time from collections import defaultdict from gzip import GzipFile -from typing import Dict, Iterator, List, Optional, Set, Tuple +from typing import Dict, Iterator, List, Optional, Set, Tuple, Union import llnl.util.filesystem as fs import llnl.util.lock as lk import llnl.util.tty as tty +from llnl.string import ordinal from llnl.util.lang import pretty_seconds from llnl.util.tty.color import colorize from llnl.util.tty.log import log_output import spack.binary_distribution as binary_distribution import spack.build_environment -import spack.compilers import spack.config import spack.database import spack.deptypes as dt @@ -58,6 +59,7 @@ import spack.package_base import spack.package_prefs as prefs import spack.repo +import spack.rewiring import spack.spec import spack.store import spack.util.executable @@ -71,25 +73,32 @@ #: were added (see https://docs.python.org/2/library/heapq.html). _counter = itertools.count(0) -#: Build status indicating task has been added. -STATUS_ADDED = "queued" -#: Build status indicating the spec failed to install -STATUS_FAILED = "failed" +class BuildStatus(enum.Enum): + """Different build (task) states.""" + + #: Build status indicating task has been added/queued. + QUEUED = enum.auto() + + #: Build status indicating the spec failed to install + FAILED = enum.auto() -#: Build status indicating the spec is being installed (possibly by another -#: process) -STATUS_INSTALLING = "installing" + #: Build status indicating the spec is being installed (possibly by another + #: process) + INSTALLING = enum.auto() -#: Build status indicating the spec was sucessfully installed -STATUS_INSTALLED = "installed" + #: Build status indicating the spec was sucessfully installed + INSTALLED = enum.auto() -#: Build status indicating the task has been popped from the queue -STATUS_DEQUEUED = "dequeued" + #: Build status indicating the task has been popped from the queue + DEQUEUED = enum.auto() -#: Build status indicating task has been removed (to maintain priority -#: queue invariants). -STATUS_REMOVED = "removed" + #: Build status indicating task has been removed (to maintain priority + #: queue invariants). + REMOVED = enum.auto() + + def __str__(self): + return f"{self.name.lower()}" def _write_timer_json(pkg, timer, cache): @@ -102,13 +111,22 @@ def _write_timer_json(pkg, timer, cache): return -class InstallAction: +class ExecuteResult(enum.Enum): + # Task succeeded + SUCCESS = enum.auto() + # Task failed + FAILED = enum.auto() + # Task is missing build spec and will be requeued + MISSING_BUILD_SPEC = enum.auto() + + +class InstallAction(enum.Enum): #: Don't perform an install - NONE = 0 + NONE = enum.auto() #: Do a standard install - INSTALL = 1 + INSTALL = enum.auto() #: Do an overwrite install - OVERWRITE = 2 + OVERWRITE = enum.auto() class InstallStatus: @@ -276,52 +294,6 @@ def _do_fake_install(pkg: "spack.package_base.PackageBase") -> None: dump_packages(pkg.spec, packages_dir) -def _packages_needed_to_bootstrap_compiler( - compiler: "spack.spec.CompilerSpec", architecture: "spack.spec.ArchSpec", pkgs: list -) -> List[Tuple["spack.package_base.PackageBase", bool]]: - """ - Return a list of packages required to bootstrap `pkg`s compiler - - Checks Spack's compiler configuration for a compiler that - matches the package spec. - - Args: - compiler: the compiler to bootstrap - architecture: the architecture for which to boostrap the compiler - pkgs: the packages that may need their compiler installed - - Return: - list of tuples of packages and a boolean, for concretized compiler-related - packages that need to be installed and bool values specify whether the - package is the bootstrap compiler (``True``) or one of its dependencies - (``False``). The list will be empty if there are no compilers. - """ - tty.debug(f"Bootstrapping {compiler} compiler") - compilers = spack.compilers.compilers_for_spec(compiler, arch_spec=architecture) - if compilers: - return [] - - dep = spack.compilers.pkg_spec_for_compiler(compiler) - - # Set the architecture for the compiler package in a way that allows the - # concretizer to back off if needed for the older bootstrapping compiler - dep.constrain(f"platform={str(architecture.platform)}") - dep.constrain(f"os={str(architecture.os)}") - dep.constrain(f"target={architecture.target.microarchitecture.family.name}:") - # concrete CompilerSpec has less info than concrete Spec - # concretize as Spec to add that information - dep.concretize() - # mark compiler as depended-on by the packages that use it - for pkg in pkgs: - dep._dependents.add( - spack.spec.DependencySpec(pkg.spec, dep, depflag=dt.BUILD, virtuals=()) - ) - packages = [(s.package, False) for s in dep.traverse(order="post", root=False)] - - packages.append((dep.package, True)) - return packages - - def _hms(seconds: int) -> str: """ Convert seconds to hours, minutes, seconds @@ -478,7 +450,7 @@ def _process_binary_cache_tarball( """ with timer.measure("fetch"): download_result = binary_distribution.download_tarball( - pkg.spec, unsigned, mirrors_for_spec + pkg.spec.build_spec, unsigned, mirrors_for_spec ) if download_result is None: @@ -489,6 +461,11 @@ def _process_binary_cache_tarball( with timer.measure("install"), spack.util.path.filter_padding(): binary_distribution.extract_tarball(pkg.spec, download_result, force=False, timer=timer) + if pkg.spec.spliced: # overwrite old metadata with new + spack.store.STORE.layout.write_spec( + pkg.spec, spack.store.STORE.layout.spec_file_path(pkg.spec) + ) + if hasattr(pkg, "_post_buildcache_install_hook"): pkg._post_buildcache_install_hook() @@ -724,7 +701,7 @@ def log(pkg: "spack.package_base.PackageBase") -> None: def package_id(spec: "spack.spec.Spec") -> str: """A "unique" package identifier for installation purposes - The identifier is used to track build tasks, locks, install, and + The identifier is used to track tasks, locks, install, and failure statuses. The identifier needs to distinguish between combinations of compilers @@ -783,14 +760,14 @@ def __init__(self, pkg: "spack.package_base.PackageBase", install_args: dict): ) def __repr__(self) -> str: - """Returns a formal representation of the build request.""" + """Return a formal representation of the build request.""" rep = f"{self.__class__.__name__}(" for attr, value in self.__dict__.items(): rep += f"{attr}={value.__repr__()}, " return f"{rep.strip(', ')})" def __str__(self) -> str: - """Returns a printable version of the build request.""" + """Return a printable version of the build request.""" return f"package={self.pkg.name}, install_args={self.install_args}" def _add_default_args(self) -> None: @@ -887,37 +864,42 @@ def traverse_dependencies(self, spec=None, visited=None) -> Iterator["spack.spec yield dep -class BuildTask: - """Class for representing the build task for a package.""" +class Task: + """Base class for representing a task for a package.""" def __init__( self, pkg: "spack.package_base.PackageBase", - request: Optional[BuildRequest], - compiler: bool, - start: float, - attempts: int, - status: str, - installed: Set[str], + request: BuildRequest, + *, + compiler: bool = False, + start: float = 0.0, + attempts: int = 0, + status: BuildStatus = BuildStatus.QUEUED, + installed: Set[str] = set(), ): """ - Instantiate a build task for a package. + Instantiate a task for a package. Args: pkg: the package to be built and installed - request: the associated install request where ``None`` can be - used to indicate the package was explicitly requested by the user - compiler: whether task is for a bootstrap compiler + request: the associated install request start: the initial start time for the package, in seconds - attempts: the number of attempts to install the package + attempts: the number of attempts to install the package, which + should be 0 when the task is initially instantiated status: the installation status - installed: the identifiers of packages that have + installed: the (string) identifiers of packages that have been installed so far + + Raises: + ``InstallError`` if the build status is incompatible with the task + ``TypeError`` if provided an argument of the wrong type + ``ValueError`` if provided an argument with the wrong value or state """ # Ensure dealing with a package that has a concrete spec if not isinstance(pkg, spack.package_base.PackageBase): - raise ValueError(f"{str(pkg)} must be a package") + raise TypeError(f"{str(pkg)} must be a package") self.pkg = pkg if not self.pkg.spec.concrete: @@ -928,26 +910,34 @@ def __init__( # The explicit build request associated with the package if not isinstance(request, BuildRequest): - raise ValueError(f"{str(pkg)} must have a build request") - + raise TypeError(f"{request} is not a valid build request") self.request = request # Initialize the status to an active state. The status is used to # ensure priority queue invariants when tasks are "removed" from the # queue. - if status == STATUS_REMOVED: - raise InstallError( - f"Cannot create a build task for {self.pkg_id} with status '{status}'", pkg=pkg - ) + if not isinstance(status, BuildStatus): + raise TypeError(f"{status} is not a valid build status") + # The initial build task cannot have status "removed". + if attempts == 0 and status == BuildStatus.REMOVED: + raise spack.error.InstallError( + f"Cannot create a task for {self.pkg_id} with status '{status}'", pkg=pkg + ) self.status = status - # Package is associated with a bootstrap compiler - self.compiler = compiler + # cache the PID, which is used for distributed build messages in self.execute + self.pid = os.getpid() # The initial start time for processing the spec self.start = start + if not isinstance(installed, set): + raise TypeError( + f"BuildTask constructor requires 'installed' be a 'set', " + f"not '{installed.__class__.__name__}'." + ) + # Set of dependents, which needs to include the requesting package # to support tracking of parallel, multi-spec, environment installs. self.dependents = set(get_dependent_ids(self.pkg.spec)) @@ -967,37 +957,23 @@ def __init__( if package_id(d) != self.pkg_id ) - # Handle bootstrapped compiler - # - # The bootstrapped compiler is not a dependency in the spec, but it is - # a dependency of the build task. Here we add it to self.dependencies - compiler_spec = self.pkg.spec.compiler - arch_spec = self.pkg.spec.architecture - strict = spack.concretize.Concretizer().check_for_compiler_existence - if ( - not spack.compilers.compilers_for_spec(compiler_spec, arch_spec=arch_spec) - and not strict - ): - # The compiler is in the queue, identify it as dependency - dep = spack.compilers.pkg_spec_for_compiler(compiler_spec) - dep.constrain(f"platform={str(arch_spec.platform)}") - dep.constrain(f"os={str(arch_spec.os)}") - dep.constrain(f"target={arch_spec.target.microarchitecture.family.name}:") - dep.concretize() - dep_id = package_id(dep) - self.dependencies.add(dep_id) - # List of uninstalled dependencies, which is used to establish - # the priority of the build task. - # + # the priority of the task. self.uninstalled_deps = set( pkg_id for pkg_id in self.dependencies if pkg_id not in installed ) # Ensure key sequence-related properties are updated accordingly. - self.attempts = 0 + self.attempts = attempts self._update() + def execute(self, install_status: InstallStatus) -> ExecuteResult: + """Execute the work of this task. + + The ``install_status`` is an ``InstallStatus`` object used to format progress reporting for + this task in the context of the full ``BuildRequest``.""" + raise NotImplementedError + def __eq__(self, other): return self.key == other.key @@ -1017,14 +993,14 @@ def __ne__(self, other): return self.key != other.key def __repr__(self) -> str: - """Returns a formal representation of the build task.""" + """Returns a formal representation of the task.""" rep = f"{self.__class__.__name__}(" for attr, value in self.__dict__.items(): rep += f"{attr}={value.__repr__()}, " return f"{rep.strip(', ')})" def __str__(self) -> str: - """Returns a printable version of the build task.""" + """Returns a printable version of the task.""" dependencies = f"#dependencies={len(self.dependencies)}" return "priority={0}, status={1}, start={2}, {3}".format( self.priority, self.status, self.start, dependencies @@ -1041,8 +1017,7 @@ def _update(self) -> None: def add_dependent(self, pkg_id: str) -> None: """ - Ensure the dependent package id is in the task's list so it will be - properly updated when this package is installed. + Ensure the package is in this task's ``dependents`` list. Args: pkg_id: package identifier of the dependent package @@ -1051,6 +1026,20 @@ def add_dependent(self, pkg_id: str) -> None: tty.debug(f"Adding {pkg_id} as a dependent of {self.pkg_id}") self.dependents.add(pkg_id) + def add_dependency(self, pkg_id, installed=False): + """ + Ensure the package is in this task's ``dependencies`` list. + + Args: + pkg_id (str): package identifier of the dependency package + installed (bool): install status of the dependency package + """ + if pkg_id != self.pkg_id and pkg_id not in self.dependencies: + tty.debug(f"Adding {pkg_id} as a depencency of {self.pkg_id}") + self.dependencies.add(pkg_id) + if not installed: + self.uninstalled_deps.add(pkg_id) + def flag_installed(self, installed: List[str]) -> None: """ Ensure the dependency is not considered to still be uninstalled. @@ -1067,6 +1056,39 @@ def flag_installed(self, installed: List[str]) -> None: level=2, ) + def _setup_install_dir(self, pkg: "spack.package_base.PackageBase") -> None: + """ + Create and ensure proper access controls for the install directory. + Write a small metadata file with the current spack environment. + + Args: + pkg: the package to be built and installed + """ + # Move to a module level method. + if not os.path.exists(pkg.spec.prefix): + path = spack.util.path.debug_padded_filter(pkg.spec.prefix) + tty.debug(f"Creating the installation directory {path}") + spack.store.STORE.layout.create_install_directory(pkg.spec) + else: + # Set the proper group for the prefix + group = prefs.get_package_group(pkg.spec) + if group: + fs.chgrp(pkg.spec.prefix, group) + + # Set the proper permissions. + # This has to be done after group because changing groups blows + # away the sticky group bit on the directory + mode = os.stat(pkg.spec.prefix).st_mode + perms = prefs.get_package_dir_permissions(pkg.spec) + if mode != perms: + os.chmod(pkg.spec.prefix, perms) + + # Ensure the metadata path exists as well + fs.mkdirp(spack.store.STORE.layout.metadata_path(pkg.spec), mode=perms) + + # Always write host environment - we assume this can change + spack.store.STORE.layout.write_host_environment(pkg.spec) + @property def explicit(self) -> bool: return self.pkg.spec.dag_hash() in self.request.install_args.get("explicit", []) @@ -1097,7 +1119,7 @@ def key(self) -> Tuple[int, int]: """The key is the tuple (# uninstalled dependencies, sequence).""" return (self.priority, self.sequence) - def next_attempt(self, installed) -> "BuildTask": + def next_attempt(self, installed) -> "Task": """Create a new, updated task for the next installation attempt.""" task = copy.copy(self) task._update() @@ -1111,6 +1133,100 @@ def priority(self): return len(self.uninstalled_deps) +class BuildTask(Task): + """Class for representing a build task for a package.""" + + def execute(self, install_status): + """ + Perform the installation of the requested spec and/or dependency + represented by the build task. + """ + install_args = self.request.install_args + tests = install_args.get("tests") + unsigned = install_args.get("unsigned") + + pkg, pkg_id = self.pkg, self.pkg_id + + tty.msg(install_msg(pkg_id, self.pid, install_status)) + self.start = self.start or time.time() + self.status = BuildStatus.INSTALLING + + # Use the binary cache if requested + if self.use_cache: + if _install_from_cache(pkg, self.explicit, unsigned): + return ExecuteResult.SUCCESS + elif self.cache_only: + raise spack.error.InstallError( + "No binary found when cache-only was specified", pkg=pkg + ) + else: + tty.msg(f"No binary for {pkg_id} found: installing from source") + + pkg.run_tests = tests is True or tests and pkg.name in tests + + # hook that allows tests to inspect the Package before installation + # see unit_test_check() docs. + if not pkg.unit_test_check(): + return ExecuteResult.FAILED + + try: + # Create stage object now and let it be serialized for the child process. That + # way monkeypatch in tests works correctly. + pkg.stage + + self._setup_install_dir(pkg) + + # Create a child process to do the actual installation. + # Preserve verbosity settings across installs. + spack.package_base.PackageBase._verbose = spack.build_environment.start_build_process( + pkg, build_process, install_args + ) + + # Note: PARENT of the build process adds the new package to + # the database, so that we don't need to re-read from file. + spack.store.STORE.db.add(pkg.spec, explicit=self.explicit) + except spack.error.StopPhase as e: + # A StopPhase exception means that do_install was asked to + # stop early from clients, and is not an error at this point + pid = f"{self.pid}: " if tty.show_pid() else "" + tty.debug(f"{pid}{str(e)}") + tty.debug(f"Package stage directory: {pkg.stage.source_path}") + return ExecuteResult.SUCCESS + + +class RewireTask(Task): + """Class for representing a rewire task for a package.""" + + def execute(self, install_status): + """Execute rewire task + + Rewire tasks are executed by either rewiring self.package.spec.build_spec that is already + installed or downloading and rewiring a binary for the it. + + If not available installed or as binary, return ExecuteResult.MISSING_BUILD_SPEC. + This will prompt the Installer to requeue the task with a dependency on the BuildTask + to install self.pkg.spec.build_spec + """ + oldstatus = self.status + self.status = BuildStatus.INSTALLING + tty.msg(install_msg(self.pkg_id, self.pid, install_status)) + self.start = self.start or time.time() + if not self.pkg.spec.build_spec.installed: + try: + install_args = self.request.install_args + unsigned = install_args.get("unsigned") + _process_binary_cache_tarball(self.pkg, explicit=self.explicit, unsigned=unsigned) + _print_installed_pkg(self.pkg.prefix) + return ExecuteResult.SUCCESS + except BaseException as e: + tty.error(f"Failed to rewire {self.pkg.spec} from binary. {e}") + self.status = oldstatus + return ExecuteResult.MISSING_BUILD_SPEC + spack.rewiring.rewire_node(self.pkg.spec, self.explicit) + _print_installed_pkg(self.pkg.prefix) + return ExecuteResult.SUCCESS + + class PackageInstaller: """ Class for managing the install process for a Spack instance based on a bottom-up DAG approach. @@ -1120,16 +1236,95 @@ class PackageInstaller: """ def __init__( - self, packages: List["spack.package_base.PackageBase"], install_args: dict + self, + packages: List["spack.package_base.PackageBase"], + *, + cache_only: bool = False, + dependencies_cache_only: bool = False, + dependencies_use_cache: bool = True, + dirty: bool = False, + explicit: Union[Set[str], bool] = False, + overwrite: Optional[Union[List[str], Set[str]]] = None, + fail_fast: bool = False, + fake: bool = False, + include_build_deps: bool = False, + install_deps: bool = True, + install_package: bool = True, + install_source: bool = False, + keep_prefix: bool = False, + keep_stage: bool = False, + package_cache_only: bool = False, + package_use_cache: bool = True, + restage: bool = False, + skip_patch: bool = False, + stop_at: Optional[str] = None, + stop_before: Optional[str] = None, + tests: Union[bool, List[str], Set[str]] = False, + unsigned: Optional[bool] = None, + use_cache: bool = False, + verbose: bool = False, ) -> None: + """ + Arguments: + explicit: Set of package hashes to be marked as installed explicitly in the db. If + True, the specs from ``packages`` are marked explicit, while their dependencies are + not. + fail_fast: Fail if any dependency fails to install; otherwise, the default is to + install as many dependencies as possible (i.e., best effort installation). + fake: Don't really build; install fake stub files instead. + install_deps: Install dependencies before installing this package + install_source: By default, source is not installed, but for debugging it might be + useful to keep it around. + keep_prefix: Keep install prefix on failure. By default, destroys it. + keep_stage: By default, stage is destroyed only if there are no exceptions during + build. Set to True to keep the stage even with exceptions. + restage: Force spack to restage the package source. + skip_patch: Skip patch stage of build if True. + stop_before: stop execution before this installation phase (or None) + stop_at: last installation phase to be executed (or None) + tests: False to run no tests, True to test all packages, or a list of package names to + run tests for some + use_cache: Install from binary package, if available. + verbose: Display verbose build output (by default, suppresses it) + """ + if isinstance(explicit, bool): + explicit = {pkg.spec.dag_hash() for pkg in packages} if explicit else set() + + install_args = { + "cache_only": cache_only, + "dependencies_cache_only": dependencies_cache_only, + "dependencies_use_cache": dependencies_use_cache, + "dirty": dirty, + "explicit": explicit, + "fail_fast": fail_fast, + "fake": fake, + "include_build_deps": include_build_deps, + "install_deps": install_deps, + "install_package": install_package, + "install_source": install_source, + "keep_prefix": keep_prefix, + "keep_stage": keep_stage, + "overwrite": overwrite or [], + "package_cache_only": package_cache_only, + "package_use_cache": package_use_cache, + "restage": restage, + "skip_patch": skip_patch, + "stop_at": stop_at, + "stop_before": stop_before, + "tests": tests, + "unsigned": unsigned, + "use_cache": use_cache, + "verbose": verbose, + } + # List of build requests self.build_requests = [BuildRequest(pkg, install_args) for pkg in packages] - # Priority queue of build tasks - self.build_pq: List[Tuple[Tuple[int, int], BuildTask]] = [] + # Priority queue of tasks + self.build_pq: List[Tuple[Tuple[int, int], Task]] = [] - # Mapping of unique package ids to build task - self.build_tasks: Dict[str, BuildTask] = {} + # Mapping of unique package ids to task + self.build_tasks: Dict[str, Task] = {} # Cache of package locks for failed packages, keyed on package's ids self.failed: Dict[str, Optional[lk.Lock]] = {} @@ -1150,6 +1345,9 @@ def __init__( # fast then that option applies to all build requests. self.fail_fast = False + # Initializing all_dependencies to empty. This will be set later in _init_queue. + self.all_dependencies: Dict[str, Set[str]] = {} + def __repr__(self) -> str: """Returns a formal representation of the package installer.""" rep = f"{self.__class__.__name__}(" @@ -1165,73 +1363,22 @@ def __str__(self) -> str: installed = f"installed ({len(self.installed)}) = {self.installed}" return f"{self.pid}: {requests}; {tasks}; {installed}; {failed}" - def _add_bootstrap_compilers( - self, - compiler: "spack.spec.CompilerSpec", - architecture: "spack.spec.ArchSpec", - pkgs: List["spack.package_base.PackageBase"], - request: BuildRequest, - all_deps, - ) -> None: - """ - Add bootstrap compilers and dependencies to the build queue. - - Args: - compiler: the compiler to boostrap - architecture: the architecture for which to bootstrap the compiler - pkgs: the package list with possible compiler dependencies - request: the associated install request - all_deps (defaultdict(set)): dictionary of all dependencies and - associated dependents - """ - packages = _packages_needed_to_bootstrap_compiler(compiler, architecture, pkgs) - for comp_pkg, is_compiler in packages: - pkgid = package_id(comp_pkg.spec) - if pkgid not in self.build_tasks: - self._add_init_task(comp_pkg, request, is_compiler, all_deps) - elif is_compiler: - # ensure it's queued as a compiler - self._modify_existing_task(pkgid, "compiler", True) - - def _modify_existing_task(self, pkgid: str, attr, value) -> None: - """ - Update a task in-place to modify its behavior. - - Currently used to update the ``compiler`` field on tasks - that were originally created as a dependency of a compiler, - but are compilers in their own right. - - For example, ``intel-oneapi-compilers-classic`` depends on - ``intel-oneapi-compilers``, which can cause the latter to be - queued first as a non-compiler, and only later as a compiler. - """ - for i, tup in enumerate(self.build_pq): - key, task = tup - if task.pkg_id == pkgid: - tty.debug(f"Modifying task for {pkgid} to treat it as a compiler", level=2) - setattr(task, attr, value) - self.build_pq[i] = (key, task) - def _add_init_task( self, pkg: "spack.package_base.PackageBase", - request: Optional[BuildRequest], - is_compiler: bool, + request: BuildRequest, all_deps: Dict[str, Set[str]], ) -> None: """ - Creates and queus the initial build task for the package. + Creates and queues the initial task for the package. Args: pkg: the package to be built and installed - request (BuildRequest or None): the associated install request - where ``None`` can be used to indicate the package was - explicitly requested by the user - is_compiler (bool): whether task is for a bootstrap compiler - all_deps (defaultdict(set)): dictionary of all dependencies and - associated dependents + request: the associated install request + all_deps: dictionary of all dependencies and associated dependents """ - task = BuildTask(pkg, request, is_compiler, 0, 0, STATUS_ADDED, self.installed) + cls = RewireTask if pkg.spec.spliced else BuildTask + task = cls(pkg, request=request, status=BuildStatus.QUEUED, installed=self.installed) for dep_id in task.dependencies: all_deps[dep_id].add(package_id(pkg.spec)) @@ -1274,7 +1421,7 @@ def _check_deps_status(self, request: BuildRequest) -> None: if spack.store.STORE.failure_tracker.has_failed(dep): action = "'spack install' the dependency" msg = f"{dep_id} is marked as an install failure: {action}" - raise InstallError(err.format(request.pkg_id, msg), pkg=dep_pkg) + raise spack.error.InstallError(err.format(request.pkg_id, msg), pkg=dep_pkg) # Attempt to get a read lock to ensure another process does not # uninstall the dependency while the requested spec is being @@ -1282,7 +1429,7 @@ def _check_deps_status(self, request: BuildRequest) -> None: ltype, lock = self._ensure_locked("read", dep_pkg) if lock is None: msg = f"{dep_id} is write locked by another process" - raise InstallError(err.format(request.pkg_id, msg), pkg=request.pkg) + raise spack.error.InstallError(err.format(request.pkg_id, msg), pkg=request.pkg) # Flag external and upstream packages as being installed if dep_pkg.spec.external or dep_pkg.spec.installed_upstream: @@ -1305,7 +1452,7 @@ def _check_deps_status(self, request: BuildRequest) -> None: else: lock.release_read() - def _prepare_for_install(self, task: BuildTask) -> None: + def _prepare_for_install(self, task: Task) -> None: """ Check the database and leftover installation directories/files and prepare for a new install attempt for an uninstalled package. @@ -1313,7 +1460,7 @@ def _prepare_for_install(self, task: BuildTask) -> None: and ensuring the database is up-to-date. Args: - task (BuildTask): the build task whose associated package is + task: the task whose associated package is being checked """ install_args = task.request.install_args @@ -1334,7 +1481,7 @@ def _prepare_for_install(self, task: BuildTask) -> None: if not installed_in_db: # Ensure there is no other installed spec with the same prefix dir if spack.store.STORE.db.is_occupied_install_prefix(task.pkg.spec.prefix): - raise InstallError( + raise spack.error.InstallError( f"Install prefix collision for {task.pkg_id}", long_msg=f"Prefix directory {task.pkg.spec.prefix} already " "used by another installed spec.", @@ -1364,7 +1511,7 @@ def _prepare_for_install(self, task: BuildTask) -> None: spack.store.STORE.db.update_explicit(task.pkg.spec, True) def _cleanup_all_tasks(self) -> None: - """Cleanup all build tasks to include releasing their locks.""" + """Cleanup all tasks to include releasing their locks.""" for pkg_id in self.locks: self._release_lock(pkg_id) @@ -1396,7 +1543,7 @@ def _cleanup_failed(self, pkg_id: str) -> None: def _cleanup_task(self, pkg: "spack.package_base.PackageBase") -> None: """ - Cleanup the build task for the spec + Cleanup the task for the spec Args: pkg: the package being installed @@ -1468,7 +1615,7 @@ def _ensure_locked( if lock_type == "read": # Wait until the other process finishes if there are no more - # build tasks with priority 0 (i.e., with no uninstalled + # tasks with priority 0 (i.e., with no uninstalled # dependencies). no_p0 = len(self.build_tasks) == 0 or not self._next_is_pri0() timeout = None if no_p0 else 3.0 @@ -1520,6 +1667,33 @@ def _ensure_locked( self.locks[pkg_id] = (lock_type, lock) return self.locks[pkg_id] + def _requeue_with_build_spec_tasks(self, task): + """Requeue the task and its missing build spec dependencies""" + # Full install of the build_spec is necessary because it didn't already exist somewhere + spec = task.pkg.spec + for dep in spec.build_spec.traverse(): + dep_pkg = dep.package + + dep_id = package_id(dep) + if dep_id not in self.build_tasks: + self._add_init_task(dep_pkg, task.request, self.all_dependencies) + + # Clear any persistent failure markings _unless_ they are + # associated with another process in this parallel build + # of the spec. + spack.store.STORE.failure_tracker.clear(dep, force=False) + + # Queue the build spec. + build_pkg_id = package_id(spec.build_spec) + build_spec_task = self.build_tasks[build_pkg_id] + spec_pkg_id = package_id(spec) + spec_task = task.next_attempt(self.installed) + spec_task.status = BuildStatus.QUEUED + # Convey a build spec as a dependency of a deployed spec. + build_spec_task.add_dependent(spec_pkg_id) + spec_task.add_dependency(build_pkg_id) + self._push_task(spec_task) + def _add_tasks(self, request: BuildRequest, all_deps): """Add tasks to the priority queue for the given build request. @@ -1541,42 +1715,7 @@ def _add_tasks(self, request: BuildRequest, all_deps): tty.warn(f"Installation request refused: {str(err)}") return - install_compilers = spack.config.get("config:install_missing_compilers", False) - install_deps = request.install_args.get("install_deps") - # Bootstrap compilers first - if install_deps and install_compilers: - packages_per_compiler: Dict[ - "spack.spec.CompilerSpec", - Dict["spack.spec.ArchSpec", List["spack.package_base.PackageBase"]], - ] = {} - - for dep in request.traverse_dependencies(): - dep_pkg = dep.package - compiler = dep_pkg.spec.compiler - arch = dep_pkg.spec.architecture - if compiler not in packages_per_compiler: - packages_per_compiler[compiler] = {} - - if arch not in packages_per_compiler[compiler]: - packages_per_compiler[compiler][arch] = [] - - packages_per_compiler[compiler][arch].append(dep_pkg) - - compiler = request.pkg.spec.compiler - arch = request.pkg.spec.architecture - - if compiler not in packages_per_compiler: - packages_per_compiler[compiler] = {} - - if arch not in packages_per_compiler[compiler]: - packages_per_compiler[compiler][arch] = [] - - packages_per_compiler[compiler][arch].append(request.pkg) - - for compiler, archs in packages_per_compiler.items(): - for arch, packages in archs.items(): - self._add_bootstrap_compilers(compiler, arch, packages, request, all_deps) if install_deps: for dep in request.traverse_dependencies(): @@ -1584,7 +1723,7 @@ def _add_tasks(self, request: BuildRequest, all_deps): dep_id = package_id(dep) if dep_id not in self.build_tasks: - self._add_init_task(dep_pkg, request, False, all_deps) + self._add_init_task(dep_pkg, request, all_deps=all_deps) # Clear any persistent failure markings _unless_ they are # associated with another process in this parallel build @@ -1602,87 +1741,29 @@ def _add_tasks(self, request: BuildRequest, all_deps): self._check_deps_status(request) # Now add the package itself, if appropriate - self._add_init_task(request.pkg, request, False, all_deps) + self._add_init_task(request.pkg, request, all_deps=all_deps) # Ensure if one request is to fail fast then all requests will. fail_fast = bool(request.install_args.get("fail_fast")) self.fail_fast = self.fail_fast or fail_fast - def _add_compiler_package_to_config(self, pkg: "spack.package_base.PackageBase") -> None: - compiler_search_prefix = getattr(pkg, "compiler_search_prefix", pkg.spec.prefix) - spack.compilers.find_compilers([compiler_search_prefix]) - - def _install_task(self, task: BuildTask, install_status: InstallStatus) -> None: + def _install_task(self, task: Task, install_status: InstallStatus) -> None: """ Perform the installation of the requested spec and/or dependency - represented by the build task. + represented by the task. Args: - task: the installation build task for a package + task: the installation task for a package install_status: the installation status for the package""" - - explicit = task.explicit - install_args = task.request.install_args - cache_only = task.cache_only - use_cache = task.use_cache - tests = install_args.get("tests", False) - assert isinstance(tests, (bool, list)) # make mypy happy. - unsigned: Optional[bool] = install_args.get("unsigned") - - pkg, pkg_id = task.pkg, task.pkg_id - - tty.msg(install_msg(pkg_id, self.pid, install_status)) - task.start = task.start or time.time() - task.status = STATUS_INSTALLING - - # Use the binary cache if requested - if use_cache: - if _install_from_cache(pkg, explicit, unsigned): - self._update_installed(task) - if task.compiler: - self._add_compiler_package_to_config(pkg) - return - elif cache_only: - raise InstallError("No binary found when cache-only was specified", pkg=pkg) - else: - tty.msg(f"No binary for {pkg_id} found: installing from source") - - pkg.run_tests = tests if isinstance(tests, bool) else pkg.name in tests - - # hook that allows tests to inspect the Package before installation - # see unit_test_check() docs. - if not pkg.unit_test_check(): - return - - try: - self._setup_install_dir(pkg) - - # Create stage object now and let it be serialized for the child process. That - # way monkeypatch in tests works correctly. - pkg.stage - - # Create a child process to do the actual installation. - # Preserve verbosity settings across installs. - spack.package_base.PackageBase._verbose = spack.build_environment.start_build_process( - pkg, build_process, install_args - ) - # Note: PARENT of the build process adds the new package to - # the database, so that we don't need to re-read from file. - spack.store.STORE.db.add(pkg.spec, explicit=explicit) - - # If a compiler, ensure it is added to the configuration - if task.compiler: - self._add_compiler_package_to_config(pkg) - except spack.build_environment.StopPhase as e: - # A StopPhase exception means that do_install was asked to - # stop early from clients, and is not an error at this point - pid = f"{self.pid}: " if tty.show_pid() else "" - tty.debug(f"{pid}{str(e)}") - tty.debug(f"Package stage directory: {pkg.stage.source_path}") + rc = task.execute(install_status) + if rc == ExecuteResult.MISSING_BUILD_SPEC: + self._requeue_with_build_spec_tasks(task) + else: # if rc == ExecuteResult.SUCCESS or rc == ExecuteResult.FAILED + self._update_installed(task) def _next_is_pri0(self) -> bool: """ - Determine if the next build task has priority 0 + Determine if the next task has priority 0 Return: True if it does, False otherwise @@ -1692,31 +1773,31 @@ def _next_is_pri0(self) -> bool: task = self.build_pq[0][1] return task.priority == 0 - def _pop_task(self) -> Optional[BuildTask]: + def _pop_task(self) -> Optional[Task]: """ - Remove and return the lowest priority build task. + Remove and return the lowest priority task. Source: Variant of function at docs.python.org/2/library/heapq.html """ while self.build_pq: task = heapq.heappop(self.build_pq)[1] - if task.status != STATUS_REMOVED: + if task.status != BuildStatus.REMOVED: del self.build_tasks[task.pkg_id] - task.status = STATUS_DEQUEUED + task.status = BuildStatus.DEQUEUED return task return None - def _push_task(self, task: BuildTask) -> None: + def _push_task(self, task: Task) -> None: """ - Push (or queue) the specified build task for the package. + Push (or queue) the specified task for the package. Source: Customization of "add_task" function at docs.python.org/2/library/heapq.html Args: - task: the installation build task for a package + task: the installation task for a package """ - msg = "{0} a build task for {1} with status '{2}'" + msg = "{0} a task for {1} with status '{2}'" skip = "Skipping requeue of task for {0}: {1}" # Ensure do not (re-)queue installed or failed packages whose status @@ -1729,9 +1810,11 @@ def _push_task(self, task: BuildTask) -> None: tty.debug(skip.format(task.pkg_id, "failed")) return - # Remove any associated build task since its sequence will change + # Remove any associated task since its sequence will change self._remove_task(task.pkg_id) - desc = "Queueing" if task.attempts == 0 else "Requeueing" + desc = ( + "Queueing" if task.attempts == 1 else f"Requeueing ({ordinal(task.attempts)} attempt)" + ) tty.debug(msg.format(desc, task.pkg_id, task.status)) # Now add the new task to the queue with a new sequence number to @@ -1762,9 +1845,9 @@ def _release_lock(self, pkg_id: str) -> None: except Exception as exc: tty.warn(err.format(exc.__class__.__name__, ltype, pkg_id, str(exc))) - def _remove_task(self, pkg_id: str) -> Optional[BuildTask]: + def _remove_task(self, pkg_id: str) -> Optional[Task]: """ - Mark the existing package build task as being removed and return it. + Mark the existing package task as being removed and return it. Raises KeyError if not found. Source: Variant of function at docs.python.org/2/library/heapq.html @@ -1773,71 +1856,39 @@ def _remove_task(self, pkg_id: str) -> Optional[BuildTask]: pkg_id: identifier for the package to be removed """ if pkg_id in self.build_tasks: - tty.debug(f"Removing build task for {pkg_id} from list") + tty.debug(f"Removing task for {pkg_id} from list") task = self.build_tasks.pop(pkg_id) - task.status = STATUS_REMOVED + task.status = BuildStatus.REMOVED return task else: return None - def _requeue_task(self, task: BuildTask, install_status: InstallStatus) -> None: + def _requeue_task(self, task: Task, install_status: InstallStatus) -> None: """ Requeues a task that appears to be in progress by another process. Args: - task (BuildTask): the installation build task for a package + task (Task): the installation task for a package """ - if task.status not in [STATUS_INSTALLED, STATUS_INSTALLING]: + if task.status not in [BuildStatus.INSTALLED, BuildStatus.INSTALLING]: tty.debug( f"{install_msg(task.pkg_id, self.pid, install_status)} " "in progress by another process" ) new_task = task.next_attempt(self.installed) - new_task.status = STATUS_INSTALLING + new_task.status = BuildStatus.INSTALLING self._push_task(new_task) - def _setup_install_dir(self, pkg: "spack.package_base.PackageBase") -> None: - """ - Create and ensure proper access controls for the install directory. - Write a small metadata file with the current spack environment. - - Args: - pkg: the package to be built and installed - """ - if not os.path.exists(pkg.spec.prefix): - path = spack.util.path.debug_padded_filter(pkg.spec.prefix) - tty.debug(f"Creating the installation directory {path}") - spack.store.STORE.layout.create_install_directory(pkg.spec) - else: - # Set the proper group for the prefix - group = prefs.get_package_group(pkg.spec) - if group: - fs.chgrp(pkg.spec.prefix, group) - - # Set the proper permissions. - # This has to be done after group because changing groups blows - # away the sticky group bit on the directory - mode = os.stat(pkg.spec.prefix).st_mode - perms = prefs.get_package_dir_permissions(pkg.spec) - if mode != perms: - os.chmod(pkg.spec.prefix, perms) - - # Ensure the metadata path exists as well - fs.mkdirp(spack.store.STORE.layout.metadata_path(pkg.spec), mode=perms) - - # Always write host environment - we assume this can change - spack.store.STORE.layout.write_host_environment(pkg.spec) - def _update_failed( - self, task: BuildTask, mark: bool = False, exc: Optional[BaseException] = None + self, task: Task, mark: bool = False, exc: Optional[BaseException] = None ) -> None: """ Update the task and transitive dependents as failed; optionally mark - externally as failed; and remove associated build tasks. + externally as failed; and remove associated tasks. Args: - task: the build task for the failed package + task: the task for the failed package mark: ``True`` if the package and its dependencies are to be marked as "failed", otherwise, ``False`` exc: optional exception if associated with the failure @@ -1849,34 +1900,34 @@ def _update_failed( self.failed[pkg_id] = spack.store.STORE.failure_tracker.mark(task.pkg.spec) else: self.failed[pkg_id] = None - task.status = STATUS_FAILED + task.status = BuildStatus.FAILED for dep_id in task.dependents: if dep_id in self.build_tasks: tty.warn(f"Skipping build of {dep_id} since {pkg_id} failed") # Ensure the dependent's uninstalled dependents are - # up-to-date and their build tasks removed. + # up-to-date and their tasks removed. dep_task = self.build_tasks[dep_id] self._update_failed(dep_task, mark) self._remove_task(dep_id) else: - tty.debug(f"No build task for {dep_id} to skip since {pkg_id} failed") + tty.debug(f"No task for {dep_id} to skip since {pkg_id} failed") - def _update_installed(self, task: BuildTask) -> None: + def _update_installed(self, task: Task) -> None: """ - Mark the task as installed and ensure dependent build tasks are aware. + Mark the task as installed and ensure dependent tasks are aware. Args: - task (BuildTask): the build task for the installed package + task: the task for the installed package """ - task.status = STATUS_INSTALLED + task.status = BuildStatus.INSTALLED self._flag_installed(task.pkg, task.dependents) def _flag_installed( self, pkg: "spack.package_base.PackageBase", dependent_ids: Optional[Set[str]] = None ) -> None: """ - Flag the package as installed and ensure known by all build tasks of + Flag the package as installed and ensure known by all tasks of known dependents. Args: @@ -1904,7 +1955,7 @@ def _flag_installed( dep_task = self.build_tasks[dep_id] self._push_task(dep_task.next_attempt(self.installed)) else: - tty.debug(f"{dep_id} has no build task to update for {pkg_id}'s success") + tty.debug(f"{dep_id} has no task to update for {pkg_id}'s success") def _init_queue(self) -> None: """Initialize the build queue from the list of build requests.""" @@ -1923,8 +1974,9 @@ def _init_queue(self) -> None: task = self.build_tasks[dep_id] for dependent_id in dependents.difference(task.dependents): task.add_dependent(dependent_id) + self.all_dependencies = all_dependencies - def _install_action(self, task: BuildTask) -> int: + def _install_action(self, task: Task) -> InstallAction: """ Determine whether the installation should be overwritten (if it already exists) or skipped (if has been handled by another process). @@ -2006,7 +2058,7 @@ def install(self) -> None: tty.warn(f"{pkg_id} does NOT actually have any uninstalled deps left") dep_str = "dependencies" if task.priority > 1 else "dependency" - raise InstallError( + raise spack.error.InstallError( f"Cannot proceed with {pkg_id}: {task.priority} uninstalled " f"{dep_str}: {','.join(task.uninstalled_deps)}", pkg=pkg, @@ -2028,7 +2080,7 @@ def install(self) -> None: self._update_failed(task) if self.fail_fast: - raise InstallError(fail_fast_err, pkg=pkg) + raise spack.error.InstallError(fail_fast_err, pkg=pkg) continue @@ -2072,11 +2124,6 @@ def install(self) -> None: self._update_installed(task) path = spack.util.path.debug_padded_filter(pkg.prefix) _print_installed_pkg(path) - - # It's an already installed compiler, add it to the config - if task.compiler: - self._add_compiler_package_to_config(pkg) - else: # At this point we've failed to get a write or a read # lock, which means another process has taken a write @@ -2116,8 +2163,6 @@ def install(self) -> None: # wrapper -- silence mypy OverwriteInstall(self, spack.store.STORE.db, task, install_status).install() # type: ignore[arg-type] # noqa: E501 - self._update_installed(task) - # If we installed then we should keep the prefix stop_before_phase = getattr(pkg, "stop_before_phase", None) last_phase = getattr(pkg, "last_phase", None) @@ -2161,7 +2206,9 @@ def install(self) -> None: ) # Terminate if requested to do so on the first failure. if self.fail_fast: - raise InstallError(f"{fail_fast_err}: {str(exc)}", pkg=pkg) + raise spack.error.InstallError( + f"{fail_fast_err}: {str(exc)}", pkg=pkg + ) from exc # Terminate when a single build request has failed, or summarize errors later. if task.is_build_request: @@ -2177,7 +2224,8 @@ def install(self) -> None: # Perform basic task cleanup for the installed spec to # include downgrading the write to a read lock - self._cleanup_task(pkg) + if pkg.spec.installed: + self._cleanup_task(pkg) # Cleanup, which includes releasing all of the read locks self._cleanup_all_tasks() @@ -2213,7 +2261,7 @@ def install(self) -> None: f"missing package ({ids[0]}) from {', '.join(ids)}" ) - raise InstallError( + raise spack.error.InstallError( "Installation request failed. Refer to reported errors for failing package(s).", pkg=pkg, ) @@ -2230,7 +2278,7 @@ def __init__(self, pkg: "spack.package_base.PackageBase", install_args: dict): Arguments: pkg: the package being installed. - install_args: arguments to do_install() from parent process. + install_args: arguments to the installer from parent process. """ self.pkg = pkg @@ -2302,7 +2350,7 @@ def run(self) -> bool: f"{self.pre} Building {self.pkg_id} [{self.pkg.build_system_class}]" # type: ignore[attr-defined] # noqa: E501 ) - # get verbosity from do_install() parameter or saved value + # get verbosity from install parameter or saved value self.echo = self.verbose if spack.package_base.PackageBase._verbose is not None: self.echo = spack.package_base.PackageBase._verbose @@ -2434,7 +2482,7 @@ def build_process(pkg: "spack.package_base.PackageBase", install_args: dict) -> Arguments: pkg: the package being installed. - install_args: arguments to do_install() from parent process. + install_args: arguments to installer from parent process. """ installer = BuildProcessInstaller(pkg, install_args) @@ -2444,12 +2492,48 @@ def build_process(pkg: "spack.package_base.PackageBase", install_args: dict) -> return installer.run() +def deprecate(spec: "spack.spec.Spec", deprecator: "spack.spec.Spec", link_fn) -> None: + """Deprecate this package in favor of deprecator spec""" + # Here we assume we don't deprecate across different stores, and that same hash + # means same binary artifacts + if spec.dag_hash() == deprecator.dag_hash(): + return + + # We can't really have control over external specs, and cannot link anything in their place + if spec.external: + return + + # Install deprecator if it isn't installed already + if not spack.store.STORE.db.query(deprecator): + PackageInstaller([deprecator.package], explicit=True).install() + + old_deprecator = spack.store.STORE.db.deprecator(spec) + if old_deprecator: + # Find this spec file from its old deprecation + specfile = spack.store.STORE.layout.deprecated_file_path(spec, old_deprecator) + else: + specfile = spack.store.STORE.layout.spec_file_path(spec) + + # copy spec metadata to "deprecated" dir of deprecator + depr_specfile = spack.store.STORE.layout.deprecated_file_path(spec, deprecator) + fs.mkdirp(os.path.dirname(depr_specfile)) + shutil.copy2(specfile, depr_specfile) + + # Any specs deprecated in favor of this spec are re-deprecated in favor of its new deprecator + for deprecated in spack.store.STORE.db.specs_deprecated_by(spec): + deprecate(deprecated, deprecator, link_fn) + + # Now that we've handled metadata, uninstall and replace with link + spack.package_base.PackageBase.uninstall_by_spec(spec, force=True, deprecator=deprecator) + link_fn(deprecator.prefix, spec.prefix) + + class OverwriteInstall: def __init__( self, installer: PackageInstaller, database: spack.database.Database, - task: BuildTask, + task: Task, install_status: InstallStatus, ): self.installer = installer @@ -2479,33 +2563,21 @@ def install(self): raise e.inner_exception -class InstallError(spack.error.SpackError): - """Raised when something goes wrong during install or uninstall. - - The error can be annotated with a ``pkg`` attribute to allow the - caller to get the package for which the exception was raised. - """ - - def __init__(self, message, long_msg=None, pkg=None): - super().__init__(message, long_msg) - self.pkg = pkg - - -class BadInstallPhase(InstallError): +class BadInstallPhase(spack.error.InstallError): """Raised for an install phase option is not allowed for a package.""" def __init__(self, pkg_name, phase): super().__init__(f"'{phase}' is not a valid phase for package {pkg_name}") -class ExternalPackageError(InstallError): +class ExternalPackageError(spack.error.InstallError): """Raised by install() when a package is only for external use.""" -class InstallLockError(InstallError): +class InstallLockError(spack.error.InstallError): """Raised during install when something goes wrong with package locking.""" -class UpstreamPackageError(InstallError): +class UpstreamPackageError(spack.error.InstallError): """Raised during install when something goes wrong with an upstream package.""" diff --git a/lib/spack/spack/main.py b/lib/spack/spack/main.py index 78fda27c4628c4..c0bb3d33552776 100644 --- a/lib/spack/spack/main.py +++ b/lib/spack/spack/main.py @@ -9,6 +9,8 @@ after the system path is set up. """ import argparse + +# import spack.modules.common import inspect import io import operator @@ -32,20 +34,20 @@ import llnl.util.tty.color as color from llnl.util.tty.log import log_output +import spack import spack.cmd import spack.config import spack.environment as ev +import spack.error import spack.modules import spack.paths import spack.platforms import spack.repo -import spack.solver.asp import spack.spec import spack.store import spack.util.debug import spack.util.environment -import spack.util.git -import spack.util.path +import spack.util.lock from spack.error import SpackError #: names of profile statistics @@ -98,75 +100,18 @@ #: Properties that commands are required to set. required_command_properties = ["level", "section", "description"] -#: Recorded directory where spack command was originally invoked -spack_working_dir = None spack_ld_library_path = os.environ.get("LD_LIBRARY_PATH", "") #: Whether to print backtraces on error SHOW_BACKTRACE = False -def set_working_dir(): - """Change the working directory to getcwd, or spack prefix if no cwd.""" - global spack_working_dir - try: - spack_working_dir = os.getcwd() - except OSError: - os.chdir(spack.paths.prefix) - spack_working_dir = spack.paths.prefix - - def add_all_commands(parser): """Add all spack subcommands to the parser.""" for cmd in spack.cmd.all_commands(): parser.add_command(cmd) -def get_spack_commit(): - """Get the Spack git commit sha. - - Returns: - (str or None) the commit sha if available, otherwise None - """ - git_path = os.path.join(spack.paths.prefix, ".git") - if not os.path.exists(git_path): - return None - - git = spack.util.git.git() - if not git: - return None - - rev = git( - "-C", - spack.paths.prefix, - "rev-parse", - "HEAD", - output=str, - error=os.devnull, - fail_on_error=False, - ) - if git.returncode != 0: - return None - - match = re.match(r"[a-f\d]{7,}$", rev) - return match.group(0) if match else None - - -def get_version(): - """Get a descriptive version of this instance of Spack. - - Outputs ' ()'. - - The commit sha is only added when available. - """ - version = spack.spack_version - commit = get_spack_commit() - if commit: - version += " ({0})".format(commit) - - return version - - def index_commands(): """create an index of commands by section for this help level""" index = {} @@ -810,6 +755,8 @@ def print_setup_info(*info): This is in ``main.py`` to make it fast; the setup scripts need to invoke spack in login scripts, and it needs to be quick. """ + import spack.modules.common + shell = "csh" if "csh" in info else "sh" def shell_set(var, value): @@ -954,7 +901,7 @@ def _main(argv=None): # version is special as it does not require a command or loading and additional infrastructure if args.version: - print(get_version()) + print(spack.get_version()) return 0 # ------------------------------------------------------------------------ @@ -1039,7 +986,7 @@ def finish_parse_and_run(parser, cmd_name, main_args, env_format_error): raise env_format_error # many operations will fail without a working directory. - set_working_dir() + spack.paths.set_working_dir() # now we can actually execute the command. if main_args.spack_profile or main_args.sorted_profile: diff --git a/lib/spack/spack/modules/__init__.py b/lib/spack/spack/modules/__init__.py index b466b2aafb428a..39d696b1369ff1 100644 --- a/lib/spack/spack/modules/__init__.py +++ b/lib/spack/spack/modules/__init__.py @@ -7,8 +7,16 @@ include Tcl non-hierarchical modules, Lua hierarchical modules, and others. """ +import os from typing import Dict, Type +import llnl.util.tty as tty + +import spack.repo +import spack.spec +import spack.store + +from . import common from .common import BaseModuleFileWriter, disable_modules from .lmod import LmodModulefileWriter from .tcl import TclModulefileWriter @@ -19,3 +27,66 @@ "tcl": TclModulefileWriter, "lmod": LmodModulefileWriter, } + + +def get_module( + module_type, spec: spack.spec.Spec, get_full_path, module_set_name="default", required=True +): + """Retrieve the module file for a given spec and module type. + + Retrieve the module file for the given spec if it is available. If the + module is not available, this will raise an exception unless the module + is excluded or if the spec is installed upstream. + + Args: + module_type: the type of module we want to retrieve (e.g. lmod) + spec: refers to the installed package that we want to retrieve a module + for + required: if the module is required but excluded, this function will + print a debug message. If a module is missing but not excluded, + then an exception is raised (regardless of whether it is required) + get_full_path: if ``True``, this returns the full path to the module. + Otherwise, this returns the module name. + module_set_name: the named module configuration set from modules.yaml + for which to retrieve the module. + + Returns: + The module name or path. May return ``None`` if the module is not + available. + """ + try: + upstream = spec.installed_upstream + except spack.repo.UnknownPackageError: + upstream, record = spack.store.STORE.db.query_by_spec_hash(spec.dag_hash()) + if upstream: + module = common.upstream_module_index.upstream_module(spec, module_type) + if not module: + return None + + if get_full_path: + return module.path + else: + return module.use_name + else: + writer = module_types[module_type](spec, module_set_name) + if not os.path.isfile(writer.layout.filename): + fmt_str = "{name}{@version}{/hash:7}" + if not writer.conf.excluded: + raise common.ModuleNotFoundError( + "The module for package {} should be at {}, but it does not exist".format( + spec.format(fmt_str), writer.layout.filename + ) + ) + elif required: + tty.debug( + "The module configuration has excluded {}: omitting it".format( + spec.format(fmt_str) + ) + ) + else: + return None + + if get_full_path: + return writer.layout.filename + else: + return writer.layout.use_name diff --git a/lib/spack/spack/modules/common.py b/lib/spack/spack/modules/common.py index 5e46ca4c6c3a85..7875ab55616fd8 100644 --- a/lib/spack/spack/modules/common.py +++ b/lib/spack/spack/modules/common.py @@ -46,10 +46,8 @@ import spack.deptypes as dt import spack.environment import spack.error -import spack.modules.common import spack.paths import spack.projections as proj -import spack.repo import spack.schema.environment import spack.spec import spack.store @@ -324,67 +322,6 @@ def upstream_module(self, spec, module_type): return None -def get_module(module_type, spec, get_full_path, module_set_name="default", required=True): - """Retrieve the module file for a given spec and module type. - - Retrieve the module file for the given spec if it is available. If the - module is not available, this will raise an exception unless the module - is excluded or if the spec is installed upstream. - - Args: - module_type: the type of module we want to retrieve (e.g. lmod) - spec: refers to the installed package that we want to retrieve a module - for - required: if the module is required but excluded, this function will - print a debug message. If a module is missing but not excluded, - then an exception is raised (regardless of whether it is required) - get_full_path: if ``True``, this returns the full path to the module. - Otherwise, this returns the module name. - module_set_name: the named module configuration set from modules.yaml - for which to retrieve the module. - - Returns: - The module name or path. May return ``None`` if the module is not - available. - """ - try: - upstream = spec.installed_upstream - except spack.repo.UnknownPackageError: - upstream, record = spack.store.STORE.db.query_by_spec_hash(spec.dag_hash()) - if upstream: - module = spack.modules.common.upstream_module_index.upstream_module(spec, module_type) - if not module: - return None - - if get_full_path: - return module.path - else: - return module.use_name - else: - writer = spack.modules.module_types[module_type](spec, module_set_name) - if not os.path.isfile(writer.layout.filename): - fmt_str = "{name}{@version}{/hash:7}" - if not writer.conf.excluded: - raise ModuleNotFoundError( - "The module for package {} should be at {}, but it does not exist".format( - spec.format(fmt_str), writer.layout.filename - ) - ) - elif required: - tty.debug( - "The module configuration has excluded {}: omitting it".format( - spec.format(fmt_str) - ) - ) - else: - return None - - if get_full_path: - return writer.layout.filename - else: - return writer.layout.use_name - - class BaseConfiguration: """Manipulates the information needed to generate a module file to make querying easier. It needs to be sub-classed for specific module types. diff --git a/lib/spack/spack/oci/oci.py b/lib/spack/spack/oci/oci.py index cacb53e08c0baf..1b84860d2682cb 100644 --- a/lib/spack/spack/oci/oci.py +++ b/lib/spack/spack/oci/oci.py @@ -15,17 +15,10 @@ import llnl.util.tty as tty -import spack.binary_distribution -import spack.config -import spack.error import spack.fetch_strategy import spack.mirror import spack.oci.opener -import spack.repo -import spack.spec import spack.stage -import spack.traverse -import spack.util.crypto import spack.util.url from .image import Digest, ImageReference @@ -37,11 +30,6 @@ class Blob(NamedTuple): size: int -def create_tarball(spec: spack.spec.Spec, tarfile_path): - buildinfo = spack.binary_distribution.get_buildinfo_dict(spec) - return spack.binary_distribution._do_create_tarball(tarfile_path, spec.prefix, buildinfo) - - def with_query_param(url: str, param: str, value: str) -> str: """Add a query parameter to a URL diff --git a/lib/spack/spack/oci/opener.py b/lib/spack/spack/oci/opener.py index 53535b85ed7672..906d5d2b92c60b 100644 --- a/lib/spack/spack/oci/opener.py +++ b/lib/spack/spack/oci/opener.py @@ -22,7 +22,6 @@ import spack.config import spack.mirror import spack.parser -import spack.repo import spack.util.web from .image import ImageReference diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index d0b7beda1d6d49..bf8538032ae462 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -11,6 +11,8 @@ from os import chdir, environ, getcwd, makedirs, mkdir, remove, removedirs from shutil import move, rmtree +from spack.error import InstallError + # Emulate some shell commands for convenience env = environ cd = chdir @@ -73,6 +75,7 @@ from spack.build_systems.waf import WafPackage from spack.build_systems.xorg import XorgPackage from spack.builder import run_after, run_before +from spack.config import determine_number_of_jobs from spack.deptypes import ALL_TYPES as all_deptypes from spack.directives import * from spack.install_test import ( @@ -84,12 +87,7 @@ install_test_root, test_part, ) -from spack.installer import ( - ExternalPackageError, - InstallError, - InstallLockError, - UpstreamPackageError, -) +from spack.installer import ExternalPackageError, InstallLockError, UpstreamPackageError from spack.mixins import filter_compiler_wrappers from spack.multimethod import default_args, when from spack.package_base import ( @@ -101,9 +99,10 @@ install_dependency_symlinks, on_package_attributes, ) +from spack.package_completions import * from spack.spec import InvalidSpecDetected, Spec -from spack.util.cpus import determine_number_of_jobs from spack.util.executable import * +from spack.util.filesystem import file_command, fix_darwin_install_name, mime_type from spack.variant import ( any_combination_of, auto_or_any_combination_of, diff --git a/lib/spack/spack/package_base.py b/lib/spack/spack/package_base.py index e518fb00ac17a9..5927c0935735a6 100644 --- a/lib/spack/spack/package_base.py +++ b/lib/spack/spack/package_base.py @@ -19,7 +19,6 @@ import io import os import re -import shutil import sys import textwrap import time @@ -33,40 +32,32 @@ from llnl.util.lang import classproperty, memoized from llnl.util.link_tree import LinkTree +import spack.build_environment +import spack.builder import spack.compilers import spack.config import spack.dependency import spack.deptypes as dt import spack.directives -import spack.directory_layout -import spack.environment import spack.error import spack.fetch_strategy as fs import spack.hooks import spack.mirror -import spack.mixins import spack.multimethod import spack.patch -import spack.paths import spack.repo import spack.spec import spack.store import spack.url import spack.util.environment +import spack.util.executable import spack.util.path import spack.util.web +from spack.error import InstallError, NoURLError, PackageError from spack.filesystem_view import YamlFilesystemView -from spack.install_test import ( - PackageTest, - TestFailure, - TestStatus, - TestSuite, - cache_extra_test_sources, - install_test_root, -) -from spack.installer import InstallError, PackageInstaller +from spack.install_test import PackageTest, TestSuite +from spack.solver.version_order import concretization_version_order from spack.stage import DevelopStage, ResourceStage, Stage, StageComposite, compute_stage_name -from spack.util.executable import ProcessError, which from spack.util.package_hash import package_hash from spack.version import GitVersion, StandardVersion @@ -116,7 +107,6 @@ def preferred_version(pkg: "PackageBase"): Arguments: pkg: The package whose versions are to be assessed. """ - from spack.solver.asp import concretization_version_order version, _ = max(pkg.versions.items(), key=concretization_version_order) return version @@ -451,10 +441,11 @@ def _by_name( else: all_by_name.setdefault(name, []).append(value) + # this needs to preserve the insertion order of whens return dict(sorted(all_by_name.items())) -def _names(when_indexed_dictionary): +def _names(when_indexed_dictionary: WhenDict) -> List[str]: """Get sorted names from dicts keyed by when/name.""" all_names = set() for when, by_name in when_indexed_dictionary.items(): @@ -464,6 +455,45 @@ def _names(when_indexed_dictionary): return sorted(all_names) +WhenVariantList = List[Tuple["spack.spec.Spec", "spack.variant.Variant"]] + + +def _remove_overridden_vdefs(variant_defs: WhenVariantList) -> None: + """Remove variant defs from the list if their when specs are satisfied by later ones. + + Any such variant definitions are *always* overridden by their successor, as it will + match everything the predecessor matches, and the solver will prefer it because of + its higher precedence. + + We can just remove these defs from variant definitions and avoid putting them in the + solver. This is also useful for, e.g., `spack info`, where we don't want to show a + variant from a superclass if it is always overridden by a variant defined in a + subclass. + + Example:: + + class ROCmPackage: + variant("amdgpu_target", ..., when="+rocm") + + class Hipblas: + variant("amdgpu_target", ...) + + The subclass definition *always* overrides the superclass definition here, but they + have different when specs and the subclass def won't just replace the one in the + superclass. In this situation, the subclass should *probably* also have + ``when="+rocm"``, but we can't guarantee that will always happen when a vdef is + overridden. So we use this method to remove any overrides we can know statically. + + """ + i = 0 + while i < len(variant_defs): + when, vdef = variant_defs[i] + if any(when.satisfies(successor) for successor, _ in variant_defs[i + 1 :]): + del variant_defs[i] + else: + i += 1 + + class RedistributionMixin: """Logic for determining whether a Package is source/binary redistributable. @@ -516,19 +546,16 @@ class PackageBase(WindowsRPath, PackageViewMixin, RedistributionMixin, metaclass There are two main parts of a Spack package: - 1. **The package class**. Classes contain ``directives``, which are - special functions, that add metadata (versions, patches, - dependencies, and other information) to packages (see - ``directives.py``). Directives provide the constraints that are - used as input to the concretizer. + 1. **The package class**. Classes contain ``directives``, which are special functions, that + add metadata (versions, patches, dependencies, and other information) to packages (see + ``directives.py``). Directives provide the constraints that are used as input to the + concretizer. - 2. **Package instances**. Once instantiated, a package is - essentially a software installer. Spack calls methods like - ``do_install()`` on the ``Package`` object, and it uses those to - drive user-implemented methods like ``patch()``, ``install()``, and - other build steps. To install software, an instantiated package - needs a *concrete* spec, which guides the behavior of the various - install methods. + 2. **Package instances**. Once instantiated, a package can be passed to the PackageInstaller. + It calls methods like ``do_stage()`` on the ``Package`` object, and it uses those to drive + user-implemented methods like ``patch()``, ``install()``, and other build steps. To + install software, an instantiated package needs a *concrete* spec, which guides the + behavior of the various install methods. Packages are imported from repos (see ``repo.py``). @@ -550,7 +577,6 @@ class PackageBase(WindowsRPath, PackageViewMixin, RedistributionMixin, metaclass p.do_fetch() # downloads tarball from a URL (or VCS) p.do_stage() # expands tarball in a temp directory p.do_patch() # applies patches to expanded source - p.do_install() # calls package's install() function p.do_uninstall() # removes install directory although packages that do not have code have nothing to fetch so omit @@ -596,7 +622,7 @@ class PackageBase(WindowsRPath, PackageViewMixin, RedistributionMixin, metaclass provided: Dict["spack.spec.Spec", Set["spack.spec.Spec"]] provided_together: Dict["spack.spec.Spec", List[Set[str]]] patches: Dict["spack.spec.Spec", List["spack.patch.Patch"]] - variants: Dict[str, Tuple["spack.variant.Variant", "spack.spec.Spec"]] + variants: Dict["spack.spec.Spec", Dict[str, "spack.variant.Variant"]] languages: Dict["spack.spec.Spec", Set[str]] #: By default, packages are not virtual @@ -750,6 +776,72 @@ def dependency_names(cls): def dependencies_by_name(cls, when: bool = False): return _by_name(cls.dependencies, when=when) + # Accessors for variants + # External code workingw with Variants should go through the methods below + + @classmethod + def variant_names(cls) -> List[str]: + return _names(cls.variants) + + @classmethod + def has_variant(cls, name) -> bool: + return any(name in dictionary for dictionary in cls.variants.values()) + + @classmethod + def num_variant_definitions(cls) -> int: + """Total number of variant definitions in this class so far.""" + return sum(len(variants_by_name) for variants_by_name in cls.variants.values()) + + @classmethod + def variant_definitions(cls, name: str) -> WhenVariantList: + """Iterator over (when_spec, Variant) for all variant definitions for a particular name.""" + # construct a list of defs sorted by precedence + defs: WhenVariantList = [] + for when, variants_by_name in cls.variants.items(): + variant_def = variants_by_name.get(name) + if variant_def: + defs.append((when, variant_def)) + + # With multiple definitions, ensure precedence order and simplify overrides + if len(defs) > 1: + defs.sort(key=lambda v: v[1].precedence) + _remove_overridden_vdefs(defs) + + return defs + + @classmethod + def variant_items( + cls, + ) -> Iterable[Tuple["spack.spec.Spec", Dict[str, "spack.variant.Variant"]]]: + """Iterate over ``cls.variants.items()`` with overridden definitions removed.""" + # Note: This is quadratic in the average number of variant definitions per name. + # That is likely close to linear in practice, as there are few variants with + # multiple definitions (but it matters when they are there). + exclude = { + name: [id(vdef) for _, vdef in cls.variant_definitions(name)] + for name in cls.variant_names() + } + + for when, variants_by_name in cls.variants.items(): + filtered_variants_by_name = { + name: vdef for name, vdef in variants_by_name.items() if id(vdef) in exclude[name] + } + + if filtered_variants_by_name: + yield when, filtered_variants_by_name + + def get_variant(self, name: str) -> "spack.variant.Variant": + """Get the highest precedence variant definition matching this package's spec. + + Arguments: + name: name of the variant definition to get + """ + try: + highest_to_lowest = reversed(self.variant_definitions(name)) + return next(vdef for when, vdef in highest_to_lowest if self.spec.satisfies(when)) + except StopIteration: + raise ValueError(f"No variant '{name}' on spec: {self.spec}") + @classmethod def possible_dependencies( cls, @@ -1001,6 +1093,15 @@ def update_external_dependencies(self, extendee_spec=None): """ pass + def detect_dev_src_change(self): + """ + Method for checking for source code changes to trigger rebuild/reinstall + """ + dev_path_var = self.spec.variants.get("dev_path", None) + _, record = spack.store.STORE.db.query_by_spec_hash(self.spec.dag_hash()) + mtime = fsys.last_modification_time_recursive(dev_path_var.value) + return mtime > record.installation_time + def all_urls_for_version(self, version: StandardVersion) -> List[str]: """Return all URLs derived from version_urls(), url, urls, and list_url (if it contains a version) in a package in that order. @@ -1246,18 +1347,6 @@ def install_configure_args_path(self): """Return the configure args file path on successful installation.""" return os.path.join(self.metadata_dir, _spack_configure_argsfile) - # TODO (post-34236): Update tests and all packages that use this as a - # TODO (post-34236): package method to the function already available - # TODO (post-34236): to packages. Once done, remove this property. - @property - def install_test_root(self): - """Return the install test root directory.""" - tty.warn( - "The 'pkg.install_test_root' property is deprecated with removal " - "expected v0.23. Use 'install_test_root(pkg)' instead." - ) - return install_test_root(self) - def archive_install_test_log(self): """Archive the install-phase test log, if present.""" if getattr(self, "tester", None): @@ -1704,8 +1793,7 @@ def content_hash(self, content=None): # should this attempt to download the source and set one? This # probably only happens for source repositories which are # referenced by branch name rather than tag or commit ID. - env = spack.environment.active_environment() - from_local_sources = env and env.is_develop(self.spec) + from_local_sources = "dev_path" in self.spec.variants if self.has_code and not self.spec.external and not from_local_sources: message = "Missing a source id for {s.name}@{s.version}" tty.debug(message.format(s=self)) @@ -1772,13 +1860,22 @@ def _has_make_target(self, target): # # BSD Make: # make: don't know how to make test. Stop + # + # Note: "Stop." is not printed when running a Make jobserver (spack env depfile) that runs + # with `make -k/--keep-going` missing_target_msgs = [ - "No rule to make target `{0}'. Stop.", - "No rule to make target '{0}'. Stop.", - "don't know how to make {0}. Stop", + "No rule to make target `{0}'.", + "No rule to make target '{0}'.", + "don't know how to make {0}.", ] - kwargs = {"fail_on_error": False, "output": os.devnull, "error": str} + kwargs = { + "fail_on_error": False, + "output": os.devnull, + "error": str, + # Remove MAKEFLAGS to avoid inherited flags from Make jobserver (spack env depfile) + "extra_env": {"MAKEFLAGS": ""}, + } stderr = make("-n", target, **kwargs) @@ -1856,73 +1953,6 @@ def _resource_stage(self, resource): resource_stage_folder = "-".join(pieces) return resource_stage_folder - def do_install(self, **kwargs): - """Called by commands to install a package and or its dependencies. - - Package implementations should override install() to describe - their build process. - - Args: - cache_only (bool): Fail if binary package unavailable. - dirty (bool): Don't clean the build environment before installing. - explicit (bool): True if package was explicitly installed, False - if package was implicitly installed (as a dependency). - fail_fast (bool): Fail if any dependency fails to install; - otherwise, the default is to install as many dependencies as - possible (i.e., best effort installation). - fake (bool): Don't really build; install fake stub files instead. - force (bool): Install again, even if already installed. - install_deps (bool): Install dependencies before installing this - package - install_source (bool): By default, source is not installed, but - for debugging it might be useful to keep it around. - keep_prefix (bool): Keep install prefix on failure. By default, - destroys it. - keep_stage (bool): By default, stage is destroyed only if there - are no exceptions during build. Set to True to keep the stage - even with exceptions. - restage (bool): Force spack to restage the package source. - skip_patch (bool): Skip patch stage of build if True. - stop_before (str): stop execution before this - installation phase (or None) - stop_at (str): last installation phase to be executed - (or None) - tests (bool or list or set): False to run no tests, True to test - all packages, or a list of package names to run tests for some - use_cache (bool): Install from binary package, if available. - verbose (bool): Display verbose build output (by default, - suppresses it) - """ - explicit = kwargs.get("explicit", True) - if isinstance(explicit, bool): - kwargs["explicit"] = {self.spec.dag_hash()} if explicit else set() - PackageInstaller([self], kwargs).install() - - # TODO (post-34236): Update tests and all packages that use this as a - # TODO (post-34236): package method to the routine made available to - # TODO (post-34236): packages. Once done, remove this method. - def cache_extra_test_sources(self, srcs): - """Copy relative source paths to the corresponding install test subdir - - This method is intended as an optional install test setup helper for - grabbing source files/directories during the installation process and - copying them to the installation test subdirectory for subsequent use - during install testing. - - Args: - srcs (str or list): relative path for files and or - subdirectories located in the staged source path that are to - be copied to the corresponding location(s) under the install - testing directory. - """ - msg = ( - "'pkg.cache_extra_test_sources(srcs) is deprecated with removal " - "expected in v0.23. Use 'cache_extra_test_sources(pkg, srcs)' " - "instead." - ) - warnings.warn(msg) - cache_extra_test_sources(self, srcs) - def do_test(self, dirty=False, externals=False): if self.test_requires_compiler: compilers = spack.compilers.compilers_for_spec( @@ -1946,178 +1976,6 @@ def do_test(self, dirty=False, externals=False): self.tester.stand_alone_tests(kwargs) - # TODO (post-34236): Remove this deprecated method when eliminate test, - # TODO (post-34236): run_test, etc. - @property - def _test_deprecated_warning(self): - alt = f"Use any name starting with 'test_' instead in {self.spec.name}." - return f"The 'test' method is deprecated. {alt}" - - # TODO (post-34236): Remove this deprecated method when eliminate test, - # TODO (post-34236): run_test, etc. - def test(self): - # Defer tests to virtual and concrete packages - warnings.warn(self._test_deprecated_warning) - - # TODO (post-34236): Remove this deprecated method when eliminate test, - # TODO (post-34236): run_test, etc. - def run_test( - self, - exe, - options=[], - expected=[], - status=0, - installed=False, - purpose=None, - skip_missing=False, - work_dir=None, - ): - """Run the test and confirm the expected results are obtained - - Log any failures and continue, they will be re-raised later - - Args: - exe (str): the name of the executable - options (str or list): list of options to pass to the runner - expected (str or list): list of expected output strings. - Each string is a regex expected to match part of the output. - status (int or list): possible passing status values - with 0 meaning the test is expected to succeed - installed (bool): if ``True``, the executable must be in the - install prefix - purpose (str): message to display before running test - skip_missing (bool): skip the test if the executable is not - in the install prefix bin directory or the provided work_dir - work_dir (str or None): path to the smoke test directory - """ - - def test_title(purpose, test_name): - if not purpose: - return f"test: {test_name}: execute {test_name}" - - match = re.search(r"test: ([^:]*): (.*)", purpose) - if match: - # The test title has all the expected parts - return purpose - - match = re.search(r"test: (.*)", purpose) - if match: - reason = match.group(1) - return f"test: {test_name}: {reason}" - - return f"test: {test_name}: {purpose}" - - base_exe = os.path.basename(exe) - alternate = f"Use 'test_part' instead for {self.spec.name} to process {base_exe}." - warnings.warn(f"The 'run_test' method is deprecated. {alternate}") - - extra = re.compile(r"[\s,\- ]") - details = ( - [extra.sub("", options)] - if isinstance(options, str) - else [extra.sub("", os.path.basename(opt)) for opt in options] - ) - details = "_".join([""] + details) if details else "" - test_name = f"test_{base_exe}{details}" - tty.info(test_title(purpose, test_name), format="g") - - wdir = "." if work_dir is None else work_dir - with fsys.working_dir(wdir, create=True): - try: - runner = which(exe) - if runner is None and skip_missing: - self.tester.status(test_name, TestStatus.SKIPPED, f"{exe} is missing") - return - assert runner is not None, f"Failed to find executable '{exe}'" - - self._run_test_helper(runner, options, expected, status, installed, purpose) - self.tester.status(test_name, TestStatus.PASSED, None) - return True - except (AssertionError, BaseException) as e: - # print a summary of the error to the log file - # so that cdash and junit reporters know about it - exc_type, _, tb = sys.exc_info() - - self.tester.status(test_name, TestStatus.FAILED, str(e)) - - import traceback - - # remove the current call frame to exclude the extract_stack - # call from the error - stack = traceback.extract_stack()[:-1] - - # Package files have a line added at import time, so we re-read - # the file to make line numbers match. We have to subtract two - # from the line number because the original line number is - # inflated once by the import statement and the lines are - # displaced one by the import statement. - for i, entry in enumerate(stack): - filename, lineno, function, text = entry - if spack.repo.is_package_file(filename): - with open(filename, "r") as f: - lines = f.readlines() - new_lineno = lineno - 2 - text = lines[new_lineno] - stack[i] = (filename, new_lineno, function, text) - - # Format the stack to print and print it - out = traceback.format_list(stack) - for line in out: - print(line.rstrip("\n")) - - if exc_type is spack.util.executable.ProcessError: - out = io.StringIO() - spack.build_environment.write_log_summary( - out, "test", self.tester.test_log_file, last=1 - ) - m = out.getvalue() - else: - # We're below the package context, so get context from - # stack instead of from traceback. - # The traceback is truncated here, so we can't use it to - # traverse the stack. - context = spack.build_environment.get_package_context(tb) - m = "\n".join(context) if context else "" - - exc = e # e is deleted after this block - - # If we fail fast, raise another error - if spack.config.get("config:fail_fast", False): - raise TestFailure([(exc, m)]) - else: - self.tester.add_failure(exc, m) - return False - - # TODO (post-34236): Remove this deprecated method when eliminate test, - # TODO (post-34236): run_test, etc. - def _run_test_helper(self, runner, options, expected, status, installed, purpose): - status = [status] if isinstance(status, int) else status - expected = [expected] if isinstance(expected, str) else expected - options = [options] if isinstance(options, str) else options - - if installed: - msg = f"Executable '{runner.name}' expected in prefix, " - msg += f"found in {runner.path} instead" - assert runner.path.startswith(self.spec.prefix), msg - - tty.msg(f"Expecting return code in {status}") - - try: - output = runner(*options, output=str.split, error=str.split) - - assert 0 in status, f"Expected {runner.name} execution to fail" - except ProcessError as err: - output = str(err) - match = re.search(r"exited with status ([0-9]+)", output) - if not (match and int(match.group(1)) in status): - raise - - for check in expected: - cmd = " ".join([runner.name] + options) - msg = f"Expected '{check}' to match output of `{cmd}`" - msg += f"\n\nOutput: {output}" - assert re.search(check, output), msg - def unit_test_check(self): """Hook for unit tests to assert things about package internals. @@ -2354,35 +2212,6 @@ def do_uninstall(self, force=False): # delegate to instance-less method. PackageBase.uninstall_by_spec(self.spec, force) - def do_deprecate(self, deprecator, link_fn): - """Deprecate this package in favor of deprecator spec""" - spec = self.spec - - # Install deprecator if it isn't installed already - if not spack.store.STORE.db.query(deprecator): - deprecator.package.do_install() - - old_deprecator = spack.store.STORE.db.deprecator(spec) - if old_deprecator: - # Find this specs yaml file from its old deprecation - self_yaml = spack.store.STORE.layout.deprecated_file_path(spec, old_deprecator) - else: - self_yaml = spack.store.STORE.layout.spec_file_path(spec) - - # copy spec metadata to "deprecated" dir of deprecator - depr_yaml = spack.store.STORE.layout.deprecated_file_path(spec, deprecator) - fsys.mkdirp(os.path.dirname(depr_yaml)) - shutil.copy2(self_yaml, depr_yaml) - - # Any specs deprecated in favor of this spec are re-deprecated in - # favor of its new deprecator - for deprecated in spack.store.STORE.db.specs_deprecated_by(spec): - deprecated.package.do_deprecate(deprecator, link_fn) - - # Now that we've handled metadata, uninstall and replace with link - PackageBase.uninstall_by_spec(spec, force=True, deprecator=deprecator) - link_fn(deprecator.prefix, spec.prefix) - def view(self): """Create a view with the prefix of this package as the root. Extensions added to this view will modify the installation prefix of @@ -2589,20 +2418,6 @@ def __init__(self, spec, dependents): self.dependents = dependents -class PackageError(spack.error.SpackError): - """Raised when something is wrong with a package definition.""" - - def __init__(self, message, long_msg=None): - super().__init__(message, long_msg) - - -class NoURLError(PackageError): - """Raised when someone tries to build a URL for a package with no URLs.""" - - def __init__(self, cls): - super().__init__("Package %s has no version with a URL." % cls.__name__) - - class InvalidPackageOpError(PackageError): """Raised when someone tries perform an invalid operation on a package.""" diff --git a/lib/spack/spack/package_completions.py b/lib/spack/spack/package_completions.py new file mode 100644 index 00000000000000..b985d770932c46 --- /dev/null +++ b/lib/spack/spack/package_completions.py @@ -0,0 +1,48 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from pathlib import Path +from typing import Union + +"""Functions relating to shell autocompletion scripts for packages.""" + + +def bash_completion_path(root: Union[str, Path]) -> Path: + """ + Return standard path for bash completion scripts under root. + + Args: + root: The prefix root under which to generate the path. + + Returns: + Standard path for bash completion scripts under root. + """ + return Path(root) / "share" / "bash-completion" / "completions" + + +def zsh_completion_path(root: Union[str, Path]) -> Path: + """ + Return standard path for zsh completion scripts under root. + + Args: + root: The prefix root under which to generate the path. + + Returns: + Standard path for zsh completion scripts under root. + """ + return Path(root) / "share" / "zsh" / "site-functions" + + +def fish_completion_path(root: Union[str, Path]) -> Path: + """ + Return standard path for fish completion scripts under root. + + Args: + root: The prefix root under which to generate the path. + + Returns: + Standard path for fish completion scripts under root. + """ + return Path(root) / "share" / "fish" / "vendor_completions.d" diff --git a/lib/spack/spack/package_prefs.py b/lib/spack/spack/package_prefs.py index 2c8644e0b2e8bb..0204e156f11fb1 100644 --- a/lib/spack/spack/package_prefs.py +++ b/lib/spack/spack/package_prefs.py @@ -9,7 +9,7 @@ import spack.error import spack.repo import spack.spec -from spack.config import ConfigError +from spack.error import ConfigError from spack.version import Version _lesser_spec_types = {"compiler": spack.spec.CompilerSpec, "version": Version} @@ -149,10 +149,12 @@ def preferred_variants(cls, pkg_name): # Only return variants that are actually supported by the package pkg_cls = spack.repo.PATH.get_pkg_class(pkg_name) - spec = spack.spec.Spec("%s %s" % (pkg_name, variants)) - return dict( - (name, variant) for name, variant in spec.variants.items() if name in pkg_cls.variants - ) + spec = spack.spec.Spec(f"{pkg_name} {variants}") + return { + name: variant + for name, variant in spec.variants.items() + if name in pkg_cls.variant_names() + } def is_spec_buildable(spec): diff --git a/lib/spack/spack/parser.py b/lib/spack/spack/parser.py index 097af992832a0c..23739b6841ce0a 100644 --- a/lib/spack/spack/parser.py +++ b/lib/spack/spack/parser.py @@ -70,6 +70,7 @@ import spack.error import spack.spec import spack.version +from spack.error import SpecSyntaxError IS_WINDOWS = sys.platform == "win32" #: Valid name for specs and variants. Here we are not using @@ -600,10 +601,6 @@ def parse_one_or_raise( return result -class SpecSyntaxError(Exception): - """Base class for Spec syntax errors""" - - class SpecTokenizationError(SpecSyntaxError): """Syntax error in a spec string""" diff --git a/lib/spack/spack/patch.py b/lib/spack/spack/patch.py index 6a57f49bb07c25..a0f4152317c1e9 100644 --- a/lib/spack/spack/patch.py +++ b/lib/spack/spack/patch.py @@ -15,7 +15,7 @@ import spack import spack.error -import spack.fetch_strategy as fs +import spack.fetch_strategy import spack.mirror import spack.repo import spack.stage @@ -113,7 +113,7 @@ def apply(self, stage: "spack.stage.Stage") -> None: stage: stage where source code lives """ if not self.path or not os.path.isfile(self.path): - raise NoSuchPatchError(f"No such patch: {self.path}") + raise spack.error.NoSuchPatchError(f"No such patch: {self.path}") apply_patch(stage, self.path, self.level, self.working_dir, self.reverse) @@ -275,14 +275,14 @@ def __init__( self.ordering_key = ordering_key if allowed_archive(self.url) and not archive_sha256: - raise PatchDirectiveError( + raise spack.error.PatchDirectiveError( "Compressed patches require 'archive_sha256' " "and patch 'sha256' attributes: %s" % self.url ) self.archive_sha256 = archive_sha256 if not sha256: - raise PatchDirectiveError("URL patches require a sha256 checksum") + raise spack.error.PatchDirectiveError("URL patches require a sha256 checksum") self.sha256 = sha256 def apply(self, stage: "spack.stage.Stage") -> None: @@ -314,11 +314,15 @@ def stage(self) -> "spack.stage.Stage": # Two checksums, one for compressed file, one for its contents if self.archive_sha256 and self.sha256: - fetcher: fs.FetchStrategy = fs.FetchAndVerifyExpandedFile( - self.url, archive_sha256=self.archive_sha256, expanded_sha256=self.sha256 + fetcher: spack.fetch_strategy.FetchStrategy = ( + spack.fetch_strategy.FetchAndVerifyExpandedFile( + self.url, archive_sha256=self.archive_sha256, expanded_sha256=self.sha256 + ) ) else: - fetcher = fs.URLFetchStrategy(url=self.url, sha256=self.sha256, expand=False) + fetcher = spack.fetch_strategy.URLFetchStrategy( + url=self.url, sha256=self.sha256, expand=False + ) # The same package can have multiple patches with the same name but # with different contents, therefore apply a subset of the hash. @@ -397,7 +401,7 @@ def from_dict( sha256 = dictionary["sha256"] checker = Checker(sha256) if patch.path and not checker.check(patch.path): - raise fs.ChecksumError( + raise spack.fetch_strategy.ChecksumError( "sha256 checksum failed for %s" % patch.path, "Expected %s but got %s " % (sha256, checker.sum) + "Patch may have changed since concretization.", @@ -480,7 +484,7 @@ def patch_for_package(self, sha256: str, pkg: "spack.package_base.PackageBase") """ sha_index = self.index.get(sha256) if not sha_index: - raise PatchLookupError( + raise spack.error.PatchLookupError( f"Couldn't find patch for package {pkg.fullname} with sha256: {sha256}" ) @@ -490,7 +494,7 @@ def patch_for_package(self, sha256: str, pkg: "spack.package_base.PackageBase") if patch_dict: break else: - raise PatchLookupError( + raise spack.error.PatchLookupError( f"Couldn't find patch for package {pkg.fullname} with sha256: {sha256}" ) @@ -573,15 +577,3 @@ def _index_patches( index[patch.sha256] = {dspec_cls.fullname: patch_dict} return index - - -class NoSuchPatchError(spack.error.SpackError): - """Raised when a patch file doesn't exist.""" - - -class PatchLookupError(NoSuchPatchError): - """Raised when a patch file cannot be located from sha256.""" - - -class PatchDirectiveError(spack.error.SpackError): - """Raised when the wrong arguments are suppled to the patch directive.""" diff --git a/lib/spack/spack/paths.py b/lib/spack/spack/paths.py index aa642764215117..84583cd552f531 100644 --- a/lib/spack/spack/paths.py +++ b/lib/spack/spack/paths.py @@ -136,3 +136,16 @@ def _get_system_config_path(): #: System configuration location system_config_path = _get_system_config_path() + +#: Recorded directory where spack command was originally invoked +spack_working_dir = None + + +def set_working_dir(): + """Change the working directory to getcwd, or spack prefix if no cwd.""" + global spack_working_dir + try: + spack_working_dir = os.getcwd() + except OSError: + os.chdir(prefix) + spack_working_dir = prefix diff --git a/lib/spack/spack/platforms/__init__.py b/lib/spack/spack/platforms/__init__.py index e49f87b2a70f84..7b7a668fb1a184 100644 --- a/lib/spack/spack/platforms/__init__.py +++ b/lib/spack/spack/platforms/__init__.py @@ -51,7 +51,6 @@ def __call__(self): def use_platform(new_platform): global host - import spack.compilers import spack.config msg = '"{0}" must be an instance of Platform' @@ -61,16 +60,9 @@ def use_platform(new_platform): try: host = _PickleableCallable(new_platform) - - # Clear configuration and compiler caches spack.config.CONFIG.clear_caches() - spack.compilers._cache_config_files = [] - yield new_platform finally: host = original_host_fn - - # Clear configuration and compiler caches spack.config.CONFIG.clear_caches() - spack.compilers._cache_config_files = [] diff --git a/lib/spack/spack/platforms/_platform.py b/lib/spack/spack/platforms/_platform.py index c165cf9f3375af..866895896610cb 100644 --- a/lib/spack/spack/platforms/_platform.py +++ b/lib/spack/spack/platforms/_platform.py @@ -4,6 +4,8 @@ # SPDX-License-Identifier: (Apache-2.0 OR MIT) from typing import Optional +import archspec.cpu + import llnl.util.lang import spack.error @@ -60,7 +62,7 @@ def __init__(self, name): self.operating_sys = {} self.name = name - def add_target(self, name, target): + def add_target(self, name: str, target: archspec.cpu.Microarchitecture) -> None: """Used by the platform specific subclass to list available targets. Raises an error if the platform specifies a name that is reserved by spack as an alias. @@ -70,6 +72,10 @@ def add_target(self, name, target): raise ValueError(msg.format(name)) self.targets[name] = target + def _add_archspec_targets(self): + for name, microarchitecture in archspec.cpu.TARGETS.items(): + self.add_target(name, microarchitecture) + def target(self, name): """This is a getter method for the target dictionary that handles defaulting based on the values provided by default, diff --git a/lib/spack/spack/platforms/darwin.py b/lib/spack/spack/platforms/darwin.py index 1b7a5927f43ac2..7ea6a09c5838c4 100644 --- a/lib/spack/spack/platforms/darwin.py +++ b/lib/spack/spack/platforms/darwin.py @@ -7,7 +7,6 @@ import archspec.cpu -import spack.target from spack.operating_systems.mac_os import MacOs from spack.version import Version @@ -21,9 +20,7 @@ class Darwin(Platform): def __init__(self): super().__init__("darwin") - - for name in archspec.cpu.TARGETS: - self.add_target(name, spack.target.Target(name)) + self._add_archspec_targets() self.default = archspec.cpu.host().name self.front_end = self.default diff --git a/lib/spack/spack/platforms/freebsd.py b/lib/spack/spack/platforms/freebsd.py index 4485550789726e..af9b1a093464ba 100644 --- a/lib/spack/spack/platforms/freebsd.py +++ b/lib/spack/spack/platforms/freebsd.py @@ -6,7 +6,6 @@ import archspec.cpu -import spack.target from spack.operating_systems.freebsd import FreeBSDOs from ._platform import Platform @@ -18,8 +17,7 @@ class FreeBSD(Platform): def __init__(self): super().__init__("freebsd") - for name in archspec.cpu.TARGETS: - self.add_target(name, spack.target.Target(name)) + self._add_archspec_targets() # Get specific default self.default = archspec.cpu.host().name diff --git a/lib/spack/spack/platforms/linux.py b/lib/spack/spack/platforms/linux.py index 2be5b51cb295e2..aede37d8682417 100644 --- a/lib/spack/spack/platforms/linux.py +++ b/lib/spack/spack/platforms/linux.py @@ -6,7 +6,6 @@ import archspec.cpu -import spack.target from spack.operating_systems.linux_distro import LinuxDistro from ._platform import Platform @@ -18,8 +17,7 @@ class Linux(Platform): def __init__(self): super().__init__("linux") - for name in archspec.cpu.TARGETS: - self.add_target(name, spack.target.Target(name)) + self._add_archspec_targets() # Get specific default self.default = archspec.cpu.host().name diff --git a/lib/spack/spack/platforms/test.py b/lib/spack/spack/platforms/test.py index 9ead66ab273191..8633efc7cb830a 100644 --- a/lib/spack/spack/platforms/test.py +++ b/lib/spack/spack/platforms/test.py @@ -4,8 +4,9 @@ # SPDX-License-Identifier: (Apache-2.0 OR MIT) import platform +import archspec.cpu + import spack.operating_systems -import spack.target from ._platform import Platform @@ -32,8 +33,8 @@ class Test(Platform): def __init__(self, name=None): name = name or "test" super().__init__(name) - self.add_target(self.default, spack.target.Target(self.default)) - self.add_target(self.front_end, spack.target.Target(self.front_end)) + self.add_target(self.default, archspec.cpu.TARGETS[self.default]) + self.add_target(self.front_end, archspec.cpu.TARGETS[self.front_end]) self.add_operating_system( self.default_os, spack.operating_systems.OperatingSystem("debian", 6) diff --git a/lib/spack/spack/platforms/windows.py b/lib/spack/spack/platforms/windows.py index c00382e1980d17..8cc89b4b19a7f0 100755 --- a/lib/spack/spack/platforms/windows.py +++ b/lib/spack/spack/platforms/windows.py @@ -7,7 +7,6 @@ import archspec.cpu -import spack.target from spack.operating_systems.windows_os import WindowsOs from ._platform import Platform @@ -18,9 +17,7 @@ class Windows(Platform): def __init__(self): super().__init__("windows") - - for name in archspec.cpu.TARGETS: - self.add_target(name, spack.target.Target(name)) + self._add_archspec_targets() self.default = archspec.cpu.host().name self.front_end = self.default diff --git a/lib/spack/spack/relocate.py b/lib/spack/spack/relocate.py index 357dd92f8499bd..67e980625ea359 100644 --- a/lib/spack/spack/relocate.py +++ b/lib/spack/spack/relocate.py @@ -6,31 +6,26 @@ import itertools import os import re +import sys from collections import OrderedDict from typing import List, Optional import macholib.mach_o import macholib.MachO -import llnl.util.filesystem as fs import llnl.util.lang import llnl.util.tty as tty from llnl.util.lang import memoized from llnl.util.symlink import readlink, symlink -import spack.paths -import spack.platforms -import spack.repo -import spack.spec +import spack.error import spack.store import spack.util.elf as elf import spack.util.executable as executable -import spack.util.path +import spack.util.filesystem as ssys from .relocate_text import BinaryFilePrefixReplacer, TextFilePrefixReplacer -is_macos = str(spack.platforms.real_host()) == "darwin" - class InstallRootStringError(spack.error.SpackError): def __init__(self, file_path, root_path): @@ -53,7 +48,7 @@ def _patchelf() -> Optional[executable.Executable]: """Return the full path to the patchelf binary, if available, else None.""" import spack.bootstrap - if is_macos: + if sys.platform == "darwin": return None with spack.bootstrap.ensure_bootstrap_configuration(): @@ -210,23 +205,33 @@ def macho_find_paths(orig_rpaths, deps, idpath, old_layout_root, prefix_to_prefi paths_to_paths dictionary which maps all of the old paths to new paths """ paths_to_paths = dict() + # Sort from longest path to shortest, to ensure we try /foo/bar/baz before /foo/bar + prefix_iteration_order = sorted(prefix_to_prefix, key=len, reverse=True) for orig_rpath in orig_rpaths: if orig_rpath.startswith(old_layout_root): - for old_prefix, new_prefix in prefix_to_prefix.items(): + for old_prefix in prefix_iteration_order: + new_prefix = prefix_to_prefix[old_prefix] if orig_rpath.startswith(old_prefix): new_rpath = re.sub(re.escape(old_prefix), new_prefix, orig_rpath) paths_to_paths[orig_rpath] = new_rpath + break else: paths_to_paths[orig_rpath] = orig_rpath if idpath: - for old_prefix, new_prefix in prefix_to_prefix.items(): + for old_prefix in prefix_iteration_order: + new_prefix = prefix_to_prefix[old_prefix] if idpath.startswith(old_prefix): paths_to_paths[idpath] = re.sub(re.escape(old_prefix), new_prefix, idpath) + break + for dep in deps: - for old_prefix, new_prefix in prefix_to_prefix.items(): + for old_prefix in prefix_iteration_order: + new_prefix = prefix_to_prefix[old_prefix] if dep.startswith(old_prefix): paths_to_paths[dep] = re.sub(re.escape(old_prefix), new_prefix, dep) + break + if dep.startswith("@"): paths_to_paths[dep] = dep @@ -275,36 +280,6 @@ def modify_macho_object(cur_path, rpaths, deps, idpath, paths_to_paths): install_name_tool = executable.Executable("install_name_tool") install_name_tool(*args) - return - - -def modify_object_macholib(cur_path, paths_to_paths): - """ - This function is used when install machO buildcaches on linux by - rewriting mach-o loader commands for dependency library paths of - mach-o binaries and the id path for mach-o libraries. - Rewritting of rpaths is handled by replace_prefix_bin. - Inputs - mach-o binary to be modified - dictionary mapping paths in old install layout to new install layout - """ - - dll = macholib.MachO.MachO(cur_path) - dll.rewriteLoadCommands(paths_to_paths.get) - - try: - f = open(dll.filename, "rb+") - for header in dll.headers: - f.seek(0) - dll.write(f) - f.seek(0, 2) - f.flush() - f.close() - except Exception: - pass - - return - def macholib_get_paths(cur_path): """Get rpaths, dependent libraries, and library id of mach-o objects.""" @@ -420,10 +395,7 @@ def relocate_macho_binaries( # normalized paths rel_to_orig = macho_make_paths_normal(orig_path_name, rpaths, deps, idpath) # replace the relativized paths with normalized paths - if is_macos: - modify_macho_object(path_name, rpaths, deps, idpath, rel_to_orig) - else: - modify_object_macholib(path_name, rel_to_orig) + modify_macho_object(path_name, rpaths, deps, idpath, rel_to_orig) # get the normalized paths in the mach-o binary rpaths, deps, idpath = macholib_get_paths(path_name) # get the mapping of paths in old prefix to path in new prefix @@ -431,10 +403,7 @@ def relocate_macho_binaries( rpaths, deps, idpath, old_layout_root, prefix_to_prefix ) # replace the old paths with new paths - if is_macos: - modify_macho_object(path_name, rpaths, deps, idpath, paths_to_paths) - else: - modify_object_macholib(path_name, paths_to_paths) + modify_macho_object(path_name, rpaths, deps, idpath, paths_to_paths) # get the new normalized path in the mach-o binary rpaths, deps, idpath = macholib_get_paths(path_name) # get the mapping of paths to relative paths in the new prefix @@ -442,10 +411,7 @@ def relocate_macho_binaries( path_name, new_layout_root, rpaths, deps, idpath ) # replace the new paths with relativized paths in the new prefix - if is_macos: - modify_macho_object(path_name, rpaths, deps, idpath, paths_to_paths) - else: - modify_object_macholib(path_name, paths_to_paths) + modify_macho_object(path_name, rpaths, deps, idpath, paths_to_paths) else: # get the paths in the old prefix rpaths, deps, idpath = macholib_get_paths(path_name) @@ -454,10 +420,7 @@ def relocate_macho_binaries( rpaths, deps, idpath, old_layout_root, prefix_to_prefix ) # replace the old paths with new paths - if is_macos: - modify_macho_object(path_name, rpaths, deps, idpath, paths_to_paths) - else: - modify_object_macholib(path_name, paths_to_paths) + modify_macho_object(path_name, rpaths, deps, idpath, paths_to_paths) def _transform_rpaths(orig_rpaths, orig_root, new_prefixes): @@ -576,7 +539,7 @@ def make_macho_binaries_relative(cur_path_names, orig_path_names, old_layout_roo """ Replace old RPATHs with paths relative to old_dir in binary files """ - if not is_macos: + if not sys.platform == "darwin": return for cur_path, orig_path in zip(cur_path_names, orig_path_names): @@ -664,7 +627,7 @@ def is_binary(filename): Returns: True or False """ - m_type, _ = fs.mime_type(filename) + m_type, _ = ssys.mime_type(filename) msg = "[{0}] -> ".format(filename) if m_type == "application": @@ -692,7 +655,7 @@ def fixup_macos_rpath(root, filename): True if fixups were applied, else False """ abspath = os.path.join(root, filename) - if fs.mime_type(abspath) != ("application", "x-mach-binary"): + if ssys.mime_type(abspath) != ("application", "x-mach-binary"): return False # Get Mach-O header commands diff --git a/lib/spack/spack/repo.py b/lib/spack/spack/repo.py index 1e95b4ec64866f..b916c3baef8674 100644 --- a/lib/spack/spack/repo.py +++ b/lib/spack/spack/repo.py @@ -39,9 +39,9 @@ import spack.error import spack.patch import spack.provider_index +import spack.repo import spack.spec import spack.tag -import spack.util.file_cache import spack.util.git import spack.util.naming as nm import spack.util.path @@ -1523,8 +1523,10 @@ def add_package(self, name, dependencies=None): Both "dep_type" and "condition" can default to ``None`` in which case ``spack.dependency.default_deptype`` and ``spack.spec.Spec()`` are used. """ + import spack.tengine # avoid circular import + dependencies = dependencies or [] - context = {"cls_name": spack.util.naming.mod_to_class(name), "dependencies": dependencies} + context = {"cls_name": nm.mod_to_class(name), "dependencies": dependencies} template = spack.tengine.make_environment().get_template("mock-repository/package.pyt") text = template.render(context) package_py = self.recipe_filename(name) diff --git a/lib/spack/spack/report.py b/lib/spack/spack/report.py index 9c56e7edbe0722..409810f58a900f 100644 --- a/lib/spack/spack/report.py +++ b/lib/spack/spack/report.py @@ -15,7 +15,6 @@ import llnl.util.lang import spack.build_environment -import spack.fetch_strategy import spack.install_test import spack.installer import spack.package_base diff --git a/lib/spack/spack/reporters/cdash.py b/lib/spack/spack/reporters/cdash.py index 0c140a488d67b1..d2da8bbed2a403 100644 --- a/lib/spack/spack/reporters/cdash.py +++ b/lib/spack/spack/reporters/cdash.py @@ -19,10 +19,11 @@ import llnl.util.tty as tty from llnl.util.filesystem import working_dir -import spack.build_environment -import spack.fetch_strategy -import spack.package_base +import spack +import spack.paths import spack.platforms +import spack.spec +import spack.tengine import spack.util.git from spack.error import SpackError from spack.util.crypto import checksum @@ -119,7 +120,7 @@ def __init__(self, configuration: CDashConfiguration): git = spack.util.git.git() with working_dir(spack.paths.spack_root): self.revision = git("rev-parse", "HEAD", output=str).strip() - self.generator = "spack-{0}".format(spack.main.get_version()) + self.generator = "spack-{0}".format(spack.get_version()) self.multiple_packages = False def report_build_name(self, pkg_name): diff --git a/lib/spack/spack/reporters/extract.py b/lib/spack/spack/reporters/extract.py index 5554d89f0a2799..b222fdbad9d287 100644 --- a/lib/spack/spack/reporters/extract.py +++ b/lib/spack/spack/reporters/extract.py @@ -2,7 +2,6 @@ # Spack Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) -import os import re import xml.sax.saxutils from datetime import datetime @@ -42,17 +41,6 @@ def elapsed(current, previous): return diff.total_seconds() -# TODO (post-34236): Should remove with deprecated test methods since don't -# TODO (post-34236): have an XFAIL mechanism with the new test_part() approach. -def expected_failure(line): - if not line: - return False - - match = returns_regexp.search(line) - xfail = "0" not in match.group(1) if match else False - return xfail - - def new_part(): return { "command": None, @@ -66,14 +54,6 @@ def new_part(): } -# TODO (post-34236): Remove this when remove deprecated methods -def part_name(source): - elements = [] - for e in source.replace("'", "").split(" "): - elements.append(os.path.basename(e) if os.sep in e else e) - return "_".join(elements) - - def process_part_end(part, curr_time, last_time): if part: if not part["elapsed"]: @@ -81,11 +61,7 @@ def process_part_end(part, curr_time, last_time): stat = part["status"] if stat in completed: - # TODO (post-34236): remove the expected failure mapping when - # TODO (post-34236): remove deprecated test methods. - if stat == "passed" and expected_failure(part["desc"]): - part["completed"] = "Expected to fail" - elif part["completed"] == "Unknown": + if part["completed"] == "Unknown": part["completed"] = completed[stat] elif stat is None or stat == "unknown": part["status"] = "passed" @@ -153,14 +129,6 @@ def extract_test_parts(default_name, outputs): if msg.startswith("Installing"): continue - # TODO (post-34236): Remove this check when remove run_test(), - # TODO (post-34236): etc. since no longer supporting expected - # TODO (post-34236): failures. - if msg.startswith("Expecting return code"): - if part: - part["desc"] += f"; {msg}" - continue - # Terminate without further parsing if no more test messages if "Completed testing" in msg: # Process last lingering part IF it didn't generate status diff --git a/lib/spack/spack/rewiring.py b/lib/spack/spack/rewiring.py index fa95d339b3bfe2..ae7eb0a8d85252 100644 --- a/lib/spack/spack/rewiring.py +++ b/lib/spack/spack/rewiring.py @@ -12,11 +12,11 @@ from llnl.util.symlink import readlink, symlink import spack.binary_distribution as bindist +import spack.deptypes as dt import spack.error import spack.hooks -import spack.paths +import spack.platforms import spack.relocate as relocate -import spack.stage import spack.store @@ -40,7 +40,8 @@ def rewire(spliced_spec): for spec in spliced_spec.traverse(order="post", root=True): if not spec.build_spec.installed: # TODO: May want to change this at least for the root spec... - # spec.build_spec.package.do_install(force=True) + # TODO: Also remember to import PackageInstaller + # PackageInstaller([spec.build_spec.package]).install() raise PackageNotInstalledError(spliced_spec, spec.build_spec, spec) if spec.build_spec is not spec and not spec.installed: explicit = spec is spliced_spec @@ -52,6 +53,7 @@ def rewire_node(spec, explicit): its subgraph. Binaries, text, and links are all changed in accordance with the splice. The resulting package is then 'installed.'""" tempdir = tempfile.mkdtemp() + # copy anything installed to a temporary directory shutil.copytree(spec.build_spec.prefix, os.path.join(tempdir, spec.dag_hash())) @@ -59,8 +61,21 @@ def rewire_node(spec, explicit): # compute prefix-to-prefix for every node from the build spec to the spliced # spec prefix_to_prefix = OrderedDict({spec.build_spec.prefix: spec.prefix}) - for build_dep in spec.build_spec.traverse(root=False): - prefix_to_prefix[build_dep.prefix] = spec[build_dep.name].prefix + build_spec_ids = set(id(s) for s in spec.build_spec.traverse(deptype=dt.ALL & ~dt.BUILD)) + for s in bindist.deps_to_relocate(spec): + analog = s + if id(s) not in build_spec_ids: + analogs = [ + d + for d in spec.build_spec.traverse(deptype=dt.ALL & ~dt.BUILD) + if s._splice_match(d, self_root=spec, other_root=spec.build_spec) + ] + if analogs: + # Prefer same-name analogs and prefer higher versions + # This matches the preferences in Spec.splice, so we will find same node + analog = max(analogs, key=lambda a: (a.name == s.name, a.version)) + + prefix_to_prefix[analog.prefix] = s.prefix manifest = bindist.get_buildfile_manifest(spec.build_spec) platform = spack.platforms.by_name(spec.platform) diff --git a/lib/spack/spack/schema/__init__.py b/lib/spack/spack/schema/__init__.py index 03fe4039a8b74b..8c04ebdaac490d 100644 --- a/lib/spack/spack/schema/__init__.py +++ b/lib/spack/spack/schema/__init__.py @@ -3,56 +3,68 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) """This module contains jsonschema files for all of Spack's YAML formats.""" +import typing import warnings import llnl.util.lang +from spack.error import SpecSyntaxError + + +class DeprecationMessage(typing.NamedTuple): + message: str + error: bool + # jsonschema is imported lazily as it is heavy to import # and increases the start-up time def _make_validator(): import jsonschema - import spack.parser - def _validate_spec(validator, is_spec, instance, schema): """Check if the attributes on instance are valid specs.""" import jsonschema + import spack.parser + if not validator.is_type(instance, "object"): return for spec_str in instance: try: spack.parser.parse(spec_str) - except spack.parser.SpecSyntaxError as e: + except SpecSyntaxError as e: yield jsonschema.ValidationError(str(e)) def _deprecated_properties(validator, deprecated, instance, schema): if not (validator.is_type(instance, "object") or validator.is_type(instance, "array")): return + if not deprecated: + return + + deprecations = { + name: DeprecationMessage(message=x["message"], error=x["error"]) + for x in deprecated + for name in x["names"] + } + # Get a list of the deprecated properties, return if there is none - deprecated_properties = [x for x in instance if x in deprecated["properties"]] - if not deprecated_properties: + issues = [entry for entry in instance if entry in deprecations] + if not issues: return - # Retrieve the template message - msg_str_or_func = deprecated["message"] - if isinstance(msg_str_or_func, str): - msg = msg_str_or_func.format(properties=deprecated_properties) - else: - msg = msg_str_or_func(instance, deprecated_properties) - if msg is None: - return - - is_error = deprecated["error"] - if not is_error: - warnings.warn(msg) - else: - import jsonschema - - yield jsonschema.ValidationError(msg) + # Process issues + errors = [] + for name in issues: + msg = deprecations[name].message.format(name=name) + if deprecations[name].error: + errors.append(msg) + else: + warnings.warn(msg) + + if errors: + yield jsonschema.ValidationError("\n".join(errors)) return jsonschema.validators.extend( jsonschema.Draft4Validator, diff --git a/lib/spack/spack/schema/ci.py b/lib/spack/spack/schema/ci.py index 3706415e303825..e616058b998a28 100644 --- a/lib/spack/spack/schema/ci.py +++ b/lib/spack/spack/schema/ci.py @@ -47,7 +47,7 @@ "tags": {"type": "array", "items": {"type": "string"}}, "variables": { "type": "object", - "patternProperties": {r"[\w\d\-_\.]+": {"type": "string"}}, + "patternProperties": {r"[\w\d\-_\.]+": {"type": ["string", "number"]}}, }, "before_script": script_schema, "script": script_schema, diff --git a/lib/spack/spack/schema/concretizer.py b/lib/spack/spack/schema/concretizer.py index e1c4d64ce1ca07..0b222d923e1b0f 100644 --- a/lib/spack/spack/schema/concretizer.py +++ b/lib/spack/spack/schema/concretizer.py @@ -55,6 +55,26 @@ "unify": { "oneOf": [{"type": "boolean"}, {"type": "string", "enum": ["when_possible"]}] }, + "splice": { + "type": "object", + "additionalProperties": False, + "properties": { + "explicit": { + "type": "array", + "default": [], + "items": { + "type": "object", + "required": ["target", "replacement"], + "additionalProperties": False, + "properties": { + "target": {"type": "string"}, + "replacement": {"type": "string"}, + "transitive": {"type": "boolean", "default": False}, + }, + }, + } + }, + }, "duplicates": { "type": "object", "properties": { diff --git a/lib/spack/spack/schema/config.py b/lib/spack/spack/schema/config.py index 78b988e4459913..e1072a501bb91e 100644 --- a/lib/spack/spack/schema/config.py +++ b/lib/spack/spack/schema/config.py @@ -11,6 +11,7 @@ from llnl.util.lang import union_dicts +import spack.config import spack.schema.projections #: Properties for inclusion in other schemas @@ -75,7 +76,6 @@ "verify_ssl": {"type": "boolean"}, "ssl_certs": {"type": "string"}, "suppress_gpg_warnings": {"type": "boolean"}, - "install_missing_compilers": {"type": "boolean"}, "debug": {"type": "boolean"}, "checksum": {"type": "boolean"}, "deprecated": {"type": "boolean"}, @@ -96,12 +96,21 @@ "binary_index_ttl": {"type": "integer", "minimum": 0}, "aliases": {"type": "object", "patternProperties": {r"\w[\w-]*": {"type": "string"}}}, }, - "deprecatedProperties": { - "properties": ["concretizer"], - "message": "Spack supports only clingo as a concretizer from v0.23. " - "The config:concretizer config option is ignored.", - "error": False, - }, + "deprecatedProperties": [ + { + "names": ["concretizer"], + "message": "Spack supports only clingo as a concretizer from v0.23. " + "The config:concretizer config option is ignored.", + "error": False, + }, + { + "names": ["install_missing_compilers"], + "message": "The config:install_missing_compilers option has been deprecated in " + "Spack v0.23, and is currently ignored. It will be removed from config in " + "Spack v0.25.", + "error": False, + }, + ], } } diff --git a/lib/spack/spack/schema/develop.py b/lib/spack/spack/schema/develop.py index 13391dcdb0dc75..8db1220e636dac 100644 --- a/lib/spack/spack/schema/develop.py +++ b/lib/spack/spack/schema/develop.py @@ -13,6 +13,7 @@ r"\w[\w-]*": { "type": "object", "additionalProperties": False, + "required": ["spec"], "properties": {"spec": {"type": "string"}, "path": {"type": "string"}}, } }, diff --git a/lib/spack/spack/schema/env.py b/lib/spack/spack/schema/env.py index 8b37f3e236fc68..17cf29d4c6c1d2 100644 --- a/lib/spack/spack/schema/env.py +++ b/lib/spack/spack/schema/env.py @@ -14,7 +14,6 @@ import spack.schema.gitlab_ci # DEPRECATED import spack.schema.merged -import spack.schema.projections from .spec_list import spec_list_schema diff --git a/lib/spack/spack/schema/packages.py b/lib/spack/spack/schema/packages.py index 0acf8411fa20ea..2193a6254167a0 100644 --- a/lib/spack/spack/schema/packages.py +++ b/lib/spack/spack/schema/packages.py @@ -109,7 +109,6 @@ "require": requirements, "prefer": prefer_and_conflict, "conflict": prefer_and_conflict, - "version": {}, # Here only to warn users on ignored properties "target": { "type": "array", "default": [], @@ -140,14 +139,6 @@ }, "variants": variants, }, - "deprecatedProperties": { - "properties": ["version"], - "message": "setting version preferences in the 'all' section of packages.yaml " - "is deprecated and will be removed in v0.23\n\n\tThese preferences " - "will be ignored by Spack. You can set them only in package-specific sections " - "of the same file.\n", - "error": False, - }, } }, "patternProperties": { @@ -165,14 +156,11 @@ # version strings "items": {"anyOf": [{"type": "string"}, {"type": "number"}]}, }, - "target": {}, # Here only to warn users on ignored properties - "compiler": {}, # Here only to warn users on ignored properties "buildable": {"type": "boolean", "default": True}, "permissions": permissions, # If 'get_full_repo' is promoted to a Package-level # attribute, it could be useful to set it here "package_attributes": package_attributes, - "providers": {}, # Here only to warn users on ignored properties "variants": variants, "externals": { "type": "array", @@ -204,18 +192,6 @@ }, }, }, - "deprecatedProperties": { - "properties": ["target", "compiler", "providers"], - "message": "setting 'compiler:', 'target:' or 'provider:' preferences in " - "a package-specific section of packages.yaml is deprecated, and will be " - "removed in v0.23.\n\n\tThese preferences will be ignored by Spack, and " - "can be set only in the 'all' section of the same file. " - "You can run:\n\n\t\t$ spack audit configs\n\n\tto get better diagnostics, " - "including files:lines where the deprecated attributes are used.\n\n" - "\tUse requirements to enforce conditions on specific packages: " - f"{REQUIREMENT_URL}\n", - "error": False, - }, } }, } diff --git a/lib/spack/spack/schema/view.py b/lib/spack/spack/schema/view.py index 6c24501ba9d2ce..d3e983167f0c34 100644 --- a/lib/spack/spack/schema/view.py +++ b/lib/spack/spack/schema/view.py @@ -11,6 +11,7 @@ from typing import Any, Dict import spack.schema +import spack.schema.projections projections_scheme = spack.schema.projections.properties["projections"] diff --git a/lib/spack/spack/solver/asp.py b/lib/spack/spack/solver/asp.py index 506b3f2bc0cdc0..92734e9afd5294 100644 --- a/lib/spack/spack/solver/asp.py +++ b/lib/spack/spack/solver/asp.py @@ -27,29 +27,29 @@ import spack import spack.binary_distribution -import spack.cmd +import spack.bootstrap.core import spack.compilers +import spack.concretize import spack.config -import spack.config as sc import spack.deptypes as dt import spack.environment as ev import spack.error import spack.package_base import spack.package_prefs -import spack.parser import spack.platforms import spack.repo import spack.spec import spack.store import spack.util.crypto -import spack.util.elf import spack.util.libc import spack.util.path import spack.util.timer -import spack.variant +import spack.variant as vt import spack.version as vn import spack.version.git_ref_lookup from spack import traverse +from spack.config import get_mark_from_yaml_data +from spack.error import SpecSyntaxError from .core import ( AspFunction, @@ -64,6 +64,7 @@ parse_term, ) from .counter import FullDuplicatesCounter, MinimalDuplicatesCounter, NoDuplicatesCounter +from .version_order import concretization_version_order GitOrStandardVersion = Union[spack.version.GitVersion, spack.version.StandardVersion] @@ -126,8 +127,14 @@ def __str__(self): @contextmanager -def spec_with_name(spec, name): +def named_spec( + spec: Optional["spack.spec.Spec"], name: Optional[str] +) -> Iterator[Optional["spack.spec.Spec"]]: """Context manager to temporarily set the name of a spec""" + if spec is None or name is None: + yield spec + return + old_name = spec.name spec.name = name try: @@ -516,7 +523,12 @@ def _compute_specs_from_answer_set(self): node = SpecBuilder.make_node(pkg=providers[0]) candidate = answer.get(node) - if candidate and candidate.satisfies(input_spec): + if candidate and candidate.build_spec.satisfies(input_spec): + if not candidate.satisfies(input_spec): + tty.warn( + "explicit splice configuration has caused the concretized spec" + f" {candidate} not to satisfy the input spec {input_spec}" + ) self._concrete_specs.append(answer[node]) self._concrete_specs_by_input[input_spec] = answer[node] else: @@ -579,20 +591,6 @@ def _is_checksummed_version(version_info: Tuple[GitOrStandardVersion, dict]): return _is_checksummed_git_version(version) -def concretization_version_order(version_info: Tuple[GitOrStandardVersion, dict]): - """Version order key for concretization, where preferred > not preferred, - not deprecated > deprecated, finite > any infinite component; only if all are - the same, do we use default version ordering.""" - version, info = version_info - return ( - info.get("preferred", False), - not info.get("deprecated", False), - not version.isdevelop(), - not version.is_prerelease(), - version, - ) - - def _spec_with_default_name(spec_str, name): """Return a spec with a default name if none is provided, used for requirement specs""" spec = spack.spec.Spec(spec_str) @@ -1022,6 +1020,102 @@ def __iter__(self): ConditionSpecCache = Dict[str, Dict[ConditionSpecKey, ConditionIdFunctionPair]] +class ConstraintOrigin(enum.Enum): + """Generates identifiers that can be pased into the solver attached + to constraints, and then later retrieved to determine the origin of + those constraints when ``SpecBuilder`` creates Specs from the solve + result. + """ + + DEPENDS_ON = 1 + REQUIRE = 2 + + @staticmethod + def _SUFFIXES() -> Dict["ConstraintOrigin", str]: + return {ConstraintOrigin.DEPENDS_ON: "_dep", ConstraintOrigin.REQUIRE: "_req"} + + @staticmethod + def append_type_suffix(pkg_id: str, kind: "ConstraintOrigin") -> str: + """Given a package identifier and a constraint kind, generate a string ID.""" + suffix = ConstraintOrigin._SUFFIXES()[kind] + return f"{pkg_id}{suffix}" + + @staticmethod + def strip_type_suffix(source: str) -> Tuple[int, Optional[str]]: + """Take a combined package/type ID generated by + ``append_type_suffix``, and extract the package ID and + an associated weight. + """ + if not source: + return -1, None + for kind, suffix in ConstraintOrigin._SUFFIXES().items(): + if source.endswith(suffix): + return kind.value, source[: -len(suffix)] + return -1, source + + +class SourceContext: + """Tracks context in which a Spec's clause-set is generated (i.e. + with ``SpackSolverSetup.spec_clauses``). + + Facts generated for the spec may include this context. + """ + + def __init__(self): + # This can be "literal" for constraints that come from a user + # spec (e.g. from the command line); it can be the output of + # `ConstraintOrigin.append_type_suffix`; the default is "none" + # (which means it isn't important to keep track of the source + # in that case). + self.source = "none" + + +class ConditionIdContext(SourceContext): + """Derived from a ``ConditionContext``: for clause-sets generated by + imposed/required specs, stores an associated transform. + + This is primarily used for tracking whether we are generating clauses + in the context of a required spec, or for an imposed spec. + + Is not a subclass of ``ConditionContext`` because it exists in a + lower-level context with less information. + """ + + def __init__(self): + super().__init__() + self.transform = None + + +class ConditionContext(SourceContext): + """Tracks context in which a condition (i.e. ``SpackSolverSetup.condition``) + is generated (e.g. for a `depends_on`). + + This may modify the required/imposed specs generated as relevant + for the context. + """ + + def __init__(self): + super().__init__() + # transformation applied to facts from the required spec. Defaults + # to leave facts as they are. + self.transform_required = None + # transformation applied to facts from the imposed spec. Defaults + # to removing "node" and "virtual_node" facts. + self.transform_imposed = None + + def requirement_context(self) -> ConditionIdContext: + ctxt = ConditionIdContext() + ctxt.source = self.source + ctxt.transform = self.transform_required + return ctxt + + def impose_context(self) -> ConditionIdContext: + ctxt = ConditionIdContext() + ctxt.source = self.source + ctxt.transform = self.transform_imposed + return ctxt + + class SpackSolverSetup: """Class to set up and run a Spack concretization solve.""" @@ -1045,6 +1139,7 @@ def __init__(self, tests: bool = False): self.default_targets: List = [] self.compiler_version_constraints: Set = set() self.post_facts: List = [] + self.variant_ids_by_def_id: Dict[int, int] = {} self.reusable_and_possible: ConcreteSpecsByHash = ConcreteSpecsByHash() @@ -1135,7 +1230,7 @@ def target_ranges(self, spec, single_target_fn): def conflict_rules(self, pkg): for when_spec, conflict_specs in pkg.conflicts.items(): when_spec_msg = "conflict constraint %s" % str(when_spec) - when_spec_id = self.condition(when_spec, name=pkg.name, msg=when_spec_msg) + when_spec_id = self.condition(when_spec, required_name=pkg.name, msg=when_spec_msg) for conflict_spec, conflict_msg in conflict_specs: conflict_spec = spack.spec.Spec(conflict_spec) @@ -1151,7 +1246,9 @@ def conflict_rules(self, pkg): spec_for_msg = spack.spec.Spec(pkg.name) conflict_spec_msg = f"conflict is triggered when {str(spec_for_msg)}" conflict_spec_id = self.condition( - conflict_spec, name=conflict_spec.name or pkg.name, msg=conflict_spec_msg + conflict_spec, + required_name=conflict_spec.name or pkg.name, + msg=conflict_spec_msg, ) self.gen.fact( fn.pkg_fact( @@ -1165,7 +1262,7 @@ def package_languages(self, pkg): condition_msg = f"{pkg.name} needs the {', '.join(sorted(languages))} language" if when_spec != spack.spec.Spec(): condition_msg += f" when {when_spec}" - condition_id = self.condition(when_spec, name=pkg.name, msg=condition_msg) + condition_id = self.condition(when_spec, required_name=pkg.name, msg=condition_msg) for language in sorted(languages): self.gen.fact(fn.pkg_fact(pkg.name, fn.language(condition_id, language))) self.gen.newline() @@ -1197,8 +1294,9 @@ def compiler_facts(self): if compiler.compiler_obj is not None: c = compiler.compiler_obj for flag_type, flags in c.flags.items(): + flag_group = " ".join(flags) for flag in flags: - self.gen.fact(fn.compiler_flag(compiler_id, flag_type, flag)) + self.gen.fact(fn.compiler_flag(compiler_id, flag_type, flag, flag_group)) if compiler.available: self.gen.fact(fn.compiler_available(compiler_id)) @@ -1279,103 +1377,123 @@ def effect_rules(self): self.gen.newline() self._effect_cache.clear() - def variant_rules(self, pkg): - for name, entry in sorted(pkg.variants.items()): - variant, when = entry + def define_variant( + self, + pkg: "Type[spack.package_base.PackageBase]", + name: str, + when: spack.spec.Spec, + variant_def: vt.Variant, + ): + pkg_fact = lambda f: self.gen.fact(fn.pkg_fact(pkg.name, f)) + + # Every variant id has a unique definition (conditional or unconditional), and + # higher variant id definitions take precedence when variants intersect. + vid = next(self._id_counter) - if spack.spec.Spec() in when: - # unconditional variant - self.gen.fact(fn.pkg_fact(pkg.name, fn.variant(name))) - else: - # conditional variant - for w in when: - msg = "%s has variant %s" % (pkg.name, name) - if str(w): - msg += " when %s" % w - - cond_id = self.condition(w, name=pkg.name, msg=msg) - self.gen.fact(fn.pkg_fact(pkg.name, fn.conditional_variant(cond_id, name))) - - single_value = not variant.multi - if single_value: - self.gen.fact(fn.pkg_fact(pkg.name, fn.variant_single_value(name))) - self.gen.fact( - fn.pkg_fact( - pkg.name, fn.variant_default_value_from_package_py(name, variant.default) - ) + # used to find a variant id from its variant definition (for variant values on specs) + self.variant_ids_by_def_id[id(variant_def)] = vid + + if when == spack.spec.Spec(): + # unconditional variant + pkg_fact(fn.variant_definition(name, vid)) + else: + # conditional variant + msg = f"Package {pkg.name} has variant '{name}' when {when}" + cond_id = self.condition(when, required_name=pkg.name, msg=msg) + pkg_fact(fn.variant_condition(name, vid, cond_id)) + + # record type so we can construct the variant when we read it back in + self.gen.fact(fn.variant_type(vid, variant_def.variant_type.value)) + + if variant_def.sticky: + pkg_fact(fn.variant_sticky(vid)) + + # define defaults for this variant definition + defaults = variant_def.make_default().value if variant_def.multi else [variant_def.default] + for val in sorted(defaults): + pkg_fact(fn.variant_default_value_from_package_py(vid, val)) + + # define possible values for this variant definition + values = variant_def.values + if values is None: + values = [] + + elif isinstance(values, vt.DisjointSetsOfValues): + union = set() + for sid, s in enumerate(values.sets): + for value in s: + pkg_fact(fn.variant_value_from_disjoint_sets(vid, value, sid)) + union.update(s) + values = union + + # ensure that every variant has at least one possible value. + if not values: + values = [variant_def.default] + + for value in sorted(values): + pkg_fact(fn.variant_possible_value(vid, value)) + + # when=True means unconditional, so no need for conditional values + if getattr(value, "when", True) is True: + continue + + # now we have to handle conditional values + quoted_value = spack.parser.quote_if_needed(str(value)) + vstring = f"{name}={quoted_value}" + variant_has_value = spack.spec.Spec(vstring) + + if value.when: + # the conditional value is always "possible", but it imposes its when condition as + # a constraint if the conditional value is taken. This may seem backwards, but it + # ensures that the conditional can only occur when its condition holds. + self.condition( + required_spec=variant_has_value, + imposed_spec=value.when, + required_name=pkg.name, + imposed_name=pkg.name, + msg=f"{pkg.name} variant {name} has value '{quoted_value}' when {value.when}", ) else: - spec_variant = variant.make_default() - defaults = spec_variant.value - for val in sorted(defaults): - self.gen.fact( - fn.pkg_fact(pkg.name, fn.variant_default_value_from_package_py(name, val)) - ) + # We know the value is never allowed statically (when was false), but we can't just + # ignore it b/c it could come in as a possible value and we need a good error msg. + # So, it's a conflict -- if the value is somehow used, it'll trigger an error. + trigger_id = self.condition( + variant_has_value, + required_name=pkg.name, + msg=f"invalid variant value: {vstring}", + ) + constraint_id = self.condition( + spack.spec.Spec(), + required_name=pkg.name, + msg="empty (total) conflict constraint", + ) + msg = f"variant value {vstring} is conditionally disabled" + pkg_fact(fn.conflict(trigger_id, constraint_id, msg)) - values = variant.values - if values is None: - values = [] - elif isinstance(values, spack.variant.DisjointSetsOfValues): - union = set() - # Encode the disjoint sets in the logic program - for sid, s in enumerate(values.sets): - for value in s: - self.gen.fact( - fn.pkg_fact( - pkg.name, fn.variant_value_from_disjoint_sets(name, value, sid) - ) - ) - union.update(s) - values = union - - # make sure that every variant has at least one possible value - if not values: - values = [variant.default] - - for value in sorted(values): - if getattr(value, "when", True) is not True: # when=True means unconditional - condition_spec = spack.spec.Spec("{0}={1}".format(name, value)) - if value.when is False: - # This value is a conflict - # Cannot just prevent listing it as a possible value because it could - # also come in as a possible value from the command line - trigger_id = self.condition( - condition_spec, - name=pkg.name, - msg="invalid variant value {0}={1}".format(name, value), - ) - constraint_id = self.condition( - spack.spec.Spec(), - name=pkg.name, - msg="empty (total) conflict constraint", - ) - msg = "variant {0}={1} is conditionally disabled".format(name, value) - self.gen.fact( - fn.pkg_fact(pkg.name, fn.conflict(trigger_id, constraint_id, msg)) - ) - else: - imposed = spack.spec.Spec(value.when) - imposed.name = pkg.name - - self.condition( - required_spec=condition_spec, - imposed_spec=imposed, - name=pkg.name, - msg="%s variant %s value %s when %s" % (pkg.name, name, value, when), - ) - self.gen.fact(fn.pkg_fact(pkg.name, fn.variant_possible_value(name, value))) + self.gen.newline() - if variant.sticky: - self.gen.fact(fn.pkg_fact(pkg.name, fn.variant_sticky(name))) + def define_auto_variant(self, name: str, multi: bool): + self.gen.h3(f"Special variant: {name}") + vid = next(self._id_counter) + self.gen.fact(fn.auto_variant(name, vid)) + self.gen.fact( + fn.variant_type( + vid, vt.VariantType.MULTI.value if multi else vt.VariantType.SINGLE.value + ) + ) - self.gen.newline() + def variant_rules(self, pkg: "Type[spack.package_base.PackageBase]"): + for name in pkg.variant_names(): + self.gen.h3(f"Variant {name} in package {pkg.name}") + for when, variant_def in pkg.variant_definitions(name): + self.define_variant(pkg, name, when, variant_def) def _get_condition_id( self, named_cond: spack.spec.Spec, cache: ConditionSpecCache, body: bool, - transform: Optional[TransformFunction] = None, + context: ConditionIdContext, ) -> int: """Get the id for one half of a condition (either a trigger or an imposed constraint). @@ -1389,15 +1507,15 @@ def _get_condition_id( """ pkg_cache = cache[named_cond.name] - named_cond_key = (str(named_cond), transform) + named_cond_key = (str(named_cond), context.transform) result = pkg_cache.get(named_cond_key) if result: return result[0] cond_id = next(self._id_counter) - requirements = self.spec_clauses(named_cond, body=body) - if transform: - requirements = transform(named_cond, requirements) + requirements = self.spec_clauses(named_cond, body=body, context=context) + if context.transform: + requirements = context.transform(named_cond, requirements) pkg_cache[named_cond_key] = (cond_id, requirements) return cond_id @@ -1406,37 +1524,49 @@ def condition( self, required_spec: spack.spec.Spec, imposed_spec: Optional[spack.spec.Spec] = None, - name: Optional[str] = None, + *, + required_name: Optional[str] = None, + imposed_name: Optional[str] = None, msg: Optional[str] = None, - transform_required: Optional[TransformFunction] = None, - transform_imposed: Optional[TransformFunction] = remove_node, + context: Optional[ConditionContext] = None, ): """Generate facts for a dependency or virtual provider condition. Arguments: required_spec: the constraints that triggers this condition imposed_spec: the constraints that are imposed when this condition is triggered - name: name for `required_spec` (required if required_spec is anonymous, ignored if not) + required_name: name for ``required_spec`` + (required if required_spec is anonymous, ignored if not) + imposed_name: name for ``imposed_spec`` + (required if imposed_spec is anonymous, ignored if not) msg: description of the condition - transform_required: transformation applied to facts from the required spec. Defaults - to leave facts as they are. - transform_imposed: transformation applied to facts from the imposed spec. Defaults - to removing "node" and "virtual_node" facts. + context: if provided, indicates how to modify the clause-sets for the required/imposed + specs based on the type of constraint they are generated for (e.g. `depends_on`) Returns: int: id of the condition created by this function """ - name = required_spec.name or name - if not name: + required_name = required_spec.name or required_name + if not required_name: raise ValueError(f"Must provide a name for anonymous condition: '{required_spec}'") - with spec_with_name(required_spec, name): + if not context: + context = ConditionContext() + context.transform_imposed = remove_node + + if imposed_spec: + imposed_name = imposed_spec.name or imposed_name + if not imposed_name: + raise ValueError(f"Must provide a name for imposed constraint: '{imposed_spec}'") + + with named_spec(required_spec, required_name), named_spec(imposed_spec, imposed_name): # Check if we can emit the requirements before updating the condition ID counter. # In this way, if a condition can't be emitted but the exception is handled in the # caller, we won't emit partial facts. condition_id = next(self._id_counter) + requirement_context = context.requirement_context() trigger_id = self._get_condition_id( - required_spec, cache=self._trigger_cache, body=True, transform=transform_required + required_spec, cache=self._trigger_cache, body=True, context=requirement_context ) self.gen.fact(fn.pkg_fact(required_spec.name, fn.condition(condition_id))) self.gen.fact(fn.condition_reason(condition_id, msg)) @@ -1446,8 +1576,9 @@ def condition( if not imposed_spec: return condition_id + impose_context = context.impose_context() effect_id = self._get_condition_id( - imposed_spec, cache=self._effect_cache, body=False, transform=transform_imposed + imposed_spec, cache=self._effect_cache, body=False, context=impose_context ) self.gen.fact( fn.pkg_fact(required_spec.name, fn.condition_effect(condition_id, effect_id)) @@ -1455,8 +1586,8 @@ def condition( return condition_id - def impose(self, condition_id, imposed_spec, node=True, name=None, body=False): - imposed_constraints = self.spec_clauses(imposed_spec, body=body, required_from=name) + def impose(self, condition_id, imposed_spec, node=True, body=False): + imposed_constraints = self.spec_clauses(imposed_spec, body=body) for pred in imposed_constraints: # imposed "node"-like conditions are no-ops if not node and pred.args[0] in ("node", "virtual_node"): @@ -1475,7 +1606,7 @@ def package_provider_rules(self, pkg): continue msg = f"{pkg.name} provides {vpkg} when {when}" - condition_id = self.condition(when, vpkg, pkg.name, msg) + condition_id = self.condition(when, vpkg, required_name=pkg.name, msg=msg) self.gen.fact( fn.pkg_fact(when.name, fn.provider_condition(condition_id, vpkg.name)) ) @@ -1483,7 +1614,7 @@ def package_provider_rules(self, pkg): for when, sets_of_virtuals in pkg.provided_together.items(): condition_id = self.condition( - when, name=pkg.name, msg="Virtuals are provided together" + when, required_name=pkg.name, msg="Virtuals are provided together" ) for set_id, virtuals_together in enumerate(sets_of_virtuals): for name in virtuals_together: @@ -1528,14 +1659,14 @@ def dependency_holds(input_spec, requirements): if t & depflag ] - self.condition( - cond, - dep.spec, - name=pkg.name, - msg=msg, - transform_required=track_dependencies, - transform_imposed=dependency_holds, + context = ConditionContext() + context.source = ConstraintOrigin.append_type_suffix( + pkg.name, ConstraintOrigin.DEPENDS_ON ) + context.transform_required = track_dependencies + context.transform_imposed = dependency_holds + + self.condition(cond, dep.spec, required_name=pkg.name, msg=msg, context=context) self.gen.newline() @@ -1584,7 +1715,9 @@ def emit_facts_from_requirement_rules(self, rules: List[RequirementRule]): if rule.condition != spack.spec.Spec(): msg = f"condition to activate requirement {requirement_grp_id}" try: - main_condition_id = self.condition(rule.condition, name=pkg_name, msg=msg) + main_condition_id = self.condition( + rule.condition, required_name=pkg_name, msg=msg + ) except Exception as e: if rule.kind != RequirementKind.DEFAULT: raise RuntimeError( @@ -1613,17 +1746,21 @@ def emit_facts_from_requirement_rules(self, rules: List[RequirementRule]): when_spec = spack.spec.Spec(pkg_name) try: - # With virtual we want to emit "node" and "virtual_node" in imposed specs - transform: Optional[TransformFunction] = remove_node - if virtual: - transform = None + context = ConditionContext() + context.source = ConstraintOrigin.append_type_suffix( + pkg_name, ConstraintOrigin.REQUIRE + ) + if not virtual: + context.transform_imposed = remove_node + # else: for virtuals we want to emit "node" and + # "virtual_node" in imposed specs member_id = self.condition( required_spec=when_spec, imposed_spec=spec, - name=pkg_name, - transform_imposed=transform, + required_name=pkg_name, msg=f"{input_spec} is a requirement for package {pkg_name}", + context=context, ) except Exception as e: # Do not raise if the rule comes from the 'all' subsection, since usability @@ -1674,8 +1811,8 @@ def external_packages(self): if pkg_name == "all": continue - # This package does not appear in any repository - if pkg_name not in spack.repo.PATH: + # package isn't a possible dependency and can't be in the solution + if pkg_name not in self.pkgs: continue # This package is not among possible dependencies @@ -1722,7 +1859,9 @@ def external_imposition(input_spec, requirements): ] try: - self.condition(spec, spec, msg=msg, transform_imposed=external_imposition) + context = ConditionContext() + context.transform_imposed = external_imposition + self.condition(spec, spec, msg=msg, context=context) except (spack.error.SpecError, RuntimeError) as e: warnings.warn(f"while setting up external spec {spec}: {e}") continue @@ -1753,23 +1892,19 @@ def preferred_variants(self, pkg_name): for variant_name in sorted(preferred_variants): variant = preferred_variants[variant_name] - values = variant.value - - if not isinstance(values, tuple): - values = (values,) # perform validation of the variant and values - spec = spack.spec.Spec(pkg_name) try: - spec.update_variant_validate(variant_name, values) - except (spack.variant.InvalidVariantValueError, KeyError, ValueError) as e: + variant_defs = vt.prevalidate_variant_value(self.pkg_class(pkg_name), variant) + except (vt.InvalidVariantValueError, KeyError, ValueError) as e: tty.debug( f"[SETUP]: rejected {str(variant)} as a preference for {pkg_name}: {str(e)}" ) continue - for value in values: - self.variant_values_from_specs.add((pkg_name, variant.name, value)) + for value in variant.value_as_tuple: + for variant_def in variant_defs: + self.variant_values_from_specs.add((pkg_name, id(variant_def), value)) self.gen.fact( fn.variant_default_value_from_packages_yaml(pkg_name, variant.name, value) ) @@ -1797,6 +1932,7 @@ def spec_clauses( expand_hashes: bool = False, concrete_build_deps=False, required_from: Optional[str] = None, + context: Optional[SourceContext] = None, ) -> List[AspFunction]: """Wrap a call to `_spec_clauses()` into a try/except block with better error handling. @@ -1812,6 +1948,7 @@ def spec_clauses( transitive=transitive, expand_hashes=expand_hashes, concrete_build_deps=concrete_build_deps, + context=context, ) except RuntimeError as exc: msg = str(exc) @@ -1828,6 +1965,7 @@ def _spec_clauses( transitive: bool = True, expand_hashes: bool = False, concrete_build_deps: bool = False, + context: Optional[SourceContext] = None, ) -> List[AspFunction]: """Return a list of clauses for a spec mandates are true. @@ -1839,6 +1977,8 @@ def _spec_clauses( expand_hashes: if True, descend into hashes of concrete specs (default False) concrete_build_deps: if False, do not include pure build deps of concrete specs (as they have no effect on runtime constraints) + context: tracks what constraint this clause set is generated for (e.g. a + `depends_on` constraint in a package.py file) Normally, if called with ``transitive=True``, ``spec_clauses()`` just generates hashes for the dependency requirements of concrete specs. If ``expand_hashes`` @@ -1870,38 +2010,28 @@ def _spec_clauses( # variants for vname, variant in sorted(spec.variants.items()): - values = variant.value - if not isinstance(values, (list, tuple)): - values = [values] + # TODO: variant="*" means 'variant is defined to something', which used to + # be meaningless in concretization, as all variants had to be defined. But + # now that variants can be conditional, it should force a variant to exist. + if variant.value == ("*",): + continue - for value in values: - # * is meaningless for concretization -- just for matching - if value == "*": - continue + for value in variant.value_as_tuple: + # ensure that the value *can* be valid for the spec + if spec.name and not spec.concrete and not spec.virtual: + variant_defs = vt.prevalidate_variant_value( + self.pkg_class(spec.name), variant, spec + ) - # validate variant value only if spec not concrete - if not spec.concrete: - if not spec.virtual and vname not in spack.variant.reserved_names: - pkg_cls = self.pkg_class(spec.name) - try: - variant_def, _ = pkg_cls.variants[vname] - except KeyError: - msg = 'variant "{0}" not found in package "{1}"' - raise RuntimeError(msg.format(vname, spec.name)) - else: - variant_def.validate_or_raise( - variant, spack.repo.PATH.get_pkg_class(spec.name) - ) + # Record that that this is a valid possible value. Accounts for + # int/str/etc., where valid values can't be listed in the package + for variant_def in variant_defs: + self.variant_values_from_specs.add((spec.name, id(variant_def), value)) clauses.append(f.variant_value(spec.name, vname, value)) if variant.propagate: clauses.append(f.propagate(spec.name, fn.variant_value(vname, value))) - # Tell the concretizer that this is a possible value for the - # variant, to account for things like int/str values where we - # can't enumerate the valid values - self.variant_values_from_specs.add((spec.name, vname, value)) - # compiler and compiler version if spec.compiler: clauses.append(f.node_compiler(spec.name, spec.compiler.name)) @@ -1925,13 +2055,19 @@ def _spec_clauses( self.compiler_version_constraints.add(spec.compiler) # compiler flags + source = context.source if context else "none" for flag_type, flags in spec.compiler_flags.items(): + flag_group = " ".join(flags) for flag in flags: - clauses.append(f.node_flag(spec.name, flag_type, flag)) + clauses.append( + f.node_flag(spec.name, fn.node_flag(flag_type, flag, flag_group, source)) + ) if not spec.concrete and flag.propagate is True: clauses.append( f.propagate( - spec.name, fn.node_flag(flag_type, flag), fn.edge_types("link", "run") + spec.name, + fn.node_flag(flag_type, flag, flag_group, source), + fn.edge_types("link", "run"), ) ) @@ -2013,6 +2149,7 @@ def _spec_clauses( body=body, expand_hashes=expand_hashes, concrete_build_deps=concrete_build_deps, + context=context, ) ) @@ -2064,7 +2201,7 @@ def define_package_versions_and_validate_preferences( matches = [x for x in self.possible_versions[pkg_name] if x.satisfies(v)] matches.sort(reverse=True) if not matches: - raise spack.config.ConfigError( + raise spack.error.ConfigError( f"Preference for version {v} does not match any known " f"version of {pkg_name} (in its package.py or any external)" ) @@ -2347,7 +2484,7 @@ def _all_targets_satisfiying(single_constraint): return allowed_targets cache = {} - for target_constraint in sorted(self.target_constraints): + for target_constraint in sorted(self.target_constraints, key=lambda x: x.name): # Construct the list of allowed targets for this constraint allowed_targets = [] for single_constraint in str(target_constraint).split(","): @@ -2362,15 +2499,15 @@ def _all_targets_satisfiying(single_constraint): def define_variant_values(self): """Validate variant values from the command line. - Also add valid variant values from the command line to the - possible values for a variant. + Add valid variant values from the command line to the possible values for + variant definitions. """ - # Tell the concretizer about possible values from specs we saw in - # spec_clauses(). We might want to order these facts by pkg and name - # if we are debugging. - for pkg, variant, value in self.variant_values_from_specs: - self.gen.fact(fn.pkg_fact(pkg, fn.variant_possible_value(variant, value))) + # Tell the concretizer about possible values from specs seen in spec_clauses(). + # We might want to order these facts by pkg and name if we are debugging. + for pkg_name, variant_def_id, value in self.variant_values_from_specs: + vid = self.variant_ids_by_def_id[variant_def_id] + self.gen.fact(fn.pkg_fact(pkg_name, fn.variant_possible_value(vid, value))) def register_concrete_spec(self, spec, possible): # tell the solver about any installed packages that could @@ -2539,6 +2676,10 @@ def setup( self.gen.h2("Package preferences: %s" % pkg) self.preferred_variants(pkg) + self.gen.h1("Special variants") + self.define_auto_variant("dev_path", multi=False) + self.define_auto_variant("patches", multi=True) + self.gen.h1("Develop specs") # Inject dev_path from environment for ds in dev_specs: @@ -2613,10 +2754,6 @@ def define_runtime_constraints(self): continue current_libc = compiler.compiler_obj.default_libc - # If this is a compiler yet to be built (config:install_missing_compilers:true) - # infer libc from the Python process - if not current_libc and compiler.compiler_obj.cc is None: - current_libc = spack.util.libc.libc_from_current_python_process() if using_libc_compatibility() and current_libc: recorder("*").depends_on( @@ -2648,7 +2785,9 @@ def literal_specs(self, specs): effect_id, requirements = cache[imposed_spec_key] else: effect_id = next(self._id_counter) - requirements = self.spec_clauses(spec) + context = SourceContext() + context.source = "literal" + requirements = self.spec_clauses(spec, context=context) root_name = spec.name for clause in requirements: clause_name = clause.args[0] @@ -2696,7 +2835,7 @@ def validate_and_define_versions_from_requirements( # not throw an error, which is just so that users know they need to change # their config, instead of getting a hard to decipher concretization error. if not any(x for x in self.possible_versions[name] if x.satisfies(versions)): - raise spack.config.ConfigError( + raise spack.error.ConfigError( f"Version requirement {versions} on {pkg_name} for {name} " f"cannot match any known version from package.py or externals" ) @@ -2814,6 +2953,9 @@ def h1(self, header: str) -> None: def h2(self, header: str) -> None: self.title(header, "-") + def h3(self, header: str): + self.asp_problem.append(f"% {header}\n") + def newline(self): self.asp_problem.append("\n") @@ -2821,6 +2963,26 @@ def value(self) -> str: return "".join(self.asp_problem) +def parse_spec_from_yaml_string(string: str) -> "spack.spec.Spec": + """Parse a spec from YAML and add file/line info to errors, if it's available. + + Parse a ``Spec`` from the supplied string, but also intercept any syntax errors and + add file/line information for debugging using file/line annotations from the string. + + Arguments: + string: a string representing a ``Spec`` from config YAML. + + """ + try: + return spack.spec.Spec(string) + except SpecSyntaxError as e: + mark = get_mark_from_yaml_data(string) + if mark: + msg = f"{mark.name}:{mark.line + 1}: {str(e)}" + raise SpecSyntaxError(msg) from e + raise e + + class RequirementParser: """Parses requirements from package.py files and configuration, and returns rules.""" @@ -2906,11 +3068,11 @@ def rules_from_conflict(self, pkg: "spack.package_base.PackageBase") -> List[Req def _parse_prefer_conflict_item(self, item): # The item is either a string or an object with at least a "spec" attribute if isinstance(item, str): - spec = sc.parse_spec_from_yaml_string(item) + spec = parse_spec_from_yaml_string(item) condition = spack.spec.Spec() message = None else: - spec = sc.parse_spec_from_yaml_string(item["spec"]) + spec = parse_spec_from_yaml_string(item["spec"]) condition = spack.spec.Spec(item.get("when")) message = item.get("message") return spec, condition, message @@ -2951,10 +3113,10 @@ def _rules_from_requirements( # validate specs from YAML first, and fail with line numbers if parsing fails. constraints = [ - sc.parse_spec_from_yaml_string(constraint) for constraint in constraints + parse_spec_from_yaml_string(constraint) for constraint in constraints ] when_str = requirement.get("when") - when = sc.parse_spec_from_yaml_string(when_str) if when_str else spack.spec.Spec() + when = parse_spec_from_yaml_string(when_str) if when_str else spack.spec.Spec() constraints = [ x @@ -3036,7 +3198,7 @@ def with_input_specs(self, input_specs: List["spack.spec.Spec"]) -> "CompilerPar Args: input_specs: specs to be concretized """ - strict = spack.concretize.Concretizer().check_for_compiler_existence + strict = spack.concretize.CHECK_COMPILER_EXISTENCE default_os = str(spack.platforms.host().default_os) default_target = str(archspec.cpu.host().family) for s in traverse.traverse_nodes(input_specs): @@ -3080,7 +3242,7 @@ def add_compiler_from_concrete_spec(self, spec: "spack.spec.Spec") -> None: candidate = KnownCompiler( spec=spec.compiler, os=str(spec.architecture.os), - target=str(spec.architecture.target.microarchitecture.family), + target=str(spec.architecture.target.family), available=False, compiler_obj=None, ) @@ -3343,15 +3505,19 @@ def make_node(*, pkg: str) -> NodeArgument: """ return NodeArgument(id="0", pkg=pkg) - def __init__(self, specs, hash_lookup=None): - self._specs = {} + def __init__( + self, specs: List[spack.spec.Spec], *, hash_lookup: Optional[ConcreteSpecsByHash] = None + ): + self._specs: Dict[NodeArgument, spack.spec.Spec] = {} self._result = None self._command_line_specs = specs - self._flag_sources = collections.defaultdict(lambda: set()) + self._flag_sources: Dict[Tuple[NodeArgument, str], Set[str]] = collections.defaultdict( + lambda: set() + ) # Pass in as arguments reusable specs and plug them in # from this dictionary during reconstruction - self._hash_lookup = hash_lookup or {} + self._hash_lookup = hash_lookup or ConcreteSpecsByHash() def hash(self, node, h): if node not in self._specs: @@ -3382,21 +3548,17 @@ def node_os(self, node, os): def node_target(self, node, target): self._arch(node).target = target - def variant_value(self, node, name, value): - # FIXME: is there a way not to special case 'dev_path' everywhere? - if name == "dev_path": - self._specs[node].variants.setdefault( - name, spack.variant.SingleValuedVariant(name, value) - ) - return - - if name == "patches": - self._specs[node].variants.setdefault( - name, spack.variant.MultiValuedVariant(name, value) + def variant_selected(self, node, name, value, variant_type, variant_id): + spec = self._specs[node] + variant = spec.variants.get(name) + if not variant: + spec.variants[name] = vt.VariantType(variant_type).variant_class(name, value) + else: + assert variant_type == vt.VariantType.MULTI.value, ( + f"Can't have multiple values for single-valued variant: " + f"{node}, {name}, {value}, {variant_type}, {variant_id}" ) - return - - self._specs[node].update_variant_validate(name, value) + variant.append(value) def version(self, node, version): self._specs[node].versions = vn.VersionList([vn.Version(version)]) @@ -3405,11 +3567,10 @@ def node_compiler_version(self, node, compiler, version): self._specs[node].compiler = spack.spec.CompilerSpec(compiler) self._specs[node].compiler.versions = vn.VersionList([vn.Version(version)]) - def node_flag(self, node, flag_type, flag): - self._specs[node].compiler_flags.add_flag(flag_type, flag, False) - - def node_flag_source(self, node, flag_type, source): - self._flag_sources[(node, flag_type)].add(source) + def node_flag(self, node, node_flag): + self._specs[node].compiler_flags.add_flag( + node_flag.flag_type, node_flag.flag, False, node_flag.flag_group, node_flag.source + ) def external_spec_selected(self, node, idx): """This means that the external spec and index idx has been selected for this package.""" @@ -3450,15 +3611,23 @@ def virtual_on_edge(self, parent_node, provider_node, virtual): dependencies[0].update_virtuals((virtual,)) def reorder_flags(self): - """Order compiler flags on specs in predefined order. - - We order flags so that any node's flags will take priority over - those of its dependents. That is, the deepest node in the DAG's - flags will appear last on the compile line, in the order they - were specified. + """For each spec, determine the order of compiler flags applied to it. The solver determines which flags are on nodes; this routine - imposes order afterwards. + imposes order afterwards. The order is: + + 1. Flags applied in compiler definitions should come first + 2. Flags applied by dependents are ordered topologically (with a + dependency on `traverse` to resolve the partial order into a + stable total order) + 3. Flags from requirements are then applied (requirements always + come from the package and never a parent) + 4. Command-line flags should come last + + Additionally, for each source (requirements, compiler, command line, and + dependents), flags from that source should retain their order and grouping: + e.g. for `y cflags="-z -a"` "-z" and "-a" should never have any intervening + flags inserted, and should always appear in that order. """ # reverse compilers so we get highest priority compilers that share a spec compilers = dict( @@ -3473,49 +3642,84 @@ def reorder_flags(self): flagmap_from_compiler = compilers[spec.compiler].flags for flag_type in spec.compiler_flags.valid_compiler_flags(): - from_compiler = flagmap_from_compiler.get(flag_type, []) - from_sources = [] - - # order is determined by the DAG. A spec's flags come after any of its ancestors - # on the compile line node = SpecBuilder.make_node(pkg=spec.name) - source_key = (node, flag_type) - if source_key in self._flag_sources: - order = [ - SpecBuilder.make_node(pkg=s.name) - for s in spec.traverse(order="post", direction="parents") - ] - sorted_sources = sorted( - self._flag_sources[source_key], key=lambda s: order.index(s) + + ordered_flags = [] + + # 1. Put compiler flags first + from_compiler = tuple(flagmap_from_compiler.get(flag_type, [])) + extend_flag_list(ordered_flags, from_compiler) + + # 2. Add all sources (the compiler is one of them, so skip any + # flag group that matches it exactly) + flag_groups = set() + for flag in self._specs[node].compiler_flags.get(flag_type, []): + flag_groups.add( + spack.spec.CompilerFlag( + flag.flag_group, + propagate=flag.propagate, + flag_group=flag.flag_group, + source=flag.source, + ) ) - # add flags from each source, lowest to highest precedence - for node in sorted_sources: - all_src_flags = list() - per_pkg_sources = [self._specs[node]] - if node.pkg in cmd_specs: - per_pkg_sources.append(cmd_specs[node.pkg]) - for source in per_pkg_sources: - all_src_flags.extend(source.compiler_flags.get(flag_type, [])) - extend_flag_list(from_sources, all_src_flags) - - # compiler flags from compilers config are lowest precedence - ordered_compiler_flags = list(llnl.util.lang.dedupe(from_compiler + from_sources)) - compiler_flags = spec.compiler_flags.get(flag_type, []) + # For flags that are applied by dependents, put flags from parents + # before children; we depend on the stability of traverse() to + # achieve a stable flag order for flags introduced in this manner. + topo_order = list(s.name for s in spec.traverse(order="post", direction="parents")) + lex_order = list(sorted(flag_groups)) + + def _order_index(flag_group): + source = flag_group.source + # Note: if 'require: ^dependency cflags=...' is ever possible, + # this will topologically sort for require as well + type_index, pkg_source = ConstraintOrigin.strip_type_suffix(source) + if pkg_source in topo_order: + major_index = topo_order.index(pkg_source) + # If for x->y, x has multiple depends_on declarations that + # are activated, and each adds cflags to y, we fall back on + # alphabetical ordering to maintain a total order + minor_index = lex_order.index(flag_group) + else: + major_index = len(topo_order) + lex_order.index(flag_group) + minor_index = 0 + return (type_index, major_index, minor_index) - msg = ( - f"{set(compiler_flags)} does not equal {set(ordered_compiler_flags)}" - f"for {spec.name}" - ) - assert set(compiler_flags) == set(ordered_compiler_flags), msg + prioritized_groups = sorted(flag_groups, key=lambda x: _order_index(x)) + + for grp in prioritized_groups: + grp_flags = tuple( + x for (x, y) in spack.compiler.tokenize_flags(grp.flag_group) + ) + if grp_flags == from_compiler: + continue + as_compiler_flags = list( + spack.spec.CompilerFlag( + x, + propagate=grp.propagate, + flag_group=grp.flag_group, + source=grp.source, + ) + for x in grp_flags + ) + extend_flag_list(ordered_flags, as_compiler_flags) - spec.compiler_flags.update({flag_type: ordered_compiler_flags}) + # 3. Now put cmd-line flags last + if node.pkg in cmd_specs: + cmd_flags = cmd_specs[node.pkg].compiler_flags.get(flag_type, []) + extend_flag_list(ordered_flags, cmd_flags) + + compiler_flags = spec.compiler_flags.get(flag_type, []) + msg = "%s does not equal %s" % (set(compiler_flags), set(ordered_flags)) + assert set(compiler_flags) == set(ordered_flags), msg + + spec.compiler_flags.update({flag_type: ordered_flags}) def deprecated(self, node: NodeArgument, version: str) -> None: tty.warn(f'using "{node.pkg}@{version}" which is a deprecated version') @staticmethod - def sort_fn(function_tuple): + def sort_fn(function_tuple) -> Tuple[int, int]: """Ensure attributes are evaluated in the correct order. hash attributes are handled first, since they imply entire concrete specs @@ -3573,10 +3777,9 @@ def build_specs(self, function_tuples): continue # if we've already gotten a concrete spec for this pkg, - # do not bother calling actions on it except for node_flag_source, - # since node_flag_source is tracking information not in the spec itself + # do not bother calling actions on it spec = self._specs.get(args[0]) - if spec and spec.concrete and name != "node_flag_source": + if spec and spec.concrete: continue action(*args) @@ -3616,7 +3819,33 @@ def build_specs(self, function_tuples): spack.version.git_ref_lookup.GitRefLookup(spec.fullname) ) - return self._specs + specs = self.execute_explicit_splices() + + return specs + + def execute_explicit_splices(self): + splice_config = spack.config.CONFIG.get("concretizer:splice:explicit", []) + splice_triples = [] + for splice_set in splice_config: + target = splice_set["target"] + replacement = spack.spec.Spec(splice_set["replacement"]) + assert replacement.abstract_hash + replacement.replace_hash() + transitive = splice_set.get("transitive", False) + splice_triples.append((target, replacement, transitive)) + + specs = {} + for key, spec in self._specs.items(): + current_spec = spec + for target, replacement, transitive in splice_triples: + if target in current_spec: + # matches root or non-root + # e.g. mvapich2%gcc + current_spec = current_spec.splice(replacement, transitive) + new_key = NodeArgument(id=key.id, pkg=current_spec.name) + specs[new_key] = current_spec + + return specs def _develop_specs_from_env(spec, env): @@ -3635,8 +3864,9 @@ def _develop_specs_from_env(spec, env): assert spec.variants["dev_path"].value == path, error_msg else: - spec.variants.setdefault("dev_path", spack.variant.SingleValuedVariant("dev_path", path)) - spec.constrain(dev_info["spec"]) + spec.variants.setdefault("dev_path", vt.SingleValuedVariant("dev_path", path)) + + assert spec.satisfies(dev_info["spec"]) def _is_reusable(spec: spack.spec.Spec, packages, local: bool) -> bool: diff --git a/lib/spack/spack/solver/concretize.lp b/lib/spack/spack/solver/concretize.lp index 342620238feaf1..2195cd6b08b4d1 100644 --- a/lib/spack/spack/solver/concretize.lp +++ b/lib/spack/spack/solver/concretize.lp @@ -43,7 +43,7 @@ internal_error("Only nodes can have node_compiler_version"). :- attr("variant_value", PackageNode, _, _), not attr("node", PackageNode), internal_error("variant_value true for a non-node"). -:- attr("node_flag", PackageNode, _, _), not attr("node", PackageNode), +:- attr("node_flag", PackageNode, _), not attr("node", PackageNode), internal_error("node_flag assigned for non-node"). :- attr("external_spec_selected", PackageNode, _), not attr("node", PackageNode), internal_error("external_spec_selected for non-node"). @@ -51,10 +51,6 @@ internal_error("non-node depends on something"). :- attr("depends_on", _, ChildNode, _), not attr("node", ChildNode), internal_error("something depends_on a non-node"). -:- attr("node_flag_source", Node, _, _), not attr("node", Node), - internal_error("node_flag_source assigned for a non-node"). -:- attr("node_flag_source", _, _, SourceNode), not attr("node", SourceNode), - internal_error("node_flag_source assigned with a non-node source"). :- attr("virtual_node", VirtualNode), not provider(_, VirtualNode), internal_error("virtual node with no provider"). :- provider(_, VirtualNode), not attr("virtual_node", VirtualNode), @@ -152,7 +148,6 @@ unification_set(SetID, VirtualNode) % TODO: literals, at the moment, can only influence the "root" unification set. This needs to be extended later. % Node attributes that have multiple node arguments (usually, only the first argument is a node) -multiple_nodes_attribute("node_flag_source"). multiple_nodes_attribute("depends_on"). multiple_nodes_attribute("virtual_on_edge"). multiple_nodes_attribute("provider_set"). @@ -390,7 +385,6 @@ trigger_condition_holds(ID, RequestorNode) :- attr(Name, node(X, A1), A2, A3) : condition_requirement(ID, Name, A1, A2, A3), condition_nodes(ID, PackageNode, node(X, A1)), not multiple_nodes_attribute(Name); attr(Name, node(X, A1), A2, A3, A4) : condition_requirement(ID, Name, A1, A2, A3, A4), condition_nodes(ID, PackageNode, node(X, A1)); % Special cases - attr("node_flag_source", node(X, A1), A2, node(Y, A3)) : condition_requirement(ID, "node_flag_source", A1, A2, A3), condition_nodes(ID, PackageNode, node(X, A1)), condition_nodes(ID, PackageNode, node(Y, A3)); not cannot_hold(ID, PackageNode). condition_holds(ConditionID, node(X, Package)) @@ -438,13 +432,6 @@ attr(Name, node(X, A1), A2) :- impose(ID, PackageNode), imposed_constrai attr(Name, node(X, A1), A2, A3) :- impose(ID, PackageNode), imposed_constraint(ID, Name, A1, A2, A3), imposed_nodes(ID, PackageNode, node(X, A1)), not multiple_nodes_attribute(Name). attr(Name, node(X, A1), A2, A3, A4) :- impose(ID, PackageNode), imposed_constraint(ID, Name, A1, A2, A3, A4), imposed_nodes(ID, PackageNode, node(X, A1)). -% For node flag sources we need to look at the condition_set of the source, since it is the dependent -% of the package on which I want to impose the constraint -attr("node_flag_source", node(X, A1), A2, node(Y, A3)) - :- impose(ID, node(X, A1)), - imposed_constraint(ID, "node_flag_source", A1, A2, A3), - condition_set(node(Y, A3), node(X, A1)). - % Provider set is relevant only for literals, since it's the only place where `^[virtuals=foo] bar` % might appear in the HEAD of a rule attr("provider_set", node(min_dupe_id, Provider), node(min_dupe_id, Virtual)) @@ -485,8 +472,8 @@ virtual_condition_holds(node(Y, A2), Virtual) % we cannot have additional flag values when we are working with concrete specs :- attr("node", node(ID, Package)), attr("hash", node(ID, Package), Hash), - attr("node_flag", node(ID, Package), FlagType, Flag), - not imposed_constraint(Hash, "node_flag", Package, FlagType, Flag), + attr("node_flag", node(ID, Package), node_flag(FlagType, Flag, _, _)), + not imposed_constraint(Hash, "node_flag", Package, node_flag(FlagType, Flag, _, _)), internal_error("imposed hash without imposing all flag values"). #defined condition/2. @@ -787,22 +774,15 @@ required_provider(Provider, Virtual) :- provider(node(Y, Package), node(X, Virtual)), required_provider(Provider, Virtual), Package != Provider. -% TODO: the following two choice rules allow the solver to add compiler +% TODO: the following choice rule allows the solver to add compiler % flags if their only source is from a requirement. This is overly-specific % and should use a more-generic approach like in https://github.com/spack/spack/pull/37180 -{ attr("node_flag", node(ID, Package), FlagType, FlagValue) } :- +{ attr("node_flag", node(ID, Package), NodeFlag) } :- requirement_group_member(ConditionID, Package, RequirementID), activate_requirement(node(ID, Package), RequirementID), pkg_fact(Package, condition_effect(ConditionID, EffectID)), - imposed_constraint(EffectID, "node_flag_set", Package, FlagType, FlagValue). - -{ attr("node_flag_source", node(NodeID1, Package1), FlagType, node(NodeID2, Package2)) } :- - requirement_group_member(ConditionID, Package1, RequirementID), - activate_requirement(node(NodeID1, Package1), RequirementID), - pkg_fact(Package1, condition_effect(ConditionID, EffectID)), - imposed_constraint(EffectID, "node_flag_source", Package1, FlagType, Package2), - imposed_nodes(EffectID, node(NodeID2, Package2), node(NodeID1, Package1)). + imposed_constraint(EffectID, "node_flag_set", Package, NodeFlag). requirement_weight(node(ID, Package), Group, W) :- W = #min { @@ -839,58 +819,132 @@ error(10, Message) :- %----------------------------------------------------------------------------- % Variant semantics %----------------------------------------------------------------------------- -% a variant is a variant of a package if it is a variant under some condition -% and that condition holds -node_has_variant(node(NodeID, Package), Variant) :- - pkg_fact(Package, conditional_variant(ID, Variant)), - condition_holds(ID, node(NodeID, Package)). +% Packages define potentially several definitions for each variant, and depending +% on their attibutes, duplicate nodes for the same package may use different +% definitions. So the variant logic has several jobs: +% A. Associate a variant definition with a node, by VariantID +% B. Associate defaults and attributes (sticky, etc.) for the selected variant ID with the node. +% C. Once these rules are established for a node, select variant value(s) based on them. + +% A: Selecting a variant definition + +% Variant definitions come from package facts in two ways: +% 1. unconditional variants are always defined on all nodes for a given package +variant_definition(node(NodeID, Package), Name, VariantID) :- + pkg_fact(Package, variant_definition(Name, VariantID)), + attr("node", node(NodeID, Package)). + +% 2. conditional variants are only defined if the conditions hold for the node +variant_definition(node(NodeID, Package), Name, VariantID) :- + pkg_fact(Package, variant_condition(Name, VariantID, ConditionID)), + condition_holds(ConditionID, node(NodeID, Package)). + +% If there are any definitions for a variant on a node, the variant is "defined". +variant_defined(PackageNode, Name) :- variant_definition(PackageNode, Name, _). + +% We must select one definition for each defined variant on a node. +1 { + node_has_variant(PackageNode, Name, VariantID) : variant_definition(PackageNode, Name, VariantID) +} 1 :- + variant_defined(PackageNode, Name). + +% Solver must pick the variant definition with the highest id. When conditions hold +% for two or more variant definitions, this prefers the last one defined. +:- node_has_variant(node(NodeID, Package), Name, SelectedVariantID), + variant_definition(node(NodeID, Package), Name, VariantID), + VariantID > SelectedVariantID. + +% B: Associating applicable package rules with nodes -node_has_variant(node(ID, Package), Variant) :- - pkg_fact(Package, variant(Variant)), - attr("node", node(ID, Package)). +% The default value for a variant in a package is what is prescribed: +% 1. On the command line +% 2. In packages.yaml (if there's no command line settings) +% 3. In the package.py file (if there are no settings in packages.yaml and the command line) + +% -- Associate the definition's default values with the node +% note that the package.py variant defaults are associated with a particular definition, but +% packages.yaml and CLI are associated with just the variant name. +% Also, settings specified on the CLI apply to all duplicates, but always have +% `min_dupe_id` as their node id. +variant_default_value(node(NodeID, Package), VariantName, Value) :- + node_has_variant(node(NodeID, Package), VariantName, VariantID), + pkg_fact(Package, variant_default_value_from_package_py(VariantID, Value)), + not variant_default_value_from_packages_yaml(Package, VariantName, _), + not attr("variant_default_value_from_cli", node(min_dupe_id, Package), VariantName, _). + +variant_default_value(node(NodeID, Package), VariantName, Value) :- + node_has_variant(node(NodeID, Package), VariantName, _), + variant_default_value_from_packages_yaml(Package, VariantName, Value), + not attr("variant_default_value_from_cli", node(min_dupe_id, Package), VariantName, _). + +variant_default_value(node(NodeID, Package), VariantName, Value) :- + node_has_variant(node(NodeID, Package), VariantName, _), + attr("variant_default_value_from_cli", node(min_dupe_id, Package), VariantName, Value). + +% -- Associate the definition's possible values with the node +variant_possible_value(node(NodeID, Package), VariantName, Value) :- + node_has_variant(node(NodeID, Package), VariantName, VariantID), + pkg_fact(Package, variant_possible_value(VariantID, Value)). + +variant_value_from_disjoint_sets(node(NodeID, Package), VariantName, Value1, Set1) :- + node_has_variant(node(NodeID, Package), VariantName, VariantID), + pkg_fact(Package, variant_value_from_disjoint_sets(VariantID, Value1, Set1)). + +% -- Associate definition's arity with the node +variant_single_value(node(NodeID, Package), VariantName) :- + node_has_variant(node(NodeID, Package), VariantName, VariantID), + not variant_type(VariantID, "multi"). + +% C: Determining variant values on each node + +% if a variant is sticky, but not set, its value is the default value +attr("variant_selected", node(ID, Package), Variant, Value, VariantType, VariantID) :- + node_has_variant(node(ID, Package), Variant, VariantID), + variant_default_value(node(ID, Package), Variant, Value), + pkg_fact(Package, variant_sticky(VariantID)), + variant_type(VariantID, VariantType), + not attr("variant_set", node(ID, Package), Variant), + build(node(ID, Package)). + +% we can choose variant values from all the possible values for the node +{ + attr("variant_selected", node(ID, Package), Variant, Value, VariantType, VariantID) + : variant_possible_value(node(ID, Package), Variant, Value) +} :- + attr("node", node(ID, Package)), + node_has_variant(node(ID, Package), Variant, VariantID), + variant_type(VariantID, VariantType), + build(node(ID, Package)). + +% variant_selected is only needed for reconstruction on the python side, so we can ignore it here +attr("variant_value", PackageNode, Variant, Value) :- + attr("variant_selected", PackageNode, Variant, Value, VariantType, VariantID). % a variant cannot be set if it is not a variant on the package error(100, "Cannot set variant '{0}' for package '{1}' because the variant condition cannot be satisfied for the given spec", Variant, Package) - :- attr("variant_set", node(X, Package), Variant), - not node_has_variant(node(X, Package), Variant), - build(node(X, Package)). + :- attr("variant_set", node(ID, Package), Variant), + not node_has_variant(node(ID, Package), Variant, _), + build(node(ID, Package)). % a variant cannot take on a value if it is not a variant of the package error(100, "Cannot set variant '{0}' for package '{1}' because the variant condition cannot be satisfied for the given spec", Variant, Package) - :- attr("variant_value", node(X, Package), Variant, _), - not node_has_variant(node(X, Package), Variant), - build(node(X, Package)). - -% if a variant is sticky and not set its value is the default value -attr("variant_value", node(ID, Package), Variant, Value) :- - node_has_variant(node(ID, Package), Variant), - not attr("variant_set", node(ID, Package), Variant), - pkg_fact(Package, variant_sticky(Variant)), - variant_default_value(Package, Variant, Value), - build(node(ID, Package)). + :- attr("variant_value", node(ID, Package), Variant, _), + not node_has_variant(node(ID, Package), Variant, _), + build(node(ID, Package)). % at most one variant value for single-valued variants. -{ - attr("variant_value", node(ID, Package), Variant, Value) - : pkg_fact(Package, variant_possible_value(Variant, Value)) -} - :- attr("node", node(ID, Package)), - node_has_variant(node(ID, Package), Variant), - build(node(ID, Package)). - - error(100, "'{0}' required multiple values for single-valued variant '{1}'", Package, Variant) :- attr("node", node(ID, Package)), - node_has_variant(node(ID, Package), Variant), - pkg_fact(Package, variant_single_value(Variant)), + node_has_variant(node(ID, Package), Variant, _), + variant_single_value(node(ID, Package), Variant), build(node(ID, Package)), 2 { attr("variant_value", node(ID, Package), Variant, Value) }. error(100, "No valid value for variant '{1}' of package '{0}'", Package, Variant) - :- attr("node", node(X, Package)), - node_has_variant(node(X, Package), Variant), - build(node(X, Package)), - not attr("variant_value", node(X, Package), Variant, _). + :- attr("node", node(ID, Package)), + node_has_variant(node(ID, Package), Variant, _), + build(node(ID, Package)), + not attr("variant_value", node(ID, Package), Variant, _). % if a variant is set to anything, it is considered 'set'. attr("variant_set", PackageNode, Variant) :- attr("variant_set", PackageNode, Variant, _). @@ -900,17 +954,16 @@ attr("variant_set", PackageNode, Variant) :- attr("variant_set", PackageNode, Va % have been built w/different variants from older/different package versions. error(10, "'Spec({1}={2})' is not a valid value for '{0}' variant '{1}'", Package, Variant, Value) :- attr("variant_value", node(ID, Package), Variant, Value), - not pkg_fact(Package, variant_possible_value(Variant, Value)), + not variant_possible_value(node(ID, Package), Variant, Value), build(node(ID, Package)). -% Some multi valued variants accept multiple values from disjoint sets. -% Ensure that we respect that constraint and we don't pick values from more -% than one set at once +% Some multi valued variants accept multiple values from disjoint sets. Ensure that we +% respect that constraint and we don't pick values from more than one set at once error(100, "{0} variant '{1}' cannot have values '{2}' and '{3}' as they come from disjoint value sets", Package, Variant, Value1, Value2) :- attr("variant_value", node(ID, Package), Variant, Value1), attr("variant_value", node(ID, Package), Variant, Value2), - pkg_fact(Package, variant_value_from_disjoint_sets(Variant, Value1, Set1)), - pkg_fact(Package, variant_value_from_disjoint_sets(Variant, Value2, Set2)), + variant_value_from_disjoint_sets(node(ID, Package), Variant, Value1, Set1), + variant_value_from_disjoint_sets(node(ID, Package), Variant, Value2, Set2), Set1 < Set2, % see[1] build(node(ID, Package)). @@ -922,7 +975,7 @@ error(100, "{0} variant '{1}' cannot have values '{2}' and '{3}' as they come fr % specified in an external, we score it as if it was a default value. variant_not_default(node(ID, Package), Variant, Value) :- attr("variant_value", node(ID, Package), Variant, Value), - not variant_default_value(Package, Variant, Value), + not variant_default_value(node(ID, Package), Variant, Value), % variants set explicitly on the CLI don't count as non-default not attr("variant_set", node(ID, Package), Variant, Value), % variant values forced by propagation don't count as non-default @@ -933,11 +986,10 @@ variant_not_default(node(ID, Package), Variant, Value) not external_with_variant_set(node(ID, Package), Variant, Value), attr("node", node(ID, Package)). - % A default variant value that is not used variant_default_not_used(node(ID, Package), Variant, Value) - :- variant_default_value(Package, Variant, Value), - node_has_variant(node(ID, Package), Variant), + :- variant_default_value(node(ID, Package), Variant, Value), + node_has_variant(node(ID, Package), Variant, _), not attr("variant_value", node(ID, Package), Variant, Value), not propagate(node(ID, Package), variant_value(Variant, _)), attr("node", node(ID, Package)). @@ -951,25 +1003,6 @@ external_with_variant_set(node(NodeID, Package), Variant, Value) external(node(NodeID, Package)), attr("node", node(NodeID, Package)). -% The default value for a variant in a package is what is prescribed: -% -% 1. On the command line -% 2. In packages.yaml (if there's no command line settings) -% 3. In the package.py file (if there are no settings in -% packages.yaml and the command line) -% -variant_default_value(Package, Variant, Value) - :- pkg_fact(Package, variant_default_value_from_package_py(Variant, Value)), - not variant_default_value_from_packages_yaml(Package, Variant, _), - not attr("variant_default_value_from_cli", node(min_dupe_id, Package), Variant, _). - -variant_default_value(Package, Variant, Value) - :- variant_default_value_from_packages_yaml(Package, Variant, Value), - not attr("variant_default_value_from_cli", node(min_dupe_id, Package), Variant, _). - -variant_default_value(Package, Variant, Value) :- - attr("variant_default_value_from_cli", node(min_dupe_id, Package), Variant, Value). - % Treat 'none' in a special way - it cannot be combined with other % values even if the variant is multi-valued error(100, "{0} variant '{1}' cannot have values '{2}' and 'none'", Package, Variant, Value) @@ -978,23 +1011,26 @@ error(100, "{0} variant '{1}' cannot have values '{2}' and 'none'", Package, Var Value != "none", build(node(X, Package)). -% patches and dev_path are special variants -- they don't have to be -% declared in the package, so we just allow them to spring into existence -% when assigned a value. -auto_variant("dev_path"). -auto_variant("patches"). +% -- Auto variants +% These don't have to be declared in the package. We allow them to spring into +% existence when assigned a value. +variant_possible_value(PackageNode, Variant, Value) + :- attr("variant_set", PackageNode, Variant, Value), auto_variant(Variant, _). -node_has_variant(PackageNode, Variant) - :- attr("variant_set", PackageNode, Variant, _), auto_variant(Variant). +node_has_variant(PackageNode, Variant, VariantID) + :- attr("variant_set", PackageNode, Variant, _), auto_variant(Variant, VariantID). -pkg_fact(Package, variant_single_value("dev_path")) - :- attr("variant_set", node(ID, Package), "dev_path", _). +variant_single_value(PackageNode, Variant) + :- node_has_variant(PackageNode, Variant, VariantID), + auto_variant(Variant, VariantID), + not variant_type(VariantID, "multi"). % suppress warnings about this atom being unset. It's only set if some % spec or some package sets it, and without this, clingo will give % warnings like 'info: atom does not occur in any rule head'. #defined variant_default_value/3. #defined variant_default_value_from_packages_yaml/3. +#defined variant_default_value_from_package_py/3. %----------------------------------------------------------------------------- % Propagation semantics @@ -1024,11 +1060,12 @@ propagate(ChildNode, PropagatedAttribute, edge_types(DepType1, DepType2)) :- %---- % If a variant is propagated, and can be accepted, set its value -attr("variant_value", node(ID, Package), Variant, Value) :- - propagate(node(ID, Package), variant_value(Variant, Value)), - node_has_variant(node(ID, Package), Variant), - pkg_fact(Package, variant_possible_value(Variant, Value)), - not attr("variant_set", node(ID, Package), Variant). +attr("variant_selected", PackageNode, Variant, Value, VariantType, VariantID) :- + propagate(PackageNode, variant_value(Variant, Value)), + node_has_variant(PackageNode, Variant, VariantID), + variant_type(VariantID, VariantType), + variant_possible_value(PackageNode, Variant, Value), + not attr("variant_set", PackageNode, Variant). % If a variant is propagated, we cannot have extraneous values variant_is_propagated(PackageNode, Variant) :- @@ -1037,7 +1074,7 @@ variant_is_propagated(PackageNode, Variant) :- not attr("variant_set", PackageNode, Variant). :- variant_is_propagated(PackageNode, Variant), - attr("variant_value", PackageNode, Variant, Value), + attr("variant_selected", PackageNode, Variant, Value, _, _), not propagate(PackageNode, variant_value(Variant, Value)). %---- @@ -1048,23 +1085,22 @@ variant_is_propagated(PackageNode, Variant) :- % 1. The same flag type is not set on this node % 2. This node has the same compiler as the propagation source -propagated_flag(node(PackageID, Package), node_flag(FlagType, Flag), SourceNode) :- - propagate(node(PackageID, Package), node_flag(FlagType, Flag), _), - not attr("node_flag_set", node(PackageID, Package), FlagType, _), +propagated_flag(node(PackageID, Package), node_flag(FlagType, Flag, FlagGroup, Source), SourceNode) :- + propagate(node(PackageID, Package), node_flag(FlagType, Flag, FlagGroup, Source), _), + not attr("node_flag_set", node(PackageID, Package), node_flag(FlagType, _, _, "literal")), % Same compiler as propagation source node_compiler(node(PackageID, Package), CompilerID), node_compiler(SourceNode, CompilerID), - attr("propagate", SourceNode, node_flag(FlagType, Flag), _), + attr("propagate", SourceNode, node_flag(FlagType, Flag, FlagGroup, Source), _), node(PackageID, Package) != SourceNode, not runtime(Package). -attr("node_flag", PackageNode, FlagType, Flag) :- propagated_flag(PackageNode, node_flag(FlagType, Flag), _). -attr("node_flag_source", PackageNode, FlagType, SourceNode) :- propagated_flag(PackageNode, node_flag(FlagType, _), SourceNode). +attr("node_flag", PackageNode, NodeFlag) :- propagated_flag(PackageNode, NodeFlag, _). % Cannot propagate the same flag from two distinct sources error(100, "{0} and {1} cannot both propagate compiler flags '{2}' to {3}", Source1, Source2, Package, FlagType) :- - propagated_flag(node(ID, Package), node_flag(FlagType, _), node(_, Source1)), - propagated_flag(node(ID, Package), node_flag(FlagType, _), node(_, Source2)), + propagated_flag(node(ID, Package), node_flag(FlagType, _, _, _), node(_, Source1)), + propagated_flag(node(ID, Package), node_flag(FlagType, _, _, _), node(_, Source2)), Source1 < Source2. %---- @@ -1340,7 +1376,7 @@ node_compiler_weight(node(ID, Package), 100) not compiler_weight(CompilerID, _). % For the time being, be strict and reuse only if the compiler match one we have on the system -error(100, "Compiler {1}@{2} requested for {0} cannot be found. Set install_missing_compilers:true if intended.", Package, Compiler, Version) +error(100, "Compiler {1}@{2} requested for {0} cannot be found.", Package, Compiler, Version) :- attr("node_compiler_version", node(ID, Package), Compiler, Version), not node_compiler(node(ID, Package), _). @@ -1351,23 +1387,18 @@ error(100, "Compiler {1}@{2} requested for {0} cannot be found. Set install_miss % Compiler flags %----------------------------------------------------------------------------- -% remember where flags came from -attr("node_flag_source", PackageNode, FlagType, PackageNode) :- attr("node_flag_set", PackageNode, FlagType, _). -attr("node_flag_source", PackageNode, FlagType, PackageNode) :- attr("node_flag", PackageNode, FlagType, _), attr("hash", PackageNode, _). - % compiler flags from compilers.yaml are put on nodes if compiler matches -attr("node_flag", PackageNode, FlagType, Flag) - :- compiler_flag(CompilerID, FlagType, Flag), +attr("node_flag", PackageNode, node_flag(FlagType, Flag, FlagGroup, CompilerID)) + :- compiler_flag(CompilerID, FlagType, Flag, FlagGroup), node_compiler(PackageNode, CompilerID), flag_type(FlagType), compiler_id(CompilerID), compiler_name(CompilerID, CompilerName), compiler_version(CompilerID, Version). -% Flag set to something -attr("node_flag", PackageNode, FlagType, Flag) :- attr("node_flag_set", PackageNode, FlagType, Flag). +attr("node_flag", PackageNode, NodeFlag) :- attr("node_flag_set", PackageNode, NodeFlag). -#defined compiler_flag/3. +#defined compiler_flag/4. %----------------------------------------------------------------------------- diff --git a/lib/spack/spack/solver/core.py b/lib/spack/spack/solver/core.py index 896631290c5ce2..2530981a21dda6 100644 --- a/lib/spack/spack/solver/core.py +++ b/lib/spack/spack/solver/core.py @@ -230,6 +230,13 @@ class NodeArgument(NamedTuple): pkg: str +class NodeFlag(NamedTuple): + flag_type: str + flag: str + flag_group: str + source: str + + def intermediate_repr(sym): """Returns an intermediate representation of clingo models for Spack's spec builder. @@ -248,6 +255,13 @@ def intermediate_repr(sym): return NodeArgument( id=intermediate_repr(sym.arguments[0]), pkg=intermediate_repr(sym.arguments[1]) ) + elif sym.name == "node_flag": + return NodeFlag( + flag_type=intermediate_repr(sym.arguments[0]), + flag=intermediate_repr(sym.arguments[1]), + flag_group=intermediate_repr(sym.arguments[2]), + source=intermediate_repr(sym.arguments[3]), + ) except RuntimeError: # This happens when using clingo w/ CFFI and trying to access ".name" for symbols # that are not functions diff --git a/lib/spack/spack/solver/display.lp b/lib/spack/spack/solver/display.lp index 358a1628aadd73..675a9d17d278ee 100644 --- a/lib/spack/spack/solver/display.lp +++ b/lib/spack/spack/solver/display.lp @@ -13,6 +13,8 @@ #show attr/2. #show attr/3. #show attr/4. +#show attr/5. +#show attr/6. % names of optimization criteria #show opt_criterion/2. @@ -38,7 +40,7 @@ #show condition_requirement/4. #show condition_requirement/5. #show condition_requirement/6. -#show node_has_variant/2. +#show node_has_variant/3. #show build/1. #show external/1. #show external_version/3. @@ -48,5 +50,6 @@ #show condition_nodes/3. #show trigger_node/3. #show imposed_nodes/3. +#show variant_single_value/2. % debug diff --git a/lib/spack/spack/solver/error_messages.lp b/lib/spack/spack/solver/error_messages.lp index 79a9b4b7eb8aaa..7bc9ed2e93ce85 100644 --- a/lib/spack/spack/solver/error_messages.lp +++ b/lib/spack/spack/solver/error_messages.lp @@ -5,6 +5,10 @@ %============================================================================= % This logic program adds detailed error messages to Spack's concretizer +% +% Note that functions used in rule bodies here need to have a corresponding +% #show line in display.lp, otherwise they won't be passed through to the +% error solve. %============================================================================= #program error_messages. @@ -113,12 +117,11 @@ error(0, "Cannot find a valid provider for virtual {0}", Virtual, startcauses, C pkg_fact(TriggerPkg, condition_effect(Cause, EID)), condition_holds(Cause, node(CID, TriggerPkg)). - % At most one variant value for single-valued variants error(0, "'{0}' required multiple values for single-valued variant '{1}'\n Requested 'Spec({1}={2})' and 'Spec({1}={3})'", Package, Variant, Value1, Value2, startcauses, Cause1, X, Cause2, X) :- attr("node", node(X, Package)), - node_has_variant(node(X, Package), Variant), - pkg_fact(Package, variant_single_value(Variant)), + node_has_variant(node(X, Package), Variant, VariantID), + variant_single_value(node(X, Package), Variant), build(node(X, Package)), attr("variant_value", node(X, Package), Variant, Value1), imposed_constraint(EID1, "variant_set", Package, Variant, Value1), @@ -216,6 +219,11 @@ error(0, Msg, startcauses, TriggerID, ID1, ConstraintID, ID2) #defined error/4. #defined error/5. #defined error/6. +#defined error/7. +#defined error/8. +#defined error/9. +#defined error/10. +#defined error/11. #defined attr/2. #defined attr/3. #defined attr/4. @@ -225,6 +233,7 @@ error(0, Msg, startcauses, TriggerID, ID1, ConstraintID, ID2) #defined imposed_constraint/4. #defined imposed_constraint/5. #defined imposed_constraint/6. +#defined condition_cause/4. #defined condition_requirement/3. #defined condition_requirement/4. #defined condition_requirement/5. @@ -234,6 +243,7 @@ error(0, Msg, startcauses, TriggerID, ID1, ConstraintID, ID2) #defined external/1. #defined trigger_and_effect/3. #defined build/1. -#defined node_has_variant/2. +#defined node_has_variant/3. #defined provider/2. #defined external_version/3. +#defined variant_single_value/2. diff --git a/lib/spack/spack/solver/heuristic.lp b/lib/spack/spack/solver/heuristic.lp index a5d6767ff2b1b4..e5d7de4966af57 100644 --- a/lib/spack/spack/solver/heuristic.lp +++ b/lib/spack/spack/solver/heuristic.lp @@ -7,32 +7,37 @@ % Heuristic to speed-up solves %============================================================================= -% No duplicates by default (most of them will be true) -#heuristic attr("node", node(PackageID, Package)). [100, init] -#heuristic attr("node", node(PackageID, Package)). [ 2, factor] -#heuristic attr("virtual_node", node(VirtualID, Virtual)). [100, init] -#heuristic attr("node", node(1..X-1, Package)) : max_dupes(Package, X), not virtual(Package), X > 1. [-1, sign] -#heuristic attr("virtual_node", node(1..X-1, Package)) : max_dupes(Package, X), virtual(Package) , X > 1. [-1, sign] - -% Pick preferred version -#heuristic attr("version", node(PackageID, Package), Version) : pkg_fact(Package, version_declared(Version, Weight)), attr("node", node(PackageID, Package)). [40, init] -#heuristic version_weight(node(PackageID, Package), 0) : pkg_fact(Package, version_declared(Version, 0 )), attr("node", node(PackageID, Package)). [ 1, sign] -#heuristic attr("version", node(PackageID, Package), Version) : pkg_fact(Package, version_declared(Version, 0 )), attr("node", node(PackageID, Package)). [ 1, sign] -#heuristic attr("version", node(PackageID, Package), Version) : pkg_fact(Package, version_declared(Version, Weight)), attr("node", node(PackageID, Package)), Weight > 0. [-1, sign] +#heuristic attr("node", PackageNode). [300, init] +#heuristic attr("node", PackageNode). [ 2, factor] +#heuristic attr("node", PackageNode). [ -1, sign] +#heuristic attr("node", node(0, Dependency)) : attr("dependency_holds", ParentNode, Dependency, Type), not virtual(Dependency). [1@2, sign] -% Use default variants -#heuristic attr("variant_value", node(PackageID, Package), Variant, Value) : variant_default_value(Package, Variant, Value), attr("node", node(PackageID, Package)). [40, true] -#heuristic attr("variant_value", node(PackageID, Package), Variant, Value) : not variant_default_value(Package, Variant, Value), attr("node", node(PackageID, Package)). [40, false] +#heuristic attr("virtual_node", node(X, Virtual)). [60, init] +#heuristic attr("virtual_node", node(X, Virtual)). [-1, sign] +#heuristic attr("virtual_node", node(0, Virtual)) : node_depends_on_virtual(PackageNode, Virtual). [1@2, sign] + +#heuristic attr("depends_on", ParentNode, ChildNode, Type). [150, init] +#heuristic attr("depends_on", ParentNode, ChildNode, Type). [4, factor] +#heuristic attr("depends_on", ParentNode, ChildNode, Type). [-1, sign] +#heuristic attr("depends_on", ParentNode, node(0, Dependency), Type) : attr("dependency_holds", ParentNode, Dependency, Type), not virtual(Dependency). [1@2, sign] +#heuristic attr("depends_on", ParentNode, ProviderNode , Type) : node_depends_on_virtual(ParentNode, Virtual, Type), provider(ProviderNode, node(VirtualID, Virtual)). [1@2, sign] + +#heuristic attr("version", node(PackageID, Package), Version). [30, init] +#heuristic attr("version", node(PackageID, Package), Version). [-1, sign] +#heuristic attr("version", node(PackageID, Package), Version) : pkg_fact(Package, version_declared(Version, 0)), attr("node", node(PackageID, Package)). [ 1@2, sign] -% Use default operating system and platform -#heuristic attr("node_os", node(PackageID, Package), OS) : os(OS, 0), attr("root", node(PackageID, Package)). [40, true] -#heuristic attr("node_platform", node(PackageID, Package), Platform) : allowed_platform(Platform), attr("root", node(PackageID, Package)). [40, true] +#heuristic version_weight(node(PackageID, Package), Weight). [30, init] +#heuristic version_weight(node(PackageID, Package), Weight). [-1 , sign] +#heuristic version_weight(node(PackageID, Package), 0 ) : attr("node", node(PackageID, Package)). [ 1@2, sign] + +% Use default variants +#heuristic attr("variant_value", PackageNode, Variant, Value). [30, init] +#heuristic attr("variant_value", PackageNode, Variant, Value). [-1, sign] +#heuristic attr("variant_value", PackageNode, Variant, Value) : variant_default_value(PackageNode, Variant, Value), attr("node", PackageNode). [1@2, sign] % Use default targets -#heuristic attr("node_target", node(PackageID, Package), Target) : target_weight(Target, Weight), attr("node", node(PackageID, Package)). [30, init] -#heuristic attr("node_target", node(PackageID, Package), Target) : target_weight(Target, Weight), attr("node", node(PackageID, Package)). [ 2, factor] -#heuristic attr("node_target", node(PackageID, Package), Target) : target_weight(Target, 0), attr("node", node(PackageID, Package)). [ 1, sign] -#heuristic attr("node_target", node(PackageID, Package), Target) : target_weight(Target, Weight), attr("node", node(PackageID, Package)), Weight > 0. [-1, sign] +#heuristic attr("node_target", node(PackageID, Package), Target). [-1, sign] +#heuristic attr("node_target", node(PackageID, Package), Target) : target_weight(Target, 0), attr("node", node(PackageID, Package)). [1@2, sign] % Use the default compilers #heuristic node_compiler(node(PackageID, Package), ID) : compiler_weight(ID, 0), compiler_id(ID), attr("node", node(PackageID, Package)). [30, init] diff --git a/lib/spack/spack/solver/version_order.py b/lib/spack/spack/solver/version_order.py new file mode 100644 index 00000000000000..23d3e390ce0838 --- /dev/null +++ b/lib/spack/spack/solver/version_order.py @@ -0,0 +1,21 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +from typing import Tuple, Union + +from spack.version import GitVersion, StandardVersion + + +def concretization_version_order(version_info: Tuple[Union[GitVersion, StandardVersion], dict]): + """Version order key for concretization, where preferred > not preferred, + not deprecated > deprecated, finite > any infinite component; only if all are + the same, do we use default version ordering.""" + version, info = version_info + return ( + info.get("preferred", False), + not info.get("deprecated", False), + not version.isdevelop(), + not version.is_prerelease(), + version, + ) diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 540c228147ff0a..2fe177e19e595c 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -26,7 +26,7 @@ version, like "1.2", or it can be a range of versions, e.g. "1.2:1.4". If multiple specific versions or multiple ranges are acceptable, they can be separated by commas, e.g. if a package will only build with - versions 1.0, 1.2-1.4, and 1.6-1.8 of mavpich, you could say: + versions 1.0, 1.2-1.4, and 1.6-1.8 of mvapich, you could say: depends_on("mvapich@1.0,1.2:1.4,1.6:1.8") @@ -61,6 +61,8 @@ import warnings from typing import Any, Callable, Dict, List, Match, Optional, Set, Tuple, Union +import archspec.cpu + import llnl.path import llnl.string import llnl.util.filesystem as fs @@ -68,6 +70,7 @@ import llnl.util.tty as tty import llnl.util.tty.color as clr +import spack import spack.compiler import spack.compilers import spack.config @@ -75,16 +78,13 @@ import spack.error import spack.hash_types as ht import spack.parser -import spack.patch import spack.paths import spack.platforms import spack.provider_index import spack.repo import spack.solver import spack.store -import spack.target import spack.traverse as traverse -import spack.util.crypto import spack.util.executable import spack.util.hash import spack.util.module_cmd as md @@ -214,6 +214,12 @@ def ensure_modern_format_string(fmt: str) -> None: ) +def _make_microarchitecture(name: str) -> archspec.cpu.Microarchitecture: + if isinstance(name, archspec.cpu.Microarchitecture): + return name + return archspec.cpu.TARGETS.get(name, archspec.cpu.generic_microarchitecture(name)) + + @lang.lazy_lexicographic_ordering class ArchSpec: """Aggregate the target platform, the operating system and the target microarchitecture.""" @@ -302,7 +308,10 @@ def _autospec(self, spec_like): def _cmp_iter(self): yield self.platform yield self.os - yield self.target + if self.target is None: + yield self.target + else: + yield self.target.name @property def platform(self): @@ -361,10 +370,10 @@ def target(self, value): # will assumed to be the host machine's platform. def target_or_none(t): - if isinstance(t, spack.target.Target): + if isinstance(t, archspec.cpu.Microarchitecture): return t if t and t != "None": - return spack.target.Target(t) + return _make_microarchitecture(t) return None value = target_or_none(value) @@ -453,10 +462,11 @@ def _target_constrain(self, other: "ArchSpec") -> bool: results = self._target_intersection(other) attribute_str = ",".join(results) - if self.target == attribute_str: + intersection_target = _make_microarchitecture(attribute_str) + if self.target == intersection_target: return False - self.target = attribute_str + self.target = intersection_target return True def _target_intersection(self, other): @@ -474,7 +484,7 @@ def _target_intersection(self, other): # s_target_range is a concrete target # get a microarchitecture reference for at least one side # of each comparison so we can use archspec comparators - s_comp = spack.target.Target(s_min).microarchitecture + s_comp = _make_microarchitecture(s_min) if not o_sep: if s_min == o_min: results.append(s_min) @@ -482,21 +492,21 @@ def _target_intersection(self, other): results.append(s_min) elif not o_sep: # "cast" to microarchitecture - o_comp = spack.target.Target(o_min).microarchitecture + o_comp = _make_microarchitecture(o_min) if (not s_min or o_comp >= s_min) and (not s_max or o_comp <= s_max): results.append(o_min) else: # Take intersection of two ranges # Lots of comparisons needed - _s_min = spack.target.Target(s_min).microarchitecture - _s_max = spack.target.Target(s_max).microarchitecture - _o_min = spack.target.Target(o_min).microarchitecture - _o_max = spack.target.Target(o_max).microarchitecture + _s_min = _make_microarchitecture(s_min) + _s_max = _make_microarchitecture(s_max) + _o_min = _make_microarchitecture(o_min) + _o_max = _make_microarchitecture(o_max) n_min = s_min if _s_min >= _o_min else o_min n_max = s_max if _s_max <= _o_max else o_max - _n_min = spack.target.Target(n_min).microarchitecture - _n_max = spack.target.Target(n_max).microarchitecture + _n_min = _make_microarchitecture(n_min) + _n_max = _make_microarchitecture(n_max) if _n_min == _n_max: results.append(n_min) elif not n_min or not n_max or _n_min < _n_max: @@ -549,12 +559,18 @@ def target_concrete(self): ) def to_dict(self): + # Generic targets represent either an architecture family (like x86_64) + # or a custom micro-architecture + if self.target.vendor == "generic": + target_data = str(self.target) + else: + # Get rid of compiler flag information before turning the uarch into a dict + uarch_dict = self.target.to_dict() + uarch_dict.pop("compilers", None) + target_data = syaml.syaml_dict(uarch_dict.items()) + d = syaml.syaml_dict( - [ - ("platform", self.platform), - ("platform_os", self.os), - ("target", self.target.to_dict_or_value()), - ] + [("platform", self.platform), ("platform_os", self.os), ("target", target_data)] ) return syaml.syaml_dict([("arch", d)]) @@ -562,7 +578,10 @@ def to_dict(self): def from_dict(d): """Import an ArchSpec from raw YAML/JSON data""" arch = d["arch"] - target = spack.target.Target.from_dict_or_value(arch["target"]) + target_name = arch["target"] + if not isinstance(target_name, str): + target_name = target_name["name"] + target = _make_microarchitecture(target_name) return ArchSpec((arch["platform"], arch["platform_os"], target)) def __str__(self): @@ -781,17 +800,49 @@ class CompilerFlag(str): propagate (bool): if ``True`` the flag value will be passed to the package's dependencies. If ``False`` it will not + flag_group (str): if this flag was introduced along + with several flags via a single source, then + this will store all such flags + source (str): identifies the type of constraint that + introduced this flag (e.g. if a package has + ``depends_on(... cflags=-g)``, then the ``source`` + for "-g" would indicate ``depends_on``. """ def __new__(cls, value, **kwargs): obj = str.__new__(cls, value) obj.propagate = kwargs.pop("propagate", False) + obj.flag_group = kwargs.pop("flag_group", value) + obj.source = kwargs.pop("source", None) return obj _valid_compiler_flags = ["cflags", "cxxflags", "fflags", "ldflags", "ldlibs", "cppflags"] +def _shared_subset_pair_iterate(container1, container2): + """ + [0, a, c, d, f] + [a, d, e, f] + + yields [(a, a), (d, d), (f, f)] + + no repeated elements + """ + a_idx, b_idx = 0, 0 + max_a, max_b = len(container1), len(container2) + while a_idx < max_a and b_idx < max_b: + if container1[a_idx] == container2[b_idx]: + yield (container1[a_idx], container2[b_idx]) + a_idx += 1 + b_idx += 1 + else: + while container1[a_idx] < container2[b_idx]: + a_idx += 1 + while container1[a_idx] > container2[b_idx]: + b_idx += 1 + + class FlagMap(lang.HashableMap): __slots__ = ("spec",) @@ -800,23 +851,9 @@ def __init__(self, spec): self.spec = spec def satisfies(self, other): - return all(f in self and self[f] == other[f] for f in other) + return all(f in self and set(self[f]) >= set(other[f]) for f in other) def intersects(self, other): - common_types = set(self) & set(other) - for flag_type in common_types: - if not self[flag_type] or not other[flag_type]: - # At least one of the two is empty - continue - - if self[flag_type] != other[flag_type]: - return False - - if not all( - f1.propagate == f2.propagate for f1, f2 in zip(self[flag_type], other[flag_type]) - ): - # At least one propagation flag didn't match - return False return True def constrain(self, other): @@ -824,28 +861,28 @@ def constrain(self, other): Return whether the spec changed. """ - if other.spec and other.spec._concrete: - for k in self: - if k not in other: - raise UnsatisfiableCompilerFlagSpecError(self[k], "") - changed = False - for k in other: - if k in self and not set(self[k]) <= set(other[k]): - raise UnsatisfiableCompilerFlagSpecError( - " ".join(f for f in self[k]), " ".join(f for f in other[k]) - ) - elif k not in self: - self[k] = other[k] + for flag_type in other: + if flag_type not in self: + self[flag_type] = other[flag_type] changed = True + else: + extra_other = set(other[flag_type]) - set(self[flag_type]) + if extra_other: + self[flag_type] = list(self[flag_type]) + list( + x for x in other[flag_type] if x in extra_other + ) + changed = True + + # Next, if any flags in other propagate, we force them to propagate in our case + shared = list(sorted(set(other[flag_type]) - extra_other)) + for x, y in _shared_subset_pair_iterate(shared, sorted(self[flag_type])): + if x.propagate: + y.propagate = True + + # TODO: what happens if flag groups with a partial (but not complete) + # intersection specify different behaviors for flag propagation? - # Check that the propagation values match - if self[k] == other[k]: - for i in range(len(other[k])): - if self[k][i].propagate != other[k][i].propagate: - raise UnsatisfiableCompilerFlagSpecError( - self[k][i].propagate, other[k][i].propagate - ) return changed @staticmethod @@ -858,7 +895,7 @@ def copy(self): clone[name] = compiler_flag return clone - def add_flag(self, flag_type, value, propagation): + def add_flag(self, flag_type, value, propagation, flag_group=None, source=None): """Stores the flag's value in CompilerFlag and adds it to the FlagMap @@ -869,7 +906,8 @@ def add_flag(self, flag_type, value, propagation): propagation (bool): if ``True`` the flag value will be passed to the packages' dependencies. If``False`` it will not be passed """ - flag = CompilerFlag(value, propagate=propagation) + flag_group = flag_group or value + flag = CompilerFlag(value, propagate=propagation, flag_group=flag_group, source=source) if flag_type not in self: self[flag_type] = [flag] @@ -1117,7 +1155,7 @@ def _libs_default_handler(spec: "Spec"): for shared in search_shared: # Since we are searching for link libraries, on Windows search only for - # ".Lib" extensions by default as those represent import libraries for implict links. + # ".Lib" extensions by default as those represent import libraries for implicit links. libs = fs.find_libraries(name, home, shared=shared, recursive=True, runtime=False) if libs: return libs @@ -1288,7 +1326,7 @@ def copy(self, *args, **kwargs): def tree( - specs: List["spack.spec.Spec"], + specs: List["Spec"], *, color: Optional[bool] = None, depth: bool = False, @@ -1665,8 +1703,9 @@ def _add_flag(self, name, value, propagate): elif name in valid_flags: assert self.compiler_flags is not None flags_and_propagation = spack.compiler.tokenize_flags(value, propagate) + flag_group = " ".join(x for (x, y) in flags_and_propagation) for flag, propagation in flags_and_propagation: - self.compiler_flags.add_flag(name, flag, propagation) + self.compiler_flags.add_flag(name, flag, propagation, flag_group) else: # FIXME: # All other flags represent variants. 'foo=true' and 'foo=false' @@ -1700,19 +1739,28 @@ def _add_dependency(self, spec: "Spec", *, depflag: dt.DepFlag, virtuals: Tuple[ self.add_dependency_edge(spec, depflag=depflag, virtuals=virtuals) return - # Keep the intersection of constraints when a dependency is added multiple times. - # The only restriction, currently, is keeping the same dependency type + # Keep the intersection of constraints when a dependency is added multiple times with + # the same deptype. Add a new dependency if it is added with a compatible deptype + # (for example, a build-only dependency is compatible with a link-only dependenyc). + # The only restrictions, currently, are that we cannot add edges with overlapping + # dependency types and we cannot add multiple edges that have link/run dependency types. + # See ``spack.deptypes.compatible``. orig = self._dependencies[spec.name] try: dspec = next(dspec for dspec in orig if depflag == dspec.depflag) except StopIteration: - edge_attrs = f"deptypes={dt.flag_to_chars(depflag).strip()}" - required_dep_str = f"^[{edge_attrs}] {str(spec)}" + # Error if we have overlapping or incompatible deptypes + if any(not dt.compatible(dspec.depflag, depflag) for dspec in orig): + edge_attrs = f"deptypes={dt.flag_to_chars(depflag).strip()}" + required_dep_str = f"^[{edge_attrs}] {str(spec)}" + + raise DuplicateDependencyError( + f"{spec.name} is a duplicate dependency, with conflicting dependency types\n" + f"\t'{str(self)}' cannot depend on '{required_dep_str}'" + ) - raise DuplicateDependencyError( - f"{spec.name} is a duplicate dependency, with conflicting dependency types\n" - f"\t'{str(self)}' cannot depend on '{required_dep_str}'" - ) + self.add_dependency_edge(spec, depflag=depflag, virtuals=virtuals) + return try: dspec.spec.constrain(spec) @@ -1737,7 +1785,10 @@ def add_dependency_edge( for edge in selected: has_errors, details = False, [] msg = f"cannot update the edge from {edge.parent.name} to {edge.spec.name}" - if edge.depflag & depflag: + + # If the dependency is to an existing spec, we can update dependency + # types. If it is to a new object, check deptype compatibility. + if id(edge.spec) != id(dependency_spec) and not dt.compatible(edge.depflag, depflag): has_errors = True details.append( ( @@ -1746,14 +1797,13 @@ def add_dependency_edge( ) ) - if any(v in edge.virtuals for v in virtuals): - has_errors = True - details.append( - ( - f"{edge.parent.name} has already an edge matching any" - f" of these virtuals {virtuals}" + if any(v in edge.virtuals for v in virtuals): + details.append( + ( + f"{edge.parent.name} has already an edge matching any" + f" of these virtuals {virtuals}" + ) ) - ) if has_errors: raise spack.error.SpecError(msg, "\n".join(details)) @@ -1997,6 +2047,7 @@ def process_hash_bit_prefix(self, bits): def _lookup_hash(self): """Lookup just one spec with an abstract hash, returning a spec from the the environment, store, or finally, binary caches.""" + import spack.binary_distribution import spack.environment active_env = spack.environment.active_environment() @@ -2012,7 +2063,7 @@ def _lookup_hash(self): raise InvalidHashError(self, self.abstract_hash) if len(matches) != 1: - raise spack.spec.AmbiguousHashError( + raise AmbiguousHashError( f"Multiple packages specify hash beginning '{self.abstract_hash}'.", *matches ) @@ -2347,14 +2398,16 @@ def override(init_spec, change_spec): package_cls = spack.repo.PATH.get_pkg_class(new_spec.name) if change_spec.versions and not change_spec.versions == vn.any_version: new_spec.versions = change_spec.versions - for variant, value in change_spec.variants.items(): - if variant in package_cls.variants: - if variant in new_spec.variants: + + for vname, value in change_spec.variants.items(): + if vname in package_cls.variant_names(): + if vname in new_spec.variants: new_spec.variants.substitute(value) else: - new_spec.variants[variant] = value + new_spec.variants[vname] = value else: - raise ValueError("{0} is not a variant of {1}".format(variant, new_spec.name)) + raise ValueError("{0} is not a variant of {1}".format(vname, new_spec.name)) + if change_spec.compiler: new_spec.compiler = change_spec.compiler if change_spec.compiler_flags: @@ -2455,7 +2508,7 @@ def spec_builder(d): spec_like, dep_like = next(iter(d.items())) # If the requirements was for unique nodes (default) - # then re-use keys from the local cache. Otherwise build + # then reuse keys from the local cache. Otherwise build # a new node every time. if not isinstance(spec_like, Spec): spec = spec_cache[spec_like] if normal else Spec(spec_like) @@ -2949,48 +3002,14 @@ def ensure_valid_variants(spec): return pkg_cls = spec.package_class - pkg_variants = pkg_cls.variants + pkg_variants = pkg_cls.variant_names() # reserved names are variants that may be set on any package # but are not necessarily recorded by the package's class not_existing = set(spec.variants) - (set(pkg_variants) | set(vt.reserved_names)) if not_existing: - raise vt.UnknownVariantError(spec, not_existing) - - def update_variant_validate(self, variant_name, values): - """If it is not already there, adds the variant named - `variant_name` to the spec `spec` based on the definition - contained in the package metadata. Validates the variant and - values before returning. - - Used to add values to a variant without being sensitive to the - variant being single or multi-valued. If the variant already - exists on the spec it is assumed to be multi-valued and the - values are appended. - - Args: - variant_name: the name of the variant to add or append to - values: the value or values (as a tuple) to add/append - to the variant - """ - if not isinstance(values, tuple): - values = (values,) - - pkg_variant, _ = self.package_class.variants[variant_name] - - for value in values: - if self.variants.get(variant_name): - msg = ( - f"cannot append the new value '{value}' to the single-valued " - f"variant '{self.variants[variant_name]}'" - ) - assert pkg_variant.multi, msg - self.variants[variant_name].append(value) - else: - variant = pkg_variant.make_variant(value) - self.variants[variant_name] = variant - - pkg_cls = spack.repo.PATH.get_pkg_class(self.name) - pkg_variant.validate_or_raise(self.variants[variant_name], pkg_cls) + raise vt.UnknownVariantError( + f"No such variant {not_existing} for spec: '{spec}'", list(not_existing) + ) def constrain(self, other, deps=True): """Intersect self with other in-place. Return True if self changed, False otherwise. @@ -3451,7 +3470,7 @@ def patches(self): pkg_cls = spack.repo.PATH.get_pkg_class(self.name) try: patch = index.patch_for_package(sha256, pkg_cls) - except spack.patch.PatchLookupError as e: + except spack.error.PatchLookupError as e: raise spack.error.SpecError( f"{e}. This usually means the patch was modified or removed. " "To fix this, either reconcretize or use the original package " @@ -3898,43 +3917,43 @@ def format_attribute(match_object: Match) -> str: for idx, part in enumerate(parts): if not part: raise SpecFormatStringError("Format string attributes must be non-empty") - if part.startswith("_"): + elif part.startswith("_"): raise SpecFormatStringError("Attempted to format private attribute") - else: - if part == "variants" and isinstance(current, VariantMap): - # subscript instead of getattr for variant names + elif isinstance(current, VariantMap): + # subscript instead of getattr for variant names + try: current = current[part] - else: - # aliases - if part == "arch": - part = "architecture" - elif part == "version": - # version (singular) requires a concrete versions list. Avoid - # pedantic errors by using versions (plural) when not concrete. - # These two are not entirely equivalent for pkg@=1.2.3: - # - version prints '1.2.3' - # - versions prints '=1.2.3' - if not current.versions.concrete: - part = "versions" - try: - current = getattr(current, part) - except AttributeError: - parent = ".".join(parts[:idx]) - m = "Attempted to format attribute %s." % attribute - m += "Spec %s has no attribute %s" % (parent, part) - raise SpecFormatStringError(m) - if isinstance(current, vn.VersionList): - if current == vn.any_version: - # don't print empty version lists - return "" - - if callable(current): - raise SpecFormatStringError("Attempted to format callable object") - - if current is None: - # not printing anything + except KeyError: + raise SpecFormatStringError(f"Variant '{part}' does not exist") + else: + # aliases + if part == "arch": + part = "architecture" + elif part == "version" and not current.versions.concrete: + # version (singular) requires a concrete versions list. Avoid + # pedantic errors by using versions (plural) when not concrete. + # These two are not entirely equivalent for pkg@=1.2.3: + # - version prints '1.2.3' + # - versions prints '=1.2.3' + part = "versions" + try: + current = getattr(current, part) + except AttributeError: + raise SpecFormatStringError( + f"Attempted to format attribute {attribute}. " + f"Spec {'.'.join(parts[:idx])} has no attribute {part}" + ) + if isinstance(current, vn.VersionList) and current == vn.any_version: + # don't print empty version lists return "" + if callable(current): + raise SpecFormatStringError("Attempted to format callable object") + + if current is None: + # not printing anything + return "" + # Set color codes for various attributes color = None if "architecture" in parts: @@ -4015,8 +4034,12 @@ def format_path( return str(path_ctor(*output_path_components)) def __str__(self): + if self._concrete: + return self.format("{name}{@version}{/hash:7}") + if not self._dependencies: return self.format() + root_str = [self.format()] sorted_dependencies = sorted( self.traverse(root=False), key=lambda x: (x.name, x.abstract_hash) @@ -4139,9 +4162,7 @@ def os(self): @property def target(self): - # This property returns the underlying microarchitecture object - # to give to the attribute the appropriate comparison semantic - return self.architecture.target.microarchitecture + return self.architecture.target @property def build_spec(self): @@ -4165,154 +4186,245 @@ def trim(self, dep_name): new_dependencies.add(edge) spec._dependencies = new_dependencies - def splice(self, other, transitive): - """Splices dependency "other" into this ("target") Spec, and return the - result as a concrete Spec. - If transitive, then other and its dependencies will be extrapolated to - a list of Specs and spliced in accordingly. - For example, let there exist a dependency graph as follows: - T - | \ - Z<-H - In this example, Spec T depends on H and Z, and H also depends on Z. - Suppose, however, that we wish to use a different H, known as H'. This - function will splice in the new H' in one of two ways: - 1. transitively, where H' depends on the Z' it was built with, and the - new T* also directly depends on this new Z', or - 2. intransitively, where the new T* and H' both depend on the original - Z. - Since the Spec returned by this splicing function is no longer deployed - the same way it was built, any such changes are tracked by setting the - build_spec to point to the corresponding dependency from the original - Spec. - TODO: Extend this for non-concrete Specs. + def _virtuals_provided(self, root): + """Return set of virtuals provided by self in the context of root""" + if root is self: + # Could be using any virtual the package can provide + return set(v.name for v in self.package.virtuals_provided) + + hashes = [s.dag_hash() for s in root.traverse()] + in_edges = set( + [edge for edge in self.edges_from_dependents() if edge.parent.dag_hash() in hashes] + ) + return set().union(*[edge.virtuals for edge in in_edges]) + + def _splice_match(self, other, self_root, other_root): + """Return True if other is a match for self in a splice of other_root into self_root + + Other is a splice match for self if it shares a name, or if self is a virtual provider + and other provides a superset of the virtuals provided by self. Virtuals provided are + evaluated in the context of a root spec (self_root for self, other_root for other). + + This is a slight oversimplification. Other could be a match for self in the context of + one edge in self_root and not in the context of another edge. This method could be + expanded in the future to account for these cases. """ - assert self.concrete - assert other.concrete + if other.name == self.name: + return True - virtuals_to_replace = [v.name for v in other.package.virtuals_provided if v in self] - if virtuals_to_replace: - deps_to_replace = dict((self[v], other) for v in virtuals_to_replace) - # deps_to_replace = [self[v] for v in virtuals_to_replace] - else: - # TODO: sanity check and error raise here for other.name not in self - deps_to_replace = {self[other.name]: other} - # deps_to_replace = [self[other.name]] - - for d in deps_to_replace: - if not all( - v in other.package.virtuals_provided or v not in self - for v in d.package.virtuals_provided - ): - # There was something provided by the original that we don't - # get from its replacement. - raise SpliceError( - ("Splice between {0} and {1} will not provide " "the same virtuals.").format( - self.name, other.name - ) - ) - for n in d.traverse(root=False): - if not all( - any( - v in other_n.package.virtuals_provided - for other_n in other.traverse(root=False) - ) - or v not in self - for v in n.package.virtuals_provided - ): - raise SpliceError( - ( - "Splice between {0} and {1} will not provide " "the same virtuals." - ).format(self.name, other.name) - ) + return bool( + bool(self._virtuals_provided(self_root)) + and self._virtuals_provided(self_root) <= other._virtuals_provided(other_root) + ) - # For now, check that we don't have DAG with multiple specs from the - # same package - def multiple_specs(root): - counter = collections.Counter([node.name for node in root.traverse()]) - _, max_number = counter.most_common()[0] - return max_number > 1 - - if multiple_specs(self) or multiple_specs(other): - msg = ( - 'Either "{0}" or "{1}" contain multiple specs from the same ' - "package, which cannot be handled by splicing at the moment" - ) - raise ValueError(msg.format(self, other)) + def _splice_detach_and_add_dependents(self, replacement, context): + """Helper method for Spec._splice_helper. + + replacement is a node to splice in, context is the scope of dependents to consider relevant + to this splice.""" + # Update build_spec attributes for all transitive dependents + # before we start changing their dependencies + ancestors_in_context = [ + a + for a in self.traverse(root=False, direction="parents") + if a in context.traverse(deptype=dt.LINK | dt.RUN) + ] + for ancestor in ancestors_in_context: + # Only set it if it hasn't been spliced before + ancestor._build_spec = ancestor._build_spec or ancestor.copy() + ancestor.clear_cached_hashes(ignore=(ht.package_hash.attr,)) + for edge in ancestor.edges_to_dependencies(depflag=dt.BUILD): + if edge.depflag & ~dt.BUILD: + edge.depflag &= ~dt.BUILD + else: + ancestor._dependencies[edge.spec.name].remove(edge) + edge.spec._dependents[ancestor.name].remove(edge) - # Multiple unique specs with the same name will collide, so the - # _dependents of these specs should not be trusted. - # Variants may also be ignored here for now... + # For each direct dependent in the link/run graph, replace the dependency on + # node with one on replacement + for edge in self.edges_from_dependents(): + if edge.parent not in ancestors_in_context: + continue - # Keep all cached hashes because we will invalidate the ones that need - # invalidating later, and we don't want to invalidate unnecessarily + edge.parent._dependencies.edges[self.name].remove(edge) + self._dependents.edges[edge.parent.name].remove(edge) + edge.parent._add_dependency(replacement, depflag=edge.depflag, virtuals=edge.virtuals) - def from_self(name, transitive): - if transitive: - if name in other: - return False - if any(v in other for v in self[name].package.virtuals_provided): - return False - return True - else: - if name == other.name: - return False - if any( - v in other.package.virtuals_provided - for v in self[name].package.virtuals_provided - ): - return False - return True + def _splice_helper(self, replacement): + """Main loop of a transitive splice. - self_nodes = dict( - (s.name, s.copy(deps=False)) - for s in self.traverse(root=True) - if from_self(s.name, transitive) - ) + The while loop around a traversal of self ensures that changes to self from previous + iterations are reflected in the traversal. This avoids evaluating irrelevant nodes + using topological traversal (all incoming edges traversed before any outgoing edge). + If any node will not be in the end result, its parent will be spliced and it will not + ever be considered. + For each node in self, find any analogous node in replacement and swap it in. + We assume all build deps are handled outside of this method - if transitive: - other_nodes = dict((s.name, s.copy(deps=False)) for s in other.traverse(root=True)) - else: - # NOTE: Does not fully validate providers; loader races possible - other_nodes = dict( - (s.name, s.copy(deps=False)) - for s in other.traverse(root=True) - if s is other or s.name not in self - ) + Arguments: + replacement: The node that will replace any equivalent node in self + self_root: The root of the spec that self comes from. This provides the context for + evaluating whether ``replacement`` is a match for each node of ``self``. See + ``Spec._splice_match`` and ``Spec._virtuals_provided`` for details. + other_root: The root of the spec that replacement comes from. This provides the context + for evaluating whether ``replacement`` is a match for each node of ``self``. See + ``Spec._splice_match`` and ``Spec._virtuals_provided`` for details. + """ + ids = set(id(s) for s in replacement.traverse()) - nodes = other_nodes.copy() - nodes.update(self_nodes) + # Sort all possible replacements by name and virtual for easy access later + replacements_by_name = collections.defaultdict(list) + for node in replacement.traverse(): + replacements_by_name[node.name].append(node) + virtuals = node._virtuals_provided(root=replacement) + for virtual in virtuals: + replacements_by_name[virtual].append(node) - for name in nodes: - if name in self_nodes: - for edge in self[name].edges_to_dependencies(): - dep_name = deps_to_replace.get(edge.spec, edge.spec).name - nodes[name].add_dependency_edge( - nodes[dep_name], depflag=edge.depflag, virtuals=edge.virtuals - ) - if any(dep not in self_nodes for dep in self[name]._dependencies): - nodes[name].build_spec = self[name].build_spec - else: - for edge in other[name].edges_to_dependencies(): - nodes[name].add_dependency_edge( - nodes[edge.spec.name], depflag=edge.depflag, virtuals=edge.virtuals - ) - if any(dep not in other_nodes for dep in other[name]._dependencies): - nodes[name].build_spec = other[name].build_spec + changed = True + while changed: + changed = False + + # Intentionally allowing traversal to change on each iteration + # using breadth-first traversal to ensure we only reach nodes that will + # be in final result + for node in self.traverse(root=False, order="topo", deptype=dt.ALL & ~dt.BUILD): + # If this node has already been swapped in, don't consider it again + if id(node) in ids: + continue - ret = nodes[self.name] + analogs = replacements_by_name[node.name] + if not analogs: + # If we have to check for matching virtuals, then we need to check that it + # matches all virtuals. Use `_splice_match` to validate possible matches + for virtual in node._virtuals_provided(root=self): + analogs += [ + r + for r in replacements_by_name[virtual] + if node._splice_match(r, self_root=self, other_root=replacement) + ] - # Clear cached hashes for all affected nodes - # Do not touch unaffected nodes - for dep in ret.traverse(root=True, order="post"): - opposite = other_nodes if dep.name in self_nodes else self_nodes - if any(name in dep for name in opposite.keys()): - # package hash cannot be affected by splice - dep.clear_cached_hashes(ignore=["package_hash"]) + # No match, keep iterating over self + if not analogs: + continue - dep.dag_hash() + # If there are multiple analogs, this package must satisfy the constraint + # that a newer version can always replace a lesser version. + analog = max(analogs, key=lambda s: s.version) - return nodes[self.name] + # No splice needed here, keep checking + if analog == node: + continue + + node._splice_detach_and_add_dependents(analog, context=self) + changed = True + break + + def splice(self, other: "Spec", transitive: bool = True) -> "Spec": + """Returns a new, spliced concrete Spec with the "other" dependency and, + optionally, its dependencies. + + Args: + other: alternate dependency + transitive: include other's dependencies + + Returns: a concrete, spliced version of the current Spec + + When transitive is "True", use the dependencies from "other" to reconcile + conflicting dependencies. When transitive is "False", use dependencies from self. + + For example, suppose we have the following dependency graph: + + T + | \ + Z<-H + + Spec T depends on H and Z, and H also depends on Z. Now we want to use + a different H, called H'. This function can be used to splice in H' to + create a new spec, called T*. If H' was built with Z', then transitive + "True" will ensure H' and T* both depend on Z': + + T* + | \ + Z'<-H' + + If transitive is "False", then H' and T* will both depend on + the original Z, resulting in a new H'* + + T* + | \ + Z<-H'* + + Provenance of the build is tracked through the "build_spec" property + of the spliced spec and any correspondingly modified dependency specs. + The build specs are set to that of the original spec, so the original + spec's provenance is preserved unchanged.""" + assert self.concrete + assert other.concrete + + if self._splice_match(other, self_root=self, other_root=other): + return other.copy() + + if not any( + node._splice_match(other, self_root=self, other_root=other) + for node in self.traverse(root=False, deptype=dt.LINK | dt.RUN) + ): + other_str = other.format("{name}/{hash:7}") + self_str = self.format("{name}/{hash:7}") + msg = f"Cannot splice {other_str} into {self_str}." + msg += f" Either {self_str} cannot depend on {other_str}," + msg += f" or {other_str} fails to provide a virtual used in {self_str}" + raise SpliceError(msg) + + # Copies of all non-build deps, build deps will get added at the end + spec = self.copy(deps=dt.ALL & ~dt.BUILD) + replacement = other.copy(deps=dt.ALL & ~dt.BUILD) + + def make_node_pairs(orig_spec, copied_spec): + return list( + zip( + orig_spec.traverse(deptype=dt.ALL & ~dt.BUILD), + copied_spec.traverse(deptype=dt.ALL & ~dt.BUILD), + ) + ) + + def mask_build_deps(in_spec): + for edge in in_spec.traverse_edges(cover="edges"): + edge.depflag &= ~dt.BUILD + + if transitive: + # These pairs will allow us to reattach all direct build deps + # We need the list of pairs while the two specs still match + node_pairs = make_node_pairs(self, spec) + + # Ignore build deps in the modified spec while doing the splice + # They will be added back in at the end + mask_build_deps(spec) + + # Transitively splice any relevant nodes from new into base + # This handles all shared dependencies between self and other + spec._splice_helper(replacement) + else: + # Do the same thing as the transitive splice, but reversed + node_pairs = make_node_pairs(other, replacement) + mask_build_deps(replacement) + replacement._splice_helper(spec) + + # Intransitively splice replacement into spec + # This is very simple now that all shared dependencies have been handled + for node in spec.traverse(order="topo", deptype=dt.LINK | dt.RUN): + if node._splice_match(other, self_root=spec, other_root=other): + node._splice_detach_and_add_dependents(replacement, context=spec) + + # For nodes that were spliced, modify the build spec to ensure build deps are preserved + # For nodes that were not spliced, replace the build deps on the spec itself + for orig, copy in node_pairs: + if copy._build_spec: + copy._build_spec = orig.build_spec.copy() + else: + for edge in orig.edges_to_dependencies(depflag=dt.BUILD): + copy._add_dependency(edge.spec, depflag=dt.BUILD, virtuals=edge.virtuals) + + return spec def clear_cached_hashes(self, ignore=()): """ @@ -4434,7 +4546,9 @@ def concrete(self): Returns: bool: True or False """ - return self.spec._concrete or all(v in self for v in self.spec.package_class.variants) + return self.spec._concrete or all( + v in self for v in self.spec.package_class.variant_names() + ) def copy(self) -> "VariantMap": clone = VariantMap(self.spec) @@ -4472,7 +4586,7 @@ def __str__(self): def substitute_abstract_variants(spec: Spec): """Uses the information in `spec.package` to turn any variant that needs - it into a SingleValuedVariant. + it into a SingleValuedVariant or BoolValuedVariant. This method is best effort. All variants that can be substituted will be substituted before any error is raised. @@ -4480,26 +4594,45 @@ def substitute_abstract_variants(spec: Spec): Args: spec: spec on which to operate the substitution """ - # This method needs to be best effort so that it works in matrix exlusion + # This method needs to be best effort so that it works in matrix exclusion # in $spack/lib/spack/spack/spec_list.py - failed = [] + unknown = [] for name, v in spec.variants.items(): if name == "dev_path": spec.variants.substitute(vt.SingleValuedVariant(name, v._original_value)) continue elif name in vt.reserved_names: continue - elif name not in spec.package_class.variants: - failed.append(name) + + variant_defs = spec.package_class.variant_definitions(name) + valid_defs = [] + for when, vdef in variant_defs: + if when.intersects(spec): + valid_defs.append(vdef) + + if not valid_defs: + if name not in spec.package_class.variant_names(): + unknown.append(name) + else: + whens = [str(when) for when, _ in variant_defs] + raise InvalidVariantForSpecError(v.name, f"({', '.join(whens)})", spec) + continue + + pkg_variant, *rest = valid_defs + if rest: continue - pkg_variant, _ = spec.package_class.variants[name] + new_variant = pkg_variant.make_variant(v._original_value) - pkg_variant.validate_or_raise(new_variant, spec.package_class) + pkg_variant.validate_or_raise(new_variant, spec.name) spec.variants.substitute(new_variant) - # Raise all errors at once - if failed: - raise vt.UnknownVariantError(spec, failed) + if unknown: + variants = llnl.string.plural(len(unknown), "variant") + raise vt.UnknownVariantError( + f"Tried to set {variants} {llnl.string.comma_and(unknown)}. " + f"{spec.name} has no such {variants}", + unknown_variants=unknown, + ) def parse_with_version_concrete(spec_like: Union[str, Spec], compiler: bool = False): @@ -4522,7 +4655,7 @@ def merge_abstract_anonymous_specs(*abstract_specs: Spec): Args: *abstract_specs: abstract specs to be merged """ - merged_spec = spack.spec.Spec() + merged_spec = Spec() for current_spec_constraint in abstract_specs: merged_spec.constrain(current_spec_constraint, deps=False) @@ -4688,7 +4821,7 @@ def _load(cls, data): virtuals=virtuals, ) if "build_spec" in node.keys(): - _, bhash, _ = cls.build_spec_from_node_dict(node, hash_type=hash_type) + _, bhash, _ = cls.extract_build_spec_info_from_node_dict(node, hash_type=hash_type) node_spec._build_spec = hash_dict[bhash]["node_spec"] return hash_dict[root_spec_hash]["node_spec"] @@ -4816,7 +4949,7 @@ def extract_info_from_dep(cls, elt, hash): return dep_hash, deptypes, hash_type, virtuals @classmethod - def build_spec_from_node_dict(cls, node, hash_type=ht.dag_hash.name): + def extract_build_spec_info_from_node_dict(cls, node, hash_type=ht.dag_hash.name): build_spec_dict = node["build_spec"] return build_spec_dict["name"], build_spec_dict[hash_type], hash_type @@ -4877,7 +5010,6 @@ def get_host_environment_metadata() -> Dict[str, str]: """Get the host environment, reduce to a subset that we can store in the install directory, and add the spack version. """ - import spack.main environ = get_host_environment() return { @@ -4885,7 +5017,7 @@ def get_host_environment_metadata() -> Dict[str, str]: "platform": environ["platform"], "host_target": environ["target"], "hostname": environ["hostname"], - "spack_version": spack.main.get_version(), + "spack_version": spack.get_version(), "kernel_version": platform.version(), } @@ -4907,7 +5039,6 @@ def get_host_environment() -> Dict[str, Any]: "architecture": arch_spec, "arch_str": str(arch_spec), "hostname": socket.gethostname(), - "full_hostname": socket.getfqdn(), } @@ -4930,6 +5061,15 @@ def long_message(self): ) +class InvalidVariantForSpecError(spack.error.SpecError): + """Raised when an invalid conditional variant is specified.""" + + def __init__(self, variant, when, spec): + msg = f"Invalid variant {variant} for spec {spec}.\n" + msg += f"{variant} is only available for {spec.name} when satisfying one of {when}." + super().__init__(msg) + + class UnsupportedPropagationError(spack.error.SpecError): """Raised when propagation (==) is used with reserved variant names.""" @@ -5012,7 +5152,7 @@ def __init__(self, provided, required): class UnsatisfiableCompilerSpecError(spack.error.UnsatisfiableSpecError): - """Raised when a spec comiler conflicts with package constraints.""" + """Raised when a spec compiler conflicts with package constraints.""" def __init__(self, provided, required): super().__init__(provided, required, "compiler") diff --git a/lib/spack/spack/stage.py b/lib/spack/spack/stage.py index 752ac42e4ec8d5..8b4efcf387b8f2 100644 --- a/lib/spack/spack/stage.py +++ b/lib/spack/spack/stage.py @@ -2,7 +2,6 @@ # Spack Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) -import concurrent.futures import errno import getpass import glob @@ -34,17 +33,16 @@ import spack.caches import spack.config import spack.error -import spack.fetch_strategy as fs import spack.mirror -import spack.paths import spack.resource import spack.spec -import spack.stage import spack.util.crypto import spack.util.lock +import spack.util.parallel import spack.util.path as sup import spack.util.pattern as pattern import spack.util.url as url_util +from spack import fetch_strategy as fs # breaks a cycle from spack.util.crypto import bit_length, prefix_bits from spack.util.editor import editor, executable from spack.version import StandardVersion, VersionList @@ -354,8 +352,8 @@ def __init__( url_or_fetch_strategy, *, name=None, - mirror_paths: Optional[spack.mirror.MirrorLayout] = None, - mirrors: Optional[Iterable[spack.mirror.Mirror]] = None, + mirror_paths: Optional["spack.mirror.MirrorLayout"] = None, + mirrors: Optional[Iterable["spack.mirror.Mirror"]] = None, keep=False, path=None, lock=True, @@ -466,7 +464,7 @@ def source_path(self): """Returns the well-known source directory path.""" return os.path.join(self.path, _source_path_subdir) - def _generate_fetchers(self, mirror_only=False) -> Generator[fs.FetchStrategy, None, None]: + def _generate_fetchers(self, mirror_only=False) -> Generator["fs.FetchStrategy", None, None]: fetchers: List[fs.FetchStrategy] = [] if not mirror_only: fetchers.append(self.default_fetcher) @@ -602,7 +600,7 @@ def cache_local(self): spack.caches.FETCH_CACHE.store(self.fetcher, self.mirror_layout.path) def cache_mirror( - self, mirror: spack.caches.MirrorCache, stats: spack.mirror.MirrorStats + self, mirror: "spack.caches.MirrorCache", stats: "spack.mirror.MirrorStats" ) -> None: """Perform a fetch if the resource is not already cached @@ -670,7 +668,7 @@ def destroy(self): class ResourceStage(Stage): def __init__( self, - fetch_strategy: fs.FetchStrategy, + fetch_strategy: "fs.FetchStrategy", root: Stage, resource: spack.resource.Resource, **kwargs, @@ -981,8 +979,8 @@ def interactive_version_filter( data = buffer.getvalue().encode("utf-8") short_hash = hashlib.sha1(data).hexdigest()[:7] - filename = f"{spack.stage.stage_prefix}versions-{short_hash}.txt" - filepath = os.path.join(spack.stage.get_stage_root(), filename) + filename = f"{stage_prefix}versions-{short_hash}.txt" + filepath = os.path.join(get_stage_root(), filename) # Write contents with open(filepath, "wb") as f: @@ -1134,7 +1132,7 @@ def get_checksums_for_versions( if checksum is not None: version_hashes[version] = checksum - with concurrent.futures.ProcessPoolExecutor(max_workers=concurrency) as executor: + with spack.util.parallel.make_concurrent_executor(concurrency, require_fork=False) as executor: results = [] for url, version in search_arguments: future = executor.submit(_fetch_and_checksum, url, fetch_options, keep_stage) diff --git a/lib/spack/spack/store.py b/lib/spack/spack/store.py index 62a5b5c4fb7980..31369531d550ce 100644 --- a/lib/spack/spack/store.py +++ b/lib/spack/spack/store.py @@ -33,6 +33,7 @@ import spack.error import spack.paths import spack.spec +import spack.store import spack.util.path #: default installation root, relative to the Spack install path diff --git a/lib/spack/spack/subprocess_context.py b/lib/spack/spack/subprocess_context.py index f96e530e971992..c823e657036fad 100644 --- a/lib/spack/spack/subprocess_context.py +++ b/lib/spack/spack/subprocess_context.py @@ -22,7 +22,7 @@ import spack.config import spack.environment -import spack.main +import spack.paths import spack.platforms import spack.repo import spack.store @@ -72,12 +72,12 @@ def __init__(self, pkg): else: self.pkg = pkg self.env = spack.environment.active_environment() - self.spack_working_dir = spack.main.spack_working_dir + self.spack_working_dir = spack.paths.spack_working_dir self.test_state = TestState() def restore(self): self.test_state.restore() - spack.main.spack_working_dir = self.spack_working_dir + spack.paths.spack_working_dir = self.spack_working_dir env = pickle.load(self.serialized_env) if _SERIALIZE else self.env if env: spack.environment.activate(env) diff --git a/lib/spack/spack/tag.py b/lib/spack/spack/tag.py index 559af56f0c8f21..fd2b252d8353d8 100644 --- a/lib/spack/spack/tag.py +++ b/lib/spack/spack/tag.py @@ -8,11 +8,14 @@ from collections.abc import Mapping import spack.error +import spack.repo import spack.util.spack_json as sjson def _get_installed_package_names(): """Returns names of packages installed in the active environment.""" + import spack.environment + specs = spack.environment.installed_specs() return [spec.name for spec in specs] diff --git a/lib/spack/spack/target.py b/lib/spack/spack/target.py deleted file mode 100644 index 8d0943c28aeb86..00000000000000 --- a/lib/spack/spack/target.py +++ /dev/null @@ -1,160 +0,0 @@ -# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other -# Spack Project Developers. See the top-level COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) -import functools - -import archspec.cpu - -import llnl.util.tty as tty - -import spack.compiler -import spack.compilers -import spack.spec -import spack.util.spack_yaml as syaml - - -def _ensure_other_is_target(method): - """In a single argument method, ensure that the argument is an - instance of ``Target``. - """ - - @functools.wraps(method) - def _impl(self, other): - if isinstance(other, str): - other = Target(other) - - if not isinstance(other, Target): - return NotImplemented - - return method(self, other) - - return _impl - - -class Target: - def __init__(self, name, module_name=None): - """Target models microarchitectures and their compatibility. - - Args: - name (str or Microarchitecture): microarchitecture of the target - module_name (str): optional module name to get access to the - current target. This is typically used on machines - like Cray (e.g. craype-compiler) - """ - if not isinstance(name, archspec.cpu.Microarchitecture): - name = archspec.cpu.TARGETS.get(name, archspec.cpu.generic_microarchitecture(name)) - self.microarchitecture = name - self.module_name = module_name - - @property - def name(self): - return self.microarchitecture.name - - @_ensure_other_is_target - def __eq__(self, other): - return ( - self.microarchitecture == other.microarchitecture - and self.module_name == other.module_name - ) - - def __ne__(self, other): - # This method is necessary as long as we support Python 2. In Python 3 - # __ne__ defaults to the implementation below - return not self == other - - @_ensure_other_is_target - def __lt__(self, other): - # TODO: In the future it would be convenient to say - # TODO: `spec.architecture.target < other.architecture.target` - # TODO: and change the semantic of the comparison operators - - # This is needed to sort deterministically specs in a list. - # It doesn't implement a total ordering semantic. - return self.microarchitecture.name < other.microarchitecture.name - - def __hash__(self): - return hash((self.name, self.module_name)) - - @staticmethod - def from_dict_or_value(dict_or_value): - # A string here represents a generic target (like x86_64 or ppc64) or - # a custom micro-architecture - if isinstance(dict_or_value, str): - return Target(dict_or_value) - - # TODO: From a dict we actually retrieve much more information than - # TODO: just the name. We can use that information to reconstruct an - # TODO: "old" micro-architecture or check the current definition. - target_info = dict_or_value - return Target(target_info["name"]) - - def to_dict_or_value(self): - """Returns a dict or a value representing the current target. - - String values are used to keep backward compatibility with generic - targets, like e.g. x86_64 or ppc64. More specific micro-architectures - will return a dictionary which contains information on the name, - features, vendor, generation and parents of the current target. - """ - # Generic targets represent either an architecture - # family (like x86_64) or a custom micro-architecture - if self.microarchitecture.vendor == "generic": - return str(self) - - # Get rid of compiler flag information before turning the uarch into a dict - uarch_dict = self.microarchitecture.to_dict() - uarch_dict.pop("compilers", None) - return syaml.syaml_dict(uarch_dict.items()) - - def __repr__(self): - cls_name = self.__class__.__name__ - fmt = cls_name + "({0}, {1})" - return fmt.format(repr(self.microarchitecture), repr(self.module_name)) - - def __str__(self): - return str(self.microarchitecture) - - def __contains__(self, cpu_flag): - return cpu_flag in self.microarchitecture - - def optimization_flags(self, compiler): - """Returns the flags needed to optimize for this target using - the compiler passed as argument. - - Args: - compiler (spack.spec.CompilerSpec or spack.compiler.Compiler): object that - contains both the name and the version of the compiler we want to use - """ - # Mixed toolchains are not supported yet - if isinstance(compiler, spack.compiler.Compiler): - if spack.compilers.is_mixed_toolchain(compiler): - msg = ( - "microarchitecture specific optimizations are not " - "supported yet on mixed compiler toolchains [check" - " {0.name}@{0.version} for further details]" - ) - tty.debug(msg.format(compiler)) - return "" - - # Try to check if the current compiler comes with a version number or - # has an unexpected suffix. If so, treat it as a compiler with a - # custom spec. - compiler_version = compiler.version - version_number, suffix = archspec.cpu.version_components(compiler.version) - if not version_number or suffix: - # Try to deduce the underlying version of the compiler, regardless - # of its name in compilers.yaml. Depending on where this function - # is called we might get either a CompilerSpec or a fully fledged - # compiler object. - if isinstance(compiler, spack.spec.CompilerSpec): - compiler = spack.compilers.compilers_for_spec(compiler).pop() - try: - compiler_version = compiler.real_version - except spack.util.executable.ProcessError as e: - # log this and just return compiler.version instead - tty.debug(str(e)) - - return self.microarchitecture.optimization_flags( - compiler.name, compiler_version.dotted_numeric_string - ) diff --git a/lib/spack/spack/test/architecture.py b/lib/spack/spack/test/architecture.py index 24040ee0c4a892..a029aa4790f91e 100644 --- a/lib/spack/spack/test/architecture.py +++ b/lib/spack/spack/test/architecture.py @@ -8,11 +8,9 @@ import archspec.cpu -import spack.compilers import spack.concretize import spack.operating_systems import spack.platforms -import spack.target from spack.spec import ArchSpec, Spec @@ -83,25 +81,6 @@ def test_operating_system_conversion_to_dict(): assert operating_system.to_dict() == {"name": "os", "version": "1.0"} -@pytest.mark.parametrize( - "cpu_flag,target_name", - [ - # Test that specific flags can be used in queries - ("ssse3", "haswell"), - ("popcnt", "nehalem"), - ("avx512f", "skylake_avx512"), - ("avx512ifma", "icelake"), - # Test that proxy flags can be used in queries too - ("sse3", "nehalem"), - ("avx512", "skylake_avx512"), - ("avx512", "icelake"), - ], -) -def test_target_container_semantic(cpu_flag, target_name): - target = spack.target.Target(target_name) - assert cpu_flag in target - - @pytest.mark.parametrize( "item,architecture_str", [ @@ -118,67 +97,6 @@ def test_arch_spec_container_semantic(item, architecture_str): assert item in architecture -@pytest.mark.parametrize( - "compiler_spec,target_name,expected_flags", - [ - # Homogeneous compilers - ("gcc@4.7.2", "ivybridge", "-march=core-avx-i -mtune=core-avx-i"), - ("clang@3.5", "x86_64", "-march=x86-64 -mtune=generic"), - ("apple-clang@9.1.0", "x86_64", "-march=x86-64"), - # Mixed toolchain - ("clang@8.0.0", "broadwell", ""), - ], -) -@pytest.mark.filterwarnings("ignore:microarchitecture specific") -def test_optimization_flags(compiler_spec, target_name, expected_flags, compiler_factory): - target = spack.target.Target(target_name) - compiler_dict = compiler_factory(spec=compiler_spec, operating_system="")["compiler"] - if compiler_spec == "clang@8.0.0": - compiler_dict["paths"] = { - "cc": "/path/to/clang-8", - "cxx": "/path/to/clang++-8", - "f77": "/path/to/gfortran-9", - "fc": "/path/to/gfortran-9", - } - compiler = spack.compilers.compiler_from_dict(compiler_dict) - - opt_flags = target.optimization_flags(compiler) - assert opt_flags == expected_flags - - -@pytest.mark.parametrize( - "compiler_str,real_version,target_str,expected_flags", - [ - ("gcc@=9.2.0", None, "haswell", "-march=haswell -mtune=haswell"), - # Check that custom string versions are accepted - ("gcc@=10foo", "9.2.0", "icelake", "-march=icelake-client -mtune=icelake-client"), - # Check that we run version detection (4.4.0 doesn't support icelake) - ("gcc@=4.4.0-special", "9.2.0", "icelake", "-march=icelake-client -mtune=icelake-client"), - # Check that the special case for Apple's clang is treated correctly - # i.e. it won't try to detect the version again - ("apple-clang@=9.1.0", None, "x86_64", "-march=x86-64"), - ], -) -def test_optimization_flags_with_custom_versions( - compiler_str, - real_version, - target_str, - expected_flags, - monkeypatch, - mutable_config, - compiler_factory, -): - target = spack.target.Target(target_str) - compiler_dict = compiler_factory(spec=compiler_str, operating_system="redhat6") - mutable_config.set("compilers", [compiler_dict]) - if real_version: - monkeypatch.setattr(spack.compiler.Compiler, "get_real_version", lambda x: real_version) - compiler = spack.compilers.compiler_from_dict(compiler_dict["compiler"]) - - opt_flags = target.optimization_flags(compiler) - assert opt_flags == expected_flags - - @pytest.mark.regression("15306") @pytest.mark.parametrize( "architecture_tuple,constraint_tuple", diff --git a/lib/spack/spack/test/audit.py b/lib/spack/spack/test/audit.py index 0d2ca594f1701f..18994fa88be6f3 100644 --- a/lib/spack/spack/test/audit.py +++ b/lib/spack/spack/test/audit.py @@ -27,8 +27,15 @@ (["invalid-gitlab-patch-url"], ["PKG-DIRECTIVES", "PKG-PROPERTIES"]), # This package has invalid GitLab patch URLs (["invalid-selfhosted-gitlab-patch-url"], ["PKG-DIRECTIVES", "PKG-PROPERTIES"]), - # This package has a stand-alone 'test*' method in build-time callbacks - (["fail-test-audit"], ["PKG-DIRECTIVES", "PKG-PROPERTIES"]), + # This package has a stand-alone test method in build-time callbacks + (["fail-test-audit"], ["PKG-PROPERTIES"]), + # This package implements and uses several deprecated stand-alone + # test methods + (["fail-test-audit-deprecated"], ["PKG-DEPRECATED-ATTRIBUTES"]), + # This package has stand-alone test methods without non-trivial docstrings + (["fail-test-audit-docstring"], ["PKG-PROPERTIES"]), + # This package has a stand-alone test method without an implementation + (["fail-test-audit-impl"], ["PKG-PROPERTIES"]), # This package has no issues (["mpileaks"], None), # This package has a conflict with a trigger which cannot constrain the constraint @@ -41,7 +48,7 @@ def test_package_audits(packages, expected_errors, mock_packages): # Check that errors were reported only for the expected failure actual_errors = [check for check, errors in reports if errors] - msg = [str(e) for _, errors in reports for e in errors] + msg = "\n".join([str(e) for _, errors in reports for e in errors]) if expected_errors: assert expected_errors == actual_errors, msg else: diff --git a/lib/spack/spack/test/bindist.py b/lib/spack/spack/test/bindist.py index 941bc3d197d733..b41307121506ac 100644 --- a/lib/spack/spack/test/bindist.py +++ b/lib/spack/spack/test/bindist.py @@ -27,12 +27,15 @@ import spack.binary_distribution as bindist import spack.caches +import spack.compilers import spack.config import spack.fetch_strategy import spack.hooks.sbang as sbang import spack.main import spack.mirror -import spack.repo +import spack.paths +import spack.spec +import spack.stage import spack.store import spack.util.gpg import spack.util.spack_yaml as syaml @@ -65,22 +68,6 @@ def cache_directory(tmpdir): spack.config.caches = old_cache_path -@pytest.fixture(scope="module") -def mirror_dir(tmpdir_factory): - dir = tmpdir_factory.mktemp("mirror") - dir.ensure("build_cache", dir=True) - yield str(dir) - dir.join("build_cache").remove() - - -@pytest.fixture(scope="function") -def test_mirror(mirror_dir): - mirror_url = url_util.path_to_file_url(mirror_dir) - mirror_cmd("add", "--scope", "site", "test-mirror-func", mirror_url) - yield mirror_dir - mirror_cmd("rm", "--scope=site", "test-mirror-func") - - @pytest.fixture(scope="module") def config_directory(tmp_path_factory): # Copy defaults to a temporary "site" scope @@ -219,9 +206,9 @@ def dummy_prefix(tmpdir): @pytest.mark.requires_executables(*args) @pytest.mark.maybeslow @pytest.mark.usefixtures( - "default_config", "cache_directory", "install_dir_default_layout", "test_mirror" + "default_config", "cache_directory", "install_dir_default_layout", "temporary_mirror" ) -def test_default_rpaths_create_install_default_layout(mirror_dir): +def test_default_rpaths_create_install_default_layout(temporary_mirror_dir): """ Test the creation and installation of buildcaches with default rpaths into the default directory layout scheme. @@ -234,13 +221,12 @@ def test_default_rpaths_create_install_default_layout(mirror_dir): install_cmd("--no-cache", sy_spec.name) # Create a buildache - buildcache_cmd("push", "-u", mirror_dir, cspec.name, sy_spec.name) - + buildcache_cmd("push", "-u", temporary_mirror_dir, cspec.name, sy_spec.name) # Test force overwrite create buildcache (-f option) - buildcache_cmd("push", "-uf", mirror_dir, cspec.name) + buildcache_cmd("push", "-uf", temporary_mirror_dir, cspec.name) # Create mirror index - buildcache_cmd("update-index", mirror_dir) + buildcache_cmd("update-index", temporary_mirror_dir) # List the buildcaches in the mirror buildcache_cmd("list", "-alv") @@ -268,9 +254,9 @@ def test_default_rpaths_create_install_default_layout(mirror_dir): @pytest.mark.maybeslow @pytest.mark.nomockstage @pytest.mark.usefixtures( - "default_config", "cache_directory", "install_dir_non_default_layout", "test_mirror" + "default_config", "cache_directory", "install_dir_non_default_layout", "temporary_mirror" ) -def test_default_rpaths_install_nondefault_layout(mirror_dir): +def test_default_rpaths_install_nondefault_layout(temporary_mirror_dir): """ Test the creation and installation of buildcaches with default rpaths into the non-default directory layout scheme. @@ -291,9 +277,9 @@ def test_default_rpaths_install_nondefault_layout(mirror_dir): @pytest.mark.maybeslow @pytest.mark.nomockstage @pytest.mark.usefixtures( - "default_config", "cache_directory", "install_dir_default_layout", "test_mirror" + "default_config", "cache_directory", "install_dir_default_layout", "temporary_mirror" ) -def test_relative_rpaths_install_default_layout(mirror_dir): +def test_relative_rpaths_install_default_layout(temporary_mirror_dir): """ Test the creation and installation of buildcaches with relative rpaths into the default directory layout scheme. @@ -320,9 +306,9 @@ def test_relative_rpaths_install_default_layout(mirror_dir): @pytest.mark.maybeslow @pytest.mark.nomockstage @pytest.mark.usefixtures( - "default_config", "cache_directory", "install_dir_non_default_layout", "test_mirror" + "default_config", "cache_directory", "install_dir_non_default_layout", "temporary_mirror" ) -def test_relative_rpaths_install_nondefault(mirror_dir): +def test_relative_rpaths_install_nondefault(temporary_mirror_dir): """ Test the installation of buildcaches with relativized rpaths into the non-default directory layout scheme. @@ -371,9 +357,9 @@ def test_push_and_fetch_keys(mock_gnupghome, tmp_path): @pytest.mark.maybeslow @pytest.mark.nomockstage @pytest.mark.usefixtures( - "default_config", "cache_directory", "install_dir_non_default_layout", "test_mirror" + "default_config", "cache_directory", "install_dir_non_default_layout", "temporary_mirror" ) -def test_built_spec_cache(mirror_dir): +def test_built_spec_cache(temporary_mirror_dir): """Because the buildcache list command fetches the buildcache index and uses it to populate the binary_distribution built spec cache, when this test calls get_mirrors_for_spec, it is testing the popluation of @@ -394,7 +380,7 @@ def fake_dag_hash(spec, length=None): return "tal4c7h4z0gqmixb1eqa92mjoybxn5l6"[:length] -@pytest.mark.usefixtures("install_mockery", "mock_packages", "mock_fetch", "test_mirror") +@pytest.mark.usefixtures("install_mockery", "mock_packages", "mock_fetch", "temporary_mirror") def test_spec_needs_rebuild(monkeypatch, tmpdir): """Make sure needs_rebuild properly compares remote hash against locally computed one, avoiding unnecessary rebuilds""" @@ -515,7 +501,7 @@ def mock_list_url(url, recursive=False): @pytest.mark.usefixtures("mock_fetch", "install_mockery") -def test_update_sbang(tmpdir, test_mirror): +def test_update_sbang(tmpdir, temporary_mirror): """Test the creation and installation of buildcaches with default rpaths into the non-default directory layout scheme, triggering an update of the sbang. @@ -526,7 +512,7 @@ def test_update_sbang(tmpdir, test_mirror): old_spec_hash_str = "/{0}".format(old_spec.dag_hash()) # Need a fake mirror with *function* scope. - mirror_dir = test_mirror + mirror_dir = temporary_mirror # Assume all commands will concretize old_spec the same way. install_cmd("--no-cache", old_spec.name) @@ -673,11 +659,13 @@ def test_build_manifest_visitor(tmpdir): assert all(os.path.islink(f) for f in visitor.symlinks) -def test_text_relocate_if_needed(install_mockery, mock_fetch, monkeypatch, capfd): - spec = Spec("needs-text-relocation").concretized() - install_cmd(str(spec)) +def test_text_relocate_if_needed(install_mockery, temporary_store, mock_fetch, monkeypatch, capfd): + install_cmd("needs-text-relocation") + + specs = temporary_store.db.query("needs-text-relocation") + assert len(specs) == 1 + manifest = get_buildfile_manifest(specs[0]) - manifest = get_buildfile_manifest(spec) assert join_path("bin", "exe") in manifest["text_to_relocate"] assert join_path("bin", "otherexe") not in manifest["text_to_relocate"] assert join_path("bin", "secretexe") not in manifest["text_to_relocate"] diff --git a/lib/spack/spack/test/bootstrap.py b/lib/spack/spack/test/bootstrap.py index f0d11d41247e4b..603fe90fadafdf 100644 --- a/lib/spack/spack/test/bootstrap.py +++ b/lib/spack/spack/test/bootstrap.py @@ -9,6 +9,7 @@ import spack.bootstrap.config import spack.bootstrap.core import spack.compilers +import spack.config import spack.environment import spack.store import spack.util.path diff --git a/lib/spack/spack/test/build_distribution.py b/lib/spack/spack/test/build_distribution.py index cdfd961e3a293e..5edcbe5673d3a7 100644 --- a/lib/spack/spack/test/build_distribution.py +++ b/lib/spack/spack/test/build_distribution.py @@ -9,17 +9,16 @@ import pytest import spack.binary_distribution as bd -import spack.main import spack.mirror import spack.spec -import spack.util.url +from spack.installer import PackageInstaller pytestmark = pytest.mark.not_on_windows("does not run on windows") def test_build_tarball_overwrite(install_mockery, mock_fetch, monkeypatch, tmp_path): spec = spack.spec.Spec("trivial-install-test-package").concretized() - spec.package.do_install(fake=True) + PackageInstaller([spec.package], fake=True).install() specs = [spec] diff --git a/lib/spack/spack/test/build_environment.py b/lib/spack/spack/test/build_environment.py index 3ae41acc9cecee..f435a893a14ac9 100644 --- a/lib/spack/spack/test/build_environment.py +++ b/lib/spack/spack/test/build_environment.py @@ -9,6 +9,8 @@ import pytest +import archspec.cpu + from llnl.path import Path, convert_to_platform_path from llnl.util.filesystem import HeaderList, LibraryList @@ -16,12 +18,13 @@ import spack.config import spack.deptypes as dt import spack.package_base +import spack.paths import spack.spec import spack.util.spack_yaml as syaml from spack.build_environment import UseMode, _static_to_shared_library, dso_suffix from spack.context import Context +from spack.installer import PackageInstaller from spack.paths import build_env_path -from spack.util.cpus import determine_number_of_jobs from spack.util.environment import EnvironmentModifications from spack.util.executable import Executable @@ -181,7 +184,7 @@ def test_setup_dependent_package_inherited_modules( ): # This will raise on regression s = spack.spec.Spec("cmake-client-inheritor").concretized() - s.package.do_install() + PackageInstaller([s.package]).install() @pytest.mark.parametrize( @@ -482,7 +485,7 @@ def test_parallel_false_is_not_propagating(default_mock_concretization): assert s["pkg-a"].package.module.make_jobs == 1 spack.build_environment.set_package_py_globals(s["pkg-b"].package, context=Context.BUILD) - assert s["pkg-b"].package.module.make_jobs == spack.build_environment.determine_number_of_jobs( + assert s["pkg-b"].package.module.make_jobs == spack.config.determine_number_of_jobs( parallel=s["pkg-b"].package.parallel ) @@ -515,7 +518,7 @@ def test_setting_dtags_based_on_config(config_setting, expected_flag, config, mo def test_build_jobs_sequential_is_sequential(): assert ( - determine_number_of_jobs( + spack.config.determine_number_of_jobs( parallel=False, max_cpus=8, config=spack.config.Configuration( @@ -529,7 +532,7 @@ def test_build_jobs_sequential_is_sequential(): def test_build_jobs_command_line_overrides(): assert ( - determine_number_of_jobs( + spack.config.determine_number_of_jobs( parallel=True, max_cpus=1, config=spack.config.Configuration( @@ -540,7 +543,7 @@ def test_build_jobs_command_line_overrides(): == 10 ) assert ( - determine_number_of_jobs( + spack.config.determine_number_of_jobs( parallel=True, max_cpus=100, config=spack.config.Configuration( @@ -554,7 +557,7 @@ def test_build_jobs_command_line_overrides(): def test_build_jobs_defaults(): assert ( - determine_number_of_jobs( + spack.config.determine_number_of_jobs( parallel=True, max_cpus=10, config=spack.config.Configuration( @@ -564,7 +567,7 @@ def test_build_jobs_defaults(): == 1 ) assert ( - determine_number_of_jobs( + spack.config.determine_number_of_jobs( parallel=True, max_cpus=10, config=spack.config.Configuration( @@ -736,3 +739,64 @@ def test_rpath_with_duplicate_link_deps(): assert child in rpath_deps assert runtime_2 in rpath_deps assert runtime_1 not in rpath_deps + + +@pytest.mark.parametrize( + "compiler_spec,target_name,expected_flags", + [ + # Homogeneous compilers + ("gcc@4.7.2", "ivybridge", "-march=core-avx-i -mtune=core-avx-i"), + ("clang@3.5", "x86_64", "-march=x86-64 -mtune=generic"), + ("apple-clang@9.1.0", "x86_64", "-march=x86-64"), + # Mixed toolchain + ("clang@8.0.0", "broadwell", ""), + ], +) +@pytest.mark.filterwarnings("ignore:microarchitecture specific") +@pytest.mark.not_on_windows("Windows doesn't support the compiler wrapper") +def test_optimization_flags(compiler_spec, target_name, expected_flags, compiler_factory): + target = archspec.cpu.TARGETS[target_name] + compiler_dict = compiler_factory(spec=compiler_spec, operating_system="")["compiler"] + if compiler_spec == "clang@8.0.0": + compiler_dict["paths"] = { + "cc": "/path/to/clang-8", + "cxx": "/path/to/clang++-8", + "f77": "/path/to/gfortran-9", + "fc": "/path/to/gfortran-9", + } + compiler = spack.compilers.compiler_from_dict(compiler_dict) + opt_flags = spack.build_environment.optimization_flags(compiler, target) + assert opt_flags == expected_flags + + +@pytest.mark.parametrize( + "compiler_str,real_version,target_str,expected_flags", + [ + ("gcc@=9.2.0", None, "haswell", "-march=haswell -mtune=haswell"), + # Check that custom string versions are accepted + ("gcc@=10foo", "9.2.0", "icelake", "-march=icelake-client -mtune=icelake-client"), + # Check that we run version detection (4.4.0 doesn't support icelake) + ("gcc@=4.4.0-special", "9.2.0", "icelake", "-march=icelake-client -mtune=icelake-client"), + # Check that the special case for Apple's clang is treated correctly + # i.e. it won't try to detect the version again + ("apple-clang@=9.1.0", None, "x86_64", "-march=x86-64"), + ], +) +def test_optimization_flags_with_custom_versions( + compiler_str, + real_version, + target_str, + expected_flags, + monkeypatch, + mutable_config, + compiler_factory, +): + target = archspec.cpu.TARGETS[target_str] + compiler_dict = compiler_factory(spec=compiler_str, operating_system="redhat6") + mutable_config.set("compilers", [compiler_dict]) + if real_version: + monkeypatch.setattr(spack.compiler.Compiler, "get_real_version", lambda x: real_version) + compiler = spack.compilers.compiler_from_dict(compiler_dict["compiler"]) + + opt_flags = spack.build_environment.optimization_flags(compiler, target) + assert opt_flags == expected_flags diff --git a/lib/spack/spack/test/build_systems.py b/lib/spack/spack/test/build_systems.py index 57516b445c18d0..212ec412d3eec9 100644 --- a/lib/spack/spack/test/build_systems.py +++ b/lib/spack/spack/test/build_systems.py @@ -16,9 +16,12 @@ import spack.build_systems.autotools import spack.build_systems.cmake import spack.environment +import spack.error +import spack.paths import spack.platforms -import spack.repo +import spack.platforms.test from spack.build_environment import ChildError, setup_package +from spack.installer import PackageInstaller from spack.spec import Spec from spack.util.executable import which @@ -142,7 +145,7 @@ def test_none_is_allowed(self, default_mock_concretization): def test_libtool_archive_files_are_deleted_by_default(self, mutable_database): # Install a package that creates a mock libtool archive s = Spec("libtool-deletion").concretized() - s.package.do_install(explicit=True) + PackageInstaller([s.package], explicit=True).install() # Assert the libtool archive is not there and we have # a log of removed files @@ -158,7 +161,7 @@ def test_libtool_archive_files_might_be_installed_on_demand( # patch its package to preserve the installation s = Spec("libtool-deletion").concretized() monkeypatch.setattr(type(s.package.builder), "install_libtool_archives", True) - s.package.do_install(explicit=True) + PackageInstaller([s.package], explicit=True).install() # Assert libtool archives are installed assert os.path.exists(s.package.builder.libtool_archive_file) @@ -169,7 +172,7 @@ def test_autotools_gnuconfig_replacement(self, mutable_database): files from working alternatives from the gnuconfig package. """ s = Spec("autotools-config-replacement +patch_config_files +gnuconfig").concretized() - s.package.do_install() + PackageInstaller([s.package]).install() with open(os.path.join(s.prefix.broken, "config.sub")) as f: assert "gnuconfig version of config.sub" in f.read() @@ -188,7 +191,7 @@ def test_autotools_gnuconfig_replacement_disabled(self, mutable_database): Tests whether disabling patch_config_files """ s = Spec("autotools-config-replacement ~patch_config_files +gnuconfig").concretized() - s.package.do_install() + PackageInstaller([s.package]).install() with open(os.path.join(s.prefix.broken, "config.sub")) as f: assert "gnuconfig version of config.sub" not in f.read() @@ -217,7 +220,7 @@ def test_autotools_gnuconfig_replacement_no_gnuconfig(self, mutable_database, mo msg = "Cannot patch config files: missing dependencies: gnuconfig" with pytest.raises(ChildError, match=msg): - s.package.do_install() + PackageInstaller([s.package]).install() @pytest.mark.disable_clean_stage_check def test_broken_external_gnuconfig(self, mutable_database, tmpdir): @@ -266,7 +269,7 @@ def test_cmake_std_args(self, default_mock_concretization): def test_cmake_bad_generator(self, default_mock_concretization): s = default_mock_concretization("cmake-client") - with pytest.raises(spack.package_base.InstallError): + with pytest.raises(spack.error.InstallError): spack.build_systems.cmake.CMakeBuilder.std_args( s.package, generator="Yellow Sticky Notes" ) diff --git a/lib/spack/spack/test/builder.py b/lib/spack/spack/test/builder.py index 4bd128c3bfb31b..ab611dbaec68c5 100644 --- a/lib/spack/spack/test/builder.py +++ b/lib/spack/spack/test/builder.py @@ -8,7 +8,10 @@ from llnl.util.filesystem import touch +import spack.builder import spack.paths +import spack.repo +import spack.spec @pytest.fixture() diff --git a/lib/spack/spack/test/buildtask.py b/lib/spack/spack/test/buildtask.py index 569bfc56d888d1..3e90c9ad7e3984 100644 --- a/lib/spack/spack/test/buildtask.py +++ b/lib/spack/spack/test/buildtask.py @@ -5,28 +5,46 @@ import pytest +import spack.error import spack.installer as inst import spack.repo import spack.spec def test_build_task_errors(install_mockery): - with pytest.raises(ValueError, match="must be a package"): - inst.BuildTask("abc", None, False, 0, 0, 0, set()) - + """Check expected errors when instantiating a BuildTask.""" spec = spack.spec.Spec("trivial-install-test-package") pkg_cls = spack.repo.PATH.get_pkg_class(spec.name) + + # The value of the request argument is expected to not be checked. + for pkg in [None, "abc"]: + with pytest.raises(TypeError, match="must be a package"): + inst.BuildTask(pkg, None) + with pytest.raises(ValueError, match="must have a concrete spec"): - inst.BuildTask(pkg_cls(spec), None, False, 0, 0, 0, set()) + inst.BuildTask(pkg_cls(spec), None) + # Using a concretized package now means the request argument is checked. spec.concretize() assert spec.concrete - with pytest.raises(ValueError, match="must have a build request"): - inst.BuildTask(spec.package, None, False, 0, 0, 0, set()) + with pytest.raises(TypeError, match="is not a valid build request"): + inst.BuildTask(spec.package, None) + + # Using a valid package and spec, the next check is the status argument. request = inst.BuildRequest(spec.package, {}) - with pytest.raises(inst.InstallError, match="Cannot create a build task"): - inst.BuildTask(spec.package, request, False, 0, 0, inst.STATUS_REMOVED, set()) + + with pytest.raises(TypeError, match="is not a valid build status"): + inst.BuildTask(spec.package, request, status="queued") + + # Now we can check that build tasks cannot be create when the status + # indicates the task is/should've been removed. + with pytest.raises(spack.error.InstallError, match="Cannot create a task"): + inst.BuildTask(spec.package, request, status=inst.BuildStatus.REMOVED) + + # Also make sure to not accept an incompatible installed argument value. + with pytest.raises(TypeError, match="'installed' be a 'set', not 'str'"): + inst.BuildTask(spec.package, request, installed="mpileaks") def test_build_task_basics(install_mockery): @@ -36,7 +54,7 @@ def test_build_task_basics(install_mockery): # Ensure key properties match expectations request = inst.BuildRequest(spec.package, {}) - task = inst.BuildTask(spec.package, request, False, 0, 0, inst.STATUS_ADDED, set()) + task = inst.BuildTask(spec.package, request=request, status=inst.BuildStatus.QUEUED) assert not task.explicit assert task.priority == len(task.uninstalled_deps) assert task.key == (task.priority, task.sequence) @@ -58,16 +76,16 @@ def test_build_task_strings(install_mockery): # Ensure key properties match expectations request = inst.BuildRequest(spec.package, {}) - task = inst.BuildTask(spec.package, request, False, 0, 0, inst.STATUS_ADDED, set()) + task = inst.BuildTask(spec.package, request=request, status=inst.BuildStatus.QUEUED) # Cover __repr__ irep = task.__repr__() assert irep.startswith(task.__class__.__name__) - assert "status='queued'" in irep # == STATUS_ADDED + assert "BuildStatus.QUEUED" in irep assert "sequence=" in irep # Cover __str__ istr = str(task) - assert "status=queued" in istr # == STATUS_ADDED + assert "status=queued" in istr # == BuildStatus.QUEUED assert "#dependencies=1" in istr assert "priority=" in istr diff --git a/lib/spack/spack/test/cc.py b/lib/spack/spack/test/cc.py index 27d05fb7861430..4a394680f480b8 100644 --- a/lib/spack/spack/test/cc.py +++ b/lib/spack/spack/test/cc.py @@ -13,7 +13,6 @@ import spack.build_environment import spack.config -import spack.spec from spack.paths import build_env_path from spack.util.environment import SYSTEM_DIR_CASE_ENTRY, set_env from spack.util.executable import Executable, ProcessError diff --git a/lib/spack/spack/test/ci.py b/lib/spack/spack/test/ci.py index 9eb0d45d2d1b8c..0c9a10814a20c8 100644 --- a/lib/spack/spack/test/ci.py +++ b/lib/spack/spack/test/ci.py @@ -10,12 +10,11 @@ import llnl.util.filesystem as fs import spack.ci as ci -import spack.config import spack.environment as ev import spack.error import spack.paths as spack_paths +import spack.spec import spack.util.git -import spack.util.gpg @pytest.fixture diff --git a/lib/spack/spack/test/cmd/blame.py b/lib/spack/spack/test/cmd/blame.py index dcc26c91539d06..2514750b881df9 100644 --- a/lib/spack/spack/test/cmd/blame.py +++ b/lib/spack/spack/test/cmd/blame.py @@ -9,7 +9,6 @@ from llnl.util.filesystem import working_dir -import spack.cmd import spack.paths import spack.util.spack_json as sjson from spack.main import SpackCommand diff --git a/lib/spack/spack/test/cmd/bootstrap.py b/lib/spack/spack/test/cmd/bootstrap.py index 7797aec31c7850..888f823c55b4fa 100644 --- a/lib/spack/spack/test/cmd/bootstrap.py +++ b/lib/spack/spack/test/cmd/bootstrap.py @@ -15,6 +15,7 @@ import spack.environment as ev import spack.main import spack.mirror +import spack.spec _bootstrap = spack.main.SpackCommand("bootstrap") diff --git a/lib/spack/spack/test/cmd/buildcache.py b/lib/spack/spack/test/cmd/buildcache.py index de0e40c05af430..840dd61f1aba86 100644 --- a/lib/spack/spack/test/cmd/buildcache.py +++ b/lib/spack/spack/test/cmd/buildcache.py @@ -13,13 +13,13 @@ import spack.binary_distribution import spack.cmd.buildcache -import spack.deptypes import spack.environment as ev import spack.error import spack.main import spack.mirror import spack.spec import spack.util.url +from spack.installer import PackageInstaller from spack.spec import Spec buildcache = spack.main.SpackCommand("buildcache") @@ -179,7 +179,7 @@ def test_buildcache_autopush(tmp_path, install_mockery, mock_fetch): s = Spec("libdwarf").concretized() # Install and generate build cache index - s.package.do_install() + PackageInstaller([s.package], explicit=True).install() metadata_file = spack.binary_distribution.tarball_name(s, ".spec.json") @@ -380,7 +380,7 @@ def test_correct_specs_are_pushed( things_to_install, expected, tmpdir, monkeypatch, default_mock_concretization, temporary_store ): spec = default_mock_concretization("dttop") - spec.package.do_install(fake=True) + PackageInstaller([spec.package], explicit=True, fake=True).install() slash_hash = f"/{spec.dag_hash()}" class DontUpload(spack.binary_distribution.Uploader): @@ -439,13 +439,13 @@ def test_push_and_install_with_mirror_marked_unsigned_does_not_require_extra_fla # Install if signed: # Need to pass "--no-check-signature" to avoid install errors - kwargs = {"cache_only": True, "unsigned": True} + kwargs = {"explicit": True, "cache_only": True, "unsigned": True} else: # No need to pass "--no-check-signature" if the mirror is unsigned - kwargs = {"cache_only": True} + kwargs = {"explicit": True, "cache_only": True} spec.package.do_uninstall(force=True) - spec.package.do_install(**kwargs) + PackageInstaller([spec.package], **kwargs).install() def test_skip_no_redistribute(mock_packages, config): @@ -490,7 +490,7 @@ def test_push_without_build_deps(tmp_path, temporary_store, mock_packages, mutab mirror("add", "--unsigned", "my-mirror", str(tmp_path)) s = spack.spec.Spec("dtrun3").concretized() - s.package.do_install(fake=True) + PackageInstaller([s.package], explicit=True, fake=True).install() s["dtbuild3"].package.do_uninstall() # fails when build deps are required diff --git a/lib/spack/spack/test/cmd/checksum.py b/lib/spack/spack/test/cmd/checksum.py index ad63c40ff8ec44..6c20caff887853 100644 --- a/lib/spack/spack/test/cmd/checksum.py +++ b/lib/spack/spack/test/cmd/checksum.py @@ -8,8 +8,8 @@ import pytest import spack.cmd.checksum +import spack.error import spack.package_base -import spack.parser import spack.repo import spack.spec import spack.stage @@ -304,7 +304,7 @@ def test_checksum_deprecated_version(mock_packages, can_fetch_versions): def test_checksum_url(mock_packages, config): pkg_cls = spack.repo.PATH.get_pkg_class("zlib") - with pytest.raises(spack.parser.SpecSyntaxError): + with pytest.raises(spack.error.SpecSyntaxError): spack_checksum(f"{pkg_cls.url}") diff --git a/lib/spack/spack/test/cmd/ci.py b/lib/spack/spack/test/cmd/ci.py index 0eaabfd5a718ed..40a5285cd15e57 100644 --- a/lib/spack/spack/test/cmd/ci.py +++ b/lib/spack/spack/test/cmd/ci.py @@ -18,13 +18,11 @@ import spack.binary_distribution import spack.ci as ci import spack.cmd.ci -import spack.config import spack.environment as ev import spack.hash_types as ht import spack.main import spack.paths as spack_paths import spack.repo as repo -import spack.util.gpg import spack.util.spack_yaml as syaml from spack.cmd.ci import FAILED_CREATE_BUILDCACHE_CODE from spack.schema.buildcache_spec import schema as specfile_schema @@ -305,8 +303,8 @@ def test_ci_generate_with_custom_settings( ci_generate_test, tmp_path, mock_binary_index, monkeypatch ): """Test use of user-provided scripts and attributes""" - monkeypatch.setattr(spack.main, "get_version", lambda: "0.15.3") - monkeypatch.setattr(spack.main, "get_spack_commit", lambda: "big ol commit sha") + monkeypatch.setattr(spack, "get_version", lambda: "0.15.3") + monkeypatch.setattr(spack, "get_spack_commit", lambda: "big ol commit sha") spack_yaml, outputfile, _ = ci_generate_test( f"""\ spack: @@ -935,15 +933,16 @@ def test_push_to_build_cache( """ ) env_cmd("create", "test", "./spack.yaml") - with ev.read("test"): - concrete_spec = Spec("patchelf").concretized() + with ev.read("test") as current_env: + current_env.concretize() + install_cmd("--keep-stage") + + concrete_spec = list(current_env.roots())[0] spec_json = concrete_spec.to_json(hash=ht.dag_hash) json_path = str(tmp_path / "spec.json") with open(json_path, "w") as ypfd: ypfd.write(spec_json) - install_cmd("--add", "--keep-stage", json_path) - for s in concrete_spec.traverse(): ci.push_to_build_cache(s, mirror_url, True) @@ -1040,8 +1039,8 @@ def test_ci_generate_override_runner_attrs( inherit them from the top level, as well as when we override one or more at the runner level""" monkeypatch.setattr(spack, "spack_version", "0.20.0.test0") - monkeypatch.setattr(spack.main, "get_version", lambda: "0.20.0.test0 (blah)") - monkeypatch.setattr(spack.main, "get_spack_commit", lambda: git_version) + monkeypatch.setattr(spack, "get_version", lambda: "0.20.0.test0 (blah)") + monkeypatch.setattr(spack, "get_spack_commit", lambda: git_version) spack_yaml, outputfile, _ = ci_generate_test( f"""\ spack: diff --git a/lib/spack/spack/test/cmd/clean.py b/lib/spack/spack/test/cmd/clean.py index 4c3586833398ce..8b671e495ee008 100644 --- a/lib/spack/spack/test/cmd/clean.py +++ b/lib/spack/spack/test/cmd/clean.py @@ -14,6 +14,7 @@ import spack.environment as ev import spack.main import spack.package_base +import spack.spec import spack.stage import spack.store diff --git a/lib/spack/spack/test/cmd/commands.py b/lib/spack/spack/test/cmd/commands.py index b7cc59e1153edf..c0c781cb899324 100644 --- a/lib/spack/spack/test/cmd/commands.py +++ b/lib/spack/spack/test/cmd/commands.py @@ -10,6 +10,7 @@ import pytest import spack.cmd +import spack.cmd.commands import spack.main import spack.paths from spack.cmd.commands import _dest_to_fish_complete, _positional_to_subroutine diff --git a/lib/spack/spack/test/cmd/compiler.py b/lib/spack/spack/test/cmd/compiler.py index 2638aa79264335..431cdfd78786ad 100644 --- a/lib/spack/spack/test/cmd/compiler.py +++ b/lib/spack/spack/test/cmd/compiler.py @@ -10,6 +10,7 @@ import spack.cmd.compiler import spack.compilers +import spack.config import spack.main import spack.spec import spack.util.pattern diff --git a/lib/spack/spack/test/cmd/create.py b/lib/spack/spack/test/cmd/create.py index bc3854e9f55453..03dc5ec0e646fa 100644 --- a/lib/spack/spack/test/cmd/create.py +++ b/lib/spack/spack/test/cmd/create.py @@ -9,7 +9,7 @@ import pytest import spack.cmd.create -import spack.util.editor +import spack.url from spack.main import SpackCommand from spack.url import UndetectableNameError from spack.util.executable import which diff --git a/lib/spack/spack/test/cmd/debug.py b/lib/spack/spack/test/cmd/debug.py index 55d0928fbde53b..49f739b5435dfb 100644 --- a/lib/spack/spack/test/cmd/debug.py +++ b/lib/spack/spack/test/cmd/debug.py @@ -9,9 +9,10 @@ import pytest -import spack.config +import spack import spack.platforms -from spack.main import SpackCommand, get_version +import spack.spec +from spack.main import SpackCommand from spack.util.executable import which debug = SpackCommand("debug") @@ -55,6 +56,6 @@ def test_report(): host_target = host_platform.target("frontend") architecture = spack.spec.ArchSpec((str(host_platform), str(host_os), str(host_target))) - assert get_version() in out + assert spack.get_version() in out assert platform.python_version() in out assert str(architecture) in out diff --git a/lib/spack/spack/test/cmd/deprecate.py b/lib/spack/spack/test/cmd/deprecate.py index 8306bea023e6a9..3bb84fce7d8ef3 100644 --- a/lib/spack/spack/test/cmd/deprecate.py +++ b/lib/spack/spack/test/cmd/deprecate.py @@ -5,6 +5,7 @@ import pytest +import spack.spec import spack.store from spack.database import InstallStatuses from spack.main import SpackCommand @@ -163,3 +164,30 @@ def test_concretize_deprecated(mock_packages, mock_archive, mock_fetch, install_ spec = spack.spec.Spec("libelf@0.8.10") with pytest.raises(spack.spec.SpecDeprecatedError): spec.concretize() + + +@pytest.mark.usefixtures("mock_packages", "mock_archive", "mock_fetch", "install_mockery") +@pytest.mark.regression("46915") +def test_deprecate_spec_with_external_dependency(mutable_config, temporary_store, tmp_path): + """Tests that we can deprecate a spec that has an external dependency""" + packages_yaml = { + "libelf": { + "buildable": False, + "externals": [{"spec": "libelf@0.8.13", "prefix": str(tmp_path / "libelf")}], + } + } + mutable_config.set("packages", packages_yaml) + + install("--fake", "dyninst ^libdwarf@=20111030") + install("--fake", "libdwarf@=20130729") + + # Ensure we are using the external libelf + db = temporary_store.db + libelf = db.query_one("libelf") + assert libelf.external + + deprecated_spec = db.query_one("libdwarf@=20111030") + new_libdwarf = db.query_one("libdwarf@=20130729") + deprecate("-y", "libdwarf@=20111030", "libdwarf@=20130729") + + assert db.deprecator(deprecated_spec) == new_libdwarf diff --git a/lib/spack/spack/test/cmd/dev_build.py b/lib/spack/spack/test/cmd/dev_build.py index 16252b1af7e0a3..c335ea0ccfd098 100644 --- a/lib/spack/spack/test/cmd/dev_build.py +++ b/lib/spack/spack/test/cmd/dev_build.py @@ -9,9 +9,9 @@ import llnl.util.filesystem as fs -import spack.build_environment import spack.environment as ev import spack.error +import spack.repo import spack.spec import spack.store from spack.main import SpackCommand diff --git a/lib/spack/spack/test/cmd/develop.py b/lib/spack/spack/test/cmd/develop.py index b090f0d21b5f21..202e165165c4c4 100644 --- a/lib/spack/spack/test/cmd/develop.py +++ b/lib/spack/spack/test/cmd/develop.py @@ -11,15 +11,17 @@ import spack.config import spack.environment as ev +import spack.package_base import spack.spec +import spack.stage +import spack.util.git +import spack.util.path from spack.main import SpackCommand add = SpackCommand("add") develop = SpackCommand("develop") env = SpackCommand("env") -pytestmark = pytest.mark.not_on_windows("does not run on windows") - @pytest.mark.usefixtures("mutable_mock_env_path", "mock_packages", "mock_fetch", "mutable_config") class TestDevelop: diff --git a/lib/spack/spack/test/cmd/diff.py b/lib/spack/spack/test/cmd/diff.py index 259f6b871afa7f..e352ce1352bcc1 100644 --- a/lib/spack/spack/test/cmd/diff.py +++ b/lib/spack/spack/test/cmd/diff.py @@ -6,9 +6,9 @@ import pytest import spack.cmd.diff -import spack.config import spack.main -import spack.store +import spack.repo +import spack.spec import spack.util.spack_json as sjson from spack.test.conftest import create_test_repo diff --git a/lib/spack/spack/test/cmd/edit.py b/lib/spack/spack/test/cmd/edit.py index 93b4bd7949acd3..1735f7f4a5cc28 100644 --- a/lib/spack/spack/test/cmd/edit.py +++ b/lib/spack/spack/test/cmd/edit.py @@ -5,7 +5,6 @@ import os -import spack.paths import spack.repo import spack.util.editor from spack.build_systems import autotools, cmake diff --git a/lib/spack/spack/test/cmd/env.py b/lib/spack/spack/test/cmd/env.py index 9c32ab7610eb01..70e2c56e412603 100644 --- a/lib/spack/spack/test/cmd/env.py +++ b/lib/spack/spack/test/cmd/env.py @@ -24,14 +24,21 @@ import spack.environment.environment import spack.environment.shell import spack.error +import spack.main import spack.modules +import spack.modules.tcl import spack.package_base import spack.paths import spack.repo +import spack.solver.asp +import spack.spec +import spack.stage import spack.store +import spack.util.environment import spack.util.spack_json as sjson import spack.util.spack_yaml from spack.cmd.env import _env_create +from spack.installer import PackageInstaller from spack.main import SpackCommand, SpackCommandError from spack.spec import Spec from spack.stage import stage_prefix @@ -272,7 +279,7 @@ def test_env_rename_managed(capfd): assert "baz" in out -def test_env_rename_anonymous(capfd, tmpdir): +def test_env_rename_independent(capfd, tmpdir): # Need real environment with pytest.raises(spack.main.SpackCommandError): env("rename", "-d", "./non-existing", "./also-non-existing") @@ -568,42 +575,76 @@ def test_remove_command(): with ev.read("test"): add("mpileaks") + + with ev.read("test"): assert "mpileaks" in find() assert "mpileaks@" not in find() assert "mpileaks@" not in find("--show-concretized") with ev.read("test"): remove("mpileaks") + + with ev.read("test"): assert "mpileaks" not in find() assert "mpileaks@" not in find() assert "mpileaks@" not in find("--show-concretized") with ev.read("test"): add("mpileaks") + + with ev.read("test"): assert "mpileaks" in find() assert "mpileaks@" not in find() assert "mpileaks@" not in find("--show-concretized") with ev.read("test"): concretize() + + with ev.read("test"): assert "mpileaks" in find() assert "mpileaks@" not in find() assert "mpileaks@" in find("--show-concretized") with ev.read("test"): remove("mpileaks") + + with ev.read("test"): assert "mpileaks" not in find() # removed but still in last concretized specs assert "mpileaks@" in find("--show-concretized") with ev.read("test"): concretize() + + with ev.read("test"): assert "mpileaks" not in find() assert "mpileaks@" not in find() # now the lockfile is regenerated and it's gone. assert "mpileaks@" not in find("--show-concretized") +def test_remove_command_all(): + # Need separate ev.read calls for each command to ensure we test round-trip to disk + env("create", "test") + test_pkgs = ("mpileaks", "zlib") + + with ev.read("test"): + for name in test_pkgs: + add(name) + + with ev.read("test"): + for name in test_pkgs: + assert name in find() + assert f"{name}@" not in find() + + with ev.read("test"): + remove("-a") + + with ev.read("test"): + for name in test_pkgs: + assert name not in find() + + def test_bad_remove_included_env(): env("create", "test") test = ev.read("test") @@ -763,6 +804,39 @@ def test_user_removed_spec(environment_from_manifest): assert not any(x.name == "hypre" for x in env_specs) +def test_lockfile_spliced_specs(environment_from_manifest, install_mockery): + """Test that an environment can round-trip a spliced spec.""" + # Create a local install for zmpi to splice in + # Default concretization is not using zmpi + zmpi = spack.spec.Spec("zmpi").concretized() + PackageInstaller([zmpi.package], fake=True).install() + + e1 = environment_from_manifest( + f""" +spack: + specs: + - mpileaks + concretizer: + splice: + explicit: + - target: mpi + replacement: zmpi/{zmpi.dag_hash()} +""" + ) + with e1: + e1.concretize() + e1.write() + + # By reading into a second environment, we force a round trip to json + e2 = _env_create("test2", init_file=e1.lock_path) + + # The one spec is mpileaks + for _, spec in e2.concretized_specs(): + assert spec.spliced + assert spec["mpi"].satisfies(f"zmpi@{zmpi.version}") + assert spec["mpi"].build_spec.satisfies(zmpi) + + def test_init_from_lockfile(environment_from_manifest): """Test that an environment can be instantiated from a lockfile.""" e1 = environment_from_manifest( @@ -1160,7 +1234,7 @@ def test_config_change_new(mutable_mock_env_path, tmp_path, mock_packages, mutab ) with ev.Environment(tmp_path): assert spack.spec.Spec("mpich").concretized().satisfies("@3.0.3") - with pytest.raises(spack.config.ConfigError, match="not a list"): + with pytest.raises(spack.error.ConfigError, match="not a list"): config("change", "packages:mpich:require:~debug") @@ -1188,7 +1262,7 @@ def test_env_with_included_config_missing_file(tmpdir, mutable_empty_config): with spack_yaml.open("w") as f: f.write("spack:\n include:\n - {0}\n".format(missing_file.strpath)) - with pytest.raises(spack.config.ConfigError, match="missing include path"): + with pytest.raises(spack.error.ConfigError, match="missing include path"): ev.Environment(tmpdir.strpath) @@ -2336,103 +2410,6 @@ def test_stack_yaml_force_remove_from_matrix(tmpdir): assert mpileaks_spec not in after_conc -def test_stack_concretize_extraneous_deps(tmpdir, mock_packages): - # FIXME: The new concretizer doesn't handle yet soft - # FIXME: constraints for stacks - # FIXME: This now works for statically-determinable invalid deps - # FIXME: But it still does not work for dynamically determined invalid deps - - filename = str(tmpdir.join("spack.yaml")) - with open(filename, "w") as f: - f.write( - """\ -spack: - definitions: - - packages: [libelf, mpileaks] - - install: - - matrix: - - [$packages] - - ['^zmpi', '^mpich'] - specs: - - $install -""" - ) - with tmpdir.as_cwd(): - env("create", "test", "./spack.yaml") - with ev.read("test"): - concretize() - - test = ev.read("test") - - for user, concrete in test.concretized_specs(): - assert concrete.concrete - assert not user.concrete - if user.name == "libelf": - assert not concrete.satisfies("^mpi") - elif user.name == "mpileaks": - assert concrete.satisfies("^mpi") - - -def test_stack_concretize_extraneous_variants(tmpdir, mock_packages): - filename = str(tmpdir.join("spack.yaml")) - with open(filename, "w") as f: - f.write( - """\ -spack: - definitions: - - packages: [libelf, mpileaks] - - install: - - matrix: - - [$packages] - - ['~shared', '+shared'] - specs: - - $install -""" - ) - with tmpdir.as_cwd(): - env("create", "test", "./spack.yaml") - with ev.read("test"): - concretize() - - test = ev.read("test") - - for user, concrete in test.concretized_specs(): - assert concrete.concrete - assert not user.concrete - if user.name == "libelf": - assert "shared" not in concrete.variants - if user.name == "mpileaks": - assert concrete.variants["shared"].value == user.variants["shared"].value - - -def test_stack_concretize_extraneous_variants_with_dash(tmpdir, mock_packages): - filename = str(tmpdir.join("spack.yaml")) - with open(filename, "w") as f: - f.write( - """\ -spack: - definitions: - - packages: [libelf, mpileaks] - - install: - - matrix: - - [$packages] - - ['shared=False', '+shared-libs'] - specs: - - $install -""" - ) - with tmpdir.as_cwd(): - env("create", "test", "./spack.yaml") - with ev.read("test"): - concretize() - - ev.read("test") - - # Regression test for handling of variants with dashes in them - # will fail before this point if code regresses - assert True - - def test_stack_definition_extension(tmpdir): filename = str(tmpdir.join("spack.yaml")) with open(filename, "w") as f: @@ -3638,7 +3615,7 @@ def test_create_and_activate_managed(tmp_path): env("deactivate") -def test_create_and_activate_anonymous(tmp_path): +def test_create_and_activate_independent(tmp_path): with fs.working_dir(str(tmp_path)): env_dir = os.path.join(str(tmp_path), "foo") shell = env("activate", "--without-view", "--create", "--sh", env_dir) @@ -4301,9 +4278,6 @@ def test_env_include_mixed_views(tmp_path, mutable_mock_env_path, mutable_config {''.join(includes)} specs: - mpileaks - packages: - mpileaks: - compiler: [gcc] """ ) diff --git a/lib/spack/spack/test/cmd/extensions.py b/lib/spack/spack/test/cmd/extensions.py index b97bfa8b06c8b1..082628cc34cf60 100644 --- a/lib/spack/spack/test/cmd/extensions.py +++ b/lib/spack/spack/test/cmd/extensions.py @@ -6,6 +6,7 @@ import pytest +from spack.installer import PackageInstaller from spack.main import SpackCommand, SpackCommandError from spack.spec import Spec @@ -15,10 +16,7 @@ @pytest.fixture def python_database(mock_packages, mutable_database): specs = [Spec(s).concretized() for s in ["python", "py-extension1", "py-extension2"]] - - for spec in specs: - spec.package.do_install(fake=True, explicit=True) - + PackageInstaller([s.package for s in specs], explicit=True, fake=True).install() yield diff --git a/lib/spack/spack/test/cmd/external.py b/lib/spack/spack/test/cmd/external.py index a186552987c3ad..684520bea292c5 100644 --- a/lib/spack/spack/test/cmd/external.py +++ b/lib/spack/spack/test/cmd/external.py @@ -12,6 +12,8 @@ import spack import spack.cmd.external +import spack.config +import spack.cray_manifest import spack.detection import spack.detection.path import spack.repo diff --git a/lib/spack/spack/test/cmd/find.py b/lib/spack/spack/test/cmd/find.py index 46f05ab6e9ca65..fa8299f2abb450 100644 --- a/lib/spack/spack/test/cmd/find.py +++ b/lib/spack/spack/test/cmd/find.py @@ -14,6 +14,7 @@ import spack.cmd as cmd import spack.cmd.find import spack.environment as ev +import spack.store import spack.user_environment as uenv from spack.main import SpackCommand from spack.spec import Spec @@ -334,7 +335,6 @@ def test_find_command_basic_usage(database): assert "mpileaks" in output -@pytest.mark.not_on_windows("envirnment is not yet supported on windows") @pytest.mark.regression("9875") def test_find_prefix_in_env( mutable_mock_env_path, install_mockery, mock_fetch, mock_packages, mock_archive diff --git a/lib/spack/spack/test/cmd/gc.py b/lib/spack/spack/test/cmd/gc.py index e646f8f8d5a43f..d997be59b2a3f3 100644 --- a/lib/spack/spack/test/cmd/gc.py +++ b/lib/spack/spack/test/cmd/gc.py @@ -11,13 +11,12 @@ import spack.main import spack.spec import spack.traverse +from spack.installer import PackageInstaller gc = spack.main.SpackCommand("gc") add = spack.main.SpackCommand("add") install = spack.main.SpackCommand("install") -pytestmark = pytest.mark.not_on_windows("does not run on windows") - @pytest.mark.db def test_gc_without_build_dependency(mutable_database): @@ -29,18 +28,34 @@ def test_gc_without_build_dependency(mutable_database): def test_gc_with_build_dependency(mutable_database): s = spack.spec.Spec("simple-inheritance") s.concretize() - s.package.do_install(fake=True, explicit=True) + PackageInstaller([s.package], explicit=True, fake=True).install() assert "There are no unused specs." in gc("-yb") assert "Successfully uninstalled cmake" in gc("-y") assert "There are no unused specs." in gc("-y") +@pytest.mark.db +def test_gc_with_constraints(mutable_database): + s_cmake1 = spack.spec.Spec("simple-inheritance ^cmake@3.4.3").concretized() + s_cmake2 = spack.spec.Spec("simple-inheritance ^cmake@3.23.1").concretized() + PackageInstaller([s_cmake1.package], explicit=True, fake=True).install() + PackageInstaller([s_cmake2.package], explicit=True, fake=True).install() + + assert "There are no unused specs." in gc("python") + + assert "Successfully uninstalled cmake@3.4.3" in gc("-y", "cmake@3.4.3") + assert "There are no unused specs." in gc("-y", "cmake@3.4.3") + + assert "Successfully uninstalled cmake" in gc("-y", "cmake@3.23.1") + assert "There are no unused specs." in gc("-y", "cmake") + + @pytest.mark.db def test_gc_with_environment(mutable_database, mutable_mock_env_path): s = spack.spec.Spec("simple-inheritance") s.concretize() - s.package.do_install(fake=True, explicit=True) + PackageInstaller([s.package], explicit=True, fake=True).install() e = ev.create("test_gc") with e: @@ -56,7 +71,7 @@ def test_gc_with_environment(mutable_database, mutable_mock_env_path): def test_gc_with_build_dependency_in_environment(mutable_database, mutable_mock_env_path): s = spack.spec.Spec("simple-inheritance") s.concretize() - s.package.do_install(fake=True, explicit=True) + PackageInstaller([s.package], explicit=True, fake=True).install() e = ev.create("test_gc") with e: @@ -108,7 +123,7 @@ def test_gc_except_any_environments(mutable_database, mutable_mock_env_path): def test_gc_except_specific_environments(mutable_database, mutable_mock_env_path): s = spack.spec.Spec("simple-inheritance") s.concretize() - s.package.do_install(fake=True, explicit=True) + PackageInstaller([s.package], explicit=True, fake=True).install() assert mutable_database.query_local("zmpi") @@ -135,7 +150,7 @@ def test_gc_except_nonexisting_dir_env(mutable_database, mutable_mock_env_path, def test_gc_except_specific_dir_env(mutable_database, mutable_mock_env_path, tmpdir): s = spack.spec.Spec("simple-inheritance") s.concretize() - s.package.do_install(fake=True, explicit=True) + PackageInstaller([s.package], explicit=True, fake=True).install() assert mutable_database.query_local("zmpi") diff --git a/lib/spack/spack/test/cmd/gpg.py b/lib/spack/spack/test/cmd/gpg.py index d342897db7f800..b720b7d9e62f67 100644 --- a/lib/spack/spack/test/cmd/gpg.py +++ b/lib/spack/spack/test/cmd/gpg.py @@ -9,7 +9,6 @@ import llnl.util.filesystem as fs -import spack.bootstrap import spack.util.executable import spack.util.gpg from spack.main import SpackCommand diff --git a/lib/spack/spack/test/cmd/install.py b/lib/spack/spack/test/cmd/install.py index 5f8119f01763d2..13721b2a0d52e6 100644 --- a/lib/spack/spack/test/cmd/install.py +++ b/lib/spack/spack/test/cmd/install.py @@ -17,19 +17,20 @@ import llnl.util.filesystem as fs import llnl.util.tty as tty +import spack.build_environment import spack.cmd.common.arguments import spack.cmd.install -import spack.compilers as compilers import spack.config import spack.environment as ev +import spack.error import spack.hash_types as ht +import spack.installer import spack.package_base import spack.store -import spack.util.executable -from spack.error import SpackError +from spack.error import SpackError, SpecSyntaxError +from spack.installer import PackageInstaller from spack.main import SpackCommand -from spack.parser import SpecSyntaxError -from spack.spec import CompilerSpec, Spec +from spack.spec import Spec install = SpackCommand("install") env = SpackCommand("env") @@ -136,7 +137,7 @@ def test_package_output(tmpdir, capsys, install_mockery, mock_fetch): # when nested AND in pytest spec = Spec("printing-package").concretized() pkg = spec.package - pkg.do_install(verbose=True) + PackageInstaller([pkg], explicit=True, verbose=True).install() with gzip.open(pkg.install_log_path, "rt") as f: out = f.read() @@ -261,7 +262,7 @@ def test_install_commit(mock_git_version_info, install_mockery, mock_packages, m # Use the earliest commit in the respository spec = Spec(f"git-test-commit@{commits[-1]}").concretized() - spec.package.do_install() + PackageInstaller([spec.package], explicit=True).install() # Ensure first commit file contents were written installed = os.listdir(spec.prefix.bin) @@ -422,7 +423,7 @@ def test_junit_output_with_failures(tmpdir, exc_typename, msg): @pytest.mark.parametrize( "exc_typename,expected_exc,msg", [ - ("RuntimeError", spack.installer.InstallError, "something weird happened"), + ("RuntimeError", spack.error.InstallError, "something weird happened"), ("KeyboardInterrupt", KeyboardInterrupt, "Ctrl-C strikes again"), ], ) @@ -706,7 +707,7 @@ def test_install_only_package(tmpdir, mock_fetch, install_mockery, capfd): with capfd.disabled(): try: install("--only", "package", "dependent-install") - except spack.installer.InstallError as e: + except spack.error.InstallError as e: msg = str(e) assert "Cannot proceed with dependent-install" in msg @@ -916,68 +917,6 @@ def test_cdash_configure_warning(tmpdir, mock_fetch, install_mockery, capfd): assert "foo: No such file or directory" in content -@pytest.mark.not_on_windows("ArchSpec gives test platform debian rather than windows") -def test_compiler_bootstrap( - install_mockery, mock_packages, mock_fetch, mock_archive, mutable_config, monkeypatch -): - monkeypatch.setattr(spack.concretize.Concretizer, "check_for_compiler_existence", False) - spack.config.set("config:install_missing_compilers", True) - assert CompilerSpec("gcc@=12.0") not in compilers.all_compiler_specs() - - # Test succeeds if it does not raise an error - install("pkg-a%gcc@=12.0") - - -@pytest.mark.not_on_windows("Binary mirrors not supported on windows") -def test_compiler_bootstrap_from_binary_mirror( - install_mockery, mock_packages, mock_fetch, mock_archive, mutable_config, monkeypatch, tmpdir -): - """ - Make sure installing compiler from buildcache registers compiler - """ - - # Create a temp mirror directory for buildcache usage - mirror_dir = tmpdir.join("mirror_dir") - mirror_url = "file://{0}".format(mirror_dir.strpath) - - # Install a compiler, because we want to put it in a buildcache - install("gcc@=10.2.0") - - # Put installed compiler in the buildcache - buildcache("push", "-u", "-f", mirror_dir.strpath, "gcc@10.2.0") - - # Now uninstall the compiler - uninstall("-y", "gcc@10.2.0") - - monkeypatch.setattr(spack.concretize.Concretizer, "check_for_compiler_existence", False) - spack.config.set("config:install_missing_compilers", True) - assert CompilerSpec("gcc@=10.2.0") not in compilers.all_compiler_specs() - - # Configure the mirror where we put that buildcache w/ the compiler - mirror("add", "test-mirror", mirror_url) - - # Now make sure that when the compiler is installed from binary mirror, - # it also gets configured as a compiler. Test succeeds if it does not - # raise an error - install("--no-check-signature", "--cache-only", "--only", "dependencies", "pkg-b%gcc@=10.2.0") - install("--no-cache", "--only", "package", "pkg-b%gcc@10.2.0") - - -@pytest.mark.not_on_windows("ArchSpec gives test platform debian rather than windows") -@pytest.mark.regression("16221") -def test_compiler_bootstrap_already_installed( - install_mockery, mock_packages, mock_fetch, mock_archive, mutable_config, monkeypatch -): - monkeypatch.setattr(spack.concretize.Concretizer, "check_for_compiler_existence", False) - spack.config.set("config:install_missing_compilers", True) - - assert CompilerSpec("gcc@=12.0") not in compilers.all_compiler_specs() - - # Test succeeds if it does not raise an error - install("gcc@=12.0") - install("pkg-a%gcc@=12.0") - - def test_install_fails_no_args(tmpdir): # ensure no spack.yaml in directory with tmpdir.as_cwd(): diff --git a/lib/spack/spack/test/cmd/is_git_repo.py b/lib/spack/spack/test/cmd/is_git_repo.py index 087f69e0282f02..3dabc8623a2082 100644 --- a/lib/spack/spack/test/cmd/is_git_repo.py +++ b/lib/spack/spack/test/cmd/is_git_repo.py @@ -11,6 +11,8 @@ from llnl.util.filesystem import mkdirp, working_dir import spack +import spack.cmd +import spack.fetch_strategy from spack.version import ver diff --git a/lib/spack/spack/test/cmd/list.py b/lib/spack/spack/test/cmd/list.py index 4a925046738995..23903107f67bf8 100644 --- a/lib/spack/spack/test/cmd/list.py +++ b/lib/spack/spack/test/cmd/list.py @@ -7,6 +7,7 @@ import sys from textwrap import dedent +import spack.paths import spack.repo from spack.main import SpackCommand diff --git a/lib/spack/spack/test/cmd/load.py b/lib/spack/spack/test/cmd/load.py index 73a062ebd41203..1c36bcc86aba82 100644 --- a/lib/spack/spack/test/cmd/load.py +++ b/lib/spack/spack/test/cmd/load.py @@ -10,7 +10,6 @@ import spack.spec import spack.user_environment as uenv -import spack.util.environment from spack.main import SpackCommand load = SpackCommand("load") diff --git a/lib/spack/spack/test/cmd/location.py b/lib/spack/spack/test/cmd/location.py index 9e42a03b021828..25fa02a6b084ac 100644 --- a/lib/spack/spack/test/cmd/location.py +++ b/lib/spack/spack/test/cmd/location.py @@ -11,6 +11,7 @@ import spack.environment as ev import spack.paths +import spack.spec import spack.stage from spack.main import SpackCommand, SpackCommandError diff --git a/lib/spack/spack/test/cmd/logs.py b/lib/spack/spack/test/cmd/logs.py index 0691549be585f1..b668cd449cbb55 100644 --- a/lib/spack/spack/test/cmd/logs.py +++ b/lib/spack/spack/test/cmd/logs.py @@ -13,6 +13,9 @@ import pytest import spack +import spack.cmd.logs +import spack.main +import spack.spec from spack.main import SpackCommand logs = SpackCommand("logs") diff --git a/lib/spack/spack/test/cmd/mirror.py b/lib/spack/spack/test/cmd/mirror.py index c1e24a9825ea55..2a67bc2e1432ed 100644 --- a/lib/spack/spack/test/cmd/mirror.py +++ b/lib/spack/spack/test/cmd/mirror.py @@ -10,8 +10,11 @@ import spack.cmd.mirror import spack.config import spack.environment as ev +import spack.error +import spack.mirror import spack.spec import spack.util.url as url_util +import spack.version from spack.main import SpackCommand, SpackCommandError mirror = SpackCommand("mirror") diff --git a/lib/spack/spack/test/cmd/module.py b/lib/spack/spack/test/cmd/module.py index 4b460eb90aead9..759d1391c97113 100644 --- a/lib/spack/spack/test/cmd/module.py +++ b/lib/spack/spack/test/cmd/module.py @@ -11,8 +11,11 @@ import spack.config import spack.main import spack.modules +import spack.modules.lmod +import spack.repo import spack.spec import spack.store +from spack.installer import PackageInstaller module = spack.main.SpackCommand("module") @@ -182,8 +185,8 @@ def test_setdefault_command(mutable_database, mutable_config): # Install two different versions of pkg-a other_spec, preferred = "pkg-a@1.0", "pkg-a@2.0" - spack.spec.Spec(other_spec).concretized().package.do_install(fake=True) - spack.spec.Spec(preferred).concretized().package.do_install(fake=True) + specs = [spack.spec.Spec(other_spec).concretized(), spack.spec.Spec(preferred).concretized()] + PackageInstaller([s.package for s in specs], explicit=True, fake=True).install() writers = { preferred: writer_cls(spack.spec.Spec(preferred).concretized(), "default"), diff --git a/lib/spack/spack/test/cmd/pkg.py b/lib/spack/spack/test/cmd/pkg.py index c6db5693c786aa..d1f0ed139ecac3 100644 --- a/lib/spack/spack/test/cmd/pkg.py +++ b/lib/spack/spack/test/cmd/pkg.py @@ -12,6 +12,7 @@ import spack.cmd.pkg import spack.main +import spack.paths import spack.repo import spack.util.file_cache @@ -310,7 +311,7 @@ def test_pkg_grep(mock_packages, capfd): output, _ = capfd.readouterr() assert output.strip() == "\n".join( spack.repo.PATH.get_pkg_class(name).module.__file__ - for name in ["splice-a", "splice-h", "splice-t", "splice-vh", "splice-z"] + for name in ["splice-a", "splice-h", "splice-t", "splice-vh", "splice-vt", "splice-z"] ) # ensure that this string isn't fouhnd diff --git a/lib/spack/spack/test/cmd/providers.py b/lib/spack/spack/test/cmd/providers.py index 25d17ab9af3949..4ea642ef32b61b 100644 --- a/lib/spack/spack/test/cmd/providers.py +++ b/lib/spack/spack/test/cmd/providers.py @@ -31,7 +31,6 @@ def test_it_just_runs(pkg): "mpilander", "mvapich2", "openmpi", - "openmpi@1.6.5", "openmpi@1.7.5:", "openmpi@2.0.0:", "spectrum-mpi", diff --git a/lib/spack/spack/test/cmd/reindex.py b/lib/spack/spack/test/cmd/reindex.py index 6e48a3c21c3ea5..abaaf4530c0ca7 100644 --- a/lib/spack/spack/test/cmd/reindex.py +++ b/lib/spack/spack/test/cmd/reindex.py @@ -55,12 +55,24 @@ def test_reindex_with_deprecated_packages( deprecate("-y", "libelf@0.8.12", "libelf@0.8.13") - all_installed = spack.store.STORE.db.query(installed=any) - non_deprecated = spack.store.STORE.db.query(installed=True) + db = spack.store.STORE.db + + all_installed = db.query(installed=any) + non_deprecated = db.query(installed=True) _clear_db(tmp_path) reindex() - assert spack.store.STORE.db.query(installed=any) == all_installed - assert spack.store.STORE.db.query(installed=True) == non_deprecated + assert db.query(installed=any) == all_installed + assert db.query(installed=True) == non_deprecated + + old_libelf = db.query_local_by_spec_hash( + db.query_local("libelf@0.8.12", installed=any)[0].dag_hash() + ) + new_libelf = db.query_local_by_spec_hash( + db.query_local("libelf@0.8.13", installed=True)[0].dag_hash() + ) + assert old_libelf.deprecated_for == new_libelf.spec.dag_hash() + assert new_libelf.deprecated_for is None + assert new_libelf.ref_count == 1 diff --git a/lib/spack/spack/test/cmd/spec.py b/lib/spack/spack/test/cmd/spec.py index 9512f31c2a6ab4..a57c40ec926823 100644 --- a/lib/spack/spack/test/cmd/spec.py +++ b/lib/spack/spack/test/cmd/spec.py @@ -9,7 +9,6 @@ import spack.environment as ev import spack.error -import spack.parser import spack.spec import spack.store from spack.main import SpackCommand, SpackCommandError @@ -142,7 +141,7 @@ def test_spec_returncode(): def test_spec_parse_error(): - with pytest.raises(spack.parser.SpecSyntaxError) as e: + with pytest.raises(spack.error.SpecSyntaxError) as e: spec("1.15:") # make sure the error is formatted properly diff --git a/lib/spack/spack/test/cmd/stage.py b/lib/spack/spack/test/cmd/stage.py index 26e88e4280c38b..ba37eff0dc9dca 100644 --- a/lib/spack/spack/test/cmd/stage.py +++ b/lib/spack/spack/test/cmd/stage.py @@ -10,8 +10,6 @@ import spack.config import spack.environment as ev import spack.package_base -import spack.repo -import spack.stage import spack.traverse from spack.main import SpackCommand, SpackCommandError from spack.version import Version @@ -50,7 +48,6 @@ def fake_stage(pkg, mirror_only=False): return expected_path -@pytest.mark.not_on_windows("PermissionError") def test_stage_path(check_stage_path): """Verify that --path only works with single specs.""" stage("--path={0}".format(check_stage_path), "trivial-install-test-package") diff --git a/lib/spack/spack/test/cmd/style.py b/lib/spack/spack/test/cmd/style.py index 7444c970c1916e..208e31f8a2fa5f 100644 --- a/lib/spack/spack/test/cmd/style.py +++ b/lib/spack/spack/test/cmd/style.py @@ -11,6 +11,7 @@ from llnl.util.filesystem import FileFilter +import spack.cmd.style import spack.main import spack.paths import spack.repo diff --git a/lib/spack/spack/test/cmd/tags.py b/lib/spack/spack/test/cmd/tags.py index 7de107c9234be2..0e8e7f016591f7 100644 --- a/lib/spack/spack/test/cmd/tags.py +++ b/lib/spack/spack/test/cmd/tags.py @@ -6,6 +6,7 @@ import spack.main import spack.repo import spack.spec +from spack.installer import PackageInstaller tags = spack.main.SpackCommand("tags") @@ -48,7 +49,7 @@ class tag_path: def test_tags_installed(install_mockery, mock_fetch): s = spack.spec.Spec("mpich").concretized() - s.package.do_install() + PackageInstaller([s.package], explicit=True, fake=True).install() out = tags("-i") for tag in ["tag1", "tag2"]: diff --git a/lib/spack/spack/test/cmd/test.py b/lib/spack/spack/test/cmd/test.py index 3cfaa5b58f28ba..866d579aa7fafb 100644 --- a/lib/spack/spack/test/cmd/test.py +++ b/lib/spack/spack/test/cmd/test.py @@ -11,14 +11,11 @@ from llnl.util.filesystem import copy_tree import spack.cmd.common.arguments -import spack.cmd.install import spack.cmd.test import spack.config import spack.install_test -import spack.package_base import spack.paths import spack.spec -import spack.store from spack.install_test import TestStatus from spack.main import SpackCommand @@ -197,6 +194,9 @@ def test_test_list_all(mock_packages): assert set(pkgs) == set( [ "fail-test-audit", + "fail-test-audit-deprecated", + "fail-test-audit-docstring", + "fail-test-audit-impl", "mpich", "perl-extension", "printing-package", diff --git a/lib/spack/spack/test/cmd/undevelop.py b/lib/spack/spack/test/cmd/undevelop.py index 9b5a2a5692f073..684a9f50198b9e 100644 --- a/lib/spack/spack/test/cmd/undevelop.py +++ b/lib/spack/spack/test/cmd/undevelop.py @@ -2,10 +2,6 @@ # Spack Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) - - -import pytest - import spack.environment as ev import spack.spec from spack.main import SpackCommand @@ -14,8 +10,6 @@ env = SpackCommand("env") concretize = SpackCommand("concretize") -pytestmark = pytest.mark.not_on_windows("does not run on windows") - def test_undevelop(tmpdir, mutable_config, mock_packages, mutable_mock_env_path): # setup environment diff --git a/lib/spack/spack/test/cmd/uninstall.py b/lib/spack/spack/test/cmd/uninstall.py index 78a5f10d5e62ac..35b6a15455aa04 100644 --- a/lib/spack/spack/test/cmd/uninstall.py +++ b/lib/spack/spack/test/cmd/uninstall.py @@ -205,7 +205,6 @@ def _warn(*args, **kwargs): # Note: I want to use https://docs.pytest.org/en/7.1.x/how-to/skipping.html#skip-all-test-functions-of-a-class-or-module # the style formatter insists on separating these two lines. -@pytest.mark.not_on_windows("Envs unsupported on Windows") class TestUninstallFromEnv: """Tests an installation with two environments e1 and e2, which each have shared package installations: diff --git a/lib/spack/spack/test/cmd/view.py b/lib/spack/spack/test/cmd/view.py index f385a69e8512c1..1c405728b443c7 100644 --- a/lib/spack/spack/test/cmd/view.py +++ b/lib/spack/spack/test/cmd/view.py @@ -4,10 +4,14 @@ # SPDX-License-Identifier: (Apache-2.0 OR MIT) import os.path +import sys import pytest +from llnl.util.symlink import _windows_can_symlink + import spack.util.spack_yaml as s_yaml +from spack.installer import PackageInstaller from spack.main import SpackCommand from spack.spec import Spec @@ -15,7 +19,16 @@ install = SpackCommand("install") view = SpackCommand("view") -pytestmark = pytest.mark.not_on_windows("does not run on windows") +if sys.platform == "win32": + if not _windows_can_symlink(): + pytest.skip( + "Windows must be able to create symlinks to run tests.", allow_module_level=True + ) + # TODO: Skipping hardlink command testing on windows until robust checks can be added. + # See https://github.com/spack/spack/pull/46335#discussion_r1757411915 + commands = ["symlink", "add", "copy", "relocate"] +else: + commands = ["hardlink", "symlink", "hard", "add", "copy", "relocate"] def create_projection_file(tmpdir, projection): @@ -27,7 +40,7 @@ def create_projection_file(tmpdir, projection): return projection_file -@pytest.mark.parametrize("cmd", ["hardlink", "symlink", "hard", "add", "copy", "relocate"]) +@pytest.mark.parametrize("cmd", commands) def test_view_link_type(tmpdir, mock_packages, mock_archive, mock_fetch, install_mockery, cmd): install("libdwarf") viewpath = str(tmpdir.mkdir("view_{0}".format(cmd))) @@ -40,7 +53,7 @@ def test_view_link_type(tmpdir, mock_packages, mock_archive, mock_fetch, install assert os.path.islink(package_prefix) == is_link_cmd -@pytest.mark.parametrize("add_cmd", ["hardlink", "symlink", "hard", "add", "copy", "relocate"]) +@pytest.mark.parametrize("add_cmd", commands) def test_view_link_type_remove( tmpdir, mock_packages, mock_archive, mock_fetch, install_mockery, add_cmd ): @@ -54,7 +67,7 @@ def test_view_link_type_remove( assert not os.path.exists(bindir) -@pytest.mark.parametrize("cmd", ["hardlink", "symlink", "hard", "add", "copy", "relocate"]) +@pytest.mark.parametrize("cmd", commands) def test_view_projections(tmpdir, mock_packages, mock_archive, mock_fetch, install_mockery, cmd): install("libdwarf@20130207") @@ -180,7 +193,7 @@ def test_view_files_not_ignored( ): spec = Spec("view-not-ignored").concretized() pkg = spec.package - pkg.do_install() + PackageInstaller([pkg], explicit=True).install() pkg.assert_installed(spec.prefix) install("view-file") # Arbitrary package to add noise diff --git a/lib/spack/spack/test/compilers/basics.py b/lib/spack/spack/test/compilers/basics.py index 8f8d7fb876d07f..ee31e50f53893e 100644 --- a/lib/spack/spack/test/compilers/basics.py +++ b/lib/spack/spack/test/compilers/basics.py @@ -12,8 +12,8 @@ import spack.compiler import spack.compilers +import spack.config import spack.spec -import spack.util.environment import spack.util.module_cmd from spack.compiler import Compiler from spack.util.executable import Executable, ProcessError @@ -461,9 +461,13 @@ def test_intel_flags(): unsupported_flag_test("cxx14_flag", "intel@=14.0") supported_flag_test("cxx14_flag", "-std=c++1y", "intel@=15.0") supported_flag_test("cxx14_flag", "-std=c++14", "intel@=15.0.2") + unsupported_flag_test("cxx17_flag", "intel@=18") + supported_flag_test("cxx17_flag", "-std=c++17", "intel@=19.0") unsupported_flag_test("c99_flag", "intel@=11.0") supported_flag_test("c99_flag", "-std=c99", "intel@=12.0") unsupported_flag_test("c11_flag", "intel@=15.0") + supported_flag_test("c18_flag", "-std=c18", "intel@=21.5.0") + unsupported_flag_test("c18_flag", "intel@=21.4.0") supported_flag_test("c11_flag", "-std=c1x", "intel@=16.0") supported_flag_test("cc_pic_flag", "-fPIC", "intel@=1.0") supported_flag_test("cxx_pic_flag", "-fPIC", "intel@=1.0") @@ -589,6 +593,7 @@ def test_xl_r_flags(): "compiler_spec,expected_result", [("gcc@4.7.2", False), ("clang@3.3", False), ("clang@8.0.0", True)], ) +@pytest.mark.not_on_windows("GCC and LLVM currently not supported on the platform") def test_detecting_mixed_toolchains( compiler_spec, expected_result, mutable_config, compiler_factory ): diff --git a/lib/spack/spack/test/concretize.py b/lib/spack/spack/test/concretize.py index bbddf7ff41b157..b56f05b6019cee 100644 --- a/lib/spack/spack/test/concretize.py +++ b/lib/spack/spack/test/concretize.py @@ -22,14 +22,18 @@ import spack.detection import spack.error import spack.hash_types as ht +import spack.paths import spack.platforms +import spack.platforms.test import spack.repo import spack.solver.asp +import spack.solver.version_order +import spack.spec import spack.store import spack.util.file_cache -import spack.util.libc import spack.variant as vt from spack.concretize import find_spec +from spack.installer import PackageInstaller from spack.spec import CompilerSpec, Spec from spack.version import Version, VersionList, ver @@ -50,7 +54,7 @@ def check_spec(abstract, concrete): cflag = concrete.compiler_flags[flag] assert set(aflag) <= set(cflag) - for name in spack.repo.PATH.get_pkg_class(abstract.name).variants: + for name in spack.repo.PATH.get_pkg_class(abstract.name).variant_names(): assert name in concrete.variants for flag in concrete.compiler_flags.valid_compiler_flags(): @@ -401,14 +405,6 @@ def test_spec_flags_maintain_order(self, mutable_config, gcc11_with_flags): s.compiler_flags[x] == ["-O0", "-g"] for x in ("cflags", "cxxflags", "fflags") ) - @pytest.mark.xfail(reason="Broken, needs to be fixed") - def test_compiler_flags_from_compiler_and_dependent(self): - client = Spec("cmake-client %clang@12.2.0 platform=test os=fe target=fe cflags==-g") - client.concretize() - cmake = client["cmake"] - for spec in [client, cmake]: - assert spec.compiler_flags["cflags"] == ["-O3", "-g"] - def test_compiler_flags_differ_identical_compilers(self, mutable_config, clang12_with_flags): mutable_config.set("compilers", [clang12_with_flags]) # Correct arch to use test compiler that has flags @@ -442,6 +438,13 @@ def test_compiler_flags_differ_identical_compilers(self, mutable_config, clang12 ["hypre cflags='-g'", "^openblas cflags='-O3'"], ["^openblas cflags='-g'"], ), + # Setting propagation on parent and dependency -> the + # dependency propagation flags override + ( + "hypre cflags=='-g' ^openblas cflags=='-O3'", + ["hypre cflags='-g'", "^openblas cflags='-O3'"], + ["^openblas cflags='-g'"], + ), # Propagation doesn't go across build dependencies ( "cmake-client cflags=='-O2 -g'", @@ -929,7 +932,9 @@ def test_conditional_variants(self, spec_str, expected, unexpected): ], ) def test_conditional_variants_fail(self, bad_spec): - with pytest.raises((spack.error.UnsatisfiableSpecError, vt.InvalidVariantForSpecError)): + with pytest.raises( + (spack.error.UnsatisfiableSpecError, spack.spec.InvalidVariantForSpecError) + ): _ = Spec("conditional-variant-pkg" + bad_spec).concretized() @pytest.mark.parametrize( @@ -1315,7 +1320,7 @@ def test_reuse_installed_packages_when_package_def_changes( # Install a spec root = Spec("root").concretized() dependency = root["changing"].copy() - root.package.do_install(fake=True, explicit=True) + PackageInstaller([root.package], fake=True, explicit=True).install() # Modify package.py repo_with_changing_recipe.change(context) @@ -1341,7 +1346,7 @@ def test_no_reuse_when_variant_condition_does_not_hold(self, mutable_database, m # Install a spec for which the `version_based` variant condition does not hold old = Spec("conditional-variant-pkg @1").concretized() - old.package.do_install(fake=True, explicit=True) + PackageInstaller([old.package], fake=True, explicit=True).install() # Then explicitly require a spec with `+version_based`, which shouldn't reuse previous spec new1 = Spec("conditional-variant-pkg +version_based").concretized() @@ -1353,7 +1358,7 @@ def test_no_reuse_when_variant_condition_does_not_hold(self, mutable_database, m def test_reuse_with_flags(self, mutable_database, mutable_config): spack.config.set("concretizer:reuse", True) spec = Spec("pkg-a cflags=-g cxxflags=-g").concretized() - spec.package.do_install(fake=True) + PackageInstaller([spec.package], fake=True, explicit=True).install() testspec = Spec("pkg-a cflags=-g") testspec.concretize() @@ -1372,7 +1377,7 @@ def test_concretization_of_test_dependencies(self): ) def test_error_message_for_inconsistent_variants(self, spec_str): s = Spec(spec_str) - with pytest.raises(RuntimeError, match="not found in package"): + with pytest.raises(vt.UnknownVariantError): s.concretize() @pytest.mark.regression("22533") @@ -1654,7 +1659,7 @@ def test_delete_version_and_reuse(self, mutable_database, repo_with_changing_rec declared in package.py """ root = Spec("root").concretized() - root.package.do_install(fake=True, explicit=True) + PackageInstaller([root.package], fake=True, explicit=True).install() repo_with_changing_recipe.change({"delete_version": True}) with spack.config.override("concretizer:reuse", True): @@ -1672,7 +1677,7 @@ def test_installed_version_is_selected_only_for_reuse( # Install a dependency that cannot be reused with "root" # because of a conflict in a variant, then delete its version dependency = Spec("changing@1.0~foo").concretized() - dependency.package.do_install(fake=True, explicit=True) + PackageInstaller([dependency.package], fake=True, explicit=True).install() repo_with_changing_recipe.change({"delete_version": True}) with spack.config.override("concretizer:reuse", True): @@ -1687,7 +1692,7 @@ def test_reuse_with_unknown_namespace_dont_raise( with spack.repo.use_repositories(mock_custom_repository, override=False): s = Spec("pkg-c").concretized() assert s.namespace != "builtin.mock" - s.package.do_install(fake=True, explicit=True) + PackageInstaller([s.package], fake=True, explicit=True).install() with spack.config.override("concretizer:reuse", True): s = Spec("pkg-c").concretized() @@ -1699,7 +1704,7 @@ def test_reuse_from_other_namespace_no_raise(self, tmpdir, temporary_store, monk myrepo.add_package("zlib") builtin = Spec("zlib").concretized() - builtin.package.do_install(fake=True, explicit=True) + PackageInstaller([builtin.package], fake=True, explicit=True).install() with spack.repo.use_repositories(myrepo.root, override=False): with spack.config.override("concretizer:reuse", True): @@ -1714,7 +1719,7 @@ def test_reuse_with_unknown_package_dont_raise(self, tmpdir, temporary_store, mo with spack.repo.use_repositories(builder.root, override=False): s = Spec("pkg-c").concretized() assert s.namespace == "myrepo" - s.package.do_install(fake=True, explicit=True) + PackageInstaller([s.package], fake=True, explicit=True).install() del sys.modules["spack.pkg.myrepo.pkg-c"] del sys.modules["spack.pkg.myrepo"] @@ -1932,7 +1937,7 @@ def test_installed_externals_are_reused( # Install the external spec external1 = Spec("changing@1.0").concretized() - external1.package.do_install(fake=True, explicit=True) + PackageInstaller([external1.package], fake=True, explicit=True).install() assert external1.external # Modify the package.py file @@ -2276,6 +2281,31 @@ def test_virtuals_are_annotated_on_edges(self, spec_str): edges = spec.edges_to_dependencies(name="callpath") assert len(edges) == 1 and edges[0].virtuals == () + @pytest.mark.parametrize("transitive", [True, False]) + def test_explicit_splices( + self, mutable_config, database_mutable_config, mock_packages, transitive, capfd + ): + mpich_spec = database_mutable_config.query("mpich")[0] + splice_info = { + "target": "mpi", + "replacement": f"/{mpich_spec.dag_hash()}", + "transitive": transitive, + } + spack.config.CONFIG.set("concretizer", {"splice": {"explicit": [splice_info]}}) + + spec = spack.spec.Spec("hdf5 ^zmpi").concretized() + + assert spec.satisfies(f"^mpich@{mpich_spec.version}") + assert spec.build_spec.dependencies(name="zmpi", deptype="link") + assert spec["mpi"].build_spec.satisfies(mpich_spec) + assert not spec.build_spec.satisfies(f"^mpich/{mpich_spec.dag_hash()}") + assert not spec.dependencies(name="zmpi", deptype="link") + + captured = capfd.readouterr() + assert "Warning: explicit splice configuration has caused" in captured.err + assert "hdf5 ^zmpi" in captured.err + assert str(spec) in captured.err + @pytest.mark.db @pytest.mark.parametrize( "spec_str,mpi_name", @@ -2305,7 +2335,7 @@ def test_reuse_python_from_cli_and_extension_from_db(self, mutable_database): """ s = Spec("py-extension1").concretized() python_hash = s["python"].dag_hash() - s.package.do_install(fake=True, explicit=True) + PackageInstaller([s.package], fake=True, explicit=True).install() with spack.config.override("concretizer:reuse", True): with_reuse = Spec(f"py-extension2 ^/{python_hash}").concretized() @@ -2376,26 +2406,6 @@ def test_externals_with_platform_explicitly_set(self, tmp_path): s = Spec("mpich").concretized() assert s.external - @pytest.mark.regression("43875") - def test_concretize_missing_compiler(self, mutable_config, monkeypatch): - """Tests that Spack can concretize a spec with a missing compiler when the - option is active. - """ - - def _default_libc(self): - if self.cc is None: - return None - return Spec("glibc@=2.28") - - monkeypatch.setattr(spack.concretize.Concretizer, "check_for_compiler_existence", False) - monkeypatch.setattr(spack.compiler.Compiler, "default_libc", property(_default_libc)) - monkeypatch.setattr( - spack.util.libc, "libc_from_current_python_process", lambda: Spec("glibc@=2.28") - ) - mutable_config.set("config:install_missing_compilers", True) - s = Spec("pkg-a %gcc@=13.2.0").concretized() - assert s.satisfies("%gcc@13.2.0") - @pytest.mark.regression("43267") def test_spec_with_build_dep_from_json(self, tmp_path): """Tests that we can correctly concretize a spec, when we express its dependency as a @@ -2949,7 +2959,7 @@ def test_concretization_version_order(): result = [ v for v, _ in sorted( - versions, key=spack.solver.asp.concretization_version_order, reverse=True + versions, key=spack.solver.version_order.concretization_version_order, reverse=True ) ] assert result == [ @@ -3039,7 +3049,7 @@ def test_spec_filters(specs, include, exclude, expected): @pytest.mark.regression("38484") def test_git_ref_version_can_be_reused(install_mockery, do_not_check_runtimes_on_reuse): first_spec = spack.spec.Spec("git-ref-package@git.2.1.5=2.1.5~opt").concretized() - first_spec.package.do_install(fake=True, explicit=True) + PackageInstaller([first_spec.package], fake=True, explicit=True).install() with spack.config.override("concretizer:reuse", True): # reproducer of the issue is that spack will solve when there is a change to the base spec @@ -3063,10 +3073,10 @@ def test_reuse_prefers_standard_over_git_versions( so install git ref last and ensure it is not picked up by reuse """ standard_spec = spack.spec.Spec(f"git-ref-package@{standard_version}").concretized() - standard_spec.package.do_install(fake=True, explicit=True) + PackageInstaller([standard_spec.package], fake=True, explicit=True).install() git_spec = spack.spec.Spec("git-ref-package@git.2.1.5=2.1.5").concretized() - git_spec.package.do_install(fake=True, explicit=True) + PackageInstaller([git_spec.package], fake=True, explicit=True).install() with spack.config.override("concretizer:reuse", True): test_spec = spack.spec.Spec("git-ref-package@2").concretized() diff --git a/lib/spack/spack/test/concretize_errors.py b/lib/spack/spack/test/concretize_errors.py index 114942bc6de3c1..0cb7a533c1df24 100644 --- a/lib/spack/spack/test/concretize_errors.py +++ b/lib/spack/spack/test/concretize_errors.py @@ -5,11 +5,10 @@ import pytest +import spack.config import spack.solver.asp import spack.spec -pytestmark = [pytest.mark.not_on_windows("Windows uses old concretizer")] - version_error_messages = [ "Cannot satisfy 'fftw@:1.0' and 'fftw@1.1:", " required because quantum-espresso depends on fftw@:1.0", diff --git a/lib/spack/spack/test/concretize_preferences.py b/lib/spack/spack/test/concretize_preferences.py index 1a411407740037..faf7b07fc097b1 100644 --- a/lib/spack/spack/test/concretize_preferences.py +++ b/lib/spack/spack/test/concretize_preferences.py @@ -11,8 +11,10 @@ import spack.config import spack.package_prefs import spack.repo +import spack.spec +import spack.util.module_cmd import spack.util.spack_yaml as syaml -from spack.config import ConfigError +from spack.error import ConfigError from spack.spec import CompilerSpec, Spec from spack.version import Version @@ -227,7 +229,7 @@ def test_preferred_undefined_raises(self): """Preference should not specify an undefined version""" update_packages("python", "version", ["3.5.0.1"]) spec = Spec("python") - with pytest.raises(spack.config.ConfigError): + with pytest.raises(ConfigError): spec.concretize() def test_preferred_truncated(self): diff --git a/lib/spack/spack/test/concretize_requirements.py b/lib/spack/spack/test/concretize_requirements.py index 38fe4c296ffdae..be66b2b0a82588 100644 --- a/lib/spack/spack/test/concretize_requirements.py +++ b/lib/spack/spack/test/concretize_requirements.py @@ -7,96 +7,28 @@ import pytest -import spack.build_systems.generic import spack.config import spack.error import spack.package_base import spack.repo +import spack.solver.asp import spack.util.spack_yaml as syaml import spack.version +from spack.installer import PackageInstaller from spack.solver.asp import InternalConcretizerError, UnsatisfiableSpecError from spack.spec import Spec -from spack.test.conftest import create_test_repo from spack.util.url import path_to_file_url -pytestmark = [pytest.mark.not_on_windows("Windows uses old concretizer")] - def update_packages_config(conf_str): conf = syaml.load_config(conf_str) spack.config.set("packages", conf["packages"], scope="concretize") -_pkgx = ( - "x", - """\ -class X(Package): - version("1.1") - version("1.0") - version("0.9") - - variant("shared", default=True, - description="Build shared libraries") - - depends_on("y") -""", -) - - -_pkgy = ( - "y", - """\ -class Y(Package): - version("2.5") - version("2.4") - version("2.3", deprecated=True) - - variant("shared", default=True, - description="Build shared libraries") -""", -) - - -_pkgv = ( - "v", - """\ -class V(Package): - version("2.1") - version("2.0") -""", -) - - -_pkgt = ( - "t", - """\ -class T(Package): - version('2.1') - version('2.0') - - depends_on('u', when='@2.1:') -""", -) - - -_pkgu = ( - "u", - """\ -class U(Package): - version('1.1') - version('1.0') -""", -) - - -@pytest.fixture -def _create_test_repo(tmpdir, mutable_config): - yield create_test_repo(tmpdir, [_pkgx, _pkgy, _pkgv, _pkgt, _pkgu]) - - @pytest.fixture -def test_repo(_create_test_repo, monkeypatch, mock_stage): - with spack.repo.use_repositories(_create_test_repo) as mock_repo_path: +def test_repo(mutable_config, monkeypatch, mock_stage): + repo_dir = pathlib.Path(spack.paths.repos_path) / "requirements.test" + with spack.repo.use_repositories(str(repo_dir)) as mock_repo_path: yield mock_repo_path @@ -140,7 +72,7 @@ def test_require_undefined_version(concretize_scope, test_repo): require: "@1.2" """ update_packages_config(conf_str) - with pytest.raises(spack.config.ConfigError): + with pytest.raises(spack.error.ConfigError): Spec("x").concretize() @@ -494,23 +426,24 @@ def test_oneof_ordering(concretize_scope, test_repo): assert s2.satisfies("@2.5") -def test_reuse_oneof(concretize_scope, _create_test_repo, mutable_database, mock_fetch): +def test_reuse_oneof(concretize_scope, test_repo, tmp_path, mock_fetch): conf_str = """\ packages: y: require: - - one_of: ["@2.5", "%gcc"] + - one_of: ["@2.5", "~shared"] """ - with spack.repo.use_repositories(_create_test_repo): - s1 = Spec("y@2.5%gcc").concretized() - s1.package.do_install(fake=True, explicit=True) + store_dir = tmp_path / "store" + with spack.store.use_store(str(store_dir)): + s1 = Spec("y@2.5 ~shared").concretized() + PackageInstaller([s1.package], fake=True, explicit=True).install() update_packages_config(conf_str) with spack.config.override("concretizer:reuse", True): s2 = Spec("y").concretized() - assert not s2.satisfies("@2.5 %gcc") + assert not s2.satisfies("@2.5 ~shared") @pytest.mark.parametrize( @@ -549,13 +482,11 @@ def test_requirements_and_deprecated_versions( @pytest.mark.parametrize("spec_str,requirement_str", [("x", "%gcc"), ("x", "%clang")]) def test_default_requirements_with_all(spec_str, requirement_str, concretize_scope, test_repo): """Test that default requirements are applied to all packages.""" - conf_str = """\ + conf_str = f"""\ packages: all: - require: "{}" -""".format( - requirement_str - ) + require: "{requirement_str}" +""" update_packages_config(conf_str) spec = Spec(spec_str).concretized() @@ -576,15 +507,13 @@ def test_default_and_package_specific_requirements( """Test that specific package requirements override default package requirements.""" generic_req, specific_req = requirements generic_exp, specific_exp = expectations - conf_str = """\ + conf_str = f"""\ packages: all: - require: "{}" + require: "{generic_req}" x: - require: "{}" -""".format( - generic_req, specific_req - ) + require: "{specific_req}" +""" update_packages_config(conf_str) spec = Spec("x").concretized() @@ -595,13 +524,11 @@ def test_default_and_package_specific_requirements( @pytest.mark.parametrize("mpi_requirement", ["mpich", "mpich2", "zmpi"]) def test_requirements_on_virtual(mpi_requirement, concretize_scope, mock_packages): - conf_str = """\ + conf_str = f"""\ packages: mpi: - require: "{}" -""".format( - mpi_requirement - ) + require: "{mpi_requirement}" +""" update_packages_config(conf_str) spec = Spec("callpath").concretized() @@ -616,15 +543,13 @@ def test_requirements_on_virtual(mpi_requirement, concretize_scope, mock_package def test_requirements_on_virtual_and_on_package( mpi_requirement, specific_requirement, concretize_scope, mock_packages ): - conf_str = """\ + conf_str = f"""\ packages: mpi: - require: "{0}" - {0}: - require: "{1}" -""".format( - mpi_requirement, specific_requirement - ) + require: "{mpi_requirement}" + {mpi_requirement}: + require: "{specific_requirement}" +""" update_packages_config(conf_str) spec = Spec("callpath").concretized() diff --git a/lib/spack/spack/test/config.py b/lib/spack/spack/test/config.py index 7c1c8f365b6f3e..be727f1c561e95 100644 --- a/lib/spack/spack/test/config.py +++ b/lib/spack/spack/test/config.py @@ -18,17 +18,17 @@ import spack.config import spack.directory_layout import spack.environment as ev -import spack.fetch_strategy -import spack.main +import spack.error import spack.package_base import spack.paths +import spack.platforms import spack.repo import spack.schema.compilers import spack.schema.config import spack.schema.env import spack.schema.mirrors -import spack.schema.packages import spack.schema.repos +import spack.spec import spack.store import spack.util.path as spack_path import spack.util.spack_yaml as syaml @@ -313,7 +313,7 @@ def test_add_config_path_with_enumerated_type(mutable_config): spack.config.add("config:flags:keep_werror:specific") assert spack.config.get("config")["flags"]["keep_werror"] == "specific" - with pytest.raises(spack.config.ConfigError): + with pytest.raises(spack.error.ConfigError): spack.config.add("config:flags:keep_werror:foo") @@ -407,7 +407,7 @@ def test_substitute_config_variables(mock_low_high_config, monkeypatch): ) == os.path.abspath(os.path.join("foo", "test", "bar")) host_target = spack.platforms.host().target("default_target") - host_target_family = str(host_target.microarchitecture.family) + host_target_family = str(host_target.family) assert spack_path.canonicalize_path( os.path.join("foo", "$target_family", "bar") ) == os.path.abspath(os.path.join("foo", host_target_family, "bar")) @@ -872,10 +872,10 @@ def test_bad_command_line_scopes(tmp_path, config): file_path.write_text("") - with pytest.raises(spack.config.ConfigError): + with pytest.raises(spack.error.ConfigError): spack.config._add_command_line_scopes(cfg, [str(file_path)]) - with pytest.raises(spack.config.ConfigError): + with pytest.raises(spack.error.ConfigError): spack.config._add_command_line_scopes(cfg, [str(non_existing_path)]) @@ -993,7 +993,7 @@ def test_immutable_scope(tmpdir): data = scope.get_section("config") assert data["config"]["install_tree"] == {"root": "dummy_tree_value"} - with pytest.raises(spack.config.ConfigError): + with pytest.raises(spack.error.ConfigError): scope._write_section("config") diff --git a/lib/spack/spack/test/conftest.py b/lib/spack/spack/test/conftest.py index 2db0206bec5de8..5f461d9d3588a4 100644 --- a/lib/spack/spack/test/conftest.py +++ b/lib/spack/spack/test/conftest.py @@ -35,25 +35,24 @@ import spack.binary_distribution import spack.bootstrap.core import spack.caches -import spack.cmd.buildcache import spack.compiler import spack.compilers import spack.config -import spack.database -import spack.directory_layout +import spack.directives import spack.environment as ev import spack.error +import spack.modules.common import spack.package_base -import spack.package_prefs import spack.paths import spack.platforms import spack.repo import spack.solver.asp +import spack.spec import spack.stage import spack.store import spack.subprocess_context -import spack.test.cray_manifest import spack.util.executable +import spack.util.file_cache import spack.util.git import spack.util.gpg import spack.util.parallel @@ -62,8 +61,12 @@ import spack.util.web import spack.version from spack.fetch_strategy import URLFetchStrategy +from spack.installer import PackageInstaller +from spack.main import SpackCommand from spack.util.pattern import Bunch +mirror_cmd = SpackCommand("mirror") + @pytest.fixture(autouse=True) def check_config_fixture(request): @@ -853,7 +856,7 @@ def _populate(mock_db): def _install(spec): s = spack.spec.Spec(spec).concretized() - s.package.do_install(fake=True, explicit=True) + PackageInstaller([s.package], fake=True, explicit=True).install() _install("mpileaks ^mpich") _install("mpileaks ^mpich2") @@ -989,6 +992,38 @@ def install_mockery(temporary_store: spack.store.Store, mutable_config, mock_pac temporary_store.failure_tracker.clear_all() +@pytest.fixture(scope="module") +def temporary_mirror_dir(tmpdir_factory): + dir = tmpdir_factory.mktemp("mirror") + dir.ensure("build_cache", dir=True) + yield str(dir) + dir.join("build_cache").remove() + + +@pytest.fixture(scope="function") +def temporary_mirror(temporary_mirror_dir): + mirror_url = url_util.path_to_file_url(temporary_mirror_dir) + mirror_cmd("add", "--scope", "site", "test-mirror-func", mirror_url) + yield temporary_mirror_dir + mirror_cmd("rm", "--scope=site", "test-mirror-func") + + +@pytest.fixture(scope="function") +def mutable_temporary_mirror_dir(tmpdir_factory): + dir = tmpdir_factory.mktemp("mirror") + dir.ensure("build_cache", dir=True) + yield str(dir) + dir.join("build_cache").remove() + + +@pytest.fixture(scope="function") +def mutable_temporary_mirror(mutable_temporary_mirror_dir): + mirror_url = url_util.path_to_file_url(mutable_temporary_mirror_dir) + mirror_cmd("add", "--scope", "site", "test-mirror-func", mirror_url) + yield mutable_temporary_mirror_dir + mirror_cmd("rm", "--scope=site", "test-mirror-func") + + @pytest.fixture(scope="function") def temporary_store(tmpdir, request): """Hooks a temporary empty store for the test function.""" @@ -1980,13 +2015,20 @@ def pytest_runtest_setup(item): if not_on_windows_marker and sys.platform == "win32": pytest.skip(*not_on_windows_marker.args) + # Skip items marked "only windows" if they're run anywhere but Windows + only_windows_marker = item.get_closest_marker(name="only_windows") + if only_windows_marker and sys.platform != "win32": + pytest.skip(*only_windows_marker.args) + + +def _sequential_executor(*args, **kwargs): + return spack.util.parallel.SequentialExecutor() + @pytest.fixture(autouse=True) def disable_parallel_buildcache_push(monkeypatch): """Disable process pools in tests.""" - monkeypatch.setattr( - spack.util.parallel, "make_concurrent_executor", spack.util.parallel.SequentialExecutor - ) + monkeypatch.setattr(spack.util.parallel, "make_concurrent_executor", _sequential_executor) def _root_path(x, y, *, path): diff --git a/lib/spack/spack/test/container/cli.py b/lib/spack/spack/test/container/cli.py index fa57eac723bfc0..5e1ecd58a74e33 100644 --- a/lib/spack/spack/test/container/cli.py +++ b/lib/spack/spack/test/container/cli.py @@ -8,7 +8,6 @@ import spack.container.images import spack.main -import spack.platforms containerize = spack.main.SpackCommand("containerize") @@ -27,7 +26,6 @@ def test_listing_possible_os(): assert expected_os in output -@pytest.mark.not_on_windows("test unsupported on Windows") @pytest.mark.maybeslow @pytest.mark.requires_executables("git") def test_bootstrap_phase(minimal_configuration, config_dumper, capsys): diff --git a/lib/spack/spack/test/container/images.py b/lib/spack/spack/test/container/images.py index faac9d0c8e8747..1e5e9e0d70b279 100644 --- a/lib/spack/spack/test/container/images.py +++ b/lib/spack/spack/test/container/images.py @@ -7,6 +7,7 @@ import pytest import spack.container +import spack.container.images @pytest.mark.parametrize( diff --git a/lib/spack/spack/test/cray_manifest.py b/lib/spack/spack/test/cray_manifest.py index 532261b3ee834e..2a11b79a11422f 100644 --- a/lib/spack/spack/test/cray_manifest.py +++ b/lib/spack/spack/test/cray_manifest.py @@ -18,8 +18,9 @@ import spack.cmd import spack.cmd.external import spack.compilers -import spack.config import spack.cray_manifest as cray_manifest +import spack.platforms +import spack.platforms.test import spack.solver.asp import spack.spec import spack.store diff --git a/lib/spack/spack/test/data/unparse/legion.txt b/lib/spack/spack/test/data/unparse/legion.txt index d6b37e2c9a5be8..788375d4973261 100644 --- a/lib/spack/spack/test/data/unparse/legion.txt +++ b/lib/spack/spack/test/data/unparse/legion.txt @@ -357,37 +357,28 @@ class Legion(CMakePackage): install test subdirectory for use during `spack test run`.""" cache_extra_test_sources(self, [join_path('examples', 'local_function_tasks')]) - def run_local_function_tasks_test(self): - """Run stand alone test: local_function_tasks""" + def test_run_local_function_tasks(self): + """Build and run external application example""" - test_dir = join_path(self.test_suite.current_test_cache_dir, - 'examples', 'local_function_tasks') + test_dir = join_path( + self.test_suite.current_test_cache_dir, "examples", "local_function_tasks" + ) if not os.path.exists(test_dir): - print('Skipping local_function_tasks test') - return + raise SkipTest(f"{test_dir} must exist") - exe = 'local_function_tasks' + cmake_args = [ + f"-DCMAKE_C_COMPILER={self.compiler.cc}", + f"-DCMAKE_CXX_COMPILER={self.compiler.cxx}", + f"-DLegion_DIR={join_path(self.prefix, 'share', 'Legion', 'cmake')}", + ] - cmake_args = ['-DCMAKE_C_COMPILER={0}'.format(self.compiler.cc), - '-DCMAKE_CXX_COMPILER={0}'.format(self.compiler.cxx), - '-DLegion_DIR={0}'.format(join_path(self.prefix, - 'share', - 'Legion', - 'cmake'))] + with working_dir(test_dir): + cmake = self.spec["cmake"].command + cmake(*cmake_args) - self.run_test('cmake', - options=cmake_args, - purpose='test: generate makefile for {0} example'.format(exe), - work_dir=test_dir) + make = which("make") + make() - self.run_test('make', - purpose='test: build {0} example'.format(exe), - work_dir=test_dir) - - self.run_test(exe, - purpose='test: run {0} example'.format(exe), - work_dir=test_dir) - - def test(self): - self.run_local_function_tasks_test() + exe = which("local_function_tasks") + exe() diff --git a/lib/spack/spack/test/data/unparse/mfem.txt b/lib/spack/spack/test/data/unparse/mfem.txt index 20dea060358533..bdcb2e26157090 100644 --- a/lib/spack/spack/test/data/unparse/mfem.txt +++ b/lib/spack/spack/test/data/unparse/mfem.txt @@ -816,40 +816,22 @@ class Mfem(Package, CudaPackage, ROCmPackage): install test subdirectory for use during `spack test run`.""" cache_extra_test_sources(self, [self.examples_src_dir, self.examples_data_dir]) - def test(self): - test_dir = join_path( - self.test_suite.current_test_cache_dir, - self.examples_src_dir - ) - + def test_ex10(self): + """build and run ex10(p)""" # MFEM has many examples to serve as a suitable smoke check. ex10 # was chosen arbitrarily among the examples that work both with # MPI and without it - test_exe = 'ex10p' if ('+mpi' in self.spec) else 'ex10' - self.run_test( - 'make', - [ - 'CONFIG_MK={0}/share/mfem/config.mk'.format(self.prefix), - test_exe, - 'parallel=False' - ], - purpose='test: building {0}'.format(test_exe), - skip_missing=False, - work_dir=test_dir, - ) - - self.run_test( - './{0}'.format(test_exe), - [ - '--mesh', - '../{0}/beam-quad.mesh'.format(self.examples_data_dir) - ], - [], - installed=False, - purpose='test: running {0}'.format(test_exe), - skip_missing=False, - work_dir=test_dir, - ) + test_dir = join_path(self.test_suite.current_test_cache_dir, self.examples_src_dir) + + mesh = join_path("..", self.examples_data_dir, "beam-quad.mesh") + test_exe = "ex10p" if ("+mpi" in self.spec) else "ex10" + + with working_dir(test_dir): + make = which("make") + make(f"CONFIG_MK={self.config_mk}", test_exe, "parallel=False") + + ex10 = which(test_exe) + ex10("--mesh", mesh) # this patch is only needed for mfem 4.1, where a few # released files include byte order marks diff --git a/lib/spack/spack/test/database.py b/lib/spack/spack/test/database.py index d1d4917179af17..7140a502878105 100644 --- a/lib/spack/spack/test/database.py +++ b/lib/spack/spack/test/database.py @@ -7,11 +7,14 @@ import functools import json import os +import re import shutil import sys import pytest +import spack.subprocess_context + try: import uuid @@ -31,6 +34,7 @@ import spack.spec import spack.store import spack.version as vn +from spack.installer import PackageInstaller from spack.schema.database_index import schema from spack.util.executable import Executable @@ -382,7 +386,7 @@ def _check_remove_and_add_package(database: spack.database.Database, spec): def _mock_install(spec: str): s = spack.spec.Spec(spec).concretized() - s.package.do_install(fake=True) + PackageInstaller([s.package], fake=True, explicit=True).install() def _mock_remove(spec): @@ -710,7 +714,7 @@ def test_external_entries_in_db(mutable_database): assert not rec.spec.external_modules assert rec.explicit is False - rec.spec.package.do_install(fake=True, explicit=True) + PackageInstaller([rec.spec.package], fake=True, explicit=True).install() rec = mutable_database.get_record("externaltool") assert rec.spec.external_path == os.path.sep + os.path.join("path", "to", "external_tool") assert not rec.spec.external_modules @@ -721,14 +725,14 @@ def test_external_entries_in_db(mutable_database): def test_regression_issue_8036(mutable_database, usr_folder_exists): # The test ensures that the external package prefix is treated as # existing. Even when the package prefix exists, the package should - # not be considered installed until it is added to the database with - # do_install. + # not be considered installed until it is added to the database by + # the installer with install(). s = spack.spec.Spec("externaltool@0.9") s.concretize() assert not s.installed # Now install the external package and check again the `installed` property - s.package.do_install(fake=True) + PackageInstaller([s.package], fake=True, explicit=True).install() assert s.installed @@ -771,7 +775,7 @@ def test_query_unused_specs(mutable_database): # This spec installs a fake cmake as a build only dependency s = spack.spec.Spec("simple-inheritance") s.concretize() - s.package.do_install(fake=True, explicit=True) + PackageInstaller([s.package], fake=True, explicit=True).install() si = s.dag_hash() ml_mpich = spack.store.STORE.db.query_one("mpileaks ^mpich").dag_hash() @@ -814,7 +818,7 @@ def test_query_spec_with_conditional_dependency(mutable_database): # conditional on a Boolean variant s = spack.spec.Spec("hdf5~mpi") s.concretize() - s.package.do_install(fake=True, explicit=True) + PackageInstaller([s.package], fake=True, explicit=True).install() results = spack.store.STORE.db.query_local("hdf5 ^mpich") assert not results @@ -982,9 +986,12 @@ def test_reindex_removed_prefix_is_not_installed(mutable_database, mock_store, c # Reindex should pick up libelf as a dependency of libdwarf spack.store.STORE.reindex() - # Reindexing should warn about libelf not being found on the filesystem - err = capfd.readouterr()[1] - assert "this directory does not contain an installation of the spec" in err + # Reindexing should warn about libelf not found on the filesystem + assert re.search( + "libelf@0.8.13.+ was marked installed in the database " + "but was not found on the file system", + capfd.readouterr().err, + ) # And we should still have libelf in the database, but not installed. assert not mutable_database.query_one("libelf", installed=True) @@ -1124,3 +1131,53 @@ def test_database_errors_with_just_a_version_key(tmp_path): with pytest.raises(spack.database.InvalidDatabaseVersionError): spack.database.Database(root).query_local() + + +def test_reindex_with_upstreams(tmp_path, monkeypatch, mock_packages, config): + # Reindexing should not put install records of upstream entries into the local database. Here + # we install `mpileaks` locally with dependencies in the upstream. And we even install + # `mpileaks` with the same hash in the upstream. After reindexing, `mpileaks` should still be + # in the local db, and `callpath` should not. + mpileaks = spack.spec.Spec("mpileaks").concretized() + callpath = mpileaks.dependencies("callpath")[0] + + upstream_store = spack.store.create( + {"config": {"install_tree": {"root": str(tmp_path / "upstream")}}} + ) + monkeypatch.setattr(spack.store, "STORE", upstream_store) + PackageInstaller([callpath.package], fake=True, explicit=True).install() + + local_store = spack.store.create( + { + "config": {"install_tree": {"root": str(tmp_path / "local")}}, + "upstreams": {"my-upstream": {"install_tree": str(tmp_path / "upstream")}}, + } + ) + monkeypatch.setattr(spack.store, "STORE", local_store) + PackageInstaller([mpileaks.package], fake=True, explicit=True).install() + + # Sanity check that callpath is from upstream. + assert not local_store.db.query_local("callpath") + assert local_store.db.query("callpath") + + # Install mpileaks also upstream with the same hash to ensure that determining upstreamness + # checks local installs before upstream databases, even when the local database is being + # reindexed. + monkeypatch.setattr(spack.store, "STORE", upstream_store) + PackageInstaller([mpileaks.package], fake=True, explicit=True).install() + + # Delete the local database + shutil.rmtree(local_store.db.database_directory) + + # Create a new instance s.t. we don't have cached specs in memory + reindexed_local_store = spack.store.create( + { + "config": {"install_tree": {"root": str(tmp_path / "local")}}, + "upstreams": {"my-upstream": {"install_tree": str(tmp_path / "upstream")}}, + } + ) + reindexed_local_store.db.reindex() + + assert not reindexed_local_store.db.query_local("callpath") + assert reindexed_local_store.db.query("callpath") == [callpath] + assert reindexed_local_store.db.query_local("mpileaks") == [mpileaks] diff --git a/lib/spack/spack/test/detection.py b/lib/spack/spack/test/detection.py index 3fbc52fcbd91c9..4bad37fc917c26 100644 --- a/lib/spack/spack/test/detection.py +++ b/lib/spack/spack/test/detection.py @@ -4,7 +4,10 @@ # SPDX-License-Identifier: (Apache-2.0 OR MIT) import collections +import spack.config import spack.detection +import spack.detection.common +import spack.detection.path import spack.spec @@ -24,3 +27,28 @@ def test_detection_update_config(mutable_config): external_gcc = externals[0] assert external_gcc["spec"] == "cmake@3.27.5" assert external_gcc["prefix"] == "/usr/bin" + + +def test_dedupe_paths(tmp_path): + """Test that ``dedupe_paths`` deals with symlinked directories, retaining the target""" + x = tmp_path / "x" + y = tmp_path / "y" + z = tmp_path / "z" + + x.mkdir() + y.mkdir() + z.symlink_to("x", target_is_directory=True) + + # dedupe repeated dirs, should preserve order + assert spack.detection.path.dedupe_paths([str(x), str(y), str(x)]) == [str(x), str(y)] + assert spack.detection.path.dedupe_paths([str(y), str(x), str(y)]) == [str(y), str(x)] + + # dedupe repeated symlinks + assert spack.detection.path.dedupe_paths([str(z), str(y), str(z)]) == [str(z), str(y)] + assert spack.detection.path.dedupe_paths([str(y), str(z), str(y)]) == [str(y), str(z)] + + # when both symlink and target are present, only target is retained, and it comes at the + # priority of the first occurrence. + assert spack.detection.path.dedupe_paths([str(x), str(y), str(z)]) == [str(x), str(y)] + assert spack.detection.path.dedupe_paths([str(z), str(y), str(x)]) == [str(x), str(y)] + assert spack.detection.path.dedupe_paths([str(y), str(z), str(x)]) == [str(y), str(x)] diff --git a/lib/spack/spack/test/directory_layout.py b/lib/spack/spack/test/directory_layout.py index da51de415ea412..169c6a9c5e85d9 100644 --- a/lib/spack/spack/test/directory_layout.py +++ b/lib/spack/spack/test/directory_layout.py @@ -14,8 +14,11 @@ from llnl.path import path_to_os_path +import spack.hash_types import spack.paths import spack.repo +import spack.spec +import spack.util.file_cache from spack.directory_layout import DirectoryLayout, InvalidDirectoryLayoutParametersError from spack.spec import Spec diff --git a/lib/spack/spack/test/env.py b/lib/spack/spack/test/env.py index 2452cd937a76cd..682540361fde1a 100644 --- a/lib/spack/spack/test/env.py +++ b/lib/spack/spack/test/env.py @@ -11,7 +11,9 @@ import llnl.util.filesystem as fs +import spack.config import spack.environment as ev +import spack.solver.asp import spack.spec from spack.environment.environment import ( EnvironmentManifestFile, @@ -860,3 +862,33 @@ def test_env_view_on_non_empty_dir_errors(tmp_path, config, mock_packages, tempo env.install_all(fake=True) with pytest.raises(ev.SpackEnvironmentError, match="because it is a non-empty dir"): env.regenerate_views() + + +@pytest.mark.parametrize( + "matrix_line", [("^zmpi", "^mpich"), ("~shared", "+shared"), ("shared=False", "+shared-libs")] +) +@pytest.mark.regression("40791") +def test_stack_enforcement_is_strict(tmp_path, matrix_line, config, mock_packages): + """Ensure that constraints in matrices are applied strictly after expansion, to avoid + inconsistencies between abstract user specs and concrete specs. + """ + manifest = tmp_path / "spack.yaml" + manifest.write_text( + f"""\ +spack: + definitions: + - packages: [libelf, mpileaks] + - install: + - matrix: + - [$packages] + - [{", ".join(item for item in matrix_line)}] + specs: + - $install + concretizer: + unify: false +""" + ) + # Here we raise different exceptions depending on whether we solve serially or not + with pytest.raises(Exception): + with ev.Environment(tmp_path) as e: + e.concretize() diff --git a/lib/spack/spack/test/flag_handlers.py b/lib/spack/spack/test/flag_handlers.py index d2b67d63bc3eca..fd63de4b82ffcc 100644 --- a/lib/spack/spack/test/flag_handlers.py +++ b/lib/spack/spack/test/flag_handlers.py @@ -8,7 +8,6 @@ import pytest import spack.build_environment -import spack.repo import spack.spec from spack.package import build_system_flags, env_flags, inject_flags diff --git a/lib/spack/spack/test/flag_mixing.py b/lib/spack/spack/test/flag_mixing.py new file mode 100644 index 00000000000000..6009ade058e5bd --- /dev/null +++ b/lib/spack/spack/test/flag_mixing.py @@ -0,0 +1,251 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +import pathlib + +import pytest + +import spack.config +import spack.environment as ev +import spack.repo +import spack.util.spack_yaml as syaml +from spack.spec import Spec + +""" +These tests include the following package DAGs: + +Firstly, w, x, y where w and x apply cflags to y. + +w +|\ +x | +|/ +y + +Secondly, v, y which where v does not apply cflags to y - this is for testing +mixing with compiler flag propagation in the absence of compiler flags applied +by dependents. + +v +| +y + +Finally, a diamond dag to check that the topological order is resolved into +a total order: + +t +|\ +u x +|/ +y +""" + + +@pytest.fixture +def test_repo(mutable_config, monkeypatch, mock_stage): + repo_dir = pathlib.Path(spack.paths.repos_path) / "flags.test" + with spack.repo.use_repositories(str(repo_dir)) as mock_repo_path: + yield mock_repo_path + + +def update_concretize_scope(conf_str, section): + conf = syaml.load_config(conf_str) + spack.config.set(section, conf[section], scope="concretize") + + +def test_mix_spec_and_requirements(concretize_scope, test_repo): + conf_str = """\ +packages: + y: + require: cflags="-c" +""" + update_concretize_scope(conf_str, "packages") + + s1 = Spec('y cflags="-a"').concretized() + assert s1.satisfies('cflags="-a -c"') + + +def test_mix_spec_and_dependent(concretize_scope, test_repo): + s1 = Spec('x ^y cflags="-a"').concretized() + assert s1["y"].satisfies('cflags="-a -d1"') + + +def _compiler_cfg_one_entry_with_cflags(cflags): + return f"""\ +compilers:: +- compiler: + spec: gcc@12.100.100 + paths: + cc: /usr/bin/fake-gcc + cxx: /usr/bin/fake-g++ + f77: null + fc: null + flags: + cflags: {cflags} + operating_system: debian6 + modules: [] +""" + + +def test_mix_spec_and_compiler_cfg(concretize_scope, test_repo): + conf_str = _compiler_cfg_one_entry_with_cflags("-Wall") + update_concretize_scope(conf_str, "compilers") + + s1 = Spec('y %gcc@12.100.100 cflags="-O2"').concretized() + assert s1.satisfies('cflags="-Wall -O2"') + + +@pytest.mark.parametrize( + "cmd_flags,req_flags,cmp_flags,dflags,expected_order", + [ + ("-a -b", "-c", None, False, "-c -a -b"), + ("-x7 -x4", "-x5 -x6", None, False, "-x5 -x6 -x7 -x4"), + ("-x7 -x4", "-x5 -x6", "-x3 -x8", False, "-x3 -x8 -x5 -x6 -x7 -x4"), + ("-x7 -x4", "-x5 -x6", "-x3 -x8", True, "-x3 -x8 -d1 -d2 -x5 -x6 -x7 -x4"), + ("-x7 -x4", None, "-x3 -x8", False, "-x3 -x8 -x7 -x4"), + ("-x7 -x4", None, "-x3 -x8", True, "-x3 -x8 -d1 -d2 -x7 -x4"), + # The remaining test cover cases of intersection + ("-a -b", "-a -c", None, False, "-c -a -b"), + ("-a -b", None, "-a -c", False, "-c -a -b"), + ("-a -b", "-a -c", "-a -d", False, "-d -c -a -b"), + ("-a -d2 -d1", "-d2 -c", "-d1 -b", True, "-b -c -a -d2 -d1"), + ("-a", "-d0 -d2 -c", "-d1 -b", True, "-b -d1 -d0 -d2 -c -a"), + ], +) +def test_flag_order_and_grouping( + concretize_scope, test_repo, cmd_flags, req_flags, cmp_flags, dflags, expected_order +): + """Check consistent flag ordering and grouping on a package "y" + with flags introduced from a variety of sources. + + The ordering rules are explained in ``asp.SpecBuilder.reorder_flags``. + """ + if req_flags: + conf_str = f"""\ +packages: + y: + require: cflags="{req_flags}" +""" + update_concretize_scope(conf_str, "packages") + + if cmp_flags: + conf_str = _compiler_cfg_one_entry_with_cflags(cmp_flags) + update_concretize_scope(conf_str, "compilers") + + compiler_spec = "" + if cmp_flags: + compiler_spec = "%gcc@12.100.100" + + if dflags: + spec_str = f"x+activatemultiflag {compiler_spec} ^y" + expected_dflags = "-d1 -d2" + else: + spec_str = f"y {compiler_spec}" + expected_dflags = None + + if cmd_flags: + spec_str += f' cflags="{cmd_flags}"' + + root_spec = Spec(spec_str).concretized() + spec = root_spec["y"] + satisfy_flags = " ".join(x for x in [cmd_flags, req_flags, cmp_flags, expected_dflags] if x) + assert spec.satisfies(f'cflags="{satisfy_flags}"') + assert spec.compiler_flags["cflags"] == expected_order.split() + + +def test_two_dependents_flag_mixing(concretize_scope, test_repo): + root_spec1 = Spec("w~moveflaglater").concretized() + spec1 = root_spec1["y"] + assert spec1.compiler_flags["cflags"] == "-d0 -d1 -d2".split() + + root_spec2 = Spec("w+moveflaglater").concretized() + spec2 = root_spec2["y"] + assert spec2.compiler_flags["cflags"] == "-d3 -d1 -d2".split() + + +def test_propagate_and_compiler_cfg(concretize_scope, test_repo): + conf_str = _compiler_cfg_one_entry_with_cflags("-f2") + update_concretize_scope(conf_str, "compilers") + + root_spec = Spec("v %gcc@12.100.100 cflags=='-f1'").concretized() + assert root_spec["y"].satisfies("cflags='-f1 -f2'") + + +# Note: setting flags on a dependency overrides propagation, which +# is tested in test/concretize.py:test_compiler_flag_propagation + + +def test_propagate_and_pkg_dep(concretize_scope, test_repo): + root_spec1 = Spec("x ~activatemultiflag cflags=='-f1'").concretized() + assert root_spec1["y"].satisfies("cflags='-f1 -d1'") + + +def test_propagate_and_require(concretize_scope, test_repo): + conf_str = """\ +packages: + y: + require: cflags="-f2" +""" + update_concretize_scope(conf_str, "packages") + + root_spec1 = Spec("v cflags=='-f1'").concretized() + assert root_spec1["y"].satisfies("cflags='-f1 -f2'") + + # Next, check that a requirement does not "undo" a request for + # propagation from the command-line spec + conf_str = """\ +packages: + v: + require: cflags="-f1" +""" + update_concretize_scope(conf_str, "packages") + + root_spec2 = Spec("v cflags=='-f1'").concretized() + assert root_spec2["y"].satisfies("cflags='-f1'") + + # Note: requirements cannot enforce propagation: any attempt to do + # so will generate a concretization error; this likely relates to + # the note about #37180 in concretize.lp + + +def test_dev_mix_flags(tmp_path, concretize_scope, mutable_mock_env_path, test_repo): + src_dir = tmp_path / "x-src" + + env_content = f"""\ +spack: + specs: + - y %gcc@12.100.100 cflags=='-fsanitize=address' + develop: + y: + spec: y cflags=='-fsanitize=address' + path: {src_dir} +""" + + conf_str = _compiler_cfg_one_entry_with_cflags("-f1") + update_concretize_scope(conf_str, "compilers") + + manifest_file = tmp_path / ev.manifest_name + manifest_file.write_text(env_content) + e = ev.create("test", manifest_file) + with e: + e.concretize() + e.write() + + (result,) = list(j for i, j in e.concretized_specs() if j.name == "y") + + assert result["y"].satisfies("cflags='-fsanitize=address -f1'") + + +def test_diamond_dep_flag_mixing(concretize_scope, test_repo): + """A diamond where each dependent applies flags to the bottom + dependency. The goal is to ensure that the flag ordering is + (a) topological and (b) repeatable for elements not subject to + this partial ordering (i.e. the flags for the left and right + nodes of the diamond always appear in the same order). + `Spec.traverse` is responsible for handling both of these needs. + """ + root_spec1 = Spec("t").concretized() + spec1 = root_spec1["y"] + assert spec1.satisfies('cflags="-c1 -c2 -d1 -d2 -e1 -e2"') + assert spec1.compiler_flags["cflags"] == "-c1 -c2 -e1 -e2 -d1 -d2".split() diff --git a/lib/spack/spack/test/gcs_fetch.py b/lib/spack/spack/test/gcs_fetch.py index ec53f0b633c33a..8e226242220f8b 100644 --- a/lib/spack/spack/test/gcs_fetch.py +++ b/lib/spack/spack/test/gcs_fetch.py @@ -3,8 +3,6 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) -import spack.config -import spack.error import spack.fetch_strategy import spack.stage diff --git a/lib/spack/spack/test/git_fetch.py b/lib/spack/spack/test/git_fetch.py index eb2e03db078966..54ac9d8a1be726 100644 --- a/lib/spack/spack/test/git_fetch.py +++ b/lib/spack/spack/test/git_fetch.py @@ -12,6 +12,9 @@ from llnl.util.filesystem import mkdirp, touch, working_dir import spack.config +import spack.error +import spack.fetch_strategy +import spack.platforms import spack.repo from spack.fetch_strategy import GitFetchStrategy from spack.spec import Spec diff --git a/lib/spack/spack/test/graph.py b/lib/spack/spack/test/graph.py index 001091d22c6dc4..c26363bb46d993 100644 --- a/lib/spack/spack/test/graph.py +++ b/lib/spack/spack/test/graph.py @@ -5,7 +5,6 @@ import io import spack.graph -import spack.repo import spack.spec diff --git a/lib/spack/spack/test/hg_fetch.py b/lib/spack/spack/test/hg_fetch.py index 6d63f64dc8998a..f186ea14541437 100644 --- a/lib/spack/spack/test/hg_fetch.py +++ b/lib/spack/spack/test/hg_fetch.py @@ -10,7 +10,6 @@ from llnl.util.filesystem import mkdirp, touch, working_dir import spack.config -import spack.repo from spack.fetch_strategy import HgFetchStrategy from spack.spec import Spec from spack.stage import Stage diff --git a/lib/spack/spack/test/install.py b/lib/spack/spack/test/install.py index 4159296886b036..efaa7cc17171b6 100644 --- a/lib/spack/spack/test/install.py +++ b/lib/spack/spack/test/install.py @@ -11,17 +11,21 @@ import llnl.util.filesystem as fs +import spack.build_environment import spack.config import spack.database import spack.error +import spack.installer import spack.mirror +import spack.package_base import spack.patch import spack.repo import spack.store import spack.util.spack_json as sjson from spack import binary_distribution +from spack.error import InstallError +from spack.installer import PackageInstaller from spack.package_base import ( - InstallError, PackageBase, PackageStillNeededError, _spack_build_envfile, @@ -39,7 +43,7 @@ def find_nothing(*args): def test_install_and_uninstall(install_mockery, mock_fetch, monkeypatch): spec = Spec("trivial-install-test-package").concretized() - spec.package.do_install() + PackageInstaller([spec.package], explicit=True).install() assert spec.installed spec.package.do_uninstall() @@ -51,7 +55,7 @@ def test_uninstall_non_existing_package(install_mockery, mock_fetch, monkeypatch """Ensure that we can uninstall a package that has been deleted from the repo""" spec = Spec("trivial-install-test-package").concretized() - spec.package.do_install() + PackageInstaller([spec.package], explicit=True).install() assert spec.installed # Mock deletion of the package @@ -72,7 +76,7 @@ def test_pkg_attributes(install_mockery, mock_fetch, monkeypatch): assert spec.concrete pkg = spec.package - pkg.do_install() + PackageInstaller([pkg], explicit=True).install() foo = "attributes-foo" assert spec["bar"].prefix == spec[foo].prefix assert spec["baz"].prefix == spec[foo].prefix @@ -129,7 +133,7 @@ def test_partial_install_delete_prefix_and_stage(install_mockery, mock_fetch, wo s.package.remove_prefix = mock_remove_prefix with pytest.raises(MockInstallError): - s.package.do_install() + PackageInstaller([s.package], explicit=True).install() assert os.path.isdir(s.package.prefix) rm_prefix_checker = RemovePrefixChecker(instance_rm_prefix) s.package.remove_prefix = rm_prefix_checker.remove_prefix @@ -138,7 +142,7 @@ def test_partial_install_delete_prefix_and_stage(install_mockery, mock_fetch, wo spack.store.STORE.failure_tracker.clear(s, True) s.package.set_install_succeed() - s.package.do_install(restage=True) + PackageInstaller([s.package], explicit=True, restage=True).install() assert rm_prefix_checker.removed assert s.package.spec.installed @@ -157,12 +161,12 @@ def test_failing_overwrite_install_should_keep_previous_installation( s.package.set_install_succeed() # Do a failing overwrite install - s.package.do_install() + PackageInstaller([s.package], explicit=True).install() s.package.set_install_fail() kwargs = {"overwrite": [s.dag_hash()]} with pytest.raises(Exception): - s.package.do_install(**kwargs) + PackageInstaller([s.package], explicit=True, **kwargs).install() assert s.package.spec.installed assert os.path.exists(s.prefix) @@ -171,7 +175,7 @@ def test_failing_overwrite_install_should_keep_previous_installation( def test_dont_add_patches_to_installed_package(install_mockery, mock_fetch, monkeypatch): dependency = Spec("dependency-install") dependency.concretize() - dependency.package.do_install() + PackageInstaller([dependency.package], explicit=True).install() dependency_hash = dependency.dag_hash() dependent = Spec("dependent-install ^/" + dependency_hash) @@ -189,7 +193,7 @@ def test_dont_add_patches_to_installed_package(install_mockery, mock_fetch, monk def test_installed_dependency_request_conflicts(install_mockery, mock_fetch, mutable_mock_repo): dependency = Spec("dependency-install") dependency.concretize() - dependency.package.do_install() + PackageInstaller([dependency.package], explicit=True).install() dependency_hash = dependency.dag_hash() dependent = Spec("conflicting-dependent ^/" + dependency_hash) @@ -202,7 +206,7 @@ def test_install_dependency_symlinks_pkg(install_mockery, mock_fetch, mutable_mo spec = Spec("flatten-deps") spec.concretize() pkg = spec.package - pkg.do_install() + PackageInstaller([pkg], explicit=True).install() # Ensure dependency directory exists after the installation. dependency_dir = os.path.join(pkg.prefix, "dependency-install") @@ -212,7 +216,7 @@ def test_install_dependency_symlinks_pkg(install_mockery, mock_fetch, mutable_mo def test_install_times(install_mockery, mock_fetch, mutable_mock_repo): """Test install times added.""" spec = Spec("dev-build-test-install-phases").concretized() - spec.package.do_install() + PackageInstaller([spec.package], explicit=True).install() # Ensure dependency directory exists after the installation. install_times = os.path.join(spec.package.prefix, ".spack", spack_times_log) @@ -235,7 +239,7 @@ def test_flatten_deps(install_mockery, mock_fetch, mutable_mock_repo): spec = Spec("dependent-install") spec.concretize() pkg = spec.package - pkg.do_install() + PackageInstaller([pkg], explicit=True).install() # Demonstrate that the directory does not appear under the spec # prior to the flatten operation. @@ -288,7 +292,7 @@ def test_installed_upstream_external(install_upstream, mock_fetch): assert new_dependency.external assert new_dependency.prefix == os.path.sep + os.path.join("path", "to", "external_tool") - dependent.package.do_install() + PackageInstaller([dependent.package], explicit=True).install() assert not os.path.exists(new_dependency.prefix) assert os.path.exists(dependent.prefix) @@ -307,7 +311,7 @@ def test_installed_upstream(install_upstream, mock_fetch): assert new_dependency.installed_upstream assert new_dependency.prefix == upstream_layout.path_for_spec(dependency) - dependent.package.do_install() + PackageInstaller([dependent.package], explicit=True).install() assert not os.path.exists(new_dependency.prefix) assert os.path.exists(dependent.prefix) @@ -320,14 +324,14 @@ def test_partial_install_keep_prefix(install_mockery, mock_fetch, monkeypatch, w # If remove_prefix is called at any point in this test, that is an error monkeypatch.setattr(spack.package_base.PackageBase, "remove_prefix", mock_remove_prefix) with pytest.raises(spack.build_environment.ChildError): - s.package.do_install(keep_prefix=True) + PackageInstaller([s.package], explicit=True, keep_prefix=True).install() assert os.path.exists(s.package.prefix) # must clear failure markings for the package before re-installing it spack.store.STORE.failure_tracker.clear(s, True) s.package.set_install_succeed() - s.package.do_install(keep_prefix=True) + PackageInstaller([s.package], explicit=True, keep_prefix=True).install() assert s.package.spec.installed @@ -336,12 +340,12 @@ def test_second_install_no_overwrite_first(install_mockery, mock_fetch, monkeypa monkeypatch.setattr(spack.package_base.PackageBase, "remove_prefix", mock_remove_prefix) s.package.set_install_succeed() - s.package.do_install() + PackageInstaller([s.package], explicit=True).install() assert s.package.spec.installed # If Package.install is called after this point, it will fail s.package.set_install_fail() - s.package.do_install() + PackageInstaller([s.package], explicit=True).install() def test_install_prefix_collision_fails(config, mock_fetch, mock_packages, tmpdir): @@ -354,16 +358,16 @@ def test_install_prefix_collision_fails(config, mock_fetch, mock_packages, tmpdi with spack.config.override("config:checksum", False): pkg_a = Spec("libelf@0.8.13").concretized().package pkg_b = Spec("libelf@0.8.12").concretized().package - pkg_a.do_install() + PackageInstaller([pkg_a], explicit=True).install() with pytest.raises(InstallError, match="Install prefix collision"): - pkg_b.do_install() + PackageInstaller([pkg_b], explicit=True).install() def test_store(install_mockery, mock_fetch): spec = Spec("cmake-client").concretized() pkg = spec.package - pkg.do_install() + PackageInstaller([pkg], explicit=True).install() @pytest.mark.disable_clean_stage_check @@ -372,7 +376,7 @@ def test_failing_build(install_mockery, mock_fetch, capfd): pkg = spec.package with pytest.raises(spack.build_environment.ChildError, match="Expected failure"): - pkg.do_install() + PackageInstaller([pkg], explicit=True).install() class MockInstallError(spack.error.SpackError): @@ -401,7 +405,7 @@ def test_nosource_pkg_install(install_mockery, mock_fetch, mock_packages, capfd, pkg = spec.package # Make sure install works even though there is no associated code. - pkg.do_install() + PackageInstaller([pkg], explicit=True).install() out = capfd.readouterr() assert "Installing dependency-install" in out[0] @@ -418,7 +422,7 @@ def test_nosource_bundle_pkg_install( pkg = spec.package # Make sure install works even though there is no associated code. - pkg.do_install() + PackageInstaller([pkg], explicit=True).install() out = capfd.readouterr() assert "Installing dependency-install" in out[0] @@ -432,7 +436,7 @@ def test_nosource_pkg_install_post_install(install_mockery, mock_fetch, mock_pac pkg = spec.package # Make sure both the install and post-install package methods work. - pkg.do_install() + PackageInstaller([pkg], explicit=True).install() # Ensure the file created in the package's `install` method exists. install_txt = os.path.join(spec.prefix, "install.txt") @@ -561,7 +565,7 @@ def test_unconcretized_install(install_mockery, mock_fetch, mock_packages): pkg_cls = spack.repo.PATH.get_pkg_class(spec.name) with pytest.raises(ValueError, match="must have a concrete spec"): - pkg_cls(spec).do_install() + PackageInstaller([pkg_cls(spec)], explicit=True).install() with pytest.raises(ValueError, match="only patch concrete packages"): pkg_cls(spec).do_patch() @@ -585,7 +589,7 @@ def test_empty_install_sanity_check_prefix( """Test empty install triggers sanity_check_prefix.""" spec = Spec("failing-empty-install").concretized() with pytest.raises(spack.build_environment.ChildError, match="Nothing was installed"): - spec.package.do_install() + PackageInstaller([spec.package], explicit=True).install() def test_install_from_binary_with_missing_patch_succeeds( @@ -621,10 +625,16 @@ def test_install_from_binary_with_missing_patch_succeeds( # Source install: fails, we don't have the patch. with pytest.raises(spack.error.SpecError, match="Couldn't find patch for package"): - s.package.do_install() + PackageInstaller([s.package], explicit=True).install() # Binary install: succeeds, we don't need the patch. spack.mirror.add(mirror) - s.package.do_install(package_cache_only=True, dependencies_cache_only=True, unsigned=True) + PackageInstaller( + [s.package], + explicit=True, + package_cache_only=True, + dependencies_cache_only=True, + unsigned=True, + ).install() assert temporary_store.db.query_local_by_spec_hash(s.dag_hash()) diff --git a/lib/spack/spack/test/installer.py b/lib/spack/spack/test/installer.py index 16d50221ea01cb..8df6a1a6eaa00d 100644 --- a/lib/spack/spack/test/installer.py +++ b/lib/spack/spack/test/installer.py @@ -12,18 +12,15 @@ import py import pytest -import archspec.cpu - import llnl.util.filesystem as fs import llnl.util.lock as ulk import llnl.util.tty as tty import spack.binary_distribution -import spack.compilers -import spack.concretize -import spack.config import spack.database import spack.deptypes as dt +import spack.error +import spack.hooks import spack.installer as inst import spack.package_base import spack.package_prefs as prefs @@ -31,7 +28,8 @@ import spack.spec import spack.store import spack.util.lock as lk -import spack.version +from spack.installer import PackageInstaller +from spack.main import SpackCommand def _mock_repo(root, namespace): @@ -76,7 +74,7 @@ def create_build_task( pkg: spack.package_base.PackageBase, install_args: Optional[dict] = None ) -> inst.BuildTask: request = inst.BuildRequest(pkg, {} if install_args is None else install_args) - return inst.BuildTask(pkg, request, False, 0, 0, inst.STATUS_ADDED, set()) + return inst.BuildTask(pkg, request=request, status=inst.BuildStatus.QUEUED) def create_installer( @@ -86,7 +84,7 @@ def create_installer( concretized.""" _specs = [spack.spec.Spec(s).concretized() if isinstance(s, str) else s for s in specs] _install_args = {} if install_args is None else install_args - return inst.PackageInstaller([spec.package for spec in _specs], _install_args) + return inst.PackageInstaller([spec.package for spec in _specs], **_install_args) @pytest.mark.parametrize( @@ -141,8 +139,12 @@ def test_install_from_cache_errors(install_mockery): assert spec.concrete # Check with cache-only - with pytest.raises(inst.InstallError, match="No binary found when cache-only was specified"): - spec.package.do_install(package_cache_only=True, dependencies_cache_only=True) + with pytest.raises( + spack.error.InstallError, match="No binary found when cache-only was specified" + ): + PackageInstaller( + [spec.package], package_cache_only=True, dependencies_cache_only=True + ).install() assert not spec.package.installed_from_binary_cache # Check when don't expect to install only from binary cache @@ -435,76 +437,6 @@ def test_fake_install(install_mockery): assert os.path.isdir(pkg.prefix.lib) -def test_packages_needed_to_bootstrap_compiler_none(install_mockery): - spec = spack.spec.Spec("trivial-install-test-package") - spec.concretize() - assert spec.concrete - - packages = inst._packages_needed_to_bootstrap_compiler( - spec.compiler, spec.architecture, [spec.package] - ) - assert not packages - - -@pytest.mark.xfail(reason="fails when assuming Spec.package can only be called on concrete specs") -def test_packages_needed_to_bootstrap_compiler_packages(install_mockery, monkeypatch): - spec = spack.spec.Spec("trivial-install-test-package") - spec.concretize() - - def _conc_spec(compiler): - return spack.spec.Spec("pkg-a").concretized() - - # Ensure we can get past functions that are precluding obtaining - # packages. - monkeypatch.setattr(spack.compilers, "compilers_for_spec", _none) - monkeypatch.setattr(spack.compilers, "pkg_spec_for_compiler", _conc_spec) - monkeypatch.setattr(spack.spec.Spec, "concretize", _noop) - - packages = inst._packages_needed_to_bootstrap_compiler( - spec.compiler, spec.architecture, [spec.package] - ) - assert packages - - -def test_update_tasks_for_compiler_packages_as_compiler(mock_packages, config, monkeypatch): - spec = spack.spec.Spec("trivial-install-test-package").concretized() - installer = inst.PackageInstaller([spec.package], {}) - - # Add a task to the queue - installer._add_init_task(spec.package, installer.build_requests[0], False, {}) - - # monkeypatch to make the list of compilers be what we test - def fake_package_list(compiler, architecture, pkgs): - return [(spec.package, True)] - - monkeypatch.setattr(inst, "_packages_needed_to_bootstrap_compiler", fake_package_list) - - installer._add_bootstrap_compilers("fake", "fake", "fake", None, {}) - - # Check that the only task is now a compiler task - assert len(installer.build_pq) == 1 - assert installer.build_pq[0][1].compiler - - -@pytest.mark.skipif( - str(archspec.cpu.host().family) != "x86_64", - reason="OneAPI compiler is not supported on other architectures", -) -def test_bootstrapping_compilers_with_different_names_from_spec( - install_mockery, mutable_config, mock_fetch, archspec_host_is_spack_test_host -): - """Tests that, when we bootstrap '%oneapi' we can translate it to the - 'intel-oneapi-compilers' package. - """ - with spack.config.override("config:install_missing_compilers", True): - with spack.concretize.disable_compiler_existence_check(): - spec = spack.spec.Spec("trivial-install-test-package%oneapi@=22.2.0").concretized() - spec.package.do_install() - assert ( - spack.spec.CompilerSpec("oneapi@=22.2.0") in spack.compilers.all_compiler_specs() - ) - - def test_dump_packages_deps_ok(install_mockery, tmpdir, mock_packages): """Test happy path for dump_packages with dependencies.""" @@ -657,7 +589,7 @@ def test_check_deps_status_install_failure(install_mockery): installer = create_installer(["pkg-a"], {}) request = installer.build_requests[0] - with pytest.raises(inst.InstallError, match="install failure"): + with pytest.raises(spack.error.InstallError, match="install failure"): installer._check_deps_status(request) @@ -668,7 +600,7 @@ def test_check_deps_status_write_locked(install_mockery, monkeypatch): # Ensure the lock is not acquired monkeypatch.setattr(inst.PackageInstaller, "_ensure_locked", _not_locked) - with pytest.raises(inst.InstallError, match="write locked by another"): + with pytest.raises(spack.error.InstallError, match="write locked by another"): installer._check_deps_status(request) @@ -696,26 +628,6 @@ def test_check_deps_status_upstream(install_mockery, monkeypatch): assert inst.package_id(dep) in installer.installed -def test_add_bootstrap_compilers(install_mockery, monkeypatch): - from collections import defaultdict - - def _pkgs(compiler, architecture, pkgs): - spec = spack.spec.Spec("mpi").concretized() - return [(spec.package, True)] - - installer = create_installer(["trivial-install-test-package"], {}) - request = installer.build_requests[0] - all_deps = defaultdict(set) - - monkeypatch.setattr(inst, "_packages_needed_to_bootstrap_compiler", _pkgs) - installer._add_bootstrap_compilers("fake", "fake", [request.pkg], request, all_deps) - - ids = list(installer.build_tasks) - assert len(ids) == 1 - task = installer.build_tasks[ids[0]] - assert task.compiler - - def test_prepare_for_install_on_installed(install_mockery, monkeypatch): """Test of _prepare_for_install's early return for installed task path.""" installer = create_installer(["dependent-install"], {}) @@ -741,6 +653,76 @@ def test_installer_init_requests(install_mockery): assert request.pkg.name == spec_name +@pytest.mark.parametrize("transitive", [True, False]) +def test_install_spliced(install_mockery, mock_fetch, monkeypatch, capsys, transitive): + """Test installing a spliced spec""" + spec = spack.spec.Spec("splice-t").concretized() + dep = spack.spec.Spec("splice-h+foo").concretized() + + # Do the splice. + out = spec.splice(dep, transitive) + installer = create_installer([out], {"verbose": True, "fail_fast": True}) + installer.install() + for node in out.traverse(): + assert node.installed + assert node.build_spec.installed + + +@pytest.mark.parametrize("transitive", [True, False]) +def test_install_spliced_build_spec_installed(install_mockery, capfd, mock_fetch, transitive): + """Test installing a spliced spec with the build spec already installed""" + spec = spack.spec.Spec("splice-t").concretized() + dep = spack.spec.Spec("splice-h+foo").concretized() + + # Do the splice. + out = spec.splice(dep, transitive) + PackageInstaller([out.build_spec.package]).install() + + installer = create_installer([out], {"verbose": True, "fail_fast": True}) + installer._init_queue() + for _, task in installer.build_pq: + assert isinstance(task, inst.RewireTask if task.pkg.spec.spliced else inst.BuildTask) + installer.install() + for node in out.traverse(): + assert node.installed + assert node.build_spec.installed + + +@pytest.mark.not_on_windows("lacking windows support for binary installs") +@pytest.mark.parametrize("transitive", [True, False]) +@pytest.mark.parametrize( + "root_str", ["splice-t^splice-h~foo", "splice-h~foo", "splice-vt^splice-a"] +) +def test_install_splice_root_from_binary( + install_mockery, mock_fetch, mutable_temporary_mirror, transitive, root_str +): + """Test installing a spliced spec with the root available in binary cache""" + # Test splicing and rewiring a spec with the same name, different hash. + original_spec = spack.spec.Spec(root_str).concretized() + spec_to_splice = spack.spec.Spec("splice-h+foo").concretized() + + PackageInstaller([original_spec.package, spec_to_splice.package]).install() + + out = original_spec.splice(spec_to_splice, transitive) + + buildcache = SpackCommand("buildcache") + buildcache( + "push", + "--unsigned", + "--update-index", + mutable_temporary_mirror, + str(original_spec), + str(spec_to_splice), + ) + + uninstall = SpackCommand("uninstall") + uninstall("-ay") + + PackageInstaller([out.package], unsigned=True).install() + + assert len(spack.store.STORE.db.query()) == len(list(out.traverse())) + + def test_install_task_use_cache(install_mockery, monkeypatch): installer = create_installer(["trivial-install-test-package"], {}) request = installer.build_requests[0] @@ -751,6 +733,33 @@ def test_install_task_use_cache(install_mockery, monkeypatch): assert request.pkg_id in installer.installed +def test_install_task_requeue_build_specs(install_mockery, monkeypatch, capfd): + """Check that a missing build_spec spec is added by _install_task.""" + + # This test also ensures coverage of most of the new + # _requeue_with_build_spec_tasks method. + def _missing(*args, **kwargs): + return inst.ExecuteResult.MISSING_BUILD_SPEC + + # Set the configuration to ensure _requeue_with_build_spec_tasks actually + # does something. + with spack.config.override("config:install_missing_compilers", True): + installer = create_installer(["depb"], {}) + installer._init_queue() + request = installer.build_requests[0] + task = create_build_task(request.pkg) + + # Drop one of the specs so its task is missing before _install_task + popped_task = installer._pop_task() + assert inst.package_id(popped_task.pkg.spec) not in installer.build_tasks + + monkeypatch.setattr(task, "execute", _missing) + installer._install_task(task, None) + + # Ensure the dropped task/spec was added back by _install_task + assert inst.package_id(popped_task.pkg.spec) in installer.build_tasks + + def test_release_lock_write_n_exception(install_mockery, tmpdir, capsys): """Test _release_lock for supposed write lock with exception.""" installer = create_installer(["trivial-install-test-package"], {}) @@ -799,7 +808,7 @@ def test_requeue_task(install_mockery, capfd): ids = list(installer.build_tasks) assert len(ids) == 1 qtask = installer.build_tasks[ids[0]] - assert qtask.status == inst.STATUS_INSTALLING + assert qtask.status == inst.BuildStatus.INSTALLING assert qtask.sequence > task.sequence assert qtask.attempts == task.attempts + 1 @@ -846,8 +855,10 @@ def _chgrp(path, group, follow_symlinks=True): monkeypatch.setattr(prefs, "get_package_group", _get_group) monkeypatch.setattr(fs, "chgrp", _chgrp) - installer = create_installer(["trivial-install-test-package"], {}) - spec = installer.build_requests[0].pkg.spec + build_task = create_build_task( + spack.spec.Spec("trivial-install-test-package").concretized().package + ) + spec = build_task.request.pkg.spec fs.touchp(spec.prefix) metadatadir = spack.store.STORE.layout.metadata_path(spec) @@ -857,7 +868,7 @@ def _chgrp(path, group, follow_symlinks=True): metadatadir = None # Should fail with a "not a directory" error with pytest.raises(OSError, match=metadatadir): - installer._setup_install_dir(spec.package) + build_task._setup_install_dir(spec.package) out = str(capfd.readouterr()[0]) @@ -907,7 +918,7 @@ def test_install_uninstalled_deps(install_mockery, monkeypatch, capsys): monkeypatch.setattr(inst.PackageInstaller, "_update_failed", _noop) msg = "Cannot proceed with dependent-install" - with pytest.raises(inst.InstallError, match=msg): + with pytest.raises(spack.error.InstallError, match=msg): installer.install() out = str(capsys.readouterr()) @@ -921,7 +932,7 @@ def test_install_failed(install_mockery, monkeypatch, capsys): # Make sure the package is identified as failed monkeypatch.setattr(spack.database.FailureTracker, "has_failed", _true) - with pytest.raises(inst.InstallError, match="request failed"): + with pytest.raises(spack.error.InstallError, match="request failed"): installer.install() out = str(capsys.readouterr()) @@ -936,7 +947,7 @@ def test_install_failed_not_fast(install_mockery, monkeypatch, capsys): # Make sure the package is identified as failed monkeypatch.setattr(spack.database.FailureTracker, "has_failed", _true) - with pytest.raises(inst.InstallError, match="request failed"): + with pytest.raises(spack.error.InstallError, match="request failed"): installer.install() out = str(capsys.readouterr()) @@ -944,79 +955,74 @@ def test_install_failed_not_fast(install_mockery, monkeypatch, capsys): assert "Skipping build of pkg-a" in out -def test_install_fail_on_interrupt(install_mockery, monkeypatch): +def _interrupt(installer, task, install_status, **kwargs): + if task.pkg.name == "pkg-a": + raise KeyboardInterrupt("mock keyboard interrupt for pkg-a") + else: + return installer._real_install_task(task, None) + # installer.installed.add(task.pkg.name) + + +def test_install_fail_on_interrupt(install_mockery, mock_fetch, monkeypatch): """Test ctrl-c interrupted install.""" spec_name = "pkg-a" err_msg = "mock keyboard interrupt for {0}".format(spec_name) - - def _interrupt(installer, task, install_status, **kwargs): - if task.pkg.name == spec_name: - raise KeyboardInterrupt(err_msg) - else: - installer.installed.add(task.pkg.name) - - installer = create_installer([spec_name], {}) - + installer = create_installer([spec_name], {"fake": True}) + setattr(inst.PackageInstaller, "_real_install_task", inst.PackageInstaller._install_task) # Raise a KeyboardInterrupt error to trigger early termination monkeypatch.setattr(inst.PackageInstaller, "_install_task", _interrupt) with pytest.raises(KeyboardInterrupt, match=err_msg): installer.install() - assert "pkg-b" in installer.installed # ensure dependency of pkg-a is 'installed' - assert spec_name not in installer.installed + assert not any(i.startswith("pkg-a-") for i in installer.installed) + assert any( + i.startswith("pkg-b-") for i in installer.installed + ) # ensure dependency of a is 'installed' -def test_install_fail_single(install_mockery, monkeypatch): - """Test expected results for failure of single package.""" - spec_name = "pkg-a" - err_msg = "mock internal package build error for {0}".format(spec_name) +class MyBuildException(Exception): + pass - class MyBuildException(Exception): - pass - def _install(installer, task, install_status, **kwargs): - if task.pkg.name == spec_name: - raise MyBuildException(err_msg) - else: - installer.installed.add(task.pkg.name) +def _install_fail_my_build_exception(installer, task, install_status, **kwargs): + print(task, task.pkg.name) + if task.pkg.name == "pkg-a": + raise MyBuildException("mock internal package build error for pkg-a") + else: + # No need for more complex logic here because no splices + task.execute(install_status) + installer._update_installed(task) - installer = create_installer([spec_name], {}) + +def test_install_fail_single(install_mockery, mock_fetch, monkeypatch): + """Test expected results for failure of single package.""" + installer = create_installer(["pkg-a"], {"fake": True}) # Raise a KeyboardInterrupt error to trigger early termination - monkeypatch.setattr(inst.PackageInstaller, "_install_task", _install) + monkeypatch.setattr(inst.PackageInstaller, "_install_task", _install_fail_my_build_exception) - with pytest.raises(MyBuildException, match=err_msg): + with pytest.raises(MyBuildException, match="mock internal package build error for pkg-a"): installer.install() - assert "pkg-b" in installer.installed # ensure dependency of a is 'installed' - assert spec_name not in installer.installed + # ensure dependency of a is 'installed' and a is not + assert any(pkg_id.startswith("pkg-b-") for pkg_id in installer.installed) + assert not any(pkg_id.startswith("pkg-a-") for pkg_id in installer.installed) -def test_install_fail_multi(install_mockery, monkeypatch): +def test_install_fail_multi(install_mockery, mock_fetch, monkeypatch): """Test expected results for failure of multiple packages.""" - spec_name = "pkg-c" - err_msg = "mock internal package build error" - - class MyBuildException(Exception): - pass - - def _install(installer, task, install_status, **kwargs): - if task.pkg.name == spec_name: - raise MyBuildException(err_msg) - else: - installer.installed.add(task.pkg.name) - - installer = create_installer([spec_name, "pkg-a"], {}) + installer = create_installer(["pkg-a", "pkg-c"], {"fake": True}) # Raise a KeyboardInterrupt error to trigger early termination - monkeypatch.setattr(inst.PackageInstaller, "_install_task", _install) + monkeypatch.setattr(inst.PackageInstaller, "_install_task", _install_fail_my_build_exception) - with pytest.raises(inst.InstallError, match="Installation request failed"): + with pytest.raises(spack.error.InstallError, match="Installation request failed"): installer.install() - assert "pkg-a" in installer.installed # ensure the the second spec installed - assert spec_name not in installer.installed + # ensure the the second spec installed but not the first + assert any(pkg_id.startswith("pkg-c-") for pkg_id in installer.installed) + assert not any(pkg_id.startswith("pkg-a-") for pkg_id in installer.installed) def test_install_fail_fast_on_detect(install_mockery, monkeypatch, capsys): @@ -1030,7 +1036,7 @@ def test_install_fail_fast_on_detect(install_mockery, monkeypatch, capsys): # This will prevent b from installing, which will cause the build of c to be skipped. monkeypatch.setattr(spack.database.FailureTracker, "has_failed", _true) - with pytest.raises(inst.InstallError, match="after first install failure"): + with pytest.raises(spack.error.InstallError, match="after first install failure"): installer.install() assert b_id in installer.failed, "Expected b to be marked as failed" @@ -1058,7 +1064,7 @@ def test_install_fail_fast_on_except(install_mockery, monkeypatch, capsys): spack.package_base.PackageBase, "do_patch", _test_install_fail_fast_on_except_patch ) - with pytest.raises(inst.InstallError, match="mock patch failure"): + with pytest.raises(spack.error.InstallError, match="mock patch failure"): installer.install() out = str(capsys.readouterr()) @@ -1079,7 +1085,7 @@ def _requeued(installer, task, install_status): # Ensure don't continually requeue the task monkeypatch.setattr(inst.PackageInstaller, "_requeue_task", _requeued) - with pytest.raises(inst.InstallError, match="request failed"): + with pytest.raises(spack.error.InstallError, match="request failed"): installer.install() out = capfd.readouterr()[0] @@ -1110,7 +1116,7 @@ def _requeued(installer, task, install_status): # Ensure don't continually requeue the task monkeypatch.setattr(inst.PackageInstaller, "_requeue_task", _requeued) - with pytest.raises(inst.InstallError, match="request failed"): + with pytest.raises(spack.error.InstallError, match="request failed"): installer.install() assert b_pkg_id not in installer.installed @@ -1146,7 +1152,7 @@ def _requeued(installer, task, install_status): installer = create_installer(["pkg-b"], {}) - with pytest.raises(inst.InstallError, match="request failed"): + with pytest.raises(spack.error.InstallError, match="request failed"): installer.install() assert "b" not in installer.installed diff --git a/lib/spack/spack/test/llnl/util/filesystem.py b/lib/spack/spack/test/llnl/util/filesystem.py index 7803ecaf8c56b6..a0c98747698b20 100644 --- a/lib/spack/spack/test/llnl/util/filesystem.py +++ b/lib/spack/spack/test/llnl/util/filesystem.py @@ -1000,7 +1000,7 @@ def setup_test_dirs(): shutil.rmtree(tmpdir.join("f")) -@pytest.mark.skipif(sys.platform != "win32", reason="No-op on non Windows") +@pytest.mark.only_windows("Test is for Windows specific behavior") def test_windows_sfn(tmpdir): # first check some standard Windows locations # we know require sfn names diff --git a/lib/spack/spack/test/llnl/util/symlink.py b/lib/spack/spack/test/llnl/util/symlink.py index 73a9d05e972250..f4c1f168165869 100644 --- a/lib/spack/spack/test/llnl/util/symlink.py +++ b/lib/spack/spack/test/llnl/util/symlink.py @@ -5,7 +5,6 @@ """Tests for ``llnl/util/symlink.py``""" import os -import sys import tempfile import pytest @@ -37,7 +36,7 @@ def test_symlink_dir(tmpdir): assert symlink.islink(link_dir) -@pytest.mark.skipif(sys.platform != "win32", reason="Test is only for Windows") +@pytest.mark.only_windows("Test is for Windows specific behavior") def test_symlink_source_not_exists(tmpdir): """Test the symlink.symlink method for the case where a source path does not exist""" with tmpdir.as_cwd(): @@ -71,7 +70,7 @@ def test_symlink_src_relative_to_link(tmpdir): assert os.path.lexists(link_dir) -@pytest.mark.skipif(sys.platform != "win32", reason="Test is only for Windows") +@pytest.mark.only_windows("Test is for Windows specific behavior") def test_symlink_src_not_relative_to_link(tmpdir): """Test the symlink.symlink functionality where the source value does not exist relative to the link and not relative to the cwd. NOTE that this symlink api call is EXPECTED to raise @@ -98,7 +97,7 @@ def test_symlink_src_not_relative_to_link(tmpdir): assert not os.path.lexists(link_dir) -@pytest.mark.skipif(sys.platform != "win32", reason="Test is only for Windows") +@pytest.mark.only_windows("Test is for Windows specific behavior") def test_symlink_link_already_exists(tmpdir): """Test the symlink.symlink method for the case where a link already exists""" with tmpdir.as_cwd(): @@ -113,7 +112,7 @@ def test_symlink_link_already_exists(tmpdir): @pytest.mark.skipif(not symlink._windows_can_symlink(), reason="Test requires elevated privileges") -@pytest.mark.skipif(sys.platform != "win32", reason="Test is only for Windows") +@pytest.mark.only_windows("Test is for Windows specific behavior") def test_symlink_win_file(tmpdir): """Check that symlink.symlink makes a symlink file when run with elevated permissions""" with tmpdir.as_cwd(): @@ -130,7 +129,7 @@ def test_symlink_win_file(tmpdir): @pytest.mark.skipif(not symlink._windows_can_symlink(), reason="Test requires elevated privileges") -@pytest.mark.skipif(sys.platform != "win32", reason="Test is only for Windows") +@pytest.mark.only_windows("Test is for Windows specific behavior") def test_symlink_win_dir(tmpdir): """Check that symlink.symlink makes a symlink dir when run with elevated permissions""" with tmpdir.as_cwd(): @@ -147,7 +146,7 @@ def test_symlink_win_dir(tmpdir): assert not symlink._windows_is_junction(link_dir) -@pytest.mark.skipif(sys.platform != "win32", reason="Test is only for Windows") +@pytest.mark.only_windows("Test is for Windows specific behavior") def test_windows_create_junction(tmpdir): """Test the symlink._windows_create_junction method""" with tmpdir.as_cwd(): @@ -163,7 +162,7 @@ def test_windows_create_junction(tmpdir): assert not os.path.islink(junction_link_dir) -@pytest.mark.skipif(sys.platform != "win32", reason="Test is only for Windows") +@pytest.mark.only_windows("Test is for Windows specific behavior") def test_windows_create_hard_link(tmpdir): """Test the symlink._windows_create_hard_link method""" with tmpdir.as_cwd(): @@ -179,7 +178,7 @@ def test_windows_create_hard_link(tmpdir): assert not os.path.islink(link_file) -@pytest.mark.skipif(sys.platform != "win32", reason="Test is only for Windows") +@pytest.mark.only_windows("Test is for Windows specific behavior") def test_windows_create_link_dir(tmpdir): """Test the functionality of the windows_create_link method with a directory which should result in making a junction. @@ -198,7 +197,7 @@ def test_windows_create_link_dir(tmpdir): assert not os.path.islink(link_dir) -@pytest.mark.skipif(sys.platform != "win32", reason="Test is only for Windows") +@pytest.mark.only_windows("Test is for Windows specific behavior") def test_windows_create_link_file(tmpdir): """Test the functionality of the windows_create_link method with a file which should result in the creation of a hard link. It also tests the @@ -215,7 +214,7 @@ def test_windows_create_link_file(tmpdir): assert not symlink._windows_is_junction(link_file) -@pytest.mark.skipif(sys.platform != "win32", reason="Test is only for Windows") +@pytest.mark.only_windows("Test is for Windows specific behavior") def test_windows_read_link(tmpdir): """Makes sure symlink.readlink can read the link source for hard links and junctions on windows.""" diff --git a/lib/spack/spack/test/main.py b/lib/spack/spack/test/main.py index ed66df4c88d1fe..5c64865e56d169 100644 --- a/lib/spack/spack/test/main.py +++ b/lib/spack/spack/test/main.py @@ -8,10 +8,11 @@ import llnl.util.filesystem as fs +import spack import spack.paths import spack.util.executable as exe import spack.util.git -from spack.main import get_version, main +from spack.main import main pytestmark = pytest.mark.not_on_windows( "Test functionality supported but tests are failing on Win" @@ -29,7 +30,7 @@ def test_version_git_nonsense_output(tmpdir, working_env, monkeypatch): fs.set_executable(git) monkeypatch.setattr(spack.util.git, "git", lambda: exe.which(git)) - assert spack.spack_version == get_version() + assert spack.spack_version == spack.get_version() def test_version_git_fails(tmpdir, working_env, monkeypatch): @@ -44,7 +45,7 @@ def test_version_git_fails(tmpdir, working_env, monkeypatch): fs.set_executable(git) monkeypatch.setattr(spack.util.git, "git", lambda: exe.which(git)) - assert spack.spack_version == get_version() + assert spack.spack_version == spack.get_version() def test_git_sha_output(tmpdir, working_env, monkeypatch): @@ -62,17 +63,17 @@ def test_git_sha_output(tmpdir, working_env, monkeypatch): monkeypatch.setattr(spack.util.git, "git", lambda: exe.which(git)) expected = "{0} ({1})".format(spack.spack_version, sha) - assert expected == get_version() + assert expected == spack.get_version() def test_get_version_no_repo(tmpdir, monkeypatch): monkeypatch.setattr(spack.paths, "prefix", str(tmpdir)) - assert spack.spack_version == get_version() + assert spack.spack_version == spack.get_version() def test_get_version_no_git(tmpdir, working_env, monkeypatch): monkeypatch.setattr(spack.util.git, "git", lambda: None) - assert spack.spack_version == get_version() + assert spack.spack_version == spack.get_version() def test_main_calls_get_version(tmpdir, capsys, working_env, monkeypatch): @@ -96,4 +97,4 @@ def test_get_version_bad_git(tmpdir, working_env, monkeypatch): fs.set_executable(bad_git) monkeypatch.setattr(spack.util.git, "git", lambda: exe.which(bad_git)) - assert spack.spack_version == get_version() + assert spack.spack_version == spack.get_version() diff --git a/lib/spack/spack/test/mirror.py b/lib/spack/spack/test/mirror.py index 5609595f464a8c..10d375a7fb652b 100644 --- a/lib/spack/spack/test/mirror.py +++ b/lib/spack/spack/test/mirror.py @@ -15,7 +15,6 @@ import spack.fetch_strategy import spack.mirror import spack.patch -import spack.repo import spack.stage import spack.util.executable import spack.util.spack_json as sjson diff --git a/lib/spack/spack/test/modules/common.py b/lib/spack/spack/test/modules/common.py index f6688963460f74..7190689f824dec 100644 --- a/lib/spack/spack/test/modules/common.py +++ b/lib/spack/spack/test/modules/common.py @@ -12,10 +12,13 @@ import spack.cmd.modules import spack.config import spack.error +import spack.modules.common import spack.modules.tcl import spack.package_base -import spack.schema.modules +import spack.package_prefs +import spack.repo import spack.spec +from spack.installer import PackageInstaller from spack.modules.common import UpstreamModuleIndex from spack.spec import Spec @@ -168,7 +171,7 @@ def test_get_module_upstream(): old_index = spack.modules.common.upstream_module_index spack.modules.common.upstream_module_index = upstream_index - m1_path = spack.modules.common.get_module("tcl", s1, True) + m1_path = spack.modules.get_module("tcl", s1, True) assert m1_path == "/path/to/a" finally: spack.modules.common.upstream_module_index = old_index @@ -178,7 +181,7 @@ def test_get_module_upstream(): def test_load_installed_package_not_in_repo(install_mockery, mock_fetch, monkeypatch): """Test that installed packages that have been removed are still loadable""" spec = Spec("trivial-install-test-package").concretized() - spec.package.do_install() + PackageInstaller([spec.package], explicit=True).install() spack.modules.module_types["tcl"](spec, "default", True).write() def find_nothing(*args): @@ -190,7 +193,7 @@ def find_nothing(*args): with pytest.raises(spack.repo.UnknownPackageError): spec.package - module_path = spack.modules.common.get_module("tcl", spec, True) + module_path = spack.modules.get_module("tcl", spec, True) assert module_path spack.package_base.PackageBase.uninstall_by_spec(spec) @@ -216,8 +219,8 @@ def test_check_module_set_name(mutable_config): # Invalid module set names msg = "Valid module set names are" - with pytest.raises(spack.config.ConfigError, match=msg): + with pytest.raises(spack.error.ConfigError, match=msg): spack.cmd.modules.check_module_set_name("prefix_inspections") - with pytest.raises(spack.config.ConfigError, match=msg): + with pytest.raises(spack.error.ConfigError, match=msg): spack.cmd.modules.check_module_set_name("third") diff --git a/lib/spack/spack/test/modules/conftest.py b/lib/spack/spack/test/modules/conftest.py index 57396da426fb30..1feee7adcbaa82 100644 --- a/lib/spack/spack/test/modules/conftest.py +++ b/lib/spack/spack/test/modules/conftest.py @@ -6,11 +6,9 @@ import pytest -import spack.config -import spack.modules.common -import spack.paths +import spack.modules.lmod +import spack.modules.tcl import spack.spec -import spack.util.path @pytest.fixture() @@ -18,8 +16,10 @@ def modulefile_content(request): """Returns a function that generates the content of a module file as a list of lines.""" writer_cls = getattr(request.module, "writer_cls") - def _impl(spec_str, module_set_name="default", explicit=True): - spec = spack.spec.Spec(spec_str).concretized() + def _impl(spec_like, module_set_name="default", explicit=True): + if isinstance(spec_like, str): + spec_like = spack.spec.Spec(spec_like) + spec = spec_like.concretized() generator = writer_cls(spec, module_set_name, explicit) generator.write(overwrite=True) written_module = pathlib.Path(generator.layout.filename) diff --git a/lib/spack/spack/test/modules/lmod.py b/lib/spack/spack/test/modules/lmod.py index 43ee11ec492c3f..a985cb1b7e0f71 100644 --- a/lib/spack/spack/test/modules/lmod.py +++ b/lib/spack/spack/test/modules/lmod.py @@ -9,10 +9,13 @@ import archspec.cpu +import spack.config import spack.environment as ev import spack.main +import spack.modules.common import spack.modules.lmod import spack.spec +import spack.util.environment mpich_spec_string = "mpich@3.0.4" mpileaks_spec_string = "mpileaks" diff --git a/lib/spack/spack/test/modules/tcl.py b/lib/spack/spack/test/modules/tcl.py index 12cc770a89f088..6e0fd5c1a5450e 100644 --- a/lib/spack/spack/test/modules/tcl.py +++ b/lib/spack/spack/test/modules/tcl.py @@ -388,7 +388,7 @@ def test_setup_environment(self, modulefile_content, module_configuration): spec = spack.spec.Spec("mpileaks") spec.concretize() - content = modulefile_content(str(spec["callpath"])) + content = modulefile_content(spec["callpath"]) assert len([x for x in content if "setenv FOOBAR" in x]) == 1 assert len([x for x in content if "setenv FOOBAR {callpath}" in x]) == 1 diff --git a/lib/spack/spack/test/multimethod.py b/lib/spack/spack/test/multimethod.py index 84272a15d10d4b..7e5231ee936263 100644 --- a/lib/spack/spack/test/multimethod.py +++ b/lib/spack/spack/test/multimethod.py @@ -7,8 +7,8 @@ import pytest +import spack.config import spack.platforms -import spack.repo import spack.spec from spack.multimethod import NoSuchMethodError diff --git a/lib/spack/spack/test/oci/integration_test.py b/lib/spack/spack/test/oci/integration_test.py index 10ec12e406ed1c..85673e953aa148 100644 --- a/lib/spack/spack/test/oci/integration_test.py +++ b/lib/spack/spack/test/oci/integration_test.py @@ -17,7 +17,6 @@ import pytest import spack.binary_distribution -import spack.cmd.buildcache import spack.database import spack.environment as ev import spack.error diff --git a/lib/spack/spack/test/package_class.py b/lib/spack/spack/test/package_class.py index 07a82c5358564e..76ace98049c1f7 100644 --- a/lib/spack/spack/test/package_class.py +++ b/lib/spack/spack/test/package_class.py @@ -5,7 +5,7 @@ """Test class methods on Package objects. -This doesn't include methods on package *instances* (like do_install(), +This doesn't include methods on package *instances* (like do_patch(), etc.). Only methods like ``possible_dependencies()`` that deal with the static DSL metadata for packages. """ @@ -17,13 +17,16 @@ import llnl.util.filesystem as fs +import spack.compilers +import spack.config import spack.deptypes as dt +import spack.error import spack.install_test import spack.package_base import spack.repo import spack.spec from spack.build_systems.generic import Package -from spack.installer import InstallError +from spack.error import InstallError @pytest.fixture(scope="module") @@ -283,55 +286,3 @@ def compilers(compiler, arch_spec): error = capfd.readouterr()[1] assert "Skipping tests for package" in error assert "test requires missing compiler" in error - - -# TODO (post-34236): Remove when remove deprecated run_test(), etc. -@pytest.mark.parametrize( - "msg,installed,purpose,expected", - [ - ("do-nothing", False, "test: echo", "do-nothing"), - ("not installed", True, "test: echo not installed", "expected in prefix"), - ], -) -def test_package_run_test_install( - install_mockery, mock_fetch, capfd, msg, installed, purpose, expected -): - """Confirm expected outputs from run_test for installed/not installed exe.""" - s = spack.spec.Spec("trivial-smoke-test").concretized() - pkg = s.package - - pkg.run_test( - "echo", msg, expected=[expected], installed=installed, purpose=purpose, work_dir="." - ) - output = capfd.readouterr()[0] - assert expected in output - - -# TODO (post-34236): Remove when remove deprecated run_test(), etc. -@pytest.mark.parametrize( - "skip,failures,status", - [ - (True, 0, str(spack.install_test.TestStatus.SKIPPED)), - (False, 1, str(spack.install_test.TestStatus.FAILED)), - ], -) -def test_package_run_test_missing(install_mockery, mock_fetch, capfd, skip, failures, status): - """Confirm expected results from run_test for missing exe when skip or not.""" - s = spack.spec.Spec("trivial-smoke-test").concretized() - pkg = s.package - - pkg.run_test("no-possible-program", skip_missing=skip) - output = capfd.readouterr()[0] - assert len(pkg.tester.test_failures) == failures - assert status in output - - -# TODO (post-34236): Remove when remove deprecated run_test(), etc. -def test_package_run_test_fail_fast(install_mockery, mock_fetch): - """Confirm expected exception when run_test with fail_fast enabled.""" - s = spack.spec.Spec("trivial-smoke-test").concretized() - pkg = s.package - - with spack.config.override("config:fail_fast", True): - with pytest.raises(spack.install_test.TestFailure, match="Failed to find executable"): - pkg.run_test("no-possible-program") diff --git a/lib/spack/spack/test/packages.py b/lib/spack/spack/test/packages.py index 4f16fb71e83abe..ad4c797cf9d9c7 100644 --- a/lib/spack/spack/test/packages.py +++ b/lib/spack/spack/test/packages.py @@ -7,8 +7,11 @@ import pytest +import spack.build_systems.cmake as cmake import spack.directives +import spack.error import spack.fetch_strategy +import spack.package_base import spack.repo from spack.paths import mock_packages_path from spack.spec import Spec @@ -127,17 +130,17 @@ def test_urls_for_versions(mock_packages, config): def test_url_for_version_with_no_urls(mock_packages, config): spec = Spec("git-test") pkg_cls = spack.repo.PATH.get_pkg_class(spec.name) - with pytest.raises(spack.package_base.NoURLError): + with pytest.raises(spack.error.NoURLError): pkg_cls(spec).url_for_version("1.0") - with pytest.raises(spack.package_base.NoURLError): + with pytest.raises(spack.error.NoURLError): pkg_cls(spec).url_for_version("1.1") def test_custom_cmake_prefix_path(mock_packages, config): spec = Spec("depends-on-define-cmake-prefix-paths").concretized() - assert spack.build_environment.get_cmake_prefix_path(spec.package) == [ + assert cmake.get_cmake_prefix_path(spec.package) == [ spec["define-cmake-prefix-paths"].prefix.test ] diff --git a/lib/spack/spack/test/packaging.py b/lib/spack/spack/test/packaging.py index 2356515c05916d..0f2d89dcce0f74 100644 --- a/lib/spack/spack/test/packaging.py +++ b/lib/spack/spack/test/packaging.py @@ -21,14 +21,16 @@ import spack.binary_distribution as bindist import spack.cmd.buildcache as buildcache +import spack.config import spack.error import spack.fetch_strategy +import spack.mirror import spack.package_base -import spack.repo -import spack.store +import spack.stage import spack.util.gpg import spack.util.url as url_util from spack.fetch_strategy import URLFetchStrategy +from spack.installer import PackageInstaller from spack.paths import mock_gpg_keys_path from spack.relocate import ( macho_find_paths, @@ -49,7 +51,7 @@ def test_buildcache(mock_archive, tmp_path, monkeypatch, mutable_config): # Install a test package spec = Spec("trivial-install-test-package").concretized() monkeypatch.setattr(spec.package, "fetcher", URLFetchStrategy(url=mock_archive.url)) - spec.package.do_install() + PackageInstaller([spec.package], explicit=True).install() pkghash = "/" + str(spec.dag_hash(7)) # Put some non-relocatable file in there @@ -547,3 +549,35 @@ def test_fetch_external_package_is_noop(default_mock_concretization, fetching_no spec.external_path = "/some/where" assert spec.external spec.package.do_fetch() + + +@pytest.mark.parametrize( + "relocation_dict", + [ + {"/foo/bar/baz": "/a/b/c", "/foo/bar": "/a/b"}, + # Ensure correctness does not depend on the ordering of the dict + {"/foo/bar": "/a/b", "/foo/bar/baz": "/a/b/c"}, + ], +) +def test_macho_relocation_with_changing_projection(relocation_dict): + """Tests that prefix relocation is computed correctly when the prefixes to be relocated + contain a directory and its subdirectories. + + This happens when relocating to a new place AND changing the store projection. In that case we + might have a relocation dict like: + + /foo/bar/baz/ -> /a/b/c + /foo/bar -> /a/b + + What we need to check is that we don't end up in situations where we relocate to a mixture of + the two schemes, like /a/b/baz. + """ + original_rpath = "/foo/bar/baz/abcdef" + result = macho_find_paths( + [original_rpath], + deps=[], + idpath=None, + old_layout_root="/foo", + prefix_to_prefix=relocation_dict, + ) + assert result[original_rpath] == "/a/b/c/abcdef" diff --git a/lib/spack/spack/test/patch.py b/lib/spack/spack/test/patch.py index 4ec4cec7e79d67..4b5f31b904a64b 100644 --- a/lib/spack/spack/test/patch.py +++ b/lib/spack/spack/test/patch.py @@ -13,10 +13,13 @@ from llnl.util.filesystem import mkdirp, touch, working_dir +import spack.error +import spack.fetch_strategy import spack.patch import spack.paths import spack.repo -import spack.util.compression +import spack.spec +import spack.stage import spack.util.url as url_util from spack.spec import Spec from spack.stage import Stage @@ -434,7 +437,7 @@ def test_patch_no_file(): patch = spack.patch.Patch(fp, "nonexistent_file", 0, "") patch.path = "test" - with pytest.raises(spack.patch.NoSuchPatchError, match="No such patch:"): + with pytest.raises(spack.error.NoSuchPatchError, match="No such patch:"): patch.apply("") @@ -444,10 +447,10 @@ def test_patch_no_sha256(): fp = FakePackage("fake-package", "test", "fake-package") url = url_util.path_to_file_url("foo.tgz") match = "Compressed patches require 'archive_sha256' and patch 'sha256' attributes: file://" - with pytest.raises(spack.patch.PatchDirectiveError, match=match): + with pytest.raises(spack.error.PatchDirectiveError, match=match): spack.patch.UrlPatch(fp, url, sha256="", archive_sha256="") match = "URL patches require a sha256 checksum" - with pytest.raises(spack.patch.PatchDirectiveError, match=match): + with pytest.raises(spack.error.PatchDirectiveError, match=match): spack.patch.UrlPatch(fp, url, sha256="", archive_sha256="abc") diff --git a/lib/spack/spack/test/relocate.py b/lib/spack/spack/test/relocate.py index e02bc9ae3ac855..bceddbe7286014 100644 --- a/lib/spack/spack/test/relocate.py +++ b/lib/spack/spack/test/relocate.py @@ -9,14 +9,10 @@ import pytest -import spack.concretize -import spack.paths import spack.platforms import spack.relocate import spack.relocate_text as relocate_text -import spack.spec -import spack.store -import spack.tengine +import spack.repo import spack.util.executable pytestmark = pytest.mark.not_on_windows("Tests fail on Windows") diff --git a/lib/spack/spack/test/reporters.py b/lib/spack/spack/test/reporters.py index d1a78f6d7e4842..55ab019a8a48f0 100644 --- a/lib/spack/spack/test/reporters.py +++ b/lib/spack/spack/test/reporters.py @@ -10,7 +10,6 @@ import llnl.util.tty as tty import spack.reporters.extract -import spack.spec from spack.install_test import TestStatus from spack.reporters import CDash, CDashConfiguration @@ -121,26 +120,6 @@ def test_reporters_extract_missing_desc(): assert parts[2]["command"] == "exe1 1; exe2 2" -# TODO (post-34236): Remove this test when removing deprecated run_test(), etc. -def test_reporters_extract_xfail(): - fake_bin = fs.join_path(fake_install_prefix, "bin", "fake-app") - outputs = """ -==> Testing package fake-1.0-abcdefg -==> [2022-02-15-18:44:21.250165] test: test_fake: Checking fake imports -==> [2022-02-15-18:44:21.250175] Expecting return code in [3] -==> [2022-02-15-18:44:21.250200] '{0}' -{1} -""".format( - fake_bin, str(TestStatus.PASSED) - ).splitlines() - - parts = spack.reporters.extract.extract_test_parts("fake", outputs) - - assert len(parts) == 1 - parts[0]["command"] == fake_bin - parts[0]["completed"] == "Expected to fail" - - @pytest.mark.parametrize("state", [("not installed"), ("external")]) def test_reporters_extract_skipped(state): expected = "Skipped {0} package".format(state) @@ -157,34 +136,6 @@ def test_reporters_extract_skipped(state): parts[0]["completed"] == expected -# TODO (post-34236): Remove this test when removing deprecated run_test(), etc. -def test_reporters_skip(): - # This test ticks 3 boxes: - # 1) covers an as yet uncovered skip messages - # 2) covers debug timestamps - # 3) unrecognized output - fake_bin = fs.join_path(fake_install_prefix, "bin", "fake") - unknown_message = "missing timestamp" - outputs = """ -==> Testing package fake-1.0-abcdefg -==> [2022-02-15-18:44:21.250165, 123456] Detected the following modules: fake1 -==> {0} -==> [2022-02-15-18:44:21.250175, 123456] test: test_fake: running fake program -==> [2022-02-15-18:44:21.250200, 123456] '{1}' -INVALID -Results for test suite abcdefghijklmn -""".format( - unknown_message, fake_bin - ).splitlines() - - parts = spack.reporters.extract.extract_test_parts("fake", outputs) - - assert len(parts) == 1 - assert fake_bin in parts[0]["command"] - assert parts[0]["loglines"] == ["INVALID"] - assert parts[0]["elapsed"] == 0.0 - - def test_reporters_skip_new(): outputs = """ ==> [2023-04-06-15:55:13.094025] test: test_skip: diff --git a/lib/spack/spack/test/rewiring.py b/lib/spack/spack/test/rewiring.py index f082b1b1539964..9cf16ce6c27c28 100644 --- a/lib/spack/spack/test/rewiring.py +++ b/lib/spack/spack/test/rewiring.py @@ -9,8 +9,10 @@ import pytest +import spack.deptypes as dt import spack.rewiring import spack.store +from spack.installer import PackageInstaller from spack.spec import Spec from spack.test.relocate import text_in_bin @@ -21,14 +23,25 @@ args.extend(["g++", "patchelf"]) +def check_spliced_spec_prefixes(spliced_spec): + """check the file in the prefix has the correct paths""" + for node in spliced_spec.traverse(root=True): + text_file_path = os.path.join(node.prefix, node.name) + with open(text_file_path, "r") as f: + text = f.read() + print(text) + for modded_spec in node.traverse(root=True, deptype=dt.ALL & ~dt.BUILD): + print(modded_spec) + assert modded_spec.prefix in text + + @pytest.mark.requires_executables(*args) @pytest.mark.parametrize("transitive", [True, False]) def test_rewire_db(mock_fetch, install_mockery, transitive): """Tests basic rewiring without binary executables.""" spec = Spec("splice-t^splice-h~foo").concretized() dep = Spec("splice-h+foo").concretized() - spec.package.do_install() - dep.package.do_install() + PackageInstaller([spec.package, dep.package], explicit=True).install() spliced_spec = spec.splice(dep, transitive=transitive) assert spec.dag_hash() != spliced_spec.dag_hash() @@ -42,13 +55,8 @@ def test_rewire_db(mock_fetch, install_mockery, transitive): installed_in_db = rec.installed if rec else False assert installed_in_db - # check the file in the prefix has the correct paths - for node in spliced_spec.traverse(root=True): - text_file_path = os.path.join(node.prefix, node.name) - with open(text_file_path, "r") as f: - text = f.read() - for modded_spec in node.traverse(root=True): - assert modded_spec.prefix in text + # check for correct prefix paths + check_spliced_spec_prefixes(spliced_spec) @pytest.mark.requires_executables(*args) @@ -57,9 +65,9 @@ def test_rewire_bin(mock_fetch, install_mockery, transitive): """Tests basic rewiring with binary executables.""" spec = Spec("quux").concretized() dep = Spec("garply cflags=-g").concretized() - spec.package.do_install() - dep.package.do_install() + PackageInstaller([spec.package, dep.package], explicit=True).install() spliced_spec = spec.splice(dep, transitive=transitive) + assert spec.dag_hash() != spliced_spec.dag_hash() spack.rewiring.rewire(spliced_spec) @@ -86,8 +94,7 @@ def test_rewire_writes_new_metadata(mock_fetch, install_mockery): Accuracy of metadata is left to other tests.""" spec = Spec("quux").concretized() dep = Spec("garply cflags=-g").concretized() - spec.package.do_install() - dep.package.do_install() + PackageInstaller([spec.package, dep.package], explicit=True).install() spliced_spec = spec.splice(dep, transitive=True) spack.rewiring.rewire(spliced_spec) @@ -101,6 +108,8 @@ def test_rewire_writes_new_metadata(mock_fetch, install_mockery): ) assert os.path.exists(manifest_file_path) orig_node = spec[node.name] + if node == orig_node: + continue orig_manifest_file_path = os.path.join( orig_node.prefix, spack.store.STORE.layout.metadata_dir, @@ -129,8 +138,7 @@ def test_uninstall_rewired_spec(mock_fetch, install_mockery, transitive): """Test that rewired packages can be uninstalled as normal.""" spec = Spec("quux").concretized() dep = Spec("garply cflags=-g").concretized() - spec.package.do_install() - dep.package.do_install() + PackageInstaller([spec.package, dep.package], explicit=True).install() spliced_spec = spec.splice(dep, transitive=transitive) spack.rewiring.rewire(spliced_spec) spliced_spec.package.do_uninstall() @@ -150,3 +158,26 @@ def test_rewire_not_installed_fails(mock_fetch, install_mockery): match="failed due to missing install of build spec", ): spack.rewiring.rewire(spliced_spec) + + +def test_rewire_virtual(mock_fetch, install_mockery): + """Check installed package can successfully splice an alternate virtual implementation""" + dep = "splice-a" + alt_dep = "splice-h" + + spec = Spec(f"splice-vt^{dep}").concretized() + alt_spec = Spec(alt_dep).concretized() + + PackageInstaller([spec.package, alt_spec.package]).install() + + spliced_spec = spec.splice(alt_spec, True) + spack.rewiring.rewire(spliced_spec) + + # Confirm the original spec still has the original virtual implementation. + assert spec.satisfies(f"^{dep}") + + # Confirm the spliced spec uses the new virtual implementation. + assert spliced_spec.satisfies(f"^{alt_dep}") + + # check for correct prefix paths + check_spliced_spec_prefixes(spliced_spec) diff --git a/lib/spack/spack/test/sbang.py b/lib/spack/spack/test/sbang.py index e409f49c61bdad..d3c5ef2da46772 100644 --- a/lib/spack/spack/test/sbang.py +++ b/lib/spack/spack/test/sbang.py @@ -17,8 +17,8 @@ import llnl.util.filesystem as fs +import spack.config import spack.hooks.sbang as sbang -import spack.paths import spack.store import spack.util.spack_yaml as syaml from spack.util.executable import which diff --git a/lib/spack/spack/test/schema.py b/lib/spack/spack/test/schema.py index 2bf18f9195f26d..509bfd331a644a 100644 --- a/lib/spack/spack/test/schema.py +++ b/lib/spack/spack/test/schema.py @@ -105,25 +105,21 @@ def test_schema_validation(meta_schema, config_name): def test_deprecated_properties(module_suffixes_schema): # Test that an error is reported when 'error: True' - msg_fmt = r"deprecated properties detected [properties={properties}]" - module_suffixes_schema["deprecatedProperties"] = { - "properties": ["tcl"], - "message": msg_fmt, - "error": True, - } + msg_fmt = r"{name} is deprecated" + module_suffixes_schema["deprecatedProperties"] = [ + {"names": ["tcl"], "message": msg_fmt, "error": True} + ] v = spack.schema.Validator(module_suffixes_schema) data = {"tcl": {"all": {"suffixes": {"^python": "py"}}}} - expected_match = "deprecated properties detected" + expected_match = "tcl is deprecated" with pytest.raises(jsonschema.ValidationError, match=expected_match): v.validate(data) # Test that just a warning is reported when 'error: False' - module_suffixes_schema["deprecatedProperties"] = { - "properties": ["tcl"], - "message": msg_fmt, - "error": False, - } + module_suffixes_schema["deprecatedProperties"] = [ + {"names": ["tcl"], "message": msg_fmt, "error": False} + ] v = spack.schema.Validator(module_suffixes_schema) data = {"tcl": {"all": {"suffixes": {"^python": "py"}}}} # The next validation doesn't raise anymore diff --git a/lib/spack/spack/test/solver/intermediate.py b/lib/spack/spack/test/solver/intermediate.py index 42fdb316aa1bc9..f3d624cbd36dae 100644 --- a/lib/spack/spack/test/solver/intermediate.py +++ b/lib/spack/spack/test/solver/intermediate.py @@ -6,7 +6,6 @@ import pytest import spack.compilers -import spack.config import spack.spec from spack.concretize import UnavailableCompilerVersionError from spack.solver import asp diff --git a/lib/spack/spack/test/spec_dag.py b/lib/spack/spack/test/spec_dag.py index e66c3e1390cb9e..0d1fe4abcfccfb 100644 --- a/lib/spack/spack/test/spec_dag.py +++ b/lib/spack/spack/test/spec_dag.py @@ -9,10 +9,9 @@ import spack.deptypes as dt import spack.error -import spack.package_base -import spack.parser import spack.repo import spack.util.hash as hashutil +import spack.version from spack.dependency import Dependency from spack.spec import Spec @@ -742,7 +741,7 @@ def test_canonical_deptype(self): def test_invalid_literal_spec(self): # Can't give type 'build' to a top-level spec - with pytest.raises(spack.parser.SpecSyntaxError): + with pytest.raises(spack.error.SpecSyntaxError): Spec.from_literal({"foo:build": None}) # Can't use more than one ':' separator diff --git a/lib/spack/spack/test/spec_list.py b/lib/spack/spack/test/spec_list.py index 98f0f8b312a786..295665ecfbd8e6 100644 --- a/lib/spack/spack/test/spec_list.py +++ b/lib/spack/spack/test/spec_list.py @@ -6,6 +6,7 @@ import pytest +from spack.installer import PackageInstaller from spack.spec import Spec from spack.spec_list import SpecList @@ -200,8 +201,7 @@ def test_spec_list_exclude_with_abstract_hashes(self, mock_packages, install_moc # Put mpich in the database so it can be referred to by hash. mpich_1 = Spec("mpich+debug").concretized() mpich_2 = Spec("mpich~debug").concretized() - mpich_1.package.do_install(fake=True) - mpich_2.package.do_install(fake=True) + PackageInstaller([mpich_1.package, mpich_2.package], explicit=True, fake=True).install() # Create matrix and exclude +debug, which excludes the first mpich after its abstract hash # is resolved. diff --git a/lib/spack/spack/test/spec_semantics.py b/lib/spack/spack/test/spec_semantics.py index e11e663338e8e3..a821c53f2fb934 100644 --- a/lib/spack/spack/test/spec_semantics.py +++ b/lib/spack/spack/test/spec_semantics.py @@ -7,8 +7,16 @@ import pytest +import spack.deptypes as dt import spack.directives import spack.error +import spack.parser +import spack.paths +import spack.solver.asp +import spack.spec +import spack.store +import spack.variant +import spack.version as vn from spack.error import SpecError, UnsatisfiableSpecError from spack.spec import ( ArchSpec, @@ -26,6 +34,95 @@ ) +@pytest.fixture() +def setup_complex_splice(monkeypatch): + r"""Fixture to set up splicing for two complex specs. + + a_red is a spec in which every node has the variant color=red + c_blue is a spec in which every node has the variant color=blue + + a_red structure: + a - + / \ \ + b c \ + /|\ / \ | + e | d g@2 + \|/ + g@1 + + c_blue structure: + c + /|\ + d f \ + / |\ \ + g@2 e \ \ + \| / + g@3 + + This is not intended for use in tests that use virtuals, so ``_splice_match`` is monkeypatched + to avoid needing package files for each spec. + """ + + def splice_match(self, other, self_root, other_root): + return self.name == other.name + + def virtuals_provided(self, root): + return [] + + monkeypatch.setattr(Spec, "_splice_match", splice_match) + monkeypatch.setattr(Spec, "_virtuals_provided", virtuals_provided) + + g1_red = Spec("pkg-g color=red") + g1_red.versions = vn.VersionList([vn.Version("1")]) + g2_red = Spec("pkg-g color=red") + g2_red.versions = vn.VersionList([vn.Version("2")]) + g2_blue = Spec("pkg-g color=blue") + g2_blue.versions = vn.VersionList([vn.Version("2")]) + g3_blue = Spec("pkg-g color=blue") + g3_blue.versions = vn.VersionList([vn.Version("3")]) + + depflag = dt.LINK | dt.BUILD + e_red = Spec("pkg-e color=red") + e_red._add_dependency(g1_red, depflag=depflag, virtuals=()) + e_blue = Spec("pkg-e color=blue") + e_blue._add_dependency(g3_blue, depflag=depflag, virtuals=()) + + d_red = Spec("pkg-d color=red") + d_red._add_dependency(g1_red, depflag=depflag, virtuals=()) + d_blue = Spec("pkg-d color=blue") + d_blue._add_dependency(g2_blue, depflag=depflag, virtuals=()) + + b_red = Spec("pkg-b color=red") + b_red._add_dependency(e_red, depflag=depflag, virtuals=()) + b_red._add_dependency(d_red, depflag=depflag, virtuals=()) + b_red._add_dependency(g1_red, depflag=depflag, virtuals=()) + + f_blue = Spec("pkg-f color=blue") + f_blue._add_dependency(e_blue, depflag=depflag, virtuals=()) + f_blue._add_dependency(g3_blue, depflag=depflag, virtuals=()) + + c_red = Spec("pkg-c color=red") + c_red._add_dependency(d_red, depflag=depflag, virtuals=()) + c_red._add_dependency(g2_red, depflag=depflag, virtuals=()) + c_blue = Spec("pkg-c color=blue") + c_blue._add_dependency(d_blue, depflag=depflag, virtuals=()) + c_blue._add_dependency(f_blue, depflag=depflag, virtuals=()) + c_blue._add_dependency(g3_blue, depflag=depflag, virtuals=()) + + a_red = Spec("pkg-a color=red") + a_red._add_dependency(b_red, depflag=depflag, virtuals=()) + a_red._add_dependency(c_red, depflag=depflag, virtuals=()) + a_red._add_dependency(g2_red, depflag=depflag, virtuals=()) + + for spec in [e_red, e_blue, d_red, d_blue, b_red, f_blue, c_red, c_blue, a_red]: + spec.versions = vn.VersionList([vn.Version("1")]) + + a_red._mark_concrete() + c_blue._mark_concrete() + + return a_red, c_blue + + @pytest.mark.usefixtures("config", "mock_packages") class TestSpecSemantics: """Test satisfies(), intersects(), constrain() and other semantic operations on specs.""" @@ -228,6 +325,16 @@ class TestSpecSemantics: 'libelf cflags="-O3" cppflags="-Wall"', 'libelf cflags="-O3" cppflags="-Wall"', ), + ( + "libelf patches=ba5e334fe247335f3a116decfb5284100791dc302b5571ff5e664d8f9a6806c2", + "libelf patches=ba5e3", # constrain by a patch sha256 prefix + # TODO: the result below is not ideal. Prefix satisfies() works for patches, but + # constrain() isn't similarly special-cased to do the same thing + ( + "libelf patches=ba5e3," + "ba5e334fe247335f3a116decfb5284100791dc302b5571ff5e664d8f9a6806c2" + ), + ), ], ) def test_abstract_specs_can_constrain_each_other(self, lhs, rhs, expected): @@ -245,6 +352,65 @@ def test_abstract_specs_can_constrain_each_other(self, lhs, rhs, expected): assert c1 == c2 assert c1 == expected + @pytest.mark.parametrize( + "lhs,rhs,expected_lhs,expected_rhs,propagated_lhs,propagated_rhs", + [ + ( + 'mpich cppflags="-O3"', + 'mpich cppflags="-O2"', + 'mpich cppflags="-O3 -O2"', + 'mpich cppflags="-O2 -O3"', + [], + [], + ), + ( + 'mpich cflags="-O3 -g"', + 'mpich cflags=="-O3"', + 'mpich cflags="-O3 -g"', + 'mpich cflags=="-O3 -g"', + [("cflags", "-O3")], + [("cflags", "-O3")], + ), + ], + ) + def test_constrain_compiler_flags( + self, lhs, rhs, expected_lhs, expected_rhs, propagated_lhs, propagated_rhs + ): + """Constraining is asymmetric for compiler flags. Also note that + Spec equality does not account for flag propagation, so the checks + here are manual. + """ + lhs, rhs, expected_lhs, expected_rhs = ( + Spec(lhs), + Spec(rhs), + Spec(expected_lhs), + Spec(expected_rhs), + ) + + assert lhs.intersects(rhs) + assert rhs.intersects(lhs) + + c1, c2 = lhs.copy(), rhs.copy() + c1.constrain(rhs) + c2.constrain(lhs) + + assert c1 == expected_lhs + assert c2 == expected_rhs + for x in [c1, c2]: + assert x.satisfies(lhs) + assert x.satisfies(rhs) + + def _propagated_flags(_spec): + result = set() + for flagtype in _spec.compiler_flags: + for flag in _spec.compiler_flags[flagtype]: + if flag.propagate: + result.add((flagtype, flag)) + return result + + assert set(propagated_lhs) <= _propagated_flags(c1) + assert set(propagated_rhs) <= _propagated_flags(c2) + def test_constrain_specs_by_hash(self, default_mock_concretization, database): """Test that Specs specified only by their hashes can constrain eachother.""" mpich_dag_hash = "/" + database.query_one("mpich").dag_hash() @@ -311,14 +477,11 @@ def test_concrete_specs_which_satisfies_abstract(self, lhs, rhs, default_mock_co ("mpich~~foo", "mpich++foo"), ("mpich++foo", "mpich~~foo"), ("mpich foo==True", "mpich foo==False"), - ('mpich cppflags="-O3"', 'mpich cppflags="-O2"'), - ('mpich cppflags="-O3"', 'mpich cppflags=="-O3"'), ("libelf@0:2.0", "libelf@2.1:3"), ("libelf@0:2.5%gcc@4.8:4.9", "libelf@2.1:3%gcc@4.5:4.7"), ("libelf+debug", "libelf~debug"), ("libelf+debug~foo", "libelf+debug+foo"), ("libelf debug=True", "libelf debug=False"), - ('libelf cppflags="-O3"', 'libelf cppflags="-O2"'), ("libelf platform=test target=be os=be", "libelf target=fe os=fe"), ("namespace=builtin.mock", "namespace=builtin"), ], @@ -347,10 +510,6 @@ def test_constraining_abstract_specs_with_empty_intersection(self, lhs, rhs): ("mpich", "mpich++foo"), ("mpich", "mpich~~foo"), ("mpich", "mpich foo==1"), - # Flags semantics is currently different from other variant - ("mpich", 'mpich cflags="-O3"'), - ("mpich cflags=-O3", 'mpich cflags="-O3 -Ofast"'), - ("mpich cflags=-O2", 'mpich cflags="-O3"'), ("multivalue-variant foo=bar", "multivalue-variant +foo"), ("multivalue-variant foo=bar", "multivalue-variant ~foo"), ("multivalue-variant fee=bar", "multivalue-variant fee=baz"), @@ -647,13 +806,6 @@ def test_exceptional_paths_for_constructor(self): def test_spec_formatting(self, default_mock_concretization): spec = default_mock_concretization("multivalue-variant cflags=-O2") - # Since the default is the full spec see if the string rep of - # spec is the same as the output of spec.format() - # ignoring whitespace (though should we?) and ignoring dependencies - spec_string = str(spec) - idx = spec_string.index(" ^") - assert spec_string[:idx] == spec.format().strip() - # Testing named strings ie {string} and whether we get # the correct component # Mixed case intentional to test both @@ -689,6 +841,13 @@ def test_spec_formatting(self, default_mock_concretization): ("{/hash}", "/", lambda s: "/" + s.dag_hash()), ] + variants_segments = [ + ("{variants.debug}", spec, "debug"), + ("{variants.foo}", spec, "foo"), + ("{^pkg-a.variants.bvv}", spec["pkg-a"], "bvv"), + ("{^pkg-a.variants.foo}", spec["pkg-a"], "foo"), + ] + other_segments = [ ("{spack_root}", spack.paths.spack_root), ("{spack_install}", spack.store.STORE.layout.root), @@ -716,6 +875,12 @@ def check_prop(check_spec, fmt_str, prop, getter): callpath, fmt_str = depify("callpath", named_str, sigil) assert spec.format(fmt_str) == getter(callpath) + for named_str, test_spec, variant_name in variants_segments: + assert test_spec.format(named_str) == str(test_spec.variants[variant_name]) + assert test_spec.format(named_str[:-1] + ".value}") == str( + test_spec.variants[variant_name].value + ) + for named_str, expected in other_segments: actual = spec.format(named_str) assert expected == actual @@ -775,6 +940,7 @@ def test_spec_formatting_sigil_mismatches(self, default_mock_concretization, fmt r"{dag_hash}", r"{foo}", r"{+variants.debug}", + r"{variants.this_variant_does_not_exist}", ], ) def test_spec_formatting_bad_formats(self, default_mock_concretization, fmt_str): @@ -884,6 +1050,154 @@ def test_splice(self, transitive, default_mock_concretization): # Finally, the spec should know it's been spliced: assert out.spliced + def test_splice_intransitive_complex(self, setup_complex_splice): + a_red, c_blue = setup_complex_splice + + spliced = a_red.splice(c_blue, transitive=False) + assert spliced.satisfies( + "pkg-a color=red ^pkg-b color=red ^pkg-c color=blue " + "^pkg-d color=red ^pkg-e color=red ^pkg-f color=blue ^pkg-g@2 color=red" + ) + assert set(spliced.dependencies(deptype=dt.BUILD)) == set() + assert spliced.build_spec == a_red + + # We cannot check spliced["b"].build_spec is spliced["b"] because Spec.__getitem__ creates + # a new wrapper object on each invocation. So we select once and check on that object + # For the rest of the unchanged specs we will just check the s._build_spec is None. + b = spliced["pkg-b"] + assert b == a_red["pkg-b"] + assert b.build_spec is b + assert set(b.dependents()) == {spliced} + + assert spliced["pkg-c"].satisfies( + "pkg-c color=blue ^pkg-d color=red ^pkg-e color=red " + "^pkg-f color=blue ^pkg-g@2 color=red" + ) + assert set(spliced["pkg-c"].dependencies(deptype=dt.BUILD)) == set() + assert spliced["pkg-c"].build_spec == c_blue + assert set(spliced["pkg-c"].dependents()) == {spliced} + + assert spliced["pkg-d"] == a_red["pkg-d"] + assert spliced["pkg-d"]._build_spec is None + # Since D had a parent changed, it has a split edge for link vs build dependent + # note: spliced["b"] == b_red, referenced differently to preserve logic + assert set(spliced["pkg-d"].dependents()) == { + spliced["pkg-b"], + spliced["pkg-c"], + a_red["pkg-c"], + } + assert set(spliced["pkg-d"].dependents(deptype=dt.BUILD)) == { + a_red["pkg-b"], + a_red["pkg-c"], + } + + assert spliced["pkg-e"] == a_red["pkg-e"] + assert spliced["pkg-e"]._build_spec is None + # Because a copy of e is used, it does not have dependnets in the original specs + assert set(spliced["pkg-e"].dependents()) == {spliced["pkg-b"], spliced["pkg-f"]} + # Build dependent edge to f because f originally dependended on the e this was copied from + assert set(spliced["pkg-e"].dependents(deptype=dt.BUILD)) == {spliced["pkg-b"]} + + assert spliced["pkg-f"].satisfies("pkg-f color=blue ^pkg-e color=red ^pkg-g@2 color=red") + assert set(spliced["pkg-f"].dependencies(deptype=dt.BUILD)) == set() + assert spliced["pkg-f"].build_spec == c_blue["pkg-f"] + assert set(spliced["pkg-f"].dependents()) == {spliced["pkg-c"]} + + # spliced["pkg-g"] is g2, but spliced["pkg-b"]["pkg-g"] is g1 + assert spliced["pkg-g"] == a_red["pkg-g"] + assert spliced["pkg-g"]._build_spec is None + assert set(spliced["pkg-g"].dependents(deptype=dt.LINK)) == { + spliced, + spliced["pkg-c"], + spliced["pkg-f"], + a_red["pkg-c"], + } + + assert spliced["pkg-b"]["pkg-g"] == a_red["pkg-b"]["pkg-g"] + assert spliced["pkg-b"]["pkg-g"]._build_spec is None + assert set(spliced["pkg-b"]["pkg-g"].dependents()) == { + spliced["pkg-b"], + spliced["pkg-d"], + spliced["pkg-e"], + } + + for edge in spliced.traverse_edges(cover="edges", deptype=dt.LINK | dt.RUN): + # traverse_edges creates a synthetic edge with no deptypes to the root + if edge.depflag: + depflag = dt.LINK + if not edge.parent.spliced: + depflag |= dt.BUILD + assert edge.depflag == depflag + + def test_splice_transitive_complex(self, setup_complex_splice): + a_red, c_blue = setup_complex_splice + + spliced = a_red.splice(c_blue, transitive=True) + assert spliced.satisfies( + "pkg-a color=red ^pkg-b color=red ^pkg-c color=blue ^pkg-d color=blue " + "^pkg-e color=blue ^pkg-f color=blue ^pkg-g@3 color=blue" + ) + assert set(spliced.dependencies(deptype=dt.BUILD)) == set() + assert spliced.build_spec == a_red + + assert spliced["pkg-b"].satisfies( + "pkg-b color=red ^pkg-d color=blue ^pkg-e color=blue ^pkg-g@2 color=blue" + ) + assert set(spliced["pkg-b"].dependencies(deptype=dt.BUILD)) == set() + assert spliced["pkg-b"].build_spec == a_red["pkg-b"] + assert set(spliced["pkg-b"].dependents()) == {spliced} + + # We cannot check spliced["c"].build_spec is spliced["c"] because Spec.__getitem__ creates + # a new wrapper object on each invocation. So we select once and check on that object + # For the rest of the unchanged specs we will just check the s._build_spec is None. + c = spliced["pkg-c"] + assert c == c_blue + assert c.build_spec is c + assert set(c.dependents()) == {spliced} + + assert spliced["pkg-d"] == c_blue["pkg-d"] + assert spliced["pkg-d"]._build_spec is None + assert set(spliced["pkg-d"].dependents()) == {spliced["pkg-b"], spliced["pkg-c"]} + + assert spliced["pkg-e"] == c_blue["pkg-e"] + assert spliced["pkg-e"]._build_spec is None + assert set(spliced["pkg-e"].dependents()) == {spliced["pkg-b"], spliced["pkg-f"]} + + assert spliced["pkg-f"] == c_blue["pkg-f"] + assert spliced["pkg-f"]._build_spec is None + assert set(spliced["pkg-f"].dependents()) == {spliced["pkg-c"]} + + # spliced["g"] is g3, but spliced["d"]["g"] is g1 + assert spliced["pkg-g"] == c_blue["pkg-g"] + assert spliced["pkg-g"]._build_spec is None + assert set(spliced["pkg-g"].dependents(deptype=dt.LINK)) == { + spliced, + spliced["pkg-b"], + spliced["pkg-c"], + spliced["pkg-e"], + spliced["pkg-f"], + } + # Because a copy of g3 is used, it does not have dependents in the original specs + # It has build dependents on these spliced specs because it is an unchanged dependency + # for them + assert set(spliced["pkg-g"].dependents(deptype=dt.BUILD)) == { + spliced["pkg-c"], + spliced["pkg-e"], + spliced["pkg-f"], + } + + assert spliced["pkg-d"]["pkg-g"] == c_blue["pkg-d"]["pkg-g"] + assert spliced["pkg-d"]["pkg-g"]._build_spec is None + assert set(spliced["pkg-d"]["pkg-g"].dependents()) == {spliced["pkg-d"]} + + for edge in spliced.traverse_edges(cover="edges", deptype=dt.LINK | dt.RUN): + # traverse_edges creates a synthetic edge with no deptypes to the root + if edge.depflag: + depflag = dt.LINK + if not edge.parent.spliced: + depflag |= dt.BUILD + assert edge.depflag == depflag + @pytest.mark.parametrize("transitive", [True, False]) def test_splice_with_cached_hashes(self, default_mock_concretization, transitive): spec = default_mock_concretization("splice-t") @@ -1004,7 +1318,7 @@ def test_target_constraints(self, spec, constraint, expected_result): @pytest.mark.regression("13124") def test_error_message_unknown_variant(self): s = Spec("mpileaks +unknown") - with pytest.raises(UnknownVariantError, match=r"package has no such"): + with pytest.raises(UnknownVariantError): s.concretize() @pytest.mark.regression("18527") @@ -1016,7 +1330,7 @@ def test_satisfies_dependencies_ordered(self): @pytest.mark.parametrize("transitive", [True, False]) def test_splice_swap_names(self, default_mock_concretization, transitive): - spec = default_mock_concretization("splice-t") + spec = default_mock_concretization("splice-vt") dep = default_mock_concretization("splice-a+foo") out = spec.splice(dep, transitive) assert dep.name in out @@ -1024,10 +1338,10 @@ def test_splice_swap_names(self, default_mock_concretization, transitive): @pytest.mark.parametrize("transitive", [True, False]) def test_splice_swap_names_mismatch_virtuals(self, default_mock_concretization, transitive): - spec = default_mock_concretization("splice-t") - dep = default_mock_concretization("splice-vh+foo") - with pytest.raises(spack.spec.SpliceError, match="will not provide the same virtuals."): - spec.splice(dep, transitive) + vt = default_mock_concretization("splice-vt") + vh = default_mock_concretization("splice-vh+foo") + with pytest.raises(spack.spec.SpliceError, match="virtual"): + vt.splice(vh, transitive) def test_spec_override(self): init_spec = Spec("pkg-a foo=baz foobar=baz cflags=-O3 cxxflags=-O1") @@ -1043,6 +1357,20 @@ def test_spec_override(self): assert new_spec.compiler_flags["cflags"] == ["-O2"] assert new_spec.compiler_flags["cxxflags"] == ["-O1"] + def test_spec_override_with_nonexisting_variant(self): + init_spec = Spec("pkg-a foo=baz foobar=baz cflags=-O3 cxxflags=-O1") + change_spec = Spec("pkg-a baz=fee") + with pytest.raises(ValueError): + Spec.override(init_spec, change_spec) + + def test_spec_override_with_variant_not_in_init_spec(self): + init_spec = Spec("pkg-a foo=baz foobar=baz cflags=-O3 cxxflags=-O1") + change_spec = Spec("pkg-a +bvv ~lorem_ipsum") + new_spec = Spec.override(init_spec, change_spec) + new_spec.concretize() + assert "+bvv" in new_spec + assert "~lorem_ipsum" in new_spec + @pytest.mark.parametrize( "spec_str,specs_in_dag", [ @@ -1451,8 +1779,8 @@ def test_abstract_contains_semantic(lhs, rhs, expected, mock_packages): (CompilerSpec, "gcc@5", "gcc@5-tag", (True, False, True)), # Flags (flags are a map, so for convenience we initialize a full Spec) # Note: the semantic is that of sv variants, not mv variants - (Spec, "cppflags=-foo", "cppflags=-bar", (False, False, False)), - (Spec, "cppflags='-bar -foo'", "cppflags=-bar", (False, False, False)), + (Spec, "cppflags=-foo", "cppflags=-bar", (True, False, False)), + (Spec, "cppflags='-bar -foo'", "cppflags=-bar", (True, True, False)), (Spec, "cppflags=-foo", "cppflags=-foo", (True, True, True)), (Spec, "cppflags=-foo", "cflags=-foo", (True, False, False)), # Versions diff --git a/lib/spack/spack/test/spec_syntax.py b/lib/spack/spack/test/spec_syntax.py index affa69e48cad00..22942862ebb997 100644 --- a/lib/spack/spack/test/spec_syntax.py +++ b/lib/spack/spack/test/spec_syntax.py @@ -9,10 +9,12 @@ import pytest +import spack.binary_distribution import spack.cmd +import spack.parser import spack.platforms.test +import spack.repo import spack.spec -import spack.variant from spack.parser import ( UNIX_FILENAME, WINDOWS_FILENAME, @@ -549,6 +551,20 @@ def _specfile_for(spec_str, filename): ], "^[deptypes=build,link] zlib", ), + ( + "^[deptypes=link] zlib ^[deptypes=build] zlib", + [ + Token(TokenType.START_EDGE_PROPERTIES, value="^["), + Token(TokenType.KEY_VALUE_PAIR, value="deptypes=link"), + Token(TokenType.END_EDGE_PROPERTIES, value="]"), + Token(TokenType.UNQUALIFIED_PACKAGE_NAME, value="zlib"), + Token(TokenType.START_EDGE_PROPERTIES, value="^["), + Token(TokenType.KEY_VALUE_PAIR, value="deptypes=build"), + Token(TokenType.END_EDGE_PROPERTIES, value="]"), + Token(TokenType.UNQUALIFIED_PACKAGE_NAME, value="zlib"), + ], + "^[deptypes=link] zlib ^[deptypes=build] zlib", + ), ( "git-test@git.foo/bar", [ @@ -990,6 +1006,8 @@ def test_disambiguate_hash_by_spec(spec1, spec2, constraint, mock_packages, monk ("x target=be platform=test os=be os=fe", "'platform'"), # Dependencies ("^[@foo] zlib", "edge attributes"), + ("x ^[deptypes=link]foo ^[deptypes=run]foo", "conflicting dependency types"), + ("x ^[deptypes=build,link]foo ^[deptypes=link]foo", "conflicting dependency types"), # TODO: Remove this as soon as use variants are added and we can parse custom attributes ("^[foo=bar] zlib", "edge attributes"), # Propagating reserved names generates a parse error diff --git a/lib/spack/spack/test/stage.py b/lib/spack/spack/test/stage.py index 084d95475cf6fe..36a9e2eef25361 100644 --- a/lib/spack/spack/test/stage.py +++ b/lib/spack/spack/test/stage.py @@ -17,9 +17,9 @@ from llnl.util.filesystem import getuid, mkdirp, partition_path, touch, working_dir from llnl.util.symlink import readlink +import spack.config import spack.error import spack.fetch_strategy -import spack.paths import spack.stage import spack.util.executable import spack.util.url as url_util diff --git a/lib/spack/spack/test/svn_fetch.py b/lib/spack/spack/test/svn_fetch.py index 0b3750001431c1..de47864fc2497e 100644 --- a/lib/spack/spack/test/svn_fetch.py +++ b/lib/spack/spack/test/svn_fetch.py @@ -10,7 +10,6 @@ from llnl.util.filesystem import mkdirp, touch, working_dir import spack.config -import spack.repo from spack.fetch_strategy import SvnFetchStrategy from spack.spec import Spec from spack.stage import Stage diff --git a/lib/spack/spack/test/tag.py b/lib/spack/spack/test/tag.py index 6a979eca4b6b7d..e429b9f4578e2f 100644 --- a/lib/spack/spack/test/tag.py +++ b/lib/spack/spack/test/tag.py @@ -7,7 +7,7 @@ import pytest -import spack.cmd.install +import spack.repo import spack.tag from spack.main import SpackCommand diff --git a/lib/spack/spack/test/test_suite.py b/lib/spack/spack/test/test_suite.py index 8820abe602e070..60a54e7171bba2 100644 --- a/lib/spack/spack/test/test_suite.py +++ b/lib/spack/spack/test/test_suite.py @@ -4,13 +4,16 @@ # SPDX-License-Identifier: (Apache-2.0 OR MIT) import collections import os +import sys import pytest from llnl.util.filesystem import join_path, mkdirp, touch +import spack.config import spack.install_test import spack.spec +import spack.util.executable from spack.install_test import TestStatus from spack.util.executable import which @@ -315,8 +318,11 @@ def test_test_part_pass(install_mockery, mock_fetch, mock_test_stage): name = "test_echo" msg = "nothing" with spack.install_test.test_part(pkg, name, "echo"): - echo = which("echo") - echo(msg) + if sys.platform == "win32": + print(msg) + else: + echo = which("echo") + echo(msg) for part_name, status in pkg.tester.test_parts.items(): assert part_name.endswith(name) diff --git a/lib/spack/spack/test/url_fetch.py b/lib/spack/spack/test/url_fetch.py index b86a2f5cce1956..f103244a1067de 100644 --- a/lib/spack/spack/test/url_fetch.py +++ b/lib/spack/spack/test/url_fetch.py @@ -17,10 +17,11 @@ import spack.config import spack.error import spack.fetch_strategy as fs -import spack.repo +import spack.url import spack.util.crypto as crypto import spack.util.executable import spack.util.web as web_util +import spack.version from spack.spec import Spec from spack.stage import Stage from spack.util.executable import which diff --git a/lib/spack/spack/test/util/executable.py b/lib/spack/spack/test/util/executable.py index d854ec426e2ddc..9b0536eba9510c 100644 --- a/lib/spack/spack/test/util/executable.py +++ b/lib/spack/spack/test/util/executable.py @@ -12,6 +12,7 @@ import llnl.util.filesystem as fs import spack +import spack.main import spack.util.executable as ex from spack.hooks.sbang import filter_shebangs_in_directory diff --git a/lib/spack/spack/test/util/package_hash.py b/lib/spack/spack/test/util/package_hash.py index 5a0251b2d02e08..cfadae40be3eaf 100644 --- a/lib/spack/spack/test/util/package_hash.py +++ b/lib/spack/spack/test/util/package_hash.py @@ -338,15 +338,15 @@ def test_remove_complex_package_logic_filtered(): ("grads", "rrlmwml3f2frdnqavmro3ias66h5b2ce"), ("llvm", "nufffum5dabmaf4l5tpfcblnbfjknvd3"), # has @when("@4.1.0") and raw unicode literals - ("mfem", "lbhr43gm5zdye2yhqznucxb4sg6vhryl"), - ("mfem@4.0.0", "lbhr43gm5zdye2yhqznucxb4sg6vhryl"), - ("mfem@4.1.0", "vjdjdgjt6nyo7ited2seki5epggw5gza"), + ("mfem", "whwftpqbjvzncmb52oz6izkanbha2uji"), + ("mfem@4.0.0", "whwftpqbjvzncmb52oz6izkanbha2uji"), + ("mfem@4.1.0", "bpi7of3xelo7fr3ta2lm6bmiruijnxcg"), # has @when("@1.5.0:") ("py-torch", "qs7djgqn7dy7r3ps4g7hv2pjvjk4qkhd"), ("py-torch@1.0", "qs7djgqn7dy7r3ps4g7hv2pjvjk4qkhd"), ("py-torch@1.6", "p4ine4hc6f2ik2f2wyuwieslqbozll5w"), # has a print with multiple arguments - ("legion", "efpfd2c4pzhsbyc3o7plqcmtwm6b57yh"), + ("legion", "bq2etsik5l6pbryxmbhfhzynci56ruy4"), # has nested `with when()` blocks and loops ("trilinos", "vqrgscjrla4hi7bllink7v6v6dwxgc2p"), ], diff --git a/lib/spack/spack/test/util/path.py b/lib/spack/spack/test/util/path.py index 9d7f66c60b323a..951502d64767de 100644 --- a/lib/spack/spack/test/util/path.py +++ b/lib/spack/spack/test/util/path.py @@ -18,6 +18,7 @@ "==> [2021-06-23-15:59:05.020387] './configure' '--prefix=/Users/gamblin2/padding-log-test/opt/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_pla/darwin-bigsur-skylake/apple-clang-12.0.5/zlib-1.2.11-74mwnxgn6nujehpyyalhwizwojwn5zga", # noqa: E501 "/Users/gamblin2/Workspace/spack/lib/spack/env/clang/clang -dynamiclib -install_name /Users/gamblin2/padding-log-test/opt/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_pla/darwin-bigsur-skylake/apple-clang-12.0.5/zlib-1.2.11-74mwnxgn6nujehpyyalhwizwojwn5zga/lib/libz.1.dylib -compatibility_version 1 -current_version 1.2.11 -fPIC -O2 -fPIC -DHAVE_HIDDEN -o libz.1.2.11.dylib adler32.lo crc32.lo deflate.lo infback.lo inffast.lo inflate.lo inftrees.lo trees.lo zutil.lo compress.lo uncompr.lo gzclose.lo gzlib.lo gzread.lo gzwrite.lo -lc", # noqa: E501 "rm -f /Users/gamblin2/padding-log-test/opt/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_placeholder__/__spack_path_pla/darwin-bigsur-skylake/apple-clang-12.0.5/zlib-1.2.11-74mwnxgn6nujehpyyalhwizwojwn5zga/lib/libz.a", # noqa: E501 + "rm -f /Users/gamblin2/padding-log-test/opt/__spack_path_placeholder__/__spack_path_placeholder___/darwin-bigsur-skylake/apple-clang-12.0.5/zlib-1.2.11-74mwnxgn6nujehpyyalhwizwojwn5zga/lib/libz.a", # noqa: E501 ] @@ -26,6 +27,7 @@ "==> [2021-06-23-15:59:05.020387] './configure' '--prefix=/Users/gamblin2/padding-log-test/opt/[padded-to-512-chars]/darwin-bigsur-skylake/apple-clang-12.0.5/zlib-1.2.11-74mwnxgn6nujehpyyalhwizwojwn5zga", # noqa: E501 "/Users/gamblin2/Workspace/spack/lib/spack/env/clang/clang -dynamiclib -install_name /Users/gamblin2/padding-log-test/opt/[padded-to-512-chars]/darwin-bigsur-skylake/apple-clang-12.0.5/zlib-1.2.11-74mwnxgn6nujehpyyalhwizwojwn5zga/lib/libz.1.dylib -compatibility_version 1 -current_version 1.2.11 -fPIC -O2 -fPIC -DHAVE_HIDDEN -o libz.1.2.11.dylib adler32.lo crc32.lo deflate.lo infback.lo inffast.lo inflate.lo inftrees.lo trees.lo zutil.lo compress.lo uncompr.lo gzclose.lo gzlib.lo gzread.lo gzwrite.lo -lc", # noqa: E501 "rm -f /Users/gamblin2/padding-log-test/opt/[padded-to-512-chars]/darwin-bigsur-skylake/apple-clang-12.0.5/zlib-1.2.11-74mwnxgn6nujehpyyalhwizwojwn5zga/lib/libz.a", # noqa: E501 + "rm -f /Users/gamblin2/padding-log-test/opt/[padded-to-91-chars]/darwin-bigsur-skylake/apple-clang-12.0.5/zlib-1.2.11-74mwnxgn6nujehpyyalhwizwojwn5zga/lib/libz.a", # noqa: E501 ] @@ -107,6 +109,15 @@ def test_output_filtering(self, capfd, install_mockery, mutable_config): out, err = capfd.readouterr() assert padding_string not in out + def test_pad_on_path_sep_boundary(self): + """Ensure that padded paths do not end with path separator.""" + pad_length = len(sup.SPACK_PATH_PADDING_CHARS) + padded_length = 128 + remainder = padded_length % (pad_length + 1) + path = "a" * (remainder - 1) + result = sup.add_padding(path, padded_length) + assert 128 == len(result) and not result.endswith(os.path.sep) + @pytest.mark.parametrize("debug", [1, 2]) def test_path_debug_padded_filter(debug, monkeypatch): diff --git a/lib/spack/spack/test/util/spack_lock_wrapper.py b/lib/spack/spack/test/util/spack_lock_wrapper.py index 9838324a03ef19..bf162627f5356a 100644 --- a/lib/spack/spack/test/util/spack_lock_wrapper.py +++ b/lib/spack/spack/test/util/spack_lock_wrapper.py @@ -10,7 +10,7 @@ from llnl.util.filesystem import getuid, group_ids -import spack.config +import spack.error import spack.util.lock as lk diff --git a/lib/spack/spack/test/util/util_url.py b/lib/spack/spack/test/util/util_url.py index befaaef1cd0620..ed34a791528719 100644 --- a/lib/spack/spack/test/util/util_url.py +++ b/lib/spack/spack/test/util/util_url.py @@ -8,6 +8,8 @@ import os.path import urllib.parse +import pytest + import spack.util.path import spack.util.url as url_util @@ -45,155 +47,63 @@ def test_relative_path_to_file_url(tmpdir): assert os.path.samefile(roundtrip, path) -def test_url_join_local_paths(): - # Resolve local link against page URL - - # wrong: - assert ( - url_util.join("s3://bucket/index.html", "../other-bucket/document.txt") - == "s3://bucket/other-bucket/document.txt" - ) - - # correct - need to specify resolve_href=True: - assert ( - url_util.join("s3://bucket/index.html", "../other-bucket/document.txt", resolve_href=True) - == "s3://other-bucket/document.txt" - ) - - # same as above: make sure several components are joined together correctly - assert ( - url_util.join( - # with resolve_href=True, first arg is the base url; can not be - # broken up - "s3://bucket/index.html", - # with resolve_href=True, remaining arguments are the components of - # the local href that needs to be resolved - "..", - "other-bucket", - "document.txt", - resolve_href=True, - ) - == "s3://other-bucket/document.txt" - ) - - # Append local path components to prefix URL - - # wrong: - assert ( - url_util.join("https://mirror.spack.io/build_cache", "my-package", resolve_href=True) - == "https://mirror.spack.io/my-package" - ) - - # correct - Need to specify resolve_href=False: - assert ( - url_util.join("https://mirror.spack.io/build_cache", "my-package", resolve_href=False) - == "https://mirror.spack.io/build_cache/my-package" - ) - - # same as above; make sure resolve_href=False is default - assert ( - url_util.join("https://mirror.spack.io/build_cache", "my-package") - == "https://mirror.spack.io/build_cache/my-package" - ) - - # same as above: make sure several components are joined together correctly - assert ( - url_util.join( - # with resolve_href=False, first arg is just a prefix. No - # resolution is done. So, there should be no difference between - # join('/a/b/c', 'd/e'), - # join('/a/b', 'c', 'd/e'), - # join('/a', 'b/c', 'd', 'e'), etc. - "https://mirror.spack.io", - "build_cache", - "my-package", - ) - == "https://mirror.spack.io/build_cache/my-package" - ) - - # For s3:// URLs, the "netloc" (bucket) is considered part of the path. - # Make sure join() can cross bucket boundaries in this case. - args = ["s3://bucket/a/b", "new-bucket", "c"] - assert url_util.join(*args) == "s3://bucket/a/b/new-bucket/c" - - args.insert(1, "..") - assert url_util.join(*args) == "s3://bucket/a/new-bucket/c" - - args.insert(1, "..") - assert url_util.join(*args) == "s3://bucket/new-bucket/c" - - # new-bucket is now the "netloc" (bucket name) - args.insert(1, "..") - assert url_util.join(*args) == "s3://new-bucket/c" - - -def test_url_join_absolute_paths(): - # Handling absolute path components is a little tricky. To this end, we - # distinguish "absolute path components", from the more-familiar concept of - # "absolute paths" as they are understood for local filesystem paths. - # - # - All absolute paths are absolute path components. Joining a URL with - # these components has the effect of completely replacing the path of the - # URL with the absolute path. These components do not specify a URL - # scheme, so the scheme of the URL procuced when joining them depend on - # those provided by components that came before it (file:// assumed if no - # such scheme is provided). - - # For eaxmple: - p = "/path/to/resource" - # ...is an absolute path - - # http:// URL - assert url_util.join("http://example.com/a/b/c", p) == "http://example.com/path/to/resource" - - # s3:// URL - # also notice how the netloc is treated as part of the path for s3:// URLs - assert url_util.join("s3://example.com/a/b/c", p) == "s3://path/to/resource" - - # - URL components that specify a scheme are always absolute path - # components. Joining a base URL with these components effectively - # discards the base URL and "resets" the joining logic starting at the - # component in question and using it as the new base URL. - - # For eaxmple: - p = "http://example.com/path/to" - # ...is an http:// URL - - join_result = url_util.join(p, "resource") - assert join_result == "http://example.com/path/to/resource" - - # works as if everything before the http:// URL was left out - assert url_util.join("literally", "does", "not", "matter", p, "resource") == join_result - - assert url_util.join("file:///a/b/c", "./d") == "file:///a/b/c/d" - - # Finally, resolve_href should have no effect for how absolute path - # components are handled because local hrefs can not be absolute path - # components. - args = [ - "s3://does", - "not", - "matter", - "http://example.com", - "also", - "does", - "not", - "matter", - "/path", - ] - - expected = "http://example.com/path" - assert url_util.join(*args, resolve_href=True) == expected - assert url_util.join(*args, resolve_href=False) == expected - - # resolve_href only matters for the local path components at the end of the - # argument list. - args[-1] = "/path/to/page" - args.extend(("..", "..", "resource")) - - assert url_util.join(*args, resolve_href=True) == "http://example.com/resource" - - assert url_util.join(*args, resolve_href=False) == "http://example.com/path/resource" +@pytest.mark.parametrize("resolve_href", [True, False]) +@pytest.mark.parametrize("scheme", ["http", "s3", "gs", "file", "oci"]) +def test_url_join_absolute(scheme, resolve_href): + """Test that joining a URL with an absolute path works the same for schemes we care about, and + whether we work in web browser mode or not.""" + netloc = "" if scheme == "file" else "example.com" + a1 = url_util.join(f"{scheme}://{netloc}/a/b/c", "/d/e/f", resolve_href=resolve_href) + a2 = url_util.join(f"{scheme}://{netloc}/a/b/c", "/d", "e", "f", resolve_href=resolve_href) + assert a1 == a2 == f"{scheme}://{netloc}/d/e/f" + + b1 = url_util.join(f"{scheme}://{netloc}/a", "https://b.com/b", resolve_href=resolve_href) + b2 = url_util.join(f"{scheme}://{netloc}/a", "https://b.com", "b", resolve_href=resolve_href) + assert b1 == b2 == "https://b.com/b" + + +@pytest.mark.parametrize("scheme", ["http", "s3", "gs"]) +def test_url_join_up(scheme): + """Test that the netloc component is preserved when going .. up in the path.""" + a1 = url_util.join(f"{scheme}://netloc/a/b.html", "c", resolve_href=True) + assert a1 == f"{scheme}://netloc/a/c" + b1 = url_util.join(f"{scheme}://netloc/a/b.html", "../c", resolve_href=True) + b2 = url_util.join(f"{scheme}://netloc/a/b.html", "..", "c", resolve_href=True) + assert b1 == b2 == f"{scheme}://netloc/c" + c1 = url_util.join(f"{scheme}://netloc/a/b.html", "../../c", resolve_href=True) + c2 = url_util.join(f"{scheme}://netloc/a/b.html", "..", "..", "c", resolve_href=True) + assert c1 == c2 == f"{scheme}://netloc/c" + + d1 = url_util.join(f"{scheme}://netloc/a/b", "c", resolve_href=False) + assert d1 == f"{scheme}://netloc/a/b/c" + d2 = url_util.join(f"{scheme}://netloc/a/b", "../c", resolve_href=False) + d3 = url_util.join(f"{scheme}://netloc/a/b", "..", "c", resolve_href=False) + assert d2 == d3 == f"{scheme}://netloc/a/c" + e1 = url_util.join(f"{scheme}://netloc/a/b", "../../c", resolve_href=False) + e2 = url_util.join(f"{scheme}://netloc/a/b", "..", "..", "c", resolve_href=False) + assert e1 == e2 == f"{scheme}://netloc/c" + f1 = url_util.join(f"{scheme}://netloc/a/b", "../../../c", resolve_href=False) + f2 = url_util.join(f"{scheme}://netloc/a/b", "..", "..", "..", "c", resolve_href=False) + assert f1 == f2 == f"{scheme}://netloc/c" + + +@pytest.mark.parametrize("scheme", ["http", "https", "ftp", "s3", "gs", "file"]) +def test_url_join_resolve_href(scheme): + """test that `resolve_href=True` behaves like a web browser at the base page, and + `resolve_href=False` behaves like joining paths in a file system at the base directory.""" + # these are equivalent because of the trailing / + netloc = "" if scheme == "file" else "netloc" + a1 = url_util.join(f"{scheme}://{netloc}/my/path/", "other/path", resolve_href=True) + a2 = url_util.join(f"{scheme}://{netloc}/my/path/", "other", "path", resolve_href=True) + assert a1 == a2 == f"{scheme}://{netloc}/my/path/other/path" + b1 = url_util.join(f"{scheme}://{netloc}/my/path", "other/path", resolve_href=False) + b2 = url_util.join(f"{scheme}://{netloc}/my/path", "other", "path", resolve_href=False) + assert b1 == b2 == f"{scheme}://{netloc}/my/path/other/path" + + # this is like a web browser: relative to /my. + c1 = url_util.join(f"{scheme}://{netloc}/my/path", "other/path", resolve_href=True) + c2 = url_util.join(f"{scheme}://{netloc}/my/path", "other", "path", resolve_href=True) + assert c1 == c2 == f"{scheme}://{netloc}/my/other/path" def test_default_download_name(): diff --git a/lib/spack/spack/test/variant.py b/lib/spack/spack/test/variant.py index d44aacee5eae32..c4c439b86f8991 100644 --- a/lib/spack/spack/test/variant.py +++ b/lib/spack/spack/test/variant.py @@ -7,9 +7,12 @@ import pytest import spack.error +import spack.repo +import spack.spec import spack.variant -from spack.spec import VariantMap +from spack.spec import Spec, VariantMap from spack.variant import ( + AbstractVariant, BoolValuedVariant, DuplicateVariantError, InconsistentValidationError, @@ -541,7 +544,7 @@ def test_validation(self): ) # Valid vspec, shouldn't raise vspec = a.make_variant("bar") - a.validate_or_raise(vspec) + a.validate_or_raise(vspec, "test-package") # Multiple values are not allowed with pytest.raises(MultipleValuesInExclusiveVariantError): @@ -550,16 +553,16 @@ def test_validation(self): # Inconsistent vspec vspec.name = "FOO" with pytest.raises(InconsistentValidationError): - a.validate_or_raise(vspec) + a.validate_or_raise(vspec, "test-package") # Valid multi-value vspec a.multi = True vspec = a.make_variant("bar,baz") - a.validate_or_raise(vspec) + a.validate_or_raise(vspec, "test-package") # Add an invalid value vspec.value = "bar,baz,barbaz" with pytest.raises(InvalidVariantValueError): - a.validate_or_raise(vspec) + a.validate_or_raise(vspec, "test-package") def test_callable_validator(self): def validator(x): @@ -570,12 +573,12 @@ def validator(x): a = Variant("foo", default=1024, description="", values=validator, multi=False) vspec = a.make_default() - a.validate_or_raise(vspec) + a.validate_or_raise(vspec, "test-package") vspec.value = 2056 - a.validate_or_raise(vspec) + a.validate_or_raise(vspec, "test-package") vspec.value = "foo" with pytest.raises(InvalidVariantValueError): - a.validate_or_raise(vspec) + a.validate_or_raise(vspec, "test-package") def test_representation(self): a = Variant( @@ -583,11 +586,22 @@ def test_representation(self): ) assert a.allowed_values == "bar, baz, foobar" + def test_str(self): + string = str( + Variant( + "foo", default="", description="", values=("bar", "baz", "foobar"), multi=False + ) + ) + assert "'foo'" in string + assert "default=''" in string + assert "description=''" in string + assert "values=('foo', 'bar', 'baz') in string" + class TestVariantMapTest: - def test_invalid_values(self): + def test_invalid_values(self) -> None: # Value with invalid type - a = VariantMap(None) + a = VariantMap(Spec()) with pytest.raises(TypeError): a["foo"] = 2 @@ -606,17 +620,17 @@ def test_invalid_values(self): with pytest.raises(KeyError): a["bar"] = MultiValuedVariant("foo", "bar") - def test_set_item(self): + def test_set_item(self) -> None: # Check that all the three types of variants are accepted - a = VariantMap(None) + a = VariantMap(Spec()) a["foo"] = BoolValuedVariant("foo", True) a["bar"] = SingleValuedVariant("bar", "baz") a["foobar"] = MultiValuedVariant("foobar", "a, b, c, d, e") - def test_substitute(self): + def test_substitute(self) -> None: # Check substitution of a key that exists - a = VariantMap(None) + a = VariantMap(Spec()) a["foo"] = BoolValuedVariant("foo", True) a.substitute(SingleValuedVariant("foo", "bar")) @@ -625,15 +639,15 @@ def test_substitute(self): with pytest.raises(KeyError): a.substitute(BoolValuedVariant("bar", True)) - def test_satisfies_and_constrain(self): + def test_satisfies_and_constrain(self) -> None: # foo=bar foobar=fee feebar=foo - a = VariantMap(None) + a = VariantMap(Spec()) a["foo"] = MultiValuedVariant("foo", "bar") a["foobar"] = SingleValuedVariant("foobar", "fee") a["feebar"] = SingleValuedVariant("feebar", "foo") # foo=bar,baz foobar=fee shared=True - b = VariantMap(None) + b = VariantMap(Spec()) b["foo"] = MultiValuedVariant("foo", "bar, baz") b["foobar"] = SingleValuedVariant("foobar", "fee") b["shared"] = BoolValuedVariant("shared", True) @@ -645,7 +659,7 @@ def test_satisfies_and_constrain(self): assert not b.satisfies(a) # foo=bar,baz foobar=fee feebar=foo shared=True - c = VariantMap(None) + c = VariantMap(Spec()) c["foo"] = MultiValuedVariant("foo", "bar, baz") c["foobar"] = SingleValuedVariant("foobar", "fee") c["feebar"] = SingleValuedVariant("feebar", "foo") @@ -654,8 +668,8 @@ def test_satisfies_and_constrain(self): assert a.constrain(b) assert a == c - def test_copy(self): - a = VariantMap(None) + def test_copy(self) -> None: + a = VariantMap(Spec()) a["foo"] = BoolValuedVariant("foo", True) a["bar"] = SingleValuedVariant("bar", "baz") a["foobar"] = MultiValuedVariant("foobar", "a, b, c, d, e") @@ -663,14 +677,31 @@ def test_copy(self): c = a.copy() assert a == c - def test_str(self): - c = VariantMap(None) + def test_str(self) -> None: + c = VariantMap(Spec()) c["foo"] = MultiValuedVariant("foo", "bar, baz") c["foobar"] = SingleValuedVariant("foobar", "fee") c["feebar"] = SingleValuedVariant("feebar", "foo") c["shared"] = BoolValuedVariant("shared", True) assert str(c) == "+shared feebar=foo foo=bar,baz foobar=fee" + def test_concrete(self, mock_packages, config) -> None: + spec = Spec("pkg-a") + vm = VariantMap(spec) + assert not vm.concrete + + # concrete if associated spec is concrete + spec.concretize() + assert vm.concrete + + # concrete if all variants are present (even if spec not concrete) + spec._mark_concrete(False) + assert spec.variants.concrete + + # remove a variant to test the condition + del spec.variants["foo"] + assert not spec.variants.concrete + def test_disjoint_set_initialization_errors(): # Constructing from non-disjoint sets should raise an exception @@ -765,9 +796,154 @@ def test_wild_card_valued_variants_equivalent_to_str(): several_arbitrary_values = ("doe", "re", "mi") # "*" case wild_output = wild_var.make_variant(several_arbitrary_values) - wild_var.validate_or_raise(wild_output) + wild_var.validate_or_raise(wild_output, "test-package") # str case str_output = str_var.make_variant(several_arbitrary_values) - str_var.validate_or_raise(str_output) + str_var.validate_or_raise(str_output, "test-package") # equivalence each instance already validated assert str_output.value == wild_output.value + + +def test_variant_definitions(mock_packages): + pkg = spack.repo.PATH.get_pkg_class("variant-values") + + # two variant names + assert len(pkg.variant_names()) == 2 + assert "build_system" in pkg.variant_names() + assert "v" in pkg.variant_names() + + # this name doesn't exist + assert len(pkg.variant_definitions("no-such-variant")) == 0 + + # there are 4 definitions but one is completely shadowed by another + assert len(pkg.variants) == 4 + + # variant_items ignores the shadowed definition + assert len(list(pkg.variant_items())) == 3 + + # variant_definitions also ignores the shadowed definition + defs = [vdef for _, vdef in pkg.variant_definitions("v")] + assert len(defs) == 2 + assert defs[0].default == "foo" + assert defs[0].values == ("foo",) + + assert defs[1].default == "bar" + assert defs[1].values == ("foo", "bar") + + +@pytest.mark.parametrize( + "pkg_name,value,spec,def_ids", + [ + ("variant-values", "foo", "", [0, 1]), + ("variant-values", "bar", "", [1]), + ("variant-values", "foo", "@1.0", [0]), + ("variant-values", "foo", "@2.0", [1]), + ("variant-values", "foo", "@3.0", [1]), + ("variant-values", "foo", "@4.0", []), + ("variant-values", "bar", "@2.0", [1]), + ("variant-values", "bar", "@3.0", [1]), + ("variant-values", "bar", "@4.0", []), + # now with a global override + ("variant-values-override", "bar", "", [0]), + ("variant-values-override", "bar", "@1.0", [0]), + ("variant-values-override", "bar", "@2.0", [0]), + ("variant-values-override", "bar", "@3.0", [0]), + ("variant-values-override", "bar", "@4.0", [0]), + ("variant-values-override", "baz", "", [0]), + ("variant-values-override", "baz", "@2.0", [0]), + ("variant-values-override", "baz", "@3.0", [0]), + ("variant-values-override", "baz", "@4.0", [0]), + ], +) +def test_prevalidate_variant_value(mock_packages, pkg_name, value, spec, def_ids): + pkg = spack.repo.PATH.get_pkg_class(pkg_name) + + all_defs = [vdef for _, vdef in pkg.variant_definitions("v")] + + valid_defs = spack.variant.prevalidate_variant_value( + pkg, SingleValuedVariant("v", value), spack.spec.Spec(spec) + ) + assert len(valid_defs) == len(def_ids) + + for vdef, i in zip(valid_defs, def_ids): + assert vdef is all_defs[i] + + +@pytest.mark.parametrize( + "pkg_name,value,spec", + [ + ("variant-values", "baz", ""), + ("variant-values", "bar", "@1.0"), + ("variant-values", "bar", "@4.0"), + ("variant-values", "baz", "@3.0"), + ("variant-values", "baz", "@4.0"), + # and with override + ("variant-values-override", "foo", ""), + ("variant-values-override", "foo", "@1.0"), + ("variant-values-override", "foo", "@2.0"), + ("variant-values-override", "foo", "@3.0"), + ("variant-values-override", "foo", "@4.0"), + ], +) +def test_strict_invalid_variant_values(mock_packages, pkg_name, value, spec): + pkg = spack.repo.PATH.get_pkg_class(pkg_name) + + with pytest.raises(spack.variant.InvalidVariantValueError): + spack.variant.prevalidate_variant_value( + pkg, SingleValuedVariant("v", value), spack.spec.Spec(spec), strict=True + ) + + +@pytest.mark.parametrize( + "pkg_name,spec,satisfies,def_id", + [ + ("variant-values", "@1.0", "v=foo", 0), + ("variant-values", "@2.0", "v=bar", 1), + ("variant-values", "@3.0", "v=bar", 1), + ("variant-values-override", "@1.0", "v=baz", 0), + ("variant-values-override", "@2.0", "v=baz", 0), + ("variant-values-override", "@3.0", "v=baz", 0), + ], +) +def test_concretize_variant_default_with_multiple_defs( + mock_packages, config, pkg_name, spec, satisfies, def_id +): + pkg = spack.repo.PATH.get_pkg_class(pkg_name) + pkg_defs = [vdef for _, vdef in pkg.variant_definitions("v")] + + spec = spack.spec.Spec(f"{pkg_name}{spec}").concretized() + assert spec.satisfies(satisfies) + assert spec.package.get_variant("v") is pkg_defs[def_id] + + +@pytest.mark.parametrize( + "spec,variant_name,after", + [ + # dev_path is a special case + ("foo dev_path=/path/to/source", "dev_path", SingleValuedVariant), + # reserved name: won't be touched + ("foo patches=2349dc44", "patches", AbstractVariant), + # simple case -- one definition applies + ("variant-values@1.0 v=foo", "v", SingleValuedVariant), + # simple, but with bool valued variant + ("pkg-a bvv=true", "bvv", BoolValuedVariant), + # variant doesn't exist at version + ("variant-values@4.0 v=bar", "v", spack.spec.InvalidVariantForSpecError), + # multiple definitions, so not yet knowable + ("variant-values@2.0 v=bar", "v", AbstractVariant), + ], +) +def test_substitute_abstract_variants(mock_packages, spec, variant_name, after): + spec = Spec(spec) + + # all variants start out as AbstractVariant + assert isinstance(spec.variants[variant_name], AbstractVariant) + + if issubclass(after, Exception): + # if we're checking for an error, use pytest.raises + with pytest.raises(after): + spack.spec.substitute_abstract_variants(spec) + else: + # ensure that the type of the variant on the spec has been narrowed (or not) + spack.spec.substitute_abstract_variants(spec) + assert isinstance(spec.variants[variant_name], after) diff --git a/lib/spack/spack/test/versions.py b/lib/spack/spack/test/versions.py index bc97fe46677088..734ba4ca4a40f8 100644 --- a/lib/spack/spack/test/versions.py +++ b/lib/spack/spack/test/versions.py @@ -16,6 +16,7 @@ import spack.package_base import spack.spec +import spack.version from spack.version import ( EmptyRangeError, GitVersion, diff --git a/lib/spack/spack/test/views.py b/lib/spack/spack/test/views.py index d32d8e01505bd0..2a62d04312b8cf 100644 --- a/lib/spack/spack/test/views.py +++ b/lib/spack/spack/test/views.py @@ -9,16 +9,16 @@ from spack.directory_layout import DirectoryLayout from spack.filesystem_view import SimpleFilesystemView, YamlFilesystemView +from spack.installer import PackageInstaller from spack.spec import Spec -@pytest.mark.not_on_windows("Not supported on Windows (yet)") def test_remove_extensions_ordered(install_mockery, mock_fetch, tmpdir): view_dir = str(tmpdir.join("view")) layout = DirectoryLayout(view_dir) view = YamlFilesystemView(view_dir, layout) e2 = Spec("extension2").concretized() - e2.package.do_install() + PackageInstaller([e2.package], explicit=True).install() view.add_specs(e2) e1 = e2["extension1"] diff --git a/lib/spack/spack/test/web.py b/lib/spack/spack/test/web.py index 1ae76c6e8dbf7f..8998d89efc5fbb 100644 --- a/lib/spack/spack/test/web.py +++ b/lib/spack/spack/test/web.py @@ -17,7 +17,6 @@ import spack.mirror import spack.paths import spack.url -import spack.util.path import spack.util.s3 import spack.util.url as url_util import spack.util.web diff --git a/lib/spack/spack/traverse.py b/lib/spack/spack/traverse.py index 091ebfe193df58..f6c5589b2aeaf7 100644 --- a/lib/spack/spack/traverse.py +++ b/lib/spack/spack/traverse.py @@ -3,8 +3,8 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) -from collections import defaultdict, namedtuple -from typing import Union +from collections import defaultdict +from typing import NamedTuple, Union import spack.deptypes as dt import spack.spec @@ -12,11 +12,14 @@ # Export only the high-level API. __all__ = ["traverse_edges", "traverse_nodes", "traverse_tree"] + #: Data class that stores a directed edge together with depth at #: which the target vertex was found. It is passed to ``accept`` #: and ``neighbors`` of visitors, so they can decide whether to #: follow the edge or not. -EdgeAndDepth = namedtuple("EdgeAndDepth", ["edge", "depth"]) +class EdgeAndDepth(NamedTuple): + edge: "spack.spec.DependencySpec" + depth: int def sort_edges(edges): diff --git a/lib/spack/spack/user_environment.py b/lib/spack/spack/user_environment.py index 756b7c09a2f429..b5b455fad64fa5 100644 --- a/lib/spack/spack/user_environment.py +++ b/lib/spack/spack/user_environment.py @@ -8,7 +8,6 @@ import spack.build_environment import spack.config -import spack.error import spack.spec import spack.util.environment as environment from spack import traverse diff --git a/lib/spack/spack/util/cpus.py b/lib/spack/spack/util/cpus.py index 9c98656830d338..5cf09c3e822479 100644 --- a/lib/spack/spack/util/cpus.py +++ b/lib/spack/spack/util/cpus.py @@ -5,9 +5,6 @@ import multiprocessing import os -from typing import Optional - -import spack.config def cpus_available(): @@ -21,36 +18,3 @@ def cpus_available(): return len(os.sched_getaffinity(0)) # novermin except Exception: return multiprocessing.cpu_count() - - -def determine_number_of_jobs( - *, - parallel: bool = False, - max_cpus: int = cpus_available(), - config: Optional["spack.config.Configuration"] = None, -) -> int: - """ - Packages that require sequential builds need 1 job. Otherwise we use the - number of jobs set on the command line. If not set, then we use the config - defaults (which is usually set through the builtin config scope), but we - cap to the number of CPUs available to avoid oversubscription. - - Parameters: - parallel: true when package supports parallel builds - max_cpus: maximum number of CPUs to use (defaults to cpus_available()) - config: configuration object (defaults to global config) - """ - if not parallel: - return 1 - - cfg = config or spack.config.CONFIG - - # Command line overrides all - try: - command_line = cfg.get("config:build_jobs", default=None, scope="command_line") - if command_line is not None: - return command_line - except ValueError: - pass - - return min(max_cpus, cfg.get("config:build_jobs", 16)) diff --git a/lib/spack/spack/util/environment.py b/lib/spack/spack/util/environment.py index a68e9f3beaa368..b40a0a7e1a330c 100644 --- a/lib/spack/spack/util/environment.py +++ b/lib/spack/spack/util/environment.py @@ -12,16 +12,15 @@ import pickle import re import shlex +import subprocess import sys from functools import wraps -from typing import Any, Callable, Dict, List, MutableMapping, Optional, Tuple, Union +from typing import Any, Callable, Dict, Iterable, List, MutableMapping, Optional, Tuple, Union from llnl.path import path_to_os_path, system_path_filter from llnl.util import tty from llnl.util.lang import dedupe -from .executable import Executable, which - if sys.platform == "win32": SYSTEM_PATHS = [ "C:\\", @@ -91,7 +90,7 @@ def is_system_path(path: Path) -> bool: return bool(path) and (os.path.normpath(path) in SYSTEM_DIRS) -def filter_system_paths(paths: List[Path]) -> List[Path]: +def filter_system_paths(paths: Iterable[Path]) -> List[Path]: """Returns a copy of the input where system paths are filtered out.""" return [p for p in paths if not is_system_path(p)] @@ -104,16 +103,12 @@ def deprioritize_system_paths(paths: List[Path], target: Optional[str] = None) - preserving order. """ import spack.platforms - import spack.target result = sorted(paths, key=is_system_path) # If we are building for a 64-bit target, move e.g. *64 system paths to # the front of the system paths; otherwise remove them - if target is None: - ref_target = spack.platforms.host().target("default_target") - else: - ref_target = spack.target.Target(target) - if target_64bit_re.search(ref_target.microarchitecture.family.name): + ref_target = spack.platforms.host().target("default_target" if target is None else target) + if target_64bit_re.search(ref_target.family.name): result.sort(key=lambda path: is_system_path(path) and not path.endswith("64")) else: result = list( @@ -1092,8 +1087,6 @@ def environment_after_sourcing_files( source_command = kwargs.get("source_command", "source") concatenate_on_success = kwargs.get("concatenate_on_success", "&&") - shell = Executable(shell_cmd) - def _source_single_file(file_and_args, environment): shell_options_list = shell_options.split() @@ -1101,26 +1094,21 @@ def _source_single_file(file_and_args, environment): source_file.extend(x for x in file_and_args) source_file = " ".join(source_file) - # If the environment contains 'python' use it, if not - # go with sys.executable. Below we just need a working - # Python interpreter, not necessarily sys.executable. - python_cmd = which("python3", "python", "python2") - python_cmd = python_cmd.path if python_cmd else sys.executable - dump_cmd = "import os, json; print(json.dumps(dict(os.environ)))" - dump_environment_cmd = python_cmd + f' -E -c "{dump_cmd}"' + dump_environment_cmd = sys.executable + f' -E -c "{dump_cmd}"' # Try to source the file source_file_arguments = " ".join( [source_file, suppress_output, concatenate_on_success, dump_environment_cmd] ) - output = shell( - *shell_options_list, - source_file_arguments, - output=str, + + with subprocess.Popen( + [shell_cmd, *shell_options_list, source_file_arguments], env=environment, - ignore_quotes=True, - ) + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) as shell: + output, _ = shell.communicate() return json.loads(output) diff --git a/lib/spack/spack/util/executable.py b/lib/spack/spack/util/executable.py index 92933221cad5af..0c1901cb1a9368 100644 --- a/lib/spack/spack/util/executable.py +++ b/lib/spack/spack/util/executable.py @@ -12,6 +12,7 @@ import llnl.util.tty as tty import spack.error +from spack.util.environment import EnvironmentModifications __all__ = ["Executable", "which", "ProcessError"] @@ -27,7 +28,6 @@ def __init__(self, name): self.exe = [file_path] self.default_env = {} - from spack.util.environment import EnvironmentModifications # no cycle self.default_envmod = EnvironmentModifications() self.returncode = None diff --git a/lib/spack/spack/util/filesystem.py b/lib/spack/spack/util/filesystem.py new file mode 100644 index 00000000000000..b296438fe89e82 --- /dev/null +++ b/lib/spack/spack/util/filesystem.py @@ -0,0 +1,102 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +""" +Utilities for interacting with files, +like those in llnl.util.filesystem, but which require logic from spack.util +""" + +import glob +import os +import sys + +from llnl.util import tty +from llnl.util.filesystem import join_path +from llnl.util.lang import memoized + +from spack.util.executable import Executable, which + + +def _ensure_file_on_win(): + """Ensures the file command is available on Windows + If not, it is bootstrapped. + No-op on all other platforms""" + if sys.platform != "win32": + return + import spack.bootstrap + + with spack.bootstrap.ensure_bootstrap_configuration(): + spack.bootstrap.ensure_file_in_path_or_raise() + + +@memoized +def file_command(*args): + """Creates entry point to `file` system command with provided arguments""" + _ensure_file_on_win() + file_cmd = which("file", required=True) + for arg in args: + file_cmd.add_default_arg(arg) + return file_cmd + + +@memoized +def _get_mime_type(): + """Generate method to call `file` system command to aquire mime type + for a specified path + """ + if sys.platform == "win32": + # -h option (no-dereference) does not exist in Windows + return file_command("-b", "--mime-type") + else: + return file_command("-b", "-h", "--mime-type") + + +def mime_type(filename): + """Returns the mime type and subtype of a file. + + Args: + filename: file to be analyzed + + Returns: + Tuple containing the MIME type and subtype + """ + output = _get_mime_type()(filename, output=str, error=str).strip() + tty.debug("==> " + output) + type, _, subtype = output.partition("/") + return type, subtype + + +def fix_darwin_install_name(path): + """Fix install name of dynamic libraries on Darwin to have full path. + + There are two parts of this task: + + 1. Use ``install_name('-id', ...)`` to change install name of a single lib + 2. Use ``install_name('-change', ...)`` to change the cross linking between + libs. The function assumes that all libraries are in one folder and + currently won't follow subfolders. + + Parameters: + path (str): directory in which .dylib files are located + """ + libs = glob.glob(join_path(path, "*.dylib")) + for lib in libs: + # fix install name first: + install_name_tool = Executable("install_name_tool") + install_name_tool("-id", lib, lib) + otool = Executable("otool") + long_deps = otool("-L", lib, output=str).split("\n") + deps = [dep.partition(" ")[0][1::] for dep in long_deps[2:-1]] + # fix all dependencies: + for dep in deps: + for loc in libs: + # We really want to check for either + # dep == os.path.basename(loc) or + # dep == join_path(builddir, os.path.basename(loc)), + # but we don't know builddir (nor how symbolic links look + # in builddir). We thus only compare the basenames. + if os.path.basename(dep) == os.path.basename(loc): + install_name_tool("-change", dep, loc, lib) + break diff --git a/lib/spack/spack/util/libc.py b/lib/spack/spack/util/libc.py index 402bf6f2444131..55e8e3d26b6e48 100644 --- a/lib/spack/spack/util/libc.py +++ b/lib/spack/spack/util/libc.py @@ -9,7 +9,7 @@ import shlex import sys from subprocess import PIPE, run -from typing import Optional +from typing import List, Optional import spack.spec import spack.util.elf @@ -34,6 +34,22 @@ def _libc_from_ldd(ldd: str) -> Optional["spack.spec.Spec"]: return None +def default_search_paths_from_dynamic_linker(dynamic_linker: str) -> List[str]: + """If the dynamic linker is glibc at a certain version, we can query the hard-coded library + search paths""" + try: + result = run([dynamic_linker, "--help"], stdout=PIPE, stderr=PIPE, check=False) + assert result.returncode == 0 + out = result.stdout.decode("utf-8") + except Exception: + return [] + + return [ + match.group(1).strip() + for match in re.finditer(r"^ (/.+) \(system search path\)$", out, re.MULTILINE) + ] + + def libc_from_dynamic_linker(dynamic_linker: str) -> Optional["spack.spec.Spec"]: if not os.path.exists(dynamic_linker): return None diff --git a/lib/spack/spack/util/lock.py b/lib/spack/spack/util/lock.py index 3f6480b26ae23c..f96145518b203e 100644 --- a/lib/spack/spack/util/lock.py +++ b/lib/spack/spack/util/lock.py @@ -19,7 +19,6 @@ from llnl.util.lock import WriteTransaction # noqa: F401 import spack.error -import spack.paths class Lock(llnl.util.lock.Lock): diff --git a/lib/spack/spack/util/package_hash.py b/lib/spack/spack/util/package_hash.py index 35f6535ec21549..8c0db7716d022a 100644 --- a/lib/spack/spack/util/package_hash.py +++ b/lib/spack/spack/util/package_hash.py @@ -7,11 +7,11 @@ import spack.directives_meta import spack.error +import spack.fetch_strategy import spack.package_base import spack.repo import spack.spec import spack.util.hash -import spack.util.naming from spack.util.unparse import unparse diff --git a/lib/spack/spack/util/parallel.py b/lib/spack/spack/util/parallel.py index 28c55b7d1e5ee2..b16adb88582156 100644 --- a/lib/spack/spack/util/parallel.py +++ b/lib/spack/spack/util/parallel.py @@ -9,7 +9,7 @@ import traceback from typing import Optional -from spack.util.cpus import determine_number_of_jobs +import spack.config class ErrorFromWorker: @@ -98,9 +98,14 @@ def submit(self, fn, *args, **kwargs): return future -def make_concurrent_executor() -> concurrent.futures.Executor: - """Can't use threading because it's unsafe, and can't use spawned processes because of globals. - That leaves only forking.""" - if multiprocessing.get_start_method() == "fork": - return concurrent.futures.ProcessPoolExecutor(determine_number_of_jobs(parallel=True)) - return SequentialExecutor() +def make_concurrent_executor( + jobs: Optional[int] = None, *, require_fork: bool = True +) -> concurrent.futures.Executor: + """Create a concurrent executor. If require_fork is True, then the executor is sequential + if the platform does not enable forking as the default start method. Effectively + require_fork=True makes the executor sequential in the current process on Windows, macOS, and + Linux from Python 3.14+ (which changes defaults)""" + if require_fork and multiprocessing.get_start_method() != "fork": + return SequentialExecutor() + jobs = jobs or spack.config.determine_number_of_jobs(parallel=True) + return concurrent.futures.ProcessPoolExecutor(jobs) diff --git a/lib/spack/spack/util/path.py b/lib/spack/spack/util/path.py index e0fa29dbccd904..56dcd2d0e38ee8 100644 --- a/lib/spack/spack/util/path.py +++ b/lib/spack/spack/util/path.py @@ -71,7 +71,7 @@ def replacements(): "operating_system": lambda: arch.os, "os": lambda: arch.os, "target": lambda: arch.target, - "target_family": lambda: arch.target.microarchitecture.family, + "target_family": lambda: arch.target.family, "date": lambda: date.today().strftime("%Y-%m-%d"), "env": lambda: ev.active_environment().path if ev.active_environment() else NOMATCH, } @@ -96,6 +96,11 @@ def replacements(): #: include some other component of the intallation path. SPACK_PATH_PADDING_CHARS = "__spack_path_placeholder__" +#: Special padding char if the padded string would otherwise end with a path +#: separator (since the path separator would otherwise get collapsed out, +#: causing inconsistent padding). +SPACK_PATH_PADDING_EXTRA_CHAR = "_" + def win_exe_ext(): return r"(?:\.bat|\.exe)" @@ -195,7 +200,10 @@ def _get_padding_string(length): extra_chars = length % (spack_path_padding_size + 1) reps_list = [SPACK_PATH_PADDING_CHARS for i in range(num_reps)] reps_list.append(SPACK_PATH_PADDING_CHARS[:extra_chars]) - return os.path.sep.join(reps_list) + padding = os.path.sep.join(reps_list) + if padding.endswith(os.path.sep): + padding = padding[: len(padding) - 1] + SPACK_PATH_PADDING_EXTRA_CHAR + return padding def add_padding(path, length): @@ -313,10 +321,15 @@ def padding_filter(string): regex = ( r"((?:/[^/\s]*)*?)" # zero or more leading non-whitespace path components r"(/{pad})+" # the padding string repeated one or more times - r"(/{longest_prefix})?(?=/)" # trailing prefix of padding as path component + # trailing prefix of padding as path component + r"(/{longest_prefix}|/{longest_prefix}{extra_pad_character})?(?=/)" ) regex = regex.replace("/", re.escape(os.sep)) - regex = regex.format(pad=pad, longest_prefix=longest_prefix) + regex = regex.format( + pad=pad, + extra_pad_character=SPACK_PATH_PADDING_EXTRA_CHAR, + longest_prefix=longest_prefix, + ) _filter_re = re.compile(regex) def replacer(match): diff --git a/lib/spack/spack/util/url.py b/lib/spack/spack/util/url.py index 64671f1d95dfff..9054c7ad3fb9fe 100644 --- a/lib/spack/spack/util/url.py +++ b/lib/spack/spack/util/url.py @@ -7,17 +7,13 @@ Utility functions for parsing, formatting, and manipulating URLs. """ -import itertools import os import posixpath import re -import sys import urllib.parse import urllib.request from typing import Optional -from llnl.path import convert_to_posix_path - from spack.util.path import sanitize_filename @@ -29,26 +25,6 @@ def validate_scheme(scheme): return scheme in ("file", "http", "https", "ftp", "s3", "gs", "ssh", "git") -def _split_all(path): - """Split path into its atomic components. - - Returns the shortest list, L, of strings such that posixpath.join(*L) == - path and posixpath.split(element) == ('', element) for every element in L - except possibly the first. This first element may possibly have the value - of '/'. - """ - result = [] - a = path - old_a = None - while a != old_a: - (old_a, (a, b)) = a, posixpath.split(a) - - if a or b: - result.insert(0, b or "/") - - return result - - def local_file_path(url): """Get a local file path from a url. @@ -92,151 +68,31 @@ def format(parsed_url): return parsed_url.geturl() -def join(base_url, path, *extra, **kwargs): - """Joins a base URL with one or more local URL path components - - If resolve_href is True, treat the base URL as though it where the locator - of a web page, and the remaining URL path components as though they formed - a relative URL to be resolved against it (i.e.: as in posixpath.join(...)). - The result is an absolute URL to the resource to which a user's browser - would navigate if they clicked on a link with an "href" attribute equal to - the relative URL. - - If resolve_href is False (default), then the URL path components are joined - as in posixpath.join(). - - Note: file:// URL path components are not canonicalized as part of this - operation. To canonicalize, pass the joined url to format(). - - Examples: - base_url = 's3://bucket/index.html' - body = fetch_body(prefix) - link = get_href(body) # link == '../other-bucket/document.txt' - - # wrong - link is a local URL that needs to be resolved against base_url - spack.util.url.join(base_url, link) - 's3://bucket/other_bucket/document.txt' - - # correct - resolve local URL against base_url - spack.util.url.join(base_url, link, resolve_href=True) - 's3://other_bucket/document.txt' - - prefix = 'https://mirror.spack.io/build_cache' - - # wrong - prefix is just a URL prefix - spack.util.url.join(prefix, 'my-package', resolve_href=True) - 'https://mirror.spack.io/my-package' - - # correct - simply append additional URL path components - spack.util.url.join(prefix, 'my-package', resolve_href=False) # default - 'https://mirror.spack.io/build_cache/my-package' - - # For canonicalizing file:// URLs, take care to explicitly differentiate - # between absolute and relative join components. - """ - paths = [ - (x) if isinstance(x, str) else x.geturl() for x in itertools.chain((base_url, path), extra) - ] - - paths = [convert_to_posix_path(x) for x in paths] - n = len(paths) - last_abs_component = None - scheme = "" - for i in range(n - 1, -1, -1): - obj = urllib.parse.urlparse(paths[i], scheme="", allow_fragments=False) - - scheme = obj.scheme - - # in either case the component is absolute - if scheme or obj.path.startswith("/"): - if not scheme: - # Without a scheme, we have to go back looking for the - # next-last component that specifies a scheme. - for j in range(i - 1, -1, -1): - obj = urllib.parse.urlparse(paths[j], scheme="", allow_fragments=False) - - if obj.scheme: - paths[i] = "{SM}://{NL}{PATH}".format( - SM=obj.scheme, - NL=((obj.netloc + "/") if obj.scheme != "s3" else ""), - PATH=paths[i][1:], - ) - break - - last_abs_component = i - break - - if last_abs_component is not None: - paths = paths[last_abs_component:] - if len(paths) == 1: - result = urllib.parse.urlparse(paths[0], scheme="file", allow_fragments=False) - - # another subtlety: If the last argument to join() is an absolute - # file:// URL component with a relative path, the relative path - # needs to be resolved. - if result.scheme == "file" and result.netloc: - result = urllib.parse.ParseResult( - scheme=result.scheme, - netloc="", - path=posixpath.abspath(result.netloc + result.path), - params=result.params, - query=result.query, - fragment=None, - ) - - return result.geturl() - - return _join(*paths, **kwargs) - - -def _join(base_url, path, *extra, **kwargs): - base_url = urllib.parse.urlparse(base_url) - resolve_href = kwargs.get("resolve_href", False) - - (scheme, netloc, base_path, params, query, _) = base_url - scheme = scheme.lower() - - path_tokens = [ - part - for part in itertools.chain( - _split_all(path), - itertools.chain.from_iterable(_split_all(extra_path) for extra_path in extra), - ) - if part and part != "/" - ] - - base_path_args = ["/fake-root"] - if scheme == "s3": - if netloc: - base_path_args.append(netloc) - - if base_path.startswith("/"): - base_path = base_path[1:] - - base_path_args.append(base_path) - - if resolve_href: - new_base_path, _ = posixpath.split(posixpath.join(*base_path_args)) - base_path_args = [new_base_path] - - base_path_args.extend(path_tokens) - base_path = posixpath.relpath(posixpath.join(*base_path_args), "/fake-root") - - if scheme == "s3": - path_tokens = [part for part in _split_all(base_path) if part and part != "/"] - - if path_tokens: - netloc = path_tokens.pop(0) - base_path = posixpath.join("", *path_tokens) - - if sys.platform == "win32": - base_path = convert_to_posix_path(base_path) - - return format( - urllib.parse.ParseResult( - scheme=scheme, netloc=netloc, path=base_path, params=params, query=query, fragment=None - ) - ) +def join(base: str, *components: str, resolve_href: bool = False, **kwargs) -> str: + """Convenience wrapper around ``urllib.parse.urljoin``, with a few differences: + 1. By default resolve_href=False, which makes the function like os.path.join: for example + https://example.com/a/b + c/d = https://example.com/a/b/c/d. If resolve_href=True, the + behavior is how a browser would resolve the URL: https://example.com/a/c/d. + 2. s3://, gs://, oci:// URLs are joined like http:// URLs. + 3. It accepts multiple components for convenience. Note that components[1:] are treated as + literal path components and appended to components[0] separated by slashes.""" + # Ensure a trailing slash in the path component of the base URL to get os.path.join-like + # behavior instead of web browser behavior. + if not resolve_href: + parsed = urllib.parse.urlparse(base) + if not parsed.path.endswith("/"): + base = parsed._replace(path=f"{parsed.path}/").geturl() + uses_netloc = urllib.parse.uses_netloc + uses_relative = urllib.parse.uses_relative + try: + # NOTE: we temporarily modify urllib internals so s3 and gs schemes are treated like http. + # This is non-portable, and may be forward incompatible with future cpython versions. + urllib.parse.uses_netloc = [*uses_netloc, "s3", "gs", "oci"] + urllib.parse.uses_relative = [*uses_relative, "s3", "gs", "oci"] + return urllib.parse.urljoin(base, "/".join(components), **kwargs) + finally: + urllib.parse.uses_netloc = uses_netloc + urllib.parse.uses_relative = uses_relative def default_download_filename(url: str) -> str: diff --git a/lib/spack/spack/util/web.py b/lib/spack/spack/util/web.py index 9a0f1d6e4b6ed5..892b64d333d22e 100644 --- a/lib/spack/spack/util/web.py +++ b/lib/spack/spack/util/web.py @@ -4,7 +4,6 @@ # SPDX-License-Identifier: (Apache-2.0 OR MIT) import codecs -import concurrent.futures import email.message import errno import json @@ -30,6 +29,7 @@ import spack.config import spack.error import spack.util.executable +import spack.util.parallel import spack.util.path import spack.util.url as url_util @@ -641,7 +641,7 @@ def spider( root = urllib.parse.urlparse(root_str) spider_args.append((root, go_deeper, _visited)) - with concurrent.futures.ProcessPoolExecutor(max_workers=concurrency) as tp: + with spack.util.parallel.make_concurrent_executor(concurrency, require_fork=False) as tp: while current_depth <= depth: tty.debug( f"SPIDER: [depth={current_depth}, max_depth={depth}, urls={len(spider_args)}]" diff --git a/lib/spack/spack/variant.py b/lib/spack/spack/variant.py index 83f3ecca8312dd..0756841a638135 100644 --- a/lib/spack/spack/variant.py +++ b/lib/spack/spack/variant.py @@ -7,17 +7,19 @@ variants both in packages and in specs. """ import collections.abc +import enum import functools import inspect import itertools import re +from typing import Any, Callable, Collection, Iterable, List, Optional, Tuple, Type, Union import llnl.util.lang as lang import llnl.util.tty.color -from llnl.string import comma_or import spack.error as error import spack.parser +import spack.spec #: These are variant names used by Spack internally; packages can't use them reserved_names = [ @@ -35,36 +37,68 @@ special_variant_values = [None, "none", "*"] +class VariantType(enum.Enum): + """Enum representing the three concrete variant types.""" + + MULTI = "multi" + BOOL = "bool" + SINGLE = "single" + + @property + def variant_class(self) -> Type: + if self is self.MULTI: + return MultiValuedVariant + elif self is self.BOOL: + return BoolValuedVariant + else: + return SingleValuedVariant + + class Variant: - """Represents a variant in a package, as declared in the - variant directive. + """Represents a variant definition, created by the ``variant()`` directive. + + There can be multiple definitions of the same variant, and they are given precedence + by order of appearance in the package. Later definitions have higher precedence. + Similarly, definitions in derived classes have higher precedence than those in their + superclasses. + """ + name: str + default: Any + description: str + values: Optional[Collection] #: if None, valid values are defined only by validators + multi: bool + single_value_validator: Callable + group_validator: Optional[Callable] + sticky: bool + precedence: int + def __init__( self, - name, - default, - description, - values=(True, False), - multi=False, - validator=None, - sticky=False, + name: str, + *, + default: Any, + description: str, + values: Union[Collection, Callable] = (True, False), + multi: bool = False, + validator: Optional[Callable] = None, + sticky: bool = False, + precedence: int = 0, ): """Initialize a package variant. Args: - name (str): name of the variant - default (str): default value for the variant in case - nothing has been specified - description (str): purpose of the variant - values (sequence): sequence of allowed values or a callable - accepting a single value as argument and returning True if the - value is good, False otherwise - multi (bool): whether multiple CSV are allowed - validator (callable): optional callable used to enforce - additional logic on the set of values being validated - sticky (bool): if true the variant is set to the default value at - concretization time + name: name of the variant + default: default value for the variant, used when nothing is explicitly specified + description: purpose of the variant + values: sequence of allowed values or a callable accepting a single value as argument + and returning True if the value is good, False otherwise + multi: whether multiple values are allowed + validator: optional callable that can be used to perform additional validation + sticky: if true the variant is set to the default value at concretization time + precedence: int indicating precedence of this variant definition in the solve + (definition with highest precedence is used when multiple definitions are possible) """ self.name = name self.default = default @@ -73,7 +107,7 @@ def __init__( self.values = None if values == "*": # wildcard is a special case to make it easy to say any value is ok - self.single_value_validator = lambda x: True + self.single_value_validator = lambda v: True elif isinstance(values, type): # supplying a type means any value *of that type* @@ -92,21 +126,22 @@ def isa_type(v): self.single_value_validator = values else: # Otherwise, assume values is the set of allowed explicit values - self.values = _flatten(values) - self.single_value_validator = lambda x: x in tuple(self.values) + values = _flatten(values) + self.values = values + self.single_value_validator = lambda v: v in values self.multi = multi self.group_validator = validator self.sticky = sticky + self.precedence = precedence - def validate_or_raise(self, vspec, pkg_cls=None): + def validate_or_raise(self, vspec: "AbstractVariant", pkg_name: str): """Validate a variant spec against this package variant. Raises an exception if any error is found. Args: - vspec (Variant): instance to be validated - pkg_cls (spack.package_base.PackageBase): the package class - that required the validation, if available + vspec: variant spec to be validated + pkg_name: the name of the package class that required this validation (for errors) Raises: InconsistentValidationError: if ``vspec.name != self.name`` @@ -121,25 +156,23 @@ def validate_or_raise(self, vspec, pkg_cls=None): if self.name != vspec.name: raise InconsistentValidationError(vspec, self) - # Check the values of the variant spec - value = vspec.value - if isinstance(vspec.value, (bool, str)): - value = (vspec.value,) - # If the value is exclusive there must be at most one + value = vspec.value_as_tuple if not self.multi and len(value) != 1: - raise MultipleValuesInExclusiveVariantError(vspec, pkg_cls) + raise MultipleValuesInExclusiveVariantError(vspec, pkg_name) # Check and record the values that are not allowed - not_allowed_values = [ - x for x in value if x != "*" and self.single_value_validator(x) is False - ] - if not_allowed_values: - raise InvalidVariantValueError(self, not_allowed_values, pkg_cls) + invalid_vals = ", ".join( + f"'{v}'" for v in value if v != "*" and self.single_value_validator(v) is False + ) + if invalid_vals: + raise InvalidVariantValueError( + f"invalid values for variant '{self.name}' in package {pkg_name}: {invalid_vals}\n" + ) # Validate the group of values if needed if self.group_validator is not None and value != ("*",): - self.group_validator(pkg_cls.name, self.name, value) + self.group_validator(pkg_name, self.name, value) @property def allowed_values(self): @@ -168,7 +201,7 @@ def make_default(self): """ return self.make_variant(self.default) - def make_variant(self, value): + def make_variant(self, value) -> "AbstractVariant": """Factory that creates a variant holding the value passed as a parameter. @@ -179,30 +212,31 @@ def make_variant(self, value): MultiValuedVariant or SingleValuedVariant or BoolValuedVariant: instance of the proper variant """ - return self.variant_cls(self.name, value) + return self.variant_type.variant_class(self.name, value) @property - def variant_cls(self): - """Proper variant class to be used for this configuration.""" + def variant_type(self) -> VariantType: + """String representation of the type of this variant (single/multi/bool)""" if self.multi: - return MultiValuedVariant + return VariantType.MULTI elif self.values == (True, False): - return BoolValuedVariant - return SingleValuedVariant + return VariantType.BOOL + else: + return VariantType.SINGLE - def __eq__(self, other): + def __str__(self): return ( - self.name == other.name - and self.default == other.default - and self.values == other.values - and self.multi == other.multi - and self.single_value_validator == other.single_value_validator - and self.group_validator == other.group_validator + f"Variant('{self.name}', " + f"default='{self.default}', " + f"description='{self.description}', " + f"values={self.values}, " + f"multi={self.multi}, " + f"single_value_validator={self.single_value_validator}, " + f"group_validator={self.group_validator}, " + f"sticky={self.sticky}, " + f"precedence={self.precedence})" ) - def __ne__(self, other): - return not self == other - def implicit_variant_conversion(method): """Converts other to type(self) and calls method(self, other) @@ -225,12 +259,12 @@ def convert(self, other): return convert -def _flatten(values): +def _flatten(values) -> Collection: """Flatten instances of _ConditionalVariantValues for internal representation""" if isinstance(values, DisjointSetsOfValues): return values - flattened = [] + flattened: List = [] for item in values: if isinstance(item, _ConditionalVariantValues): flattened.extend(item) @@ -241,6 +275,13 @@ def _flatten(values): return tuple(flattened) +#: Type for value of a variant +ValueType = Union[str, bool, Tuple[Union[str, bool], ...]] + +#: Type of variant value when output for JSON, YAML, etc. +SerializedValueType = Union[str, bool, List[Union[str, bool]]] + + @lang.lazy_lexicographic_ordering class AbstractVariant: """A variant that has not yet decided who it wants to be. It behaves like @@ -253,20 +294,20 @@ class AbstractVariant: values. """ - def __init__(self, name, value, propagate=False): + name: str + propagate: bool + _value: ValueType + _original_value: Any + + def __init__(self, name: str, value: Any, propagate: bool = False): self.name = name self.propagate = propagate - # Stores 'value' after a bit of massaging - # done by the property setter - self._value = None - self._original_value = None - # Invokes property setter self.value = value @staticmethod - def from_node_dict(name, value): + def from_node_dict(name: str, value: Union[str, List[str]]) -> "AbstractVariant": """Reconstruct a variant from a node dict.""" if isinstance(value, list): # read multi-value variants in and be faithful to the YAML @@ -280,16 +321,26 @@ def from_node_dict(name, value): return SingleValuedVariant(name, value) - def yaml_entry(self): + def yaml_entry(self) -> Tuple[str, SerializedValueType]: """Returns a key, value tuple suitable to be an entry in a yaml dict. Returns: tuple: (name, value_representation) """ - return self.name, list(self.value) + return self.name, list(self.value_as_tuple) + + @property + def value_as_tuple(self) -> Tuple[Union[bool, str], ...]: + """Getter for self.value that always returns a Tuple (even for single valued variants). + + This makes it easy to iterate over possible values. + """ + if isinstance(self._value, (bool, str)): + return (self._value,) + return self._value @property - def value(self): + def value(self) -> ValueType: """Returns a tuple of strings containing the values stored in the variant. @@ -299,10 +350,10 @@ def value(self): return self._value @value.setter - def value(self, value): + def value(self, value: ValueType) -> None: self._value_setter(value) - def _value_setter(self, value): + def _value_setter(self, value: ValueType) -> None: # Store the original value self._original_value = value @@ -310,7 +361,7 @@ def _value_setter(self, value): # Store a tuple of CSV string representations # Tuple is necessary here instead of list because the # values need to be hashed - value = re.split(r"\s*,\s*", str(value)) + value = tuple(re.split(r"\s*,\s*", str(value))) for val in special_variant_values: if val in value and len(value) > 1: @@ -323,16 +374,11 @@ def _value_setter(self, value): # to a set self._value = tuple(sorted(set(value))) - def _cmp_iter(self): + def _cmp_iter(self) -> Iterable: yield self.name + yield from (str(v) for v in self.value_as_tuple) - value = self._value - if not isinstance(value, tuple): - value = (value,) - value = tuple(str(x) for x in value) - yield value - - def copy(self): + def copy(self) -> "AbstractVariant": """Returns an instance of a variant equivalent to self Returns: @@ -346,7 +392,7 @@ def copy(self): return type(self)(self.name, self._original_value, self.propagate) @implicit_variant_conversion - def satisfies(self, other): + def satisfies(self, other: "AbstractVariant") -> bool: """Returns true if ``other.name == self.name``, because any value that other holds and is not in self yet **could** be added. @@ -360,13 +406,13 @@ def satisfies(self, other): # (`foo=bar` will never satisfy `baz=bar`) return other.name == self.name - def intersects(self, other): + def intersects(self, other: "AbstractVariant") -> bool: """Returns True if there are variant matching both self and other, False otherwise.""" if isinstance(other, (SingleValuedVariant, BoolValuedVariant)): return other.intersects(self) return other.name == self.name - def compatible(self, other): + def compatible(self, other: "AbstractVariant") -> bool: """Returns True if self and other are compatible, False otherwise. As there is no semantic check, two VariantSpec are compatible if @@ -383,7 +429,7 @@ def compatible(self, other): return self.intersects(other) @implicit_variant_conversion - def constrain(self, other): + def constrain(self, other: "AbstractVariant") -> bool: """Modify self to match all the constraints for other if both instances are multi-valued. Returns True if self changed, False otherwise. @@ -399,23 +445,23 @@ def constrain(self, other): old_value = self.value - values = list(sorted(set(self.value + other.value))) + values = list(sorted(set(self.value_as_tuple + other.value_as_tuple))) # If we constraint wildcard by another value, just take value if "*" in values and len(values) > 1: values.remove("*") - self.value = ",".join(values) + self._value_setter(",".join(str(v) for v in values)) return old_value != self.value - def __contains__(self, item): - return item in self._value + def __contains__(self, item: Union[str, bool]) -> bool: + return item in self.value_as_tuple - def __repr__(self): + def __repr__(self) -> str: return f"{type(self).__name__}({repr(self.name)}, {repr(self._original_value)})" - def __str__(self): + def __str__(self) -> str: delim = "==" if self.propagate else "=" - values = spack.parser.quote_if_needed(",".join(str(v) for v in self.value)) + values = spack.parser.quote_if_needed(",".join(str(v) for v in self.value_as_tuple)) return f"{self.name}{delim}{values}" @@ -423,7 +469,7 @@ class MultiValuedVariant(AbstractVariant): """A variant that can hold multiple values at once.""" @implicit_variant_conversion - def satisfies(self, other): + def satisfies(self, other: AbstractVariant) -> bool: """Returns true if ``other.name == self.name`` and ``other.value`` is a strict subset of self. Does not try to validate. @@ -443,22 +489,25 @@ def satisfies(self, other): # allow prefix find on patches if self.name == "patches": - return all(any(w.startswith(v) for w in self.value) for v in other.value) + return all( + any(str(w).startswith(str(v)) for w in self.value_as_tuple) + for v in other.value_as_tuple + ) # Otherwise we want all the values in `other` to be also in `self` - return all(v in self.value for v in other.value) + return all(v in self for v in other.value_as_tuple) - def append(self, value): + def append(self, value: Union[str, bool]) -> None: """Add another value to this multi-valued variant.""" - self._value = tuple(sorted((value,) + self._value)) - self._original_value = ",".join(self._value) + self._value = tuple(sorted((value,) + self.value_as_tuple)) + self._original_value = ",".join(str(v) for v in self._value) - def __str__(self): + def __str__(self) -> str: # Special-case patches to not print the full 64 character sha256 if self.name == "patches": - values_str = ",".join(x[:7] for x in self.value) + values_str = ",".join(str(x)[:7] for x in self.value_as_tuple) else: - values_str = ",".join(str(x) for x in self.value) + values_str = ",".join(str(x) for x in self.value_as_tuple) delim = "==" if self.propagate else "=" return f"{self.name}{delim}{spack.parser.quote_if_needed(values_str)}" @@ -467,35 +516,33 @@ def __str__(self): class SingleValuedVariant(AbstractVariant): """A variant that can hold multiple values, but one at a time.""" - def _value_setter(self, value): + def _value_setter(self, value: ValueType) -> None: # Treat the value as a multi-valued variant super()._value_setter(value) # Then check if there's only a single value - if len(self._value) != 1: - raise MultipleValuesInExclusiveVariantError(self, None) - self._value = str(self._value[0]) + values = self.value_as_tuple + if len(values) != 1: + raise MultipleValuesInExclusiveVariantError(self) - def __str__(self): - delim = "==" if self.propagate else "=" - return f"{self.name}{delim}{spack.parser.quote_if_needed(self.value)}" + self._value = values[0] @implicit_variant_conversion - def satisfies(self, other): + def satisfies(self, other: "AbstractVariant") -> bool: abstract_sat = super().satisfies(other) return abstract_sat and ( self.value == other.value or other.value == "*" or self.value == "*" ) - def intersects(self, other): + def intersects(self, other: "AbstractVariant") -> bool: return self.satisfies(other) - def compatible(self, other): + def compatible(self, other: "AbstractVariant") -> bool: return self.satisfies(other) @implicit_variant_conversion - def constrain(self, other): + def constrain(self, other: "AbstractVariant") -> bool: if self.name != other.name: raise ValueError("variants must have the same name") @@ -510,12 +557,17 @@ def constrain(self, other): raise UnsatisfiableVariantSpecError(other.value, self.value) return False - def __contains__(self, item): + def __contains__(self, item: ValueType) -> bool: return item == self.value - def yaml_entry(self): + def yaml_entry(self) -> Tuple[str, SerializedValueType]: + assert isinstance(self.value, (bool, str)) return self.name, self.value + def __str__(self) -> str: + delim = "==" if self.propagate else "=" + return f"{self.name}{delim}{spack.parser.quote_if_needed(str(self.value))}" + class BoolValuedVariant(SingleValuedVariant): """A variant that can hold either True or False. @@ -523,7 +575,7 @@ class BoolValuedVariant(SingleValuedVariant): BoolValuedVariant can also hold the value '*', for coerced comparisons between ``foo=*`` and ``+foo`` or ``~foo``.""" - def _value_setter(self, value): + def _value_setter(self, value: ValueType) -> None: # Check the string representation of the value and turn # it to a boolean if str(value).upper() == "TRUE": @@ -540,13 +592,14 @@ def _value_setter(self, value): msg += "a value that does not represent a bool" raise ValueError(msg.format(self.name)) - def __contains__(self, item): + def __contains__(self, item: ValueType) -> bool: return item is self.value - def __str__(self): + def __str__(self) -> str: + sigil = "+" if self.value else "~" if self.propagate: - return "{0}{1}".format("++" if self.value else "~~", self.name) - return "{0}{1}".format("+" if self.value else "~", self.name) + sigil *= 2 + return f"{sigil}{self.name}" # The class below inherit from Sequence to disguise as a tuple and comply @@ -720,12 +773,15 @@ def disjoint_sets(*sets): class Value: """Conditional value that might be used in variants.""" - def __init__(self, value, when): + value: Any + when: Optional["spack.spec.Spec"] # optional b/c we need to know about disabled values + + def __init__(self, value: Any, when: Optional["spack.spec.Spec"]): self.value = value self.when = when def __repr__(self): - return "Value({0.value}, when={0.when})".format(self) + return f"Value({self.value}, when={self.when})" def __str__(self): return str(self.value) @@ -745,15 +801,92 @@ def __lt__(self, other): return self.value < other.value +def prevalidate_variant_value( + pkg_cls: "Type[spack.package_base.PackageBase]", + variant: AbstractVariant, + spec: Optional["spack.spec.Spec"] = None, + strict: bool = False, +) -> List[Variant]: + """Do as much validation of a variant value as is possible before concretization. + + This checks that the variant value is valid for *some* definition of the variant, and + it raises if we know *before* concretization that the value cannot occur. On success + it returns the variant definitions for which the variant is valid. + + Arguments: + pkg_cls: package in which variant is (potentially multiply) defined + variant: variant spec with value to validate + spec: optionally restrict validation only to variants defined for this spec + strict: if True, raise an exception if no variant definition is valid for any + constraint on the spec. + + Return: + list of variant definitions that will accept the given value. List will be empty + only if the variant is a reserved variant. + """ + # don't validate wildcards or variants with reserved names + if variant.value == ("*",) or variant.name in reserved_names: + return [] + + # raise if there is no definition at all + if not pkg_cls.has_variant(variant.name): + raise UnknownVariantError( + f"No such variant '{variant.name}' in package {pkg_cls.name}", [variant.name] + ) + + # do as much prevalidation as we can -- check only those + # variants whose when constraint intersects this spec + errors = [] + possible_definitions = [] + valid_definitions = [] + + for when, pkg_variant_def in pkg_cls.variant_definitions(variant.name): + if spec and not spec.intersects(when): + continue + possible_definitions.append(pkg_variant_def) + + try: + pkg_variant_def.validate_or_raise(variant, pkg_cls.name) + valid_definitions.append(pkg_variant_def) + except spack.error.SpecError as e: + errors.append(e) + + # value is valid for at least one definition -- return them all + if valid_definitions: + return valid_definitions + + # no when spec intersected, so no possible definition for the variant in this configuration + if strict and not possible_definitions: + when_clause = f" when {spec}" if spec else "" + raise InvalidVariantValueError( + f"variant '{variant.name}' does not exist for '{pkg_cls.name}'{when_clause}" + ) + + # There are only no errors if we're not strict and there are no possible_definitions. + # We are strict for audits but not for specs on the CLI or elsewhere. Being strict + # in these cases would violate our rule of being able to *talk* about any configuration, + # regardless of what the package.py currently says. + if not errors: + return [] + + # if there is just one error, raise the specific error + if len(errors) == 1: + raise errors[0] + + # otherwise combine all the errors and raise them together + raise InvalidVariantValueError( + "multiple variant issues:", "\n".join(e.message for e in errors) + ) + + class _ConditionalVariantValues(lang.TypedMutableSequence): """A list, just with a different type""" -def conditional(*values, **kwargs): +def conditional(*values: List[Any], when: Optional["spack.directives.WhenType"] = None): """Conditional values that can be used in variant declarations.""" - if len(kwargs) != 1 and "when" not in kwargs: - raise ValueError('conditional statement expects a "when=" parameter only') - when = kwargs["when"] + # _make_when_spec returns None when the condition is statically false. + when = spack.directives._make_when_spec(when) return _ConditionalVariantValues([Value(x, when=when) for x in values]) @@ -764,15 +897,9 @@ class DuplicateVariantError(error.SpecError): class UnknownVariantError(error.SpecError): """Raised when an unknown variant occurs in a spec.""" - def __init__(self, spec, variants): - self.unknown_variants = variants - variant_str = "variant" if len(variants) == 1 else "variants" - msg = ( - 'trying to set {0} "{1}" in package "{2}", but the package' - " has no such {0} [happened when validating '{3}']" - ) - msg = msg.format(variant_str, comma_or(variants), spec.name, spec.root) + def __init__(self, msg: str, unknown_variants: List[str]): super().__init__(msg) + self.unknown_variants = unknown_variants class InconsistentValidationError(error.SpecError): @@ -788,11 +915,10 @@ class MultipleValuesInExclusiveVariantError(error.SpecError, ValueError): only one. """ - def __init__(self, variant, pkg): - msg = 'multiple values are not allowed for variant "{0.name}"{1}' - pkg_info = "" - if pkg is not None: - pkg_info = ' in package "{0}"'.format(pkg.name) + def __init__(self, variant: AbstractVariant, pkg_name: Optional[str] = None): + pkg_info = "" if pkg_name is None else f" in package '{pkg_name}'" + msg = f"multiple values are not allowed for variant '{variant.name}'{pkg_info}" + super().__init__(msg.format(variant, pkg_info)) @@ -801,23 +927,7 @@ class InvalidVariantValueCombinationError(error.SpecError): class InvalidVariantValueError(error.SpecError): - """Raised when a valid variant has at least an invalid value.""" - - def __init__(self, variant, invalid_values, pkg): - msg = 'invalid values for variant "{0.name}"{2}: {1}\n' - pkg_info = "" - if pkg is not None: - pkg_info = ' in package "{0}"'.format(pkg.name) - super().__init__(msg.format(variant, invalid_values, pkg_info)) - - -class InvalidVariantForSpecError(error.SpecError): - """Raised when an invalid conditional variant is specified.""" - - def __init__(self, variant, when, spec): - msg = "Invalid variant {0} for spec {1}.\n" - msg += "{0} is only available for {1.name} when satisfying one of {2}." - super().__init__(msg.format(variant, spec, when)) + """Raised when variants have invalid values.""" class UnsatisfiableVariantSpecError(error.UnsatisfiableSpecError): diff --git a/lib/spack/spack/verify.py b/lib/spack/spack/verify.py index 7125481c6d6b8c..9854e8906f4015 100644 --- a/lib/spack/spack/verify.py +++ b/lib/spack/spack/verify.py @@ -11,7 +11,6 @@ import llnl.util.tty as tty from llnl.util.symlink import readlink -import spack.filesystem_view import spack.store import spack.util.file_permissions as fp import spack.util.spack_json as sjson diff --git a/lib/spack/spack/version/git_ref_lookup.py b/lib/spack/spack/version/git_ref_lookup.py index 6168fc44a5266e..e7a3b02ce811cf 100644 --- a/lib/spack/spack/version/git_ref_lookup.py +++ b/lib/spack/spack/version/git_ref_lookup.py @@ -17,7 +17,6 @@ import spack.util.executable import spack.util.hash import spack.util.spack_json as sjson -import spack.version from .common import VersionLookupError from .lookup import AbstractRefLookup diff --git a/pyproject.toml b/pyproject.toml index 06aec6fc43a913..be97f0421ed687 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -70,17 +70,8 @@ features = [ [tool.black] line-length = 99 target-version = ['py36', 'py37', 'py38', 'py39', 'py310'] -include = ''' - \.pyi?$ -''' -extend-exclude = ''' -/( - \.git - | \.mypy_cache - | ^lib/spack/external/ - | ^opt/ -)/ -''' +include = '(lib/spack|var/spack/repos)/.*\.pyi?$|bin/spack$' +extend-exclude = 'lib/spack/external' skip_magic_trailing_comma = true [tool.isort] @@ -212,6 +203,14 @@ exclude_lines = [ ] ignore_errors = true +[tool.coverage.paths] +source = [ + ".", + "/Users/runner/work/spack/spack", + "/System/Volumes/Data/home/runner/work/spack/spack", + "D:\\a\\spack\\spack", +] + [tool.coverage.html] directory = "htmlcov" diff --git a/pytest.ini b/pytest.ini index 8465cb808594b0..79d187fa70d48c 100644 --- a/pytest.ini +++ b/pytest.ini @@ -15,3 +15,4 @@ markers = enable_compiler_execution: enable compiler execution to detect link paths and libc disable_clean_stage_check: avoid failing tests if there are leftover files in the stage area not_on_windows: mark tests that are skipped on Windows + only_windows: mark tests that are skipped everywhere but Windows diff --git a/share/spack/gitlab/cloud_pipelines/.gitlab-ci.yml b/share/spack/gitlab/cloud_pipelines/.gitlab-ci.yml index eceb9f3964ebca..dee82226cde6e3 100644 --- a/share/spack/gitlab/cloud_pipelines/.gitlab-ci.yml +++ b/share/spack/gitlab/cloud_pipelines/.gitlab-ci.yml @@ -181,6 +181,7 @@ default: - cat /proc/loadavg || true - cat /proc/meminfo | grep 'MemTotal\|MemFree' || true - . "./share/spack/setup-env.sh" + - spack arch after_script: - cat /proc/loadavg || true - cat /proc/meminfo | grep 'MemTotal\|MemFree' || true @@ -218,7 +219,7 @@ default: - $ErrorActionPreference=$ErrorActionOld tags: ["spack", "public", "medium", "x86_64-win"] - image: "ghcr.io/johnwparent/windows-server21h2:sha-c749cf3" + image: "ghcr.io/johnwparent/windows-server21h2:sha-1c12b61" .generate-deprecated: extends: [ ".base-job" ] @@ -376,7 +377,7 @@ e4s-neoverse_v1-build: e4s-rocm-external-generate: extends: [ ".e4s-rocm-external", ".generate-x86_64"] - image: ecpe4s/ubuntu22.04-runner-amd64-gcc-11.4-rocm6.1.2:2024.07.22 + image: ecpe4s/ubuntu22.04-runner-amd64-gcc-11.4-rocm6.2.0:2024.09.11 e4s-rocm-external-build: extends: [ ".e4s-rocm-external", ".build" ] @@ -422,7 +423,7 @@ e4s-rocm-external-build: e4s-oneapi-generate: extends: [ ".e4s-oneapi", ".generate-x86_64"] - image: ecpe4s/ubuntu22.04-runner-amd64-oneapi-2024.2:2024.06.21 + image: ecpe4s/ubuntu22.04-runner-amd64-oneapi-2024.2:2024.09.06 e4s-oneapi-build: extends: [ ".e4s-oneapi", ".build" ] @@ -690,7 +691,7 @@ tutorial-build: ml-linux-x86_64-cpu-generate: extends: [ ".generate-x86_64", .ml-linux-x86_64-cpu, ".tags-x86_64_v4" ] - image: ghcr.io/spack/ubuntu-22.04:v2024-05-07 + image: ghcr.io/spack/ubuntu-24.04:v2024-09-05-v2 ml-linux-x86_64-cpu-build: extends: [ ".build", ".ml-linux-x86_64-cpu" ] @@ -713,7 +714,7 @@ ml-linux-x86_64-cpu-build: ml-linux-x86_64-cuda-generate: extends: [ ".generate-x86_64", .ml-linux-x86_64-cuda, ".tags-x86_64_v4" ] - image: ghcr.io/spack/ubuntu-22.04:v2024-05-07 + image: ghcr.io/spack/ubuntu-24.04:v2024-09-05-v2 ml-linux-x86_64-cuda-build: extends: [ ".build", ".ml-linux-x86_64-cuda" ] @@ -736,7 +737,7 @@ ml-linux-x86_64-cuda-build: ml-linux-x86_64-rocm-generate: extends: [ ".generate-x86_64", .ml-linux-x86_64-rocm, ".tags-x86_64_v4" ] - image: ghcr.io/spack/ubuntu-22.04:v2024-05-07 + image: ghcr.io/spack/ubuntu-24.04:v2024-09-05-v2 ml-linux-x86_64-rocm-build: extends: [ ".build", ".ml-linux-x86_64-rocm" ] @@ -798,7 +799,7 @@ deprecated-ci-build: ######################################## .aws-pcluster-generate: - image: { "name": "ghcr.io/spack/pcluster-amazonlinux-2:v2024-01-29", "entrypoint": [""] } + image: { "name": "ghcr.io/spack/pcluster-amazonlinux-2:v2024-10-07", "entrypoint": [""] } before_script: # Use gcc from pre-installed spack store - - . "./share/spack/setup-env.sh" diff --git a/share/spack/gitlab/cloud_pipelines/configs/ci.yaml b/share/spack/gitlab/cloud_pipelines/configs/ci.yaml index 5f34beb2c58fee..5ad2b7cd9894fb 100644 --- a/share/spack/gitlab/cloud_pipelines/configs/ci.yaml +++ b/share/spack/gitlab/cloud_pipelines/configs/ci.yaml @@ -2,7 +2,6 @@ ci: target: gitlab broken-tests-packages: - - gptune - superlu-dist # srun -n 4 hangs - papyrus @@ -107,10 +106,15 @@ ci: - noop-job: tags: ["service"] + image: busybox:latest variables: + CI_OIDC_REQUIRED: 0 + GIT_STRATEGY: "none" CI_JOB_SIZE: "small" KUBERNETES_CPU_REQUEST: "500m" KUBERNETES_MEMORY_REQUEST: "500M" + before_script:: [] + after_script:: [] - any-job: tags: ["spack"] diff --git a/share/spack/gitlab/cloud_pipelines/configs/win64/ci.yaml b/share/spack/gitlab/cloud_pipelines/configs/win64/ci.yaml index 834c640fc36218..2d8aedf6d44455 100644 --- a/share/spack/gitlab/cloud_pipelines/configs/win64/ci.yaml +++ b/share/spack/gitlab/cloud_pipelines/configs/win64/ci.yaml @@ -15,4 +15,4 @@ ci: - spack.ps1 config add "config:install_tree:projections:${SPACK_JOB_SPEC_PKG_NAME}:'morepadding/{hash}'" - mkdir ${SPACK_ARTIFACTS_ROOT}/user_data - spack.ps1 --backtrace ci rebuild | Tee-Object -FilePath "${env:SPACK_ARTIFACTS_ROOT}/user_data/pipeline_out.txt" 2>&1 | Tee-Object -FilePath "${env:SPACK_ARTIFACTS_ROOT}/user_data/pipeline_err.txt" - image: "ghcr.io/johnwparent/windows-server21h2:sha-c749cf3" + image: "ghcr.io/johnwparent/windows-server21h2:sha-1c12b61" diff --git a/share/spack/gitlab/cloud_pipelines/scripts/pcluster/setup-pcluster.sh b/share/spack/gitlab/cloud_pipelines/scripts/pcluster/setup-pcluster.sh index 484be10f06137a..fc77f56e769459 100755 --- a/share/spack/gitlab/cloud_pipelines/scripts/pcluster/setup-pcluster.sh +++ b/share/spack/gitlab/cloud_pipelines/scripts/pcluster/setup-pcluster.sh @@ -6,29 +6,19 @@ # SPDX-License-Identifier: (Apache-2.0 OR MIT) set -e -# Intel compiler needs to be installed from a specific spack git commit. -# The best solution would be to have the compilers hash (or packages contents) be part of the -# individual packages hashes. I don't see this at the moment. -# Set to the latest tag including a recent oneapi compiler. -# NOTE: If we update this spack version in the future make sure the compiler version also updates. -spack_intel_compiler_commit="develop-2023-08-06" - set_pcluster_defaults() { # Set versions of pre-installed software in packages.yaml - [ -z "${SLURM_VERSION}" ] && SLURM_VERSION=$(strings /opt/slurm/lib/libslurm.so | grep -e '^VERSION' | awk '{print $2}' | sed -e 's?"??g') + [ -z "${SLURM_ROOT}" ] && ls /etc/systemd/system/slurm* &>/dev/null && \ + SLURM_ROOT=$(dirname $(dirname "$(awk '/ExecStart=/ {print $1}' /etc/systemd/system/slurm* | sed -e 's?^.*=??1' | head -n1)")) + # Fallback to default location if SLURM not in systemd + [ -z "${SLURM_ROOT}" ] && [ -d "/opt/slurm" ] && SLURM_ROOT=/opt/slurm + [ -z "${SLURM_VERSION}" ] && SLURM_VERSION=$(strings "${SLURM_ROOT}"/lib/libslurm.so | grep -e '^VERSION' | awk '{print $2}' | sed -e 's?"??g') [ -z "${LIBFABRIC_VERSION}" ] && LIBFABRIC_VERSION=$(awk '/Version:/{print $2}' "$(find /opt/amazon/efa/ -name libfabric.pc | head -n1)" | sed -e 's?~??g' -e 's?amzn.*??g') - export SLURM_VERSION LIBFABRIC_VERSION + export SLURM_ROOT SLURM_VERSION LIBFABRIC_VERSION envsubst < "${SPACK_ROOT}/share/spack/gitlab/cloud_pipelines/stacks/${SPACK_CI_STACK_NAME}/packages.yaml" > "${SPACK_ROOT}"/etc/spack/packages.yaml } -setup_spack() { - spack compiler add --scope site - # Do not add autotools/buildtools packages. These versions need to be managed by spack or it will - # eventually end up in a version mismatch (e.g. when compiling gmp). - spack external find --scope site --tag core-packages -} - patch_compilers_yaml() { # Graceful exit if package not found by spack set -o pipefail @@ -76,55 +66,47 @@ EOF } install_compilers() { - # We need to treat compilers as essentially external, i.e. their installation location - # (including hash) must not change when any changes are pushed to spack. The reason is that - # changes in the compilers are not reflected in the package hashes built in the CI. Hence, those - # packages will reference a wrong compiler path once the path changes. - - # `gcc@12.3.0%gcc@7.3.1` is created as part of building the pipeline containers. - # `ghcr.io/spack/pcluster-amazonlinux-2:v2024-01-29` produced the following hashes. - if [ "x86_64" == "$(arch)" ]; then - gcc_hash="vxlibl3ubl5ptwzb3zydgksfa5osdea6" - else - gcc_hash="bikooik6f3fyrkroarulsadbii43ggz5" - fi - - spack install /${gcc_hash} - ( - spack load gcc - spack compiler add --scope site - ) - # Install Intel compilers through a static spack version such that the compiler's hash does not change. # The compilers needs to be in the same install tree as the rest of the software such that the path # relocation works correctly. This holds the danger that this part will fail when the current spack gets # incompatible with the one in $spack_intel_compiler_commit. Therefore, we make intel installations optional - # in package.yaml files and add a fallback `%gcc` version for each application. - if [ "x86_64" == "$(arch)" ]; then + # in packages.yaml files and add a fallback `%gcc` version for each application. + if [ -f "/bootstrap-compilers/spack/etc/spack/compilers.yaml" ]; then + # Running inside a gitlab CI container + # Intel and gcc@12 compiler are pre-installed and their location is known in + cp /bootstrap-compilers/spack/etc/spack/compilers.yaml "${SPACK_ROOT}"/etc/spack/ + else + spack compiler add --scope site + # We need to treat compilers as essentially external, i.e. their installation location + # (including hash) must not change when any changes are pushed to spack. The reason is that + # changes in the compilers are not reflected in the package hashes built in the CI. Hence, those + # packages will reference a wrong compiler path once the path changes. + + # `gcc@12.4.0%gcc@7.3.1` is created as part of building the pipeline containers. + # `ghcr.io/spack/pcluster-amazonlinux-2:v2024-10-07` produced the following hashes. + if [ "x86_64" == "$(arch)" ]; then + gcc_hash="pttzchh7o54nhmycj4wgzw5mic6rk2nb" + else + gcc_hash="v6wxye6ijzrxnzxftcwnpu3psohsjl2b" + fi + + spack install /${gcc_hash} ( - CURRENT_SPACK_ROOT=${SPACK_ROOT} - DIR="$(mktemp -d)" - cd "${DIR}" - # This needs to include commit 361a185ddb such that `ifx` picks up the correct toolchain. Otherwise - # this leads to libstdc++.so errors during linking (e.g. slepc). - git clone --depth=1 -b ${spack_intel_compiler_commit} https://github.com/spack/spack.git \ - && cd spack \ - && curl -sL https://github.com/spack/spack/pull/40557.patch | patch -p1 \ - && curl -sL https://github.com/spack/spack/pull/40561.patch | patch -p1 \ - && cp "${CURRENT_SPACK_ROOT}/etc/spack/config.yaml" etc/spack/ \ - && cp "${CURRENT_SPACK_ROOT}/etc/spack/compilers.yaml" etc/spack/ \ - && cp "${CURRENT_SPACK_ROOT}/etc/spack/packages.yaml" etc/spack/ \ - && . share/spack/setup-env.sh \ - && spack install intel-oneapi-compilers-classic - rm -rf "${DIR}" + spack load gcc + spack compiler add --scope site ) - bash -c ". \"$(spack location -i intel-oneapi-compilers)\"/setvars.sh; spack compiler add --scope site" \ - || true - spack clean -m + + if [ "x86_64" == "$(arch)" ]; then + # 2024.1.0 is the last oneapi compiler that works on AL2 and is the one used to compile packages in the build cache. + spack install intel-oneapi-compilers@2024.1.0 + ( + . "$(spack location -i intel-oneapi-compilers)"/setvars.sh; spack compiler add --scope site \ + || true + ) + fi fi } set_pcluster_defaults -setup_spack install_compilers patch_compilers_yaml diff --git a/share/spack/gitlab/cloud_pipelines/stacks/aws-pcluster-neoverse_v1/packages.yaml b/share/spack/gitlab/cloud_pipelines/stacks/aws-pcluster-neoverse_v1/packages.yaml index d896216fdf80eb..c5e36807382e55 100644 --- a/share/spack/gitlab/cloud_pipelines/stacks/aws-pcluster-neoverse_v1/packages.yaml +++ b/share/spack/gitlab/cloud_pipelines/stacks/aws-pcluster-neoverse_v1/packages.yaml @@ -47,7 +47,7 @@ packages: slurm: buildable: false externals: - - prefix: /opt/slurm/ + - prefix: ${SLURM_ROOT} spec: slurm@${SLURM_VERSION} +pmix wrf: require: diff --git a/share/spack/gitlab/cloud_pipelines/stacks/aws-pcluster-neoverse_v1/spack.yaml b/share/spack/gitlab/cloud_pipelines/stacks/aws-pcluster-neoverse_v1/spack.yaml index a75d39f488b54d..f4080b1e6546de 100644 --- a/share/spack/gitlab/cloud_pipelines/stacks/aws-pcluster-neoverse_v1/spack.yaml +++ b/share/spack/gitlab/cloud_pipelines/stacks/aws-pcluster-neoverse_v1/spack.yaml @@ -7,8 +7,7 @@ spack: - mpas-model - mpich - openfoam - # - quantum-espresso : %gcc@12.3.0 on neoverse_v1 fails. - # Root cause: internal compiler error: in compute_live_loop_exits, at tree-ssa-loop-manip.cc:247 + - quantum-espresso - wrf - targets: @@ -22,7 +21,7 @@ spack: ci: pipeline-gen: - build-job: - image: { "name": "ghcr.io/spack/pcluster-amazonlinux-2:v2024-01-29", "entrypoint": [""] } + image: { "name": "ghcr.io/spack/pcluster-amazonlinux-2:v2024-10-07", "entrypoint": [""] } tags: ["aarch64"] before_script: - - . "./share/spack/setup-env.sh" diff --git a/share/spack/gitlab/cloud_pipelines/stacks/aws-pcluster-x86_64_v4/packages.yaml b/share/spack/gitlab/cloud_pipelines/stacks/aws-pcluster-x86_64_v4/packages.yaml index d4282f8efde160..eafcd37e58a186 100644 --- a/share/spack/gitlab/cloud_pipelines/stacks/aws-pcluster-x86_64_v4/packages.yaml +++ b/share/spack/gitlab/cloud_pipelines/stacks/aws-pcluster-x86_64_v4/packages.yaml @@ -19,6 +19,10 @@ packages: - "+intel_provided_gcc ^intel-oneapi-mkl target=x86_64_v4" - "+intel_provided_gcc ^intel-oneapi-mkl target=x86_64_v3" when: "%intel" + - one_of: + - "+intel_provided_gcc target=x86_64_v4 ^intel-oneapi-mkl" + - "+intel_provided_gcc target=x86_64_v3 ^intel-oneapi-mkl" + when: "%oneapi" intel-oneapi-compilers: require: "intel-oneapi-compilers %gcc target=x86_64_v3" intel-oneapi-mpi: @@ -29,6 +33,10 @@ packages: - "lammps_sizes=bigbig +molecule +kspace +rigid +asphere +opt +openmp +openmp-package +intel fft=mkl ^intel-oneapi-mkl target=x86_64_v4" - "lammps_sizes=bigbig +molecule +kspace +rigid +asphere +opt +openmp +openmp-package fft=mkl ^intel-oneapi-mkl target=x86_64_v3" when: "%intel" + - one_of: + - "lammps_sizes=bigbig +molecule +kspace +rigid +asphere +opt +openmp +openmp-package +intel fft=mkl ^intel-oneapi-mkl target=x86_64_v4" + - "lammps_sizes=bigbig +molecule +kspace +rigid +asphere +opt +openmp +openmp-package fft=mkl ^intel-oneapi-mkl target=x86_64_v3" + when: "%oneapi" libidn2: require: - one_of: @@ -53,6 +61,10 @@ packages: - "precision=single ^parallelio+pnetcdf target=x86_64_v4" - "precision=single ^parallelio+pnetcdf target=x86_64_v3" when: "%intel" + - one_of: + - "precision=single ^parallelio+pnetcdf target=x86_64_v4" + - "precision=single ^parallelio+pnetcdf target=x86_64_v3" + when: "%oneapi" mpich: require: - one_of: @@ -89,10 +101,14 @@ packages: - "quantum-espresso@6.6 ^intel-oneapi-mkl+cluster target=x86_64_v4" - "quantum-espresso@6.6 ^intel-oneapi-mkl+cluster target=x86_64_v3" when: "%intel" + - one_of: + - "quantum-espresso@6.6 ^intel-oneapi-mkl+cluster target=x86_64_v4" + - "quantum-espresso@6.6 ^intel-oneapi-mkl+cluster target=x86_64_v3" + when: "%oneapi" slurm: buildable: false externals: - - prefix: /opt/slurm/ + - prefix: ${SLURM_ROOT} spec: slurm@${SLURM_VERSION} +pmix wrf: require: @@ -101,9 +117,14 @@ packages: - "wrf@4 build_type=dm+sm target=x86_64_v3" - "wrf@4.2.2 +netcdf_classic fflags=\"-fp-model fast=2 -no-heap-arrays -no-prec-div -no-prec-sqrt -fno-common\" build_type=dm+sm target=x86_64_v3" when: "%intel" + - one_of: + - "wrf@4 build_type=dm+sm target=x86_64_v4" + - "wrf@4 build_type=dm+sm target=x86_64_v3" + - "wrf@4.2.2 +netcdf_classic fflags=\"-fp-model fast=2 -no-heap-arrays -no-prec-div -no-prec-sqrt -fno-common\" build_type=dm+sm target=x86_64_v3" + when: "%oneapi" all: - compiler: [intel, oneapi, gcc] + compiler: [oneapi, gcc] permissions: read: world write: user diff --git a/share/spack/gitlab/cloud_pipelines/stacks/aws-pcluster-x86_64_v4/spack.yaml b/share/spack/gitlab/cloud_pipelines/stacks/aws-pcluster-x86_64_v4/spack.yaml index 7fc52115b39505..23cc11d9089de6 100644 --- a/share/spack/gitlab/cloud_pipelines/stacks/aws-pcluster-x86_64_v4/spack.yaml +++ b/share/spack/gitlab/cloud_pipelines/stacks/aws-pcluster-x86_64_v4/spack.yaml @@ -3,14 +3,18 @@ spack: definitions: - apps: - - gromacs %intel - - lammps %intel - - mpas-model %intel + - gromacs %oneapi + - lammps %oneapi + # earliest oneapi version with fix does not run on AmazonLinux2, see https://github.com/spack/spack/pull/46457 + # - mpas-model %oneapi - openfoam %gcc - palace %oneapi ^superlu-dist%oneapi # hack: force fortran-rt provider through superlu-dist - - quantum-espresso %intel - # - wrf : While building hdf5 cmake errors out with Detecting Fortran/C Interface: Failed to compile - # Root cause: ifort cannot deal with arbitrarily long file names. + # Latest version qunatum-espresso@7.3.1 does not build with oneapi, see https://github.com/spack/spack/pull/46456#issuecomment-2363159511 + # - quantum-espresso %oneapi + - openmpi %oneapi + # TODO: oneapi patch in WRF is broken. It uses link time optimization but the gnu linker. Need to check whether the WRF recipe (in later releases) is better. + # WRf can only run if https://github.com/spack/spack/pull/46589 is merged. + # - wrf %oneapi - targets: - 'target=x86_64_v4' @@ -23,7 +27,7 @@ spack: ci: pipeline-gen: - build-job: - image: { "name": "ghcr.io/spack/pcluster-amazonlinux-2:v2024-01-29", "entrypoint": [""] } + image: { "name": "ghcr.io/spack/pcluster-amazonlinux-2:v2024-10-07", "entrypoint": [""] } before_script: - - . "./share/spack/setup-env.sh" - . /etc/profile.d/modules.sh diff --git a/share/spack/gitlab/cloud_pipelines/stacks/developer-tools-manylinux2014/spack.yaml b/share/spack/gitlab/cloud_pipelines/stacks/developer-tools-manylinux2014/spack.yaml index 2d35ac7edd19be..863f4a339582e8 100644 --- a/share/spack/gitlab/cloud_pipelines/stacks/developer-tools-manylinux2014/spack.yaml +++ b/share/spack/gitlab/cloud_pipelines/stacks/developer-tools-manylinux2014/spack.yaml @@ -10,7 +10,7 @@ spack: # editors - neovim~no_luajit - py-pynvim - - emacs@29.1+json+native+treesitter # note, pulls in gcc + - emacs+json+native+treesitter # note, pulls in gcc # - tree-sitter is a dep, should also have cli but no package - nano # just in case # tags and scope search helpers diff --git a/share/spack/gitlab/cloud_pipelines/stacks/e4s-oneapi/spack.yaml b/share/spack/gitlab/cloud_pipelines/stacks/e4s-oneapi/spack.yaml index 2509938d6ea6c8..112afaaff46db6 100644 --- a/share/spack/gitlab/cloud_pipelines/stacks/e4s-oneapi/spack.yaml +++ b/share/spack/gitlab/cloud_pipelines/stacks/e4s-oneapi/spack.yaml @@ -242,7 +242,7 @@ spack: ci: pipeline-gen: - build-job: - image: ecpe4s/ubuntu22.04-runner-amd64-oneapi-2024.2:2024.06.21 + image: ecpe4s/ubuntu22.04-runner-amd64-oneapi-2024.2:2024.09.06 cdash: build-group: E4S OneAPI diff --git a/share/spack/gitlab/cloud_pipelines/stacks/e4s-rocm-external/spack.yaml b/share/spack/gitlab/cloud_pipelines/stacks/e4s-rocm-external/spack.yaml index 6344a725c3e754..f3391b7337ad72 100644 --- a/share/spack/gitlab/cloud_pipelines/stacks/e4s-rocm-external/spack.yaml +++ b/share/spack/gitlab/cloud_pipelines/stacks/e4s-rocm-external/spack.yaml @@ -27,186 +27,186 @@ spack: comgr: buildable: false externals: - - spec: comgr@6.1.2 - prefix: /opt/rocm-6.1.2/ + - spec: comgr@6.2.0 + prefix: /opt/rocm-6.2.0/ hip-rocclr: buildable: false externals: - - spec: hip-rocclr@6.1.2 - prefix: /opt/rocm-6.1.2/hip + - spec: hip-rocclr@6.2.0 + prefix: /opt/rocm-6.2.0/hip hipblas: buildable: false externals: - - spec: hipblas@6.1.2 - prefix: /opt/rocm-6.1.2/ + - spec: hipblas@6.2.0 + prefix: /opt/rocm-6.2.0/ hipcub: buildable: false externals: - - spec: hipcub@6.1.2 - prefix: /opt/rocm-6.1.2/ + - spec: hipcub@6.2.0 + prefix: /opt/rocm-6.2.0/ hipfft: buildable: false externals: - - spec: hipfft@6.1.2 - prefix: /opt/rocm-6.1.2/ + - spec: hipfft@6.2.0 + prefix: /opt/rocm-6.2.0/ hipsparse: buildable: false externals: - - spec: hipsparse@6.1.2 - prefix: /opt/rocm-6.1.2/ + - spec: hipsparse@6.2.0 + prefix: /opt/rocm-6.2.0/ miopen-hip: buildable: false externals: - - spec: miopen-hip@6.1.2 - prefix: /opt/rocm-6.1.2/ + - spec: miopen-hip@6.2.0 + prefix: /opt/rocm-6.2.0/ miopengemm: buildable: false externals: - - spec: miopengemm@6.1.2 - prefix: /opt/rocm-6.1.2/ + - spec: miopengemm@6.2.0 + prefix: /opt/rocm-6.2.0/ rccl: buildable: false externals: - - spec: rccl@6.1.2 - prefix: /opt/rocm-6.1.2/ + - spec: rccl@6.2.0 + prefix: /opt/rocm-6.2.0/ rocblas: buildable: false externals: - - spec: rocblas@6.1.2 - prefix: /opt/rocm-6.1.2/ + - spec: rocblas@6.2.0 + prefix: /opt/rocm-6.2.0/ rocfft: buildable: false externals: - - spec: rocfft@6.1.2 - prefix: /opt/rocm-6.1.2/ + - spec: rocfft@6.2.0 + prefix: /opt/rocm-6.2.0/ rocm-clang-ocl: buildable: false externals: - - spec: rocm-clang-ocl@6.1.2 - prefix: /opt/rocm-6.1.2/ + - spec: rocm-clang-ocl@6.2.0 + prefix: /opt/rocm-6.2.0/ rocm-cmake: buildable: false externals: - - spec: rocm-cmake@6.1.2 - prefix: /opt/rocm-6.1.2/ + - spec: rocm-cmake@6.2.0 + prefix: /opt/rocm-6.2.0/ rocm-dbgapi: buildable: false externals: - - spec: rocm-dbgapi@6.1.2 - prefix: /opt/rocm-6.1.2/ + - spec: rocm-dbgapi@6.2.0 + prefix: /opt/rocm-6.2.0/ rocm-debug-agent: buildable: false externals: - - spec: rocm-debug-agent@6.1.2 - prefix: /opt/rocm-6.1.2/ + - spec: rocm-debug-agent@6.2.0 + prefix: /opt/rocm-6.2.0/ rocm-device-libs: buildable: false externals: - - spec: rocm-device-libs@6.1.2 - prefix: /opt/rocm-6.1.2/ + - spec: rocm-device-libs@6.2.0 + prefix: /opt/rocm-6.2.0/ rocm-gdb: buildable: false externals: - - spec: rocm-gdb@6.1.2 - prefix: /opt/rocm-6.1.2/ + - spec: rocm-gdb@6.2.0 + prefix: /opt/rocm-6.2.0/ rocm-opencl: buildable: false externals: - - spec: rocm-opencl@6.1.2 - prefix: /opt/rocm-6.1.2/opencl + - spec: rocm-opencl@6.2.0 + prefix: /opt/rocm-6.2.0/opencl rocm-smi-lib: buildable: false externals: - - spec: rocm-smi-lib@6.1.2 - prefix: /opt/rocm-6.1.2/ + - spec: rocm-smi-lib@6.2.0 + prefix: /opt/rocm-6.2.0/ hip: buildable: false externals: - - spec: hip@6.1.2 - prefix: /opt/rocm-6.1.2 + - spec: hip@6.2.0 + prefix: /opt/rocm-6.2.0 extra_attributes: compilers: - c: /opt/rocm-6.1.2/llvm/bin/clang++ - c++: /opt/rocm-6.1.2/llvm/bin/clang++ - hip: /opt/rocm-6.1.2/hip/bin/hipcc + c: /opt/rocm-6.2.0/llvm/bin/clang++ + c++: /opt/rocm-6.2.0/llvm/bin/clang++ + hip: /opt/rocm-6.2.0/hip/bin/hipcc hipify-clang: buildable: false externals: - - spec: hipify-clang@6.1.2 - prefix: /opt/rocm-6.1.2 + - spec: hipify-clang@6.2.0 + prefix: /opt/rocm-6.2.0 llvm-amdgpu: buildable: false externals: - - spec: llvm-amdgpu@6.1.2 - prefix: /opt/rocm-6.1.2/llvm + - spec: llvm-amdgpu@6.2.0 + prefix: /opt/rocm-6.2.0/llvm extra_attributes: compilers: - c: /opt/rocm-6.1.2/llvm/bin/clang++ - cxx: /opt/rocm-6.1.2/llvm/bin/clang++ + c: /opt/rocm-6.2.0/llvm/bin/clang++ + cxx: /opt/rocm-6.2.0/llvm/bin/clang++ hsakmt-roct: buildable: false externals: - - spec: hsakmt-roct@6.1.2 - prefix: /opt/rocm-6.1.2/ + - spec: hsakmt-roct@6.2.0 + prefix: /opt/rocm-6.2.0/ hsa-rocr-dev: buildable: false externals: - - spec: hsa-rocr-dev@6.1.2 - prefix: /opt/rocm-6.1.2/ + - spec: hsa-rocr-dev@6.2.0 + prefix: /opt/rocm-6.2.0/ extra_atributes: compilers: - c: /opt/rocm-6.1.2/llvm/bin/clang++ - cxx: /opt/rocm-6.1.2/llvm/bin/clang++ + c: /opt/rocm-6.2.0/llvm/bin/clang++ + cxx: /opt/rocm-6.2.0/llvm/bin/clang++ roctracer-dev-api: buildable: false externals: - - spec: roctracer-dev-api@6.1.2 - prefix: /opt/rocm-6.1.2 + - spec: roctracer-dev-api@6.2.0 + prefix: /opt/rocm-6.2.0 roctracer-dev: buildable: false externals: - spec: roctracer-dev@4.5.3 - prefix: /opt/rocm-6.1.2 + prefix: /opt/rocm-6.2.0 rocprim: buildable: false externals: - - spec: rocprim@6.1.2 - prefix: /opt/rocm-6.1.2 + - spec: rocprim@6.2.0 + prefix: /opt/rocm-6.2.0 rocrand: buildable: false externals: - - spec: rocrand@6.1.2 - prefix: /opt/rocm-6.1.2 + - spec: rocrand@6.2.0 + prefix: /opt/rocm-6.2.0 hipsolver: buildable: false externals: - - spec: hipsolver@6.1.2 - prefix: /opt/rocm-6.1.2 + - spec: hipsolver@6.2.0 + prefix: /opt/rocm-6.2.0 rocsolver: buildable: false externals: - - spec: rocsolver@6.1.2 - prefix: /opt/rocm-6.1.2 + - spec: rocsolver@6.2.0 + prefix: /opt/rocm-6.2.0 rocsparse: buildable: false externals: - - spec: rocsparse@6.1.2 - prefix: /opt/rocm-6.1.2 + - spec: rocsparse@6.2.0 + prefix: /opt/rocm-6.2.0 rocthrust: buildable: false externals: - - spec: rocthrust@6.1.2 - prefix: /opt/rocm-6.1.2 + - spec: rocthrust@6.2.0 + prefix: /opt/rocm-6.2.0 rocprofiler-dev: buildable: false externals: - - spec: rocprofiler-dev@6.1.2 - prefix: /opt/rocm-6.1.2 + - spec: rocprofiler-dev@6.2.0 + prefix: /opt/rocm-6.2.0 rocm-core: buildable: false externals: - - spec: rocm-core@6.1.2 - prefix: /opt/rocm-6.1.2 + - spec: rocm-core@6.2.0 + prefix: /opt/rocm-6.2.0 specs: # ROCM NOARCH @@ -302,7 +302,7 @@ spack: ci: pipeline-gen: - build-job: - image: ecpe4s/ubuntu22.04-runner-amd64-gcc-11.4-rocm6.1.2:2024.07.22 + image: ecpe4s/ubuntu22.04-runner-amd64-gcc-11.4-rocm6.2.0:2024.09.11 cdash: build-group: E4S ROCm External diff --git a/share/spack/gitlab/cloud_pipelines/stacks/gpu-tests/spack.yaml b/share/spack/gitlab/cloud_pipelines/stacks/gpu-tests/spack.yaml index addccd7bd21a83..986ffa2f4648ac 100644 --- a/share/spack/gitlab/cloud_pipelines/stacks/gpu-tests/spack.yaml +++ b/share/spack/gitlab/cloud_pipelines/stacks/gpu-tests/spack.yaml @@ -16,7 +16,7 @@ spack: boost: variants: +python +filesystem +iostreams +system elfutils: - variants: +bzip2 ~nls +xz + variants: ~nls hdf5: variants: +fortran +hl +shared libfabric: diff --git a/share/spack/gitlab/cloud_pipelines/stacks/ml-linux-x86_64-cpu/spack.yaml b/share/spack/gitlab/cloud_pipelines/stacks/ml-linux-x86_64-cpu/spack.yaml index 5656455adf5471..31ca52dd394c67 100644 --- a/share/spack/gitlab/cloud_pipelines/stacks/ml-linux-x86_64-cpu/spack.yaml +++ b/share/spack/gitlab/cloud_pipelines/stacks/ml-linux-x86_64-cpu/spack.yaml @@ -67,7 +67,6 @@ spack: # TensorFlow - py-tensorflow - py-tensorflow-datasets - - py-tensorflow-estimator - py-tensorflow-hub - py-tensorflow-metadata - py-tensorflow-probability @@ -79,7 +78,7 @@ spack: pipeline-gen: - build-job: image: - name: ghcr.io/spack/ubuntu-22.04:v2024-05-07 + name: ghcr.io/spack/ubuntu-24.04:v2024-09-05-v2 entrypoint: [''] cdash: diff --git a/share/spack/gitlab/cloud_pipelines/stacks/ml-linux-x86_64-cuda/spack.yaml b/share/spack/gitlab/cloud_pipelines/stacks/ml-linux-x86_64-cuda/spack.yaml index ef7234fd55ed57..05b570f8f9a9a5 100644 --- a/share/spack/gitlab/cloud_pipelines/stacks/ml-linux-x86_64-cuda/spack.yaml +++ b/share/spack/gitlab/cloud_pipelines/stacks/ml-linux-x86_64-cuda/spack.yaml @@ -54,7 +54,8 @@ spack: - py-torchfile - py-torchgeo - py-torchmetrics - - py-torchtext + # torchtext requires older pytorch, which requires older cuda, which doesn't support newer GCC + # - py-torchtext - py-torchvision - py-vector-quantize-pytorch @@ -71,19 +72,19 @@ spack: # TensorFlow - py-tensorflow - py-tensorflow-datasets - - py-tensorflow-estimator - py-tensorflow-hub - py-tensorflow-metadata - py-tensorflow-probability # XGBoost - - py-xgboost + # xgboost requires older cuda, which doesn't support newer GCC + # - py-xgboost ci: pipeline-gen: - build-job: image: - name: ghcr.io/spack/ubuntu-22.04:v2024-05-07 + name: ghcr.io/spack/ubuntu-24.04:v2024-09-05-v2 entrypoint: [''] cdash: diff --git a/share/spack/gitlab/cloud_pipelines/stacks/ml-linux-x86_64-rocm/spack.yaml b/share/spack/gitlab/cloud_pipelines/stacks/ml-linux-x86_64-rocm/spack.yaml index 7a236b136df636..4b66256255ab52 100644 --- a/share/spack/gitlab/cloud_pipelines/stacks/ml-linux-x86_64-rocm/spack.yaml +++ b/share/spack/gitlab/cloud_pipelines/stacks/ml-linux-x86_64-rocm/spack.yaml @@ -72,8 +72,6 @@ spack: # TensorFlow - py-tensorflow - py-tensorflow-datasets - # version 2.16 is not available - # - py-tensorflow-estimator - py-tensorflow-hub - py-tensorflow-metadata - py-tensorflow-probability @@ -86,7 +84,7 @@ spack: pipeline-gen: - build-job: image: - name: ghcr.io/spack/ubuntu-22.04:v2024-05-07 + name: ghcr.io/spack/ubuntu-24.04:v2024-09-05-v2 entrypoint: [''] cdash: diff --git a/share/spack/gitlab/cloud_pipelines/stacks/radiuss/spack.yaml b/share/spack/gitlab/cloud_pipelines/stacks/radiuss/spack.yaml index a8b064535b5102..3aea6fc48a435b 100644 --- a/share/spack/gitlab/cloud_pipelines/stacks/radiuss/spack.yaml +++ b/share/spack/gitlab/cloud_pipelines/stacks/radiuss/spack.yaml @@ -17,8 +17,8 @@ spack: - axom - blt - caliper - #- care ## ~benchmarks ~examples ~tests - #- chai ## ~examples + - care # ~benchmarks ~examples ~tests + - chai # ~examples - conduit # ^hdf5+shared - flux-core #- flux-sched @@ -31,6 +31,7 @@ spack: - py-merlin - py-shroud - raja # ~examples # ~tests + - raja-perf - samrai - scr - sundials diff --git a/share/spack/qa/bootstrap-file.py b/share/spack/qa/bootstrap-file.py new file mode 100644 index 00000000000000..720bd99bbce5a0 --- /dev/null +++ b/share/spack/qa/bootstrap-file.py @@ -0,0 +1,4 @@ +from spack.util.filesystem import file_command + +if __name__ == "__main__": + file_command() diff --git a/share/spack/qa/run-unit-tests b/share/spack/qa/run-unit-tests index ca9b0752f1bb68..28e34a71208995 100755 --- a/share/spack/qa/run-unit-tests +++ b/share/spack/qa/run-unit-tests @@ -47,7 +47,7 @@ $coverage_run $(which spack) python -c "import spack.pkg.builtin.mpileaks; repr( # Run unit tests with code coverage #----------------------------------------------------------- # Check if xdist is available -if python -m pytest -VV 2>&1 | grep xdist; then +if [[ "$UNIT_TEST_COVERAGE" != "true" ]] && python -m pytest -VV 2>&1 | grep xdist; then export PYTEST_ADDOPTS="$PYTEST_ADDOPTS --dist loadfile --tx '${SPACK_TEST_PARALLEL:=3}*popen//python=./bin/spack-tmpconfig python -u ./bin/spack python'" fi @@ -61,9 +61,9 @@ fi # where it seems that otherwise the configuration file might not be located by subprocesses # in some, not better specified, cases. if [[ "$UNIT_TEST_COVERAGE" == "true" ]]; then - $(which spack) unit-test -x --verbose --cov --cov-config=pyproject.toml --cov-report=xml:coverage.xml + "$(which spack)" unit-test -x --verbose --cov --cov-config=pyproject.toml --cov-report=xml:coverage.xml else - $(which spack) unit-test -x --verbose + "$(which spack)" unit-test -x --verbose fi diff --git a/share/spack/setup-env.csh b/share/spack/setup-env.csh index 14dcee56b79fca..d091caf8dd9a54 100644 --- a/share/spack/setup-env.csh +++ b/share/spack/setup-env.csh @@ -62,9 +62,9 @@ if (! $?SPACK_PYTHON) then setenv SPACK_PYTHON "" endif foreach cmd ("$SPACK_PYTHON" python3 python python2) - command -v "$cmd" >& /dev/null + set status=`which "$cmd" >& /dev/null; echo $?` if ($status == 0) then - setenv SPACK_PYTHON `command -v "$cmd"` + setenv SPACK_PYTHON `which "$cmd"` break endif end diff --git a/share/spack/spack-completion.bash b/share/spack/spack-completion.bash index a4a419563ae942..63fe311af6ee17 100644 --- a/share/spack/spack-completion.bash +++ b/share/spack/spack-completion.bash @@ -1199,7 +1199,12 @@ _spack_find() { } _spack_gc() { - SPACK_COMPREPLY="-h --help -E --except-any-environment -e --except-environment -b --keep-build-dependencies -y --yes-to-all" + if $list_options + then + SPACK_COMPREPLY="-h --help -E --except-any-environment -e --except-environment -b --keep-build-dependencies -y --yes-to-all" + else + _installed_packages + fi } _spack_gpg() { @@ -1303,7 +1308,7 @@ _spack_help() { _spack_info() { if $list_options then - SPACK_COMPREPLY="-h --help -a --all --detectable --maintainers --no-dependencies --no-variants --no-versions --phases --tags --tests --virtuals --variants-by-name" + SPACK_COMPREPLY="-h --help -a --all --detectable --maintainers --namespace --no-dependencies --no-variants --no-versions --phases --tags --tests --virtuals --variants-by-name" else _all_packages fi diff --git a/share/spack/spack-completion.fish b/share/spack/spack-completion.fish index 372eba22ca5a0b..538823852ad88a 100644 --- a/share/spack/spack-completion.fish +++ b/share/spack/spack-completion.fish @@ -353,7 +353,7 @@ complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a arch -d 'print ar complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a audit -d 'audit configuration files, packages, etc.' complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a blame -d 'show contributors to packages' complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a bootstrap -d 'manage bootstrap configuration' -complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a build-env -d 'run a command in a spec\'s install environment, or dump its environment to screen or file' +complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a build-env -d 'run a command in a spec'"'"'s install environment, or dump its environment to screen or file' complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a buildcache -d 'create, download and install binary packages' complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a cd -d 'cd to spack directories in the shell' complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a change -d 'change an existing spec in an environment' @@ -376,7 +376,7 @@ complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a dependencies -d ' complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a dependents -d 'show packages that depend on another' complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a deprecate -d 'replace one package with another via symlinks' complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a dev-build -d 'developer build: build from code in current working directory' -complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a develop -d 'add a spec to an environment\'s dev-build information' +complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a develop -d 'add a spec to an environment'"'"'s dev-build information' complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a diff -d 'compare two specs' complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a docs -d 'open spack documentation in a web browser' complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a edit -d 'open package files in $EDITOR' @@ -407,7 +407,7 @@ complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a pkg -d 'query pac complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a providers -d 'list packages that provide a particular virtual package' complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a pydoc -d 'run pydoc from within spack' complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a python -d 'launch an interpreter as spack would launch a command' -complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a reindex -d 'rebuild Spack\'s package database' +complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a reindex -d 'rebuild Spack'"'"'s package database' complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a remove -d 'remove specs from an environment' complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a rm -d 'remove specs from an environment' complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a repo -d 'manage package source repositories' @@ -418,12 +418,12 @@ complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a spec -d 'show wha complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a stage -d 'expand downloaded archive in preparation for install' complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a style -d 'runs source code style checks on spack' complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a tags -d 'show package tags and associated packages' -complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a test -d 'run spack\'s tests for an install' -complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a test-env -d 'run a command in a spec\'s test environment, or dump its environment to screen or file' +complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a test -d 'run spack'"'"'s tests for an install' +complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a test-env -d 'run a command in a spec'"'"'s test environment, or dump its environment to screen or file' complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a tutorial -d 'set up spack for our tutorial (WARNING: modifies config!)' complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a undevelop -d 'remove specs from an environment' complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a uninstall -d 'remove installed packages' -complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a unit-test -d 'run spack\'s unit tests (wrapper around pytest)' +complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a unit-test -d 'run spack'"'"'s unit tests (wrapper around pytest)' complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a unload -d 'remove package from the user environment' complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a url -d 'debugging tool for url parsing' complete -c spack -n '__fish_spack_using_command_pos 0 ' -f -a verify -d 'check that all spack packages are on disk as installed' @@ -468,7 +468,7 @@ complete -c spack -n '__fish_spack_using_command ' -s p -l profile -d 'profile e complete -c spack -n '__fish_spack_using_command ' -l sorted-profile -r -f -a sorted_profile complete -c spack -n '__fish_spack_using_command ' -l sorted-profile -r -d 'profile and sort' complete -c spack -n '__fish_spack_using_command ' -l lines -r -f -a lines -complete -c spack -n '__fish_spack_using_command ' -l lines -r -d 'lines of profile output or \'all\' (default: 20)' +complete -c spack -n '__fish_spack_using_command ' -l lines -r -d 'lines of profile output or '"'"'all'"'"' (default: 20)' complete -c spack -n '__fish_spack_using_command ' -s v -l verbose -f -a verbose complete -c spack -n '__fish_spack_using_command ' -s v -l verbose -d 'print additional output during builds' complete -c spack -n '__fish_spack_using_command ' -l stacktrace -f -a stacktrace @@ -667,7 +667,7 @@ complete -c spack -n '__fish_spack_using_command build-env' -s h -l help -d 'sho complete -c spack -n '__fish_spack_using_command build-env' -l clean -f -a dirty complete -c spack -n '__fish_spack_using_command build-env' -l clean -d 'unset harmful variables in the build environment (default)' complete -c spack -n '__fish_spack_using_command build-env' -l dirty -f -a dirty -complete -c spack -n '__fish_spack_using_command build-env' -l dirty -d 'preserve user environment in spack\'s build environment (danger!)' +complete -c spack -n '__fish_spack_using_command build-env' -l dirty -d 'preserve user environment in spack'"'"'s build environment (danger!)' complete -c spack -n '__fish_spack_using_command build-env' -s U -l fresh -f -a concretizer_reuse complete -c spack -n '__fish_spack_using_command build-env' -s U -l fresh -d 'do not reuse installed deps; build newest configuration' complete -c spack -n '__fish_spack_using_command build-env' -l reuse -f -a concretizer_reuse @@ -892,7 +892,7 @@ complete -c spack -n '__fish_spack_using_command cd' -s r -l spack-root -d 'spac complete -c spack -n '__fish_spack_using_command cd' -s i -l install-dir -f -a install_dir complete -c spack -n '__fish_spack_using_command cd' -s i -l install-dir -d 'install prefix for spec (spec need not be installed)' complete -c spack -n '__fish_spack_using_command cd' -s p -l package-dir -f -a package_dir -complete -c spack -n '__fish_spack_using_command cd' -s p -l package-dir -d 'directory enclosing a spec\'s package.py file' +complete -c spack -n '__fish_spack_using_command cd' -s p -l package-dir -d 'directory enclosing a spec'"'"'s package.py file' complete -c spack -n '__fish_spack_using_command cd' -s P -l packages -f -a packages complete -c spack -n '__fish_spack_using_command cd' -s P -l packages -d 'top-level packages directory for Spack' complete -c spack -n '__fish_spack_using_command cd' -s s -l stage-dir -f -a stage_dir @@ -927,9 +927,9 @@ complete -c spack -n '__fish_spack_using_command_pos_remainder 1 checksum' -f -a complete -c spack -n '__fish_spack_using_command checksum' -s h -l help -f -a help complete -c spack -n '__fish_spack_using_command checksum' -s h -l help -d 'show this help message and exit' complete -c spack -n '__fish_spack_using_command checksum' -l keep-stage -f -a keep_stage -complete -c spack -n '__fish_spack_using_command checksum' -l keep-stage -d 'don\'t clean up staging area when command completes' +complete -c spack -n '__fish_spack_using_command checksum' -l keep-stage -d 'don'"'"'t clean up staging area when command completes' complete -c spack -n '__fish_spack_using_command checksum' -l batch -s b -f -a batch -complete -c spack -n '__fish_spack_using_command checksum' -l batch -s b -d 'don\'t ask which versions to checksum' +complete -c spack -n '__fish_spack_using_command checksum' -l batch -s b -d 'don'"'"'t ask which versions to checksum' complete -c spack -n '__fish_spack_using_command checksum' -l latest -s l -f -a latest complete -c spack -n '__fish_spack_using_command checksum' -l latest -s l -d 'checksum the latest available version' complete -c spack -n '__fish_spack_using_command checksum' -l preferred -s p -f -a preferred @@ -961,7 +961,7 @@ complete -c spack -n '__fish_spack_using_command ci generate' -l copy-to -r -d ' complete -c spack -n '__fish_spack_using_command ci generate' -l optimize -f -a optimize complete -c spack -n '__fish_spack_using_command ci generate' -l optimize -d '(DEPRECATED) optimize the gitlab yaml file for size' complete -c spack -n '__fish_spack_using_command ci generate' -l dependencies -f -a dependencies -complete -c spack -n '__fish_spack_using_command ci generate' -l dependencies -d '(DEPRECATED) disable DAG scheduling (use \'plain\' dependencies)' +complete -c spack -n '__fish_spack_using_command ci generate' -l dependencies -d '(DEPRECATED) disable DAG scheduling (use '"'"'plain'"'"' dependencies)' complete -c spack -n '__fish_spack_using_command ci generate' -l buildcache-destination -r -f -a buildcache_destination complete -c spack -n '__fish_spack_using_command ci generate' -l buildcache-destination -r -d 'override the mirror configured in the environment' complete -c spack -n '__fish_spack_using_command ci generate' -l prune-dag -f -a prune_dag @@ -1037,7 +1037,7 @@ set -g __fish_spack_optspecs_spack_commands h/help update-completion a/aliases f complete -c spack -n '__fish_spack_using_command commands' -s h -l help -f -a help complete -c spack -n '__fish_spack_using_command commands' -s h -l help -d 'show this help message and exit' complete -c spack -n '__fish_spack_using_command commands' -l update-completion -f -a update_completion -complete -c spack -n '__fish_spack_using_command commands' -l update-completion -d 'regenerate spack\'s tab completion scripts' +complete -c spack -n '__fish_spack_using_command commands' -l update-completion -d 'regenerate spack'"'"'s tab completion scripts' complete -c spack -n '__fish_spack_using_command commands' -s a -l aliases -f -a aliases complete -c spack -n '__fish_spack_using_command commands' -s a -l aliases -d 'include command aliases' complete -c spack -n '__fish_spack_using_command commands' -l format -r -f -a 'subcommands rst names bash fish' @@ -1137,7 +1137,7 @@ complete -c spack -n '__fish_spack_using_command concretize' -s f -l force -d 'r complete -c spack -n '__fish_spack_using_command concretize' -l test -r -f -a 'root all' complete -c spack -n '__fish_spack_using_command concretize' -l test -r -d 'concretize with test dependencies of only root packages or all packages' complete -c spack -n '__fish_spack_using_command concretize' -s q -l quiet -f -a quiet -complete -c spack -n '__fish_spack_using_command concretize' -s q -l quiet -d 'don\'t print concretized specs' +complete -c spack -n '__fish_spack_using_command concretize' -s q -l quiet -d 'don'"'"'t print concretized specs' complete -c spack -n '__fish_spack_using_command concretize' -s U -l fresh -f -a concretizer_reuse complete -c spack -n '__fish_spack_using_command concretize' -s U -l fresh -d 'do not reuse installed deps; build newest configuration' complete -c spack -n '__fish_spack_using_command concretize' -l reuse -f -a concretizer_reuse @@ -1158,7 +1158,7 @@ complete -c spack -n '__fish_spack_using_command concretise' -s f -l force -d 'r complete -c spack -n '__fish_spack_using_command concretise' -l test -r -f -a 'root all' complete -c spack -n '__fish_spack_using_command concretise' -l test -r -d 'concretize with test dependencies of only root packages or all packages' complete -c spack -n '__fish_spack_using_command concretise' -s q -l quiet -f -a quiet -complete -c spack -n '__fish_spack_using_command concretise' -s q -l quiet -d 'don\'t print concretized specs' +complete -c spack -n '__fish_spack_using_command concretise' -s q -l quiet -d 'don'"'"'t print concretized specs' complete -c spack -n '__fish_spack_using_command concretise' -s U -l fresh -f -a concretizer_reuse complete -c spack -n '__fish_spack_using_command concretise' -s U -l fresh -d 'do not reuse installed deps; build newest configuration' complete -c spack -n '__fish_spack_using_command concretise' -l reuse -f -a concretizer_reuse @@ -1298,7 +1298,7 @@ set -g __fish_spack_optspecs_spack_create h/help keep-stage n/name= t/template= complete -c spack -n '__fish_spack_using_command create' -s h -l help -f -a help complete -c spack -n '__fish_spack_using_command create' -s h -l help -d 'show this help message and exit' complete -c spack -n '__fish_spack_using_command create' -l keep-stage -f -a keep_stage -complete -c spack -n '__fish_spack_using_command create' -l keep-stage -d 'don\'t clean up staging area when command completes' +complete -c spack -n '__fish_spack_using_command create' -l keep-stage -d 'don'"'"'t clean up staging area when command completes' complete -c spack -n '__fish_spack_using_command create' -s n -l name -r -f -a name complete -c spack -n '__fish_spack_using_command create' -s n -l name -r -d 'name of the package to create' complete -c spack -n '__fish_spack_using_command create' -s t -l template -r -f -a 'autoreconf autotools bazel bundle cargo cmake generic go intel lua makefile maven meson octave perlbuild perlmake python qmake r racket ruby scons sip waf' @@ -1312,11 +1312,11 @@ complete -c spack -n '__fish_spack_using_command create' -s f -l force -d 'overw complete -c spack -n '__fish_spack_using_command create' -l skip-editor -f -a skip_editor complete -c spack -n '__fish_spack_using_command create' -l skip-editor -d 'skip the edit session for the package (e.g., automation)' complete -c spack -n '__fish_spack_using_command create' -s b -l batch -f -a batch -complete -c spack -n '__fish_spack_using_command create' -s b -l batch -d 'don\'t ask which versions to checksum' +complete -c spack -n '__fish_spack_using_command create' -s b -l batch -d 'don'"'"'t ask which versions to checksum' # spack debug set -g __fish_spack_optspecs_spack_debug h/help -complete -c spack -n '__fish_spack_using_command_pos 0 debug' -f -a create-db-tarball -d 'create a tarball of Spack\'s installation metadata' +complete -c spack -n '__fish_spack_using_command_pos 0 debug' -f -a create-db-tarball -d 'create a tarball of Spack'"'"'s installation metadata' complete -c spack -n '__fish_spack_using_command_pos 0 debug' -f -a report -d 'print information useful for bug reports' complete -c spack -n '__fish_spack_using_command debug' -s h -l help -f -a help complete -c spack -n '__fish_spack_using_command debug' -s h -l help -d 'show this help message and exit' @@ -1383,7 +1383,7 @@ complete -c spack -n '__fish_spack_using_command deprecate' -s i -l install-depr complete -c spack -n '__fish_spack_using_command deprecate' -s I -l no-install-deprecator -f -a install complete -c spack -n '__fish_spack_using_command deprecate' -s I -l no-install-deprecator -d 'deprecator spec must already be installed (default)' complete -c spack -n '__fish_spack_using_command deprecate' -s l -l link-type -r -f -a 'soft hard' -complete -c spack -n '__fish_spack_using_command deprecate' -s l -l link-type -r -d (deprecated) +complete -c spack -n '__fish_spack_using_command deprecate' -s l -l link-type -r -d '(deprecated)' # spack dev-build set -g __fish_spack_optspecs_spack_dev_build h/help j/jobs= n/no-checksum d/source-path= i/ignore-dependencies keep-prefix skip-patch q/quiet drop-in= test= b/before= u/until= clean dirty U/fresh reuse fresh-roots deprecated @@ -1415,7 +1415,7 @@ complete -c spack -n '__fish_spack_using_command dev-build' -s u -l until -r -d complete -c spack -n '__fish_spack_using_command dev-build' -l clean -f -a dirty complete -c spack -n '__fish_spack_using_command dev-build' -l clean -d 'unset harmful variables in the build environment (default)' complete -c spack -n '__fish_spack_using_command dev-build' -l dirty -f -a dirty -complete -c spack -n '__fish_spack_using_command dev-build' -l dirty -d 'preserve user environment in spack\'s build environment (danger!)' +complete -c spack -n '__fish_spack_using_command dev-build' -l dirty -d 'preserve user environment in spack'"'"'s build environment (danger!)' complete -c spack -n '__fish_spack_using_command dev-build' -s U -l fresh -f -a concretizer_reuse complete -c spack -n '__fish_spack_using_command dev-build' -s U -l fresh -d 'do not reuse installed deps; build newest configuration' complete -c spack -n '__fish_spack_using_command dev-build' -l reuse -f -a concretizer_reuse @@ -1493,7 +1493,7 @@ complete -c spack -n '__fish_spack_using_command_pos 0 env' -f -a list -d 'list complete -c spack -n '__fish_spack_using_command_pos 0 env' -f -a ls -d 'list managed environments' complete -c spack -n '__fish_spack_using_command_pos 0 env' -f -a status -d 'print whether there is an active environment' complete -c spack -n '__fish_spack_using_command_pos 0 env' -f -a st -d 'print whether there is an active environment' -complete -c spack -n '__fish_spack_using_command_pos 0 env' -f -a loads -d 'list modules for an installed environment \'(see spack module loads)\'' +complete -c spack -n '__fish_spack_using_command_pos 0 env' -f -a loads -d 'list modules for an installed environment '"'"'(see spack module loads)'"'"'' complete -c spack -n '__fish_spack_using_command_pos 0 env' -f -a view -d 'manage a view associated with the environment' complete -c spack -n '__fish_spack_using_command_pos 0 env' -f -a update -d 'update environments to the latest format' complete -c spack -n '__fish_spack_using_command_pos 0 env' -f -a revert -d 'restore environments to their state before update' @@ -1525,9 +1525,9 @@ complete -c spack -n '__fish_spack_using_command env activate' -s p -l prompt -d complete -c spack -n '__fish_spack_using_command env activate' -l temp -f -a temp complete -c spack -n '__fish_spack_using_command env activate' -l temp -d 'create and activate an environment in a temporary directory' complete -c spack -n '__fish_spack_using_command env activate' -l create -f -a create -complete -c spack -n '__fish_spack_using_command env activate' -l create -d 'create and activate the environment if it doesn\'t exist' +complete -c spack -n '__fish_spack_using_command env activate' -l create -d 'create and activate the environment if it doesn'"'"'t exist' complete -c spack -n '__fish_spack_using_command env activate' -l envfile -r -f -a envfile -complete -c spack -n '__fish_spack_using_command env activate' -l envfile -r -d 'either a lockfile (must end with \'.json\' or \'.lock\') or a manifest file' +complete -c spack -n '__fish_spack_using_command env activate' -l envfile -r -d 'either a lockfile (must end with '"'"'.json'"'"' or '"'"'.lock'"'"') or a manifest file' complete -c spack -n '__fish_spack_using_command env activate' -l keep-relative -f -a keep_relative complete -c spack -n '__fish_spack_using_command env activate' -l keep-relative -d 'copy relative develop paths verbatim into the new environment when initializing from envfile' complete -c spack -n '__fish_spack_using_command env activate' -s d -l dir -f -a dir @@ -1709,7 +1709,7 @@ set -g __fish_spack_optspecs_spack_external_find h/help not-buildable exclude= p complete -c spack -n '__fish_spack_using_command external find' -s h -l help -f -a help complete -c spack -n '__fish_spack_using_command external find' -s h -l help -d 'show this help message and exit' complete -c spack -n '__fish_spack_using_command external find' -l not-buildable -f -a not_buildable -complete -c spack -n '__fish_spack_using_command external find' -l not-buildable -d 'packages with detected externals won\'t be built with Spack' +complete -c spack -n '__fish_spack_using_command external find' -l not-buildable -d 'packages with detected externals won'"'"'t be built with Spack' complete -c spack -n '__fish_spack_using_command external find' -l exclude -r -f -a exclude complete -c spack -n '__fish_spack_using_command external find' -l exclude -r -d 'packages to exclude from search' complete -c spack -n '__fish_spack_using_command external find' -s p -l path -r -f -a path @@ -1739,7 +1739,7 @@ complete -c spack -n '__fish_spack_using_command external read-cray-manifest' -l complete -c spack -n '__fish_spack_using_command external read-cray-manifest' -l ignore-default-dir -f -a ignore_default_dir complete -c spack -n '__fish_spack_using_command external read-cray-manifest' -l ignore-default-dir -d 'ignore the default directory of manifest files' complete -c spack -n '__fish_spack_using_command external read-cray-manifest' -l dry-run -f -a dry_run -complete -c spack -n '__fish_spack_using_command external read-cray-manifest' -l dry-run -d 'don\'t modify DB with files that are read' +complete -c spack -n '__fish_spack_using_command external read-cray-manifest' -l dry-run -d 'don'"'"'t modify DB with files that are read' complete -c spack -n '__fish_spack_using_command external read-cray-manifest' -l fail-on-error -f -a fail_on_error complete -c spack -n '__fish_spack_using_command external read-cray-manifest' -l fail-on-error -d 'if a manifest file cannot be parsed, fail and report the full stack trace' @@ -1771,7 +1771,7 @@ complete -c spack -n '__fish_spack_using_command find' -s h -l help -d 'show thi complete -c spack -n '__fish_spack_using_command find' -l format -r -f -a format complete -c spack -n '__fish_spack_using_command find' -l format -r -d 'output specs with the specified format string' complete -c spack -n '__fish_spack_using_command find' -s H -l hashes -f -a format -complete -c spack -n '__fish_spack_using_command find' -s H -l hashes -d 'same as \'--format {/hash}\'; use with xargs or $()' +complete -c spack -n '__fish_spack_using_command find' -s H -l hashes -d 'same as '"'"'--format {/hash}'"'"'; use with xargs or $()' complete -c spack -n '__fish_spack_using_command find' -l json -f -a json complete -c spack -n '__fish_spack_using_command find' -l json -d 'output specs as machine-readable json records' complete -c spack -n '__fish_spack_using_command find' -s I -l install-status -f -a install_status @@ -1793,7 +1793,7 @@ complete -c spack -n '__fish_spack_using_command find' -s t -l tag -r -d 'filter complete -c spack -n '__fish_spack_using_command find' -s N -l namespaces -f -a namespaces complete -c spack -n '__fish_spack_using_command find' -s N -l namespaces -d 'show fully qualified package names' complete -c spack -n '__fish_spack_using_command find' -s r -l only-roots -f -a only_roots -complete -c spack -n '__fish_spack_using_command find' -s r -l only-roots -d 'don\'t show full list of installed specs in an environment' +complete -c spack -n '__fish_spack_using_command find' -s r -l only-roots -d 'don'"'"'t show full list of installed specs in an environment' complete -c spack -n '__fish_spack_using_command find' -s c -l show-concretized -f -a show_concretized complete -c spack -n '__fish_spack_using_command find' -s c -l show-concretized -d 'show concretized specs in an environment' complete -c spack -n '__fish_spack_using_command find' -s f -l show-flags -f -a show_flags @@ -1819,7 +1819,7 @@ complete -c spack -n '__fish_spack_using_command find' -l deprecated -d 'show de complete -c spack -n '__fish_spack_using_command find' -l only-deprecated -f -a only_deprecated complete -c spack -n '__fish_spack_using_command find' -l only-deprecated -d 'show only deprecated packages' complete -c spack -n '__fish_spack_using_command find' -l install-tree -r -f -a install_tree -complete -c spack -n '__fish_spack_using_command find' -l install-tree -r -d 'Install trees to query: \'all\' (default), \'local\', \'upstream\', upstream name or path' +complete -c spack -n '__fish_spack_using_command find' -l install-tree -r -d 'Install trees to query: '"'"'all'"'"' (default), '"'"'local'"'"', '"'"'upstream'"'"', upstream name or path' complete -c spack -n '__fish_spack_using_command find' -l start-date -r -f -a start_date complete -c spack -n '__fish_spack_using_command find' -l start-date -r -d 'earliest date of installation [YYYY-MM-DD]' complete -c spack -n '__fish_spack_using_command find' -l end-date -r -f -a end_date @@ -1827,6 +1827,7 @@ complete -c spack -n '__fish_spack_using_command find' -l end-date -r -d 'latest # spack gc set -g __fish_spack_optspecs_spack_gc h/help E/except-any-environment e/except-environment= b/keep-build-dependencies y/yes-to-all +complete -c spack -n '__fish_spack_using_command_pos_remainder 0 gc' -f -a '(__fish_spack_installed_specs)' complete -c spack -n '__fish_spack_using_command gc' -s h -l help -f -a help complete -c spack -n '__fish_spack_using_command gc' -s h -l help -d 'show this help message and exit' complete -c spack -n '__fish_spack_using_command gc' -s E -l except-any-environment -f -a except_any_environment @@ -1945,7 +1946,7 @@ complete -c spack -n '__fish_spack_using_command graph' -s a -l ascii -d 'draw g complete -c spack -n '__fish_spack_using_command graph' -s d -l dot -f -a dot complete -c spack -n '__fish_spack_using_command graph' -s d -l dot -d 'generate graph in dot format and print to stdout' complete -c spack -n '__fish_spack_using_command graph' -s s -l static -f -a static -complete -c spack -n '__fish_spack_using_command graph' -s s -l static -d 'graph static (possible) deps, don\'t concretize (implies --dot)' +complete -c spack -n '__fish_spack_using_command graph' -s s -l static -d 'graph static (possible) deps, don'"'"'t concretize (implies --dot)' complete -c spack -n '__fish_spack_using_command graph' -s c -l color -f -a color complete -c spack -n '__fish_spack_using_command graph' -s c -l color -d 'use different colors for different dependency types' complete -c spack -n '__fish_spack_using_command graph' -s i -l installed -f -a installed @@ -1964,7 +1965,7 @@ complete -c spack -n '__fish_spack_using_command help' -l spec -f -a guide complete -c spack -n '__fish_spack_using_command help' -l spec -d 'help on the package specification syntax' # spack info -set -g __fish_spack_optspecs_spack_info h/help a/all detectable maintainers no-dependencies no-variants no-versions phases tags tests virtuals variants-by-name +set -g __fish_spack_optspecs_spack_info h/help a/all detectable maintainers namespace no-dependencies no-variants no-versions phases tags tests virtuals variants-by-name complete -c spack -n '__fish_spack_using_command_pos 0 info' -f -a '(__fish_spack_packages)' complete -c spack -n '__fish_spack_using_command info' -s h -l help -f -a help complete -c spack -n '__fish_spack_using_command info' -s h -l help -d 'show this help message and exit' @@ -1974,6 +1975,8 @@ complete -c spack -n '__fish_spack_using_command info' -l detectable -f -a detec complete -c spack -n '__fish_spack_using_command info' -l detectable -d 'output information on external detection' complete -c spack -n '__fish_spack_using_command info' -l maintainers -f -a maintainers complete -c spack -n '__fish_spack_using_command info' -l maintainers -d 'output package maintainers' +complete -c spack -n '__fish_spack_using_command info' -l namespace -f -a namespace +complete -c spack -n '__fish_spack_using_command info' -l namespace -d 'output package namespace' complete -c spack -n '__fish_spack_using_command info' -l no-dependencies -f -a no_dependencies complete -c spack -n '__fish_spack_using_command info' -l no-dependencies -d 'do not output build, link, and run package dependencies' complete -c spack -n '__fish_spack_using_command info' -l no-variants -f -a no_variants @@ -1989,7 +1992,7 @@ complete -c spack -n '__fish_spack_using_command info' -l tests -d 'output relev complete -c spack -n '__fish_spack_using_command info' -l virtuals -f -a virtuals complete -c spack -n '__fish_spack_using_command info' -l virtuals -d 'output virtual packages' complete -c spack -n '__fish_spack_using_command info' -l variants-by-name -f -a variants_by_name -complete -c spack -n '__fish_spack_using_command info' -l variants-by-name -d 'list variants in strict name order; don\'t group by condition' +complete -c spack -n '__fish_spack_using_command info' -l variants-by-name -d 'list variants in strict name order; don'"'"'t group by condition' # spack install set -g __fish_spack_optspecs_spack_install h/help only= u/until= j/jobs= overwrite fail-fast keep-prefix keep-stage dont-restage use-cache no-cache cache-only use-buildcache= include-build-deps no-check-signature show-log-on-error source n/no-checksum v/verbose fake only-concrete add no-add f/file= clean dirty test= log-format= log-file= help-cdash cdash-upload-url= cdash-build= cdash-site= cdash-track= cdash-buildstamp= y/yes-to-all U/fresh reuse fresh-roots deprecated @@ -2007,11 +2010,11 @@ complete -c spack -n '__fish_spack_using_command install' -l overwrite -d 'reins complete -c spack -n '__fish_spack_using_command install' -l fail-fast -f -a fail_fast complete -c spack -n '__fish_spack_using_command install' -l fail-fast -d 'stop all builds if any build fails (default is best effort)' complete -c spack -n '__fish_spack_using_command install' -l keep-prefix -f -a keep_prefix -complete -c spack -n '__fish_spack_using_command install' -l keep-prefix -d 'don\'t remove the install prefix if installation fails' +complete -c spack -n '__fish_spack_using_command install' -l keep-prefix -d 'don'"'"'t remove the install prefix if installation fails' complete -c spack -n '__fish_spack_using_command install' -l keep-stage -f -a keep_stage -complete -c spack -n '__fish_spack_using_command install' -l keep-stage -d 'don\'t remove the build stage if installation succeeds' +complete -c spack -n '__fish_spack_using_command install' -l keep-stage -d 'don'"'"'t remove the build stage if installation succeeds' complete -c spack -n '__fish_spack_using_command install' -l dont-restage -f -a dont_restage -complete -c spack -n '__fish_spack_using_command install' -l dont-restage -d 'if a partial install is detected, don\'t delete prior state' +complete -c spack -n '__fish_spack_using_command install' -l dont-restage -d 'if a partial install is detected, don'"'"'t delete prior state' complete -c spack -n '__fish_spack_using_command install' -l use-cache -f -a use_cache complete -c spack -n '__fish_spack_using_command install' -l use-cache -d 'check for pre-built Spack packages in mirrors (default)' complete -c spack -n '__fish_spack_using_command install' -l no-cache -f -a use_cache @@ -2019,7 +2022,7 @@ complete -c spack -n '__fish_spack_using_command install' -l no-cache -d 'do not complete -c spack -n '__fish_spack_using_command install' -l cache-only -f -a cache_only complete -c spack -n '__fish_spack_using_command install' -l cache-only -d 'only install package from binary mirrors' complete -c spack -n '__fish_spack_using_command install' -l use-buildcache -r -f -a use_buildcache -complete -c spack -n '__fish_spack_using_command install' -l use-buildcache -r -d 'select the mode of buildcache for the \'package\' and \'dependencies\'' +complete -c spack -n '__fish_spack_using_command install' -l use-buildcache -r -d 'select the mode of buildcache for the '"'"'package'"'"' and '"'"'dependencies'"'"'' complete -c spack -n '__fish_spack_using_command install' -l include-build-deps -f -a include_build_deps complete -c spack -n '__fish_spack_using_command install' -l include-build-deps -d 'include build deps when installing from cache, useful for CI pipeline troubleshooting' complete -c spack -n '__fish_spack_using_command install' -l no-check-signature -f -a unsigned @@ -2045,7 +2048,7 @@ complete -c spack -n '__fish_spack_using_command install' -s f -l file -r -d 're complete -c spack -n '__fish_spack_using_command install' -l clean -f -a dirty complete -c spack -n '__fish_spack_using_command install' -l clean -d 'unset harmful variables in the build environment (default)' complete -c spack -n '__fish_spack_using_command install' -l dirty -f -a dirty -complete -c spack -n '__fish_spack_using_command install' -l dirty -d 'preserve user environment in spack\'s build environment (danger!)' +complete -c spack -n '__fish_spack_using_command install' -l dirty -d 'preserve user environment in spack'"'"'s build environment (danger!)' complete -c spack -n '__fish_spack_using_command install' -l test -r -f -a 'root all' complete -c spack -n '__fish_spack_using_command install' -l test -r -d 'run tests on only root packages or all packages' complete -c spack -n '__fish_spack_using_command install' -l log-format -r -f -a 'junit cdash' @@ -2147,7 +2150,7 @@ complete -c spack -n '__fish_spack_using_command location' -s r -l spack-root -d complete -c spack -n '__fish_spack_using_command location' -s i -l install-dir -f -a install_dir complete -c spack -n '__fish_spack_using_command location' -s i -l install-dir -d 'install prefix for spec (spec need not be installed)' complete -c spack -n '__fish_spack_using_command location' -s p -l package-dir -f -a package_dir -complete -c spack -n '__fish_spack_using_command location' -s p -l package-dir -d 'directory enclosing a spec\'s package.py file' +complete -c spack -n '__fish_spack_using_command location' -s p -l package-dir -d 'directory enclosing a spec'"'"'s package.py file' complete -c spack -n '__fish_spack_using_command location' -s P -l packages -f -a packages complete -c spack -n '__fish_spack_using_command location' -s P -l packages -d 'top-level packages directory for Spack' complete -c spack -n '__fish_spack_using_command location' -s s -l stage-dir -f -a stage_dir @@ -2254,11 +2257,11 @@ complete -c spack -n '__fish_spack_using_command mirror create' -l exclude-file complete -c spack -n '__fish_spack_using_command mirror create' -l exclude-specs -r -f -a exclude_specs complete -c spack -n '__fish_spack_using_command mirror create' -l exclude-specs -r -d 'specs which Spack should not try to add to a mirror (specified on command line)' complete -c spack -n '__fish_spack_using_command mirror create' -l skip-unstable-versions -f -a skip_unstable_versions -complete -c spack -n '__fish_spack_using_command mirror create' -l skip-unstable-versions -d 'don\'t cache versions unless they identify a stable (unchanging) source code' +complete -c spack -n '__fish_spack_using_command mirror create' -l skip-unstable-versions -d 'don'"'"'t cache versions unless they identify a stable (unchanging) source code' complete -c spack -n '__fish_spack_using_command mirror create' -s D -l dependencies -f -a dependencies complete -c spack -n '__fish_spack_using_command mirror create' -s D -l dependencies -d 'also fetch all dependencies' complete -c spack -n '__fish_spack_using_command mirror create' -s n -l versions-per-spec -r -f -a versions_per_spec -complete -c spack -n '__fish_spack_using_command mirror create' -s n -l versions-per-spec -r -d 'the number of versions to fetch for each spec, choose \'all\' to retrieve all versions of each package' +complete -c spack -n '__fish_spack_using_command mirror create' -s n -l versions-per-spec -r -d 'the number of versions to fetch for each spec, choose '"'"'all'"'"' to retrieve all versions of each package' complete -c spack -n '__fish_spack_using_command mirror create' -l private -f -a private complete -c spack -n '__fish_spack_using_command mirror create' -l private -d 'for a private mirror, include non-redistributable packages' complete -c spack -n '__fish_spack_using_command mirror create' -s U -l fresh -f -a concretizer_reuse @@ -2363,7 +2366,7 @@ complete -c spack -n '__fish_spack_using_command mirror set' -l fetch -d 'modify complete -c spack -n '__fish_spack_using_command mirror set' -l type -r -f -a 'binary source' complete -c spack -n '__fish_spack_using_command mirror set' -l type -r -d 'specify the mirror type: for both binary and source use `--type binary --type source`' complete -c spack -n '__fish_spack_using_command mirror set' -l url -r -f -a url -complete -c spack -n '__fish_spack_using_command mirror set' -l url -r -d 'url of mirror directory from \'spack mirror create\'' +complete -c spack -n '__fish_spack_using_command mirror set' -l url -r -d 'url of mirror directory from '"'"'spack mirror create'"'"'' complete -c spack -n '__fish_spack_using_command mirror set' -l autopush -f -a autopush complete -c spack -n '__fish_spack_using_command mirror set' -l autopush -d 'set mirror to push automatically after installation' complete -c spack -n '__fish_spack_using_command mirror set' -l no-autopush -f -a autopush @@ -2590,7 +2593,7 @@ complete -c spack -n '__fish_spack_using_command_pos 1 pkg changed' -f -a '(__fi complete -c spack -n '__fish_spack_using_command pkg changed' -s h -l help -f -a help complete -c spack -n '__fish_spack_using_command pkg changed' -s h -l help -d 'show this help message and exit' complete -c spack -n '__fish_spack_using_command pkg changed' -s t -l type -r -f -a type -complete -c spack -n '__fish_spack_using_command pkg changed' -s t -l type -r -d 'types of changes to show (A: added, R: removed, C: changed); default is \'C\'' +complete -c spack -n '__fish_spack_using_command pkg changed' -s t -l type -r -d 'types of changes to show (A: added, R: removed, C: changed); default is '"'"'C'"'"'' # spack pkg removed set -g __fish_spack_optspecs_spack_pkg_removed h/help @@ -2682,9 +2685,9 @@ complete -c spack -n '__fish_spack_using_command rm' -s f -l force -d 'remove co set -g __fish_spack_optspecs_spack_repo h/help complete -c spack -n '__fish_spack_using_command_pos 0 repo' -f -a create -d 'create a new package repository' complete -c spack -n '__fish_spack_using_command_pos 0 repo' -f -a list -d 'show registered repositories and their namespaces' -complete -c spack -n '__fish_spack_using_command_pos 0 repo' -f -a add -d 'add a package source to Spack\'s configuration' -complete -c spack -n '__fish_spack_using_command_pos 0 repo' -f -a remove -d 'remove a repository from Spack\'s configuration' -complete -c spack -n '__fish_spack_using_command_pos 0 repo' -f -a rm -d 'remove a repository from Spack\'s configuration' +complete -c spack -n '__fish_spack_using_command_pos 0 repo' -f -a add -d 'add a package source to Spack'"'"'s configuration' +complete -c spack -n '__fish_spack_using_command_pos 0 repo' -f -a remove -d 'remove a repository from Spack'"'"'s configuration' +complete -c spack -n '__fish_spack_using_command_pos 0 repo' -f -a rm -d 'remove a repository from Spack'"'"'s configuration' complete -c spack -n '__fish_spack_using_command repo' -s h -l help -f -a help complete -c spack -n '__fish_spack_using_command repo' -s h -l help -d 'show this help message and exit' @@ -2917,7 +2920,7 @@ complete -c spack -n '__fish_spack_using_command test run' -l help-cdash -d 'sho complete -c spack -n '__fish_spack_using_command test run' -l clean -f -a dirty complete -c spack -n '__fish_spack_using_command test run' -l clean -d 'unset harmful variables in the build environment (default)' complete -c spack -n '__fish_spack_using_command test run' -l dirty -f -a dirty -complete -c spack -n '__fish_spack_using_command test run' -l dirty -d 'preserve user environment in spack\'s build environment (danger!)' +complete -c spack -n '__fish_spack_using_command test run' -l dirty -d 'preserve user environment in spack'"'"'s build environment (danger!)' # spack test list set -g __fish_spack_optspecs_spack_test_list h/help a/all @@ -2965,7 +2968,7 @@ complete -c spack -n '__fish_spack_using_command test-env' -s h -l help -d 'show complete -c spack -n '__fish_spack_using_command test-env' -l clean -f -a dirty complete -c spack -n '__fish_spack_using_command test-env' -l clean -d 'unset harmful variables in the build environment (default)' complete -c spack -n '__fish_spack_using_command test-env' -l dirty -f -a dirty -complete -c spack -n '__fish_spack_using_command test-env' -l dirty -d 'preserve user environment in spack\'s build environment (danger!)' +complete -c spack -n '__fish_spack_using_command test-env' -l dirty -d 'preserve user environment in spack'"'"'s build environment (danger!)' complete -c spack -n '__fish_spack_using_command test-env' -s U -l fresh -f -a concretizer_reuse complete -c spack -n '__fish_spack_using_command test-env' -s U -l fresh -d 'do not reuse installed deps; build newest configuration' complete -c spack -n '__fish_spack_using_command test-env' -l reuse -f -a concretizer_reuse diff --git a/var/spack/repos/builtin.mock/packages/fail-test-audit-deprecated/package.py b/var/spack/repos/builtin.mock/packages/fail-test-audit-deprecated/package.py new file mode 100644 index 00000000000000..7c4181b7b7d814 --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/fail-test-audit-deprecated/package.py @@ -0,0 +1,32 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +from spack.package import * + + +class FailTestAuditDeprecated(MakefilePackage): + """Simple package attempting to implement and use deprecated stand-alone test methods.""" + + homepage = "http://github.com/dummy/fail-test-audit-deprecated" + url = "https://github.com/dummy/fail-test-audit-deprecated/archive/v1.0.tar.gz" + + version("2.0", sha256="c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1") + version("1.0", sha256="abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234") + + @run_after("install") + def copy_test_files(self): + """test that uses the deprecated install_test_root method""" + self.cache_extra_test_sources(".") + + def test(self): + """this is a deprecated reserved method for stand-alone testing""" + pass + + def test_use_install_test_root(self): + """use the deprecated install_test_root method""" + print(f"install test root = {self.install_test_root()}") + + def test_run_test(self): + """use the deprecated run_test method""" + self.run_test("which", ["make"]) diff --git a/var/spack/repos/builtin.mock/packages/fail-test-audit-docstring/package.py b/var/spack/repos/builtin.mock/packages/fail-test-audit-docstring/package.py new file mode 100644 index 00000000000000..3f0da784ae45f5 --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/fail-test-audit-docstring/package.py @@ -0,0 +1,24 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +from spack.package import * + + +class FailTestAuditDocstring(MakefilePackage): + """Simple package with a stand-alone test that is missing its docstring.""" + + homepage = "http://github.com/dummy/fail-test-audit-docstring" + url = "https://github.com/dummy/fail-test-audit-docstring/archive/v1.0.tar.gz" + + version("2.0", sha256="c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1") + version("1.0", sha256="abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234") + + # The required docstring is missing. + def test_missing_docstring(self): + print("Ran test_missing_docstring") + + # The required docstring is effectively empty. + def test_empty_docstring(self): + """ """ + print("Ran test_empty_docstring") diff --git a/var/spack/repos/builtin.mock/packages/fail-test-audit-impl/package.py b/var/spack/repos/builtin.mock/packages/fail-test-audit-impl/package.py new file mode 100644 index 00000000000000..886f4267062b2e --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/fail-test-audit-impl/package.py @@ -0,0 +1,21 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +from spack.package import * + + +class FailTestAuditImpl(MakefilePackage): + """Simple package that is missing the stand-alone test implementation.""" + + homepage = "http://github.com/dummy/fail-test-audit-impl" + url = "https://github.com/dummy/fail-test-audit-impl/archive/v1.0.tar.gz" + + version("2.0", sha256="c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1") + version("1.0", sha256="abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234") + + # The test method has not been implemented. + def test_no_impl(self): + """test sans implementation""" + # this comment should not matter + pass diff --git a/var/spack/repos/builtin.mock/packages/fail-test-audit/package.py b/var/spack/repos/builtin.mock/packages/fail-test-audit/package.py index 54b63ed79bc7cb..dd94c374270d4d 100644 --- a/var/spack/repos/builtin.mock/packages/fail-test-audit/package.py +++ b/var/spack/repos/builtin.mock/packages/fail-test-audit/package.py @@ -6,16 +6,17 @@ class FailTestAudit(MakefilePackage): - """Simple package with one optional dependency""" + """Simple package attempting to re-use stand-alone test method as a build check.""" - homepage = "http://www.example.com" - url = "http://www.example.com/a-1.0.tar.gz" + homepage = "http://github.com/dummy/fail-test-audit" + url = "https://github.com/dummy/fail-test-audit/archive/v1.0.tar.gz" - version("1.0", md5="0123456789abcdef0123456789abcdef") - version("2.0", md5="abcdef0123456789abcdef0123456789") + version("2.0", sha256="c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1") + version("1.0", sha256="abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234") + # Stand-alone test methods cannot be included in build_time_test_callbacks build_time_test_callbacks = ["test_build_callbacks"] def test_build_callbacks(self): - """test build time test callbacks""" - print("test-build-callbacks") + """test build time test callbacks failure""" + print("test_build_callbacks") diff --git a/var/spack/repos/builtin.mock/packages/py-test-callback/package.py b/var/spack/repos/builtin.mock/packages/py-test-callback/package.py index 46a16a465fca61..b152490895f5e3 100644 --- a/var/spack/repos/builtin.mock/packages/py-test-callback/package.py +++ b/var/spack/repos/builtin.mock/packages/py-test-callback/package.py @@ -4,6 +4,7 @@ # SPDX-License-Identifier: (Apache-2.0 OR MIT) import spack.pkg.builtin.mock.python as mp +from spack.build_systems._checks import BaseBuilder, execute_install_time_tests from spack.package import * @@ -13,8 +14,11 @@ class PyTestCallback(mp.Python): homepage = "http://www.example.com" url = "http://www.example.com/test-callback-1.0.tar.gz" - # TODO (post-34236): "test" -> "test_callback" once remove "test" support - install_time_test_callbacks = ["test"] + #: This attribute is used in UI queries that need to know the build + #: system base class + build_system_class = "PyTestCallback" + + build_system("testcallback") version("1.0", "00000000000000000000000000000110") version("2.0", "00000000000000000000000000000120") @@ -22,8 +26,21 @@ class PyTestCallback(mp.Python): def install(self, spec, prefix): mkdirp(prefix.bin) - # TODO (post-34236): "test" -> "test_callback" once remove "test" support - def test(self): - super().test() - + def test_callback(self): print("PyTestCallback test") + + +@spack.builder.builder("testcallback") +class MyBuilder(BaseBuilder): + phases = ("install",) + + #: Callback names for install-time test + install_time_test_callbacks = ["test_callback"] + + def install(self, pkg, spec, prefix): + pkg.install(spec, prefix) + + spack.builder.run_after("install")(execute_install_time_tests) + + def test_callback(self): + self.pkg.test_callback() diff --git a/var/spack/repos/builtin.mock/packages/quux/package.py b/var/spack/repos/builtin.mock/packages/quux/package.py index 61ae0283c7ef85..c1575c907d57f7 100644 --- a/var/spack/repos/builtin.mock/packages/quux/package.py +++ b/var/spack/repos/builtin.mock/packages/quux/package.py @@ -142,7 +142,7 @@ class Quux "-o", "libquux.dylib", "-install_name", - "@rpath/libcorge.dylib", + "@rpath/libquux.dylib", "quux.cc.o", "-Wl,-rpath,%s" % prefix.lib64, "-Wl,-rpath,%s" % spec["garply"].prefix.lib64, diff --git a/var/spack/repos/builtin.mock/packages/splice-vt/package.py b/var/spack/repos/builtin.mock/packages/splice-vt/package.py new file mode 100644 index 00000000000000..7e470cf2814b86 --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/splice-vt/package.py @@ -0,0 +1,24 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class SpliceVt(Package): + """Simple package with one optional dependency""" + + homepage = "http://www.example.com" + url = "http://www.example.com/splice-t-1.0.tar.gz" + + version("1.0", md5="0123456789abcdef0123456789abcdef") + + depends_on("somethingelse") + depends_on("splice-z") + + def install(self, spec, prefix): + with open(prefix.join("splice-vt"), "w") as f: + f.write("splice-vt: {0}".format(prefix)) + f.write("splice-h: {0}".format(spec["somethingelse"].prefix)) + f.write("splice-z: {0}".format(spec["splice-z"].prefix)) diff --git a/var/spack/repos/builtin.mock/packages/trivial-smoke-test/package.py b/var/spack/repos/builtin.mock/packages/trivial-smoke-test/package.py index 9b877c5ef4c06e..a4c3af30022023 100644 --- a/var/spack/repos/builtin.mock/packages/trivial-smoke-test/package.py +++ b/var/spack/repos/builtin.mock/packages/trivial-smoke-test/package.py @@ -21,9 +21,9 @@ def install(self, spec, prefix): @run_before("install") def create_extra_test_source(self): - mkdirp(self.install_test_root) - touch(join_path(self.install_test_root, self.test_source_filename)) + mkdirp(install_test_root(self)) + touch(join_path(install_test_root(self), self.test_source_filename)) @run_after("install") def copy_test_sources(self): - self.cache_extra_test_sources([self.test_source_filename]) + cache_extra_test_sources(self, [self.test_source_filename]) diff --git a/var/spack/repos/builtin.mock/packages/variant-values-override/package.py b/var/spack/repos/builtin.mock/packages/variant-values-override/package.py new file mode 100644 index 00000000000000..253ae3829ebecf --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/variant-values-override/package.py @@ -0,0 +1,12 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +from spack.package import * +from spack.pkg.builtin.mock.variant_values import VariantValues + + +class VariantValuesOverride(VariantValues): + """Test variant value validation with multiple definitions.""" + + variant("v", default="baz", values=["bar", "baz"]) diff --git a/var/spack/repos/builtin.mock/packages/variant-values/package.py b/var/spack/repos/builtin.mock/packages/variant-values/package.py new file mode 100644 index 00000000000000..533cb186f5edb0 --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/variant-values/package.py @@ -0,0 +1,23 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +from spack.package import * + + +class VariantValues(Package): + """Test variant value validation with multiple definitions.""" + + homepage = "https://www.example.org" + url = "https://example.org/files/v3.4/cmake-3.4.3.tar.gz" + + version("1.0", md5="4cb3ff35b2472aae70f542116d616e63") + version("2.0", md5="b2472aae70f542116d616e634cb3ff35") + version("3.0", md5="d616e634cb3ff35b2472aae70f542116") + + variant("v", default="foo", values=["foo"], when="@1.0") + + variant("v", default="foo", values=["foo", "bar"], when="@2.0") + + # this overrides the prior definition entirely + variant("v", default="bar", values=["foo", "bar"], when="@2.0:3.0") diff --git a/var/spack/repos/builtin/packages/3proxy/package.py b/var/spack/repos/builtin/packages/3proxy/package.py index a8750657715c31..38d69f2ed5501d 100644 --- a/var/spack/repos/builtin/packages/3proxy/package.py +++ b/var/spack/repos/builtin/packages/3proxy/package.py @@ -18,17 +18,17 @@ class _3proxy(MakefilePackage): version("0.8.12", sha256="c2ad3798b4f0df06cfcc7b49f658304e451d60e4834e2705ef83ddb85a03f849") version("0.8.11", sha256="fc4295e1a462baa61977fcc21747db7861c4e3d0dcca86cbaa3e06017e5c66c9") - depends_on("c", type="build") # generated - - depends_on("autoconf", type="build") - depends_on("automake", type="build") - depends_on("libtool", type="build") - depends_on("m4", type="build") + depends_on("c", type="build") def build(self, spec, prefix): - make("-f", f"Makefile.{platform.system()}", f"CC={spack_cc}") + make("-f", f"Makefile.{platform.system()}", f"CC={spack_cc}", f"LN={spack_cc}") def install(self, spec, prefix): make( - "-f", f"Makefile.{platform.system()}", f"prefix={prefix}", f"CC={spack_cc}", "install" + "-f", + f"Makefile.{platform.system()}", + f"prefix={prefix}", + f"CC={spack_cc}", + f"LN={spack_cc}", + "install", ) diff --git a/var/spack/repos/builtin/packages/abinit/package.py b/var/spack/repos/builtin/packages/abinit/package.py index 4f8238ed1beff4..6b4e8dee2588c5 100644 --- a/var/spack/repos/builtin/packages/abinit/package.py +++ b/var/spack/repos/builtin/packages/abinit/package.py @@ -213,9 +213,9 @@ def configure_args(self): is_using_intel_libraries = spec["lapack"].name in INTEL_MATH_LIBRARIES if is_using_intel_libraries: linalg_flavor = "mkl" - if spec.satisfies("@9:") and spec.satisfies("^openblas"): + elif spec.satisfies("@9:") and spec.satisfies("^openblas"): linalg_flavor = "openblas" - if spec.satisfies("@9:") and spec.satisfies("^fujitsu-ssl2"): + elif spec.satisfies("@9:") and spec.satisfies("^fujitsu-ssl2"): linalg_flavor = "openblas" else: linalg_flavor = "custom" diff --git a/var/spack/repos/builtin/packages/acfl/package.py b/var/spack/repos/builtin/packages/acfl/package.py index ff920457e8fd2c..b1e30fd767906e 100644 --- a/var/spack/repos/builtin/packages/acfl/package.py +++ b/var/spack/repos/builtin/packages/acfl/package.py @@ -2,7 +2,6 @@ # Spack Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) -import os from spack.package import * @@ -245,11 +244,6 @@ def get_acfl_prefix(spec): return join_path(spec.prefix, f"arm-linux-compiler-{spec.version}_{os}") -def get_gcc_prefix(spec): - dirlist = next(os.walk(spec.prefix))[1] - return join_path(spec.prefix, next(dir for dir in dirlist if dir.startswith("gcc"))) - - def get_armpl_suffix(spec): suffix = "" if spec.satisfies("@24:"): @@ -393,7 +387,6 @@ def headers(self): def setup_run_environment(self, env): arm_dir = get_acfl_prefix(self.spec) armpl_dir = get_armpl_prefix(self.spec) - gcc_dir = get_gcc_prefix(self.spec) env.set("ARM_LINUX_COMPILER_DIR", arm_dir) env.set("ARM_LINUX_COMPILER_INCLUDES", join_path(arm_dir, "includes")) @@ -405,25 +398,11 @@ def setup_run_environment(self, env): env.prepend_path("LIBRARY_PATH", join_path(arm_dir, "lib")) env.prepend_path("MANPATH", join_path(arm_dir, "share", "man")) - env.set("GCC_DIR", gcc_dir) - env.set("GCC_INCLUDES", join_path(gcc_dir, "include")) - env.append_path("GCC_LIBRARIES", join_path(gcc_dir, "lib")) - env.append_path("GCC_LIBRARIES", join_path(gcc_dir, "lib64")) - env.set("COMPILER_PATH", gcc_dir) - env.prepend_path("PATH", join_path(gcc_dir, "binutils_bin")) - env.prepend_path("CPATH", join_path(gcc_dir, "include")) - env.prepend_path("LD_LIBRARY_PATH", join_path(gcc_dir, "lib")) - env.prepend_path("LD_LIBRARY_PATH", join_path(gcc_dir, "lib64")) - env.prepend_path("LIBRARY_PATH", join_path(gcc_dir, "lib")) - env.prepend_path("LIBRARY_PATH", join_path(gcc_dir, "lib64")) - env.prepend_path("MANPATH", join_path(gcc_dir, "share", "man")) - @run_after("install") def check_install(self): arm_dir = get_acfl_prefix(self.spec) armpl_dir = get_armpl_prefix(self.spec) suffix = get_armpl_suffix(self.spec) - gcc_dir = get_gcc_prefix(self.spec) armpl_example_dir = join_path(armpl_dir, f"examples{suffix}") # run example makefile make( @@ -432,7 +411,6 @@ def check_install(self): "CC=" + self.cc, "F90=" + self.fortran, "CPATH=" + join_path(arm_dir, "include"), - "COMPILER_PATH=" + gcc_dir, "ARMPL_DIR=" + armpl_dir, ) # clean up diff --git a/var/spack/repos/builtin/packages/activemq/package.py b/var/spack/repos/builtin/packages/activemq/package.py index c003cfae517b86..0521ad4fd3f948 100644 --- a/var/spack/repos/builtin/packages/activemq/package.py +++ b/var/spack/repos/builtin/packages/activemq/package.py @@ -17,8 +17,15 @@ class Activemq(Package): license("Apache-2.0") - version("5.17.3", sha256="a4cc4c3a2f136707c2c696f3bb3ee2a86dbeff1b9eb5e237b14edc0c5e5a328f") + version("6.1.3", sha256="cad14e816e990f1312709ebfc228f42895d8c54c652d3cd56f0b5145635dc794") + version("5.18.6", sha256="b1363696e4e014423f6ab22f1ece4bf14ee32b80bfa5bdbae7dd4026a47ff03a") + # https://nvd.nist.gov/vuln/detail/CVE-2023-46604 + version( + "5.17.3", + sha256="a4cc4c3a2f136707c2c696f3bb3ee2a86dbeff1b9eb5e237b14edc0c5e5a328f", + deprecated=True, + ) # https://nvd.nist.gov/vuln/detail/CVE-2018-11775 version( "5.14.0", @@ -29,6 +36,9 @@ class Activemq(Package): depends_on("cxx", type="build") # generated depends_on("java") + depends_on("java@8:", when="@5.15:") + depends_on("java@11:", when="@5.17:") + depends_on("java@17:", when="@6:") def install(self, spec, prefix): install_tree(".", prefix) diff --git a/var/spack/repos/builtin/packages/acts-algebra-plugins/package.py b/var/spack/repos/builtin/packages/acts-algebra-plugins/package.py index 0e12d5e25cefcf..6de001e545bd8e 100644 --- a/var/spack/repos/builtin/packages/acts-algebra-plugins/package.py +++ b/var/spack/repos/builtin/packages/acts-algebra-plugins/package.py @@ -17,6 +17,7 @@ class ActsAlgebraPlugins(CMakePackage): license("MPL-2.0", checked_by="stephenswat") + version("0.25.0", sha256="bb0cba6e37558689d780a6de8f749abb3b96f8cd9e0c8851474eb4532e1e98b8") version("0.24.0", sha256="f44753e62b1ba29c28ab86b282ab67ac6028a0f9fe41e599b7fc6fc50b586b62") depends_on("cxx", type="build") # generated diff --git a/var/spack/repos/builtin/packages/acts/package.py b/var/spack/repos/builtin/packages/acts/package.py index 4686749d7c8392..1a0ef352dc39df 100644 --- a/var/spack/repos/builtin/packages/acts/package.py +++ b/var/spack/repos/builtin/packages/acts/package.py @@ -41,6 +41,11 @@ class Acts(CMakePackage, CudaPackage): # Supported Acts versions version("main", branch="main") version("master", branch="main", deprecated=True) # For compatibility + version("37.0.1", commit="998b9c9dd42d5160c2540f8fa820505869bfdb79", submodules=True) + version("37.0.0", commit="117feaaadc7a2336755274e0cd70ba58a047a1de", submodules=True) + version("36.3.2", commit="01e124d253a3c9c9b9f5d2fde16682ce9d4599cd", submodules=True) + version("36.3.1", commit="b58e5b0c33fb8423ce60a6a45f333edd0d178acd", submodules=True) + version("36.3.0", commit="3b875cebabdd10462e224279558429f49ed75945", submodules=True) version("36.2.0", commit="e2fb53da911dc481969e56d635898a46b8d78df9", submodules=True) version("36.1.0", commit="3f19d1a0eec1d11937d66d0ef603f0b25b9b4e96", submodules=True) version("36.0.0", commit="6eca77c45b136861272694edbb61bb77200948a5", submodules=True) @@ -345,6 +350,7 @@ class Acts(CMakePackage, CudaPackage): depends_on("actsvg@0.4.35:", when="@28:") depends_on("actsvg@0.4.39:", when="@32:") depends_on("actsvg@0.4.40:", when="@32.1:") + depends_on("actsvg@0.4.50:", when="@37:") depends_on("acts-algebra-plugins @0.24:", when="+traccc") depends_on("autodiff @0.6:", when="@17: +autodiff") depends_on("autodiff @0.5.11:0.5.99", when="@1.2:16 +autodiff") @@ -357,6 +363,7 @@ class Acts(CMakePackage, CudaPackage): depends_on("dd4hep @1.21: +dddetectors +ddrec", when="@20: +dd4hep") depends_on("dd4hep +ddg4", when="+dd4hep +geant4 +examples") depends_on("detray @0.72.1:", when="+traccc") + depends_on("detray @0.75.3:", when="@37: +traccc") depends_on("edm4hep @0.4.1:", when="+edm4hep") depends_on("edm4hep @0.7:", when="@25: +edm4hep") depends_on("eigen @3.3.7:", when="@15.1:") @@ -375,6 +382,7 @@ class Acts(CMakePackage, CudaPackage): depends_on("intel-tbb @2020.1:", when="+examples +tbb") depends_on("mlpack@3.1.1:", when="+mlpack") depends_on("nlohmann-json @3.9.1:", when="@0.14: +json") + depends_on("nlohmann-json @3.10.5:", when="@37: +json") depends_on("podio @0.6:", when="@25: +edm4hep") depends_on("podio @0.16:", when="@30.3: +edm4hep") depends_on("podio @:0", when="@:35 +edm4hep") @@ -400,11 +408,9 @@ class Acts(CMakePackage, CudaPackage): # ACTS imposes requirements on the C++ standard values used by ROOT for _cxxstd in _cxxstd_values: for _v in _cxxstd: - depends_on(f"geant4 cxxstd={_v.value}", when=f"cxxstd={_v.value} {_v.when} +geant4") - depends_on( - f"geant4 cxxstd={_v.value}", when=f"cxxstd={_v.value} {_v.when} +fatras_geant4" - ) - depends_on(f"root cxxstd={_v.value}", when=f"cxxstd={_v.value} {_v.when} +tgeo") + depends_on(f"geant4 cxxstd={_v.value}", when=f"cxxstd={_v.value} +geant4") + depends_on(f"geant4 cxxstd={_v.value}", when=f"cxxstd={_v.value} +fatras_geant4") + depends_on(f"root cxxstd={_v.value}", when=f"cxxstd={_v.value} +tgeo") # When the traccc plugin is enabled, detray should match the Acts scalars with when("+traccc"): @@ -415,6 +421,8 @@ class Acts(CMakePackage, CudaPackage): conflicts("%gcc@:7", when="@0.23:") # When using C++20, disable gcc 9 and lower. conflicts("%gcc@:9", when="cxxstd=20") + # See https://github.com/acts-project/acts/pull/3512 + conflicts("^boost@1.85.0") def cmake_args(self): spec = self.spec diff --git a/var/spack/repos/builtin/packages/actsvg/package.py b/var/spack/repos/builtin/packages/actsvg/package.py index f0e8bc66cdf783..beaf8322091c00 100644 --- a/var/spack/repos/builtin/packages/actsvg/package.py +++ b/var/spack/repos/builtin/packages/actsvg/package.py @@ -20,6 +20,11 @@ class Actsvg(CMakePackage): license("MPL-2.0") + version("0.4.50", sha256="c97fb1cc75cbf23caebd3c6fb8716354bdbd0a77ad39dc43dae963692f3256e1") + version("0.4.48", sha256="0f230c31c64b939e4d311afd997dbaa87a375454cf1595661a449b97943412c9") + version("0.4.47", sha256="11924fddbdd01f6337875797dc3a97b62be565688e678485e992bcfc9bfb142f") + version("0.4.46", sha256="0b75e91de240aeac8b91cd4fb8e314d0ab2a4b220048fb373dee9352d571b792") + version("0.4.45", sha256="402ca863e453055e5abc65a37908f44b03b15f90c694807d78627d7800d2e39c") version("0.4.44", sha256="6eda7306b8b863e1860e090f328ac6e7982dc2d3b3d674db2799c13007ffd07f") version("0.4.43", sha256="e2aef32185db37cfdc023282b25c003e63dc974a11118ab2040bd30b2d346147") version("0.4.42", sha256="a8439d50b469ccc4428973507db1adf56aa68b34900ce0c6077ddb92a133a4f2") @@ -36,6 +41,7 @@ class Actsvg(CMakePackage): variant("examples", default=False, description="Build the example applications") variant("meta", default=True, description="Build the meta level interface") + variant("python", default=True, when="@0.4.39:", description="Build the python bindings") variant( "web", default=True, when="@0.4.36:", description="Build the webpage builder interface" ) @@ -43,11 +49,13 @@ class Actsvg(CMakePackage): depends_on("boost +program_options", type="test") depends_on("boost +program_options", when="+examples") depends_on("googletest", when="+examples") + depends_on("python@3.8:", when="+python") def cmake_args(self): args = [ self.define_from_variant("ACTSVG_BUILD_EXAMPLES", "examples"), self.define_from_variant("ACTSVG_BUILD_META", "meta"), + self.define_from_variant("ACTSVG_BUILD_PYTHON_BINDINGS", "python"), self.define_from_variant("ACTSVG_BUILD_WEB", "web"), self.define("ACTSVG_BUILD_TESTING", self.run_tests), ] diff --git a/var/spack/repos/builtin/packages/adept/package.py b/var/spack/repos/builtin/packages/adept/package.py new file mode 100644 index 00000000000000..55aa3a6f44fc31 --- /dev/null +++ b/var/spack/repos/builtin/packages/adept/package.py @@ -0,0 +1,48 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class Adept(AutotoolsPackage): + """Combined array and automatic differentiation library in C++.""" + + homepage = "https://www.met.reading.ac.uk/clouds/adept/" + url = "https://www.met.reading.ac.uk/clouds/adept/adept-2.1.1.tar.gz" + + maintainers("jehicken") + + license("Apache-2.0", checked_by="jehicken") + + version("2.1.1", sha256="0cef334e82df4526d3761bdd8319a63e7582c96b2f1cc88391729018b4825c47") + + variant("blas", default=False, description="Enable Adept's native arrays using Openblas") + variant("lapack", default=False, description="Enable Adept's native arrays using Lapack") + + depends_on("cxx", type="build") + + depends_on("autoconf", type="build") + depends_on("automake", type="build") + depends_on("libtool", type="build") + depends_on("m4", type="build") + + depends_on("openblas", when="+blas") + depends_on("netlib-lapack", when="+lapack") + + def autoreconf(self, spec, prefix): + autoreconf("--install", "--verbose", "--force") + + def configure_args(self): + args = [] + + if self.spec.satisfies("+blas"): + blas_prefix = self.spec["openblas"].prefix + args.append(f"--with-blas={blas_prefix}") + + if self.spec.satisfies("+lapack"): + lapack_prefix = self.spec["netlib-lapack"].prefix + args.append(f"--with-lapack={lapack_prefix}") + + return args diff --git a/var/spack/repos/builtin/packages/all/package.py b/var/spack/repos/builtin/packages/all/package.py new file mode 100644 index 00000000000000..c30254cc95c4e1 --- /dev/null +++ b/var/spack/repos/builtin/packages/all/package.py @@ -0,0 +1,48 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class All(CMakePackage): + """A Load Balancing Library (ALL) + + The library aims to provide an easy way to include dynamic domain-based + load balancing into particle based simulation codes. + """ + + homepage = "http://slms.pages.jsc.fz-juelich.de/websites/all-website/" + url = "https://gitlab.jsc.fz-juelich.de/SLMS/loadbalancing/-/archive/v0.9.2/loadbalancing-v0.9.2.tar.gz" + + maintainers("junghans") + + license("BSD-3-Clause", checked_by="junghans") + + version("0.9.2", sha256="2b4ef52c604c3c0c467712d0912a33c82177610b67edc14df1e034779c6ddb71") + + variant("fortran", default=False, description="Build with fortran support") + variant("shared", default=True, description="Build shared libraries") + variant("vtk", default=False, description="Build with vtk support") + + depends_on("c", type="build") + depends_on("cxx", type="build") + depends_on("fortran", type="build", when="+fortran") + depends_on("vtk", when="+vtk") + + depends_on("mpi") + + def cmake_args(self): + args = [ + self.define_from_variant("BUILD_SHARED_LIBS", "shared"), + self.define_from_variant("CM_ALL_FORTRAN", "fortran"), + self.define_from_variant("CM_ALL_USE_F08", "fortran"), + self.define_from_variant("CM_ALL_VTK_OUTPUT", "vtk"), + ] + + if self.run_tests: + args.append("-DCM_ALL_TESTS=ON") + args.append("-DCM_ALL_TESTS_INTEGRATION=ON") + + return args diff --git a/var/spack/repos/builtin/packages/alpaka/package.py b/var/spack/repos/builtin/packages/alpaka/package.py index 29a5b2ccf900c5..85eaea4f3813e2 100644 --- a/var/spack/repos/builtin/packages/alpaka/package.py +++ b/var/spack/repos/builtin/packages/alpaka/package.py @@ -10,7 +10,7 @@ class Alpaka(CMakePackage, CudaPackage): """Abstraction Library for Parallel Kernel Acceleration.""" - homepage = "https://alpaka.readthedocs.io" + homepage = "https://github.com/alpaka-group/alpaka" url = "https://github.com/alpaka-group/alpaka/archive/refs/tags/0.6.0.tar.gz" git = "https://github.com/alpaka-group/alpaka.git" @@ -19,11 +19,35 @@ class Alpaka(CMakePackage, CudaPackage): license("MPL-2.0-no-copyleft-exception") version("develop", branch="develop") - version("0.8.0", sha256="e01bc377a7657d9a3e0c5f8d3f83dffbd7d0b830283c59efcbc1fb98cf88de43") - version("0.7.0", sha256="4b61119a7b3b073f281ba15b63430db98b77dbd9420bc290a114f80121fbdd97") - version("0.6.0", sha256="7424ecaee3af15e587b327e983998410fa379c61d987bfe923c7e95d65db11a3") - version("0.5.0", sha256="0ba08ea19961dd986160219ba00d6162fe7758980d88a606eff6494d7b3a6cd1") - version("0.4.0", sha256="ad7905b13c22abcee4344ba225a65078e3f452ad45a9eda907e7d27c08315e46") + version("1.2.0", sha256="069ea68ac950b17cffb3a3e790973aa5115f07ab23c0247a167e815b3c6e6fa2") + version("1.1.0", sha256="95a8f1b706105d8a213116b6ba00e27bd904855c377f5a22a04aa0b86054dc35") + version("1.0.0", sha256="38223dc1ca5bcf3916ff91f8825fb8caab7047430877222847e0ceb93bffecc9") + version("0.9.0", sha256="3b2a5631366619fab5f3ceaf860219362f35db6c1148a601a3779a836cf29363") + version( + "0.8.0", + sha256="e01bc377a7657d9a3e0c5f8d3f83dffbd7d0b830283c59efcbc1fb98cf88de43", + deprecated=True, + ) + version( + "0.7.0", + sha256="4b61119a7b3b073f281ba15b63430db98b77dbd9420bc290a114f80121fbdd97", + deprecated=True, + ) + version( + "0.6.0", + sha256="7424ecaee3af15e587b327e983998410fa379c61d987bfe923c7e95d65db11a3", + deprecated=True, + ) + version( + "0.5.0", + sha256="0ba08ea19961dd986160219ba00d6162fe7758980d88a606eff6494d7b3a6cd1", + deprecated=True, + ) + version( + "0.4.0", + sha256="ad7905b13c22abcee4344ba225a65078e3f452ad45a9eda907e7d27c08315e46", + deprecated=True, + ) depends_on("cxx", type="build") # generated @@ -33,16 +57,16 @@ class Alpaka(CMakePackage, CudaPackage): values=( "serial", "threads", - "fiber", "tbb", "omp2_gridblock", "omp2_blockthread", - "omp5", - "oacc", "cuda", "cuda_only", "hip", "hip_only", + "sycl_cpu", + "sycl_gpu", + "sycl_fpga", ), description="Backends to enable", default="serial", @@ -50,28 +74,33 @@ class Alpaka(CMakePackage, CudaPackage): variant("examples", default=False, description="Build alpaka examples") - depends_on("boost") - depends_on("boost+fiber", when="backend=fiber") - depends_on("cmake@3.18:", when="@0.7.0:") + depends_on("boost@1.65.1:", when="@0.4.0:0.8.0") + depends_on("boost@1.74:", when="@0.9.0:") + + depends_on("cmake@3.11.4:", when="@0.4.0") + depends_on("cmake@3.15:", when="@0.5.0:0.7.0") + depends_on("cmake@3.18:", when="@0.8.0:0.9.0") + depends_on("cmake@3.22:", when="@1.0.0:") # make sure no other backend is enabled if using cuda_only or hip_only for v in ( "serial", "threads", - "fiber", "tbb", - "oacc", "omp2_gridblock", "omp2_blockthread", - "omp5", "cuda", "hip", + "sycl_cpu", + "sycl_gpu", + "sycl_fpga", ): conflicts("backend=cuda_only,%s" % v) conflicts("backend=hip_only,%s" % v) conflicts("backend=cuda_only,hip_only") - for v in ("omp2_blockthread", "omp2_blockthread", "omp5"): - conflicts("backend=oacc,%s" % v) + + for v in ("sycl_cpu", "sycl_gpu", "sycl_fpga"): + conflicts("backend=%s" % v, when="@0.9.0:") # todo: add conflict between cuda 11.3 and gcc 10.3.0 # see https://github.com/alpaka-group/alpaka/issues/1297 @@ -83,18 +112,12 @@ def cmake_args(self): args.append(self.define("ALPAKA_ACC_CPU_B_SEQ_T_SEQ_ENABLE", True)) if self.spec.satisfies("backend=threads"): args.append(self.define("ALPAKA_ACC_CPU_B_SEQ_T_THREADS_ENABLE", True)) - if spec.satisfies("backend=fiber"): - args.append(self.define("ALPAKA_ACC_CPU_B_SEQ_T_FIBERS_ENABLE", True)) if spec.satisfies("backend=tbb"): args.append(self.define("ALPAKA_ACC_CPU_B_TBB_T_SEQ_ENABLE", True)) if spec.satisfies("backend=omp2_gridblock"): args.append(self.define("ALPAKA_ACC_CPU_B_OMP2_T_SEQ_ENABLE", True)) if spec.satisfies("backend=omp2_blockthread"): args.append(self.define("ALPAKA_ACC_CPU_B_SEQ_T_OMP2_ENABLE", True)) - if spec.satisfies("backend=omp5"): - args.append(self.define("ALPAKA_ACC_ANY_BT_OMP5_ENABLE", True)) - if spec.satisfies("backend=oacc"): - args.append(self.define("ALPAKA_ACC_ANY_BT_OACC_ENABLE", True)) if spec.satisfies("backend=cuda"): args.append(self.define("ALPAKA_ACC_GPU_CUDA_ENABLE", True)) if spec.satisfies("backend=cuda_only"): @@ -105,6 +128,16 @@ def cmake_args(self): if spec.satisfies("backend=hip_only"): args.append(self.define("ALPAKA_ACC_GPU_HIP_ENABLE", True)) args.append(self.define("ALPAKA_ACC_GPU_HIP_ONLY_MODE", True)) + if spec.satisfies("backend=sycl_cpu"): + args.append(self.define("ALPAKA_ACC_SYCL_ENABLE", True)) + args.append(self.define("ALPAKA_SYCL_ONEAPI_CPU", True)) + if spec.satisfies("backend=sycl_gpu"): + args.append(self.define("ALPAKA_ACC_SYCL_ENABLE", True)) + args.append(self.define("ALPAKA_SYCL_ONEAPI_GPU", True)) + args.append(self.define("ALPAKA_SYCL_ONEAPI_GPU_DEVICES", "spir64")) + if spec.satisfies("backend=sycl_fpga"): + args.append(self.define("ALPAKA_ACC_SYCL_ENABLE", True)) + args.append(self.define("ALPAKA_SYCL_ONEAPI_FPGA", True)) args.append(self.define_from_variant("alpaka_BUILD_EXAMPLES", "examples")) # need to define, as it is explicitly declared as an option by alpaka: diff --git a/var/spack/repos/builtin/packages/aluminum/package.py b/var/spack/repos/builtin/packages/aluminum/package.py index 5c1fb482a3871e..b5ca6aa3f59d5d 100644 --- a/var/spack/repos/builtin/packages/aluminum/package.py +++ b/var/spack/repos/builtin/packages/aluminum/package.py @@ -88,7 +88,6 @@ class Aluminum(CachedCMakePackage, CudaPackage, ROCmPackage): # FIXME: Do we want to expose tuning parameters to the Spack # recipe? Some are numeric values, some are on/off switches. - conflicts("~cuda", when="+cuda_rma", msg="CUDA RMA support requires CUDA") conflicts("+cuda", when="+rocm", msg="CUDA and ROCm support are mutually exclusive") depends_on("mpi") diff --git a/var/spack/repos/builtin/packages/amber/package.py b/var/spack/repos/builtin/packages/amber/package.py index 88c830977a7b44..f72ce9bc4da690 100644 --- a/var/spack/repos/builtin/packages/amber/package.py +++ b/var/spack/repos/builtin/packages/amber/package.py @@ -143,6 +143,7 @@ class Amber(Package, CudaPackage): depends_on("cuda@7.5.18", when="@:16+cuda") # conflicts + conflicts("+x11", when="platform=cray", msg="x11 amber applications not available for cray") conflicts("+openmp", when="%clang", msg="OpenMP not available for the clang compiler") conflicts( "+openmp", when="%apple-clang", msg="OpenMP not available for the Apple clang compiler" diff --git a/var/spack/repos/builtin/packages/ambertools/package.py b/var/spack/repos/builtin/packages/ambertools/package.py new file mode 100644 index 00000000000000..f680b43ce67b02 --- /dev/null +++ b/var/spack/repos/builtin/packages/ambertools/package.py @@ -0,0 +1,88 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class Ambertools(CMakePackage): + """AmberTools is a free, useful standalone package and a prerequisite + for installing Amber itself. The AmberTools suite is free of charge, + and its components are mostly released under the GNU General Public + License (GPL). A few components are included that are in the public + domain or which have other, open-source, licenses. The libsander and + libpbsa libraries use the LGPL license.""" + + homepage = "https://ambermd.org/AmberTools.php" + url = "https://ambermd.org/downloads/AmberTools22jlmrcc.tar.bz2" + + maintainers("d-beltran") + + version("22jlmrcc", sha256="1571d4e0f7d45b2a71dce5999fa875aea8c90ee219eb218d7916bf30ea229121") + + depends_on("flex", type="build") + depends_on("bison", type="build") + depends_on("tcsh", type="build") + depends_on("zlib", type=("build", "run")) + depends_on("bzip2", type=("build", "run")) + depends_on("blas", type=("build", "run")) + depends_on("lapack", type=("build", "run")) + depends_on("arpack-ng", type=("build", "run")) + depends_on("netcdf-c", type=("build", "run")) + depends_on("netcdf-fortran", type=("build", "run")) + depends_on("fftw", type=("build", "run")) + depends_on("readline", type=("build", "run")) + depends_on("netlib-xblas~plain_blas", type=("build", "run")) + # Specific variants needed for boost according to build logs + depends_on( + "boost+thread+system+program_options+iostreams+regex+timer+chrono+filesystem+graph", + type=("build", "run"), + ) + # Python dependencies + depends_on("python@3.8:3.10 +tkinter", type=("build", "run")) + depends_on("py-setuptools", type="build") + depends_on("py-numpy", type=("build", "run")) + depends_on("py-matplotlib", type=("build", "run")) + depends_on("py-scipy", type=("build", "run")) + + def cmake_args(self): + # Translated from ambertools build/run_cmake script + # We also add the TRUST_SYSTEM_LIBS argument mentioned in the ambertools guide + # https://ambermd.org/pmwiki/pmwiki.php/Main/CMake-Guide-to-Options + args = [ + self.define("COMPILER", "GNU"), + self.define("MPI", False), + self.define("CUDA", False), + self.define("INSTALL_TESTS", True), + self.define("DOWNLOAD_MINICONDA", False), + self.define("TRUST_SYSTEM_LIBS", True), + # This is to avoid the x11 (X11_Xext_LIB) error + # It is equivalent to the "-noX11" flag accoridng to the docs: + # https://ambermd.org/pmwiki/pmwiki.php/Main/CMake-Common-Options + self.define("BUILD_GUI", False), + ] + return args + + def setup_run_environment(self, env): + env.set("AMBER_PREFIX", self.prefix) + env.set("AMBERHOME", self.prefix) + + def setup_build_environment(self, env): + env.set("AMBER_PREFIX", self.prefix) + env.set("AMBERHOME", self.prefix) + + @run_after("install") + @on_package_attributes(run_tests=True) + def check_install(self): + make("test.serial") + + # Temporarily copy netcdf.h header file to netcdf-fortran/include to pass the Ambertools + # cmake check (quickest fix, will probably cause problems, needs to change) + @run_before("cmake") + def fix_check(self): + cp = Executable("cp") + cp( + self.spec["netcdf-c"].headers.directories[0] + "/netcdf.h", + self.spec["netcdf-fortran"].headers.directories[0], + ) diff --git a/var/spack/repos/builtin/packages/amdfftw/package.py b/var/spack/repos/builtin/packages/amdfftw/package.py index 6ac400a013e408..f508c4162b6123 100644 --- a/var/spack/repos/builtin/packages/amdfftw/package.py +++ b/var/spack/repos/builtin/packages/amdfftw/package.py @@ -7,6 +7,7 @@ from llnl.util import tty +from spack.build_environment import optimization_flags from spack.package import * from spack.pkg.builtin.fftw import FftwBase @@ -213,10 +214,7 @@ def configure(self, spec, prefix): # variable to set AMD_ARCH configure option. # Spack user can not directly use AMD_ARCH for this purpose but should # use target variable to set appropriate -march option in AMD_ARCH. - arch = spec.architecture - options.append( - "AMD_ARCH={0}".format(arch.target.optimization_flags(spec.compiler).split("=")[-1]) - ) + options.append(f"AMD_ARCH={optimization_flags(self.compiler, spec.target)}") # Specific SIMD support. # float and double precisions are supported diff --git a/var/spack/repos/builtin/packages/amdlibm/package.py b/var/spack/repos/builtin/packages/amdlibm/package.py index 00fb03d94e270c..4ec7cd850c7d6b 100644 --- a/var/spack/repos/builtin/packages/amdlibm/package.py +++ b/var/spack/repos/builtin/packages/amdlibm/package.py @@ -8,7 +8,6 @@ from llnl.util import tty from spack.package import * -from spack.util.cpus import determine_number_of_jobs class Amdlibm(SConsPackage): diff --git a/var/spack/repos/builtin/packages/amdsmi/package.py b/var/spack/repos/builtin/packages/amdsmi/package.py index 8185f27a0b0405..e51e0600328820 100644 --- a/var/spack/repos/builtin/packages/amdsmi/package.py +++ b/var/spack/repos/builtin/packages/amdsmi/package.py @@ -20,6 +20,8 @@ class Amdsmi(CMakePackage): libraries = ["libamd_smi"] license("MIT") + version("6.2.1", sha256="136941e3f13e0d373ee3698bd60d4fc36353a2df6406e5a50b6ac78f1b639698") + version("6.2.0", sha256="49e4b15af62bf9800c02a24c75c6cd99dc8b146d69cc7f00ecbbcd60f6106315") version("6.1.2", sha256="4583ea9bc71d55e987db4a42f9b3b730def22892953d30bca64ca29ac844e058") version("6.1.1", sha256="10ece6b1ca8bb36ab3ae987fc512838f30a92ab788a2200410e9c1707fe0166b") version("6.1.0", sha256="5bd1f150a2191b1703ff2670e40f6fed730f59f155623d6e43b7f64c39ae0967") diff --git a/var/spack/repos/builtin/packages/amr-wind/package.py b/var/spack/repos/builtin/packages/amr-wind/package.py index b3875753bcf2ee..5c11e17c465be6 100644 --- a/var/spack/repos/builtin/packages/amr-wind/package.py +++ b/var/spack/repos/builtin/packages/amr-wind/package.py @@ -156,11 +156,7 @@ def cmake_args(self): args.append(define("HDF5_IS_PARALLEL", spec.satisfies("+mpi"))) if spec.satisfies("+cuda"): - amrex_arch = [ - "{0:.1f}".format(float(i) / 10.0) for i in spec.variants["cuda_arch"].value - ] - if amrex_arch: - args.append(define("AMReX_CUDA_ARCH", amrex_arch)) + args.append(define("CMAKE_CUDA_ARCHITECTURES", spec.variants["cuda_arch"].value)) if spec.satisfies("+rocm"): args.append(define("CMAKE_CXX_COMPILER", spec["hip"].hipcc)) diff --git a/var/spack/repos/builtin/packages/amrex/package.py b/var/spack/repos/builtin/packages/amrex/package.py index cb0bc0f2bf0e4b..724b5130c19169 100644 --- a/var/spack/repos/builtin/packages/amrex/package.py +++ b/var/spack/repos/builtin/packages/amrex/package.py @@ -26,6 +26,7 @@ class Amrex(CMakePackage, CudaPackage, ROCmPackage): license("BSD-3-Clause") version("develop", branch="development") + version("24.10", sha256="a2d15e417bd7c41963749338e884d939c80c5f2fcae3279fe3f1b463e3e4208a") version("24.09", sha256="a1435d16532d04a1facce9a9ae35d68a57f7cd21a5f22a6590bde3c265ea1449") version("24.08", sha256="e09623e715887a19a1f86ed6fdb8335022fd6c03f19372d8f13b55cdeeadf5de") version("24.07", sha256="6baf76c1377d765e94020a9bd89dd1bf1485d0440d41cce2ba35d4dfee562580") @@ -119,7 +120,20 @@ class Amrex(CMakePackage, CudaPackage, ROCmPackage): description="Real precision (double/single)", values=("single", "double"), ) - variant("eb", default=False, description="Build Embedded Boundary classes") + variant("ascent", default=False, description="Enable Ascent in situ visualization") + variant( + "catalyst", + default=False, + description="Enable Catalyst2 in situ visualization", + when="@24.09:", + ) + variant( + "conduit", + default=False, + description="Enable Conduit for data exchange (in situ visualization)", + ) + variant("eb", default=True, description="Build Embedded Boundary classes", when="@24.10:") + variant("eb", default=False, description="Build Embedded Boundary classes", when="@:24.09") variant("fortran", default=False, description="Build Fortran API") variant("linear_solvers", default=True, description="Build linear solvers") variant("amrdata", default=False, description="Build data services") @@ -135,9 +149,20 @@ class Amrex(CMakePackage, CudaPackage, ROCmPackage): # Build dependencies depends_on("mpi", when="+mpi") - depends_on("sundials@4.0.0:4.1.0 +ARKODE +CVODE", when="@19.08:20.11 +sundials") - depends_on("sundials@5.7.0: +ARKODE +CVODE", when="@21.07:22.04 +sundials") - depends_on("sundials@6.0.0: +ARKODE +CVODE", when="@22.05: +sundials") + with when("+ascent"): + depends_on("ascent") + depends_on("ascent +cuda", when="+cuda") + depends_on("ascent +mpi", when="+mpi") + with when("+conduit"): + depends_on("conduit") + depends_on("conduit +mpi", when="+mpi") + with when("+catalyst"): + depends_on("libcatalyst@2.0: +conduit") + depends_on("libcatalyst +mpi", when="+mpi") + with when("+sundials"): + depends_on("sundials@4.0.0:4.1.0 +ARKODE +CVODE", when="@19.08:20.11") + depends_on("sundials@5.7.0: +ARKODE +CVODE", when="@21.07:22.04") + depends_on("sundials@6.0.0: +ARKODE +CVODE", when="@22.05:") for arch in CudaPackage.cuda_arch_values: depends_on( "sundials@5.7.0: +ARKODE +CVODE +cuda cuda_arch=%s" % arch, @@ -157,9 +182,10 @@ class Amrex(CMakePackage, CudaPackage, ROCmPackage): when="@22.05: +sundials +rocm amdgpu_target=%s" % tgt, ) - depends_on("cuda@9.0.0:", when="@:22.04 +cuda") - depends_on("cuda@10.0.0:", when="@22.05: +cuda") - depends_on("cuda@11.0.0:", when="@22.12: +cuda") + with when("+cuda"): + depends_on("cuda@9.0.0:", when="@:22.04") + depends_on("cuda@10.0.0:", when="@22.05:") + depends_on("cuda@11.0.0:", when="@22.12:") depends_on("python@2.7:", type="build", when="@:20.04") depends_on("cmake@3.5:", type="build", when="@:18.10") depends_on("cmake@3.13:", type="build", when="@18.11:19.03") @@ -174,9 +200,10 @@ class Amrex(CMakePackage, CudaPackage, ROCmPackage): depends_on("rocrand", type="build", when="+rocm") depends_on("hiprand", type="build", when="+rocm") depends_on("rocprim", type="build", when="@21.05: +rocm") - depends_on("hypre@2.18.2:", type="link", when="@:21.02 +hypre") - depends_on("hypre@2.19.0:", type="link", when="@21.03: ~cuda +hypre") - depends_on("hypre@2.20.0:", type="link", when="@21.03: +cuda +hypre") + with when("+hypre"): + depends_on("hypre@2.18.2:", type="link", when="@:21.02") + depends_on("hypre@2.19.0:", type="link", when="@21.03: ~cuda") + depends_on("hypre@2.20.0:", type="link", when="@21.03: +cuda") depends_on("petsc", type="link", when="+petsc") depends_on("intel-oneapi-mkl", type=("build", "link"), when="+sycl") @@ -186,6 +213,14 @@ class Amrex(CMakePackage, CudaPackage, ROCmPackage): conflicts("%gcc@8.1.0:8.2.0", when="@21.01:21.02") # Check options compatibility + conflicts( + "+ascent", when="~conduit", msg="AMReX Ascent support needs Conduit interfaces (+conduit)" + ) + conflicts( + "+catalyst", + when="~conduit", + msg="AMReX Catalyst2 support needs Conduit interfaces (+conduit)", + ) conflicts( "+sundials", when="@19.08:20.11 ~fortran", @@ -273,6 +308,9 @@ def cmake_args(self): "-DUSE_XSDK_DEFAULTS=ON", self.define_from_variant("AMReX_SPACEDIM", "dimensions"), self.define_from_variant("BUILD_SHARED_LIBS", "shared"), + self.define_from_variant("AMReX_ASCENT", "ascent"), + self.define_from_variant("AMReX_CATALYST", "catalyst"), + self.define_from_variant("AMReX_CONDUIT", "conduit"), self.define_from_variant("AMReX_MPI", "mpi"), self.define_from_variant("AMReX_OMP", "openmp"), "-DXSDK_PRECISION:STRING=%s" % self.spec.variants["precision"].value.upper(), diff --git a/var/spack/repos/builtin/packages/aocc/package.py b/var/spack/repos/builtin/packages/aocc/package.py index d3d16c0fc682b7..0366bbe971c7e6 100644 --- a/var/spack/repos/builtin/packages/aocc/package.py +++ b/var/spack/repos/builtin/packages/aocc/package.py @@ -33,6 +33,12 @@ class Aocc(Package, LlvmDetection, CompilerPackage): maintainers("amd-toolchain-support") + version( + ver="5.0.0", + sha256="966fac2d2c759e9de6e969c10ada7a7b306c113f7f1e07ea376829ec86380daa", + url="https://download.amd.com/developer/eula/aocc/aocc-5-0/aocc-compiler-5.0.0.tar", + preferred=True, + ) version( ver="4.2.0", sha256="ed5a560ec745b24dc0685ccdcbde914843fb2f2dfbfce1ba592de4ffbce1ccab", diff --git a/var/spack/repos/builtin/packages/apache-tvm/package.py b/var/spack/repos/builtin/packages/apache-tvm/package.py index 1c689da1a09388..2d3301f63a89db 100644 --- a/var/spack/repos/builtin/packages/apache-tvm/package.py +++ b/var/spack/repos/builtin/packages/apache-tvm/package.py @@ -26,7 +26,9 @@ class ApacheTvm(CMakePackage, CudaPackage): depends_on("cxx", type="build") depends_on("cmake@3.18:", type="build") depends_on("python@3.7:3.8", type=("build", "run")) - depends_on("llvm@4:", type="build", when="+llvm") + depends_on("zlib-api", type=("link", "run")) + depends_on("ncurses", type=("link", "run")) + depends_on("llvm@4:18.1.8", type="build", when="+llvm") depends_on("cuda@8:", when="+cuda") def cmake_args(self): diff --git a/var/spack/repos/builtin/packages/apcomp/package.py b/var/spack/repos/builtin/packages/apcomp/package.py index 90c86f00968365..87e1a8c16f2bcb 100644 --- a/var/spack/repos/builtin/packages/apcomp/package.py +++ b/var/spack/repos/builtin/packages/apcomp/package.py @@ -9,6 +9,7 @@ import llnl.util.tty as tty +from spack.build_systems.cmake import CMakeBuilder from spack.package import * @@ -65,7 +66,7 @@ def install(self, spec, prefix): with working_dir("spack-build", create=True): host_cfg_fname = self.create_host_config(spec, prefix) print("Configuring APComp...") - cmake(*std_cmake_args, "-C", host_cfg_fname, "../src") + cmake(*CMakeBuilder.std_args(self), "-C", host_cfg_fname, "../src") print("Building APComp...") make() print("Installing APComp...") diff --git a/var/spack/repos/builtin/packages/apptainer/package.py b/var/spack/repos/builtin/packages/apptainer/package.py index dff6da799c1fa2..6502849d719cb4 100644 --- a/var/spack/repos/builtin/packages/apptainer/package.py +++ b/var/spack/repos/builtin/packages/apptainer/package.py @@ -36,6 +36,7 @@ class Apptainer(SingularityBase): ) version("main", branch="main") + version("1.3.4", sha256="c6ccfdd7c967e5c36dde8711f369c4ac669a16632b79fa0dcaf7e772b7a47397") version("1.3.3", sha256="94a274ab4898cdb131f4e3867c4e15f7e16bc2823303d2afcbafee0242f0838d") version("1.3.2", sha256="483910727e1a15843b93d9f2db1fc87e27804de9c74da13cc32cd4bd0d35e079") # version "1.3.1" has security vulnerability CVE-2024-3727 diff --git a/var/spack/repos/builtin/packages/apr/package.py b/var/spack/repos/builtin/packages/apr/package.py index 27ac0eb8d3f528..6b1eac1282bb0d 100644 --- a/var/spack/repos/builtin/packages/apr/package.py +++ b/var/spack/repos/builtin/packages/apr/package.py @@ -12,16 +12,20 @@ class Apr(AutotoolsPackage): homepage = "https://apr.apache.org/" url = "https://archive.apache.org/dist/apr/apr-1.7.0.tar.gz" - license("Apache-2.0") + license("Apache-2.0", checked_by="wdconinc") - version("1.7.4", sha256="a4137dd82a185076fa50ba54232d920a17c6469c30b0876569e1c2a05ff311d9") - version("1.7.3", sha256="af9bfd5b8a04425d6b419673f3e0a7656fade226aae78180d93f8a6f2d3d1c09") - version("1.7.2", sha256="3d8999b216f7b6235343a4e3d456ce9379aa9a380ffb308512f133f0c5eb2db9") - version("1.7.0", sha256="48e9dbf45ae3fdc7b491259ffb6ccf7d63049ffacbc1c0977cced095e4c2d5a2") - version("1.6.2", sha256="4fc24506c968c5faf57614f5d0aebe0e9d0b90afa47a883e1a1ca94f15f4a42e") - version("1.5.2", sha256="1af06e1720a58851d90694a984af18355b65bb0d047be03ec7d659c746d6dbdb") + version("1.7.5", sha256="3375fa365d67bcf945e52b52cba07abea57ef530f40b281ffbe977a9251361db") - depends_on("c", type="build") # generated + # https://nvd.nist.gov/vuln/detail/CVE-2023-49582 + with default_args(deprecated=True): + version("1.7.4", sha256="a4137dd82a185076fa50ba54232d920a17c6469c30b0876569e1c2a05ff311d9") + version("1.7.3", sha256="af9bfd5b8a04425d6b419673f3e0a7656fade226aae78180d93f8a6f2d3d1c09") + version("1.7.2", sha256="3d8999b216f7b6235343a4e3d456ce9379aa9a380ffb308512f133f0c5eb2db9") + version("1.7.0", sha256="48e9dbf45ae3fdc7b491259ffb6ccf7d63049ffacbc1c0977cced095e4c2d5a2") + version("1.6.2", sha256="4fc24506c968c5faf57614f5d0aebe0e9d0b90afa47a883e1a1ca94f15f4a42e") + version("1.5.2", sha256="1af06e1720a58851d90694a984af18355b65bb0d047be03ec7d659c746d6dbdb") + + depends_on("c", type="build") patch("missing_includes.patch", when="@1.7.0") diff --git a/var/spack/repos/builtin/packages/aqlprofile/package.py b/var/spack/repos/builtin/packages/aqlprofile/package.py index 9fae0246a5290b..199ed72d0f2352 100644 --- a/var/spack/repos/builtin/packages/aqlprofile/package.py +++ b/var/spack/repos/builtin/packages/aqlprofile/package.py @@ -8,6 +8,34 @@ from spack.package import * _versions = { + "6.2.1": { + "apt": ( + "a196698d39c567aef39734b4a47e0daa1596c86945868b4b0cffc6fcb0904dea", + "https://repo.radeon.com/rocm/apt/6.2.1/pool/main/h/hsa-amd-aqlprofile/hsa-amd-aqlprofile_1.0.0.60201.60201-112~20.04_amd64.deb", + ), + "yum": ( + "771782e92156a25a775cb324a5ae4288d419659b963132688e9ed79eed22e421", + "https://repo.radeon.com/rocm/yum/6.2.1/main/hsa-amd-aqlprofile-1.0.0.60201.60201-112.el7.x86_64.rpm", + ), + "zyp": ( + "bb70b54754638c4eb707ae82f4dc02fe9e8fc2e56618e478172169b839851d4d", + "https://repo.radeon.com/rocm/zyp/6.2.1/main/hsa-amd-aqlprofile-1.0.0.60201.60201-sles155.112.x86_64.rpm", + ), + }, + "6.2.0": { + "apt": ( + "75f4417477abb80f6a453f836d1ac44c8a3d24447b21cfa4b29787a73725ef4e", + "https://repo.radeon.com/rocm/apt/6.2/pool/main/h/hsa-amd-aqlprofile/hsa-amd-aqlprofile_1.0.0.60200.60200-66~20.04_amd64.deb", + ), + "yum": ( + "d8ec6ceffe366c041d4dda11c418da53ca3b2234e8a57d4c4af9fdec936349ed", + "https://repo.radeon.com/rocm/yum/6.2/main/hsa-amd-aqlprofile-1.0.0.60200.60200-66.el7.x86_64.rpm", + ), + "zyp": ( + "e7b34e800e4da6542261379e00b4f3a0e3ebc15e80925bf056ce495aff0b25e9", + "https://repo.radeon.com/rocm/zyp/6.2/main/hsa-amd-aqlprofile-1.0.0.60200.60200-sles155.66.x86_64.rpm", + ), + }, "6.1.2": { "apt": ( "93faa8a0d702bc1623d2346e07a9a1c9134d99c0d3f9de62903e7394e0eedf47", diff --git a/var/spack/repos/builtin/packages/arbor/package.py b/var/spack/repos/builtin/packages/arbor/package.py index 7d4c15c89cb231..e3c9de39cfd2e2 100644 --- a/var/spack/repos/builtin/packages/arbor/package.py +++ b/var/spack/repos/builtin/packages/arbor/package.py @@ -2,7 +2,7 @@ # Spack Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) - +from spack.build_environment import optimization_flags from spack.package import * @@ -111,21 +111,23 @@ def build_targets(self): return ["all", "html"] if "+doc" in self.spec else ["all"] def cmake_args(self): + spec = self.spec args = [ self.define_from_variant("ARB_WITH_ASSERTIONS", "assertions"), self.define_from_variant("ARB_WITH_MPI", "mpi"), self.define_from_variant("ARB_WITH_PYTHON", "python"), self.define_from_variant("ARB_VECTORIZE", "vectorize"), + self.define("ARB_ARCH", "none"), + self.define("ARB_CXX_FLAGS_TARGET", optimization_flags(self.compiler, spec.target)), ] if self.spec.satisfies("+cuda"): - args.append("-DARB_GPU=cuda") - args.append(self.define_from_variant("ARB_USE_GPU_RNG", "gpu_rng")) - - # query spack for the architecture-specific compiler flags set by its wrapper - args.append("-DARB_ARCH=none") - opt_flags = self.spec.architecture.target.optimization_flags(self.spec.compiler) - args.append("-DARB_CXX_FLAGS_TARGET=" + opt_flags) + args.extend( + [ + self.define("ARB_GPU", "cuda"), + self.define_from_variant("ARB_USE_GPU_RNG", "gpu_rng"), + ] + ) return args diff --git a/var/spack/repos/builtin/packages/arborx/package.py b/var/spack/repos/builtin/packages/arborx/package.py index a4c1b7249c514d..b5fc91a175d542 100644 --- a/var/spack/repos/builtin/packages/arborx/package.py +++ b/var/spack/repos/builtin/packages/arborx/package.py @@ -23,6 +23,7 @@ class Arborx(CMakePackage, CudaPackage, ROCmPackage): license("BSD-3-Clause") version("master", branch="master") + version("1.7", sha256="e3d9a57a1d7c1ad62f6bbb43fd29a366506f3a16cbbe801c04d10f5fb0dec201") version("1.6", sha256="c2230de185d62f1999d36c6b8b92825f19ab9fbf30bdae90595cab04e76561a4") version("1.5", sha256="c26f23c17e749ccf3e2d353a68969aa54d31b8e720dbfdbc2cef16c5d8477e9e") version("1.4.1", sha256="2ca828ef6615859654b233a7df17017e7cfd904982b80026ec7409eb46b77a95") @@ -74,9 +75,10 @@ class Arborx(CMakePackage, CudaPackage, ROCmPackage): depends_on("kokkos@3.1.00:", when="~trilinos") depends_on("kokkos@3.4.00:", when="@1.2~trilinos") depends_on("kokkos@3.6.00:", when="@1.3~trilinos") - depends_on("kokkos@3.7.01:", when="@1.4:~trilinos") - depends_on("kokkos@4.0.00:", when="@1.5:~trilinos") - depends_on("kokkos@4.1.00:", when="@1.6:~trilinos") + depends_on("kokkos@3.7.01:", when="@1.4:1.4.1~trilinos") + depends_on("kokkos@4.0.00:", when="@1.5~trilinos") + depends_on("kokkos@4.1.00:", when="@1.6~trilinos") + depends_on("kokkos@4.2.00:", when="@1.7:~trilinos") for backend in kokkos_backends: depends_on("kokkos+%s" % backend.lower(), when="~trilinos+%s" % backend.lower()) @@ -102,9 +104,10 @@ class Arborx(CMakePackage, CudaPackage, ROCmPackage): depends_on("trilinos+openmp", when="+trilinos+openmp") depends_on("trilinos@13.2.0:", when="@1.2+trilinos") depends_on("trilinos@13.4.0:", when="@1.3+trilinos") - depends_on("trilinos@14.0.0:", when="@1.4:+trilinos") - depends_on("trilinos@14.2.0:", when="@1.5:+trilinos") - depends_on("trilinos@14.4.0:", when="@1.6:+trilinos") + depends_on("trilinos@14.0.0:", when="@1.4:1.4.1+trilinos") + depends_on("trilinos@14.2.0:", when="@1.5+trilinos") + depends_on("trilinos@14.4.0:", when="@1.6+trilinos") + depends_on("trilinos@15.1.0:", when="@1.7:+trilinos") patch("trilinos14.0-kokkos-major-version.patch", when="@1.4+trilinos ^trilinos@14.0.0") conflicts("~serial", when="+trilinos") diff --git a/var/spack/repos/builtin/packages/armadillo/package.py b/var/spack/repos/builtin/packages/armadillo/package.py index 517df23f303af6..0f723296caf920 100644 --- a/var/spack/repos/builtin/packages/armadillo/package.py +++ b/var/spack/repos/builtin/packages/armadillo/package.py @@ -13,9 +13,12 @@ class Armadillo(CMakePackage): homepage = "https://arma.sourceforge.net/" url = "http://sourceforge.net/projects/arma/files/armadillo-8.100.1.tar.xz" + git = "https://gitlab.com/conradsnicta/armadillo-code.git" license("Apache-2.0") + version("14.0.2", sha256="248e2535fc092add6cb7dea94fc86ae1c463bda39e46fd82d2a7165c1c197dff") + version("12.8.4", sha256="558fe526b990a1663678eff3af6ec93f79ee128c81a4c8aef27ad328fae61138") version("12.8.3", sha256="2922589f6387796504b340da6bb954bef3d87574c298515893289edd2d890151") version("12.8.2", sha256="03b62f8c09e4f5d74643b478520741b8e27b55e7e4525978fcae2f5d791ac3bf") version("12.8.1", sha256="2781dd3a6cc5f9a49c91a4519dde2b1c24335a5bfe0cc1c9881b6363142452b4") @@ -32,6 +35,7 @@ class Armadillo(CMakePackage): variant("hdf5", default=False, description="Include HDF5 support") depends_on("cmake@2.8.12:", type="build") + depends_on("cmake@3.5:", type="build", when="@14:") depends_on("arpack-ng") # old arpack causes undefined symbols depends_on("blas") depends_on("lapack") @@ -44,14 +48,6 @@ class Armadillo(CMakePackage): # platform's compiler is adding `#define linux 1`. patch("undef_linux.patch", when="platform=linux") - def flag_handler(self, name, flags): - spec = self.spec - if name == "ldflags": - if spec.satisfies("%apple-clang@15:"): - flags.append("-Wl,-ld_classic") - - return (flags, None, None) - def patch(self): # Do not include Find{BLAS_type} because we are specifying the # BLAS/LAPACK libraries explicitly. diff --git a/var/spack/repos/builtin/packages/arpack-ng/package.py b/var/spack/repos/builtin/packages/arpack-ng/package.py index 06435b9248b038..564c684e38af76 100644 --- a/var/spack/repos/builtin/packages/arpack-ng/package.py +++ b/var/spack/repos/builtin/packages/arpack-ng/package.py @@ -93,16 +93,15 @@ class ArpackNg(CMakePackage, AutotoolsPackage): def flag_handler(self, name, flags): spec = self.spec - iflags = [] if name == "cflags": if spec.satisfies("%oneapi"): - iflags.append("-Wno-error=implicit-function-declaration") + flags.append("-Wno-error=implicit-function-declaration") if name == "fflags": if self.spec.satisfies("%cce"): - iflags.append("-hnopattern") + flags.append("-hnopattern") - return (iflags, None, None) + return (flags, None, None) @property def libs(self): diff --git a/var/spack/repos/builtin/packages/arrow/package.py b/var/spack/repos/builtin/packages/arrow/package.py index 7089454b67e78d..994579cdb9d297 100644 --- a/var/spack/repos/builtin/packages/arrow/package.py +++ b/var/spack/repos/builtin/packages/arrow/package.py @@ -45,6 +45,8 @@ class Arrow(CMakePackage, CudaPackage): depends_on("cxx", type="build") # generated depends_on("boost@1.60: +filesystem +system") + depends_on("brotli", when="+brotli") + depends_on("bzip2", when="+bz2") depends_on("cmake@3.2.0:", type="build") depends_on("flatbuffers") conflicts("%gcc@14", when="@:15.0.1") # https://github.com/apache/arrow/issues/40009 @@ -78,6 +80,7 @@ class Arrow(CMakePackage, CudaPackage): depends_on("zstd", when="@:8") variant("brotli", default=False, description="Build support for Brotli compression") + variant("bz2", default=False, description="Build support for bzip2 compression") variant( "build_type", default="Release", @@ -158,6 +161,7 @@ def cmake_args(self): args.append(self.define_from_variant("ARROW_PYTHON", "python")) args.append(self.define_from_variant("ARROW_TENSORFLOW", "tensorflow")) args.append(self.define_from_variant("ARROW_WITH_BROTLI", "brotli")) + args.append(self.define_from_variant("ARROW_WITH_BZ2", "bz2")) args.append(self.define_from_variant("ARROW_WITH_LZ4", "lz4")) args.append(self.define_from_variant("ARROW_WITH_SNAPPY", "snappy")) args.append(self.define_from_variant("ARROW_WITH_ZLIB", "zlib")) diff --git a/var/spack/repos/builtin/packages/ascent/package.py b/var/spack/repos/builtin/packages/ascent/package.py index 4bc1c8922e39af..247705a956b7a7 100644 --- a/var/spack/repos/builtin/packages/ascent/package.py +++ b/var/spack/repos/builtin/packages/ascent/package.py @@ -196,14 +196,14 @@ class Ascent(CMakePackage, CudaPackage): ####################### with when("+raja"): depends_on("raja") - depends_on("raja@2024.02.1:", when="@0.9.3:") + depends_on("raja@2024.02.1:2024.02.99", when="@0.9.3:") depends_on("raja+openmp", when="+openmp") depends_on("raja~openmp", when="~openmp") with when("+umpire"): depends_on("umpire") depends_on("umpire@:2023.06.0", when="@:0.9.2") - depends_on("umpire@2024.02.1:", when="@0.9.3:") + depends_on("umpire@2024.02.1:2024.02.99", when="@0.9.3:") ####################### # BabelFlow @@ -216,6 +216,7 @@ class Ascent(CMakePackage, CudaPackage): ####################### with when("+vtkh"): depends_on("vtk-m +doubleprecision ~64bitids") + depends_on("vtk-m@2.1:", when="@0.9.3:") depends_on("vtk-m@2.0:", when="@0.9.2:") # 2.1 support needs commit e52b7bb8c9fd131f2fd49edf58037cc5ef77a166 depends_on("vtk-m@:2.0", when="@:0.9.2") diff --git a/var/spack/repos/builtin/packages/aspell/package.py b/var/spack/repos/builtin/packages/aspell/package.py index 84a90c9bdfa6cd..75f1b2aef5597b 100644 --- a/var/spack/repos/builtin/packages/aspell/package.py +++ b/var/spack/repos/builtin/packages/aspell/package.py @@ -27,3 +27,12 @@ class Aspell(AutotoolsPackage, GNUMirrorPackage): patch("fix_cpp.patch") patch("issue-519.patch", when="@:0.60.6.1") + + # workaround due to https://github.com/GNUAspell/aspell/issues/591 + @run_after("configure", when="@0.60.8:") + def make_missing_files(self): + make("gen/dirs.h") + make("gen/static_filters.src.cpp") + + def setup_run_environment(self, env): + env.set("ASPELL_CONF", f"prefix {self.prefix}") diff --git a/var/spack/repos/builtin/packages/aspell6-de/package.py b/var/spack/repos/builtin/packages/aspell6-de/package.py index 4bb759b5199f66..3714c696531aad 100644 --- a/var/spack/repos/builtin/packages/aspell6-de/package.py +++ b/var/spack/repos/builtin/packages/aspell6-de/package.py @@ -14,6 +14,10 @@ class Aspell6De(AspellDictPackage, GNUMirrorPackage): license("GPL-2.0-or-later") + version( + "6-de-20161207-7-0", + sha256="c2125d1fafb1d4effbe6c88d4e9127db59da9ed92639c7cbaeae1b7337655571", + ) version( "6-de-20030222-1", sha256="ba6c94e11bc2e0e6e43ce0f7822c5bba5ca5ac77129ef90c190b33632416e906", diff --git a/var/spack/repos/builtin/packages/aspell6-en/package.py b/var/spack/repos/builtin/packages/aspell6-en/package.py index afd3bdbfb6ef1f..34b018b776f460 100644 --- a/var/spack/repos/builtin/packages/aspell6-en/package.py +++ b/var/spack/repos/builtin/packages/aspell6-en/package.py @@ -12,6 +12,9 @@ class Aspell6En(AspellDictPackage, GNUMirrorPackage): homepage = "http://aspell.net/" gnu_mirror_path = "aspell/dict/en/aspell6-en-2017.01.22-0.tar.bz2" + version( + "2020.12.07-0", sha256="4c8f734a28a088b88bb6481fcf972d0b2c3dc8da944f7673283ce487eac49fb3" + ) version( "2017.01.22-0", sha256="93c73fae3eab5ea3ca6db3cea8770715a820f1b7d6ea2b932dd66a17f8fd55e1" ) diff --git a/var/spack/repos/builtin/packages/assimp/package.py b/var/spack/repos/builtin/packages/assimp/package.py index 9fd69d85b4fb18..2e51f75e53e11e 100644 --- a/var/spack/repos/builtin/packages/assimp/package.py +++ b/var/spack/repos/builtin/packages/assimp/package.py @@ -16,9 +16,10 @@ class Assimp(CMakePackage): maintainers("wdconinc") - license("BSD-3-Clause") + license("BSD-3-Clause", checked_by="wdconinc") version("master", branch="master") + version("5.4.3", sha256="66dfbaee288f2bc43172440a55d0235dfc7bf885dda6435c038e8000e79582cb") version("5.4.2", sha256="7414861a7b038e407b510e8b8c9e58d5bf8ca76c9dfe07a01d20af388ec5086a") version("5.4.0", sha256="a90f77b0269addb2f381b00c09ad47710f2aab6b1d904f5e9a29953c30104d3f") version("5.3.1", sha256="a07666be71afe1ad4bc008c2336b7c688aca391271188eb9108d0c6db1be53f1") @@ -32,9 +33,6 @@ class Assimp(CMakePackage): version("5.0.1", sha256="11310ec1f2ad2cd46b95ba88faca8f7aaa1efe9aa12605c55e3de2b977b3dbfc") version("4.0.1", sha256="60080d8ab4daaab309f65b3cffd99f19eb1af8d05623fff469b9b652818e286e") - depends_on("c", type="build") # generated - depends_on("cxx", type="build") # generated - patch( "https://patch-diff.githubusercontent.com/raw/assimp/assimp/pull/4203.patch?full_index=1", sha256="24135e88bcef205e118f7a3f99948851c78d3f3e16684104dc603439dd790d74", @@ -43,6 +41,9 @@ class Assimp(CMakePackage): variant("shared", default=True, description="Enables the build of shared libraries") + depends_on("c", type="build") + depends_on("cxx", type="build") + depends_on("cmake@3.10:", type="build", when="@5.1:") depends_on("cmake@3.22:", type="build", when="@5.4:") @@ -54,10 +55,10 @@ def patch(self): def cmake_args(self): args = [ - "-DASSIMP_HUNTER_ENABLED=OFF", - "-DASSIMP_BUILD_ZLIB=OFF", - "-DASSIMP_BUILD_MINIZIP=OFF", - "-DASSIMP_BUILD_TESTS=OFF", + self.define("ASSIMP_HUNTER_ENABLED", False), + self.define("ASSIMP_BUILD_ZLIB", False), + self.define("ASSIMP_BUILD_MINIZIP", False), + self.define("ASSIMP_BUILD_TESTS", self.run_tests), self.define_from_variant("BUILD_SHARED_LIBS", "shared"), ] return args @@ -67,3 +68,12 @@ def flag_handler(self, name, flags): if name == "cxxflags": flags.append(self.compiler.cxx11_flag) return (None, None, flags) + + def check(self): + unit = Executable(join_path(self.builder.build_directory, "bin", "unit")) + skipped_tests = [ + "AssimpAPITest_aiMatrix3x3.aiMatrix3FromToTest", + "AssimpAPITest_aiMatrix4x4.aiMatrix4FromToTest", + "AssimpAPITest_aiQuaternion.aiQuaternionFromNormalizedQuaternionTest", + ] + unit(f"--gtest_filter=-{':'.join(skipped_tests)}") diff --git a/var/spack/repos/builtin/packages/at-spi2-core/package.py b/var/spack/repos/builtin/packages/at-spi2-core/package.py index 8be998302e4f8d..e779c0003f8025 100644 --- a/var/spack/repos/builtin/packages/at-spi2-core/package.py +++ b/var/spack/repos/builtin/packages/at-spi2-core/package.py @@ -18,6 +18,8 @@ class AtSpi2Core(MesonPackage): license("LGPL-2.1-or-later") + version("2.54.0", sha256="d7eee7e75beddcc272cedc2b60535600f3aae6e481589ebc667afc437c0a6079") + version("2.52.0", sha256="0ac3fc8320c8d01fa147c272ba7fa03806389c6b03d3c406d0823e30e35ff5ab") version("2.51.91", sha256="1344bd5c1732b55fcf3df9e3b87569f60984ae83ce75881b5a057c69f8d73e34") version("2.48.3", sha256="37316df43ca9989ce539d54cf429a768c28bb38a0b34950beadd0421827edf55") version("2.48.0", sha256="905a5b6f1790b68ee803bffa9f5fab4ceb591fb4fae0b2f8c612c54f1d4e8a30") diff --git a/var/spack/repos/builtin/packages/augustus/package.py b/var/spack/repos/builtin/packages/augustus/package.py index bfba305f623cd7..fe979ec5b91bf4 100644 --- a/var/spack/repos/builtin/packages/augustus/package.py +++ b/var/spack/repos/builtin/packages/augustus/package.py @@ -168,13 +168,11 @@ def filter_sbang(self): pattern = "^#!.*" repl = f"#!{self.spec['perl'].command.path}" files = glob.glob("*.pl") - for file in files: - filter_file(pattern, repl, *files, backup=False) + filter_file(pattern, repl, *files, backup=False) repl = f"#!{self.spec['python'].command.path}" files = glob.glob("*.py") - for file in files: - filter_file(pattern, repl, *files, backup=False) + filter_file(pattern, repl, *files, backup=False) def setup_build_environment(self, env): htslib = self.spec["htslib"].prefix diff --git a/var/spack/repos/builtin/packages/awscli-v2/package.py b/var/spack/repos/builtin/packages/awscli-v2/package.py index 15dad8150a3bbc..ea9973c1257db5 100644 --- a/var/spack/repos/builtin/packages/awscli-v2/package.py +++ b/var/spack/repos/builtin/packages/awscli-v2/package.py @@ -23,7 +23,9 @@ class AwscliV2(PythonPackage): depends_on("py-flit-core@3.7.1:3.8.0") depends_on("py-colorama@0.2.5:0.4.6") depends_on("py-docutils@0.10:0.19") - depends_on("py-cryptography@3.3.2:40.0.1") + # Remove upper bound to enable Python 3.12 support + # depends_on("py-cryptography@3.3.2:40.0.1") + depends_on("py-cryptography@3.3.2:") depends_on("py-ruamel-yaml@0.15:0.17.21") depends_on("py-ruamel-yaml-clib@0.2:0.2.7", when="^python@:3.9") depends_on("py-prompt-toolkit@3.0.24:3.0.38") diff --git a/var/spack/repos/builtin/packages/axom/package.py b/var/spack/repos/builtin/packages/axom/package.py index 10523c8bede902..f176556e2516d4 100644 --- a/var/spack/repos/builtin/packages/axom/package.py +++ b/var/spack/repos/builtin/packages/axom/package.py @@ -3,7 +3,6 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) -import glob import os import shutil import socket @@ -41,6 +40,8 @@ class Axom(CachedCMakePackage, CudaPackage, ROCmPackage): git = "https://github.com/LLNL/axom.git" tags = ["radiuss"] + test_requires_compiler = True + license("BSD-3-Clause") version("main", branch="main") @@ -632,34 +633,29 @@ def build_test(self): @run_after("install") @on_package_attributes(run_tests=True) - def check_install(self): - """ - Checks the spack install of axom using axom's - using-with-cmake example - """ - - print("Checking Axom installation...") - spec = self.spec - install_prefix = spec.prefix - example_src_dir = join_path(install_prefix, "examples", "axom", "using-with-cmake") - example_build_dir = join_path(example_src_dir, "build") - print("Checking using-with-cmake example...") - with working_dir(example_build_dir, create=True): + def test_install_using_cmake(self): + """build example with cmake and run""" + example_src_dir = join_path(self.prefix.examples.axom, "using-with-cmake") + example_stage_dir = "./cmake" + shutil.copytree(example_src_dir, example_stage_dir) + with working_dir(join_path(example_stage_dir, "build"), create=True): cmake_args = ["-C ../host-config.cmake", example_src_dir] + cmake = self.spec["cmake"].command cmake(*cmake_args) make() example = Executable("./example") example() - print("Checking using-with-make example...") - example_src_dir = join_path(install_prefix, "examples", "axom", "using-with-make") - example_build_dir = join_path(example_src_dir, "build") - example_files = glob.glob(join_path(example_src_dir, "*")) - with working_dir(example_build_dir, create=True): - for example_file in example_files: - shutil.copy(example_file, ".") - make("AXOM_DIR={0}".format(install_prefix)) + make("clean") + + @run_after("install") + @on_package_attributes(run_tests=True) + def test_install_using_make(self): + """build example with make and run""" + example_src_dir = join_path(self.prefix.examples.axom, "using-with-make") + example_stage_dir = "./make" + shutil.copytree(example_src_dir, example_stage_dir) + with working_dir(example_stage_dir, create=True): + make(f"AXOM_DIR={self.prefix}") example = Executable("./example") example() - - def test_install(self): - self.check_install() + make("clean") diff --git a/var/spack/repos/builtin/packages/babelstream/package.py b/var/spack/repos/builtin/packages/babelstream/package.py index b1f518de1f4f8a..ec85b2d3569bc4 100644 --- a/var/spack/repos/builtin/packages/babelstream/package.py +++ b/var/spack/repos/builtin/packages/babelstream/package.py @@ -343,7 +343,6 @@ def cmake_args(self): args.append("-DCMAKE_CUDA_COMPILER=" + cuda_comp) args.append("-DTARGET=NVIDIA") cuda_arch_list = self.spec.variants["cuda_arch"].value - int_cuda_arch = int(cuda_arch_list[0]) cuda_arch = "sm_" + cuda_arch_list[0] args.append("-DCUDA_ARCH=" + cuda_arch) @@ -393,20 +392,20 @@ def cmake_args(self): if "cuda" in self.spec.variants["backend"].value: args.append("-DKokkos_ENABLE_CUDA=ON") cuda_arch_list = self.spec.variants["cuda_arch"].value - int_cuda_arch = int(cuda_arch_list[0]) + cuda_arch = cuda_arch_list[0] # arhitecture kepler optimisations - if int_cuda_arch in (30, 32, 35, 37): - args.append("-D" + "Kokkos_ARCH_KEPLER" + str(int_cuda_arch) + "=ON") + if cuda_arch in ("30", "32", "35", "37"): + args.append("-D" + "Kokkos_ARCH_KEPLER" + cuda_arch + "=ON") # arhitecture maxwell optimisations - if int_cuda_arch in (50, 52, 53): - args.append("-D" + "Kokkos_ARCH_MAXWELL" + str(int_cuda_arch) + "=ON") + if cuda_arch in ("50", "52", "53"): + args.append("-D" + "Kokkos_ARCH_MAXWELL" + cuda_arch + "=ON") # arhitecture pascal optimisations - if int_cuda_arch in (60, 61): - args.append("-D" + "Kokkos_ARCH_PASCAL" + str(int_cuda_arch) + "=ON") + if cuda_arch in ("60", "61"): + args.append("-D" + "Kokkos_ARCH_PASCAL" + cuda_arch + "=ON") # architecture volta optimisations - if int_cuda_arch in (70, 72): - args.append("-D" + "Kokkos_ARCH_VOLTA" + str(int_cuda_arch) + "=ON") - if int_cuda_arch == 75: + if cuda_arch in ("70", "72"): + args.append("-D" + "Kokkos_ARCH_VOLTA" + cuda_arch + "=ON") + if cuda_arch == "75": args.append("-DKokkos_ARCH_TURING75=ON") if "omp" in self.spec.variants["backend"].value: args.append("-DKokkos_ENABLE_OPENMP=ON") diff --git a/var/spack/repos/builtin/packages/bash/package.py b/var/spack/repos/builtin/packages/bash/package.py index 3e520521062ef6..4af7b56e98c2e9 100644 --- a/var/spack/repos/builtin/packages/bash/package.py +++ b/var/spack/repos/builtin/packages/bash/package.py @@ -203,6 +203,9 @@ def configure_args(self): args.append(f"--with-libiconv-prefix={spec['iconv'].prefix}") else: args.append("--without-libiconv-prefix") + # bash malloc relies on sbrk which fails intentionally in musl + if spec.satisfies("^[virtuals=libc] musl"): + args.append("--without-bash-malloc") return args def check(self): diff --git a/var/spack/repos/builtin/packages/bazel/package.py b/var/spack/repos/builtin/packages/bazel/package.py index 52ba8f74bf1ca6..bbd0acf278fe70 100644 --- a/var/spack/repos/builtin/packages/bazel/package.py +++ b/var/spack/repos/builtin/packages/bazel/package.py @@ -120,6 +120,14 @@ class Bazel(Package): # https://blog.bazel.build/2021/05/21/bazel-4-1.html conflicts("platform=darwin target=aarch64:", when="@:4.0") + # https://github.com/bazelbuild/bazel/issues/18642 + patch( + "https://github.com/bazelbuild/bazel/pull/20785.patch?full_index=1", + sha256="85dde31d129bbd31e004c5c87f23cdda9295fbb22946dc6d362f23d83bae1fd8", + when="@6.0:6.4", + ) + conflicts("%gcc@13:", when="@:5") + # Patches for compiling various older bazels which had ICWYU violations revealed by # (but not unique to) GCC 11 header changes. These are derived from # https://gitlab.alpinelinux.org/alpine/aports/-/merge_requests/29084/ @@ -131,8 +139,6 @@ class Bazel(Package): # Bazel-4.0.0 does not compile with gcc-11 # Newer versions of grpc and abseil dependencies are needed but are not in bazel-4.0.0 conflicts("@4.0.0", when="%gcc@11:") - # https://github.com/bazelbuild/bazel/issues/18642 - conflicts("@:6", when="%gcc@13:") executables = ["^bazel$"] @@ -144,6 +150,11 @@ class Bazel(Package): "sha256": "f1c8360c01fcf276778d3519394805dc2a71a64274a3a0908bc9edff7b5aebc8", "when": "@4:6", } + resource_dictionary["com_google_absl"] = { + "url": "https://github.com/abseil/abseil-cpp/archive/refs/tags/20230802.0.tar.gz", + "sha256": "59d2976af9d6ecf001a81a35749a6e551a335b949d34918cfade07737b9d93c5", + "when": "@6.0:6.4", + } resource_dictionary["zulu_11_56_19"] = { "url": "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu11.56.19-ca-jdk11.0.15-linux_x64.tar.gz", "sha256": "e064b61d93304012351242bf0823c6a2e41d9e28add7ea7f05378b7243d34247", diff --git a/var/spack/repos/builtin/packages/bcftools/package.py b/var/spack/repos/builtin/packages/bcftools/package.py index 44b8dedc26108b..4dd8f74c5ea388 100644 --- a/var/spack/repos/builtin/packages/bcftools/package.py +++ b/var/spack/repos/builtin/packages/bcftools/package.py @@ -55,6 +55,7 @@ class Bcftools(AutotoolsPackage): depends_on("gsl", when="+libgsl") depends_on("py-matplotlib", when="@1.6:", type="run") + depends_on("py-gffutils", when="@1.9:", type="run") depends_on("perl", when="@1.8:~perl-filters", type="run") depends_on("perl", when="@1.8:+perl-filters", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/bdw-gc/package.py b/var/spack/repos/builtin/packages/bdw-gc/package.py index 25434ffac83c2f..6c80aac4e2c2a7 100644 --- a/var/spack/repos/builtin/packages/bdw-gc/package.py +++ b/var/spack/repos/builtin/packages/bdw-gc/package.py @@ -11,10 +11,11 @@ class BdwGc(AutotoolsPackage): collecting replacement for C malloc or C++ new.""" homepage = "https://www.hboehm.info/gc/" - url = "https://github.com/ivmai/bdwgc/releases/download/v8.2.6/gc-8.2.6.tar.gz" + url = "https://github.com/ivmai/bdwgc/releases/download/v8.2.8/gc-8.2.8.tar.gz" license("Xerox") + version("8.2.8", sha256="7649020621cb26325e1fb5c8742590d92fb48ce5c259b502faf7d9fb5dabb160") version("8.2.6", sha256="b9183fe49d4c44c7327992f626f8eaa1d8b14de140f243edb1c9dcff7719a7fc") version("8.2.4", sha256="3d0d3cdbe077403d3106bb40f0cbb563413d6efdbb2a7e1cd6886595dec48fc2") version("8.2.2", sha256="f30107bcb062e0920a790ffffa56d9512348546859364c23a14be264b38836a0") diff --git a/var/spack/repos/builtin/packages/bigdft-psolver/package.py b/var/spack/repos/builtin/packages/bigdft-psolver/package.py index dc6f1ceb9dfddd..570622ab3a21ea 100644 --- a/var/spack/repos/builtin/packages/bigdft-psolver/package.py +++ b/var/spack/repos/builtin/packages/bigdft-psolver/package.py @@ -12,7 +12,7 @@ class BigdftPsolver(AutotoolsPackage, CudaPackage): of BigDFT code, and it can also be used separately and linked to other codes.""" homepage = "https://bigdft.org/" - url = "https://gitlab.com/l_sim/bigdft-suite/-/archive/1.9.2/bigdft-suite-1.9.2.tar.gz" + url = "https://gitlab.com/l_sim/bigdft-suite/-/archive/1.9.5/bigdft-suite-1.9.5.tar.gz" git = "https://gitlab.com/l_sim/bigdft-suite.git" version("develop", branch="devel") @@ -23,16 +23,15 @@ class BigdftPsolver(AutotoolsPackage, CudaPackage): version("1.9.1", sha256="3c334da26d2a201b572579fc1a7f8caad1cbf971e848a3e10d83bc4dc8c82e41") version("1.9.0", sha256="4500e505f5a29d213f678a91d00a10fef9dc00860ea4b3edf9280f33ed0d1ac8") - depends_on("c", type="build") # generated - depends_on("cxx", type="build") # generated - depends_on("fortran", type="build") # generated + depends_on("c", type="build") + depends_on("cxx", type="build") + depends_on("fortran", type="build") variant("mpi", default=True, description="Enable MPI support") variant("openmp", default=True, description="Enable OpenMP support") variant("scalapack", default=True, description="Enable SCALAPACK support") - variant( - "shared", default=True, description="Build shared libraries" - ) # Not default in bigdft, but is typically the default expectation + # Not default in bigdft, but is typically the default expectation: + variant("shared", default=True, description="Build shared libraries") depends_on("autoconf", type="build") depends_on("automake", type="build") @@ -97,7 +96,7 @@ def configure_args(self): else: args.append("--without-openmp") - args.append(f"--with-atlab-libs={spec['bigdft-atlab'].prefix.lib}") + args.append(f"--with-atlab-libs={spec['bigdft-atlab'].libs.ld_flags}") if spec.satisfies("+cuda"): args.append("--enable-cuda-gpu") diff --git a/var/spack/repos/builtin/packages/binutils/package.py b/var/spack/repos/builtin/packages/binutils/package.py index f9df8b33715bab..08bcbd57243a26 100644 --- a/var/spack/repos/builtin/packages/binutils/package.py +++ b/var/spack/repos/builtin/packages/binutils/package.py @@ -240,6 +240,7 @@ def flag_handler(self, name, flags): return (iflags, None, flags) def test_binaries(self): + """check versions reported by binaries""" binaries = [ "ar", "c++filt", diff --git a/var/spack/repos/builtin/packages/bird/package.py b/var/spack/repos/builtin/packages/bird/package.py index b9ed84e0c3d3b1..7706f59e675f53 100644 --- a/var/spack/repos/builtin/packages/bird/package.py +++ b/var/spack/repos/builtin/packages/bird/package.py @@ -14,13 +14,42 @@ class Bird(AutotoolsPackage): systems and distributed under the GNU General Public License.""" homepage = "https://bird.network.cz/" - url = "https://github.com/BIRD/bird/archive/v2.0.2.tar.gz" + url = "https://gitlab.nic.cz/labs/bird/-/archive/v2.0.2/bird-v2.0.2.tar.gz" - license("GPL-2.0-or-later") + license("GPL-2.0-or-later", checked_by="wdconinc") - version("2.0.2", sha256="bd42d48fbcc2c0046d544f1183cd98193ff15b792d332ff45f386b0180b09335") - version("2.0.1", sha256="cd6ea4a39ca97ad16d364bf80f919f0e75eba02dd7fe46be40f55d78d022244a") + version("2.15.1", sha256="5a4cf55c4767192aa57880ac5f6763e5b8c26f688ab5934df96e3615c4b0a1e1") + version("2.15", sha256="485b731ed0668b0da4f5110ba8ea98d248e10b25421820feca5dcdd94ab98a29") + version("2.14", sha256="22823b20d31096fcfded6773ecc7d9ee6da0339ede805422647c04127c67472f") + version("2.13.1", sha256="4a55c469f5d2984b62eef929343815b75a7b19132b8c3f40b41f8f66e27d3078") + version("2.13", sha256="db3df5dd84de98c2a61f8415c9812876578d6ba159038d853b211700e43dbae1") + version("2.0.12", sha256="70ef51cbf2b7711db484225da5bdf0344ba31629a167148bfe294f61f07573f6") + version("2.0.11", sha256="a2a1163166def10e014c6f832d6552b00ab46714024613c76cd6ebc3cd3e51c4") + version("2.0.10", sha256="8e053a64ed3e2c681fcee33ee31e61c7a5df32f94644799f283d294108e83722") + version("2.0.9", sha256="912d5c1bbefffd6198b10688ef6e16d0b9dfb2886944f481fc38b4d869ffd2c4") + version("2.0.8", sha256="4d0eeea762dcd4422e1e276e2ed123cfed630cf1cce017b50463d79fcf2fff0c") + version("2.0.7", sha256="d0c6aeaaef3217d6210261a49751fc662838b55fec92f576e20938917dbf89ab") + version("2.0.6", sha256="61518120c76bbfe0b52eff614e7580a1d973e66907df5aeac83fe344aa30595a") + version("2.0.5", sha256="f20dc822fc95aa580759c9b83bfd6c7c2e8504d8d0602cee118db1447054f5d0") + version("2.0.4", sha256="8c191b87524db3ff587253f46f94524ad2a89efdec8a12c800544a5fb01a2861") + version("2.0.3", sha256="54ec151518564f87e81de4ac19376689e5ba8dd9129f1e9a79086db3df0931f8") + version("2.0.2", sha256="e1e9ac92faf5893890c478386fdbd3c391ec2e9b911b1dfccec7b7fa825e9820") + version("2.0.1", sha256="c222968bb017e6b77d14f4e778f437b84f4ccae686355a3ad8e88799285e7636") + # fix multiple definitions with extern rta_dest_names + patch( + "https://gitlab.nic.cz/labs/bird/-/commit/4bbc10614f3431c37e6352f5a6ea5c693c31021e.diff", + sha256="ab891b10dab2fa17a3047cd48e082cccc14f958f4255dcae771deab1330da7c8", + when="@:2.0.7", + ) + # fix linker errors due to undefined behavior on signals + patch( + "https://gitlab.nic.cz/labs/bird/-/commit/24493e9169d3058958ab3ec4d2b02c5753954981.diff", + sha256="ea49dea1c503836feea127c605b99352b1e353df490d63873af09973cf2b3d14", + when="@:2.0.6", + ) + + depends_on("c", type="build") depends_on("autoconf", type="build") depends_on("automake", type="build") depends_on("libtool", type="build") diff --git a/var/spack/repos/builtin/packages/boost/package.py b/var/spack/repos/builtin/packages/boost/package.py index 229aed76c8667a..41a7859c5ba381 100644 --- a/var/spack/repos/builtin/packages/boost/package.py +++ b/var/spack/repos/builtin/packages/boost/package.py @@ -5,6 +5,7 @@ import os import sys +from pathlib import Path from spack.package import * @@ -29,6 +30,7 @@ class Boost(Package): license("BSL-1.0") version("develop", branch="develop", submodules=True) + version("1.86.0", sha256="1bed88e40401b2cb7a1f76d4bab499e352fa4d0c5f31c0dbae64e24d34d7513b") version("1.85.0", sha256="7009fe1faa1697476bdc7027703a2badb84e849b7b0baad5086b087b971f8617") version("1.84.0", sha256="cc4b893acf645c9d4b698e9a0f08ca8846aa5d6c68275c14c3e7949c24109454") version("1.83.0", sha256="6478edfe2f3305127cffe8caf73ea0176c53769f4bf1585be237eb30798c3b8e") @@ -116,7 +118,9 @@ class Boost(Package): # support. The header-only library is installed when no variant is given. all_libs = [ "atomic", + "charconv", "chrono", + "cobalt", "container", "context", "contract", @@ -146,6 +150,7 @@ class Boost(Package): "thread", "timer", "type_erasure", + "url", "wave", ] @@ -303,6 +308,11 @@ def libs(self): # safe to do so on affected platforms. conflicts("+clanglibcpp", when="@1.85: +stacktrace") + # On Windows, the signals variant is required when building any of + # the all_libs variants. + for lib in all_libs: + requires("+signals", when=f"+{lib} platform=windows") + # Patch fix from https://svn.boost.org/trac/boost/ticket/11856 patch("boost_11856.patch", when="@1.60.0%gcc@4.4.7") @@ -495,12 +505,12 @@ def bjam_python_line(self, spec): return "using python : {0} : {1} : {2} : {3} ;\n".format( spec["python"].version.up_to(2), - spec["python"].command.path, - spec["python"].headers.directories[0], - spec["python"].libs[0], + Path(spec["python"].command.path).as_posix(), + Path(spec["python"].headers.directories[0]).as_posix(), + Path(spec["python"].libs[0]).parent.as_posix(), ) - def determine_bootstrap_options(self, spec, with_libs, without_libs, options): + def determine_bootstrap_options(self, spec, with_libs, options): boost_toolset_id = self.determine_toolset(spec) # Arm compiler bootstraps with 'gcc' (but builds as 'clang') @@ -509,9 +519,9 @@ def determine_bootstrap_options(self, spec, with_libs, without_libs, options): else: options.append("--with-toolset=%s" % boost_toolset_id) if with_libs: - options.append("--with-libraries=%s" % ",".join(with_libs)) + options.append("--with-libraries=%s" % ",".join(sorted(with_libs))) else: - options.append("--without-libraries=%s" % ",".join(without_libs)) + options.append("--with-libraries=headers") if spec.satisfies("+python"): options.append("--with-python=%s" % spec["python"].command.path) @@ -521,6 +531,9 @@ def determine_bootstrap_options(self, spec, with_libs, without_libs, options): else: options.append("--without-icu") + self.write_jam_file(spec, boost_toolset_id) + + def write_jam_file(self, spec, boost_toolset_id=None): with open("user-config.jam", "w") as f: # Boost may end up using gcc even though clang+gfortran is set in # compilers.yaml. Make sure this does not happen: @@ -535,7 +548,7 @@ def determine_bootstrap_options(self, spec, with_libs, without_libs, options): # similar, but that doesn't work with the Cray compiler # wrappers. Since Boost doesn't use the MPI C++ bindings, # that can be used as a compiler option instead. - mpi_line = "using mpi : %s" % spec["mpi"].mpicxx + mpi_line = "using mpi : %s" % Path(spec["mpi"].mpicxx).as_posix() f.write(mpi_line + " ;\n") if spec.satisfies("+python"): @@ -608,6 +621,16 @@ def determine_b2_options(self, spec, options): options.extend(["link=%s" % ",".join(link_types), "--layout=%s" % layout]) + if spec.satisfies("platform=windows"): + # The runtime link must either be shared or static, not both. + if "+shared" in spec: + options.append("runtime-link=shared") + else: + options.append("runtime-link=static") + for lib in self.all_libs: + if f"+{lib}" not in spec: + options.append(f"--without-{lib}") + if not spec.satisfies("@:1.75 %intel") and not spec.satisfies("platform=windows"): # When building any version >= 1.76, the toolset must be specified. # Earlier versions could not specify Intel as the toolset @@ -677,6 +700,23 @@ def add_buildopt_symlinks(self, prefix): prefix, remainder = lib.split(".", 1) symlink(lib, "%s-mt.%s" % (prefix, remainder)) + def bootstrap_windows(self): + """Run the Windows-specific bootstrap.bat. The only bootstrapping command + line option that is accepted by the bootstrap.bat script is the compiler + information: either the vc version (e.g. MSVC 14.3.x would be vc143) + or gcc or clang. + """ + bootstrap_options = list() + if self.spec.satisfies("%msvc"): + bootstrap_options.append(f"vc{self.compiler.platform_toolset_ver}") + elif self.spec.satisfies("%gcc"): + bootstrap_options.append("gcc") + elif self.spec.satisfies("%clang"): + bootstrap_options.append("clang") + + bootstrap = Executable("cmd.exe") + bootstrap("/c", ".\\bootstrap.bat", *bootstrap_options) + def install(self, spec, prefix): # On Darwin, Boost expects the Darwin libtool. However, one of the # dependencies may have pulled in Spack's GNU libtool, and these two @@ -688,55 +728,41 @@ def install(self, spec, prefix): force_symlink("/usr/bin/libtool", join_path(newdir, "libtool")) env["PATH"] = newdir + ":" + env["PATH"] - with_libs = list() - without_libs = list() - for lib in Boost.all_libs: - if "+{0}".format(lib) in spec: - with_libs.append(lib) - else: - without_libs.append(lib) - - remove_if_in_list = lambda lib, libs: libs.remove(lib) if lib in libs else None + with_libs = {f"{lib}" for lib in Boost.all_libs if f"+{lib}" in spec} # Remove libraries that the release version does not support + if not spec.satisfies("@1.85.0:"): + with_libs.discard("charconv") + if not spec.satisfies("@1.84.0:"): + with_libs.discard("cobalt") + if not spec.satisfies("@1.81.0:"): + with_libs.discard("url") if not spec.satisfies("@1.75.0:"): - remove_if_in_list("json", with_libs) - remove_if_in_list("json", without_libs) + with_libs.discard("json") if spec.satisfies("@1.69.0:"): - remove_if_in_list("signals", with_libs) - remove_if_in_list("signals", without_libs) + with_libs.discard("signals") if not spec.satisfies("@1.54.0:"): - remove_if_in_list("log", with_libs) - remove_if_in_list("log", without_libs) + with_libs.discard("log") if not spec.satisfies("@1.53.0:"): - remove_if_in_list("atomic", with_libs) - remove_if_in_list("atomic", without_libs) + with_libs.discard("atomic") if not spec.satisfies("@1.48.0:"): - remove_if_in_list("locale", with_libs) - remove_if_in_list("locale", without_libs) + with_libs.discard("locale") if not spec.satisfies("@1.47.0:"): - remove_if_in_list("chrono", with_libs) - remove_if_in_list("chrono", without_libs) + with_libs.discard("chrono") if not spec.satisfies("@1.43.0:"): - remove_if_in_list("random", with_libs) - remove_if_in_list("random", without_libs) + with_libs.discard("random") if not spec.satisfies("@1.39.0:"): - remove_if_in_list("exception", with_libs) - remove_if_in_list("exception", without_libs) + with_libs.discard("exception") if spec.satisfies("+graph") and spec.satisfies("+mpi"): - with_libs.append("graph_parallel") - remove_if_in_list("graph_parallel", without_libs) - - # to make Boost find the user-config.jam - env["BOOST_BUILD_PATH"] = self.stage.source_path - - bootstrap_options = ["--prefix=%s" % prefix] - self.determine_bootstrap_options(spec, with_libs, without_libs, bootstrap_options) + with_libs.add("graph_parallel") if self.spec.satisfies("platform=windows"): - bootstrap = Executable("cmd.exe") - bootstrap("/c", ".\\bootstrap.bat", *bootstrap_options) + self.bootstrap_windows() else: + # to make Boost find the user-config.jam + env["BOOST_BUILD_PATH"] = self.stage.source_path + bootstrap_options = ["--prefix=%s" % prefix] + self.determine_bootstrap_options(spec, with_libs, bootstrap_options) bootstrap = Executable("./bootstrap.sh") bootstrap(*bootstrap_options) @@ -759,15 +785,24 @@ def install(self, spec, prefix): if jobs > 64 and spec.satisfies("@:1.58"): jobs = 64 - # Windows just wants a b2 call with no args - b2_options = [] - if not self.spec.satisfies("platform=windows"): - path_to_config = "--user-config=%s" % os.path.join( - self.stage.source_path, "user-config.jam" - ) - b2_options = ["-j", "%s" % jobs] - b2_options.append(path_to_config) + if self.spec.satisfies("platform=windows"): + + def is_64bit(): + # TODO: This method should be abstracted to a more general location + # as it is repeated in many places (msmpi.py for one) + return "64" in str(self.spec.target.family) + b2_options = [f"--prefix={self.prefix}", f"address-model={64 if is_64bit() else 32}"] + if not self.spec.satisfies("+python"): + b2_options.append("--without-python") + + self.write_jam_file(self.spec) + else: + b2_options = ["-j", "%s" % jobs] + path_to_config = "--user-config=%s" % os.path.join( + self.stage.source_path, "user-config.jam" + ) + b2_options.append(path_to_config) threading_opts = self.determine_b2_options(spec, b2_options) # Create headers if building from a git checkout diff --git a/var/spack/repos/builtin/packages/braker/package.py b/var/spack/repos/builtin/packages/braker/package.py index d9db1868840b0f..6180c1895b485b 100644 --- a/var/spack/repos/builtin/packages/braker/package.py +++ b/var/spack/repos/builtin/packages/braker/package.py @@ -63,8 +63,7 @@ def filter_sbang(self): pattern = "^#!.*/usr/bin/env perl" repl = "#!{0}".format(self.spec["perl"].command.path) files = glob.iglob("*.pl") - for file in files: - filter_file(pattern, repl, *files, backup=False) + filter_file(pattern, repl, *files, backup=False) def setup_run_environment(self, env): env.prepend_path("PERL5LIB", self.prefix.lib) diff --git a/var/spack/repos/builtin/packages/bufr-query/package.py b/var/spack/repos/builtin/packages/bufr-query/package.py new file mode 100644 index 00000000000000..bf79f5f581bd82 --- /dev/null +++ b/var/spack/repos/builtin/packages/bufr-query/package.py @@ -0,0 +1,59 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class BufrQuery(CMakePackage, PythonExtension): + """The NOAA bufr-query Library can be used to read NCEP and WMO formated BUFR + files using a simple interface that does not require the user to know the + details of the BUFR format. Detailed documentation for the BUFR Library can + be found at https://bufr-query.readthedocs.io/en/latest/index.html""" + + homepage = "https://github.com/NOAA-EMC/bufr-query" + url = "https://github.com/NOAA-EMC/bufr-query/archive/refs/tags/v0.0.1.tar.gz" + maintainers("srherbener", "rmclaren") + + license("Apache-2.0", checked_by="srherbener") + + version("0.0.3", sha256="f2952a190cc1d7714a3bfe481fb1545459639ba304fc31b941062b471dea1d41") + version("0.0.2", sha256="b87a128246e79e3c76e3158d89823e2ae38e9ee1a5a81b6f7b423837bdb93a1f") + version("0.0.1", sha256="001990d864533c101b93d1c351edf50cf8b5ccc575e442d174735f6c332d3d03") + + # Required dependencies + depends_on("ecbuild", type=("build")) + depends_on("llvm-openmp", when="%apple-clang", type=("build", "run")) + depends_on("mpi", type=("build", "run")) + depends_on("eckit@1.24.4:", type=("build", "run")) + depends_on("eigen@3:", type=("build", "run")) + depends_on("gsl-lite", type=("build", "run")) + depends_on("netcdf-c", type=("build", "run")) + depends_on("netcdf-cxx4", type=("build", "run")) + depends_on("bufr", type=("build", "run")) + + # Optional dependencies + variant("python", default=True, description="Enable Python interface") + + with when("+python"): + extends("python") + depends_on("py-pybind11", type="build") + + # Patches + patch( + "https://github.com/NOAA-EMC/bufr-query/pull/20.patch?full_index=1", + sha256="3acf11082c9e76e64dbbda4f62ac0cbc234dca7e60c85a275e778417cfd65001", + when="+python @:0.0.2", + ) + + # CMake configuration + def cmake_args(self): + args = [self.define_from_variant("BUILD_PYTHON_BINDINGS", "python")] + + # provide path to netcdf-c include files + nc_include_dir = Executable("nc-config")("--includedir", output=str).strip() + args.append("-DCMAKE_C_FLAGS=-I" + nc_include_dir) + args.append("-DCMAKE_CXX_FLAGS=-I" + nc_include_dir) + + return args diff --git a/var/spack/repos/builtin/packages/busybox/package.py b/var/spack/repos/builtin/packages/busybox/package.py index e7d36937fba351..3b7add98bca6f8 100644 --- a/var/spack/repos/builtin/packages/busybox/package.py +++ b/var/spack/repos/builtin/packages/busybox/package.py @@ -16,6 +16,7 @@ class Busybox(MakefilePackage): license("GPL-2.0-only") + version("1.37.0", sha256="3311dff32e746499f4df0d5df04d7eb396382d7e108bb9250e7b519b837043a4") version("1.36.1", sha256="b8cc24c9574d809e7279c3be349795c5d5ceb6fdf19ca709f80cde50e47de314") version("1.36.0", sha256="542750c8af7cb2630e201780b4f99f3dcceeb06f505b479ec68241c1e6af61a5") version("1.31.1", sha256="d0f940a72f648943c1f2211e0e3117387c31d765137d92bd8284a3fb9752a998") diff --git a/var/spack/repos/builtin/packages/cabana/package.py b/var/spack/repos/builtin/packages/cabana/package.py index f2d90bbf20e56a..42852dc12320c0 100644 --- a/var/spack/repos/builtin/packages/cabana/package.py +++ b/var/spack/repos/builtin/packages/cabana/package.py @@ -12,13 +12,15 @@ class Cabana(CMakePackage, CudaPackage, ROCmPackage): homepage = "https://github.com/ECP-copa/Cabana" git = "https://github.com/ECP-copa/Cabana.git" - url = "https://github.com/ECP-copa/Cabana/archive/0.6.0.tar.gz" + url = "https://github.com/ECP-copa/Cabana/archive/0.7.0.tar.gz" maintainers("junghans", "streeve", "sslattery") tags = ["e4s", "ecp"] version("master", branch="master") + version("0.7.0", sha256="3d46532144ea9a3f36429a65cccb7562d1244f1389dd8aff0d253708d1ec9838") + version("0.6.1", sha256="fea381069fe707921831756550a665280da59032ea7914f7ce2a01ed467198bc") version("0.6.0", sha256="a88a3f80215998169cdbd37661c0c0af57e344af74306dcd2b61983d7c69e6e5") version("0.5.0", sha256="b7579d44e106d764d82b0539285385d28f7bbb911a572efd05c711b28b85d8b1") version("0.4.0", sha256="c347d23dc4a5204f9cc5906ccf3454f0b0b1612351bbe0d1c58b14cddde81e85") @@ -27,7 +29,8 @@ class Cabana(CMakePackage, CudaPackage, ROCmPackage): version("0.1.0", sha256="3280712facf6932b9d1aff375b24c932abb9f60a8addb0c0a1950afd0cb9b9cf") version("0.1.0-rc0", sha256="73754d38aaa0c2a1e012be6959787108fec142294774c23f70292f59c1bdc6c5") - depends_on("cxx", type="build") # generated + depends_on("c", type="build", when="+mpi") + depends_on("cxx", type="build") _kokkos_backends = Kokkos.devices_variants for _backend in _kokkos_backends: @@ -36,6 +39,7 @@ class Cabana(CMakePackage, CudaPackage, ROCmPackage): variant("shared", default=True, description="Build shared libraries") variant("mpi", default=True, description="Build with mpi support") + variant("all", default=False, description="Build with ALL support") variant("arborx", default=False, description="Build with ArborX support") variant("heffte", default=False, description="Build with heFFTe support") variant("hypre", default=False, description="Build with HYPRE support") @@ -50,7 +54,7 @@ class Cabana(CMakePackage, CudaPackage, ROCmPackage): depends_on("cmake@3.9:", type="build", when="@:0.4.0") depends_on("cmake@3.16:", type="build", when="@0.5.0:") - depends_on("googletest", type="test", when="+testing") + depends_on("googletest", type="build", when="+testing") _versions = {":0.2": "-legacy", "0.3:": "@3.1:", "0.4:": "@3.2:", "0.6:": "@3.7:"} for _version in _versions: _kk_version = _versions[_version] @@ -84,9 +88,12 @@ class Cabana(CMakePackage, CudaPackage, ROCmPackage): conflicts("+cuda", when="cuda_arch=none") conflicts("+rocm", when="amdgpu_target=none") - depends_on("kokkos+cuda_lambda", when="+cuda") + # https://github.com/ECP-copa/Cabana/releases/tag/0.7.0 + depends_on("kokkos+cuda_lambda@3.7:", when="+cuda") + depends_on("kokkos+cuda_lambda@4.1:", when="+cuda@0.7:") # Dependencies for subpackages + depends_on("all", when="@0.5.0:+all") depends_on("arborx", when="@0.3.0:+arborx") depends_on("hypre-cmake@2.22.0:", when="@0.4.0:+hypre") depends_on("hypre-cmake@2.22.1:", when="@0.5.0:+hypre") @@ -97,25 +104,35 @@ class Cabana(CMakePackage, CudaPackage, ROCmPackage): depends_on("hdf5", when="@0.6.0:+hdf5") depends_on("mpi", when="+mpi") - # Cabana automatically builds HDF5 support with newer cmake versions - # in version 0.6.0. This is fixed post-0.6 - conflicts("~hdf5", when="@0.6.0 ^cmake@:3.26") + # CMakeLists.txt of Cabana>=0.6 always enables HDF5 with CMake >= 3.26 (not changed post-0.6): + conflicts("~hdf5", when="@0.6.0: ^cmake@3.26:") + + # Cabana HDF5 support requires MPI. + conflicts("+hdf5 ~mpi") # Cajita support requires MPI conflicts("+cajita ~mpi") conflicts("+grid ~mpi") + # The +grid does not support gcc>=13 (missing iostream/cstdint includes): + conflicts("+grid", when="@:0.6 %gcc@13:") + # Conflict variants only available in newer versions of cabana conflicts("+rocm", when="@:0.2.0") conflicts("+sycl", when="@:0.3.0") conflicts("+silo", when="@:0.3.0") conflicts("+hdf5", when="@:0.5.0") + @when("+mpi") + def patch(self): + # CMakeLists.txt tries to enable C when MPI is requsted, but too late: + filter_file("LANGUAGES CXX", "LANGUAGES C CXX", "CMakeLists.txt") + def cmake_args(self): options = [self.define_from_variant("BUILD_SHARED_LIBS", "shared")] enable = ["CAJITA", "TESTING", "EXAMPLES", "PERFORMANCE_TESTING"] - require = ["ARBORX", "HEFFTE", "HYPRE", "SILO", "HDF5"] + require = ["ALL", "ARBORX", "HEFFTE", "HYPRE", "SILO", "HDF5"] # These variables were removed in 0.3.0 (where backends are # automatically used from Kokkos) @@ -136,12 +153,10 @@ def cmake_args(self): cbn_option = "Cabana_{0}_{1}".format(cname, var) options.append(self.define_from_variant(cbn_option, var.lower())) - # Only enable user-requested options. + # Attempt to disable find_package() calls for disabled options(if option supports it): for var in require: - enabled_var = "+{0}".format(var.lower()) - if enabled_var not in self.spec: - cbn_disable = "CMAKE_DISABLE_FIND_PACKAGE_{0}".format(var) - options.append(self.define(cbn_disable, "ON")) + if not self.spec.satisfies("+" + var.lower()): + options.append(self.define("CMAKE_DISABLE_FIND_PACKAGE_" + var, "ON")) # Use hipcc for HIP. if self.spec.satisfies("+rocm"): diff --git a/var/spack/repos/builtin/packages/caliper/package.py b/var/spack/repos/builtin/packages/caliper/package.py index 01857c5f333a3d..e165899674a2b9 100644 --- a/var/spack/repos/builtin/packages/caliper/package.py +++ b/var/spack/repos/builtin/packages/caliper/package.py @@ -9,7 +9,7 @@ from spack.package import * -class Caliper(CMakePackage, CudaPackage, ROCmPackage): +class Caliper(CachedCMakePackage, CudaPackage, ROCmPackage): """Caliper is a program instrumentation and performance measurement framework. It is designed as a performance analysis toolbox in a library, allowing one to bake performance analysis capabilities @@ -21,7 +21,7 @@ class Caliper(CMakePackage, CudaPackage, ROCmPackage): url = "https://github.com/LLNL/Caliper/archive/v2.11.0.tar.gz" tags = ["e4s", "radiuss"] - maintainers("daboehme") + maintainers("daboehme", "adrienbernede") test_requires_compiler = True @@ -134,69 +134,109 @@ class Caliper(CMakePackage, CudaPackage, ROCmPackage): when="@2.9.0:2.9.1 +libunwind +sampler", ) - def cmake_args(self): + def _get_sys_type(self, spec): + sys_type = spec.architecture + if "SYS_TYPE" in env: + sys_type = env["SYS_TYPE"] + return sys_type + + def initconfig_compiler_entries(self): + spec = self.spec + entries = super().initconfig_compiler_entries() + + if spec.satisfies("+rocm"): + entries.insert(0, cmake_cache_path("CMAKE_CXX_COMPILER", spec["hip"].hipcc)) + + entries.append(cmake_cache_option("WITH_FORTRAN", spec.satisfies("+fortran"))) + + entries.append(cmake_cache_option("BUILD_SHARED_LIBS", spec.satisfies("+shared"))) + entries.append(cmake_cache_option("BUILD_TESTING", spec.satisfies("+tests"))) + entries.append(cmake_cache_option("BUILD_DOCS", False)) + entries.append(cmake_cache_path("PYTHON_EXECUTABLE", spec["python"].command.path)) + + return entries + + def initconfig_hardware_entries(self): + spec = self.spec + entries = super().initconfig_hardware_entries() + + if spec.satisfies("+cuda"): + entries.append(cmake_cache_option("WITH_CUPTI", True)) + entries.append(cmake_cache_option("WITH_NVTX", True)) + entries.append(cmake_cache_path("CUDA_TOOLKIT_ROOT_DIR", spec["cuda"].prefix)) + entries.append(cmake_cache_path("CUPTI_PREFIX", spec["cuda"].prefix)) + else: + entries.append(cmake_cache_option("WITH_CUPTI", False)) + entries.append(cmake_cache_option("WITH_NVTX", False)) + + if spec.satisfies("+rocm"): + entries.append(cmake_cache_option("WITH_ROCTRACER", True)) + entries.append(cmake_cache_option("WITH_ROCTX", True)) + else: + entries.append(cmake_cache_option("WITH_ROCTRACER", False)) + entries.append(cmake_cache_option("WITH_ROCTX", False)) + + return entries + + def initconfig_mpi_entries(self): spec = self.spec + entries = super().initconfig_mpi_entries() - args = [ - "-DBUILD_TESTING=Off", - "-DBUILD_DOCS=Off", - self.define_from_variant("BUILD_SHARED_LIBS", "shared"), - self.define_from_variant("WITH_ADIAK", "adiak"), - self.define_from_variant("WITH_GOTCHA", "gotcha"), - self.define_from_variant("WITH_PAPI", "papi"), - self.define_from_variant("WITH_LIBDW", "libdw"), - self.define_from_variant("WITH_LIBPFM", "libpfm"), - self.define_from_variant("WITH_SOSFLOW", "sosflow"), - self.define_from_variant("WITH_SAMPLER", "sampler"), - self.define_from_variant("WITH_MPI", "mpi"), - self.define_from_variant("WITH_FORTRAN", "fortran"), - self.define_from_variant("WITH_CUPTI", "cuda"), - self.define_from_variant("WITH_NVTX", "cuda"), - self.define_from_variant("WITH_ROCTRACER", "rocm"), - self.define_from_variant("WITH_ROCTX", "rocm"), - self.define_from_variant("WITH_VARIORUM", "variorum"), - self.define_from_variant("WITH_VTUNE", "vtune"), - self.define_from_variant("WITH_KOKKOS", "kokkos"), - ] + entries.append(cmake_cache_option("WITH_MPI", spec.satisfies("+mpi"))) + return entries + + def initconfig_package_entries(self): + spec = self.spec + entries = [] + + # TPL locations + entries.append("#------------------{0}".format("-" * 60)) + entries.append("# TPLs") + entries.append("#------------------{0}\n".format("-" * 60)) + + if spec.satisfies("+adiak"): + entries.append(cmake_cache_path("adiak_DIR", spec["adiak"].prefix)) if spec.satisfies("+papi"): - args.append("-DPAPI_PREFIX=%s" % spec["papi"].prefix) + entries.append(cmake_cache_path("PAPI_PREFIX", spec["papi"].prefix)) if spec.satisfies("+libdw"): - args.append("-DLIBDW_PREFIX=%s" % spec["elfutils"].prefix) + entries.append(cmake_cache_path("LIBDW_PREFIX", spec["elfutils"].prefix)) if spec.satisfies("+libpfm"): - args.append("-DLIBPFM_INSTALL=%s" % spec["libpfm4"].prefix) + entries.append(cmake_cache_path("LIBPFM_INSTALL", spec["libpfm4"].prefix)) if spec.satisfies("+sosflow"): - args.append("-DSOS_PREFIX=%s" % spec["sosflow"].prefix) + entries.append(cmake_cache_path("SOS_PREFIX", spec["sosflow"].prefix)) if spec.satisfies("+variorum"): - args.append("-DVARIORUM_PREFIX=%s" % spec["variorum"].prefix) + entries.append(cmake_cache_path("VARIORUM_PREFIX", spec["variorum"].prefix)) + if spec.satisfies("+vtune"): + itt_dir = join_path(spec["intel-oneapi-vtune"].prefix, "vtune", "latest") + entries.append(cmake_cache_path("ITT_PREFIX", itt_dir)) + if spec.satisfies("+libunwind"): + entries.append(cmake_cache_path("LIBUNWIND_PREFIX", spec["unwind"].prefix)) + + # Build options + entries.append("#------------------{0}".format("-" * 60)) + entries.append("# Build Options") + entries.append("#------------------{0}\n".format("-" * 60)) + + entries.append(cmake_cache_option("WITH_ADIAK", spec.satisfies("+adiak"))) + entries.append(cmake_cache_option("WITH_GOTCHA", spec.satisfies("+gotcha"))) + entries.append(cmake_cache_option("WITH_SAMPLER", spec.satisfies("+sampler"))) + entries.append(cmake_cache_option("WITH_PAPI", spec.satisfies("+papi"))) + entries.append(cmake_cache_option("WITH_LIBDW", spec.satisfies("+libdw"))) + entries.append(cmake_cache_option("WITH_LIBPFM", spec.satisfies("+libpfm"))) + entries.append(cmake_cache_option("WITH_SOSFLOW", spec.satisfies("+sosflow"))) + entries.append(cmake_cache_option("WITH_KOKKOS", spec.satisfies("+kokkos"))) + entries.append(cmake_cache_option("WITH_VARIORUM", spec.satisfies("+variorum"))) + entries.append(cmake_cache_option("WITH_VTUNE", spec.satisfies("+vtune"))) # -DWITH_CALLPATH was renamed -DWITH_LIBUNWIND in 2.5 callpath_flag = "LIBUNWIND" if spec.satisfies("@2.5:") else "CALLPATH" - if spec.satisfies("+libunwind"): - args.append("-DLIBUNWIND_PREFIX=%s" % spec["unwind"].prefix) - args.append("-DWITH_%s=On" % callpath_flag) - else: - args.append("-DWITH_%s=Off" % callpath_flag) + entries.append(cmake_cache_option("WITH_%s" % callpath_flag, spec.satisfies("+libunwind"))) - if spec.satisfies("+mpi"): - args.append("-DMPI_C_COMPILER=%s" % spec["mpi"].mpicc) - args.append("-DMPI_CXX_COMPILER=%s" % spec["mpi"].mpicxx) + return entries - if spec.satisfies("+cuda"): - args.append("-DCUDA_TOOLKIT_ROOT_DIR=%s" % spec["cuda"].prefix) - # technically only works with cuda 10.2+, otherwise cupti is in - # ${CUDA_TOOLKIT_ROOT_DIR}/extras/CUPTI - args.append("-DCUPTI_PREFIX=%s" % spec["cuda"].prefix) - - if spec.satisfies("+vtune"): - itt_dir = join_path(spec["intel-oneapi-vtune"].prefix, "vtune", "latest") - args.append("-DITT_PREFIX=%s" % itt_dir) - - if spec.satisfies("+rocm"): - args.append("-DCMAKE_CXX_COMPILER={0}".format(spec["hip"].hipcc)) - args.append("-DROCM_PREFIX=%s" % spec["hsa-rocr-dev"].prefix) - - return args + def cmake_args(self): + return [] @run_after("install") def cache_test_sources(self): diff --git a/var/spack/repos/builtin/packages/camp/package.py b/var/spack/repos/builtin/packages/camp/package.py index 6e1d44188d32e6..7e7c305b18d9da 100644 --- a/var/spack/repos/builtin/packages/camp/package.py +++ b/var/spack/repos/builtin/packages/camp/package.py @@ -21,9 +21,15 @@ class Camp(CMakePackage, CudaPackage, ROCmPackage): license("BSD-3-Clause") version("main", branch="main", submodules=False) + version( + "2024.07.0", + tag="v2024.07.0", + commit="0f07de4240c42e0b38a8d872a20440cb4b33d9f5", + submodules=False, + ) version( "2024.02.1", - tag="v2024.02.", + tag="v2024.02.1", commit="79c320fa09db987923b56884afdc9f82f4b70fc4", submodules=False, ) @@ -53,12 +59,14 @@ class Camp(CMakePackage, CudaPackage, ROCmPackage): # TODO: figure out gtest dependency and then set this default True. variant("tests", default=False, description="Build tests") variant("openmp", default=False, description="Build with OpenMP support") + variant("omptarget", default=False, description="Build with OpenMP Target support") + variant("sycl", default=False, description="Build with Sycl support") depends_on("cub", when="+cuda") depends_on("blt", type="build") depends_on("blt@0.6.2:", type="build", when="@2024.02.1:") - depends_on("blt@0.6.1:", type="build", when="@2024.02.0:") + depends_on("blt@0.6.1", type="build", when="@2024.02.0") depends_on("blt@0.5.0:0.5.3", type="build", when="@2022.03.0:2023.06.0") patch("libstdc++-13-missing-header.patch", when="@:2022.10") @@ -67,6 +75,16 @@ class Camp(CMakePackage, CudaPackage, ROCmPackage): conflicts("^blt@:0.3.6", when="+rocm") + conflicts("+omptarget +rocm") + conflicts("+sycl +omptarget") + conflicts("+sycl +rocm") + conflicts( + "+sycl", + when="@:2024.02.99", + msg="Support for SYCL was introduced in RAJA after 2024.02 release, " + "please use a newer release.", + ) + def cmake_args(self): spec = self.spec @@ -94,7 +112,12 @@ def cmake_args(self): options.append("-DGPU_TARGETS={0}".format(archs)) options.append("-DAMDGPU_TARGETS={0}".format(archs)) - options.append(self.define_from_variant("ENABLE_OPENMP", "openmp")) + if spec.satisfies("+omptarget"): + options.append(cmake_cache_string("RAJA_DATA_ALIGN", 64)) + options.append(self.define_from_variant("ENABLE_TESTS", "tests")) + options.append(self.define_from_variant("ENABLE_OPENMP", "openmp")) + options.append(self.define_from_variant("CAMP_ENABLE_TARGET_OPENMP", "omptarget")) + options.append(self.define_from_variant("ENABLE_SYCL", "sycl")) return options diff --git a/var/spack/repos/builtin/packages/cans/package.py b/var/spack/repos/builtin/packages/cans/package.py index 8279910a085f55..8c8472a84d93c1 100644 --- a/var/spack/repos/builtin/packages/cans/package.py +++ b/var/spack/repos/builtin/packages/cans/package.py @@ -15,8 +15,8 @@ class Cans(MakefilePackage): finite-difference Poisson equation in a 3D Cartesian grid.""" - homepage = "https://github.com/p-costa/CaNS" - url = "https://github.com/p-costa/CaNS/archive/refs/tags/v1.1.4.tar.gz" + homepage = "https://github.com/CaNS-World/CaNS" + url = "https://github.com/CaNS-World/CaNS/archive/refs/tags/v1.1.4.tar.gz" maintainers("lhxone", "p-costa", "nscapin", "GabrieleBoga") diff --git a/var/spack/repos/builtin/packages/care/package.py b/var/spack/repos/builtin/packages/care/package.py index 34fdc7d3a0d25a..f6465bb4ca3e50 100644 --- a/var/spack/repos/builtin/packages/care/package.py +++ b/var/spack/repos/builtin/packages/care/package.py @@ -3,42 +3,59 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) +import socket + from spack.package import * +from .blt import llnl_link_helpers + -class Care(CMakePackage, CudaPackage, ROCmPackage): +class Care(CachedCMakePackage, CudaPackage, ROCmPackage): """ - Algorithms for chai managed arrays. + CHAI and RAJA extensions (includes data structures and algorithms). """ homepage = "https://github.com/LLNL/CARE" git = "https://github.com/LLNL/CARE.git" tags = ["radiuss"] - license("GPL-2.0-or-later") + license("BSD-3-Clause") - maintainers("adayton1") + maintainers("adayton1", "adrienbernede") - version("develop", branch="develop", submodules="True") - version("master", branch="main", submodules="True") + version("develop", branch="develop", submodules=False) + version("master", branch="master", submodules=False) + version( + "0.13.3", + tag="v0.13.3", + commit="93853696b452647278eae9311b835ad206236522", + submodules=False, + ) + version( + "0.13.2", + tag="v0.13.2", + commit="b25dcd2a35683a68db1c25173e849be69833ed4f", + submodules=False, + ) version( "0.13.1", tag="v0.13.1", commit="0fd0d47aaaa57076f26caad88e667fbc01ff7214", - submodules="True", + submodules=False, ) version( "0.13.0", tag="v0.13.0", commit="2b288e2c557c3b14befeebc8e14a7d48348bd857", - submodules="True", + submodules=False, ) version( "0.12.0", tag="v0.12.0", commit="a9978083035eb00a090451bd36d7987bc935204d", - submodules="True", + submodules=False, ) + version("0.10.0", tag="v0.10.0", submodules="True") version( "0.3.0", tag="v0.3.0", commit="5e2b69b2836c9f2215207ca9a36a690cb77eea33", submodules="True" ) @@ -50,137 +67,219 @@ class Care(CMakePackage, CudaPackage, ROCmPackage): depends_on("cxx", type="build") # generated depends_on("fortran", type="build") # generated - variant("openmp", default=False, description="Build Shared Libs") + variant("openmp", default=False, description="Build with OpenMP support") + variant("mpi", default=False, description="Enable MPI support") variant( "implicit_conversions", - default=True, + default=False, description="Enable implicit" "conversions to/from raw pointers", ) - variant("benchmarks", default=True, description="Build benchmarks.") - variant("examples", default=True, description="Build examples.") - variant("docs", default=False, description="Build documentation") variant("tests", default=False, description="Build tests") + variant("benchmarks", default=False, description="Build benchmarks.") + variant("examples", default=False, description="Build examples.") + variant("docs", default=False, description="Build documentation") variant("loop_fuser", default=False, description="Enable loop fusion capability") - depends_on("cmake@3.8:", type="build") - depends_on("cmake@3.9:", type="build", when="+cuda") - depends_on("cmake@3.18:", type="build", when="@0.12.0:") + depends_on("cmake", type="build") + depends_on("cmake@3.23:", type="build", when="@0.13.2:") depends_on("cmake@3.21:", type="build", when="@0.12.0:+rocm") + depends_on("cmake@3.18:", type="build", when="@0.12.0:") + depends_on("cmake@3.14:", type="build", when="@0.10.0:") + depends_on("cmake@3.9:", type="build", when="+cuda") + depends_on("cmake@3.8:", type="build") - depends_on("blt") + depends_on("blt", type="build") depends_on("blt@0.6.2:", type="build", when="@0.13.0:") depends_on("blt@0.6.1:", type="build", when="@0.12.0:") - depends_on("blt@0.4.0:", type="build", when="@0.3.1:") + depends_on("blt@0.5.2:", type="build", when="@0.10.0:") + depends_on("blt@0.4.1:", type="build", when="@0.3.1:") depends_on("blt@:0.3.6", type="build", when="@:0.3.0") conflicts("^blt@:0.3.6", when="+rocm") depends_on("camp", when="@:0.11.1") depends_on("umpire") + depends_on("umpire+mpi", when="+mpi") + depends_on("umpire@2024.07.0:", when="@0.13.2:") depends_on("umpire@2024.02.1:", when="@0.13.0:") depends_on("umpire@2024.02.0:", when="@0.12.0:") + depends_on("umpire@2022.10.0:", when="@0.10.0:") depends_on("raja") + depends_on("raja@2024.07.0:", when="@0.13.2:") depends_on("raja@2024.02.2:", when="@0.13.1:") depends_on("raja@2024.02.1:", when="@0.13.0:") depends_on("raja@2024.02.0:", when="@0.12.0:") + depends_on("raja@2022.10.5:", when="@0.10.0:") + # TODO: Add an enable_pick variant depends_on("chai+enable_pick+raja") + depends_on("chai@2024.07.0:", when="@0.13.2:") depends_on("chai@2024.02.2:", when="@0.13.1:") depends_on("chai@2024.02.1:", when="@0.13.0:") depends_on("chai@2024.02.0:", when="@0.12.0:") - - # pass on +cuda variants - # WARNING: this package currently only supports an internal cub - # package. This will cause a race condition if compiled with another - # package that uses cub. TODO: have all packages point to the same external - # cub package. - depends_on("cub", when="+cuda") - depends_on("camp+cuda", when="+cuda") - depends_on("umpire+cuda~shared", when="+cuda") - depends_on("raja+cuda~openmp", when="+cuda") - depends_on("chai+cuda~shared", when="+cuda") - - # variants +rocm and amdgpu_targets are not automatically passed to - # dependencies, so do it manually. - depends_on("camp+rocm", when="+rocm") - depends_on("umpire+rocm", when="+rocm") - depends_on("raja+rocm~openmp", when="+rocm") - depends_on("chai+rocm", when="+rocm") - for val in ROCmPackage.amdgpu_targets: - depends_on("camp amdgpu_target=%s" % val, when="amdgpu_target=%s" % val) - depends_on("umpire amdgpu_target=%s" % val, when="amdgpu_target=%s" % val) - depends_on("raja amdgpu_target=%s" % val, when="amdgpu_target=%s" % val) - depends_on("chai amdgpu_target=%s" % val, when="amdgpu_target=%s" % val) + depends_on("chai@2022.10.0:", when="@0.10.0:") conflicts("+openmp", when="+rocm") conflicts("+openmp", when="+cuda") + conflicts("~tests", when="+benchmarks") - def cmake_args(self): - spec = self.spec - from_variant = self.define_from_variant + with when("+openmp"): + depends_on("umpire+openmp") + depends_on("raja+openmp") + depends_on("chai+openmp") - options = [] - options.append("-DBLT_SOURCE_DIR={0}".format(spec["blt"].prefix)) + with when("+cuda"): + # WARNING: this package currently only supports an internal cub + # package. This will cause a race condition if compiled with another + # package that uses cub. TODO: have all packages point to the same external + # cub package. + depends_on("cub") - if spec.satisfies("+cuda"): - options.extend( - [ - "-DENABLE_CUDA=ON", - "-DCUDA_TOOLKIT_ROOT_DIR=" + spec["cuda"].prefix, - "-DNVTOOLSEXT_DIR=" + spec["cuda"].prefix, - "-DCUB_DIR=" + spec["cub"].prefix, - ] + depends_on("umpire+cuda") + depends_on("raja+cuda") + depends_on("chai+cuda") + + for sm_ in CudaPackage.cuda_arch_values: + depends_on("umpire+cuda cuda_arch={0}".format(sm_), when="cuda_arch={0}".format(sm_)) + depends_on("raja+cuda cuda_arch={0}".format(sm_), when="cuda_arch={0}".format(sm_)) + depends_on("chai+cuda cuda_arch={0}".format(sm_), when="cuda_arch={0}".format(sm_)) + + with when("+rocm"): + depends_on("umpire+rocm") + depends_on("raja+rocm") + depends_on("chai+rocm") + + for arch_ in ROCmPackage.amdgpu_targets: + depends_on( + "umpire+rocm amdgpu_target={0}".format(arch_), + when="amdgpu_target={0}".format(arch_), + ) + depends_on( + "raja+rocm amdgpu_target={0}".format(arch_), when="amdgpu_target={0}".format(arch_) + ) + depends_on( + "chai+rocm amdgpu_target={0}".format(arch_), when="amdgpu_target={0}".format(arch_) ) - if not spec.satisfies("cuda_arch=none"): - cuda_arch = spec.variants["cuda_arch"].value - # Please note that within care, CUDA_ARCH is assigned to -code - # and likewise CUDA_CODE is assigned to -arch, so these are - # intentionally flipped here. - options.append("-DCUDA_ARCH=sm_{0}".format(cuda_arch[0])) - options.append("-DCUDA_CODE=compute_{0}".format(cuda_arch[0])) - else: - options.append("-DENABLE_CUDA=OFF") + def _get_sys_type(self, spec): + sys_type = spec.architecture + if "SYS_TYPE" in env: + sys_type = env["SYS_TYPE"] + return sys_type + + @property + def cache_name(self): + hostname = socket.gethostname() + + if "SYS_TYPE" in env: + hostname = hostname.rstrip("1234567890") + return "{0}-{1}-{2}@{3}-{4}.cmake".format( + hostname, + self._get_sys_type(self.spec), + self.spec.compiler.name, + self.spec.compiler.version, + self.spec.dag_hash(8), + ) + + def initconfig_compiler_entries(self): + spec = self.spec + compiler = self.compiler + entries = super().initconfig_compiler_entries() if spec.satisfies("+rocm"): - options.extend(["-DENABLE_HIP=ON", "-DHIP_ROOT_DIR={0}".format(spec["hip"].prefix)]) + entries.insert(0, cmake_cache_path("CMAKE_CXX_COMPILER", spec["hip"].hipcc)) + + llnl_link_helpers(entries, spec, compiler) + + return entries + + def initconfig_hardware_entries(self): + spec = self.spec + entries = super().initconfig_hardware_entries() + + entries.append(cmake_cache_option("ENABLE_OPENMP", spec.satisfies("+openmp"))) + + if spec.satisfies("+cuda"): + entries.append(cmake_cache_option("ENABLE_CUDA", True)) + entries.append(cmake_cache_option("CUDA_SEPARABLE_COMPILATION", True)) + entries.append(cmake_cache_string("NVTOOLSEXT_DIR", spec["cuda"].prefix)) + entries.append(cmake_cache_string("CUB_DIR", spec["cub"].prefix)) + else: + entries.append(cmake_cache_option("ENABLE_CUDA", False)) + if spec.satisfies("+rocm"): + entries.append(cmake_cache_option("ENABLE_HIP", True)) archs = self.spec.variants["amdgpu_target"].value if archs != "none": arch_str = ",".join(archs) - options.append("-DHIP_HIPCC_FLAGS=--amdgpu-target={0}".format(arch_str)) + entries.append( + cmake_cache_string("HIP_HIPCC_FLAGS", "--amdgpu-target={0}".format(arch_str)) + ) else: - options.append("-DENABLE_HIP=OFF") - - options.extend( - [ - from_variant("CARE_ENABLE_IMPLICIT_CONVERSIONS", "implicit_conversions"), - from_variant("CARE_ENABLE_LOOP_FUSER", "loop_fuser"), - self.define("CAMP_DIR", spec["camp"].prefix.share.camp.cmake), - self.define("UMPIRE_DIR", spec["umpire"].prefix.share.umpire.cmake), - self.define("RAJA_DIR", spec["raja"].prefix.share.raja.cmake), - self.define("CHAI_DIR", spec["chai"].prefix.share.chai.cmake), - from_variant("CARE_ENABLE_TESTS", "tests"), - ] - ) + entries.append(cmake_cache_option("ENABLE_HIP", False)) + + return entries + + def initconfig_mpi_entries(self): + spec = self.spec + entries = super(Care, self).initconfig_mpi_entries() + entries.append(cmake_cache_option("ENABLE_MPI", spec.satisfies("+mpi"))) + + return entries + + def initconfig_package_entries(self): + spec = self.spec + entries = [] + + # TPL locations + entries.append("#------------------{0}".format("-" * 60)) + entries.append("# TPLs") + entries.append("#------------------{0}\n".format("-" * 60)) + + entries.append(cmake_cache_path("BLT_SOURCE_DIR", spec["blt"].prefix)) + entries.append(cmake_cache_path("CAMP_DIR", spec["camp"].prefix)) + entries.append(cmake_cache_path("UMPIRE_DIR", spec["umpire"].prefix)) + entries.append(cmake_cache_path("RAJA_DIR", spec["raja"].prefix)) + entries.append(cmake_cache_path("CHAI_DIR", spec["chai"].prefix)) + + # Build options + entries.append("#------------------{0}".format("-" * 60)) + entries.append("# Build Options") + entries.append("#------------------{0}\n".format("-" * 60)) + + entries.append(cmake_cache_string("CMAKE_BUILD_TYPE", spec.variants["build_type"].value)) + + entries.append(cmake_cache_option("ENABLE_TESTS", spec.satisfies("+tests"))) + entries.append(cmake_cache_option("CARE_ENABLE_TESTS", spec.satisfies("+tests"))) # For tests to work, we also need BLT_ENABLE_TESTS to be on. # This will take care of the gtest dependency. CARE developers should # consider consolidating these flags in the future. - options.append(from_variant("BLT_ENABLE_TESTS", "tests")) + entries.append(cmake_cache_option("BLT_ENABLE_TESTS", spec.satisfies("+tests"))) # There are both CARE_ENABLE_* and ENABLE_* variables in here because # one controls the BLT infrastructure and the other controls the CARE # infrastructure. The goal is to just be able to use the CARE_ENABLE_* # variables, but CARE isn't set up correctly for that yet. - options.append(from_variant("ENABLE_BENCHMARKS", "benchmarks")) - options.append(from_variant("CARE_ENABLE_BENCHMARKS", "benchmarks")) + entries.append(cmake_cache_option("ENABLE_BENCHMARKS", spec.satisfies("+benchmarks"))) + entries.append(cmake_cache_option("CARE_ENABLE_BENCHMARKS", spec.satisfies("+benchmarks"))) + + entries.append(cmake_cache_option("ENABLE_EXAMPLES", spec.satisfies("+examples"))) + entries.append(cmake_cache_option("CARE_ENABLE_EXAMPLES", spec.satisfies("+examples"))) - options.append(from_variant("ENABLE_EXAMPLES", "examples")) - options.append(from_variant("CARE_ENABLE_EXAMPLES", "examples")) + entries.append(cmake_cache_option("ENABLE_DOCS", spec.satisfies("+docs"))) + entries.append(cmake_cache_option("CARE_ENABLE_DOCS", spec.satisfies("+docs"))) - options.append(from_variant("ENABLE_DOCS", "docs")) - options.append(from_variant("CARE_ENABLE_DOCS", "docs")) + entries.append( + cmake_cache_option( + "CARE_ENABLE_IMPLICIT_CONVERSIONS", spec.satisfies("+implicit_conversions") + ) + ) - return options + entries.append(cmake_cache_option("CARE_ENABLE_LOOP_FUSER", spec.satisfies("+loop_fuser"))) + + return entries + + def cmake_args(self): + return [] diff --git a/var/spack/repos/builtin/packages/casacore-measures/package.py b/var/spack/repos/builtin/packages/casacore-measures/package.py new file mode 100644 index 00000000000000..fac747fa155edf --- /dev/null +++ b/var/spack/repos/builtin/packages/casacore-measures/package.py @@ -0,0 +1,29 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +from spack.package import * + + +class CasacoreMeasures(Package): + """Install casacore measures tables, and a tool to maintain them.""" + + homepage = "https://gitlab.com/dsa-2000/rcp/casacore-measures" + url = "https://gitlab.com/dsa-2000/rcp/casacore-measures/-/archive/v1.0.0/casacore-measures-v1.0.0.tar.gz" + git = "https://gitlab.com/dsa-2000/rcp/casacore-measures.git" + + maintainers("mpokorny") + + license("AGPL-3.0-or-later", checked_by="mpokorny") + + version("main", branch="main") + version("1.0.0", sha256="2bcd891bc0bd67749d93ec5b0fe92d8c1cbb73253465dd0410a3ab5493b3cee5") + + depends_on("wget", type=("build", "run")) + + def install(self, spec, prefix): + mkdirp(self.prefix.bin) + install("bin/update_measures", self.prefix.bin) + mkdirp(self.prefix.share.data) + update = Executable(self.prefix.bin.update_measures) + update() diff --git a/var/spack/repos/builtin/packages/catch2/package.py b/var/spack/repos/builtin/packages/catch2/package.py index 045726fa25c256..7886df269788ec 100644 --- a/var/spack/repos/builtin/packages/catch2/package.py +++ b/var/spack/repos/builtin/packages/catch2/package.py @@ -22,6 +22,7 @@ class Catch2(CMakePackage): version("develop", branch="devel") # Releases + version("3.7.1", sha256="c991b247a1a0d7bb9c39aa35faf0fe9e19764213f28ffba3109388e62ee0269c") version("3.6.0", sha256="485932259a75c7c6b72d4b874242c489ea5155d17efa345eb8cc72159f49f356") version("3.5.4", sha256="b7754b711242c167d8f60b890695347f90a1ebc95949a045385114165d606dbb") version("3.4.0", sha256="122928b814b75717316c71af69bd2b43387643ba076a6ec16e7882bfb2dfacbb") diff --git a/var/spack/repos/builtin/packages/cbindgen/package.py b/var/spack/repos/builtin/packages/cbindgen/package.py new file mode 100644 index 00000000000000..62571e30aeb6d8 --- /dev/null +++ b/var/spack/repos/builtin/packages/cbindgen/package.py @@ -0,0 +1,40 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +from spack.package import * + + +class Cbindgen(CargoPackage): + """A project for generating C bindings from Rust code.""" + + homepage = "https://github.com/mozilla/cbindgen" + url = "https://github.com/mozilla/cbindgen/archive/refs/tags/v0.26.0.tar.gz" + + license("MPL", checked_by="teaguesterling") + + version("0.26.0", sha256="b45e1a64875b615702a86ac3084ef69ae32926241cd2b687a30c12474be15105") + version("0.25.0", sha256="363ac6317a5788de8f2b0104a472a747883d4b9126fa119c681879509dbdbc28") + version("0.24.3", sha256="5d693ab54acc085b9f2dbafbcf0a1f089737f7e0cb1686fa338c2aaa05dc7705") + version("0.24.2", sha256="87ec3c355d08107b72c7b330c54aa2531eac0db754659a98bd58a93516ec9d4c") + version("0.24.1", sha256="7a7098a7659e8dd166e170ebaf3dcd0a8a30119ef230100ff66041a6b4fc76ba") + version("0.24.0", sha256="5cbbf8195b3e5bcee6044697b07b54e7701f047e40d7c86190be385736734cd7") + version("0.23.0", sha256="d7b82a7a4bfe7fc61c6f7c1b848bf586fef4057c84960739484b4f743bf0bab6") + version("0.22.0", sha256="f129b453df9d84e6d098a446f928961241b2a0edc29f827addca154049dcc434") + version("0.21.0", sha256="c254a68039a85fe17c63781e67d09b0bfabc32446615d7c63cd805052ac5b155") + version("0.20.0", sha256="70f810d2b9e5a2db570431872c26377813fb27a63d817cb16b2d69fa3741d066") + + depends_on("rust@1.70:") + + depends_on("rust-clap@4.3:") + + # The following dependencies need more work for spack but are handled by Cargo + # They are included for reference and as a TODO once the Cargo packaging system + # improves its support for more complex packages. + # depends_on("rust-heck@0.4:") + # depends_on("rust-toml@0.8.8:") + # depends_on("rust-log@0.4:") + # depends_on("rust-serde@1.0.103+derive") + # depends_on("rust-serde-json@1.0:") + # depends_on("rust-proc-macro2@1.0.60") + # depends_on("rust-indexmap@2.1.0:") diff --git a/var/spack/repos/builtin/packages/cbqn/package.py b/var/spack/repos/builtin/packages/cbqn/package.py new file mode 100644 index 00000000000000..7dd69d90d2a64f --- /dev/null +++ b/var/spack/repos/builtin/packages/cbqn/package.py @@ -0,0 +1,62 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class Cbqn(MakefilePackage): + """A BQN implementation in C""" + + # Alternative homepage not specific to this implementation: + # https://mlochbaum.github.io/BQN/index.html + homepage = "https://github.com/dzaima/CBQN" + git = "https://github.com/dzaima/CBQN" + + maintainers("ashermancinelli") + + # Licenses listed in the order they appear in the repo's licensing section + # https://github.com/dzaima/CBQN/tree/master#licensing + license( + "MIT AND Apache-2.0 AND BSL-1.0 AND LGPL-3.0-only AND GPL-3.0-only AND MPL-2.0", + checked_by="ashermancinelli", + ) + + version("master", branch="master") + version("develop", branch="develop") + version("0.7.0", tag="v0.7.0") + + depends_on("c", type="build") + + variant("repl", default=True, description="Enable built-in REPL") + variant("ffi", default=True, description="Enable FFI support") + variant( + "build_type", + values=("o3n", "o3", "o3g", "c", "shared-o3", "debug", "static-bin", "static-lib"), + default="o3", + multi=False, + description="Make target to use.", + ) + + depends_on("cxx", when="+repl", type="build") + depends_on("libffi", when="+ffi") + + def build(self, spec, prefix): + make_args = [] + make_args.append("FFI={0}".format(int(spec.satisfies("+ffi")))) + make_args.append("REPLXX={0}".format(int(spec.satisfies("+repl")))) + + # Makes logs easier to read + make_args.append("notui=1") + + # The build types map directly to the make target + make_args.append(spec.variants["build_type"].value) + + if spec.version not in ("develop", "master"): + make_args.append("version={0}".format(spec.version)) + + make(*make_args) + + def install(self, spec, prefix): + make("PREFIX={0}".format(prefix), "install") diff --git a/var/spack/repos/builtin/packages/cdo/add_algorithm_header.patch b/var/spack/repos/builtin/packages/cdo/add_algorithm_header.patch new file mode 100644 index 00000000000000..2e9e6803ae8689 --- /dev/null +++ b/var/spack/repos/builtin/packages/cdo/add_algorithm_header.patch @@ -0,0 +1,22 @@ +diff --git a/src/cdo_module.cc b/src/cdo_module_patched.cc +index dc408d9..f50c2d3 100644 +--- a/src/cdo_module.cc ++++ b/src/cdo_module_patched.cc +@@ -1,4 +1,5 @@ + #include "cdo_module.h" ++#include + + oper_t::oper_t() : help(default_help) {} + +diff --git a/src/cdo_options.cc b/src/cdo_options_patched.cc +index 465f1f9..0684e78 100644 +--- a/src/cdo_options.cc ++++ b/src/cdo_options_patched.cc +@@ -12,6 +12,7 @@ + #include "cdo_output.h" + + #include ++#include + + namespace cdo + { diff --git a/var/spack/repos/builtin/packages/cdo/add_algorithm_header_222.patch b/var/spack/repos/builtin/packages/cdo/add_algorithm_header_222.patch new file mode 100644 index 00000000000000..319e140ef437ed --- /dev/null +++ b/var/spack/repos/builtin/packages/cdo/add_algorithm_header_222.patch @@ -0,0 +1,23 @@ +diff --git a/src/cdo_options.cc b/src/cdo_options_patched.cc +index 465f1f9..0684e78 100644 +--- a/src/cdo_options.cc ++++ b/src/cdo_options_patched.cc +@@ -12,6 +12,7 @@ + #include "cdo_output.h" + + #include ++#include + + namespace cdo + { +diff -u src/cdo_options.h src/cdo_options_patched.h +--- a/src/cdo_options.h ++++ b/src/cdo_options_patched.h +@@ -3,6 +3,7 @@ + + #include + #include ++#include + + #ifdef HAVE_CONFIG_H + #include "config.h" /* _FILE_OFFSET_BITS influence off_t */ diff --git a/var/spack/repos/builtin/packages/cdo/package.py b/var/spack/repos/builtin/packages/cdo/package.py index 9f6910fa049712..dc4721214e070b 100644 --- a/var/spack/repos/builtin/packages/cdo/package.py +++ b/var/spack/repos/builtin/packages/cdo/package.py @@ -20,6 +20,11 @@ class Cdo(AutotoolsPackage): maintainers("skosukhin", "Try2Code") + version( + "2.4.4", + sha256="49f50bd18dacd585e9518cfd4f55548f692426edfb3b27ddcd1c653eab53d063", + url="https://code.mpimet.mpg.de/attachments/download/29649/cdo-2.4.4.tar.gz", + ) version( "2.4.3", sha256="4a608b70ee1907b45e149ad44033bb47d35b7da96096553193bd362ca9d445eb", @@ -170,6 +175,20 @@ class Cdo(AutotoolsPackage): depends_on("cxx", type="build") # generated depends_on("fortran", type="build") # generated + # patches + # see https://code.mpimet.mpg.de/boards/1/topics/15594 + patch( + "add_algorithm_header.patch", + when="@2.4.0:2.4.2 %gcc@14:", + sha256="0bc20d2fcb14d8e4010d4222297f259eb7b4220effd97555ed3f027e63cf8b30", + ) + patch( + "add_algorithm_header_222.patch", + when="@2.2.2:2.3.0 %gcc@14:", + sha256="db0d9bd32bbee01d914c1dbebd751403e9c918fafd540fd6ecc6a2f27e0900cf", + ) + conflicts("%gcc@14:", when="@:2.2.0", msg="Compilation with gcc@14: requires cdo@2.2.2:") + variant("netcdf", default=True, description="Enable NetCDF support") variant( "grib2", diff --git a/var/spack/repos/builtin/packages/ceed/package.py b/var/spack/repos/builtin/packages/ceed/package.py index fd72aa13019723..d346bb667ed865 100644 --- a/var/spack/repos/builtin/packages/ceed/package.py +++ b/var/spack/repos/builtin/packages/ceed/package.py @@ -201,10 +201,6 @@ class Ceed(BundlePackage, CudaPackage, ROCmPackage): # and +mumps: depends_on("petsc@3.11.1+mpi+hypre+suite-sparse+mumps+double~int64", when="@2.0.0+petsc+mfem") depends_on("hpgmg@0.4+fe", when="@2.0.0+petsc") - # ceed-1.0 - # The mfem petsc examples need the petsc variants +hypre, +suite-sparse, - # and +mumps: - depends_on("hpgmg@a0a5510df23b+fe", when="@1.0.0+petsc") # MAGMA # ceed 5.0 @@ -313,8 +309,8 @@ class Ceed(BundlePackage, CudaPackage, ROCmPackage): depends_on("suite-sparse@:5.1.0", when="@2.0.0%gcc@:4.8+mfem+petsc") # ceed-1.0 - depends_on("mfem@3.3.2+mpi+examples+miniapps", when="@1.0.0+mfem~petsc") - depends_on("mfem@3.3.2+mpi+petsc+examples+miniapps", when="@1.0.0+mfem+petsc") + depends_on("mfem@3.3.2+mpi+examples+miniapps", when="@1.0.0+mfem") + depends_on("mfem@3.3.2+mpi+petsc+examples+miniapps", when="@1.0.0+mfem") depends_on("laghos@1.0", when="@1.0.0+mfem") # The next line seems to be necessary because the concretizer somehow # decides that mfem requires 'hypre+internal-superlu' even though the mfem @@ -324,4 +320,4 @@ class Ceed(BundlePackage, CudaPackage, ROCmPackage): depends_on("hypre~internal-superlu", when="@1.0.0+mfem") # If using gcc version <= 4.8 build suite-sparse version <= 5.1.0 - depends_on("suite-sparse@:5.1.0", when="@1.0.0%gcc@:4.8+mfem+petsc") + depends_on("suite-sparse@:5.1.0", when="@1.0.0%gcc@:4.8+mfem") diff --git a/var/spack/repos/builtin/packages/celeritas/package.py b/var/spack/repos/builtin/packages/celeritas/package.py index 729be79cd28bb9..b83a96a9e9c3f4 100644 --- a/var/spack/repos/builtin/packages/celeritas/package.py +++ b/var/spack/repos/builtin/packages/celeritas/package.py @@ -19,6 +19,7 @@ class Celeritas(CMakePackage, CudaPackage, ROCmPackage): license("Apache-2.0") + version("0.5.0", sha256="4a8834224d96fd01897e5872ac109f60d91ef0bd7b63fac05a73dcdb61a5530e") version("0.4.4", sha256="8b5ae63aa2d50c2ecf48d752424e4a33c50c07d9f0f5ca5448246de3286fd836") version("0.4.3", sha256="b4f603dce1dc9c4894ea4c86f6574026ea8536714982e7dc6dff7472c925c892") version("0.4.2", sha256="eeca9705413f5e16e0fb81154e042600c8df125af7049912757feb01d43730e2") @@ -96,7 +97,7 @@ class Celeritas(CMakePackage, CudaPackage, ROCmPackage): variant("openmp", default=False, description="Use OpenMP multithreading") variant("root", default=False, description="Use ROOT I/O") variant("shared", default=True, description="Build shared libraries") - variant("swig", default=False, description="Generate SWIG Python bindings") + variant("swig", default=False, when="@:0.4", description="Generate SWIG Python bindings") variant("vecgeom", default=True, description="Use VecGeom geometry") depends_on("cmake@3.13:", type="build") diff --git a/var/spack/repos/builtin/packages/cgsi-gsoap/package.py b/var/spack/repos/builtin/packages/cgsi-gsoap/package.py new file mode 100644 index 00000000000000..954659e771af65 --- /dev/null +++ b/var/spack/repos/builtin/packages/cgsi-gsoap/package.py @@ -0,0 +1,32 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class CgsiGsoap(CMakePackage): + """Client and server side library to secure gSOAP + using the Globus Security Infrastructure.""" + + homepage = "https://github.com/cern-fts/cgsi-gsoap" + url = "https://github.com/cern-fts/cgsi-gsoap/archive/refs/tags/v1.3.12.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("1.3.12", sha256="ebb141ea7fe6d883ebeca031b4f2e3697895efb8fde55ee214128d5ca37e13e4") + + depends_on("c", type="build") + + depends_on("pkg-config", type="build") + depends_on("gsoap") + depends_on("voms") + depends_on("globus-common") + depends_on("globus-gssapi-gsi") + depends_on("globus-gss-assist") + depends_on("globus-gsi-cert-utils") + depends_on("globus-gsi-credential") + depends_on("globus-openssl-module") diff --git a/var/spack/repos/builtin/packages/chai/package.py b/var/spack/repos/builtin/packages/chai/package.py index 2d408dbc0a2b59..9529daaca59d1e 100644 --- a/var/spack/repos/builtin/packages/chai/package.py +++ b/var/spack/repos/builtin/packages/chai/package.py @@ -19,11 +19,17 @@ class Chai(CachedCMakePackage, CudaPackage, ROCmPackage): git = "https://github.com/LLNL/CHAI.git" tags = ["ecp", "e4s", "radiuss"] - maintainers("davidbeckingsale", "adayton1") + maintainers("davidbeckingsale", "adayton1", "adrienbernede") license("BSD-3-Clause") version("develop", branch="develop", submodules=False) + version( + "2024.07.0", + tag="v2024.07.0", + commit="df7741f1dbbdc5fff5f7d626151fdf1904e62b19", + submodules=False, + ) version( "2024.02.2", tag="v2024.02.2", @@ -119,13 +125,15 @@ class Chai(CachedCMakePackage, CudaPackage, ROCmPackage): description="Tests to run", ) - depends_on("cmake@3.8:", type="build") + depends_on("cmake", type="build") + depends_on("cmake@3.23:", type="build", when="@2024.07.0:") + depends_on("cmake@3.14:", type="build", when="@2022.03.0:2024.2") depends_on("cmake@3.9:", type="build", when="+cuda") - depends_on("cmake@3.14:", type="build", when="@2022.03.0:") + depends_on("cmake@3.8:", type="build") - depends_on("blt") + depends_on("blt", type="build") depends_on("blt@0.6.2:", type="build", when="@2024.02.1:") - depends_on("blt@0.6.1:", type="build", when="@2024.02.0:") + depends_on("blt@0.6.1", type="build", when="@2024.02.0") depends_on("blt@0.5.3", type="build", when="@2023.06.0") depends_on("blt@0.5.2:0.5.3", type="build", when="@2022.10.0") depends_on("blt@0.5.0:0.5.3", type="build", when="@2022.03.0") @@ -135,8 +143,9 @@ class Chai(CachedCMakePackage, CudaPackage, ROCmPackage): conflicts("^blt@:0.3.6", when="+rocm") depends_on("umpire") - depends_on("umpire@2024.02.1:", when="@2024.02.1:") - depends_on("umpire@2024.02.0:", when="@2024.02.0:") + depends_on("umpire@2024.07.0:", when="@2024.07.0:") + depends_on("umpire@2024.02.1", when="@2024.02.1") + depends_on("umpire@2024.02.0", when="@2024.02.0") depends_on("umpire@2023.06.0", when="@2023.06.0") depends_on("umpire@2022.10.0:2023.06.0", when="@2022.10.0") depends_on("umpire@2022.03.0:2023.06.0", when="@2022.03.0") @@ -149,6 +158,8 @@ class Chai(CachedCMakePackage, CudaPackage, ROCmPackage): depends_on("umpire+cuda") for sm_ in CudaPackage.cuda_arch_values: depends_on("umpire+cuda cuda_arch={0}".format(sm_), when="cuda_arch={0}".format(sm_)) + with when("@2024.02.0:"): + depends_on("umpire~fmt_header_only") with when("+rocm"): depends_on("umpire+rocm") @@ -160,15 +171,16 @@ class Chai(CachedCMakePackage, CudaPackage, ROCmPackage): with when("+raja"): depends_on("raja~openmp", when="~openmp") depends_on("raja+openmp", when="+openmp") - depends_on("raja@2024.02.2:", when="@2024.02.2:") - depends_on("raja@2024.02.1:", when="@2024.02.1:") - depends_on("raja@2024.02.0:", when="@2024.02.0:") + depends_on("raja@2024.07.0:", when="@2024.07.0:") + depends_on("raja@2024.02.2", when="@2024.02.2") + depends_on("raja@2024.02.1", when="@2024.02.1") + depends_on("raja@2024.02.0", when="@2024.02.0") depends_on("raja@2023.06.0", when="@2023.06.0") depends_on("raja@2022.10.0:2023.06.0", when="@2022.10.0") depends_on("raja@2022.03.0:2023.06.0", when="@2022.03.0") - depends_on("raja@0.12.0", when="@2.2.0:2.2.2") - depends_on("raja@0.13.0", when="@2.3.0") depends_on("raja@0.14.0", when="@2.4.0") + depends_on("raja@0.13.0", when="@2.3.0") + depends_on("raja@0.12.0", when="@2.2.0:2.2.2") with when("+cuda"): depends_on("raja+cuda") @@ -229,7 +241,6 @@ def initconfig_hardware_entries(self): if spec.satisfies("+separable_compilation"): entries.append(cmake_cache_option("CMAKE_CUDA_SEPARABLE_COMPILATION", True)) entries.append(cmake_cache_option("CUDA_SEPARABLE_COMPILATION", True)) - else: entries.append(cmake_cache_option("ENABLE_CUDA", False)) @@ -244,7 +255,7 @@ def initconfig_mpi_entries(self): spec = self.spec entries = super(Chai, self).initconfig_mpi_entries() - entries.append(cmake_cache_option("ENABLE_MPI", "+mpi" in spec)) + entries.append(cmake_cache_option("ENABLE_MPI", spec.satisfies("+mpi"))) return entries @@ -259,10 +270,17 @@ def initconfig_package_entries(self): entries.append("# TPLs") entries.append("#------------------{0}\n".format("-" * 60)) + # - BLT entries.append(cmake_cache_path("BLT_SOURCE_DIR", spec["blt"].prefix)) + + # - RAJA if spec.satisfies("+raja"): entries.append(cmake_cache_option("{}ENABLE_RAJA_PLUGIN".format(option_prefix), True)) entries.append(cmake_cache_path("RAJA_DIR", spec["raja"].prefix)) + else: + entries.append(cmake_cache_option("{}ENABLE_RAJA_PLUGIN".format(option_prefix), False)) + + # - Umpire entries.append(cmake_cache_path("umpire_DIR", spec["umpire"].prefix)) # Build options @@ -270,24 +288,25 @@ def initconfig_package_entries(self): entries.append("# Build Options") entries.append("#------------------{0}\n".format("-" * 60)) - # Build options entries.append(cmake_cache_string("CMAKE_BUILD_TYPE", spec.variants["build_type"].value)) - entries.append(cmake_cache_option("BUILD_SHARED_LIBS", "+shared" in spec)) + entries.append(cmake_cache_option("BUILD_SHARED_LIBS", spec.satisfies("+shared"))) # Generic options that have a prefixed equivalent in CHAI CMake - entries.append(cmake_cache_option("ENABLE_OPENMP", "+openmp" in spec)) - entries.append(cmake_cache_option("ENABLE_EXAMPLES", "+examples" in spec)) + entries.append(cmake_cache_option("ENABLE_OPENMP", spec.satisfies("+openmp"))) + entries.append(cmake_cache_option("ENABLE_EXAMPLES", spec.satisfies("+examples"))) entries.append(cmake_cache_option("ENABLE_DOCS", False)) if spec.satisfies("tests=benchmarks"): # BLT requires ENABLE_TESTS=True to enable benchmarks entries.append(cmake_cache_option("ENABLE_BENCHMARKS", True)) entries.append(cmake_cache_option("ENABLE_TESTS", True)) else: - entries.append(cmake_cache_option("ENABLE_TESTS", "tests=none" not in spec)) + entries.append(cmake_cache_option("ENABLE_TESTS", not spec.satisfies("tests=none"))) # Prefixed options that used to be name without one entries.append( - cmake_cache_option("{}ENABLE_PICK".format(option_prefix), "+enable_pick" in spec) + cmake_cache_option( + "{}ENABLE_PICK".format(option_prefix), spec.satisfies("+enable_pick") + ) ) return entries diff --git a/var/spack/repos/builtin/packages/chapel/package.py b/var/spack/repos/builtin/packages/chapel/package.py index 773b4366c803c7..0538221e35e417 100644 --- a/var/spack/repos/builtin/packages/chapel/package.py +++ b/var/spack/repos/builtin/packages/chapel/package.py @@ -36,7 +36,7 @@ class Chapel(AutotoolsPackage, CudaPackage, ROCmPackage): homepage = "https://chapel-lang.org/" - url = "https://github.com/chapel-lang/chapel/archive/refs/tags/2.1.0.tar.gz" + url = "https://github.com/chapel-lang/chapel/archive/refs/tags/2.2.0.tar.gz" git = "https://github.com/chapel-lang/chapel.git" test_requires_compiler = True @@ -48,11 +48,14 @@ class Chapel(AutotoolsPackage, CudaPackage, ROCmPackage): # TODO: add chapel-project github account maintainers("arezaii", "bonachea") + tags = ["e4s"] + # See https://spdx.org/licenses/ for a list. license("Apache-2.0") version("main", branch="main") + version("2.2.0", sha256="9b0ce16ed0b1c777647c3aa852d8d8cacea2c3d8a952548a238f07c0f357a0f9") version("2.1.0", sha256="8e164d9a9e705e6b816857e84833b0922ce0bde6a36a9f3a29734830aac168ef") version("2.0.1", sha256="47e1f3789478ea870bd4ecdf52acbe469d171b89b663309325431f3da7c75008") version("2.0.0", sha256="a8cab99fd034c7b7229be8d4626ec95cf02072646fb148c74b4f48c460c6059c") @@ -435,15 +438,21 @@ class Chapel(AutotoolsPackage, CudaPackage, ROCmPackage): conflicts("platform=windows") # Support for windows is through WSL only + # Ensure GPU support is Sticky: never allow the concretizer to choose this + variant("rocm", default=False, sticky=True, description="Enable AMD ROCm GPU support") + variant("cuda", default=False, sticky=True, description="Enable Nvidia CUDA GPU support") + conflicts("+rocm", when="+cuda", msg="Chapel must be built with either CUDA or ROCm, not both") - conflicts( - "+rocm", when="@:1.99.99", msg="ROCm support in spack requires Chapel 2.0.0 or later" - ) + conflicts("+rocm", when="@:1", msg="ROCm support in spack requires Chapel 2.0.0 or later") # Chapel restricts the allowable ROCm versions - with when("+rocm"): + with when("@2:2.1 +rocm"): depends_on("hsa-rocr-dev@4:5.4") depends_on("hip@4:5.4") - depends_on("llvm-amdgpu@4:5.4") + with when("@2.2: +rocm"): + depends_on("hsa-rocr-dev@4:5.4,6.0:6.2") + depends_on("hip@4:5.4,6.0:6.2") + depends_on("llvm-amdgpu@4:5.4", when="+rocm llvm=spack") + requires("llvm=bundled", when="+rocm ^hip@6.0:6.2", msg="ROCm 6 support requires llvm=bundled") conflicts( "comm_substrate=unset", @@ -463,7 +472,7 @@ class Chapel(AutotoolsPackage, CudaPackage, ROCmPackage): conflicts( "^python@3.12:", - when="@:2.0.99", + when="@:2.0", msg="Chapel versions prior to 2.1.0 may produce SyntaxWarnings with Python >= 3.12", ) @@ -508,7 +517,7 @@ class Chapel(AutotoolsPackage, CudaPackage, ROCmPackage): # with an error about missing plugin-api.h depends_on("binutils+gold+ld+plugins+headers", when="llvm=bundled") - depends_on("m4") + depends_on("m4", when="gmp=bundled") # Runtime dependencies: # Note here "run" is run of the Chapel compiler built by this package, @@ -566,12 +575,18 @@ def setup_chpl_platform(self, env): def setup_chpl_compilers(self, env): env.set("CHPL_HOST_COMPILER", self.compiler_map[self.spec.compiler.name]) - env.set("CHPL_TARGET_COMPILER", self.compiler_map[self.spec.compiler.name]) + if ( + self.spec.satisfies("+rocm") + or self.spec.satisfies("+cuda") + or self.spec.satisfies("llvm=spack") + ): + env.set("CHPL_TARGET_COMPILER", "llvm") + else: + env.set("CHPL_TARGET_COMPILER", self.compiler_map[self.spec.compiler.name]) # Undo spack compiler wrappers: # the C/C++ compilers must work post-install - if self.spec.satisfies("+rocm"): - env.set("CHPL_TARGET_COMPILER", "llvm") + if self.spec.satisfies("+rocm llvm=spack"): env.set( "CHPL_LLVM_CONFIG", join_path(self.spec["llvm-amdgpu"].prefix, "bin", "llvm-config"), @@ -585,15 +600,16 @@ def setup_chpl_compilers(self, env): env.set("CHPL_HOST_CXX", real_cxx) elif self.spec.satisfies("llvm=spack"): - env.set("CHPL_TARGET_COMPILER", "llvm") env.set("CHPL_LLVM_CONFIG", join_path(self.spec["llvm"].prefix, "bin", "llvm-config")) real_cc = join_path(self.spec["llvm"].prefix, "bin", "clang") real_cxx = join_path(self.spec["llvm"].prefix, "bin", "clang++") else: real_cc = self.compiler.cc real_cxx = self.compiler.cxx - env.set("CHPL_TARGET_CC", real_cc) - env.set("CHPL_TARGET_CXX", real_cxx) + + if self.spec.satisfies("llvm=spack") or self.spec.satisfies("llvm=none"): + env.set("CHPL_TARGET_CC", real_cc) + env.set("CHPL_TARGET_CXX", real_cxx) def setup_chpl_comm(self, env, spec): env.set("CHPL_COMM", spec.variants["comm"].value) @@ -609,7 +625,7 @@ def setup_gasnet(self): symlink(self.spec["gasnet"].prefix.src, dst) def setup_if_not_unset(self, env, var, value): - if value != "unset": + if value != "unset" and var in self.chpl_env_vars: if value == "spack": value = "system" env.set(var, value) @@ -618,7 +634,7 @@ def prepend_cpath_include(self, env, prefix): if not is_system_path(prefix): env.prepend_path("CPATH", prefix.include) - def set_lib_path(self, env, prefix): + def update_lib_path(self, env, prefix): if not is_system_path(prefix): env.prepend_path("LD_LIBRARY_PATH", prefix.lib) env.prepend_path("LIBRARY_PATH", prefix.lib) @@ -629,7 +645,7 @@ def setup_env_vars(self, env): # variants that appear unused by Spack typically correspond directly to # a CHPL_ variable which will be used by the Chapel build system for v in self.spec.variants.keys(): - self.setup_if_not_unset(env, "CHPL_" + v.upper(), self.spec.variants[v].value) + self.setup_if_not_unset(env, "CHPL_" + v.upper(), str(self.spec.variants[v].value)) self.setup_chpl_compilers(env) self.setup_chpl_platform(env) @@ -657,10 +673,10 @@ def setup_env_vars(self, env): # TODO: why must we add to CPATH to find gmp.h # TODO: why must we add to LIBRARY_PATH to find lgmp self.prepend_cpath_include(env, self.spec["gmp"].prefix) - self.set_lib_path(env, self.spec["gmp"].prefix) + self.update_lib_path(env, self.spec["gmp"].prefix) if self.spec.variants["hwloc"].value == "spack": - self.set_lib_path(env, self.spec["hwloc"].prefix) + self.update_lib_path(env, self.spec["hwloc"].prefix) # Need this for the test env, where it does not appear automatic: env.prepend_path("PKG_CONFIG_PATH", self.spec["libpciaccess"].prefix.lib.pkgconfig) @@ -673,22 +689,23 @@ def setup_env_vars(self, env): if self.spec.satisfies("+yaml"): self.prepend_cpath_include(env, self.spec["libyaml"].prefix) # could not compile test/library/packages/Yaml/writeAndParse.chpl without this - self.set_lib_path(env, self.spec["libyaml"].prefix) + self.update_lib_path(env, self.spec["libyaml"].prefix) if self.spec.satisfies("+zmq"): self.prepend_cpath_include(env, self.spec["libzmq"].prefix) # could not compile test/library/packages/ZMQ/hello.chpl without this - self.set_lib_path(env, self.spec["libzmq"].prefix) + self.update_lib_path(env, self.spec["libzmq"].prefix) env.prepend_path("PKG_CONFIG_PATH", self.spec["libsodium"].prefix.lib.pkgconfig) if self.spec.satisfies("+curl"): self.prepend_cpath_include(env, self.spec["curl"].prefix) # could not compile test/library/packages/Curl/check-http.chpl without this - self.set_lib_path(env, self.spec["curl"].prefix) + self.update_lib_path(env, self.spec["curl"].prefix) if self.spec.satisfies("+cuda"): # TODO: why must we add to LD_LIBRARY_PATH to find libcudart? env.prepend_path("LD_LIBRARY_PATH", self.spec["cuda"].prefix.lib64) + env.set("CHPL_CUDA_PATH", self.spec["cuda"].prefix) env.set("CHPL_LOCALE_MODEL", "gpu") env.set("CHPL_GPU", "nvidia") @@ -697,9 +714,9 @@ def setup_env_vars(self, env): env.set("CHPL_GPU", "amd") env.set("CHPL_GPU_ARCH", self.spec.variants["amdgpu_target"].value[0]) self.prepend_cpath_include(env, self.spec["hip"].prefix) - env.set("CHPL_ROCM_PATH", self.spec["llvm-amdgpu"].prefix) - self.set_lib_path(env, self.spec["hip"].prefix) - self.set_lib_path(env, self.spec["hsa-rocr-dev"].prefix) + env.set("CHPL_ROCM_PATH", self.spec["hip"].prefix) + self.update_lib_path(env, self.spec["hip"].prefix) + self.update_lib_path(env, self.spec["hsa-rocr-dev"].prefix) self.setup_chpl_comm(env, self.spec) def setup_build_environment(self, env): @@ -716,7 +733,7 @@ def setup_run_environment(self, env): @llnl.util.lang.memoized def _output_version_long(self): if str(self.spec.version).lower() == "main": - return "2.2.0" + return "2.3.0" spec_vers_str = str(self.spec.version.up_to(3)) return spec_vers_str @@ -724,7 +741,7 @@ def _output_version_long(self): @llnl.util.lang.memoized def _output_version_short(self): if str(self.spec.version).lower() == "main": - return "2.2" + return "2.3" spec_vers_str = str(self.spec.version.up_to(2)) return spec_vers_str diff --git a/var/spack/repos/builtin/packages/charliecloud/package.py b/var/spack/repos/builtin/packages/charliecloud/package.py index 2f4497ac18f295..3d2b4dabc3a941 100644 --- a/var/spack/repos/builtin/packages/charliecloud/package.py +++ b/var/spack/repos/builtin/packages/charliecloud/package.py @@ -150,9 +150,9 @@ class Charliecloud(AutotoolsPackage): with when("+squashfuse"): depends_on("libfuse@3:", type=("build", "run", "link"), when="@0.32:") depends_on("pkgconfig", type="build", when="@0.37:") - depends_on("squashfuse@0.1.105:0.2.0,0.4.0:", type="build", when="@0.36:") - depends_on("squashfuse@0.1.105:0.2.0,0.4.0", type="build", when="@0.35") - depends_on("squashfuse@0.1.105", type="build", when="@0.32:0.34") + depends_on("squashfuse@0.1.105:0.2.0,0.4.0:", type="link", when="@0.36:") + depends_on("squashfuse@0.1.105:0.2.0,0.4.0", type="link", when="@0.35") + depends_on("squashfuse@0.1.105", type="link", when="@0.32:0.34") def autoreconf(self, spec, prefix): which("bash")("autogen.sh") diff --git a/var/spack/repos/builtin/packages/charmpp/package.py b/var/spack/repos/builtin/packages/charmpp/package.py index abed322050703d..02ce131961d1ab 100644 --- a/var/spack/repos/builtin/packages/charmpp/package.py +++ b/var/spack/repos/builtin/packages/charmpp/package.py @@ -374,6 +374,13 @@ def install(self, spec, prefix): if spec.satisfies("+tracing"): options.append("--enable-tracing") + # charmpp build was failing with clang based compilers for -DNETWORK=mpi as discussed in + # https://github.com/charmplusplus/charm/issues/3645 + # Fix was suggested in https://github.com/charmplusplus/charm/pull/3646 and the same has + # been implemented in v8.0.0 + if self.spec.satisfies("@8.0.0: %aocc"): + options.append("--disable-fortran") + # Call "make" via the build script # Note: This builds Charm++ in the "tmp" subdirectory of the # install directory. Maybe we could set up a symbolic link diff --git a/var/spack/repos/builtin/packages/chatterbug/package.py b/var/spack/repos/builtin/packages/chatterbug/package.py index d8d7c0351ecd9a..2ce3a2c7f995ea 100644 --- a/var/spack/repos/builtin/packages/chatterbug/package.py +++ b/var/spack/repos/builtin/packages/chatterbug/package.py @@ -15,8 +15,8 @@ class Chatterbug(MakefilePackage): tags = ["proxy-app"] - homepage = "https://chatterbug.readthedocs.io" - git = "https://github.com/LLNL/chatterbug.git" + homepage = "https://github.com/hpcgroup/chatterbug" + git = "https://github.com/hpcgroup/chatterbug.git" license("MIT") diff --git a/var/spack/repos/builtin/packages/clhep/package.py b/var/spack/repos/builtin/packages/clhep/package.py index 66fe9753d915bf..6f35f788b67a7c 100644 --- a/var/spack/repos/builtin/packages/clhep/package.py +++ b/var/spack/repos/builtin/packages/clhep/package.py @@ -103,10 +103,7 @@ def patch(self): def cmake_args(self): cmake_args = [ - "-DCLHEP_BUILD_CXXSTD=-std=c++{0}".format(self.spec.variants["cxxstd"].value), - "-DCMAKE_CXX_COMPILER={0}".format(self.compiler.cxx_names[0]), - "-DCMAKE_C_COMPILER={0}".format(self.compiler.cc_names[0]), - "-DCMAKE_Fortran_COMPILER={0}".format(self.compiler.f77_names[0]), + "-DCLHEP_BUILD_CXXSTD=-std=c++{0}".format(self.spec.variants["cxxstd"].value) ] if not ("build_type=Debug" in self.spec): diff --git a/var/spack/repos/builtin/packages/clinfo/package.py b/var/spack/repos/builtin/packages/clinfo/package.py index 9fc026a1f07a4c..08087611bd32e1 100644 --- a/var/spack/repos/builtin/packages/clinfo/package.py +++ b/var/spack/repos/builtin/packages/clinfo/package.py @@ -18,6 +18,9 @@ class Clinfo(MakefilePackage): license("CC0-1.0") + version( + "3.0.23.01.25", sha256="6dcdada6c115873db78c7ffc62b9fc1ee7a2d08854a3bccea396df312e7331e3" + ) version( "3.0.21.02.21", sha256="e52f5c374a10364999d57a1be30219b47fb0b4f090e418f2ca19a0c037c1e694" ) diff --git a/var/spack/repos/builtin/packages/clingo/package.py b/var/spack/repos/builtin/packages/clingo/package.py index 10fdb2359135c4..73ff2b17696297 100644 --- a/var/spack/repos/builtin/packages/clingo/package.py +++ b/var/spack/repos/builtin/packages/clingo/package.py @@ -76,9 +76,18 @@ class Clingo(CMakePackage): patch("clingo_msc_1938_native_handle.patch", when="@:5.7.0 %msvc@19.38:") def patch(self): + # In bootstrap/prototypes/*.json we don't want to have specs that work for any python + # version, so this conditional patch lives here instead of being its own directive. + if self.spec.satisfies("@spack,5.3:5.4 ^python@3.9:"): + filter_file( + "if (!PyEval_ThreadsInitialized()) { PyEval_InitThreads(); }", + "", + "libpyclingo/pyclingo.cc", + string=True, + ) # Doxygen is optional but can't be disabled with a -D, so patch # it out if it's really supposed to be disabled - if "+docs" not in self.spec: + if self.spec.satisfies("~docs"): filter_file( r"find_package\(Doxygen\)", 'message("Doxygen disabled for Spack build.")', diff --git a/var/spack/repos/builtin/packages/cmake/package.py b/var/spack/repos/builtin/packages/cmake/package.py index c26593d12c3894..4e6dbc6c0de4f8 100644 --- a/var/spack/repos/builtin/packages/cmake/package.py +++ b/var/spack/repos/builtin/packages/cmake/package.py @@ -4,10 +4,12 @@ # SPDX-License-Identifier: (Apache-2.0 OR MIT) import os +import pathlib import re import sys import spack.build_environment +from spack.build_systems.cmake import get_cmake_prefix_path from spack.package import * @@ -29,6 +31,9 @@ class Cmake(Package): license("BSD-3-Clause") version("master", branch="master") + version("3.30.5", sha256="9f55e1a40508f2f29b7e065fa08c29f82c402fa0402da839fffe64a25755a86d") + version("3.30.4", sha256="c759c97274f1e7aaaafcb1f0d261f9de9bf3a5d6ecb7e2df616324a46fe704b2") + version("3.30.3", sha256="6d5de15b6715091df7f5441007425264bdd477809f80333fdf95f846aaff88e4") version("3.30.2", sha256="46074c781eccebc433e98f0bbfa265ca3fd4381f245ca3b140e7711531d60db2") version("3.30.1", sha256="df9b3c53e3ce84c3c1b7c253e5ceff7d8d1f084ff0673d048f260e04ccb346e1") version("3.30.0", sha256="157e5be6055c154c34f580795fe5832f260246506d32954a971300ed7899f579") @@ -114,6 +119,23 @@ class Cmake(Package): values=("Debug", "Release", "RelWithDebInfo", "MinSizeRel"), ) + # We default ownlibs to true because it greatly speeds up the CMake + # build, and CMake is built frequently. Also, CMake is almost always + # a build dependency, and its libs will not interfere with others in + # the build. + variant("ownlibs", default=True, description="Use CMake-provided third-party libraries") + variant( + "doc", + default=False, + description="Enables the generation of html and man page documentation", + ) + variant( + "ncurses", + default=sys.platform != "win32", + description="Enables the build of the ncurses gui", + ) + variant("qtgui", default=False, description="Enables the build of the Qt GUI") + # Revert the change that introduced a regression when parsing mpi link # flags, see: https://gitlab.kitware.com/cmake/cmake/issues/19516 patch("cmake-revert-findmpi-link-flag-list.patch", when="@3.15.0") @@ -139,21 +161,7 @@ class Cmake(Package): depends_on("gmake", when="platform=darwin") depends_on("gmake", when="platform=freebsd") - # We default ownlibs to true because it greatly speeds up the CMake - # build, and CMake is built frequently. Also, CMake is almost always - # a build dependency, and its libs will not interfere with others in - # the build. - variant("ownlibs", default=True, description="Use CMake-provided third-party libraries") - variant( - "doc", - default=False, - description="Enables the generation of html and man page documentation", - ) - variant( - "ncurses", - default=sys.platform != "win32", - description="Enables the build of the ncurses gui", - ) + depends_on("qt", when="+qtgui") # See https://gitlab.kitware.com/cmake/cmake/-/issues/21135 conflicts( @@ -184,7 +192,7 @@ class Cmake(Package): depends_on("expat") depends_on("expat@2.5.0:", when="@3.27.0:") # expat/zlib are used in CMake/CTest, so why not require them in libarchive. - for plat in ["darwin", "linux"]: + for plat in ["darwin", "linux", "freebsd"]: with when("platform=%s" % plat): depends_on("libarchive@3.1.0: xar=expat compression=zlib") depends_on("libarchive@3.3.3:", when="@3.15.0:") @@ -312,17 +320,28 @@ def bootstrap_args(self): # Whatever +/~ownlibs, use system curl. args.append("--system-curl") - args.append("--no-qt-gui") if spec.satisfies("+doc"): args.append("--sphinx-html") args.append("--sphinx-man") + if spec.satisfies("+qtgui"): + args.append("--qt-gui") + else: + args.append("--no-qt-gui") + # Now for CMake arguments to pass after the initial bootstrap args.append("--") else: args.append("-DCMAKE_INSTALL_PREFIX=%s" % self.prefix) + # Make CMake find its own dependencies. + prefixes = get_cmake_prefix_path(self) + rpaths = [ + pathlib.Path(self.prefix, "lib").as_posix(), + pathlib.Path(self.prefix, "lib64").as_posix(), + ] + args.extend( [ f"-DCMAKE_BUILD_TYPE={self.spec.variants['build_type'].value}", @@ -330,17 +349,10 @@ def bootstrap_args(self): # inside a ctest environment "-DCMake_TEST_INSTALL=OFF", f"-DBUILD_CursesDialog={'ON' if '+ncurses' in spec else 'OFF'}", - ] - ) - - # Make CMake find its own dependencies. - rpaths = spack.build_environment.get_rpaths(self) - prefixes = spack.build_environment.get_cmake_prefix_path(self) - args.extend( - [ + f"-DBUILD_QtDialog={'ON' if spec.satisfies('+qtgui') else 'OFF'}", "-DCMAKE_INSTALL_RPATH_USE_LINK_PATH=ON", - "-DCMAKE_INSTALL_RPATH={0}".format(";".join(str(v) for v in rpaths)), - "-DCMAKE_PREFIX_PATH={0}".format(";".join(str(v) for v in prefixes)), + f"-DCMAKE_INSTALL_RPATH={';'.join(rpaths)}", + f"-DCMAKE_PREFIX_PATH={';'.join(str(v) for v in prefixes)}", ] ) diff --git a/var/spack/repos/builtin/packages/codec2/package.py b/var/spack/repos/builtin/packages/codec2/package.py index 5639ee6d5dcc2e..227de4f3b738fb 100644 --- a/var/spack/repos/builtin/packages/codec2/package.py +++ b/var/spack/repos/builtin/packages/codec2/package.py @@ -12,10 +12,20 @@ class Codec2(CMakePackage): HF/VHF digital radio.""" homepage = "https://www.rowetel.com/?page_id=452" - url = "https://github.com/drowe67/codec2/archive/v0.9.2.tar.gz" + url = "https://github.com/drowe67/codec2/archive/refs/tags/1.2.0.tar.gz" license("LGPL-2.1-or-later") + version("1.2.0", sha256="cbccae52b2c2ecc5d2757e407da567eb681241ff8dadce39d779a7219dbcf449") version("1.1.0", sha256="d56ba661008a780b823d576a5a2742c94d0b0507574643a7d4f54c76134826a3") version("1.0.5", sha256="cd9a065dd1c3477f6172a0156294f767688847e4d170103d1f08b3a075f82826") version("0.9.2", sha256="19181a446f4df3e6d616b50cabdac4485abb9cd3242cf312a0785f892ed4c76c") + + depends_on("c", type="build") + + def url_for_version(self, version): + # Release 1.2.0 started with shallow git clone "to reduce repo size" + if version < Version("1.2.0"): + return f"https://github.com/drowe67/codec2-dev/archive/refs/tags/v{version}.tar.gz" + else: + return f"https://github.com/drowe67/codec2/archive/refs/tags/{version}.tar.gz" diff --git a/var/spack/repos/builtin/packages/comgr/package.py b/var/spack/repos/builtin/packages/comgr/package.py index b0c0723f8fa397..1e64717b579eb2 100644 --- a/var/spack/repos/builtin/packages/comgr/package.py +++ b/var/spack/repos/builtin/packages/comgr/package.py @@ -30,6 +30,8 @@ def url_for_version(self, version): license("NCSA") version("master", branch="amd-stg-open") + version("6.2.1", sha256="4840f109d8f267c28597e936c869c358de56b8ad6c3ed4881387cf531846e5a7") + version("6.2.0", sha256="12ce17dc920ec6dac0c5484159b3eec00276e4a5b301ab1250488db3b2852200") version("6.1.2", sha256="300e9d6a137dcd91b18d5809a316fddb615e0e7f982dc7ef1bb56876dff6e097") version("6.1.1", sha256="f1a67efb49f76a9b262e9735d3f75ad21e3bd6a05338c9b15c01e6c625c4460d") version("6.1.0", sha256="6bd9912441de6caf6b26d1323e1c899ecd14ff2431874a2f5883d3bc5212db34") @@ -81,6 +83,8 @@ def url_for_version(self, version): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", "master", ]: # llvm libs are linked statically, so this *could* be a build dep @@ -102,6 +106,8 @@ def url_for_version(self, version): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"rocm-core@{ver}", when=f"@{ver}") diff --git a/var/spack/repos/builtin/packages/composable-kernel/package.py b/var/spack/repos/builtin/packages/composable-kernel/package.py index e56bdd63fdbbb9..fcb8dc682d0768 100644 --- a/var/spack/repos/builtin/packages/composable-kernel/package.py +++ b/var/spack/repos/builtin/packages/composable-kernel/package.py @@ -19,6 +19,8 @@ class ComposableKernel(CMakePackage): license("MIT") version("master", branch="develop") + version("6.2.1", sha256="708ff25218dc5fa977af4a37105b380d7612a70c830fa7977b40b3df8b8d3162") + version("6.2.0", sha256="4a3024f4f93c080db99d560a607ad758745cd2362a90d0e8f215331686a6bc64") version("6.1.2", sha256="54db801e1c14239f574cf94dd764a2f986b4abcc223393d55c49e4b276e738c9") version("6.1.1", sha256="f55643c6eee0878e8f2d14a382c33c8b84af0bdf8f31b37b6092b377f7a9c6b5") version("6.1.0", sha256="355a4514b96b56aa9edf78198a3e22067e7397857cfe29d9a64d9c5557b9f83d") @@ -56,6 +58,8 @@ class ComposableKernel(CMakePackage): for ver in [ "master", + "6.2.1", + "6.2.0", "6.1.2", "6.1.1", "6.1.0", @@ -88,11 +92,11 @@ def cmake_args(self): ] if "auto" not in self.spec.variants["amdgpu_target"]: args.append(self.define_from_variant("GPU_TARGETS", "amdgpu_target")) + else: + args.append(self.define("INSTANCES_ONLY", "ON")) if self.spec.satisfies("@5.6.0:"): if self.run_tests: args.append(self.define("BUILD_TESTING", "ON")) - else: - args.append(self.define("INSTANCES_ONLY", "ON")) args.append(self.define("CK_BUILD_JIT_LIB", "ON")) args.append(self.define("CMAKE_POSITION_INDEPENDENT_CODE", "ON")) if self.spec.satisfies("@:5.7"): diff --git a/var/spack/repos/builtin/packages/cosmoflow-benchmark/package.py b/var/spack/repos/builtin/packages/cosmoflow-benchmark/package.py index e9b69678edf391..40117462a30e28 100644 --- a/var/spack/repos/builtin/packages/cosmoflow-benchmark/package.py +++ b/var/spack/repos/builtin/packages/cosmoflow-benchmark/package.py @@ -30,7 +30,7 @@ class CosmoflowBenchmark(Package, CudaPackage): depends_on("py-tensorflow+cuda", when="+cuda", type=("build", "run")) depends_on("py-tensorflow~cuda~nccl", when="~cuda", type=("build", "run")) depends_on("py-torch+cuda", when="+cuda", type=("build", "run")) - depends_on("py-torch~cuda~cudnn~nccl", when="~cuda", type=("build", "run")) + depends_on("py-torch~cuda~nccl", when="~cuda", type=("build", "run")) depends_on("py-horovod tensor_ops=mpi", when="~cuda", type=("build", "run")) def install(self, spec, prefix): diff --git a/var/spack/repos/builtin/packages/cp2k/d4-dispersion-bugfix-2024.3.patch b/var/spack/repos/builtin/packages/cp2k/d4-dispersion-bugfix-2024.3.patch new file mode 100644 index 00000000000000..36613ab6dd32c4 --- /dev/null +++ b/var/spack/repos/builtin/packages/cp2k/d4-dispersion-bugfix-2024.3.patch @@ -0,0 +1,56 @@ +diff --git a/src/qs_dispersion_d4.F b/src/qs_dispersion_d4.F +index 74df989b4..e513ed435 100644 +--- a/src/qs_dispersion_d4.F ++++ b/src/qs_dispersion_d4.F +@@ -26,6 +26,7 @@ MODULE qs_dispersion_d4 + #endif + USE kinds, ONLY: dp + USE particle_types, ONLY: particle_type ++ USE periodic_table, ONLY: get_ptable_info, ptable + USE qs_dispersion_types, ONLY: qs_dispersion_type + USE qs_force_types, ONLY: qs_force_type + USE message_passing, ONLY: mp_para_env_type +@@ -76,7 +77,8 @@ CONTAINS + TYPE(structure_type) :: mol + TYPE(realspace_cutoff) :: cutoff + +- INTEGER :: iatom, natom, ind_atom ++ LOGICAL :: found ++ INTEGER :: iatom, natom, ind_atom, zatom + INTEGER, ALLOCATABLE, DIMENSION(:) :: el_num + REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: gradient, xyz + REAL(KIND=dp), DIMENSION(3, 3) :: stress +@@ -94,7 +96,9 @@ CONTAINS + DO iatom = 1, natom + xyz(:, iatom) = particle_set(iatom)%r(:) + CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind) +- el_num(iatom) = ikind ++ CALL get_ptable_info(particle_set(iatom)%atomic_kind%element_symbol, & ++ ielement=zatom, found=found) ++ el_num(iatom) = zatom + END DO + + !get information about cell / lattice +@@ -125,7 +129,7 @@ CONTAINS + IF (para_env%num_pe > 1 .AND. para_env%mepos > 0) virial = 0.00_dp + END IF + DO iatom = 1, natom +- ikind = el_num(iatom) ++ CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind) + ind_atom = atom_of_kind(iatom) + force(ikind)%dispersion(:, ind_atom) = force(ikind)%dispersion(:, ind_atom) + gradient(:, iatom) + END DO +diff --git a/tests/QS/regtest-dft-vdw-corr-4/TEST_FILES b/tests/QS/regtest-dft-vdw-corr-4/TEST_FILES +index 047421204..c817677df 100644 +--- a/tests/QS/regtest-dft-vdw-corr-4/TEST_FILES ++++ b/tests/QS/regtest-dft-vdw-corr-4/TEST_FILES +@@ -3,7 +3,7 @@ + # e.g. 0 means do not compare anything, running is enough + # 1 compares the last total energy in the file + # for details see cp2k/tools/do_regtest +-pbe_dftd4.inp 33 1.0E-14 -0.00141644869634 ++pbe_dftd4.inp 33 1.0E-14 -0.00283102230260 + pbe_dftd4_force.inp 72 1.0E-07 0.00007217 +-pbe_dftd4_stress.inp 31 1.0E-07 -5.16289312880E-03 ++pbe_dftd4_stress.inp 31 1.0E-07 -2.14003785359E-02 + #EOF diff --git a/var/spack/repos/builtin/packages/cp2k/package.py b/var/spack/repos/builtin/packages/cp2k/package.py index 023c972f237899..306cb55813ea0f 100644 --- a/var/spack/repos/builtin/packages/cp2k/package.py +++ b/var/spack/repos/builtin/packages/cp2k/package.py @@ -46,6 +46,7 @@ class Cp2k(MakefilePackage, CMakePackage, CudaPackage, ROCmPackage): license("GPL-2.0-or-later") + version("2024.3", sha256="a6eeee773b6b1fb417def576e4049a89a08a0ed5feffcd7f0b33c7d7b48f19ba") version("2024.2", sha256="cc3e56c971dee9e89b705a1103765aba57bf41ad39a11c89d3de04c8b8cdf473") version("2024.1", sha256="a7abf149a278dfd5283dc592a2c4ae803b37d040df25d62a5e35af5c4557668f") version("2023.2", sha256="adbcc903c1a78cba98f49fe6905a62b49f12e3dfd7cedea00616d1a5f50550db") @@ -271,8 +272,6 @@ class Cp2k(MakefilePackage, CMakePackage, CudaPackage, ROCmPackage): depends_on("sirius+rocm", when="+rocm") depends_on("sirius+openmp", when="+openmp") depends_on("sirius~openmp", when="~openmp") - depends_on("sirius@7.0.0:7.0", when="@8:8.2") - depends_on("sirius@7.2", when="@8.3:8.9") depends_on("sirius@7.3:", when="@9.1") depends_on("sirius@7.4:7.5", when="@2023.2") depends_on("sirius@7.5:", when="@2024.1:") @@ -363,6 +362,7 @@ class Cp2k(MakefilePackage, CMakePackage, CudaPackage, ROCmPackage): # These patches backport 2023.x fixes to previous versions patch("backport_avoid_null_2022.x.patch", when="@2022.1:2022.2 %aocc@:4.0") patch("backport_avoid_null_9.1.patch", when="@9.1 %aocc@:4.0") + patch("cmake-fixes-2023.2.patch", when="@2023.2 build_system=cmake") # Allow compilation with build_type=RelWithDebInfo and build_type=MinSizeRel @@ -370,15 +370,35 @@ class Cp2k(MakefilePackage, CMakePackage, CudaPackage, ROCmPackage): # The patch applies https://github.com/cp2k/cp2k/pull/3251 to version 2024.1 patch("cmake-relwithdebinfo-2024.1.patch", when="@2024.1 build_system=cmake") - # Patch for an undefined constant due to incompatible changes in ELPA - @when("@9.1:2022.2 +elpa") + # Bugfix for D4 dispersion correction in CP2K 2024.3 + # https://github.com/cp2k/cp2k/issues/3688 + patch("d4-dispersion-bugfix-2024.3.patch", when="@2024.3") + def patch(self): - if self.spec["elpa"].satisfies("@2022.05.001:"): - filter_file( - r"ELPA_2STAGE_REAL_INTEL_GPU", - "ELPA_2STAGE_REAL_INTEL_GPU_SYCL", - "src/fm/cp_fm_elpa.F", - ) + # Patch for an undefined constant due to incompatible changes in ELPA + if self.spec.satisfies("@9.1:2022.2 +elpa"): + if self.spec["elpa"].satisfies("@2022.05.001:"): + filter_file( + r"ELPA_2STAGE_REAL_INTEL_GPU", + "ELPA_2STAGE_REAL_INTEL_GPU_SYCL", + "src/fm/cp_fm_elpa.F", + ) + + # Patch for resolving .mod file conflicts in ROCm by implementing 'USE, INTRINSIC' + if self.spec.satisfies("+rocm"): + for directory, subdirectory, files in os.walk(os.getcwd()): + for i in files: + file_path = os.path.join(directory, i) + filter_file("USE ISO_C_BINDING", "USE,INTRINSIC :: ISO_C_BINDING", file_path) + filter_file( + "USE ISO_FORTRAN_ENV", "USE,INTRINSIC :: ISO_FORTRAN_ENV", file_path + ) + filter_file("USE omp_lib", "USE,INTRINSIC :: omp_lib", file_path) + filter_file("USE OMP_LIB", "USE,INTRINSIC :: OMP_LIB", file_path) + filter_file("USE iso_c_binding", "USE,INTRINSIC :: iso_c_binding", file_path) + filter_file( + "USE iso_fortran_env", "USE,INTRINSIC :: iso_fortran_env", file_path + ) def url_for_version(self, version): url = "https://github.com/cp2k/cp2k/releases/download/v{0}/cp2k-{0}.tar.bz2" @@ -406,6 +426,7 @@ def edit(self, pkg, spec, prefix): "cce": ["-O2"], "xl": ["-O3"], "aocc": ["-O2"], + "rocmcc": ["-O1"], } dflags = ["-DNDEBUG"] if spec.satisfies("@:2023.2") else [] @@ -447,7 +468,7 @@ def edit(self, pkg, spec, prefix): "-ffree-line-length-none", "-ggdb", # make sure we get proper Fortran backtraces ] - elif spec.satisfies("%aocc"): + elif spec.satisfies("%aocc") or spec.satisfies("%rocmcc"): fcflags += ["-ffree-form", "-Mbackslash"] elif spec.satisfies("%pgi") or spec.satisfies("%nvhpc"): fcflags += ["-Mfreeform", "-Mextend"] @@ -496,12 +517,11 @@ def edit(self, pkg, spec, prefix): # (short-int vs int) which otherwise causes segfaults at # runtime due to wrong offsets into the shared library # symbols. - libs.extend( - [ - join_path(spec["libint"].libs.directories[0], "libderiv.a"), - join_path(spec["libint"].libs.directories[0], "libint.a"), - ] - ) + libs += [ + join_path(spec["libint"].libs.directories[0], "libderiv.a"), + join_path(spec["libint"].libs.directories[0], "libint.a"), + ] + else: fcflags += pkgconf("--cflags", "libint2", output=str).split() libs += pkgconf("--libs", "libint2", output=str).split() @@ -524,18 +544,14 @@ def edit(self, pkg, spec, prefix): if spec.satisfies("+pexsi"): cppflags.append("-D__LIBPEXSI") fcflags.append("-I" + join_path(spec["pexsi"].prefix, "fortran")) - libs.extend( - [ - join_path(spec["pexsi"].libs.directories[0], "libpexsi.a"), - join_path(spec["superlu-dist"].libs.directories[0], "libsuperlu_dist.a"), - join_path( - spec["parmetis"].libs.directories[0], "libparmetis.{0}".format(dso_suffix) - ), - join_path( - spec["metis"].libs.directories[0], "libmetis.{0}".format(dso_suffix) - ), - ] - ) + libs += [ + join_path(spec["pexsi"].libs.directories[0], "libpexsi.a"), + join_path(spec["superlu-dist"].libs.directories[0], "libsuperlu_dist.a"), + join_path( + spec["parmetis"].libs.directories[0], "libparmetis.{0}".format(dso_suffix) + ), + join_path(spec["metis"].libs.directories[0], "libmetis.{0}".format(dso_suffix)), + ] if spec.satisfies("+elpa"): elpa = spec["elpa"] @@ -552,16 +568,7 @@ def edit(self, pkg, spec, prefix): ) ) else: - libs.append( - join_path( - elpa.libs.directories[0], - ( - "libelpa{elpa_suffix}.{dso_suffix}".format( - elpa_suffix=elpa_suffix, dso_suffix=dso_suffix - ) - ), - ) - ) + libs.append(elpa.libs.ld_flags) if spec.satisfies("@:4"): if elpa.satisfies("@:2014.5"): @@ -588,20 +595,20 @@ def edit(self, pkg, spec, prefix): if spec.satisfies("+plumed"): dflags.extend(["-D__PLUMED2"]) cppflags.extend(["-D__PLUMED2"]) - libs.extend([join_path(spec["plumed"].prefix.lib, "libplumed.{0}".format(dso_suffix))]) + libs += [join_path(spec["plumed"].prefix.lib, "libplumed.{0}".format(dso_suffix))] if spec.satisfies("+libvori"): cppflags += ["-D__LIBVORI"] libvori = spec["libvori"].libs ldflags += [libvori.search_flags] - libs += libvori + libs.append(libvori.ld_flags) libs += ["-lstdc++"] if spec.satisfies("+spglib"): cppflags += ["-D__SPGLIB"] spglib = spec["spglib"].libs ldflags += [spglib.search_flags] - libs += spglib + libs.append(spglib.ld_flags) cc = spack_cc if "~mpi" in spec else spec["mpi"].mpicc cxx = spack_cxx if "~mpi" in spec else spec["mpi"].mpicxx @@ -616,7 +623,7 @@ def edit(self, pkg, spec, prefix): lapack = spec["lapack"].libs blas = spec["blas"].libs ldflags.append((lapack + blas).search_flags) - libs.extend([str(x) for x in (fftw.libs, lapack, blas)]) + libs += [str(x) for x in (fftw.libs, lapack, blas)] if spec.satisfies("platform=darwin"): cppflags.extend(["-D__NO_STATM_ACCESS"]) @@ -630,7 +637,7 @@ def edit(self, pkg, spec, prefix): # add before ScaLAPACK to override the p?gemm symbols cosma = spec["cosma"].libs ldflags.append(cosma.search_flags) - libs.extend(cosma) + libs += cosma # MPI if spec.satisfies("+mpi"): @@ -658,9 +665,9 @@ def edit(self, pkg, spec, prefix): scalapack = spec["scalapack"].libs ldflags.append(scalapack.search_flags) - libs.extend(scalapack) - libs.extend(mpi) - libs.extend(pkg.compiler.stdcxx_libs) + libs += scalapack + libs += mpi + libs += pkg.compiler.stdcxx_libs if spec.satisfies("+mpi_f08"): cppflags.append("-D__MPI_F08") @@ -719,18 +726,20 @@ def edit(self, pkg, spec, prefix): if spec.satisfies("@2022: +rocm"): libs += [ - "-L{}".format(spec["rocm"].libs.directories[0]), - "-L{}/stubs".format(spec["rocm"].libs.directories[0]), + "-L{}".format(spec["hip"].prefix.lib), + "-lamdhip64", "-lhipblas", "-lhipfft", "-lstdc++", ] - cppflags += ["-D__OFFLOAD_HIP"] acc_compiler_var = "hipcc" acc_flags_var = "NVFLAGS" cppflags += ["-D__ACC"] cppflags += ["-D__DBCSR_ACC"] + cppflags += ["-D__HIP_PLATFORM_AMD__"] + cppflags += ["-D__GRID_HIP"] + gpuver = GPU_MAP[spec.variants["amdgpu_target"].value[0]] if spec.satisfies("smm=libsmm"): @@ -808,6 +817,9 @@ def fflags(var, lst): mkf.write(fflags("CXXFLAGS", cxxflags)) if spec.satisfies("+cuda"): mkf.write(fflags(acc_flags_var, nvflags)) + if "+rocm" in spec: + mkf.write("OFFLOAD_TARGET = hip\n") + mkf.write(fflags("FCFLAGS", fcflags)) mkf.write(fflags("LDFLAGS", ldflags)) mkf.write(fflags("LIBS", libs)) @@ -914,7 +926,7 @@ def fix_package_config(self): content += " " + self.spec["fftw-api"].libs.ld_flags fftw = self.spec["fftw-api"] - if fftw.name in ["fftw", "amdfftw"] and fftw.satisfies("+openmp"): + if fftw.name in ["fftw", "amdfftw", "cray-fftw"] and fftw.satisfies("+openmp"): content += " -lfftw3_omp" content += "\n" diff --git a/var/spack/repos/builtin/packages/cpmd/package.py b/var/spack/repos/builtin/packages/cpmd/package.py index 8bc10da0c50ae0..42fb0a49f2057a 100644 --- a/var/spack/repos/builtin/packages/cpmd/package.py +++ b/var/spack/repos/builtin/packages/cpmd/package.py @@ -78,6 +78,7 @@ def install(self, spec, prefix): install_tree(".", prefix) def test_cpmd(self): + """check cpmd.x outputs""" test_dir = self.test_suite.current_test_data_dir test_file = join_path(test_dir, "1-h2o-pbc-geoopt.inp") opts = [] diff --git a/var/spack/repos/builtin/packages/cpp-argparse/package.py b/var/spack/repos/builtin/packages/cpp-argparse/package.py index 5241608a8ad118..e50ff93c4936bc 100644 --- a/var/spack/repos/builtin/packages/cpp-argparse/package.py +++ b/var/spack/repos/builtin/packages/cpp-argparse/package.py @@ -16,6 +16,7 @@ class CppArgparse(CMakePackage): license("MIT") + version("3.1", sha256="d01733552ca4a18ab501ae8b8be878131baa32e89090fafdeef018ebfa4c6e46") version("2.9", sha256="cd563293580b9dc592254df35b49cf8a19b4870ff5f611c7584cf967d9e6031e") version("2.2", sha256="f0fc6ab7e70ac24856c160f44ebb0dd79dc1f7f4a614ee2810d42bb73799872b") diff --git a/var/spack/repos/builtin/packages/cryptopp/package.py b/var/spack/repos/builtin/packages/cryptopp/package.py index 8be5b473753f9f..49b1df6e53adc6 100644 --- a/var/spack/repos/builtin/packages/cryptopp/package.py +++ b/var/spack/repos/builtin/packages/cryptopp/package.py @@ -13,8 +13,11 @@ class Cryptopp(MakefilePackage): public-key encryption (RSA, DSA), and a few obsolete/historical encryption algorithms (MD5, Panama).""" - homepage = "https://www.cryptopp.com" - url = "https://www.cryptopp.com/cryptopp700.zip" + homepage = "https://github.com/weidai11/cryptopp" + urls = [ + "https://github.com/weidai11/cryptopp/releases/download/CRYPTOPP_8_9_0/cryptopp890.zip", + "https://www.cryptopp.com/cryptopp700.zip", + ] license("BSL-1.0") @@ -34,8 +37,7 @@ class Cryptopp(MakefilePackage): depends_on("gmake", type="build") def url_for_version(self, version): - url = "{0}/{1}{2}.zip" - return url.format(self.homepage, self.name, version.joined) + return f"https://github.com/weidai11/cryptopp/releases/download/CRYPTOPP_{version.underscored}/cryptopp{version.joined}.zip" def build(self, spec, prefix): cxx_flags = [] diff --git a/var/spack/repos/builtin/packages/cubature/package.py b/var/spack/repos/builtin/packages/cubature/package.py new file mode 100644 index 00000000000000..75560cbea92323 --- /dev/null +++ b/var/spack/repos/builtin/packages/cubature/package.py @@ -0,0 +1,17 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class Cubature(CMakePackage): + """multi-dimensional adaptive integration (cubature) in C""" + + url = "https://github.com/stevengj/cubature/archive/refs/tags/v1.0.4.tar.gz" + git = "https://github.com/stevengj/cubature" + + license("GPL-2") + + version("1.0.4", sha256="cd4899de0b047a9d220cfb751a8bdbb8fd0c97c1c894d07523b75168e6426f60") diff --git a/var/spack/repos/builtin/packages/cuda/package.py b/var/spack/repos/builtin/packages/cuda/package.py index affd8bafa59ea4..bd1ff959f2ac26 100644 --- a/var/spack/repos/builtin/packages/cuda/package.py +++ b/var/spack/repos/builtin/packages/cuda/package.py @@ -24,6 +24,16 @@ # format returned by platform.system() and 'arch' by platform.machine() _versions = { + "12.6.2": { + "Linux-aarch64": ( + "2249408848b705c18b9eadfb5161b52e4e36fcc5753647329cce93db141e5466", + "https://developer.download.nvidia.com/compute/cuda/12.6.2/local_installers/cuda_12.6.2_560.35.03_linux_sbsa.run", + ), + "Linux-x86_64": ( + "3729a89cb58f7ca6a46719cff110d6292aec7577585a8d71340f0dbac54fb237", + "https://developer.download.nvidia.com/compute/cuda/12.6.2/local_installers/cuda_12.6.2_560.35.03_linux.run", + ), + }, "12.6.1": { "Linux-aarch64": ( "b39ac88184798e8c313e6ced23dd128f13ab30c199b96bd9c0bee07dbdd31400", diff --git a/var/spack/repos/builtin/packages/cups/package.py b/var/spack/repos/builtin/packages/cups/package.py index 22ce987f83992a..b2c5b84ecfba5d 100644 --- a/var/spack/repos/builtin/packages/cups/package.py +++ b/var/spack/repos/builtin/packages/cups/package.py @@ -14,18 +14,25 @@ class Cups(AutotoolsPackage): install.""" homepage = "https://www.cups.org/" - url = "https://github.com/apple/cups/releases/download/v2.2.3/cups-2.2.3-source.tar.gz" + url = ( + "https://github.com/OpenPrinting/cups/releases/download/v2.4.10/cups-2.4.10-source.tar.gz" + ) - license("Apache-2.0") + license("Apache-2.0", checked_by="wdconinc") + version("2.4.10", sha256="d75757c2bc0f7a28b02ee4d52ca9e4b1aa1ba2affe16b985854f5336940e5ad7") version("2.3.3", sha256="261fd948bce8647b6d5cb2a1784f0c24cc52b5c4e827b71d726020bcc502f3ee") version("2.2.3", sha256="66701fe15838f2c892052c913bde1ba106bbee2e0a953c955a62ecacce76885f") - depends_on("c", type="build") # generated - depends_on("cxx", type="build") # generated + depends_on("c", type="build") + depends_on("cxx", type="build") + depends_on("pkgconfig", type="build") depends_on("gnutls") - depends_on("pkgconfig", type="build") + + def url_for_version(self, version): + org = "apple" if version < Version("2.4") else "OpenPrinting" + return f"https://github.com/{org}/cups/releases/download/v{version}/cups-{version}-source.tar.gz" def configure_args(self): args = ["--enable-gnutls", "--with-components=core"] diff --git a/var/spack/repos/builtin/packages/curl/package.py b/var/spack/repos/builtin/packages/curl/package.py index c3d46c6634694e..127fbd991b59ba 100644 --- a/var/spack/repos/builtin/packages/curl/package.py +++ b/var/spack/repos/builtin/packages/curl/package.py @@ -22,8 +22,7 @@ class Curl(NMakePackage, AutotoolsPackage): transferring data with URL syntax""" homepage = "https://curl.se/" - # URL must remain http:// so Spack can bootstrap curl - url = "http://curl.haxx.se/download/curl-7.78.0.tar.bz2" + url = "https://curl.haxx.se/download/curl-7.78.0.tar.bz2" executables = ["^curl$"] tags = ["build-tools", "windows"] @@ -32,6 +31,7 @@ class Curl(NMakePackage, AutotoolsPackage): license("curl") + version("8.8.0", sha256="40d3792d38cfa244d8f692974a567e9a5f3387c547579f1124e95ea2a1020d0d") version("8.7.1", sha256="05bbd2b698e9cfbab477c33aa5e99b4975501835a41b7ca6ca71de03d8849e76") version("8.6.0", sha256="b4785f2d8877fa92c0e45d7155cf8cc6750dbda961f4b1a45bcbec990cf2fa9b") version("8.4.0", sha256="e5250581a9c032b1b6ed3cf2f9c114c811fc41881069e9892d115cc73f9e88c6") @@ -112,8 +112,12 @@ class Curl(NMakePackage, AutotoolsPackage): depends_on("pkgconfig", type="build", when="platform=freebsd") depends_on("gnutls", when="tls=gnutls") - depends_on("mbedtls@2: +pic", when="@7.79: tls=mbedtls") - depends_on("mbedtls@:2 +pic", when="@:7.78 tls=mbedtls") + + with when("tls=mbedtls"): + depends_on("mbedtls@:2 +pic", when="@:7.78") + depends_on("mbedtls@2: +pic", when="@7.79:") + depends_on("mbedtls@3.6.0: +pic", when="@8.8.0:") + depends_on("nss", when="tls=nss") with when("tls=openssl"): diff --git a/var/spack/repos/builtin/packages/czmq/package.py b/var/spack/repos/builtin/packages/czmq/package.py index 9f8805bed9e8f4..7206bbe28efb90 100644 --- a/var/spack/repos/builtin/packages/czmq/package.py +++ b/var/spack/repos/builtin/packages/czmq/package.py @@ -32,12 +32,11 @@ class Czmq(AutotoolsPackage): depends_on("libzmq") def flag_handler(self, name, flags): - iflags = [] if name == "cflags": if self.spec.satisfies("%oneapi@2022.2.0:"): - iflags.append("-Wno-error=gnu-null-pointer-arithmetic") - iflags.append("-Wno-error=strict-prototypes") - return (iflags, None, None) + flags.append("-Wno-error=gnu-null-pointer-arithmetic") + flags.append("-Wno-error=strict-prototypes") + return (flags, None, None) def autoreconf(self, spec, prefix): autogen = Executable("./autogen.sh") diff --git a/var/spack/repos/builtin/packages/dakota/package.py b/var/spack/repos/builtin/packages/dakota/package.py index 30aaa4b84f4a12..2ab8e46e7a6981 100644 --- a/var/spack/repos/builtin/packages/dakota/package.py +++ b/var/spack/repos/builtin/packages/dakota/package.py @@ -42,6 +42,12 @@ class Dakota(CMakePackage): license("LGPL-2.1-or-later") + version( + "6.20.0", + tag="v6.20.0", + commit="494027b37264ec9268f2de8649d071de0232c534", + submodules=submodules, + ) version( "6.19.0", tag="v6.19.0", @@ -76,7 +82,7 @@ class Dakota(CMakePackage): depends_on("python", when="+python") depends_on("perl-data-dumper", type="build", when="@6.12:") depends_on("boost@:1.68.0", when="@:6.12") - depends_on("boost@1.69.0:", when="@6.18:") + depends_on("boost@1.69.0:1.84.0", when="@6.18:6.20") depends_on("boost +filesystem +program_options +regex +serialization +system") # TODO: replace this with an explicit list of components of Boost, diff --git a/var/spack/repos/builtin/packages/darshan-runtime/package.py b/var/spack/repos/builtin/packages/darshan-runtime/package.py index 7c811e09aaa85e..81bbd2877ea2d0 100644 --- a/var/spack/repos/builtin/packages/darshan-runtime/package.py +++ b/var/spack/repos/builtin/packages/darshan-runtime/package.py @@ -58,6 +58,7 @@ class DarshanRuntime(AutotoolsPackage): depends_on("zlib-api") depends_on("hdf5", when="+hdf5") depends_on("parallel-netcdf", when="+parallel-netcdf") + depends_on("lustre", when="+lustre") depends_on("papi", when="+apxc") depends_on("autoconf", type="build", when="@main") depends_on("automake", type="build", when="@main") @@ -76,6 +77,7 @@ class DarshanRuntime(AutotoolsPackage): description="Compile with Parallel NetCDF module", when="@3.4.1:", ) + variant("lustre", default=False, description="Compile with Lustre module", when="@3.1:") variant("apmpi", default=False, description="Compile with AutoPerf MPI module", when="@3.3:") variant( "apmpi_sync", @@ -87,10 +89,18 @@ class DarshanRuntime(AutotoolsPackage): variant( "scheduler", default="NONE", - description="queue system scheduler JOB ID", + description="Queue system scheduler JOB ID", values=("NONE", "cobalt", "pbs", "sge", "slurm"), multi=False, ) + variant( + "log_path", + values=str, + default="none", + description="Path to centralized, formatted Darshan log directory", + ) + variant("mmap_logs", default=False, description="Use mmap to store Darshan log data") + variant("group_readable_logs", default=False, description="Write group-readable logs") @property def configure_directory(self): @@ -101,13 +111,13 @@ def configure_args(self): extra_args = [] job_id = "NONE" - if spec.satisfies("+slurm"): + if spec.satisfies("scheduler=slurm"): job_id = "SLURM_JOBID" - if spec.satisfies("+cobalt"): + elif spec.satisfies("scheduler=cobalt"): job_id = "COBALT_JOBID" - if spec.satisfies("+pbs"): + elif spec.satisfies("scheduler=pbs"): job_id = "PBS_JOBID" - if spec.satisfies("+sge"): + elif spec.satisfies("scheduler=sge"): job_id = "JOB_ID" if spec.satisfies("+hdf5"): @@ -117,30 +127,40 @@ def configure_args(self): extra_args.append("--enable-hdf5-mod") if spec.satisfies("+parallel-netcdf"): extra_args.append("--enable-pnetcdf-mod") + if spec.satisfies("+lustre"): + extra_args.append("--enable-lustre-mod") + else: + extra_args.append("--disable-lustre-mod") if spec.satisfies("+apmpi"): extra_args.append("--enable-apmpi-mod") if spec.satisfies("+apmpi_sync"): extra_args.extend(["--enable-apmpi-mod", "--enable-apmpi-coll-sync"]) if spec.satisfies("+apxc"): extra_args.append("--enable-apxc-mod") + if spec.satisfies("+group_readable_logs"): + extra_args.append("--enable-group-readable-logs") + if spec.satisfies("+mmap_logs"): + extra_args.append("--enable-mmap-logs") + log_path = self.spec.variants["log_path"].value + if log_path != "none": + extra_args.append("--with-log-path=" + log_path) + else: + extra_args.append("--with-log-path-by-env=DARSHAN_LOG_DIR_PATH") extra_args.append("--with-mem-align=8") - extra_args.append("--with-log-path-by-env=DARSHAN_LOG_DIR_PATH") extra_args.append("--with-jobid-env=%s" % job_id) extra_args.append("--with-zlib=%s" % spec["zlib-api"].prefix) - if spec.satisfies("+mpi"): - extra_args.append("CC=%s" % self.spec["mpi"].mpicc) - else: - extra_args.append("CC=%s" % self.compiler.cc) + if "+mpi" not in spec: extra_args.append("--without-mpi") return extra_args def setup_run_environment(self, env): - # default path for log file, could be user or site specific setting - darshan_log_dir = os.environ["HOME"] - env.set("DARSHAN_LOG_DIR_PATH", darshan_log_dir) + if self.spec.variants["log_path"].value == "none": + # set a default path for log file that can be overrode by user + darshan_log_dir = os.environ["HOME"] + env.set("DARSHAN_LOG_DIR_PATH", darshan_log_dir) @property def basepath(self): diff --git a/var/spack/repos/builtin/packages/darshan-util/package.py b/var/spack/repos/builtin/packages/darshan-util/package.py index ca4acb8fb93b6a..8cbe414d76ab8a 100644 --- a/var/spack/repos/builtin/packages/darshan-util/package.py +++ b/var/spack/repos/builtin/packages/darshan-util/package.py @@ -82,7 +82,6 @@ def configure_args(self): spec = self.spec extra_args = [] - extra_args.append("CC=%s" % self.compiler.cc) extra_args.append("--with-zlib=%s" % spec["zlib-api"].prefix) if spec.satisfies("+apmpi"): if self.version < Version("3.3.2"): diff --git a/var/spack/repos/builtin/packages/dav-sdk/package.py b/var/spack/repos/builtin/packages/dav-sdk/package.py new file mode 100644 index 00000000000000..cb247efb0e9a4d --- /dev/null +++ b/var/spack/repos/builtin/packages/dav-sdk/package.py @@ -0,0 +1,177 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +# Wrapper around depends_on to propagate dependency variants +def dav_sdk_depends_on(spec, when=None, propagate=None): + # Do the basic depends_on + depends_on(spec, when=when) + + # Strip spec string to just the base spec name + # ie. A +c ~b -> A + spec = Spec(spec).name + + # If the package is in the spec tree then it must be enabled in the SDK. + if "+" in when: + _when_variants = when.strip("+").split("+") + if any(tok in when for tok in ["~", "="]): + tty.error("Bad token in when clause, only positive boolean tokens allowed") + + for variant in _when_variants: + conflicts("~" + variant, when="^" + spec) + + # Skip if there is nothing to propagate + if not propagate: + return + + # Map the propagated variants to the dependency variant. Some packages may need + # overrides to propagate a dependency as something else, e.g., {"visit": "libsim"}. + # Most call-sites will just use a list. + if not type(propagate) is dict: + propagate = dict([(v, v) for v in propagate]) + + # Determine the base variant + base_variant = "" + if when: + base_variant = when + + def is_boolean(variant): + return "=" not in variant + + # Propagate variants to dependecy + for v_when, v_then in propagate.items(): + if is_boolean(v_when): + depends_on( + "{0} +{1}".format(spec, v_then), when="{0} +{1}".format(base_variant, v_when) + ) + depends_on( + "{0} ~{1}".format(spec, v_then), when="{0} ~{1}".format(base_variant, v_when) + ) + else: + depends_on("{0} {1}".format(spec, v_then), when="{0} {1}".format(base_variant, v_when)) + + +def exclude_variants(variants, exclude): + return [variant for variant in variants if variant not in exclude] + + +class DavSdk(BundlePackage, CudaPackage, ROCmPackage): + """Data & Vis SDK + + ** This package is a post-ECP port from the ECP Data & Vis SDK ** + """ + + homepage = "https://dav-sdk.github.io/" + + tags = ["peso", "oasis", "sdk"] + maintainers("kwryankrattiger", "vicentebolea") + + version("1.0") + + ############################################################ + # Variants + ############################################################ + + # Data + variant("adios2", default=False, description="Enable ADIOS2") + variant("hdf5", default=False, description="Enable HDF5") + variant("pnetcdf", default=False, description="Enable PNetCDF") + variant("diy", default=False, description="Enable DIY") + + # Vis + variant("ascent", default=False, description="Enable Ascent") + variant("paraview", default=False, description="Enable ParaView") + variant("visit", default=False, description="Enable VisIt") + variant("vtkm", default=False, description="Enable VTK-m") + variant("zfp", default=False, description="Enable ZFP") + + # Language Options + variant("fortran", default=True, sticky=True, description="Enable fortran language features.") + + ############################################################ + # Dependencies + ############################################################ + cuda_arch_variants = ["cuda_arch={0}".format(x) for x in CudaPackage.cuda_arch_values] + amdgpu_target_variants = ["amdgpu_target={0}".format(x) for x in ROCmPackage.amdgpu_targets] + + dav_sdk_depends_on( + "adios2+shared+mpi+python+sst+dataman", + when="+adios2", + propagate=["cuda", "hdf5", "zfp", "fortran"] + cuda_arch_variants, + ) + + # HDF5 1.14 is a soft requirement for the ECP Data and Vis SDK. + # When building with VisIt and CinemaSci in the same SDK environment there is a conflict + # in the build dependency of py-setuptools which prevents building a py-h5py that is + # compatible with 'hdf5@1.14:'. Until there is a version of VisIt with an updated VTK or Spack + # allows the concretization of multiple versions of the same build only dependency + # concretization with VisIt and Cinema variants will not allow building VOLs. + dav_sdk_depends_on("hdf5@1.12: +shared+mpi", when="+hdf5", propagate=["fortran"]) + + # HDF5 VOL Adapters require hdf5@1.14: + + # hdf5-vfd-gds needs cuda@11.7.1 or later, only enable when 11.7.1+ available. + depends_on("hdf5-vfd-gds@1.0.2:", when="+cuda+hdf5 ^cuda@11.7.1: ^hdf5@1.14:") + for cuda_arch in cuda_arch_variants: + depends_on( + "hdf5-vfd-gds@1.0.2: {0}".format(cuda_arch), + when="+cuda+hdf5 {0} ^cuda@11.7.1: ^hdf5@1.14:".format(cuda_arch), + ) + conflicts("~cuda", when="^hdf5-vfd-gds@1.0.2:") + conflicts("~hdf5", when="^hdf5-vfd-gds@1.0.2:") + conflicts("~hdf5", when="^hdf5-vol-async") + conflicts("~hdf5", when="^hdf5-vol-cache") + conflicts("~hdf5", when="^hdf5-vol-log") + depends_on("hdf5-vol-async", when="+hdf5 ^hdf5@1.14:") + depends_on("hdf5-vol-cache", when="+hdf5 ^hdf5@1.14:") + depends_on("hdf5-vol-log", when="+hdf5 ^hdf5@1.14:") + + dav_sdk_depends_on("parallel-netcdf+shared", when="+pnetcdf", propagate=["fortran"]) + + # Fortran support with ascent is problematic on some Cray platforms so the + # SDK is explicitly disabling it until the issues are resolved. + dav_sdk_depends_on( + "ascent+mpi~fortran+python+shared+vtkh+dray~test", + when="+ascent", + propagate=["adios2", "cuda"] + cuda_arch_variants, + ) + depends_on("ascent+openmp", when="~rocm+ascent") + depends_on("ascent~openmp", when="+rocm+ascent") + + # Need to explicitly turn off conduit hdf5_compat in order to build + # hdf5@1.12 which is required for SDK + depends_on("conduit ~hdf5_compat", when="+ascent +hdf5") + # Disable configuring with @develop. This should be removed after ascent + # releases 0.8 and ascent can build with conduit@0.8: and vtk-m@1.7: + conflicts("^ascent@develop", when="+ascent") + + dav_sdk_depends_on("diy@3:", when="+diy") + + # ParaView needs @5.11: in order to use CUDA/ROCM, therefore it is the minimum + # required version since GPU capability is desired for ECP + dav_sdk_depends_on( + "paraview@5.11:+mpi+openpmd+python+kits+shared+catalyst+libcatalyst" " use_vtkm=on", + when="+paraview", + propagate=["adios2", "cuda", "hdf5", "rocm"] + amdgpu_target_variants + cuda_arch_variants, + ) + dav_sdk_depends_on("libcatalyst@2:+mpi", when="+paraview") + conflicts("^paraview@master", when="+paraview") + + dav_sdk_depends_on("visit+mpi+python+silo", when="+visit", propagate=["hdf5", "adios2"]) + + dav_sdk_depends_on( + "vtk-m@1.7:+shared+mpi+rendering", + when="+vtkm", + propagate=["cuda", "rocm"] + cuda_arch_variants + amdgpu_target_variants, + ) + # TODO: When Ascent is updated to use VTK-m >= 1.8 move examples to + # the main spec. + conflicts("^vtk-m~examples", when="+vtkm ^vtk-m@1.8:") + depends_on("vtk-m+openmp", when="~rocm+vtkm") + depends_on("vtk-m~openmp", when="+rocm+vtkm") + + dav_sdk_depends_on("zfp", when="+zfp", propagate=["cuda"] + cuda_arch_variants) diff --git a/var/spack/repos/builtin/packages/dbus/package.py b/var/spack/repos/builtin/packages/dbus/package.py index 7c59223d99bfdc..4b54a5fce89f1d 100644 --- a/var/spack/repos/builtin/packages/dbus/package.py +++ b/var/spack/repos/builtin/packages/dbus/package.py @@ -6,7 +6,7 @@ from spack.package import * -class Dbus(AutotoolsPackage): +class Dbus(AutotoolsPackage, MesonPackage): """D-Bus is a message bus system, a simple way for applications to talk to one another. D-Bus supplies both a system daemon (for events such new hardware device printer queue ) and a @@ -17,10 +17,24 @@ class Dbus(AutotoolsPackage): through the message bus daemon).""" homepage = "https://dbus.freedesktop.org/" - url = "https://dbus.freedesktop.org/releases/dbus/dbus-1.8.8.tar.gz" + url = "https://dbus.freedesktop.org/releases/dbus/dbus-1.14.10.tar.xz" + git = "https://gitlab.freedesktop.org/dbus/dbus" - license("AFL-2.1 OR GPL-2.0-or-later") + license("AFL-2.1 OR GPL-2.0-or-later", checked_by="wdconinc") + build_system( + conditional("autotools", when="@:1.15.8"), + conditional("meson", when="@1.15:"), + default="meson", + ) + + # Note: odd minor versions are unstable, keep last stable version preferred + version("1.15.10", sha256="f700f2f1d0473f11e52f3f3e179f577f31b85419f9ae1972af8c3db0bcfde178") + version( + "1.14.10", + sha256="ba1f21d2bd9d339da2d4aa8780c09df32fea87998b73da24f49ab9df1e36a50f", + preferred=True, + ) version("1.13.6", sha256="b533693232d36d608a09f70c15440c1816319bac3055433300d88019166c1ae4") version("1.12.8", sha256="e2dc99e7338303393b6663a98320aba6a63421bcdaaf571c8022f815e5896eb3") version("1.11.2", sha256="5abc4c57686fa82669ad0039830788f9b03fdc4fff487f0ccf6c9d56ba2645c9") @@ -30,12 +44,11 @@ class Dbus(AutotoolsPackage): version("1.8.4", sha256="3ef63dc8d0111042071ee7f7bafa0650c6ce2d7be957ef0b7ec269495a651ff8") version("1.8.2", sha256="5689f7411165adc953f37974e276a3028db94447c76e8dd92efe910c6d3bae08") - depends_on("c", type="build") # generated - depends_on("cxx", type="build") # generated - variant("xml_docs", default=False, description="Build XML documentation") variant("system-socket", default="default", description="Location for the DBus system socket") + depends_on("c", type="build") + depends_on("cxx", type="build", when="platform=windows") depends_on("pkgconfig", type="build") depends_on("docbook-xml", type="build") depends_on("docbook-xsl", type="build") @@ -44,16 +57,32 @@ class Dbus(AutotoolsPackage): depends_on("libsm") depends_on("xmlto", when="+xml_docs", type="build") + def url_for_version(self, version): + ext = "gz" if version < Version("1.15") else "xz" + return f"https://dbus.freedesktop.org/releases/dbus/dbus-{version}.tar.{ext}" + + @run_after("install") + def generate_uuid(self): + # dbus needs a machine id generated after install + dbus_uuidgen = Executable(self.prefix.bin.join("dbus-uuidgen")) + dbus_uuidgen("--ensure") + + +class AutotoolsBuilder(spack.build_systems.autotools.AutotoolsBuilder): def configure_args(self): - args = ["--disable-systemd", "--disable-launchd"] + args = ["--disable-systemd", "--disable-launchd", "--disable-qt-help"] args += self.enable_or_disable("xml-docs", variant="xml_docs") socket = self.spec.variants["system-socket"].value if socket != "default": args += ["--with-system-socket={0}".format(socket)] return args - @run_after("install") - def generate_uuid(self): - # dbus needs a machine id generated after install - dbus_uuidgen = Executable(self.prefix.bin.join("dbus-uuidgen")) - dbus_uuidgen("--ensure") + +class MesonBuilder(spack.build_systems.meson.MesonBuilder): + def meson_args(self): + args = ["-Dsystemd=disabled", "-Dlaunchd=disabled", "-Dqt_help=disabled"] + args += [f"-Dxml_docs={'enabled' if self.spec.satisfies('+xml_docs') else 'disabled'}"] + socket = self.spec.variants["system-socket"].value + if socket != "default": + args += [f"-Dsystem_socket={socket}"] + return args diff --git a/var/spack/repos/builtin/packages/dcmtk/package.py b/var/spack/repos/builtin/packages/dcmtk/package.py index 94fdd48b680c59..df554558da9d35 100644 --- a/var/spack/repos/builtin/packages/dcmtk/package.py +++ b/var/spack/repos/builtin/packages/dcmtk/package.py @@ -13,8 +13,9 @@ class Dcmtk(CMakePackage): homepage = "https://dicom.offis.de" url = "https://github.com/DCMTK/dcmtk/archive/DCMTK-3.6.3.tar.gz" - license("BSD-3-Clause") + license("BSD-3-Clause", checked_by="wdconinc") + version("3.6.8", sha256="fca429a215739702fe8d96178964036246a35e2ea8adb12da33851e2be8e9a07") version("3.6.7", sha256="17705dcdb2047d1266bb4e92dbf4aa6d4967819e8e3e94f39b7df697661b4860") version("3.6.6", sha256="117097da6d50ddbad0e48bb1e6cdc61468e82ba1d32001dd8e2366b445133a8c") version("3.6.5", sha256="37dad355d5513b4de4a86b5b7b0c3e9ec059860d88781b80916bba2a04e6d5b8") @@ -22,8 +23,8 @@ class Dcmtk(CMakePackage): version("3.6.3", sha256="57f4f71ee4af9114be6408ff6fcafc441c349e4c2954e17c9c22c8ce0fb065bf") version("3.6.2", sha256="e9bf6e8805bbcf8a25274566541798785fd4e73bd046045ef27a0109ab520924") - depends_on("c", type="build") # generated - depends_on("cxx", type="build") # generated + depends_on("c", type="build") + depends_on("cxx", type="build") variant("ssl", default=True, description="Suuport DICOM Security Enhancements one") depends_on("openssl", type=("build", "link"), when="+ssl") @@ -53,7 +54,7 @@ class Dcmtk(CMakePackage): conflicts("platform=darwin target=aarch64:", when="@:3.6.6") - patch("tiff-3.6.7.patch", when="@3.6.7") + patch("tiff-3.6.7.patch", when="@3.6.7:3.6.8") def patch(self): # Backport 3.6.4 diff --git a/var/spack/repos/builtin/packages/dd4hep/package.py b/var/spack/repos/builtin/packages/dd4hep/package.py index 35199f9c91bd42..aadaa4651d54fe 100644 --- a/var/spack/repos/builtin/packages/dd4hep/package.py +++ b/var/spack/repos/builtin/packages/dd4hep/package.py @@ -26,6 +26,7 @@ class Dd4hep(CMakePackage): license("LGPL-3.0-or-later") version("master", branch="master") + version("1.30", sha256="02de46151e945eff58cffd84b4b86d35051f4436608199c3efb4d2e1183889fe") version("1.29", sha256="435d25a7ef093d8bf660f288b5a89b98556b4c1c293c55b93bf641fb4cba77e9") version("1.28", sha256="b28d671eda0154073873a044a384486e66f1f200065deca99537aa84f07328ad") version("1.27.2", sha256="09d8acd743d010274562b856d39e2a88aeaf89cf287a4148f52223b0cd960ab2") diff --git a/var/spack/repos/builtin/packages/dealii/package.py b/var/spack/repos/builtin/packages/dealii/package.py index b4664d23e2f096..94563ec32dc78e 100644 --- a/var/spack/repos/builtin/packages/dealii/package.py +++ b/var/spack/repos/builtin/packages/dealii/package.py @@ -358,16 +358,6 @@ class Dealii(CMakePackage, CudaPackage): "via ~{0}".format(_package), ) - # interfaces added after 9.5.0: - for _package in ["vtk", "taskflow"]: - conflicts( - "+{0}".format(_package), - when="@:9.5", - msg="The interface to {0} is supported from version 9.6.0 " - "onwards. Please explicitly disable this variant " - "via ~{0}".format(_package), - ) - # Interfaces removed in 9.3.0: conflicts( "+nanoflann", diff --git a/var/spack/repos/builtin/packages/detray/package.py b/var/spack/repos/builtin/packages/detray/package.py index c32e0ec6d58a49..1ea2022dfb3f88 100644 --- a/var/spack/repos/builtin/packages/detray/package.py +++ b/var/spack/repos/builtin/packages/detray/package.py @@ -20,6 +20,14 @@ class Detray(CMakePackage): license("MPL-2.0", checked_by="stephenswat") + version("0.79.0", sha256="3b9f18cb003e59795a0e4b1414069ac8558b975714626449293a71bc4398a380") + version("0.78.0", sha256="ca3a348f4e12ed690c3106197e107b9c393b6902224b2543b00382050864bcf3") + version("0.77.0", sha256="c2c72f65a7ff2426335b850c0b3cfbbbf666208612b2458c97a534ecf8029cb8") + version("0.76.1", sha256="54d9abee395e9faf0f56b5d9c137a9990f23712fbcc88fd90af20643bcae635e") + version("0.76.0", sha256="affa0e28ca96d168e377ba33642e0b626aacdc79f9436233f5561006018f9b9e") + version("0.75.3", sha256="1249d7398d1e534bd36b6f5a7d06a5e67adf6adeb8bca188d7e35490a675de7a") + version("0.75.2", sha256="249066c138eac4114032e8d558f3a05885140a809332a347c7667978dbff54ee") + version("0.74.2", sha256="9fd14cf1ec30477d33c530670e9fed86b07db083912fe51dac64bf2453b321e8") version("0.73.0", sha256="f574016bc7515a34a675b577e93316e18cf753f1ab7581dcf1c8271a28cb7406") version("0.72.1", sha256="6cc8d34bc0d801338e9ab142c4a9884d19d9c02555dbb56972fab86b98d0f75b") version("0.71.0", sha256="2be2b3dac6f77aa8cea033eba841378dc3703ff93c99e4d05ea03df685e6d508") @@ -91,6 +99,7 @@ def cmake_args(self): self.define("DETRAY_SETUP_GOOGLETEST", False), self.define("DETRAY_SETUP_BENCHMARK", False), self.define("DETRAY_BUILD_TUTORIALS", False), + self.define("DETRAY_BUILD_TEST_UTILS", True), ] return args diff --git a/var/spack/repos/builtin/packages/direnv/package.py b/var/spack/repos/builtin/packages/direnv/package.py index b5ed1495b2ce3d..e091d1242f22d3 100644 --- a/var/spack/repos/builtin/packages/direnv/package.py +++ b/var/spack/repos/builtin/packages/direnv/package.py @@ -6,7 +6,7 @@ from spack.package import * -class Direnv(Package): +class Direnv(GoPackage): """direnv is an environment switcher for the shell.""" homepage = "https://direnv.net/" @@ -26,18 +26,5 @@ class Direnv(Package): version("2.20.0", sha256="cc72525b0a5b3c2ab9a52a3696e95562913cd431f923bcc967591e75b7541bff") version("2.11.3", sha256="2d34103a7f9645059270763a0cfe82085f6d9fe61b2a85aca558689df0e7b006") - depends_on("go", type="build") depends_on("go@1.16:", type="build", when="@2.28:") depends_on("go@1.20:", type="build", when="@2.33:") - - phases = ["build", "install"] - - def setup_build_environment(self, env): - # Point GOPATH at the top of the staging dir for the build step. - env.prepend_path("GOPATH", self.stage.path) - - def build(self, spec, prefix): - make() - - def install(self, spec, prefix): - make("install", "PREFIX=%s" % prefix) diff --git a/var/spack/repos/builtin/packages/dla-future-fortran/package.py b/var/spack/repos/builtin/packages/dla-future-fortran/package.py index 184c2a4db25411..0d50d05e002b28 100644 --- a/var/spack/repos/builtin/packages/dla-future-fortran/package.py +++ b/var/spack/repos/builtin/packages/dla-future-fortran/package.py @@ -51,3 +51,9 @@ def cmake_args(self): args.append(self.define("MPIEXEC_MAX_NUMPROCS", 6)) return args + + @property + def libs(self): + return find_libraries( + "libDLAF_Fortran", root=self.home, shared=self.spec.satisfies("+shared") + ) diff --git a/var/spack/repos/builtin/packages/dla-future/package.py b/var/spack/repos/builtin/packages/dla-future/package.py index 078779411e0603..c831dd1f671452 100644 --- a/var/spack/repos/builtin/packages/dla-future/package.py +++ b/var/spack/repos/builtin/packages/dla-future/package.py @@ -223,14 +223,19 @@ def cmake_args(self): ) else: args.append(self.define("DLAF_WITH_MKL", spec["lapack"].name in INTEL_MATH_LIBRARIES)) + add_dlaf_prefix = lambda x: x if spec.satisfies("@:0.6") else "DLAF_" + x args.append( self.define( - "LAPACK_LIBRARY", + add_dlaf_prefix("LAPACK_LIBRARY"), " ".join([spec[dep].libs.ld_flags for dep in ["blas", "lapack"]]), ) ) if spec.satisfies("+scalapack"): - args.append(self.define("SCALAPACK_LIBRARY", spec["scalapack"].libs.ld_flags)) + args.append( + self.define( + add_dlaf_prefix("SCALAPACK_LIBRARY"), spec["scalapack"].libs.ld_flags + ) + ) args.append(self.define_from_variant("DLAF_WITH_SCALAPACK", "scalapack")) diff --git a/var/spack/repos/builtin/packages/dlb/package.py b/var/spack/repos/builtin/packages/dlb/package.py index a1442e07c9d32c..988d4061f04e2c 100644 --- a/var/spack/repos/builtin/packages/dlb/package.py +++ b/var/spack/repos/builtin/packages/dlb/package.py @@ -22,6 +22,7 @@ class Dlb(AutotoolsPackage): license("LGPL-3.0-or-later") version("main", branch="main") + version("3.4.1", sha256="7c071b75c126f8e77c1a30369348751624d5636edcbd663bf3d41fa04733c894") version("3.4", sha256="6091d032c11a094a3ce0bec11c0a164783fdff83cb4ec870c9d8e192410c353a") version("3.3.1", sha256="1b245acad80b03eb83e815fd59dcfc598cfddd899de4504cf6a9572fe5359f40") version("3.3", sha256="55b87aea14f3954d8878912f3134938db235e6984fae26fdf5134148007eb722") @@ -31,13 +32,17 @@ class Dlb(AutotoolsPackage): version("3.0.1", sha256="04f8a7aa269d02fc8561d0a61d64786aa18850367ce4f95d086ca12ab3eb7d24") version("3.0", sha256="e3fc1d51e9ded6d4d40d37f8568da4c4d72d1a8996bdeff2dfbbd86c9b96e36a") - depends_on("c", type="build") # generated - depends_on("fortran", type="build") # generated + depends_on("c", type="build") + depends_on("fortran", type="build") - variant("debug", default=False, description="Builds additional debug libraries") - variant("mpi", default=False, description="Builds MPI libraries") + variant("debug", default=False, description="Build additional debug libraries") + variant("mpi", default=True, description="Build MPI libraries") + variant("hwloc", default=True, description="Enable HWLOC support") + variant("papi", default=True, description="Enable PAPI support") depends_on("mpi", when="+mpi") + depends_on("hwloc", when="+hwloc") + depends_on("papi", when="@3.4: +papi") depends_on("python", type="build") depends_on("autoconf", type="build", when="@main") depends_on("automake", type="build", when="@main") @@ -48,5 +53,8 @@ def configure_args(self): args.extend(self.enable_or_disable("debug")) args.extend(self.enable_or_disable("instrumentation-debug", variant="debug")) args.extend(self.with_or_without("mpi")) + args.extend(self.with_or_without("hwloc")) + if self.spec.satisfies("@3.4:"): + args.extend(self.with_or_without("papi")) return args diff --git a/var/spack/repos/builtin/packages/dosfstools/package.py b/var/spack/repos/builtin/packages/dosfstools/package.py index db158d6e79caaf..f54245d7a3220a 100644 --- a/var/spack/repos/builtin/packages/dosfstools/package.py +++ b/var/spack/repos/builtin/packages/dosfstools/package.py @@ -15,15 +15,21 @@ class Dosfstools(AutotoolsPackage): license("GPL-3.0-or-later") + version("4.2", sha256="355a6725524b50e64ae94060ed28579e0e004c519fc964f7085188cd87a99ba7") version("4.1", sha256="8ff9c2dcc01551fe9de8888cb41eb1051fd58bdf1ab3a93d3d88916f0a4ffd1b") version("4.0", sha256="77975e289e695cb8c984a3c0a15a3bbf3af90be83c26983d43abcde9ec48eea5") - depends_on("c", type="build") # generated + depends_on("c", type="build") depends_on("automake", type="build") depends_on("autoconf", type="build") depends_on("libtool", type="build") depends_on("m4", type="build") + depends_on("gettext", when="@4.2:") # for HAVE_ICONV + + @when("@4.2:") + def autoreconf(self, spec, prefix): + Executable("./autogen.sh")() def setup_run_environment(self, env): env.prepend_path("PATH", self.prefix.sbin) diff --git a/var/spack/repos/builtin/packages/doxygen/package.py b/var/spack/repos/builtin/packages/doxygen/package.py index 4bbafec5dc3401..da926da5384ec0 100644 --- a/var/spack/repos/builtin/packages/doxygen/package.py +++ b/var/spack/repos/builtin/packages/doxygen/package.py @@ -20,6 +20,7 @@ class Doxygen(CMakePackage): license("GPL-2.0-or-later") + version("1.12.0", sha256="5ca35e1258020df5fe8b21c3656aed156c317def4a81b7fe52f452edc9f35768") version("1.11.0", sha256="1fea49c69e51fec3dd2599947f6d48d9b1268bd5115b1bb08dffefc1fd5d19ee") version("1.10.0", sha256="795692a53136ca9bb9a6cd72656968af7858a78be7d6d011e12ab1dce6b9533c") version("1.9.8", sha256="77371e8a58d22d5e03c52729844d1043e9cbf8d0005ec5112ffa4c8f509ddde8") @@ -136,16 +137,18 @@ def determine_variants(cls, exes, version_str): def patch(self): if self.spec["iconv"].name != "libiconv": return - # On Linux systems, iconv is provided by libc. Since CMake finds the - # symbol in libc, it does not look for libiconv, which leads to linker - # errors. This makes sure that CMake always looks for the external - # libconv instead. - filter_file( - "check_function_exists(iconv_open ICONV_IN_GLIBC)", - "set(ICONV_IN_GLIBC FALSE)", - join_path("cmake", "FindIconv.cmake"), - string=True, - ) + + if self.spec.satisfies("@:1.11"): + # On Linux systems, iconv is provided by libc. Since CMake finds the + # symbol in libc, it does not look for libiconv, which leads to linker + # errors. This makes sure that CMake always looks for the external + # libconv instead. + filter_file( + "check_function_exists(iconv_open ICONV_IN_GLIBC)", + "set(ICONV_IN_GLIBC FALSE)", + join_path("cmake", "FindIconv.cmake"), + string=True, + ) def cmake_args(self): return [ diff --git a/var/spack/repos/builtin/packages/dray/package.py b/var/spack/repos/builtin/packages/dray/package.py index 1751e931052ac0..9c0a38721de56f 100644 --- a/var/spack/repos/builtin/packages/dray/package.py +++ b/var/spack/repos/builtin/packages/dray/package.py @@ -8,6 +8,7 @@ import llnl.util.tty as tty +from spack.build_systems.cmake import CMakeBuilder from spack.package import * @@ -120,7 +121,12 @@ def install(self, spec, prefix): with working_dir("spack-build", create=True): host_cfg_fname = self.create_host_config(spec, prefix) print("Configuring Devil Ray...") - cmake(*std_cmake_args, "-C", host_cfg_fname, "../src") + cmake( + *CMakeBuilder.std_args(self, generator="Unix Makefiles"), + "-C", + host_cfg_fname, + "../src", + ) print("Building Devil Ray...") make() # run unit tests if requested diff --git a/var/spack/repos/builtin/packages/drill/package.py b/var/spack/repos/builtin/packages/drill/package.py index 0759e0c0e43e77..77a3d4205c2531 100644 --- a/var/spack/repos/builtin/packages/drill/package.py +++ b/var/spack/repos/builtin/packages/drill/package.py @@ -14,17 +14,34 @@ class Drill(Package): """ homepage = "https://drill.apache.org/" - url = "https://www-eu.apache.org/dist/drill/drill-1.17.0/apache-drill-1.17.0.tar.gz" - - license("Apache-2.0") - - version("1.17.0", sha256="a3d2d544bcc32b915fb53fced0f982670bd6fe2abd764423e566a5f6b54debf1") - version("1.16.0", sha256="fd195d2b38f393459b37d8f13ac1f36cdbe38495eabb08252da38e3544e87839") - version("1.15.0", sha256="188c1d0df28e50f0265f4bc3c5871b4e7abc9450a4e5a7dbe7f0b23146bec76b") - version("1.14.0", sha256="1145bdbb723119f271d32daf4cdd77cdeebe88ddcb7d04facd585b715bb5723b") - version("1.13.0", sha256="8da6d56f75ae01e0bee6176095d32760e7183dd0200f10ee68b8cd3f882def6a") - + url = "https://dist.apache.org/repos/dist/release/drill/1.17.0/apache-drill-1.17.0.tar.gz" + git = "https://github.com/apache/drill.git" + + license("Apache-2.0", checked_by="wdconinc") + + version("1.21.2", sha256="77e2e7438f1b4605409828eaa86690f1e84b038465778a04585bd8fb21d68e3b") + version("1.20.3", sha256="1520cd2524cf8e0ce45fcf02e8e5e3e044465c6dacad853f9fadf9c918863cad") + with default_args(deprecated=True): + # Log4Shell vulnerability (CVE-2021-44228) affects all versions before 1.20.0 + version( + "1.17.0", sha256="a3d2d544bcc32b915fb53fced0f982670bd6fe2abd764423e566a5f6b54debf1" + ) + version( + "1.16.0", sha256="fd195d2b38f393459b37d8f13ac1f36cdbe38495eabb08252da38e3544e87839" + ) + version( + "1.15.0", sha256="188c1d0df28e50f0265f4bc3c5871b4e7abc9450a4e5a7dbe7f0b23146bec76b" + ) + version( + "1.14.0", sha256="1145bdbb723119f271d32daf4cdd77cdeebe88ddcb7d04facd585b715bb5723b" + ) + version( + "1.13.0", sha256="8da6d56f75ae01e0bee6176095d32760e7183dd0200f10ee68b8cd3f882def6a" + ) + + # pom.xml, requireJavaVersion depends_on("java@7:", type="run") + depends_on("java@8:", type="run", when="@1.14:") def install(self, spec, prefix): install_tree(".", prefix) diff --git a/var/spack/repos/builtin/packages/duckdb/package.py b/var/spack/repos/builtin/packages/duckdb/package.py index 44249692dd1981..efb021ca678500 100644 --- a/var/spack/repos/builtin/packages/duckdb/package.py +++ b/var/spack/repos/builtin/packages/duckdb/package.py @@ -18,10 +18,16 @@ class Duckdb(MakefilePackage): maintainers("glentner", "teaguesterling") version("master", branch="master") + version("1.1.1", sha256="a764cef80287ccfd8555884d8facbe962154e7c747043c0842cd07873b4d6752") + version("1.1.0", sha256="d9be2c6d3a5ebe2b3d33044fb2cb535bb0bd972a27ae38c4de5e1b4caa4bf68d") version("1.0.0", sha256="04e472e646f5cadd0a3f877a143610674b0d2bcf9f4102203ac3c3d02f1c5f26") version("0.10.3", sha256="7855587b3491dd488993287caee28720bee43ae28e92e8f41ea4631e9afcbf88") version("0.10.2", sha256="662a0ba5c35d678ab6870db8f65ffa1c72e6096ad525a35b41b275139684cea6") - version("0.10.0", sha256="5a925b8607d00a97c1a3ffe6df05c0a62a4df063abd022ada82ac1e917792013") + version( + "0.10.0", + sha256="5a925b8607d00a97c1a3ffe6df05c0a62a4df063abd022ada82ac1e917792013", + deprecated=True, + ) version( "0.9.2", sha256="afff7bd925a98dc2af4039b8ab2159b0705cbf5e0ee05d97f7bb8dce5f880dc2", @@ -37,37 +43,27 @@ class Duckdb(MakefilePackage): sha256="3dbf3326a831bf0797591572440e81a3d6d668f8e33a25ce04efae19afc3a23d", deprecated=True, ) - version( - "0.8.1", - sha256="a0674f7e320dc7ebcf51990d7fc1c0e7f7b2c335c08f5953702b5285e6c30694", - deprecated=True, - ) - version( - "0.8.0", - sha256="df3b8e0b72bce38914f0fb1cd02235d8b616df9209beb14beb06bfbcaaf2e97f", - deprecated=True, - ) - version( - "0.7.1", - sha256="67f840f861e5ffbe137d65a8543642d016f900b89dd035492d562ad11acf0e1e", - deprecated=True, - ) depends_on("c", type="build") # generated depends_on("cxx", type="build") # generated depends_on("python@3.7:") - depends_on("cmake", type="build") - depends_on("gmake", type="build") - depends_on("ninja", when="+ninjabuild", type="build") + with default_args(type="build"): + depends_on("cmake") + depends_on("gmake") + depends_on("ninja", when="+ninjabuild") + depends_on("py-pip", when="+python") + depends_on("py-setuptools-scm", when="+python") + depends_on("pkgconfig", when="+static_openssl") + depends_on("zlib-api", when="+static_openssl") depends_on("openssl", when="+httpfs") depends_on("icu4c", when="~icu") # Build Options - variant("autocomplete", default=True, description="Include autocomplete for CLI in build") variant("cli", default=True, description="Compile with command line client") variant("icu", default=False, description="Compile with bundled ICU library") variant("ninjabuild", default=True, description="Use GEN=ninja to build") + variant("static_openssl", default=False, description="Build with static openSSL") variant( "openssl", default=False, @@ -75,18 +71,24 @@ class Duckdb(MakefilePackage): when="@:0.9.2", ) + variant("extension_autoload", default=False, description="Enable extension auto-loading") + variant("extension_autoinstall", default=False, description="Enable extension auto-installing") + variant("extension_repo", default=True, description="Copy extensions to prefix") + # Extensions + variant("autocomplete", default=True, description="Include autocomplete for CLI in build") variant("excel", default=True, description="Include Excel formatting extension in build") variant("fts", default=True, description="Include FTS (full text search) support in build") variant("httpfs", default=True, description="Include HTTPFS (& S3) support in build") variant("inet", default=True, description="Include INET (ip address) support in build") variant("json", default=True, description="Include JSON support in build") variant("parquet", default=True, description="Include parquent support in build") + variant("tpce", default=False, description="Include TPCE in build") + variant("tpch", default=False, description="Include TPCH in build") # APIs - variant("jdbc", default=False, description="Build JDBC driver (may not work)") - variant("odbc", default=False, description="Build with ODBC driver (may not work)") - variant("python", default=False, description="Build with Python driver (may not work)") + variant("python", default=True, description="Build with Python driver") + extends("python", when="+python") # Observed failure in an AVX2-specific codeblock on x86_64_v4 target conflicts( @@ -95,9 +97,18 @@ class Duckdb(MakefilePackage): msg="See: https://github.com/duckdb/duckdb/issues/12362", ) + @property + def duckdb_extension_prefix(self): + return self.prefix.lib.duckdb + def setup_build_environment(self, env): + cmake_args = [] # Future use if self.spec.satisfies("+ninjabuild"): env.set("GEN", "ninja") + if self.spec.satisfies("+python"): + env.set("SETUPTOOLS_SCM_PRETEND_VERSION", f"{self.spec.version}") + if self.spec.satisfies("+static_openssl"): + env.set("STATIC_OPENSSL", "1") variant_flags = [ "autocomplete", "cli", @@ -106,12 +117,12 @@ def setup_build_environment(self, env): "httpfs", "icu", "inet", - "jdbc", "json", - "odbc", - "openssl", + "openssl", # Deprecate after 0.9.2 retired "parquet", "python", + "tpce", + "tpch", ] for flag in variant_flags: make_flag = "BUILD_" + flag.upper() @@ -121,6 +132,15 @@ def setup_build_environment(self, env): env.set(make_flag, "0") if self.spec.satisfies("@0.10.2:"): env.set("OVERRIDE_GIT_DESCRIBE", f"v{self.spec.version}") + if self.spec.satisfies("+extension_repo"): + env.set("LOCAL_EXTENSION_REPO", self.prefix.lib.duckdb.extensions) + if self.spec.satisfies("+extension_autoload"): + env.set("ENABLE_EXTENSION_AUTOLOADING", "1") + if self.spec.satisfies("+extension_autoinstall"): + env.set("ENABLE_EXTENSION_AUTOINSTALL", "1") + + if cmake_args: + env.set("EXTRA_CMAKE_VARIABLES", " ".join(cmake_args)) def url_for_version(self, version): return "https://github.com/duckdb/duckdb/archive/refs/tags/v{0}.tar.gz".format(version) @@ -161,6 +181,10 @@ def patch(self): "CMakeLists.txt", ) + if self.spec.satisfies("+extension_repo"): + mkdirp(self.prefix.lib.duckdb.extensions) + def install(self, spec, prefix): mkdir(prefix.bin) - install("build/release/duckdb", prefix.bin) + build_dir = join_path("build", "release") + install(join_path(build_dir, "duckdb"), prefix.bin) diff --git a/var/spack/repos/builtin/packages/e2fsprogs/package.py b/var/spack/repos/builtin/packages/e2fsprogs/package.py index 2d988bafeabdc0..baa78b5a95f312 100644 --- a/var/spack/repos/builtin/packages/e2fsprogs/package.py +++ b/var/spack/repos/builtin/packages/e2fsprogs/package.py @@ -27,6 +27,7 @@ class E2fsprogs(AutotoolsPackage): depends_on("texinfo", type="build") depends_on("fuse", when="+fuse2fs") + depends_on("pkgconfig", when="+fuse2fs") # fuse3 support is in the yet unreleased 1.47.1 patch( diff --git a/var/spack/repos/builtin/packages/easi/package.py b/var/spack/repos/builtin/packages/easi/package.py index 6eeb239244b580..e13180b6846df6 100644 --- a/var/spack/repos/builtin/packages/easi/package.py +++ b/var/spack/repos/builtin/packages/easi/package.py @@ -21,6 +21,8 @@ class Easi(CMakePackage): license("BSD-3-Clause") version("master", branch="master") + version("1.5.0", tag="v1.5.0", commit="391698ab0072f66280d08441974c2bdb04a65ce0") + version("1.4.0", tag="v1.4.0", commit="0d8fcf936574d93ddbd1d9222d46a93d4b119231") version("1.3.0", tag="v1.3.0", commit="99309a0fa78bf11d668c599b3ee469224f04d55b") version("1.2.0", tag="v1.2.0", commit="305a119338116a0ceac6b68b36841a50250d05b1") version("1.1.2", tag="v1.1.2", commit="4c87ef3b3dca9415d116ef102cb8de750ef7e1a0") diff --git a/var/spack/repos/builtin/packages/ecdsautils/package.py b/var/spack/repos/builtin/packages/ecdsautils/package.py index 1404c947e21c87..a5b7427b01743e 100644 --- a/var/spack/repos/builtin/packages/ecdsautils/package.py +++ b/var/spack/repos/builtin/packages/ecdsautils/package.py @@ -9,12 +9,17 @@ class Ecdsautils(CMakePackage): """Tiny collection of programs used for ECDSA.""" - homepage = "https://github.com/freifunk-gluon/" - url = "https://github.com/freifunk-gluon/ecdsautils/archive/v0.3.2.tar.gz" + homepage = "https://github.com/freifunk-gluon/ecdsautils/" + url = "https://github.com/freifunk-gluon/ecdsautils/archive/refs/tags/v0.3.2.tar.gz" + license("BSD-2-Clause AND MIT", checked_by="wdconinc") + + version("0.4.1", sha256="6fd827b3070afddc9e31f37f1d805f54aabf8518d2310c5c2b26cc8eb53555a8") version("0.3.2", sha256="a828417c985ccfc623bb613e92ccc8af6c6f24a5bcab8b112b90c033a816204f") version("0.3.1", sha256="4b6efe7802a089e8d64194c954a8f9981ff516b922b40d51e6c7ba565274a87a") - depends_on("c", type="build") # generated + depends_on("c", type="build") + depends_on("pkgconfig", type="build") - depends_on("libuecc", type="build") + depends_on("libuecc@3:") + depends_on("libuecc@6:", when="@0.4:") diff --git a/var/spack/repos/builtin/packages/ecflow/package.py b/var/spack/repos/builtin/packages/ecflow/package.py index 7616e64e8db11c..22762230ca1cb9 100644 --- a/var/spack/repos/builtin/packages/ecflow/package.py +++ b/var/spack/repos/builtin/packages/ecflow/package.py @@ -76,6 +76,7 @@ class Ecflow(CMakePackage): # https://github.com/JCSDA/spack-stack/issues/1001 # https://github.com/JCSDA/spack-stack/issues/1009 patch("ctsapi_cassert.patch", when="@5.11.4") + patch("vfile_cassert.patch", when="@5.11.4") @when("@:4.13.0") def patch(self): diff --git a/var/spack/repos/builtin/packages/ecflow/vfile_cassert.patch b/var/spack/repos/builtin/packages/ecflow/vfile_cassert.patch new file mode 100644 index 00000000000000..871ae9d9d51851 --- /dev/null +++ b/var/spack/repos/builtin/packages/ecflow/vfile_cassert.patch @@ -0,0 +1,10 @@ +--- a/Viewer/ecflowUI/src/VFile.cpp 2024-08-28 12:20:27.000000000 +0000 ++++ b/Viewer/ecflowUI/src/VFile.cpp 2024-08-28 12:20:51.000000000 +0000 +@@ -9,6 +9,7 @@ + + #include "VFile.hpp" + ++#include + #include + #include + #include diff --git a/var/spack/repos/builtin/packages/edm4hep/package.py b/var/spack/repos/builtin/packages/edm4hep/package.py index b795086353535e..838c11b101c8f8 100644 --- a/var/spack/repos/builtin/packages/edm4hep/package.py +++ b/var/spack/repos/builtin/packages/edm4hep/package.py @@ -21,6 +21,7 @@ class Edm4hep(CMakePackage): license("Apache-2.0") version("main", branch="main") + version("0.99.1", sha256="84d990f09dbd0ad2198596c0c51238a4b15391f51febfb15dd3d191dc7aae9f4") version("0.99", sha256="3636e8c14474237029bf1a8be11c53b57ad3ed438fd70a7e9b87c5d08f1f2ea6") version("0.10.5", sha256="003c8e0c8e1d1844592d43d41384f4320586fbfa51d4d728ae0870b9c4f78d81") version( @@ -51,10 +52,10 @@ class Edm4hep(CMakePackage): depends_on("cxx", type="build") # generated - _cxxstd_values = ("17", "20") + _cxxstd_values = (conditional("17", when="@:0.99.0"), conditional("20", when="@0.10:")) variant( "cxxstd", - default="17", + default="20", values=_cxxstd_values, multi=False, description="Use the specified C++ standard when building.", @@ -69,7 +70,8 @@ class Edm4hep(CMakePackage): depends_on("podio@1:", when="@0.99:") depends_on("podio@0.15:", when="@:0.10.5") for _std in _cxxstd_values: - depends_on("podio cxxstd=" + _std, when="cxxstd=" + _std) + for _v in _std: + depends_on(f"podio cxxstd={_v.value}", when=f"cxxstd={_v.value}") depends_on("py-jinja2", type="build") depends_on("py-pyyaml", type="build") diff --git a/var/spack/repos/builtin/packages/elsi/package.py b/var/spack/repos/builtin/packages/elsi/package.py index 25b87e28293210..e06936a754e693 100644 --- a/var/spack/repos/builtin/packages/elsi/package.py +++ b/var/spack/repos/builtin/packages/elsi/package.py @@ -18,6 +18,7 @@ class Elsi(CMakePackage, CudaPackage): license("BSD-3-Clause") + version("2.11.0", sha256="2e6929827ed9c99a32381ed9da40482e862c28608d59d4f27db7dcbcaed1520d") version("2.10.1", sha256="b3c7526d46a9139a26680787172a3df15bc648715a35bdf384053231e94ab829") version( "2.2.1", @@ -30,6 +31,8 @@ class Elsi(CMakePackage, CudaPackage): depends_on("cxx", type="build") # generated depends_on("fortran", type="build") # generated + generator("ninja") + variant( "add_underscore", default=True, @@ -65,11 +68,12 @@ class Elsi(CMakePackage, CudaPackage): ) variant( "internal_elpa_version", - default="2024", - values=("2024", "2023_11", "2023", "2021", "2020"), + default="2020", + values=("2020", "2021", conditional("2023", "2023_11", "2024", when="@:2.11")), description="Internal ELPA version", multi=False, ) + variant("dlaf", default=False, when="@2.11:", description="Enable DLA-Future support") # Basic dependencies depends_on("blas", type="link") @@ -78,7 +82,10 @@ class Elsi(CMakePackage, CudaPackage): depends_on("mpi") # Library dependencies - depends_on("ntpoly", when="+use_external_ntpoly") + with when("+use_external_ntpoly"): + depends_on("ntpoly") + depends_on("ntpoly@3:", when="@2.11:") + conflicts("^ntpoly@3:", when="@:2.10") with when("+use_external_elpa"): depends_on("elpa+cuda", when="+cuda") depends_on("elpa~cuda", when="~cuda") @@ -94,9 +101,14 @@ class Elsi(CMakePackage, CudaPackage): depends_on("pexsi+fortran") depends_on("superlu-dist+cuda", when="+cuda") depends_on("superlu-dist~cuda", when="~cuda") + conflicts("^pexsi@2:", when="@:2.11") with when("+use_external_omm"): depends_on("omm") depends_on("matrix-switch") # Direct dependency + with when("+dlaf"): + depends_on("dla-future-fortran") + conflicts("dla-future~cuda", when="+cuda") + conflicts("dla-future+cuda", when="~cuda") def cmake_args(self): libs_names = ["scalapack", "lapack", "blas"] @@ -114,6 +126,8 @@ def cmake_args(self): if self.spec.satisfies("+use_external_omm"): libs_names.append("omm") libs_names.append("matrix-switch") + if self.spec.satisfies("+dlaf"): + libs_names.append("dla-future-fortran") lib_paths, inc_paths, libs = [], [], [] for lib in libs_names: @@ -140,6 +154,7 @@ def cmake_args(self): self.define_from_variant("ADD_UNDERSCORE", "add_underscore"), self.define_from_variant("ENABLE_PEXSI", "enable_pexsi"), self.define_from_variant("ENABLE_SIPS", "enable_sips"), + self.define_from_variant("ENABLE_DLAF", "dlaf"), self.define_from_variant("USE_EXTERNAL_ELPA", "use_external_elpa"), self.define_from_variant("USE_EXTERNAL_NTPOLY", "use_external_ntpoly"), self.define_from_variant("USE_EXTERNAL_OMM", "use_external_omm"), @@ -161,6 +176,10 @@ def cmake_args(self): if self.spec.variants["elpa2_kernel"].value != "none": args.append(self.define_from_variant("ELPA2_KERNEL", "elpa2_kernel")) + if self.spec.satisfies("^elpa+cuda"): + elpa_gpu_string = "nvidia-gpu" if self.spec.satisfies("^elpa@2021:") else "gpu" + args.append(self.define(ELSI_ELPA_GPU_STRING, elpa_gpu_string)) + args.append(self.define("INC_PATHS", ";".join(set(inc_paths)))) # Only when using fujitsu compiler diff --git a/var/spack/repos/builtin/packages/emacs/package.py b/var/spack/repos/builtin/packages/emacs/package.py index 738bfd649bae75..3e428b74bcfa05 100644 --- a/var/spack/repos/builtin/packages/emacs/package.py +++ b/var/spack/repos/builtin/packages/emacs/package.py @@ -13,14 +13,17 @@ class Emacs(AutotoolsPackage, GNUMirrorPackage): """The Emacs programmable text editor.""" homepage = "https://www.gnu.org/software/emacs" - git = "git://git.savannah.gnu.org/emacs.git" + git = "https://git.savannah.gnu.org/git/emacs.git" gnu_mirror_path = "emacs/emacs-24.5.tar.gz" + list_url = " https://ftpmirror.gnu.org/emacs/" + list_depth = 0 maintainers("alecbcs") - license("GPL-3.0-or-later") + license("GPL-3.0-or-later", checked_by="wdconinc") version("master", branch="master") + version("29.4", sha256="1adb1b9a2c6cdb316609b3e86b0ba1ceb523f8de540cfdda2aec95b6a5343abf") version("29.3", sha256="2de8df5cab8ac697c69a1c46690772b0cf58fe7529f1d1999582c67d927d22e4") version("29.2", sha256="ac8773eb17d8b3c0c4a3bccbb478f7c359266b458563f9a5e2c23c53c05e4e59") version("29.1", sha256="5b80e0475b0e619d2ad395ef5bc481b7cb9f13894ed23c301210572040e4b5b1") @@ -36,10 +39,11 @@ class Emacs(AutotoolsPackage, GNUMirrorPackage): version("25.1", sha256="763344b90db4d40e9fe90c5d14748a9dbd201ce544e2cf0835ab48a0aa4a1c67") version("24.5", sha256="2737a6622fb2d9982e9c47fb6f2fb297bda42674e09db40fc9bcc0db4297c3b6") - depends_on("c", type="build") # generated - depends_on("cxx", type="build") # generated - depends_on("fortran", type="build") # generated - + variant("gui", default=False, description="Enable GUI build on Mac") + variant("json", default=False, when="@27:", description="Build with json support") + variant("native", default=False, when="@28:", description="enable native compilation of elisp") + variant("tls", default=True, description="Build Emacs with gnutls") + variant("treesitter", default=False, when="@29:", description="Build with tree-sitter support") variant("X", default=False, description="Enable an X toolkit") variant( "toolkit", @@ -47,36 +51,37 @@ class Emacs(AutotoolsPackage, GNUMirrorPackage): values=("gtk", "athena"), description="Select an X toolkit (gtk, athena)", ) - variant("gui", default=False, description="Enable GUI build on Mac") - variant("tls", default=True, description="Build Emacs with gnutls") - variant("native", default=False, when="@28:", description="enable native compilation of elisp") - variant("treesitter", default=False, when="@29:", description="Build with tree-sitter support") - variant("json", default=False, when="@27:", description="Build with json support") + depends_on("c", type="build") depends_on("pkgconfig", type="build") depends_on("gzip", type="build") + depends_on("texinfo", type="build", when="@29.4:") depends_on("ncurses") depends_on("pcre") depends_on("zlib-api") depends_on("libxml2") - depends_on("libtiff", when="+X") - depends_on("libpng", when="+X") - depends_on("libxpm", when="+X") - depends_on("giflib", when="+X") - depends_on("libx11", when="+X") - depends_on("libxaw", when="+X toolkit=athena") - depends_on("gtkplus", when="+X toolkit=gtk") - depends_on("gnutls", when="+tls") depends_on("jpeg") + depends_on("gnutls", when="+tls") depends_on("tree-sitter", when="+treesitter") + depends_on("gcc@11: +strip languages=jit", when="+native") + depends_on("jansson@2.7:", when="+json") + + with when("+X"): + depends_on("libtiff") + depends_on("libpng") + depends_on("libxpm") + depends_on("giflib") + depends_on("libx11") + depends_on("libxaw", when="toolkit=athena") + depends_on("gtkplus", when="toolkit=gtk") + + # the following dependencies are required when building from a git ref + # so that we can run reconfigure to generate a ./configure script depends_on("m4", type="build", when="@master:") depends_on("autoconf", type="build", when="@master:") depends_on("automake", type="build", when="@master:") depends_on("libtool", type="build", when="@master:") - depends_on("texinfo", type="build", when="@master:") - depends_on("gcc@11: +strip languages=jit", when="+native") - depends_on("jansson@2.7:", when="+json") conflicts("@:26.3", when="platform=darwin os=catalina") diff --git a/var/spack/repos/builtin/packages/enchant/package.py b/var/spack/repos/builtin/packages/enchant/package.py index ca045bb5f80594..673a4d4152b6d6 100644 --- a/var/spack/repos/builtin/packages/enchant/package.py +++ b/var/spack/repos/builtin/packages/enchant/package.py @@ -12,14 +12,25 @@ class Enchant(AutotoolsPackage): number of different spelling libraries and programs with a consistent interface.""" - homepage = "https://abiword.github.io/enchant/" - url = "https://github.com/AbiWord/enchant/releases/download/v2.2.5/enchant-2.2.5.tar.gz" + homepage = "https://rrthomas.github.io/enchant/" + url = "https://github.com/rrthomas/enchant/releases/download/v2.8.2/enchant-2.8.2.tar.gz" license("LGPL-2.1-or-later") + version("2.8.2", sha256="8f19535adb5577b83b00e02f330fe9b9eb40dd21f19e2899636fc4d3a7696375") + version("2.8.1", sha256="ff79de470b8eb16f53849dc49f2bce8ca4eb7decabfc1349716fe12616e52f4e") + version("2.8.0", sha256="c57add422237b8a7eed116a9a88d8be4f7b9281778fa36f03e1f2c051ecb0372") + version("2.7.3", sha256="fe6ad4cbe8c71b9384ffdef962be52d4d2bd5ebfb6351435bb390543d4f78b1e") + version("2.7.2", sha256="7cc3400a6657974a740b6e3c2568e2935c70e5302f07fadb2095366b75ecad6f") + version("2.7.1", sha256="a1cb8239095d6b0bd99ba2dd012a1402cef1a194f5de1b7214bd528676a65229") + version("2.7.0", sha256="2a073dc6ebe753196c0674a781ccf321bed25d1c6e43bffb97e2c92af420952c") + version("2.6.9", sha256="d9a5a10dc9b38a43b3a0fa22c76ed6ebb7e09eb535aff62954afcdbd40efff6b") + version("2.6.8", sha256="f565923062c77f3d58846f0558d21e6d07ca4a488c58812dfdefb35202fac7ae") + version("2.6.7", sha256="a1c2e5b59acca000bbfb24810af4a1165733d407f2154786588e076c8cd57bfc") + version("2.2.7", sha256="1b22976135812b35cb5b8d21a53ad11d5e7c1426c93f51e7a314a2a42cab3a09") version("2.2.6", sha256="8048c5bd26190b21279745cfecd05808c635bc14912e630340cd44a49b87d46d") - version("2.2.5", sha256="ffce4ea00dbda1478d91c3e1538cadfe5761d9d6c0ceb27bc3dba51882fe1c47") + version("2.2.5", sha256="ee8a663295c0e039b05d418af065ebcba9e539f785531e552e908030bec48164") version("2.2.4", sha256="f5d6b689d23c0d488671f34b02d07b84e408544b2f9f6e74fb7221982b1ecadc") version("2.2.3", sha256="abd8e915675cff54c0d4da5029d95c528362266557c61c7149d53fa069b8076d") version("2.2.2", sha256="661e0bd6e82deceb97fc94bea8c6cdbcd8ff631cfa9b7a8196de2e2aca13f54b") @@ -38,6 +49,7 @@ class Enchant(AutotoolsPackage): depends_on("glib") depends_on("aspell") depends_on("hunspell", when="+hunspell") + depends_on("groff", type="build", when="@2.6.7:") def configure_args(self): spec = self.spec diff --git a/var/spack/repos/builtin/packages/entrezdirect/package.py b/var/spack/repos/builtin/packages/entrezdirect/package.py index fd87aaca5c46b3..281a97041678d5 100644 --- a/var/spack/repos/builtin/packages/entrezdirect/package.py +++ b/var/spack/repos/builtin/packages/entrezdirect/package.py @@ -12,21 +12,97 @@ class Entrezdirect(Package): gene, variation, expression, etc.) from a UNIX terminal window.""" homepage = "https://www.ncbi.nlm.nih.gov/books/NBK179288/" + maintainers("snehring") + version( + "22.6.20240912", sha256="ddf1aab438bfe6af7cf38f725dac6f288d0daf354197665a66d4556c91129ace" + ) version( "10.7.20190114", sha256="4152749e6a3aac71a64e9367527428714ed16cf1fb6c7eff1298cca9ef144c0d" ) + resource( + name="rchive.ARM64", + placement="rchive-bin", + url="https://ftp.ncbi.nlm.nih.gov/entrez/entrezdirect/versions/22.6.20240912/rchive.ARM64.gz", + sha256="48dbd770a62505e3a52cd475f564ba8ab4a20729c318114f8177d5342c519122", + when="@22.6.20240912 platform=linux target=aarch64:", + ) + resource( + name="rchive.Linux", + placement="rchive-bin", + url="https://ftp.ncbi.nlm.nih.gov/entrez/entrezdirect/versions/22.6.20240912/rchive.Linux.gz", + sha256="2454ca3423df31f4057d1d2ce743e14eb3142d856e688dbbc6586cd9a6b7948c", + when="@22.6.20240912 platform=linux target=x86_64:", + ) + resource( + name="rchive.Silicon", + placement="rchive-bin", + url="https://ftp.ncbi.nlm.nih.gov/entrez/entrezdirect/versions/22.6.20240912/xtract.Silicon.gz", + sha256="fd7f73d42055b35783107257eb8d96cc2b65daa00c47774cf1913ab83156719c", + when="@22.6.20240912 platform=darwin target=aarch64:", + ) + resource( + name="transmute.ARM64", + placement="transmute-bin", + url="https://ftp.ncbi.nlm.nih.gov/entrez/entrezdirect/versions/22.6.20240912/transmute.ARM64.gz", + sha256="c9d5dede1c70c29839af4d40a4eb55c0788a8943dc2bde5c919c8bf0be584f34", + when="@22.6.20240912 platform=linux target=aarch64:", + ) + resource( + name="transmute.Linux", + placement="transmute-bin", + url="https://ftp.ncbi.nlm.nih.gov/entrez/entrezdirect/versions/22.6.20240912/transmute.Linux.gz", + sha256="8a8746b991494f354cb94dc46740691810b673ae1ff5235cf5a60b29fb974ac2", + when="@22.6.20240912 platform=linux target=x86_64:", + ) + resource( + name="transmute.Silicon", + placement="transmute-bin", + url="https://ftp.ncbi.nlm.nih.gov/entrez/entrezdirect/versions/22.6.20240912/transmute.Silicon.gz", + sha256="5ec32a04a29db90a98dced0dbef717da174c6a1228fdb86b94bc35d1aed26545", + when="@22.6.20240912 platform=darwin target=aarch64:", + ) + resource( + name="xtract.ARM64", + placement="xtract-bin", + url="https://ftp.ncbi.nlm.nih.gov/entrez/entrezdirect/versions/22.6.20240912/xtract.ARM64.gz", + sha256="1d62f612b2be6265c517af6c7a5d6bec0ce3f11bcccc6602a78ce1113bd4fc6c", + when="@22.6.20240912 platform=linux target=aarch64:", + ) + resource( + name="xtract.Linux", + placement="xtract-bin", + url="https://ftp.ncbi.nlm.nih.gov/entrez/entrezdirect/versions/22.6.20240912/xtract.Linux.gz", + sha256="cc3994ce640cfe9ed67f4b8c31d6d22d006503c11a8506d50a5a9fe7c0b59124", + when="@22.6.20240912 platform=linux target=x86_64:", + ) + resource( + name="xtract.Silicon", + placement="xtract-bin", + url="https://ftp.ncbi.nlm.nih.gov/entrez/entrezdirect/versions/22.6.20240912/xtract.Silicon.gz", + sha256="fd7f73d42055b35783107257eb8d96cc2b65daa00c47774cf1913ab83156719c", + when="@22.6.20240912 platform=darwin target=aarch64:", + ) + + depends_on("curl", type="run") depends_on("perl", type="run") depends_on("perl-html-parser", type="run") depends_on("perl-libwww-perl", type="run") depends_on("perl-lwp-protocol-https", type="run") depends_on("perl-http-message", type="run") depends_on("perl-xml-simple", type="run") + depends_on("python", type="run", when="@22:") def url_for_version(self, ver): - pfx = "ftp://ftp.ncbi.nlm.nih.gov/entrez/entrezdirect/versions/" + pfx = "https://ftp.ncbi.nlm.nih.gov/entrez/entrezdirect/versions/" return pfx + "{0}/edirect-{0}.tar.gz".format(ver.dotted) def install(self, spec, prefix): + for i in ["rchive", "transmute", "xtract"]: + src = f"{i}-bin" + exe = find(src, "*")[0] + set_executable(exe) + copy(exe, ".") + remove_linked_tree(src) install_tree(".", prefix.bin) diff --git a/var/spack/repos/builtin/packages/eospac/package.py b/var/spack/repos/builtin/packages/eospac/package.py index 50c06577994bcd..c245a0d50a92f8 100644 --- a/var/spack/repos/builtin/packages/eospac/package.py +++ b/var/spack/repos/builtin/packages/eospac/package.py @@ -22,9 +22,18 @@ class Eospac(Package): # previous stable release will appear first as a new beta. # - alpha and beta versions are marked with 'deprecated=True' to help # spack's version comparison. + version( + "6.5.11", + sha256="ed821b5a1bf45df1443d5f72d86190317ed9f5bad6a7c73e23bb4365bd76e24c", + url="https://laws.lanl.gov/projects/data/eos/get_file.php?package=eospac&filename=eospac_v6.5.11_e87627a204786491b3316d7fe3bda14dd9b52ce7.tgz", + ) + version( + "6.5.10", + sha256="ddf8475ec41df1102ac9d85404a1954e39d8e410f0f2babafabd218cba9812eb", + url="https://laws.lanl.gov/projects/data/eos/get_file.php?package=eospac&filename=eospac_v6.5.10_3bf1ad6aab64ad0c665a48978315ba2383ab294f.tgz", + ) version( "6.5.9", - preferred=True, sha256="54df29b1dc3b35c654ef2ebfbfa42d960a230cfb2d3c04a75ba93d3a789a312a", url="https://laws.lanl.gov/projects/data/eos/get_file.php?package=eospac&filename=eospac_v6.5.9_4c633156bacc7b721bdd2735e40e09984a4d60a3.tgz", ) diff --git a/var/spack/repos/builtin/packages/esmf/package.py b/var/spack/repos/builtin/packages/esmf/package.py index 7c6d5e7dbb312d..c953465b6e76b6 100644 --- a/var/spack/repos/builtin/packages/esmf/package.py +++ b/var/spack/repos/builtin/packages/esmf/package.py @@ -29,6 +29,7 @@ class Esmf(MakefilePackage, PythonExtension): # Develop is a special name for spack and is always considered the newest version version("develop", branch="develop") # generate chksum with 'spack checksum esmf@x.y.z' + version("8.7.0", sha256="d7ab266e2af8c8b230721d4df59e61aa03c612a95cc39c07a2d5695746f21f56") version("8.6.1", sha256="dc270dcba1c0b317f5c9c6a32ab334cb79468dda283d1e395d98ed2a22866364") version("8.6.0", sha256="ed057eaddb158a3cce2afc0712b49353b7038b45b29aee86180f381457c0ebe7") version("8.5.0", sha256="acd0b2641587007cc3ca318427f47b9cae5bfd2da8d2a16ea778f637107c29c4") diff --git a/var/spack/repos/builtin/packages/evemu/package.py b/var/spack/repos/builtin/packages/evemu/package.py index fee10a7f91eb21..b9c4340a56a1ff 100644 --- a/var/spack/repos/builtin/packages/evemu/package.py +++ b/var/spack/repos/builtin/packages/evemu/package.py @@ -10,17 +10,18 @@ class Evemu(AutotoolsPackage): """The evemu library and tools are used to describe devices, record data, create devices and replay data from kernel evdev devices.""" - homepage = "https://github.com/freedesktop/evemu" - url = "https://github.com/freedesktop/evemu/archive/v2.7.0.tar.gz" + homepage = "https://gitlab.freedesktop.org/libevdev/evemu" + url = "https://gitlab.freedesktop.org/libevdev/evemu/-/archive/v2.7.0/evemu-v2.7.0.tar.gz" license("LGPL-3.0-only") - version("2.7.0", sha256="aee1ecc2b6761134470316d97208b173adb4686dc72548b82b2c2b5d1e5dc259") - version("2.6.0", sha256="dc2382bee4dcb6c413271d586dc11d9b4372a70fa2b66b1e53a7107f2f9f51f8") - version("2.5.0", sha256="ab7cce32800db84ab3504789583d1be0d9b0a5f2689389691367b18cf059b09f") - version("2.4.0", sha256="d346ec59289f588bd93fe3cfa40858c7e048660164338787da79b9ebe3256069") - version("2.3.1", sha256="f2dd97310520bc7824adc38b69ead22c53944a666810c60a3e49592914e14e8a") + version("2.7.0", sha256="b4ba7458ccb394e9afdb2562c9809e9e90fd1099e8a028d05de3f12349ab6afa") + version("2.6.0", sha256="2efa4abb51f9f35a48605db51ab835cf688f02f6041d48607e78e11ec3524ac8") + version("2.5.0", sha256="1d88b2a81db36b6018cdc3e8d57fbb95e3a5df9e6806cd7b3d29c579a7113d4f") + version("2.4.0", sha256="ea8e7147550432321418ae1161a909e054ff482c86a6a1631f727171791a501d") + version("2.3.1", sha256="fbe77a083ed4328e76e2882fb164efc925b308b83e879b518136ee54d74def46") + depends_on("c", type="build") depends_on("autoconf", type="build") depends_on("automake", type="build") depends_on("libtool", type="build") diff --git a/var/spack/repos/builtin/packages/exaca/package.py b/var/spack/repos/builtin/packages/exaca/package.py index ce79d0ad6bd46e..3ca8bcb7a013d1 100644 --- a/var/spack/repos/builtin/packages/exaca/package.py +++ b/var/spack/repos/builtin/packages/exaca/package.py @@ -7,12 +7,12 @@ from spack.pkg.builtin.kokkos import Kokkos -class Exaca(CMakePackage): +class Exaca(CMakePackage, CudaPackage, ROCmPackage): """ExaCA: an exascale cellular automata application for alloy solidification modeling""" homepage = "https://github.com/LLNL/ExaCA" git = "https://github.com/LLNL/ExaCA.git" - url = "https://github.com/LLNL/ExaCA/archive/1.2.0.tar.gz" + url = "https://github.com/LLNL/ExaCA/archive/2.0.0.tar.gz" maintainers("streeve", "MattRolchigo") @@ -21,6 +21,8 @@ class Exaca(CMakePackage): license("MIT") version("master", branch="master") + version("2.0.0", sha256="a33cc65a6e79bed37a644f5bfc9dd5fe356239f78c5b82830c6354acc43e016b") + version("1.3.0", sha256="637215d3c64e8007b55d68bea6003b51671029d9045af847534e0e59c4271a94") version("1.2.0", sha256="5038d63de96c6142ddea956998e1f4ebffbc4a5723caa4da0e73eb185e6623e4") version("1.1.0", sha256="10106fb1836964a19bc5bab3f374baa24188ba786c768e554442ab896b31ff24") version("1.0.0", sha256="48556233360a5e15e1fc20849e57dd60739c1991c7dfc7e6b2956af06688b96a") @@ -40,13 +42,38 @@ class Exaca(CMakePackage): depends_on("googletest@1.10:", type="test", when="@1.1:+testing") depends_on("kokkos@3.0:", when="@:1.1") depends_on("kokkos@3.2:", when="@1.2:") + depends_on("kokkos@4.0:", when="@1.3:") depends_on("mpi") depends_on("nlohmann-json", when="@1.2:") + for _backend in _kokkos_backends: + # Handled separately below + if _backend != "cuda" and _backend != "rocm": + _backend_dep = "+{0}".format(_backend) + depends_on("kokkos {0}".format(_backend_dep), when=_backend_dep) + + for arch in CudaPackage.cuda_arch_values: + cuda_dep = "+cuda cuda_arch={0}".format(arch) + depends_on("kokkos {0}".format(cuda_dep), when=cuda_dep) + for arch in ROCmPackage.amdgpu_targets: + rocm_dep = "+rocm amdgpu_target={0}".format(arch) + depends_on("kokkos {0}".format(rocm_dep), when=rocm_dep) + def cmake_args(self): options = [self.define_from_variant("BUILD_SHARED_LIBS", "shared")] if self.spec.satisfies("@1.1:"): options += [self.define_from_variant("ExaCA_ENABLE_TESTING", "testing")] + # Only release with optional json + if self.spec.satisfies("@1.2"): + options += [self.define("ExaCA_ENABLE_JSON", "ON")] + # Use the json dependency, not an internal download + if self.spec.satisfies("@2.0:"): + options += [self.define("ExaCA_REQUIRE_EXTERNAL_JSON", "ON")] + + # Use hipcc if compiling for rocm. Modifying this instead of CMAKE_CXX_COMPILER + # keeps the spack wrapper + if self.spec.satisfies("+rocm"): + env["SPACK_CXX"] = self.spec["hip"].hipcc return options diff --git a/var/spack/repos/builtin/packages/expat/package.py b/var/spack/repos/builtin/packages/expat/package.py index 893fd1037afa9a..a41d4912de8415 100644 --- a/var/spack/repos/builtin/packages/expat/package.py +++ b/var/spack/repos/builtin/packages/expat/package.py @@ -17,8 +17,16 @@ class Expat(AutotoolsPackage, CMakePackage): license("MIT") - version("2.6.2", sha256="9c7c1b5dcbc3c237c500a8fb1493e14d9582146dd9b42aa8d3ffb856a3b927e0") - # deprecate all releases before 2.6.2 because of security issues + version("2.6.3", sha256="b8baef92f328eebcf731f4d18103951c61fa8c8ec21d5ff4202fb6f2198aeb2d") + # deprecate all releases before 2.6.3 because of security issues + # CVE-2024-45490 (fixed in 2.6.3) + # CVE-2024-45491 (fixed in 2.6.3) + # CVE-2024-45492 (fixed in 2.6.3) + version( + "2.6.2", + sha256="9c7c1b5dcbc3c237c500a8fb1493e14d9582146dd9b42aa8d3ffb856a3b927e0", + deprecated=True, + ) # CVE-2024-28757 (fixed in 2.6.2) version( "2.6.1", diff --git a/var/spack/repos/builtin/packages/faiss/package.py b/var/spack/repos/builtin/packages/faiss/package.py index a7e415a6df92eb..5af55c95df5103 100644 --- a/var/spack/repos/builtin/packages/faiss/package.py +++ b/var/spack/repos/builtin/packages/faiss/package.py @@ -30,6 +30,7 @@ class Faiss(AutotoolsPackage, CMakePackage, CudaPackage): license("MIT") + version("1.8.0", sha256="56ece0a419d62eaa11e39022fa27c8ed6d5a9b9eb7416cc5a0fdbeab07ec2f0c") version("1.7.4", sha256="d9a7b31bf7fd6eb32c10b7ea7ff918160eed5be04fe63bb7b4b4b5f2bbde01ad") version("1.7.2", sha256="d49b4afd6a7a5b64f260a236ee9b2efb760edb08c33d5ea5610c2f078a5995ec") version("1.6.3", sha256="e1a41c159f0b896975fbb133e0240a233af5c9286c09a28fde6aefff5336e542") @@ -45,6 +46,7 @@ class Faiss(AutotoolsPackage, CMakePackage, CudaPackage): conflicts("+tests", when="~python", msg="+tests must be accompanied by +python") depends_on("cmake@3.17:", when="build_system=cmake", type="build") + depends_on("cmake@3.23.1:", when="build_system=cmake @1.7.4:", type="build") extends("python", when="+python") depends_on("python@3.7:", when="+python", type=("build", "run")) @@ -79,7 +81,7 @@ class Faiss(AutotoolsPackage, CMakePackage, CudaPackage): patch("fixes-in-v1.7.2.patch", when="@1.7.2") def setup_run_environment(self, env): - if "+python" in self.spec: + if self.spec.satisfies("+python"): env.prepend_path("PYTHONPATH", python_platlib) if self.spec.satisfies("platform=darwin"): env.append_path( @@ -100,7 +102,7 @@ def cmake_args(self): self.define("FAISS_OPT_LEVEL", "generic"), ] - if "+cuda" in spec: + if spec.satisfies("+cuda"): key = "CMAKE_CUDA_ARCHITECTURES" args.append(self.define_from_variant(key, "cuda_arch")) # args.append(self.define_from_variant( @@ -109,7 +111,7 @@ def cmake_args(self): def install(self, pkg, spec, prefix): super().install(pkg, spec, prefix) - if "+python" in spec: + if spec.satisfies("+python"): class CustomPythonPipBuilder(spack.build_systems.python.PythonPipBuilder): def __init__(self, pkg, build_dirname): @@ -133,17 +135,17 @@ def configure_args(self): def build(self, pkg, spec, prefix): make() - if "+python" in self.spec: + if self.spec.satisfies("+python"): make("-C", "python") # CPU tests - if "+tests" in self.spec: + if self.spec.satisfies("+tests"): with working_dir("tests"): make("gtest") make("tests") # GPU tests - if "+tests+cuda" in self.spec: + if self.spec.satisfies("+tests+cuda"): with working_dir(os.path.join("gpu", "test")): make("gtest") make("build") # target added by the patch @@ -152,7 +154,7 @@ def build(self, pkg, spec, prefix): def install(self, pkg, spec, prefix): make("install") - if "+python" in self.spec: + if self.spec.satisfies("+python"): with working_dir("python"): args = std_pip_args + ["--prefix=" + prefix, "."] pip(*args) @@ -174,7 +176,7 @@ def _prefix_and_install(file): _prefix_and_install("TestCpu") # GPU tests - if "+cuda" in self.spec: + if self.spec.satisfies("+cuda"): with working_dir(os.path.join("gpu", "test")): _prefix_and_install("TestGpuIndexFlat") _prefix_and_install("TestGpuIndexBinaryFlat") diff --git a/var/spack/repos/builtin/packages/fast-float/package.py b/var/spack/repos/builtin/packages/fast-float/package.py new file mode 100644 index 00000000000000..00872846e512da --- /dev/null +++ b/var/spack/repos/builtin/packages/fast-float/package.py @@ -0,0 +1,36 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class FastFloat(CMakePackage): + """Fast and exact implementation of the C++ from_chars functions for number + types.""" + + homepage = "https://github.com/fastfloat/fast_float" + url = "https://github.com/fastfloat/fast_float/archive/refs/tags/v6.1.4.tar.gz" + + license("Apache-2.0 OR BSL-1.0 OR MIT", checked_by="pranav-sivararamn") + + version("6.1.6", sha256="4458aae4b0eb55717968edda42987cabf5f7fc737aee8fede87a70035dba9ab0") + version("6.1.5", sha256="597126ff5edc3ee59d502c210ded229401a30dafecb96a513135e9719fcad55f") + version("6.1.4", sha256="12cb6d250824160ca16bcb9d51f0ca7693d0d10cb444f34f1093bc02acfce704") + + depends_on("cxx", type="build") + depends_on("cmake@3.9:", type="build") + + depends_on("doctest", type="test") + + patch( + "https://github.com/fastfloat/fast_float/commit/a7ed4e89c7444b5c8585453fc6d015c0efdf8654.patch?full_index=1", + sha256="25561aa7db452da458fb0ae3075ef8e63ccab174ca8f5a6c79fb15cb342b3683", + when="@:6.1.5", + ) + + def cmake_args(self): + args = [self.define("FASTFLOAT_TEST", self.run_tests), self.define("SYSTEM_DOCTEST", True)] + + return args diff --git a/var/spack/repos/builtin/packages/fastjet/package.py b/var/spack/repos/builtin/packages/fastjet/package.py index e5b83176a7d454..c2738a3bbf0cd5 100644 --- a/var/spack/repos/builtin/packages/fastjet/package.py +++ b/var/spack/repos/builtin/packages/fastjet/package.py @@ -58,11 +58,12 @@ class Fastjet(AutotoolsPackage): version("2.3.2", sha256="ba8b17fcc8edae16faa74608e8da53e87a8c574aa21a28c985ea0dfedcb95210") version("2.3.1", sha256="16c32b420e1aa7d0b6fecddd980ea0f2b7e3c2c66585e06f0eb3142677ab6ccf") version("2.3.0", sha256="e452fe4a9716627bcdb726cfb0917f46a7ac31f6006330a6ccc1abc43d9c2d53") - - depends_on("cxx", type="build") # generated - depends_on("fortran", type="build") # generated # older version use .tar instead of .tar.gz extension, to be added + depends_on("cxx", type="build") + depends_on("fortran", type="build", when="plugins=all") + depends_on("fortran", type="build", when="plugins=pxcone") + variant("shared", default=True, description="Builds a shared version of the library") variant("auto-ptr", default=False, description="Use auto_ptr") variant( @@ -99,9 +100,9 @@ class Fastjet(AutotoolsPackage): ) variant( "plugins", - multi=True, - values=("all", "cxx") + available_plugins, - default="all", + values=disjoint_sets(("all",), ("cxx",), available_plugins) + .prohibit_empty_set() + .with_default("all"), description="List of plugins to enable, or 'cxx' or 'all'", ) diff --git a/var/spack/repos/builtin/packages/fasttransforms/package.py b/var/spack/repos/builtin/packages/fasttransforms/package.py index 63e90ee45cc790..585caec673db46 100644 --- a/var/spack/repos/builtin/packages/fasttransforms/package.py +++ b/var/spack/repos/builtin/packages/fasttransforms/package.py @@ -32,9 +32,9 @@ class Fasttransforms(MakefilePackage): def build(self, spec, prefix): makeargs = ["CC=cc"] - if "openblas" in spec: + if spec.satisfies("openblas"): makeargs += ["FT_BLAS=openblas"] - if "quadmath" in spec: + if spec.satisfies("quadmath"): makeargs += ["FT_QUADMATH=1"] make("assembly", *makeargs) make("lib", *makeargs) diff --git a/var/spack/repos/builtin/packages/fasttree/package.py b/var/spack/repos/builtin/packages/fasttree/package.py index 8a766c29770fbd..3d26bbd290573e 100644 --- a/var/spack/repos/builtin/packages/fasttree/package.py +++ b/var/spack/repos/builtin/packages/fasttree/package.py @@ -34,7 +34,7 @@ class Fasttree(Package): def install(self, spec, prefix): cc = Executable(spack_cc) - if "+openmp" in self.spec: + if self.spec.satisfies("+openmp"): cc( "-O3", self.compiler.openmp_flag, @@ -63,5 +63,5 @@ def install(self, spec, prefix): @run_after("install") def create_fasttree_mp_symlink(self): with working_dir(prefix.bin): - if "+openmp" in self.spec: + if self.spec.satisfies("+openmp"): symlink("FastTree", "FastTreeMP") diff --git a/var/spack/repos/builtin/packages/fckit/package.py b/var/spack/repos/builtin/packages/fckit/package.py index ddea92b5064d73..89b1e3105e95b6 100644 --- a/var/spack/repos/builtin/packages/fckit/package.py +++ b/var/spack/repos/builtin/packages/fckit/package.py @@ -68,7 +68,7 @@ def cmake_args(self): "-DFYPP_NO_LINE_NUMBERING=ON", ] - if "~shared" in self.spec: + if self.spec.satisfies("~shared"): args.append("-DBUILD_SHARED_LIBS=OFF") if "finalize_ddts=auto" not in self.spec: diff --git a/var/spack/repos/builtin/packages/fd/package.py b/var/spack/repos/builtin/packages/fd/package.py index 4f4887c1a24ae9..59bb889fca5c82 100644 --- a/var/spack/repos/builtin/packages/fd/package.py +++ b/var/spack/repos/builtin/packages/fd/package.py @@ -16,8 +16,29 @@ class Fd(CargoPackage): license("Apache-2.0 OR MIT") + version("10.2.0", sha256="73329fe24c53f0ca47cd0939256ca5c4644742cb7c14cf4114c8c9871336d342") version("10.1.0", sha256="ee4b2403388344ff60125c79ff25b7895a170e7960f243ba2b5d51d2c3712d97") version("9.0.0", sha256="306d7662994e06e23d25587246fa3fb1f528579e42a84f5128e75feec635a370") version("8.7.0", sha256="13da15f3197d58a54768aaad0099c80ad2e9756dd1b0c7df68c413ad2d5238c9") version("8.4.0", sha256="d0c2fc7ddbe74e3fd88bf5bb02e0f69078ee6d2aeea3d8df42f508543c9db05d") version("7.4.0", sha256="33570ba65e7f8b438746cb92bb9bc4a6030b482a0d50db37c830c4e315877537") + + depends_on("rust@1.64:", type="build", when="@8.7:") + depends_on("rust@1.70:", type="build", when="@8.7.1:") + depends_on("rust@1.77.2:", type="build", when="@10:") + + @run_after("install") + def install_completions(self): + fd = Executable(self.prefix.bin.fd) + + mkdirp(bash_completion_path(self.prefix)) + with open(bash_completion_path(self.prefix) / "fd", "w") as file: + fd("--gen-completions", "bash", output=file) + + mkdirp(fish_completion_path(self.prefix)) + with open(fish_completion_path(self.prefix) / "fd.fish", "w") as file: + fd("--gen-completions", "fish", output=file) + + mkdirp(zsh_completion_path(self.prefix)) + with open(zsh_completion_path(self.prefix) / "_fd", "w") as file: + fd("--gen-completions", "zsh", output=file) diff --git a/var/spack/repos/builtin/packages/fds/package.py b/var/spack/repos/builtin/packages/fds/package.py index e4707f92076a00..3143eddde07390 100644 --- a/var/spack/repos/builtin/packages/fds/package.py +++ b/var/spack/repos/builtin/packages/fds/package.py @@ -21,8 +21,14 @@ class Fds(MakefilePackage): url = "https://github.com/firemodels/fds/archive/refs/tags/FDS-6.8.0.tar.gz" git = "https://github.com/firemodels/fds.git" + version("6.9.1", commit="889da6ae08d08dae680f7c0d8de66a3ad1c65375") + version("6.9.0", commit="63395692607884566fdedb5db4b5b4d98d3bcafb") version("6.8.0", commit="886e0096535519b7358a3c4393c91da3caee5072") + variant("openmp", default=False, description="Enable OpenMP support") + + conflicts("%gcc", when="+openmp", msg="GCC already provides OpenMP support") + depends_on("fortran", type="build") # generated depends_on("mpi") @@ -86,11 +92,12 @@ def build_targets(self): mpi_prefix = mpi_mapping[spec["mpi"].name] compiler_prefix = compiler_mapping[spec.compiler.name] platform_prefix = platform_mapping[spec.architecture.platform] - return ["{}_{}_{}".format(mpi_prefix, compiler_prefix, platform_prefix)] + openmp_prefix = "_openmp" if "+openmp" in spec else "" + return [f"{mpi_prefix}_{compiler_prefix}_{platform_prefix}{openmp_prefix}"] def install(self, spec, prefix): mkdirp(prefix.bin) with working_dir(self.build_directory): install("*.mod", prefix.bin) install("*.o", prefix.bin) - install("fds_" + self.build_targets[0], prefix.bin + "/fds") + install("fds_" + self.build_targets[0], join_path(prefix.bin, "fds")) diff --git a/var/spack/repos/builtin/packages/fenics-basix/package.py b/var/spack/repos/builtin/packages/fenics-basix/package.py index c42092c2f1a30a..9a154a05672104 100644 --- a/var/spack/repos/builtin/packages/fenics-basix/package.py +++ b/var/spack/repos/builtin/packages/fenics-basix/package.py @@ -17,13 +17,15 @@ class FenicsBasix(CMakePackage): license("MIT") version("main", branch="main") + version("0.9.0", sha256="60e96b2393084729b261cb10370f0e44d12735ab3dbd1f15890dec23b9e85329") version("0.8.0", sha256="b299af82daf8fa3e4845e17f202491fe71b313bf6ab64c767a5287190b3dd7fe") version("0.7.0", sha256="9bee81b396ee452eec8d9735f278cb44cb6994c6bc30aec8ed9bb4b12d83fa7f") version("0.6.0", sha256="687ae53153c98facac4080dcdc7081701db1dcea8c5e7ae3feb72aec17f83304") depends_on("cxx", type="build") # generated - depends_on("cmake@3.19:", type="build") + depends_on("cmake@3.21:", when="@0.9:", type="build") + depends_on("cmake@3.19:", when="@:0.8", type="build") depends_on("blas") depends_on("lapack") diff --git a/var/spack/repos/builtin/packages/fenics-ufcx/package.py b/var/spack/repos/builtin/packages/fenics-ufcx/package.py index fdbc09cbc5bf52..12b9808bef602a 100644 --- a/var/spack/repos/builtin/packages/fenics-ufcx/package.py +++ b/var/spack/repos/builtin/packages/fenics-ufcx/package.py @@ -19,6 +19,7 @@ class FenicsUfcx(CMakePackage): license("LGPL-3.0-or-later") version("main", branch="main") + version("0.9.0", sha256="afa517272a3d2249f513cb711c50b77cf8368dd0b8f5ea4b759142229204a448") version("0.8.0", sha256="8a854782dbd119ec1c23c4522a2134d5281e7f1bd2f37d64489f75da055282e3") version("0.7.0", sha256="7f3c3ca91d63ce7831d37799cc19d0551bdcd275bdfa4c099711679533dd1c71") version("0.6.0", sha256="076fad61d406afffd41019ae1abf6da3f76406c035c772abad2156127667980e") diff --git a/var/spack/repos/builtin/packages/fenics/package.py b/var/spack/repos/builtin/packages/fenics/package.py index 0cd60596fbf656..ec9d77b5c4ad1a 100644 --- a/var/spack/repos/builtin/packages/fenics/package.py +++ b/var/spack/repos/builtin/packages/fenics/package.py @@ -192,7 +192,7 @@ def setup_run_environment(self, env): # build python interface of dolfin @run_after("install") def install_python_interface(self): - if "+python" in self.spec: + if self.spec.satisfies("+python"): with working_dir("python"): args = std_pip_args + ["--prefix=" + self.prefix, "."] pip(*args) diff --git a/var/spack/repos/builtin/packages/ferret/package.py b/var/spack/repos/builtin/packages/ferret/package.py index dea3a7fbb634f0..9e9a317b476fa9 100644 --- a/var/spack/repos/builtin/packages/ferret/package.py +++ b/var/spack/repos/builtin/packages/ferret/package.py @@ -80,7 +80,7 @@ def patch(self): work_dir = "FERRET" if "@:7.2" in spec else "." with working_dir(work_dir, create=False): - if "@7.3:" in spec: + if spec.satisfies("@7.3:"): copy("site_specific.mk.in", "site_specific.mk") copy( "external_functions/ef_utility/site_specific.mk.in", @@ -111,7 +111,7 @@ def patch(self): r"^(NETCDF4?_(LIB)?DIR).+", "\\1 = %s" % netcdff_prefix, "site_specific.mk" ) - if "@:7.3" in spec: + if spec.satisfies("@:7.3"): # Don't force using the static version of libz filter_file( r"\$\(LIBZ_DIR\)/lib64/libz.a", "-lz", "platform_specific.mk.x86_64-linux" @@ -137,7 +137,7 @@ def patch(self): # Don't force using the static version of libgfortran filter_file(r"-static-libgfortran", "", "platform_specific.mk.x86_64-linux") - if "@:7.4" in spec: + if spec.satisfies("@:7.4"): compilers_spec_file = "platform_specific.mk.x86_64-linux" else: compilers_spec_file = "site_specific.mk" @@ -182,7 +182,7 @@ def install(self, spec, prefix): make(parallel=False) make("install") - if "+datasets" in self.spec: + if self.spec.satisfies("+datasets"): mkdir(self.prefix.fer_dsets) install_tree("fer_dsets", self.prefix.fer_dsets) @@ -199,7 +199,7 @@ def setup_run_environment(self, env): fer_descr = ["."] fer_grids = ["."] - if "+datasets" in self.spec: + if self.spec.satisfies("+datasets"): env.set("FER_DSETS", self.prefix.fer_dsets) fer_data.append(self.prefix.fer_dsets.data) diff --git a/var/spack/repos/builtin/packages/ffmpeg/package.py b/var/spack/repos/builtin/packages/ffmpeg/package.py index c9b944106a5d29..e2e55b1e709c75 100644 --- a/var/spack/repos/builtin/packages/ffmpeg/package.py +++ b/var/spack/repos/builtin/packages/ffmpeg/package.py @@ -16,15 +16,13 @@ class Ffmpeg(AutotoolsPackage): maintainers("xjrc") - license("GPL-2.0-or-later AND LGPL-2.1-or-later") + license("LGPL-2.1-or-later", when="~gpl", checked_by="wdconinc") + license("LGPL-2.1-or-later AND GPL-2.0-or-later", when="+gpl", checked_by="wdconinc") version("master", branch="master") + version("7.0.2", sha256="1ed250407ea8f955cca2f1139da3229fbc13032a0802e4b744be195865ff1541") version("7.0", sha256="a24d9074bf5523a65aaa9e7bd02afe4109ce79d69bd77d104fed3dab4b934d7a") - version( - "6.1.1", - sha256="5e3133939a61ef64ac9b47ffd29a5ea6e337a4023ef0ad972094b4da844e3a20", - preferred=True, - ) + version("6.1.1", sha256="5e3133939a61ef64ac9b47ffd29a5ea6e337a4023ef0ad972094b4da844e3a20") version("6.0", sha256="47d062731c9f66a78380e35a19aac77cebceccd1c7cc309b9c82343ffc430c3d") version("5.1.4", sha256="c3c1e316bf91468738dd0aff6eb1faab409f1edcd34fd1a4213626439bc5d743") version("5.1.3", sha256="5d5bef6a11f0c500588f9870ec965a30acc0d54d8b1e535da6554a32902d236d") @@ -51,7 +49,7 @@ class Ffmpeg(AutotoolsPackage): variant( "gpl", default=True, - description="allow use of GPL code, the resulting libs " "and binaries will be under GPL", + description="allow use of GPL code, the resulting libs and binaries will be under GPL", ) variant("version3", default=True, description="upgrade (L)GPL to version 3") variant( @@ -183,7 +181,6 @@ def headers(self): @when("@:6.0 %apple-clang@15:") def setup_build_environment(self, env): - env.append_flags("LDFLAGS", "-Wl,-ld_classic") if self.spec.satisfies("@:3"): env.append_flags("CFLAGS", "-Wno-error=incompatible-function-pointer-types") diff --git a/var/spack/repos/builtin/packages/ffte/package.py b/var/spack/repos/builtin/packages/ffte/package.py index e9b479be0ef6b2..af0a89e94b3e0e 100644 --- a/var/spack/repos/builtin/packages/ffte/package.py +++ b/var/spack/repos/builtin/packages/ffte/package.py @@ -87,7 +87,7 @@ def edit(self, spec, prefix): def install(self, spec, prefix): self.edit(spec, prefix) - if "+mpi" in spec: + if spec.satisfies("+mpi"): env["CC"] = spec["mpi"].mpicc env["F77"] = spec["mpi"].mpif77 env["FC"] = spec["mpi"].mpifc @@ -103,5 +103,5 @@ def install(self, spec, prefix): make() mkdirp(prefix.lib) install("libffte.a", prefix.lib) - if "+mpi" in spec: + if spec.satisfies("+mpi"): install("mpi/libfftempi.a", prefix.lib) diff --git a/var/spack/repos/builtin/packages/fftw/package.py b/var/spack/repos/builtin/packages/fftw/package.py index 3c20fac5663334..44aace9f3ed3d4 100644 --- a/var/spack/repos/builtin/packages/fftw/package.py +++ b/var/spack/repos/builtin/packages/fftw/package.py @@ -79,7 +79,7 @@ def patch(self): os.rename("fftw/config.h", "fftw/config.h.SPACK_RENAMED") def autoreconf(self, spec, prefix): - if "+pfft_patches" in spec: + if spec.satisfies("+pfft_patches"): autoreconf = which("autoreconf") autoreconf("-ifv") @@ -114,13 +114,13 @@ def configure(self, spec, prefix): options.append("--enable-type-prefix") # Variants that affect every precision - if "+openmp" in spec: + if spec.satisfies("+openmp"): options.append("--enable-openmp") if spec.satisfies("@:2"): # TODO: libtool strips CFLAGS, so 2.x libxfftw_threads # isn't linked to the openmp library. Patch Makefile? options.insert(0, "CFLAGS=" + self.compiler.openmp_flag) - if "+mpi" in spec: + if spec.satisfies("+mpi"): options.append("--enable-mpi") # Specific SIMD support. @@ -247,6 +247,11 @@ class Fftw(FftwBase): provides("fftw-api@3", when="@3:") patch("pfft-3.3.9.patch", when="@3.3.9:+pfft_patches", level=0) + patch( + "https://github.com/FFTW/fftw3/commit/f69fef7aa546d4477a2a3fd7f13fa8b2f6c54af7.patch?full_index=1", + sha256="872cff9a7d346e91a108ffd3540bfcebeb8cf86c7f40f6b31fd07a80267cbf53", + when="@3.3.7:", + ) patch("pfft-3.3.5.patch", when="@3.3.5:3.3.8+pfft_patches", level=0) patch("pfft-3.3.4.patch", when="@3.3.4+pfft_patches", level=0) patch("pgi-3.3.6-pl2.patch", when="@3.3.6-pl2%pgi", level=0) diff --git a/var/spack/repos/builtin/packages/fftx/package.py b/var/spack/repos/builtin/packages/fftx/package.py index b131288a471ae9..96ed533315bf18 100644 --- a/var/spack/repos/builtin/packages/fftx/package.py +++ b/var/spack/repos/builtin/packages/fftx/package.py @@ -43,9 +43,9 @@ def create_lib_source_code(self): # What config should be built -- driven by spec spec = self.spec backend = "CPU" - if "+cuda" in spec: + if spec.satisfies("+cuda"): backend = "CUDA" - if "+rocm" in spec: + if spec.satisfies("+rocm"): backend = "HIP" self.build_config = "-D_codegen=%s" % backend @@ -58,7 +58,7 @@ def cmake_args(self): spec = self.spec args = ["-DSPIRAL_HOME:STRING={0}".format(spec["spiral-software"].prefix)] args.append("-DCMAKE_INSTALL_PREFIX:PATH={0}".format(self.prefix)) - if "+rocm" in spec: + if spec.satisfies("+rocm"): args.append("-DCMAKE_CXX_COMPILER={0}".format(self.spec["hip"].hipcc)) args.append(self.build_config) diff --git a/var/spack/repos/builtin/packages/fio/package.py b/var/spack/repos/builtin/packages/fio/package.py index d9875f4039fd34..554e8f97c136bc 100644 --- a/var/spack/repos/builtin/packages/fio/package.py +++ b/var/spack/repos/builtin/packages/fio/package.py @@ -3,7 +3,6 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) - from spack.package import * @@ -31,33 +30,32 @@ class Fio(AutotoolsPackage): version("3.16", sha256="c7731a9e831581bab7104da9ea60c9f44e594438dbe95dff26726ca0285e7b93") version("2.19", sha256="61fb03a18703269b781aaf195cb0d7931493bbb5bfcc8eb746d5d66d04ed77f7") - depends_on("c", type="build") # generated - variant("gui", default=False, description="Enable building of gtk gfio") variant("doc", default=False, description="Generate documentation") variant("libaio", default=False, description="Enable libaio engine") + depends_on("c", type="build") + depends_on("pkgconfig", type="build") + depends_on("zlib-api") depends_on("gtkplus@2.18:", when="+gui") depends_on("cairo", when="+gui") depends_on("libaio", when="+libaio") - depends_on("py-sphinx", type="build", when="+doc") conflicts("+libaio", when="platform=darwin", msg="libaio does not support Darwin") - + conflicts("+libaio", when="platform=windows", msg="libaio does not support Windows") conflicts("@:3.18", when="%gcc@10:", msg="gcc@10: sets -fno-common by default") def configure_args(self): - config_args = [] - spec = self.spec + config_args = ["--disable-native"] - if spec.satisfies("+gui"): + if self.spec.satisfies("+gui"): config_args.append("--enable-gfio") return config_args @run_after("build") def build_docs(self): - if "+doc" in self.spec: + if self.spec.satisfies("+doc"): make("-C", "doc", "html") make("-C", "doc", "man") diff --git a/var/spack/repos/builtin/packages/fish/package.py b/var/spack/repos/builtin/packages/fish/package.py index e01b7f0307c998..b4359aabaf6aec 100644 --- a/var/spack/repos/builtin/packages/fish/package.py +++ b/var/spack/repos/builtin/packages/fish/package.py @@ -80,7 +80,7 @@ def cmake_args(self): "-DPCRE2_INCLUDE_DIR=" + self.spec["pcre2"].headers.directories[0], ] - if "+docs" in self.spec: + if self.spec.satisfies("+docs"): args.append("-DBUILD_DOCS=ON") else: args.append("-DBUILD_DOCS=OFF") diff --git a/var/spack/repos/builtin/packages/fixesproto/package.py b/var/spack/repos/builtin/packages/fixesproto/package.py index 92e7f494702341..dd0157bd9d3e28 100644 --- a/var/spack/repos/builtin/packages/fixesproto/package.py +++ b/var/spack/repos/builtin/packages/fixesproto/package.py @@ -20,3 +20,4 @@ class Fixesproto(AutotoolsPackage, XorgPackage): depends_on("pkgconfig", type="build") depends_on("util-macros", type="build") + depends_on("xextproto") diff --git a/var/spack/repos/builtin/packages/flamemaster/package.py b/var/spack/repos/builtin/packages/flamemaster/package.py index d49eacef5912d2..f6dbf090d4c3b0 100644 --- a/var/spack/repos/builtin/packages/flamemaster/package.py +++ b/var/spack/repos/builtin/packages/flamemaster/package.py @@ -242,7 +242,7 @@ def cmake_args(self): args.append("-DEIGEN_INTEGRATION:BOOL=%s" % ("ON" if "+eigen" in spec else "OFF")) args.append("-DINSTALL_EIGEN:BOOL=%s" % ("ON" if "+eigen" in spec else "OFF")) - if "^amdlibflame" in spec: + if spec.satisfies("[virtuals=lapack] ^amdlibflame"): args.append("-DBLA_VENDOR=FLAME") args.append("-DFLAMEMASTER_INSTALL_PREFIX:PATH={0}".format(spec.prefix)) diff --git a/var/spack/repos/builtin/packages/flann/package.py b/var/spack/repos/builtin/packages/flann/package.py index e6a8239dd5afa9..60521f83b99d70 100644 --- a/var/spack/repos/builtin/packages/flann/package.py +++ b/var/spack/repos/builtin/packages/flann/package.py @@ -94,7 +94,7 @@ def patch(self): "src/python/CMakeLists.txt", ) # Fix the install location so that spack activate works - if "+python" in self.spec: + if self.spec.satisfies("+python"): filter_file("share/flann/python", python_platlib, "src/python/CMakeLists.txt") # Hack. Don't install setup.py filter_file("install( FILES", "# install( FILES", "src/python/CMakeLists.txt", string=True) diff --git a/var/spack/repos/builtin/packages/flatbuffers/package.py b/var/spack/repos/builtin/packages/flatbuffers/package.py index 7d1ca90e2f0c2f..38cac7d8e9835c 100644 --- a/var/spack/repos/builtin/packages/flatbuffers/package.py +++ b/var/spack/repos/builtin/packages/flatbuffers/package.py @@ -56,7 +56,7 @@ class Flatbuffers(CMakePackage): @run_after("install") def python_install(self): - if "+python" in self.spec: + if self.spec.satisfies("+python"): pydir = join_path(self.stage.source_path, "python") with working_dir(pydir): args = std_pip_args + ["--prefix=" + self.prefix, "."] diff --git a/var/spack/repos/builtin/packages/flecsi/package.py b/var/spack/repos/builtin/packages/flecsi/package.py index c18adb82331e7e..517f57b0a7f996 100644 --- a/var/spack/repos/builtin/packages/flecsi/package.py +++ b/var/spack/repos/builtin/packages/flecsi/package.py @@ -131,13 +131,13 @@ def cmake_args(self): self.define_from_variant("ENABLE_DOCUMENTATION", "doc"), ] - if "+rocm" in self.spec: + if self.spec.satisfies("+rocm"): options.append(self.define("CMAKE_CXX_COMPILER", self.spec["hip"].hipcc)) options.append(self.define("CMAKE_C_COMPILER", self.spec["hip"].hipcc)) - if "backend=legion" in self.spec: + if self.spec.satisfies("backend=legion"): # CMake pulled in via find_package(Legion) won't work without this options.append(self.define("HIP_PATH", "{0}/hip".format(spec["hip"].prefix))) - elif "+kokkos" in self.spec: + elif self.spec.satisfies("+kokkos"): options.append(self.define("CMAKE_CXX_COMPILER", self.spec["kokkos"].kokkos_cxx)) else: # kept for supporing version prior to 2.2 diff --git a/var/spack/repos/builtin/packages/fleur/package.py b/var/spack/repos/builtin/packages/fleur/package.py index cd665cc14b8558..dc2e6d7727761e 100644 --- a/var/spack/repos/builtin/packages/fleur/package.py +++ b/var/spack/repos/builtin/packages/fleur/package.py @@ -82,7 +82,7 @@ class Fleur(Package): def setup_build_environment(self, env): spec = self.spec - if "+mpi" in spec: + if spec.satisfies("+mpi"): env.set("CC", spec["mpi"].mpicc, force=True) env.set("FC", spec["mpi"].mpifc, force=True) env.set("CXX", spec["mpi"].mpicxx, force=True) @@ -112,43 +112,43 @@ def configure(self): options["-includedir"].append(spec["libxml2"].prefix.include) options["-includedir"].append(join_path(spec["libxml2"].prefix.include, "libxml2")) - if "fft=mkl" in spec: + if spec.satisfies("fft=mkl"): options["-link"].append(spec["intel-mkl"].libs.link_flags) options["-libdir"].append(spec["intel-mkl"].prefix.lib) options["-includedir"].append(spec["intel-mkl"].prefix.include) - if "fft=fftw" in spec: + if spec.satisfies("fft=fftw"): options["-link"].append(spec["fftw-api"].libs.link_flags) options["-libdir"].append(spec["fftw-api"].prefix.lib) options["-includedir"].append(spec["fftw-api"].prefix.include) - if "+scalapack" in spec: + if spec.satisfies("+scalapack"): options["-link"].append(spec["scalapack"].libs.link_flags) options["-libdir"].append(spec["scalapack"].prefix.lib) - if "+external_libxc" in spec: + if spec.satisfies("+external_libxc"): # Workaround: The fortran library is called libxcf90.a/so # but spec['wannier90'].libs.link_flags return -lxc options["-link"].append("-lxcf90") options["-libdir"].append(spec["libxc"].prefix.lib) options["-includedir"].append(spec["libxc"].prefix.include) - if "+hdf5" in spec: + if spec.satisfies("+hdf5"): options["-link"].append(spec["hdf5"].libs.link_flags) options["-libdir"].append(spec["hdf5"].prefix.lib) options["-includedir"].append(spec["hdf5"].prefix.include) - if "+magma" in spec: + if spec.satisfies("+magma"): options["-link"].append(spec["magma"].libs.link_flags) options["-libdir"].append(spec["magma"].prefix.lib) options["-includedir"].append(spec["magma"].prefix.include) - if "+wannier90" in spec: + if spec.satisfies("+wannier90"): # Workaround: The library is not called wannier90.a/so # for this reason spec['wannier90'].libs.link_flags fails! options["-link"].append("-lwannier") options["-libdir"].append(spec["wannier90"].prefix.lib) - if "+spfft" in spec: + if spec.satisfies("+spfft"): options["-link"].append(spec["spfft"].libs.link_flags) # Workaround: The library is installed in /lib64 not /lib options["-libdir"].append(spec["spfft"].prefix.lib + "64") # Workaround: The library needs spfft.mod in include/spfft path options["-includedir"].append(join_path(spec["spfft"].prefix.include, "spfft")) - if "+elpa" in spec: + if spec.satisfies("+elpa"): options["-link"].append(spec["elpa"].libs.link_flags) options["-libdir"].append(spec["elpa"].prefix.lib) # Workaround: The library needs elpa.mod in include/elpa_%VERS/modules @@ -172,7 +172,7 @@ def install(self, spec, prefix): with working_dir("build"): make() mkdirp(prefix.bin) - if "+mpi" in spec: + if spec.satisfies("+mpi"): install("fleur_MPI", prefix.bin) else: install("fleur", prefix.bin) diff --git a/var/spack/repos/builtin/packages/flex/package.py b/var/spack/repos/builtin/packages/flex/package.py index 3b2bf4f1ebf368..cacd5c71a92b6d 100644 --- a/var/spack/repos/builtin/packages/flex/package.py +++ b/var/spack/repos/builtin/packages/flex/package.py @@ -65,11 +65,10 @@ class Flex(AutotoolsPackage): def flag_handler(self, name, flags): spec = self.spec - iflags = [] if name == "cflags": if spec.satisfies("%oneapi"): - iflags.append("-Wno-error=implicit-function-declaration") - return (iflags, None, None) + flags.append("-Wno-error=implicit-function-declaration") + return (flags, None, None) @classmethod def determine_version(cls, exe): diff --git a/var/spack/repos/builtin/packages/flink/package.py b/var/spack/repos/builtin/packages/flink/package.py index f94f97a91044eb..6222815e22000d 100644 --- a/var/spack/repos/builtin/packages/flink/package.py +++ b/var/spack/repos/builtin/packages/flink/package.py @@ -13,10 +13,11 @@ class Flink(Package): """ homepage = "https://flink.apache.org/" - url = "https://archive.apache.org/dist/flink/flink-1.9.1/flink-1.9.1-bin-scala_2.11.tgz" + url = "https://archive.apache.org/dist/flink/flink-1.20.0/flink-1.20.0-bin-scala_2.12.tgz" - license("BSD-2-Clause") + license("Apache-2.0", checked_by="wdconinc") + version("1.20.0", sha256="708fd544ccf9ddc0d4b192fe035797ce16de2c26f1d764c55907305efe140af0") version("1.9.1", sha256="f69de344cd593e92f8261e19ae8a47b3910e9a70a7cd1ccfb1ecd1ff000b93ea") version("1.9.0", sha256="a2245f68309e94ed54d86a680232a518aed9c5ea030bcc0b298bc8f27165eeb7") version("1.8.3", sha256="1ba90e99f70ad7e2583d48d1404d1c09e327e8fb8fa716b1823e427464cc8dc0") @@ -26,8 +27,8 @@ class Flink(Package): depends_on("java@8:", type="run") def url_for_version(self, version): - url = "https://archive.apache.org/dist/flink/flink-{0}/flink-{0}-bin-scala_2.11.tgz" - return url.format(version) + scala = "2.12" if version >= Version("1.15") else "2.11" + return f"https://archive.apache.org/dist/flink/flink-{version}/flink-{version}-bin-scala_{scala}.tgz" def install(self, spec, prefix): install_tree(".", prefix) diff --git a/var/spack/repos/builtin/packages/fltk/package.py b/var/spack/repos/builtin/packages/fltk/package.py index 50f2b68c57a0ce..2cb32fd091c1dc 100644 --- a/var/spack/repos/builtin/packages/fltk/package.py +++ b/var/spack/repos/builtin/packages/fltk/package.py @@ -61,16 +61,16 @@ def install(self, spec, prefix): "--enable-localzlib", ] - if "+shared" in spec: + if spec.satisfies("+shared"): options.append("--enable-shared") - if "+xft" in spec: + if spec.satisfies("+xft"): # https://www.fltk.org/articles.php?L374+I0+TFAQ+P1+Q options.append("--enable-xft") else: options.append("--disable-xft") - if "~gl" in spec: + if spec.satisfies("~gl"): options.append("--disable-gl") # FLTK needs to be built in-source diff --git a/var/spack/repos/builtin/packages/flume/package.py b/var/spack/repos/builtin/packages/flume/package.py index 7a57524b304c87..c5b827681450a8 100644 --- a/var/spack/repos/builtin/packages/flume/package.py +++ b/var/spack/repos/builtin/packages/flume/package.py @@ -18,11 +18,12 @@ class Flume(Package): application. """ - homepage = "https://cwiki.apache.org/FLUME" + homepage = "https://flume.apache.org" url = "https://www.apache.org/dist/flume/1.9.0/apache-flume-1.9.0-bin.tar.gz" - license("Apache-2.0") + license("Apache-2.0", checked_by="wdconinc") + version("1.11.0", sha256="6eb7806076bdc3dcadb728275eeee7ba5cb12b63a2d981de3da9063008dba678") version("1.9.0", sha256="0373ed5abfd44dc4ab23d9a02251ffd7e3b32c02d83a03546e97ec15a7b23619") version("1.8.0", sha256="be1b554a5e23340ecc5e0b044215bf7828ff841f6eabe647b526d31add1ab5fa") version("1.7.0", sha256="b97254cf37c36b6e5045f764095d86fc6d9a8043dda169e950547fcae35681ec") diff --git a/var/spack/repos/builtin/packages/flux-core/package.py b/var/spack/repos/builtin/packages/flux-core/package.py index 177fa45c5bd9a1..52eddda9fc938a 100644 --- a/var/spack/repos/builtin/packages/flux-core/package.py +++ b/var/spack/repos/builtin/packages/flux-core/package.py @@ -211,7 +211,7 @@ def configure_args(self): args = ["--enable-pylint=no"] if "+docs" not in self.spec: args.append("--disable-docs") - if "+security" in self.spec: + if self.spec.satisfies("+security"): args.append("--with-flux-security") return args diff --git a/var/spack/repos/builtin/packages/flux-sched/package.py b/var/spack/repos/builtin/packages/flux-sched/package.py index 24f75fe18652af..66d5532bf31db9 100644 --- a/var/spack/repos/builtin/packages/flux-sched/package.py +++ b/var/spack/repos/builtin/packages/flux-sched/package.py @@ -24,6 +24,8 @@ class FluxSched(CMakePackage, AutotoolsPackage): license("LGPL-3.0-only") version("master", branch="master") + version("0.38.0", sha256="0cb3efbd490256b28df580bb14f8e89c02084a9126e0b1754d6334a99ecfa969") + version("0.37.0", sha256="b354d451183fcb8455e6a61d31e18c7f4af13e16a86b71216738f0991a7bcd50") version("0.36.1", sha256="0ee37ed364912f3f5a48ed5b5f5f21cb86cda43ff357486695b9454c217ad8b8") version("0.36.0", sha256="c20814eae65b6eb9f2c919dbcc216dd4b87f038a341cf99510cca88d43631c41") version("0.35.0", sha256="38fde51464f4e34ecbd1e4fbbf00267f96b639db5987257a7ad07f811e2f09d2") @@ -72,6 +74,8 @@ class FluxSched(CMakePackage, AutotoolsPackage): depends_on("uuid") depends_on("pkgconfig") conflicts("%gcc@:9.3", when="@0.34:") + conflicts("%gcc@:11", when="@0.37:", msg="gcc version must be 12 or higher") + conflicts("%clang@:14", when="@0.37:", msg="clang must be version 15 or higher") depends_on("py-sphinx@1.6.3:", when="+docs", type="build") depends_on("flux-core", type=("build", "link", "run")) diff --git a/var/spack/repos/builtin/packages/fms/package.py b/var/spack/repos/builtin/packages/fms/package.py index c546c315e3a737..59034e63d5813b 100644 --- a/var/spack/repos/builtin/packages/fms/package.py +++ b/var/spack/repos/builtin/packages/fms/package.py @@ -58,6 +58,22 @@ class Fms(CMakePackage): depends_on("c", type="build") # generated depends_on("fortran", type="build") # generated + # https://github.com/NOAA-GFDL/FMS/issues/1417 + patch( + "https://github.com/NOAA-GFDL/FMS/commit/c9bba516ba1115d4a7660fba92f9d67cf3fd32ad.patch?full_index=1", + sha256="07d5b68838bba61ee547bd4cd7c12d81228c91a80a966b8693694fa236d0ac30", + when="@2023.03", + ) + + variant("shared", description="Build shared libraries", when="@2024.02:", default=False) + # What the following patch is providing is available in version 2024.03 + # and newer so it is only needed to 2024.02 + patch( + "https://github.com/NOAA-GFDL/fms/pull/1559.patch?full_index=1", + sha256="2b12a6c35f357c3dddcfa5282576e56ab0e8e6c1ad1dab92a2c85ce3dfb815d4", + when="@2024.02", + ) + variant( "precision", values=("32", "64"), @@ -115,6 +131,7 @@ def cmake_args(self): self.define_from_variant("GFS_PHYS"), self.define_from_variant("OPENMP"), self.define_from_variant("ENABLE_QUAD_PRECISION", "quad_precision"), + self.define_from_variant("SHARED_LIBS", "shared"), self.define_from_variant("WITH_YAML", "yaml"), self.define_from_variant("CONSTANTS"), self.define_from_variant("LARGEFILE", "large_file"), diff --git a/var/spack/repos/builtin/packages/fmt/package.py b/var/spack/repos/builtin/packages/fmt/package.py index f9aa83dcbec154..c0d1b2461a9f7b 100644 --- a/var/spack/repos/builtin/packages/fmt/package.py +++ b/var/spack/repos/builtin/packages/fmt/package.py @@ -101,10 +101,10 @@ class Fmt(CMakePackage): # Fix 'variable "buffer" may not be initialized' compiler error patch( - "fmt-no-variable-initialize_10.0.0.patch", when="@10.0.0:10.2.1%clang@12.0.1.ibm.gcc.8.3.1" + "fmt-no-variable-initialize_10.0.0.patch", when="@10.0.0:11.0.2%clang@12.0.1.ibm.gcc.8.3.1" ) patch( - "fmt-no-variable-initialize_10.0.0.patch", when="@10.0.0:10.2.1%clang@14.0.5.ibm.gcc.8.3.1" + "fmt-no-variable-initialize_10.0.0.patch", when="@10.0.0:11.0.2%clang@14.0.5.ibm.gcc.8.3.1" ) def cmake_args(self): @@ -114,7 +114,7 @@ def cmake_args(self): if self.spec.satisfies("+shared"): args.append("-DBUILD_SHARED_LIBS=ON") - if "+pic" in spec: + if spec.satisfies("+pic"): args.extend( [ "-DCMAKE_C_FLAGS={0}".format(self.compiler.cc_pic_flag), @@ -128,7 +128,7 @@ def cmake_args(self): args.append("-DCMAKE_CXX_STANDARD_REQUIRED=ON") # When cxxstd is 98, must disable FMT_USE_CPP11 - if "cxxstd=98" in spec: + if spec.satisfies("cxxstd=98"): args.append("-DFMT_USE_CPP11=OFF") # Can't build docs without doxygen+python+virtualenv diff --git a/var/spack/repos/builtin/packages/foam-extend/package.py b/var/spack/repos/builtin/packages/foam-extend/package.py index 550a3ce69e7947..6a9d8a026f727c 100644 --- a/var/spack/repos/builtin/packages/foam-extend/package.py +++ b/var/spack/repos/builtin/packages/foam-extend/package.py @@ -298,7 +298,7 @@ def configure(self, spec, prefix): # Adjust configuration via prefs - sort second self.etc_prefs["001"].update(self.foam_arch.foam_dict()) - if "+scotch" in spec or "+ptscotch" in spec: + if spec.satisfies("+scotch") or spec.satisfies("+ptscotch"): pkg = spec["scotch"].prefix self.etc_prefs["scotch"] = { "SCOTCH_SYSTEM": 1, @@ -308,7 +308,7 @@ def configure(self, spec, prefix): "SCOTCH_INCLUDE_DIR": pkg.include, } - if "+metis" in spec: + if spec.satisfies("+metis"): pkg = spec["metis"].prefix self.etc_prefs["metis"] = { "METIS_SYSTEM": 1, @@ -318,7 +318,7 @@ def configure(self, spec, prefix): "METIS_INCLUDE_DIR": pkg.include, } - if "+parmetis" in spec: + if spec.satisfies("+parmetis"): pkg = spec["parmetis"].prefix self.etc_prefs["parametis"] = { "PARMETIS_SYSTEM": 1, @@ -328,7 +328,7 @@ def configure(self, spec, prefix): "PARMETIS_INCLUDE_DIR": pkg.include, } - if "+parmgridgen" in spec: + if spec.satisfies("+parmgridgen"): pkg = spec["parmgridgen"].prefix self.etc_prefs["parmgridgen"] = { "PARMGRIDGEN_SYSTEM": 1, @@ -338,7 +338,7 @@ def configure(self, spec, prefix): "PARMGRIDGEN_INCLUDE_DIR": pkg.include, } - if "+paraview" in self.spec: + if self.spec.satisfies("+paraview"): self.etc_prefs["paraview"] = { "PARAVIEW_SYSTEM": 1, "PARAVIEW_DIR": spec["paraview"].prefix, @@ -386,7 +386,7 @@ def install(self, spec, prefix): } # All top-level files, except spack build info and possibly Allwmake - if "+source" in spec: + if spec.satisfies("+source"): ignored = re.compile(r"^spack-.*") else: ignored = re.compile(r"^(Allclean|Allwmake|spack-).*") @@ -400,7 +400,7 @@ def install(self, spec, prefix): for d in ["etc", "bin", "wmake", "lib", join_path(appdir, "bin")]: install_tree(d, join_path(self.projectdir, d), symlinks=True) - if "+source" in spec: + if spec.satisfies("+source"): subitem = join_path(appdir, "Allwmake") install(subitem, join_path(self.projectdir, subitem)) diff --git a/var/spack/repos/builtin/packages/form/package.py b/var/spack/repos/builtin/packages/form/package.py index 3597348f920529..b3d36d6c007af5 100644 --- a/var/spack/repos/builtin/packages/form/package.py +++ b/var/spack/repos/builtin/packages/form/package.py @@ -40,7 +40,7 @@ class Form(AutotoolsPackage): def configure_args(self): args = [] args += self.with_or_without("gmp", "prefix") - if "+zlib" in self.spec: + if self.spec.satisfies("+zlib"): args.append("--with-zlib=%s" % self.spec["zlib-api"].prefix) else: args.append("--without-zlib") diff --git a/var/spack/repos/builtin/packages/formetis/package.py b/var/spack/repos/builtin/packages/formetis/package.py index db2401871a4f86..2866df52a104e3 100644 --- a/var/spack/repos/builtin/packages/formetis/package.py +++ b/var/spack/repos/builtin/packages/formetis/package.py @@ -67,7 +67,7 @@ def test_metis(self): self.define("CMAKE_Fortran_COMPILER", self.compiler.fc), self.define("METIS_ROOT", self.spec["metis"].prefix), ] - if "+mpi" in self.spec: + if self.spec.satisfies("+mpi"): cmake_args.append(self.define("ParMETIS_ROOT", self.spec["parmetis"].prefix)) cmake_args.append(self.cached_tests_work_dir) cmake = which(self.spec["cmake"].prefix.bin.cmake) diff --git a/var/spack/repos/builtin/packages/fpart/package.py b/var/spack/repos/builtin/packages/fpart/package.py index 86fe178a4db8d3..5fb4168c6b421b 100644 --- a/var/spack/repos/builtin/packages/fpart/package.py +++ b/var/spack/repos/builtin/packages/fpart/package.py @@ -17,14 +17,12 @@ class Fpart(AutotoolsPackage): maintainers("drkrynstrng") - license("BSD-2-Clause") + license("BSD-2-Clause", checked_by="drkrynstrng") version("master", branch="master") version("1.6.0", sha256="ed1fac2853fc421071b72e4c5d8455a231bc30e50034db14af8b0485ece6e097") version("1.5.1", sha256="c353a28f48e4c08f597304cb4ebb88b382f66b7fabfc8d0328ccbb0ceae9220c") - depends_on("c", type="build") # generated - variant("embfts", default=False, description="Build with embedded fts functions") variant("static", default=False, description="Build static binary") variant("debug", default=False, description="Build with debugging support") @@ -37,6 +35,7 @@ class Fpart(AutotoolsPackage): description="Tools used by fpsync to copy files", ) + depends_on("c", type="build") depends_on("autoconf", type="build") depends_on("automake", type="build") depends_on("libtool", type="build") diff --git a/var/spack/repos/builtin/packages/fplo/package.py b/var/spack/repos/builtin/packages/fplo/package.py index f294fc05d346ac..61e8f4da09d6e0 100644 --- a/var/spack/repos/builtin/packages/fplo/package.py +++ b/var/spack/repos/builtin/packages/fplo/package.py @@ -136,5 +136,4 @@ def perl_interpreter(self): pattern = "^#!.*/usr/bin/perl" repl = "#!{0}".format(self.spec["perl"].command.path) files = ["fconv2", "fconvdens2", "fdowngrad.pl", "fout2in", "grBhfat", "grpop"] - for file in files: - filter_file(pattern, repl, *files, backup=False) + filter_file(pattern, repl, *files, backup=False) diff --git a/var/spack/repos/builtin/packages/fpm/package.py b/var/spack/repos/builtin/packages/fpm/package.py index a8c410e31a0aa7..18f179d15b29cf 100644 --- a/var/spack/repos/builtin/packages/fpm/package.py +++ b/var/spack/repos/builtin/packages/fpm/package.py @@ -42,13 +42,13 @@ class Fpm(Package): depends_on("git@1.8.5:", type="build") def setup_build_environment(self, env): - if "@0.4.0" in self.spec: + if self.spec.satisfies("@0.4.0"): env.set("FPM_C_COMPILER", self.compiler.cc) env.set("FPM_CC", self.compiler.cc) fflags = "-O3" - if "+openmp" in self.spec: + if self.spec.satisfies("+openmp"): fflags += " " + self.compiler.openmp_flag env.set("FFLAGS", fflags) diff --git a/var/spack/repos/builtin/packages/freefem/package.py b/var/spack/repos/builtin/packages/freefem/package.py index 1f3f36d5449523..37ca96d694023a 100644 --- a/var/spack/repos/builtin/packages/freefem/package.py +++ b/var/spack/repos/builtin/packages/freefem/package.py @@ -75,7 +75,7 @@ def configure_args(self): "CXXFLAGS=%s" % " ".join(spec.compiler_flags["cxxflags"]), ] - if "+petsc" in spec: + if spec.satisfies("+petsc"): options.append("--with-petsc=%s" % spec["petsc"].prefix.lib.petsc.conf.petscvariables) options.append("--with-slepc-ldflags=%s" % spec["slepc"].libs.ld_flags) options.append("--with-slepc-include=%s" % spec["slepc"].headers.include_flags) diff --git a/var/spack/repos/builtin/packages/freetype/package.py b/var/spack/repos/builtin/packages/freetype/package.py index d1ce23d7cee5d5..2154009c659505 100644 --- a/var/spack/repos/builtin/packages/freetype/package.py +++ b/var/spack/repos/builtin/packages/freetype/package.py @@ -22,6 +22,7 @@ class Freetype(AutotoolsPackage, CMakePackage): license("FTL OR GPL-2.0-or-later") + version("2.13.3", sha256="5c3a8e78f7b24c20b25b54ee575d6daa40007a5f4eea2845861c3409b3021747") version("2.13.2", sha256="1ac27e16c134a7f2ccea177faba19801131116fd682efc1f5737037c5db224b5") version("2.13.1", sha256="0b109c59914f25b4411a8de2a506fdd18fa8457eb86eca6c7b15c19110a92fa5") version("2.13.0", sha256="a7aca0e532a276ea8d85bd31149f0a74c33d19c8d287116ef8f5f8357b4f1f80") diff --git a/var/spack/repos/builtin/packages/freexl/package.py b/var/spack/repos/builtin/packages/freexl/package.py index 41f593df26e75c..3288dd477e228e 100644 --- a/var/spack/repos/builtin/packages/freexl/package.py +++ b/var/spack/repos/builtin/packages/freexl/package.py @@ -17,6 +17,16 @@ class Freexl(AutotoolsPackage): version("1.0.6", sha256="3de8b57a3d130cb2881ea52d3aa9ce1feedb1b57b7daa4eb37f751404f90fc22") version("1.0.5", sha256="3dc9b150d218b0e280a3d6a41d93c1e45f4d7155829d75f1e5bf3e0b0de6750d") - depends_on("c", type="build") # generated + depends_on("c", type="build") depends_on("minizip", when="@2:") + depends_on("expat", type="link") + depends_on("iconv", type="link") + + def flag_handler(self, name, flags): + # avoid that header is taken from libiconv, but library from libc -- configure script is + # missing a compile + link test. + iconv = self.spec["iconv"] + if name == "ldflags" and iconv.name == "libiconv": + flags.append(iconv.libs.ld_flags) + return (flags, None, None) diff --git a/var/spack/repos/builtin/packages/fsl/package.py b/var/spack/repos/builtin/packages/fsl/package.py index cae1ff6ecd233f..690911373e8559 100644 --- a/var/spack/repos/builtin/packages/fsl/package.py +++ b/var/spack/repos/builtin/packages/fsl/package.py @@ -111,7 +111,7 @@ def patch(self): vtk_settings.filter(r"(^VTKDIR_LIB)\s*=.*", r"\1 = {0}".format(vtk_lib_dir)) vtk_settings.filter(r"(^VTKSUFFIX)\s*=.*", r"\1 = -{0}".format(vtk_suffix)) - if "+cuda" in self.spec: + if self.spec.satisfies("+cuda"): cuda_arch = self.spec.variants["cuda_arch"].value cuda_gencode = " ".join(self.cuda_flags(cuda_arch)) cuda_installation = self.spec["cuda"].prefix diff --git a/var/spack/repos/builtin/packages/fstrack/package.py b/var/spack/repos/builtin/packages/fstrack/package.py index 30c32470e089c3..a6bd204c3e51a7 100644 --- a/var/spack/repos/builtin/packages/fstrack/package.py +++ b/var/spack/repos/builtin/packages/fstrack/package.py @@ -43,7 +43,7 @@ def setup_build_environment(self, env): env.set("F90FLAGS_DEBUG", "-g -x f95-cpp-input") env.set("LDFLAGS", "-lm") - if "+flow" in self.spec: + if self.spec.satisfies("+flow"): env.set("GMTHOME", self.spec["gmt"].prefix) env.set("NETCDFDIR", self.spec["netcdf-c"].prefix) @@ -55,7 +55,7 @@ def build(self, spec, prefix): make() with working_dir("fstrack"): - if "+flow" in spec: + if spec.satisfies("+flow"): make("really_all") else: make() diff --git a/var/spack/repos/builtin/packages/ftgl/package.py b/var/spack/repos/builtin/packages/ftgl/package.py index 4f3c38d9c72265..c98656d37aa1f2 100644 --- a/var/spack/repos/builtin/packages/ftgl/package.py +++ b/var/spack/repos/builtin/packages/ftgl/package.py @@ -45,6 +45,12 @@ class Ftgl(CMakePackage): # Fix oversight in CMakeLists patch("remove-ftlibrary-from-sources.diff", when="@:2.4.0") + # Fix gcc14 compilation error due to type mismatch in FTContour + patch( + "https://patch-diff.githubusercontent.com/raw/frankheckenbach/ftgl/pull/20.patch?full_index=1", + sha256="e2a0810fbf68403931bef4fbfda22e010e01421c92eeaa45f62e4e47f2381ebd", + when="@2.4.0 %gcc@14:", + ) # ftgl (at least up to 2.4.0) uses `cmake_minimum_version(2.8)`, # which doesn't honor CMAKE_CXX_STANDARD. diff --git a/var/spack/repos/builtin/packages/fujitsu-fftw/package.py b/var/spack/repos/builtin/packages/fujitsu-fftw/package.py index f4f3619d2e6243..c647b94445e4e7 100644 --- a/var/spack/repos/builtin/packages/fujitsu-fftw/package.py +++ b/var/spack/repos/builtin/packages/fujitsu-fftw/package.py @@ -78,23 +78,23 @@ def configure(self, spec, prefix): "ac_cv_prog_f77_v=-###", ] - if "+shared" in spec: + if spec.satisfies("+shared"): options.append("--enable-shared") else: options.append("--disable-shared") - if "+openmp" in spec: + if spec.satisfies("+openmp"): options.append("--enable-openmp") options.append("OPENMP_CFLAGS=-Kopenmp") else: options.append("--disable-openmp") - if "+threads" in spec: + if spec.satisfies("+threads"): options.append("--enable-threads") else: options.append("--disable-threads") - if "+mpi" in spec: + if spec.satisfies("+mpi"): options.append("--enable-mpi") else: options.append("--disable-mpi") diff --git a/var/spack/repos/builtin/packages/fujitsu-ssl2/package.py b/var/spack/repos/builtin/packages/fujitsu-ssl2/package.py index 76682cc862d930..a12b8ca0e9b2e0 100644 --- a/var/spack/repos/builtin/packages/fujitsu-ssl2/package.py +++ b/var/spack/repos/builtin/packages/fujitsu-ssl2/package.py @@ -35,25 +35,25 @@ def blas_libs(self): spec = self.spec libslist = [] if spec.target == "a64fx": # Build with SVE support - if "+parallel" in spec: # parallel + if spec.satisfies("+parallel"): # parallel libslist.append("libfjlapackexsve.so") else: libslist.append("libfjlapacksve.so") else: - if "+parallel" in spec: # parallel + if spec.satisfies("+parallel"): # parallel libslist.append("libfjlapackex.so") else: libslist.append("libfjlapack.so") - if "+parallel" in spec: # parallel + if spec.satisfies("+parallel"): # parallel libslist.extend(["libfjomphk.so", "libfjomp.so"]) if spec.target == "a64fx": # Build with SVE support - if "+parallel" in spec: # parallel + if spec.satisfies("+parallel"): # parallel libslist.append("libssl2mtexsve.a") libslist.append("libssl2mtsve.a") else: - if "+parallel" in spec: # parallel + if spec.satisfies("+parallel"): # parallel libslist.append("libssl2mtex.a") libslist.append("libssl2mt.a") @@ -81,7 +81,7 @@ def scalapack_libs(self): libslist = [] if spec.target == "a64fx": # Build with SVE support libslist.append("libfjscalapacksve.so") - if "+parallel" in spec: # parallel + if spec.satisfies("+parallel"): # parallel libslist.append("libfjlapackexsve.so") else: libslist.append("libfjlapacksve.so") @@ -89,7 +89,7 @@ def scalapack_libs(self): else: libslist.append("libfjscalapack.so") - if "+parallel" in spec: # parallel + if spec.satisfies("+parallel"): # parallel libslist.append("libfjlapackex.so") else: libslist.append("libfjlapack.so") @@ -97,15 +97,15 @@ def scalapack_libs(self): libslist.extend(["libmpi_usempi_ignore_tkr.so", "libmpi_mpifh.so"]) - if "+parallel" in spec: # parallel + if spec.satisfies("+parallel"): # parallel libslist.extend(["libfjomphk.so", "libfjomp.so"]) if spec.target == "a64fx": # Build with SVE support - if "+parallel" in spec: # parallel + if spec.satisfies("+parallel"): # parallel libslist.append("libssl2mtexsve.a") libslist.append("libssl2mtsve.a") else: - if "+parallel" in spec: # parallel + if spec.satisfies("+parallel"): # parallel libslist.append("libssl2mtex.a") libslist.append("libssl2mt.a") diff --git a/var/spack/repos/builtin/packages/funhpc/package.py b/var/spack/repos/builtin/packages/funhpc/package.py index a11977116ce58b..776da697d84903 100644 --- a/var/spack/repos/builtin/packages/funhpc/package.py +++ b/var/spack/repos/builtin/packages/funhpc/package.py @@ -31,7 +31,7 @@ class Funhpc(CMakePackage): def cmake_args(self): spec = self.spec options = ["-DGTEST_ROOT=%s" % spec["googletest"].prefix] - if "+pic" in spec: + if spec.satisfies("+pic"): options += ["-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"] return options diff --git a/var/spack/repos/builtin/packages/fxt/package.py b/var/spack/repos/builtin/packages/fxt/package.py index c80edd1c4dea11..f4e6a5846ba04a 100644 --- a/var/spack/repos/builtin/packages/fxt/package.py +++ b/var/spack/repos/builtin/packages/fxt/package.py @@ -48,7 +48,7 @@ class Fxt(AutotoolsPackage): def patch(self): # Increase the value of FXT_MAX_PARAMS (to allow longer task names) - if "+moreparams" in self.spec: + if self.spec.satisfies("+moreparams"): filter_file("#define FXT_MAX_PARAMS.*", "#define FXT_MAX_PARAMS 16", "tools/fxt.h") def autoreconf(self, spec, prefix): diff --git a/var/spack/repos/builtin/packages/fzf/package.py b/var/spack/repos/builtin/packages/fzf/package.py index 7616724ea2a193..a3c75798c47fd6 100644 --- a/var/spack/repos/builtin/packages/fzf/package.py +++ b/var/spack/repos/builtin/packages/fzf/package.py @@ -19,6 +19,7 @@ class Fzf(MakefilePackage): license("MIT") + version("0.55.0", sha256="805383f71bca7f8fb271ecd716852aea88fd898d5027d58add9e43df6ea766da") version("0.54.3", sha256="6413f3916f8058b396820f9078b1336d94c72cbae39c593b1d16b83fcc4fdf74") version("0.53.0", sha256="d45abbfb64f21913c633d46818d9d3eb3d7ebc7e94bd16f45941958aa5480e1d") version("0.52.1", sha256="96848746ca78249c1fdd16f170776ce2f667097b60e4ffbd5ecdbd7dfac72ef9") diff --git a/var/spack/repos/builtin/packages/gapbs/package.py b/var/spack/repos/builtin/packages/gapbs/package.py index 19dfa2bfa4cfcd..8fbde6cda968d4 100644 --- a/var/spack/repos/builtin/packages/gapbs/package.py +++ b/var/spack/repos/builtin/packages/gapbs/package.py @@ -32,7 +32,7 @@ class Gapbs(MakefilePackage): def build(self, spec, prefix): cxx_flags = ["-O3", self.compiler.cxx11_flag] - if "-serial" in spec: + if spec.satisfies("-serial"): cxx_flags.append(self.compiler.openmp_flag) make("CXX_FLAGS=" + " ".join(cxx_flags)) diff --git a/var/spack/repos/builtin/packages/gasnet/package.py b/var/spack/repos/builtin/packages/gasnet/package.py index 6267730ef128b1..a6100797123cce 100644 --- a/var/spack/repos/builtin/packages/gasnet/package.py +++ b/var/spack/repos/builtin/packages/gasnet/package.py @@ -163,22 +163,22 @@ def install(self, spec, prefix): if "conduits=none" not in spec: options = ["--prefix=%s" % prefix] - if "+debug" in spec: + if spec.satisfies("+debug"): options.append("--enable-debug") - if "+cuda" in spec: + if spec.satisfies("+cuda"): options.append("--enable-kind-cuda-uva") options.append("--with-cuda-home=" + spec["cuda"].prefix) - if "+rocm" in spec: + if spec.satisfies("+rocm"): options.append("--enable-kind-hip") options.append("--with-hip-home=" + spec["hip"].prefix) - if "+level_zero" in spec: + if spec.satisfies("+level_zero"): options.append("--enable-kind-ze") options.append("--with-ze-home=" + spec["oneapi-level-zero"].prefix) - if "conduits=mpi" in spec: + if spec.satisfies("conduits=mpi"): options.append("--enable-mpi-compat") else: options.append("--disable-mpi-compat") @@ -204,7 +204,7 @@ def install(self, spec, prefix): @run_after("install") @on_package_attributes(run_tests=True) def check_install(self): - if "conduits=smp" in self.spec: + if self.spec.satisfies("conduits=smp"): make("-C", "smp-conduit", "run-tests") self.test_testtools() @@ -219,7 +219,7 @@ def _setup_test_env(self): def test_testtools(self): """run testtools and check output""" - if "conduits=none" in self.spec: + if self.spec.satisfies("conduits=none"): raise SkipTest("Test requires conduit libraries") testtools_path = join_path(self.prefix.tests, "testtools") @@ -232,7 +232,7 @@ def test_testtools(self): def test_testgasnet(self): """run testgasnet and check output""" - if "conduits=none" in self.spec: + if self.spec.satisfies("conduits=none"): raise SkipTest("Test requires conduit libraries") self._setup_test_env() diff --git a/var/spack/repos/builtin/packages/gate/package.py b/var/spack/repos/builtin/packages/gate/package.py index 89fdeb74e793b8..72060b61277807 100644 --- a/var/spack/repos/builtin/packages/gate/package.py +++ b/var/spack/repos/builtin/packages/gate/package.py @@ -55,7 +55,7 @@ class Gate(CMakePackage): def cmake_args(self): args = [] - if "+rtk" in self.spec: + if self.spec.satisfies("+rtk"): args.extend(["-DGATE_USE_ITK=ON", "-DGATE_USE_RTK=ON"]) else: args.extend(["-DGATE_USE_ITK=OFF", "-DGATE_USE_RTK=OFF"]) diff --git a/var/spack/repos/builtin/packages/gaudi/includes.patch b/var/spack/repos/builtin/packages/gaudi/includes.patch new file mode 100644 index 00000000000000..84d98517068596 --- /dev/null +++ b/var/spack/repos/builtin/packages/gaudi/includes.patch @@ -0,0 +1,38 @@ +diff --git a/GaudiHive/src/AvalancheSchedulerSvc.cpp b/GaudiHive/src/AvalancheSchedulerSvc.cpp +index 7f49e6f75..76601bed8 100644 +--- a/GaudiHive/src/AvalancheSchedulerSvc.cpp ++++ b/GaudiHive/src/AvalancheSchedulerSvc.cpp +@@ -23,6 +23,7 @@ + + // C++ + #include ++#include + #include + #include + #include +diff --git a/GaudiHive/src/PRGraph/Visitors/Rankers.cpp b/GaudiHive/src/PRGraph/Visitors/Rankers.cpp +index 33f733633..e4d33080f 100644 +--- a/GaudiHive/src/PRGraph/Visitors/Rankers.cpp ++++ b/GaudiHive/src/PRGraph/Visitors/Rankers.cpp +@@ -10,6 +10,8 @@ + \***********************************************************************************/ + #include "Rankers.h" + ++#include ++ + namespace concurrency { + + //-------------------------------------------------------------------------- +diff --git a/GaudiHive/src/PrecedenceSvc.cpp b/GaudiHive/src/PrecedenceSvc.cpp +index ac4a7b7d9..1ff1e3f9e 100644 +--- a/GaudiHive/src/PrecedenceSvc.cpp ++++ b/GaudiHive/src/PrecedenceSvc.cpp +@@ -17,6 +17,8 @@ + #include + #include + ++#include ++ + #define ON_DEBUG if ( msgLevel( MSG::DEBUG ) ) + #define ON_VERBOSE if ( msgLevel( MSG::VERBOSE ) ) + diff --git a/var/spack/repos/builtin/packages/gaudi/package.py b/var/spack/repos/builtin/packages/gaudi/package.py index f3952190454dd5..92dc3985fde149 100644 --- a/var/spack/repos/builtin/packages/gaudi/package.py +++ b/var/spack/repos/builtin/packages/gaudi/package.py @@ -16,6 +16,7 @@ class Gaudi(CMakePackage): tags = ["hep"] version("master", branch="master") + version("39.0", sha256="faa3653e2e6c769292c0592e3fc35cd98a2820bd6fc0c967cac565808b927262") version("38.3", sha256="47e8c65ea446656d2dae54a32205525e08257778cf80f9f029cd244d6650486e") version("38.2", sha256="08759b1398336987ad991602e37079f0744e8d8e4e3d5df2d253b8dedf925068") version("38.1", sha256="79d42833edcebc2099f91badb6f72708640c05f678cc4521a86e857f112486dc") @@ -40,7 +41,9 @@ class Gaudi(CMakePackage): version("36.0", sha256="8a0458cef5b616532f9db7cca9fa0e892e602b64c9e93dc0cc6d972e03034830") version("35.0", sha256="c01b822f9592a7bf875b9997cbeb3c94dea97cb13d523c12649dbbf5d69b5fa6") - depends_on("cxx", type="build") # generated + depends_on("cxx", type="build") + + conflicts("%gcc@:10", when="@39:", msg="Gaudi needs a c++20 capable compiler for this version") maintainers("drbenmorgan", "vvolkl", "jmcarcell") @@ -48,7 +51,7 @@ class Gaudi(CMakePackage): variant("cppunit", default=False, description="Build with CppUnit unit testing") variant("docs", default=False, description="Build documentation with Doxygen") variant("examples", default=False, description="Build examples") - variant("gaudialg", default=False, description="Build GaudiAlg support", when="@37.0:") + variant("gaudialg", default=False, description="Build GaudiAlg support", when="@37.0:38") variant("gperftools", default=False, description="Build with Google PerfTools support") variant("heppdt", default=False, description="Build with HEP Particle Data Table support") variant("jemalloc", default=False, description="Build with jemalloc allocator support") @@ -70,6 +73,9 @@ class Gaudi(CMakePackage): when="@:38.1", ) + # add a few missing includes (c++20?) + patch("includes.patch", when="@37:38") + # These dependencies are needed for a minimal Gaudi build depends_on("aida") # The boost components that are required for Gaudi @@ -91,6 +97,7 @@ class Gaudi(CMakePackage): depends_on("clhep") depends_on("cmake", type="build") + depends_on("cmake@3.19:", type="build", when="@39:") depends_on("cppgsl") depends_on("fmt@:8", when="@:36.9") depends_on("fmt@:10") @@ -105,6 +112,7 @@ class Gaudi(CMakePackage): depends_on("range-v3") depends_on("root +python +root7 +ssl +tbb +threads") depends_on("zlib-api") + depends_on("py-pytest-cov", when="@39:") # Testing dependencies # Note: gaudi only builds examples when testing enabled @@ -146,6 +154,10 @@ def cmake_args(self): # todo: self.define("GAUDI_USE_INTELAMPLIFIER", False), ] + # Release notes for v39.0: https://gitlab.cern.ch/gaudi/Gaudi/-/releases/v39r0 + # Gaudi@39: needs C++ >= 20, and we need to force CMake to use C++ 20 with old gcc: + if self.spec.satisfies("@39: %gcc@:13"): + args.append(self.define("GAUDI_CXX_STANDARD", "20")) return args def setup_run_environment(self, env): diff --git a/var/spack/repos/builtin/packages/gawk/package.py b/var/spack/repos/builtin/packages/gawk/package.py index f0e745448776c6..8f0ef30ba0dfcb 100644 --- a/var/spack/repos/builtin/packages/gawk/package.py +++ b/var/spack/repos/builtin/packages/gawk/package.py @@ -30,6 +30,7 @@ class Gawk(AutotoolsPackage, GNUMirrorPackage): license("GPL-3.0-or-later") + version("5.3.1", sha256="694db764812a6236423d4ff40ceb7b6c4c441301b72ad502bb5c27e00cd56f78") version("5.3.0", sha256="ca9c16d3d11d0ff8c69d79dc0b47267e1329a69b39b799895604ed447d3ca90b") version("5.2.2", sha256="3c1fce1446b4cbee1cd273bd7ec64bc87d89f61537471cd3e05e33a965a250e9") version("5.2.1", sha256="673553b91f9e18cc5792ed51075df8d510c9040f550a6f74e09c9add243a7e4f") diff --git a/var/spack/repos/builtin/packages/gcc/package.py b/var/spack/repos/builtin/packages/gcc/package.py index ba0379bf37e3f9..60b8d44b7a0a4f 100644 --- a/var/spack/repos/builtin/packages/gcc/package.py +++ b/var/spack/repos/builtin/packages/gcc/package.py @@ -3,7 +3,6 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) import glob -import itertools import os import sys @@ -52,6 +51,7 @@ class Gcc(AutotoolsPackage, GNUMirrorPackage, CompilerPackage): version("12.2.0", sha256="e549cf9cf3594a00e27b6589d4322d70e0720cdd213f39beb4181e06926230ff") version("12.1.0", sha256="62fd634889f31c02b64af2c468f064b47ad1ca78411c45abe6ac4b5f8dd19c7b") + version("11.5.0", sha256="a6e21868ead545cf87f0c01f84276e4b5281d672098591c1c896241f09363478") version("11.4.0", sha256="3f2db222b007e8a4a23cd5ba56726ef08e8b1f1eb2055ee72c1402cea73a8dd9") version("11.3.0", sha256="b47cf2818691f5b1e21df2bb38c795fac2cfbd640ede2d0a5e1c89e338a3ac39") version("11.2.0", sha256="d08edc536b54c372a1010ff6619dd274c0f1603aa49212ba20f7aa2cda36fa8b") @@ -593,7 +593,7 @@ def cc(self): if self.spec.external: return self.spec.extra_attributes["compilers"].get("c", None) result = None - if "languages=c" in self.spec: + if self.spec.satisfies("languages=c"): result = str(self.spec.prefix.bin.gcc) return result @@ -604,7 +604,7 @@ def cxx(self): if self.spec.external: return self.spec.extra_attributes["compilers"].get("cxx", None) result = None - if "languages=c++" in self.spec: + if self.spec.satisfies("languages=c++"): result = os.path.join(self.spec.prefix.bin, "g++") return result @@ -615,7 +615,7 @@ def fortran(self): if self.spec.external: return self.spec.extra_attributes["compilers"].get("fortran", None) result = None - if "languages=fortran" in self.spec: + if self.spec.satisfies("languages=fortran"): result = str(self.spec.prefix.bin.gfortran) return result @@ -711,7 +711,7 @@ def build_optimization_config(self): if "+bootstrap %gcc" in self.spec and self.spec.target.family != "aarch64": flags += " " + self.get_common_target_flags(self.spec) - if "+bootstrap" in self.spec: + if self.spec.satisfies("+bootstrap"): variables = ["BOOT_CFLAGS", "CFLAGS_FOR_TARGET", "CXXFLAGS_FOR_TARGET"] else: variables = ["CFLAGS", "CXXFLAGS"] @@ -752,12 +752,12 @@ def configure_args(self): if self.version >= Version("6"): options.append("--with-system-zlib") - if "zstd" in spec: + if spec.satisfies("^zstd"): options.append("--with-zstd-include={0}".format(spec["zstd"].headers.directories[0])) options.append("--with-zstd-lib={0}".format(spec["zstd"].libs.directories[0])) # Enabling language "jit" requires --enable-host-shared. - if "languages=jit" in spec: + if spec.satisfies("languages=jit"): options.append("--enable-host-shared") # Binutils @@ -832,7 +832,7 @@ def configure_args(self): options.append("--with-boot-ldflags=" + boot_ldflags) options.append("--with-build-config=spack") - if "languages=d" in spec: + if spec.satisfies("languages=d"): # Phobos is the standard library for the D Programming Language. The documentation says # that on some targets, 'libphobos' is not enabled by default, but compiles and works # if '--enable-libphobos' is used. Specifics are documented for affected targets. @@ -919,13 +919,13 @@ def nvptx_install(self): @property def build_targets(self): - if "+profiled" in self.spec: + if self.spec.satisfies("+profiled"): return ["profiledbootstrap"] return [] @property def install_targets(self): - if "+strip" in self.spec: + if self.spec.satisfies("+strip"): return ["install-strip"] return ["install"] @@ -979,33 +979,15 @@ def write_specs_file(self): tty.info(f"Wrote new spec file to {specs_file}") def setup_run_environment(self, env): - # Search prefix directory for possibly modified compiler names - from spack.compilers.gcc import Gcc as Compiler + if self.spec.satisfies("languages=c"): + env.set("CC", self.cc) - # Get the contents of the installed binary directory - bin_path = self.spec.prefix.bin + if self.spec.satisfies("languages=cxx"): + env.set("CXX", self.cxx) - if not os.path.isdir(bin_path): - return - - bin_contents = os.listdir(bin_path) - - # Find the first non-symlink compiler binary present for each language - for lang in ["cc", "cxx", "fc", "f77"]: - for filename, regexp in itertools.product(bin_contents, Compiler.search_regexps(lang)): - if not regexp.match(filename): - continue - - abspath = os.path.join(bin_path, filename) - - # Skip broken symlinks (https://github.com/spack/spack/issues/41327) - if not os.path.exists(abspath): - continue - - # Set the proper environment variable - env.set(lang.upper(), abspath) - # Stop searching filename/regex combos for this language - break + if self.spec.satisfies("languages=fortran"): + env.set("FC", self.fortran) + env.set("F77", self.fortran) def detect_gdc(self): """Detect and return the path to GDC that belongs to the same instance of GCC that is used diff --git a/var/spack/repos/builtin/packages/gdal/package.py b/var/spack/repos/builtin/packages/gdal/package.py index 386ea879544964..1253219e8bf091 100644 --- a/var/spack/repos/builtin/packages/gdal/package.py +++ b/var/spack/repos/builtin/packages/gdal/package.py @@ -32,6 +32,7 @@ class Gdal(CMakePackage, AutotoolsPackage, PythonExtension): license("MIT") + version("3.9.3", sha256="34a037852ffe6d2163f1b8948a1aa7019ff767148aea55876c1339b22ad751f1") version("3.9.2", sha256="bfbcc9f087f012c36151c20c79f8eac9529e1e5298fbded79cd5a1365f0b113a") version("3.9.1", sha256="aff3086fee75f5773e33a5598df98d8a4d10be411f777d3ce23584b21d8171ca") version("3.9.0", sha256="577f80e9d14ff7c90b6bfbc34201652b4546700c01543efb4f4c3050e0b3fda2") @@ -506,7 +507,7 @@ def determine_version(cls, exe): return Executable(exe)("--version", output=str, error=str).rstrip() def setup_run_environment(self, env): - if "+java" in self.spec: + if self.spec.satisfies("+java"): class_paths = find(self.prefix, "*.jar") classpath = os.pathsep.join(class_paths) env.prepend_path("CLASSPATH", classpath) @@ -523,7 +524,7 @@ def setup_run_environment(self, env): env.prepend_path("LD_LIBRARY_PATH", ":".join(libs)) def patch(self): - if "+java platform=darwin" in self.spec: + if self.spec.satisfies("+java platform=darwin"): filter_file("linux", "darwin", "swig/java/java.opt", string=True) filter_file("-lazy-ljvm", "-ljvm", "configure", string=True) @@ -641,7 +642,7 @@ def with_or_without(self, name, variant=None, package=None, attribute=None): if not variant: variant = name - if variant not in self.pkg.variants: + if not self.pkg.has_variant(variant): msg = '"{}" is not a variant of "{}"' raise KeyError(msg.format(variant, self.name)) @@ -751,7 +752,7 @@ def configure_args(self): self.with_or_without("perl"), self.with_or_without("php"), ] - if "+iconv" in self.spec: + if self.spec.satisfies("+iconv"): if self.spec["iconv"].name == "libiconv": args.append(f"--with-libiconv-prefix={self.spec['iconv'].prefix}") else: @@ -787,7 +788,7 @@ def configure_args(self): else: args.append(self.with_or_without("dwgdirect", variant="teigha", package="teigha")) - if "+hdf4" in self.spec: + if self.spec.satisfies("+hdf4"): hdf4 = self.spec["hdf"] if "+external-xdr" in hdf4 and hdf4["rpc"].name == "libtirpc": args.append("LIBS=" + hdf4["rpc"].libs.link_flags) @@ -800,19 +801,19 @@ def configure_args(self): def build(self, pkg, spec, prefix): # https://trac.osgeo.org/gdal/wiki/GdalOgrInJavaBuildInstructionsUnix make() - if "+java" in spec: + if spec.satisfies("+java"): with working_dir("swig/java"): make() def check(self): # no top-level test target - if "+java" in self.spec: + if self.spec.satisfies("+java"): with working_dir("swig/java"): make("test") def install(self, pkg, spec, prefix): make("install") - if "+java" in spec: + if spec.satisfies("+java"): with working_dir("swig/java"): make("install") install("*.jar", prefix) diff --git a/var/spack/repos/builtin/packages/gdb/package.py b/var/spack/repos/builtin/packages/gdb/package.py index 6367736ba96307..4b500ed36af40e 100644 --- a/var/spack/repos/builtin/packages/gdb/package.py +++ b/var/spack/repos/builtin/packages/gdb/package.py @@ -83,10 +83,14 @@ class Gdb(AutotoolsPackage, GNUMirrorPackage): depends_on("texinfo", type="build") # Optional dependencies - depends_on("python", when="+python", type=("build", "link", "run")) - # gdb@9.2 will segmentation fault if it builds with python@3.9. - # https://bugzilla.redhat.com/show_bug.cgi?id=1829702 - depends_on("python@:3.8", when="@:9.2+python", type=("build", "link", "run")) + with when("+python"), default_args(type=("build", "link", "run")): + depends_on("python") + # gdb@9.2 will segmentation fault if it builds with python@3.9. + # https://bugzilla.redhat.com/show_bug.cgi?id=1829702 + depends_on("python@:3.8", when="@:9.2") + # pyOS_ReadlineTState became private API in cpython commit + # d228825e08883fc13f35eb91435f95d32524931c + depends_on("python@:3.12", when="@:14.2") depends_on("xz", when="+xz") depends_on("zlib-api") depends_on("zstd", when="@13.1:") @@ -117,7 +121,7 @@ def configure_args(self): if self.spec.version >= Version("11.1"): args.append("--with-gmp={}".format(self.spec["gmp"].prefix)) - if "+python" in self.spec: + if self.spec.satisfies("+python"): args.append("--with-python={}".format(self.spec["python"].command)) args.append("LDFLAGS={}".format(self.spec["python"].libs.ld_flags)) @@ -125,7 +129,7 @@ def configure_args(self): @run_after("install") def gdbinit(self): - if "+python" in self.spec: + if self.spec.satisfies("+python"): tool = self.spec["python"].command.path + "-gdb.py" if os.path.exists(tool): mkdir(self.prefix.etc) diff --git a/var/spack/repos/builtin/packages/gdbm/package.py b/var/spack/repos/builtin/packages/gdbm/package.py index cd64cbc38db2de..0d7bf356ccee04 100644 --- a/var/spack/repos/builtin/packages/gdbm/package.py +++ b/var/spack/repos/builtin/packages/gdbm/package.py @@ -17,6 +17,7 @@ class Gdbm(AutotoolsPackage, GNUMirrorPackage): license("GPL-3.0-or-later") + version("1.24", sha256="695e9827fdf763513f133910bc7e6cfdb9187943a4fec943e57449723d2b8dbf") version("1.23", sha256="74b1081d21fff13ae4bd7c16e5d6e504a4c26f7cde1dca0d963a484174bbcacd") version("1.22", sha256="f366c823a6724af313b6bbe975b2809f9a157e5f6a43612a72949138d161d762") version("1.21", sha256="b0b7dbdefd798de7ddccdd8edf6693a30494f7789777838042991ef107339cc2") diff --git a/var/spack/repos/builtin/packages/gdk-pixbuf/package.py b/var/spack/repos/builtin/packages/gdk-pixbuf/package.py index 1dfe19f152164e..707d5978e218cf 100644 --- a/var/spack/repos/builtin/packages/gdk-pixbuf/package.py +++ b/var/spack/repos/builtin/packages/gdk-pixbuf/package.py @@ -15,15 +15,34 @@ class GdkPixbuf(Package): homepage = "https://gitlab.gnome.org/GNOME/gdk-pixbuf" url = "https://ftp.acc.umu.se/pub/gnome/sources/gdk-pixbuf/2.40/gdk-pixbuf-2.40.0.tar.xz" + git = "https://gitlab.gnome.org/GNOME/gdk-pixbuf" list_url = "https://ftp.acc.umu.se/pub/gnome/sources/gdk-pixbuf/" list_depth = 1 - license("LGPL-2.1-or-later") + license("LGPL-2.1-or-later", checked_by="wdconinc") - version("2.42.10", sha256="ee9b6c75d13ba096907a2e3c6b27b61bcd17f5c7ebeab5a5b439d2f2e39fe44b") - version("2.42.9", sha256="28f7958e7bf29a32d4e963556d241d0a41a6786582ff6a5ad11665e0347fc962") - version("2.42.6", sha256="c4a6b75b7ed8f58ca48da830b9fa00ed96d668d3ab4b1f723dcf902f78bde77f") - version("2.42.2", sha256="83c66a1cfd591d7680c144d2922c5955d38b4db336d7cd3ee109f7bcf9afef15") + version("2.42.12", sha256="b9505b3445b9a7e48ced34760c3bcb73e966df3ac94c95a148cb669ab748e3c7") + # https://nvd.nist.gov/vuln/detail/CVE-2022-48622 + version( + "2.42.10", + sha256="ee9b6c75d13ba096907a2e3c6b27b61bcd17f5c7ebeab5a5b439d2f2e39fe44b", + deprecated=True, + ) + version( + "2.42.9", + sha256="28f7958e7bf29a32d4e963556d241d0a41a6786582ff6a5ad11665e0347fc962", + deprecated=True, + ) + version( + "2.42.6", + sha256="c4a6b75b7ed8f58ca48da830b9fa00ed96d668d3ab4b1f723dcf902f78bde77f", + deprecated=True, + ) + version( + "2.42.2", + sha256="83c66a1cfd591d7680c144d2922c5955d38b4db336d7cd3ee109f7bcf9afef15", + deprecated=True, + ) # https://nvd.nist.gov/vuln/detail/CVE-2021-20240 version( "2.40.0", @@ -46,7 +65,7 @@ class GdkPixbuf(Package): deprecated=True, ) - depends_on("c", type="build") # generated + depends_on("c", type="build") variant("x11", default=False, description="Enable X11 support", when="@:2.41") variant("tiff", default=False, description="Enable TIFF support(partially broken)") @@ -100,7 +119,7 @@ def install(self, spec, prefix): meson_args += ["-Dtests={0}".format(self.run_tests)] # Based on suggestion by luigi-calori and the fixup shown by lee218llnl: # https://github.com/spack/spack/pull/27254#issuecomment-974464174 - if "+x11" in spec: + if spec.satisfies("+x11"): if self.version >= Version("2.42"): raise InstallError("+x11 is not valid for {0}".format(self.version)) meson_args += ["-Dx11=true"] diff --git a/var/spack/repos/builtin/packages/gdl/package.py b/var/spack/repos/builtin/packages/gdl/package.py index fb95e6f63e0d92..79804fce3c0d3e 100644 --- a/var/spack/repos/builtin/packages/gdl/package.py +++ b/var/spack/repos/builtin/packages/gdl/package.py @@ -87,42 +87,42 @@ def cmake_args(self): # only version 6 of ImageMagick is supported (version 7 is packaged) args += ["-DMAGICK=OFF"] - if "+graphicsmagick" in self.spec: + if self.spec.satisfies("+graphicsmagick"): args += ["-DGRAPHICSMAGICK=ON"] else: args += ["-DGRAPHICSMAGICK=OFF"] - if "+hdf4" in self.spec: + if self.spec.satisfies("+hdf4"): args += ["-DHDF=ON"] else: args += ["-DHDF=OFF"] - if "+hdf5" in self.spec: + if self.spec.satisfies("+hdf5"): args += ["-DHDF5=ON"] else: args += ["-DHDF5=OFF"] - if "+openmp" in self.spec: + if self.spec.satisfies("+openmp"): args += ["-DOPENMP=ON"] else: args += ["-DOPENMP=OFF"] - if "+proj" in self.spec: + if self.spec.satisfies("+proj"): args += ["-DLIBPROJ4=ON", "-DLIBPROJ4DIR={0}".format(self.spec["proj"].prefix)] else: args += ["-DLIBPROJ4=OFF"] - if "+python" in self.spec: + if self.spec.satisfies("+python"): args += ["-DPYTHON_MODULE=ON"] else: args += ["-DPYTHON_MODULE=OFF"] - if "+wx" in self.spec: + if self.spec.satisfies("+wx"): args += ["-DWXWIDGETS=ON"] else: args += ["-DWXWIDGETS=OFF"] - if "+x11" in self.spec: + if self.spec.satisfies("+x11"): args += ["-DX11=ON"] else: args += ["-DX11=OFF"] @@ -131,7 +131,7 @@ def cmake_args(self): @run_after("install") def post_install(self): - if "+python" in self.spec: + if self.spec.satisfies("+python"): # gdl installs the python module into prefix/lib/site-python # move it to the standard location src = os.path.join(self.spec.prefix.lib, "site-python") diff --git a/var/spack/repos/builtin/packages/gdrcopy/package.py b/var/spack/repos/builtin/packages/gdrcopy/package.py index 9b99a81319fe39..c9b9640c6204ee 100644 --- a/var/spack/repos/builtin/packages/gdrcopy/package.py +++ b/var/spack/repos/builtin/packages/gdrcopy/package.py @@ -30,7 +30,14 @@ class Gdrcopy(MakefilePackage, CudaPackage): # Don't call ldconfig: https://github.com/NVIDIA/gdrcopy/pull/229 patch("ldconfig.patch", when="@2.0:2.3") - + # Allow tests to build against libcuda.so stub + patch( + "https://github.com/NVIDIA/gdrcopy/commit/508dd6179dcb04ba7720e2da5124b77bbdb615b0.patch?full_index=1", + sha256="cc18b13b6ea5512959464a85a43cdfda0bee5522a471e98ca76ba379bf582b5a", + when="@2.0:2.3", + ) + + depends_on("pkgconfig", type="build", when="@2.0:2.3") depends_on("check") requires("+cuda") diff --git a/var/spack/repos/builtin/packages/geant3/package.py b/var/spack/repos/builtin/packages/geant3/package.py index 966f9fd58692e7..5f0ede0e58db9a 100644 --- a/var/spack/repos/builtin/packages/geant3/package.py +++ b/var/spack/repos/builtin/packages/geant3/package.py @@ -43,5 +43,5 @@ def cmake_args(self): return args def setup_build_environment(self, env): - if "platform=darwin" in self.spec: + if self.spec.satisfies("platform=darwin"): env.unset("MACOSX_DEPLOYMENT_TARGET") diff --git a/var/spack/repos/builtin/packages/geant4/package.py b/var/spack/repos/builtin/packages/geant4/package.py index 2de7ab7b861665..a606c9c7e1cdcc 100644 --- a/var/spack/repos/builtin/packages/geant4/package.py +++ b/var/spack/repos/builtin/packages/geant4/package.py @@ -78,6 +78,7 @@ class Geant4(CMakePackage): variant("x11", default=False, description="Optional X11 support") variant("motif", default=False, description="Optional motif support") variant("qt", default=False, description="Enable Qt support") + variant("hdf5", default=False, description="Enable HDF5 support", when="@10.4:") variant("python", default=False, description="Enable Python bindings", when="@10.6.2:11.0") variant("tbb", default=False, description="Use TBB as a tasking backend", when="@11:") variant("timemory", default=False, description="Use TiMemory for profiling", when="@9.5:") @@ -140,6 +141,9 @@ class Geant4(CMakePackage): depends_on("vecgeom@1.1.0", when="@10.5.0:10.5") depends_on("vecgeom@0.5.2", when="@10.4.0:10.4") + with when("+hdf5"): + depends_on("hdf5 +threadsafe") + def std_when(values): for v in values: if isinstance(v, _ConditionalVariantValues): @@ -191,6 +195,9 @@ def std_when(values): # See https://bugzilla-geant4.kek.jp/show_bug.cgi?id=2556 patch("package-cache.patch", level=1, when="@10.7.0:11.1.2^cmake@3.17:") + # Issue with Twisted tubes, see https://bugzilla-geant4.kek.jp/show_bug.cgi?id=2619 + patch("twisted-tubes.patch", level=1, when="@11.2.0:11.2.2") + # NVHPC: "thread-local declaration follows non-thread-local declaration" conflicts("%nvhpc", when="+threads") @@ -282,7 +289,7 @@ def cmake_args(self): options.append(self.define_from_variant("GEANT4_BUILD_MULTITHREADED", "threads")) options.append(self.define_from_variant("GEANT4_USE_TBB", "tbb")) - if "+threads" in spec: + if spec.satisfies("+threads"): # Locked at global-dynamic to allow use cases that load the # geant4 libs at application runtime options.append(self.define("GEANT4_BUILD_TLS_MODEL", "global-dynamic")) @@ -297,25 +304,27 @@ def cmake_args(self): options.append(self.define("GEANT4_INSTALL_DATADIR", self.datadir)) # Vecgeom - if "+vecgeom" in spec: + if spec.satisfies("+vecgeom"): options.append(self.define("GEANT4_USE_USOLIDS", True)) options.append(self.define("USolids_DIR", spec["vecgeom"].prefix.lib.CMake.USolids)) # Visualization options if "platform=darwin" not in spec: - if "+x11 +opengl" in spec: + if spec.satisfies("+x11 +opengl"): options.append(self.define("GEANT4_USE_OPENGL_X11", True)) - if "+motif +opengl" in spec: + if spec.satisfies("+motif +opengl"): options.append(self.define("GEANT4_USE_XM", True)) - if "+x11" in spec: + if spec.satisfies("+x11"): options.append(self.define("GEANT4_USE_RAYTRACER_X11", True)) - if "+qt" in spec: + if spec.satisfies("+qt"): options.append(self.define("GEANT4_USE_QT", True)) - if "^[virtuals=qmake] qt-base" in spec: + if spec.satisfies("^[virtuals=qmake] qt-base"): options.append(self.define("GEANT4_USE_QT_QT6", True)) options.append(self.define("QT_QMAKE_EXECUTABLE", spec["qmake"].prefix.bin.qmake)) + options.append(self.define_from_variant("GEANT4_USE_HDF5", "hdf5")) + options.append(self.define_from_variant("GEANT4_USE_VTK", "vtk")) # Python diff --git a/var/spack/repos/builtin/packages/geant4/twisted-tubes.patch b/var/spack/repos/builtin/packages/geant4/twisted-tubes.patch new file mode 100644 index 00000000000000..6039025829665d --- /dev/null +++ b/var/spack/repos/builtin/packages/geant4/twisted-tubes.patch @@ -0,0 +1,875 @@ +diff --git a/source/geometry/solids/specific/include/G4TwistedTubs.hh b/source/geometry/solids/specific/include/G4TwistedTubs.hh +index b8be4e629da8edb87c8e7fdcb12ae243fbb910e4..e6ca127646f1aa1f60b04b5100123ccfff9b698c 100644 +--- a/source/geometry/solids/specific/include/G4TwistedTubs.hh ++++ b/source/geometry/solids/specific/include/G4TwistedTubs.hh +@@ -226,109 +226,6 @@ class G4TwistedTubs : public G4VSolid + mutable G4bool fRebuildPolyhedron = false; + mutable G4Polyhedron* fpPolyhedron = nullptr; // polyhedron for vis + +- class LastState // last Inside result +- { +- public: +- LastState() +- { +- p.set(kInfinity,kInfinity,kInfinity); +- inside = kOutside; +- } +- ~LastState()= default; +- LastState(const LastState& r) = default; +- LastState& operator=(const LastState& r) +- { +- if (this == &r) { return *this; } +- p = r.p; inside = r.inside; +- return *this; +- } +- public: +- G4ThreeVector p; +- EInside inside; +- }; +- +- class LastVector // last SurfaceNormal result +- { +- public: +- LastVector() +- { +- p.set(kInfinity,kInfinity,kInfinity); +- vec.set(kInfinity,kInfinity,kInfinity); +- surface = new G4VTwistSurface*[1]; +- } +- ~LastVector() +- { +- delete [] surface; +- } +- LastVector(const LastVector& r) : p(r.p), vec(r.vec) +- { +- surface = new G4VTwistSurface*[1]; +- surface[0] = r.surface[0]; +- } +- LastVector& operator=(const LastVector& r) +- { +- if (&r == this) { return *this; } +- p = r.p; vec = r.vec; +- delete [] surface; surface = new G4VTwistSurface*[1]; +- surface[0] = r.surface[0]; +- return *this; +- } +- public: +- G4ThreeVector p; +- G4ThreeVector vec; +- G4VTwistSurface **surface; +- }; +- +- class LastValue // last G4double value +- { +- public: +- LastValue() +- { +- p.set(kInfinity,kInfinity,kInfinity); +- value = DBL_MAX; +- } +- ~LastValue()= default; +- LastValue(const LastValue& r) = default; +- LastValue& operator=(const LastValue& r) +- { +- if (this == &r) { return *this; } +- p = r.p; value = r.value; +- return *this; +- } +- public: +- G4ThreeVector p; +- G4double value; +- }; +- +- class LastValueWithDoubleVector // last G4double value +- { +- public: +- LastValueWithDoubleVector() +- { +- p.set(kInfinity,kInfinity,kInfinity); +- vec.set(kInfinity,kInfinity,kInfinity); +- value = DBL_MAX; +- } +- ~LastValueWithDoubleVector()= default; +- LastValueWithDoubleVector(const LastValueWithDoubleVector& r) = default; +- LastValueWithDoubleVector& operator=(const LastValueWithDoubleVector& r) +- { +- if (this == &r) { return *this; } +- p = r.p; vec = r.vec; value = r.value; +- return *this; +- } +- public: +- G4ThreeVector p; +- G4ThreeVector vec; +- G4double value; +- }; +- +- LastState fLastInside; +- LastVector fLastNormal; +- LastValue fLastDistanceToIn; +- LastValue fLastDistanceToOut; +- LastValueWithDoubleVector fLastDistanceToInWithV; +- LastValueWithDoubleVector fLastDistanceToOutWithV; + }; + + //===================================================================== +diff --git a/source/geometry/solids/specific/include/G4VTwistedFaceted.hh b/source/geometry/solids/specific/include/G4VTwistedFaceted.hh +index 3d58ba0b242bb4ddc900a3bf0dfd404252cc42e3..6c412c390d0bf780abfe68fdaa89ea76e3264f7c 100644 +--- a/source/geometry/solids/specific/include/G4VTwistedFaceted.hh ++++ b/source/geometry/solids/specific/include/G4VTwistedFaceted.hh +@@ -190,110 +190,6 @@ class G4VTwistedFaceted: public G4VSolid + G4VTwistSurface* fSide180 ; // Twisted Side at phi = 180 deg + G4VTwistSurface* fSide270 ; // Twisted Side at phi = 270 deg + +- private: +- +- class LastState // last Inside result +- { +- public: +- LastState() +- { +- p.set(kInfinity,kInfinity,kInfinity); inside = kOutside; +- } +- ~LastState()= default; +- LastState(const LastState& r) = default; +- LastState& operator=(const LastState& r) +- { +- if (this == &r) { return *this; } +- p = r.p; inside = r.inside; +- return *this; +- } +- public: +- G4ThreeVector p; +- EInside inside; +- }; +- +- class LastVector // last SurfaceNormal result +- { +- public: +- LastVector() +- { +- p.set(kInfinity,kInfinity,kInfinity); +- vec.set(kInfinity,kInfinity,kInfinity); +- surface = new G4VTwistSurface*[1]; +- } +- ~LastVector() +- { +- delete [] surface; +- } +- LastVector(const LastVector& r) : p(r.p), vec(r.vec) +- { +- surface = new G4VTwistSurface*[1]; +- surface[0] = r.surface[0]; +- } +- LastVector& operator=(const LastVector& r) +- { +- if (&r == this) { return *this; } +- p = r.p; vec = r.vec; +- delete [] surface; surface = new G4VTwistSurface*[1]; +- surface[0] = r.surface[0]; +- return *this; +- } +- public: +- G4ThreeVector p; +- G4ThreeVector vec; +- G4VTwistSurface **surface; +- }; +- +- class LastValue // last G4double value +- { +- public: +- LastValue() +- { +- p.set(kInfinity,kInfinity,kInfinity); +- value = DBL_MAX; +- } +- ~LastValue()= default; +- LastValue(const LastValue& r) = default; +- LastValue& operator=(const LastValue& r) +- { +- if (this == &r) { return *this; } +- p = r.p; value = r.value; +- return *this; +- } +- public: +- G4ThreeVector p; +- G4double value; +- }; +- +- class LastValueWithDoubleVector // last G4double value +- { +- public: +- LastValueWithDoubleVector() +- { +- p.set(kInfinity,kInfinity,kInfinity); +- vec.set(kInfinity,kInfinity,kInfinity); +- value = DBL_MAX; +- } +- ~LastValueWithDoubleVector()= default; +- LastValueWithDoubleVector(const LastValueWithDoubleVector& r) = default; +- LastValueWithDoubleVector& operator=(const LastValueWithDoubleVector& r) +- { +- if (this == &r) { return *this; } +- p = r.p; vec = r.vec; value = r.value; +- return *this; +- } +- public: +- G4ThreeVector p; +- G4ThreeVector vec; +- G4double value; +- }; +- +- LastState fLastInside; +- LastVector fLastNormal; +- LastValue fLastDistanceToIn; +- LastValue fLastDistanceToOut; +- LastValueWithDoubleVector fLastDistanceToInWithV; +- LastValueWithDoubleVector fLastDistanceToOutWithV; + }; + + //===================================================================== +diff --git a/source/geometry/solids/specific/src/G4TwistedTubs.cc b/source/geometry/solids/specific/src/G4TwistedTubs.cc +index 60dea7239081e58af194ecbe6cdeb33781a069b3..e8e414fabd74ecd1e2ed83ee8c072b932e9ae6dd 100644 +--- a/source/geometry/solids/specific/src/G4TwistedTubs.cc ++++ b/source/geometry/solids/specific/src/G4TwistedTubs.cc +@@ -56,6 +56,7 @@ namespace + G4Mutex polyhedronMutex = G4MUTEX_INITIALIZER; + } + ++ + //===================================================================== + //* constructors ------------------------------------------------------ + +@@ -223,12 +224,7 @@ G4TwistedTubs::G4TwistedTubs(const G4TwistedTubs& rhs) + fTanOuterStereo2(rhs.fTanOuterStereo2), + fLowerEndcap(nullptr), fUpperEndcap(nullptr), fLatterTwisted(nullptr), fFormerTwisted(nullptr), + fInnerHype(nullptr), fOuterHype(nullptr), +- fCubicVolume(rhs.fCubicVolume), fSurfaceArea(rhs.fSurfaceArea), +- fLastInside(rhs.fLastInside), fLastNormal(rhs.fLastNormal), +- fLastDistanceToIn(rhs.fLastDistanceToIn), +- fLastDistanceToOut(rhs.fLastDistanceToOut), +- fLastDistanceToInWithV(rhs.fLastDistanceToInWithV), +- fLastDistanceToOutWithV(rhs.fLastDistanceToOutWithV) ++ fCubicVolume(rhs.fCubicVolume), fSurfaceArea(rhs.fSurfaceArea) + { + for (auto i=0; i<2; ++i) + { +@@ -268,11 +264,6 @@ G4TwistedTubs& G4TwistedTubs::operator = (const G4TwistedTubs& rhs) + fLowerEndcap= fUpperEndcap= fLatterTwisted= fFormerTwisted= nullptr; + fInnerHype= fOuterHype= nullptr; + fCubicVolume= rhs.fCubicVolume; fSurfaceArea= rhs.fSurfaceArea; +- fLastInside= rhs.fLastInside; fLastNormal= rhs.fLastNormal; +- fLastDistanceToIn= rhs.fLastDistanceToIn; +- fLastDistanceToOut= rhs.fLastDistanceToOut; +- fLastDistanceToInWithV= rhs.fLastDistanceToInWithV; +- fLastDistanceToOutWithV= rhs.fLastDistanceToOutWithV; + + for (auto i=0; i<2; ++i) + { +@@ -381,44 +372,32 @@ EInside G4TwistedTubs::Inside(const G4ThreeVector& p) const + // G4Timer timer(timerid, "G4TwistedTubs", "Inside"); + // timer.Start(); + +- G4ThreeVector *tmpp; +- EInside *tmpinside; +- if (fLastInside.p == p) +- { +- return fLastInside.inside; +- } +- else +- { +- tmpp = const_cast(&(fLastInside.p)); +- tmpinside = const_cast(&(fLastInside.inside)); +- tmpp->set(p.x(), p.y(), p.z()); +- } + + EInside outerhypearea = ((G4TwistTubsHypeSide *)fOuterHype)->Inside(p); + G4double innerhyperho = ((G4TwistTubsHypeSide *)fInnerHype)->GetRhoAtPZ(p); + G4double distanceToOut = p.getRho() - innerhyperho; // +ve: inside +- ++ EInside tmpinside; + if ((outerhypearea == kOutside) || (distanceToOut < -halftol)) + { +- *tmpinside = kOutside; ++ tmpinside = kOutside; + } + else if (outerhypearea == kSurface) + { +- *tmpinside = kSurface; ++ tmpinside = kSurface; + } + else + { + if (distanceToOut <= halftol) + { +- *tmpinside = kSurface; ++ tmpinside = kSurface; + } + else + { +- *tmpinside = kInside; ++ tmpinside = kInside; + } + } + +- return fLastInside.inside; ++ return tmpinside; + } + + //===================================================================== +@@ -433,14 +412,6 @@ G4ThreeVector G4TwistedTubs::SurfaceNormal(const G4ThreeVector& p) const + // Which of the three or four surfaces are we closest to? + // + +- if (fLastNormal.p == p) +- { +- return fLastNormal.vec; +- } +- auto tmpp = const_cast(&(fLastNormal.p)); +- auto tmpnormal = const_cast(&(fLastNormal.vec)); +- auto tmpsurface = const_cast(fLastNormal.surface); +- tmpp->set(p.x(), p.y(), p.z()); + + G4double distance = kInfinity; + +@@ -466,10 +437,7 @@ G4ThreeVector G4TwistedTubs::SurfaceNormal(const G4ThreeVector& p) const + } + } + +- tmpsurface[0] = surfaces[besti]; +- *tmpnormal = tmpsurface[0]->GetNormal(bestxx, true); +- +- return fLastNormal.vec; ++ return surfaces[besti]->GetNormal(bestxx, true); + } + + //===================================================================== +@@ -485,26 +453,6 @@ G4double G4TwistedTubs::DistanceToIn (const G4ThreeVector& p, + // The function returns kInfinity if no intersection or + // just grazing within tolerance. + +- // +- // checking last value +- // +- +- G4ThreeVector* tmpp; +- G4ThreeVector* tmpv; +- G4double* tmpdist; +- if ((fLastDistanceToInWithV.p == p) && (fLastDistanceToInWithV.vec == v)) +- { +- return fLastDistanceToIn.value; +- } +- else +- { +- tmpp = const_cast(&(fLastDistanceToInWithV.p)); +- tmpv = const_cast(&(fLastDistanceToInWithV.vec)); +- tmpdist = const_cast(&(fLastDistanceToInWithV.value)); +- tmpp->set(p.x(), p.y(), p.z()); +- tmpv->set(v.x(), v.y(), v.z()); +- } +- + // + // Calculate DistanceToIn(p,v) + // +@@ -524,8 +472,7 @@ G4double G4TwistedTubs::DistanceToIn (const G4ThreeVector& p, + G4ThreeVector normal = SurfaceNormal(p); + if (normal*v < 0) + { +- *tmpdist = 0.; +- return fLastDistanceToInWithV.value; ++ return 0; + } + } + } +@@ -557,9 +504,7 @@ G4double G4TwistedTubs::DistanceToIn (const G4ThreeVector& p, + bestxx = xx; + } + } +- *tmpdist = distance; +- +- return fLastDistanceToInWithV.value; ++ return distance; + } + + //===================================================================== +@@ -570,23 +515,6 @@ G4double G4TwistedTubs::DistanceToIn (const G4ThreeVector& p) const + // DistanceToIn(p): + // Calculate distance to surface of shape from `outside', + // allowing for tolerance +- +- // +- // checking last value +- // +- +- G4ThreeVector* tmpp; +- G4double* tmpdist; +- if (fLastDistanceToIn.p == p) +- { +- return fLastDistanceToIn.value; +- } +- else +- { +- tmpp = const_cast(&(fLastDistanceToIn.p)); +- tmpdist = const_cast(&(fLastDistanceToIn.value)); +- tmpp->set(p.x(), p.y(), p.z()); +- } + + // + // Calculate DistanceToIn(p) +@@ -600,8 +528,7 @@ G4double G4TwistedTubs::DistanceToIn (const G4ThreeVector& p) const + {} + case (kSurface) : + { +- *tmpdist = 0.; +- return fLastDistanceToIn.value; ++ return 0; + } + case (kOutside) : + { +@@ -628,8 +555,7 @@ G4double G4TwistedTubs::DistanceToIn (const G4ThreeVector& p) const + bestxx = xx; + } + } +- *tmpdist = distance; +- return fLastDistanceToIn.value; ++ return distance; + } + default : + { +@@ -656,32 +582,11 @@ G4double G4TwistedTubs::DistanceToOut( const G4ThreeVector& p, + // The function returns kInfinity if no intersection or + // just grazing within tolerance. + +- // +- // checking last value +- // +- +- G4ThreeVector* tmpp; +- G4ThreeVector* tmpv; +- G4double* tmpdist; +- if ((fLastDistanceToOutWithV.p == p) && (fLastDistanceToOutWithV.vec == v) ) +- { +- return fLastDistanceToOutWithV.value; +- } +- else +- { +- tmpp = const_cast(&(fLastDistanceToOutWithV.p)); +- tmpv = const_cast(&(fLastDistanceToOutWithV.vec)); +- tmpdist = const_cast(&(fLastDistanceToOutWithV.value)); +- tmpp->set(p.x(), p.y(), p.z()); +- tmpv->set(v.x(), v.y(), v.z()); +- } +- + // + // Calculate DistanceToOut(p,v) + // + + EInside currentside = Inside(p); +- + if (currentside == kOutside) + { + } +@@ -693,16 +598,14 @@ G4double G4TwistedTubs::DistanceToOut( const G4ThreeVector& p, + // If the particle is exiting from the volume, return 0. + // + G4ThreeVector normal = SurfaceNormal(p); +- G4VTwistSurface *blockedsurface = fLastNormal.surface[0]; + if (normal*v > 0) + { + if (calcNorm) + { +- *norm = (blockedsurface->GetNormal(p, true)); +- *validNorm = blockedsurface->IsValidNorm(); ++ *norm = normal; ++ *validNorm = true; + } +- *tmpdist = 0.; +- return fLastDistanceToOutWithV.value; ++ return 0; + } + } + } +@@ -746,9 +649,7 @@ G4double G4TwistedTubs::DistanceToOut( const G4ThreeVector& p, + } + } + +- *tmpdist = distance; +- +- return fLastDistanceToOutWithV.value; ++ return distance; + } + + +@@ -761,23 +662,6 @@ G4double G4TwistedTubs::DistanceToOut( const G4ThreeVector& p ) const + // Calculate distance to surface of shape from `inside', + // allowing for tolerance + +- // +- // checking last value +- // +- +- G4ThreeVector* tmpp; +- G4double* tmpdist; +- if (fLastDistanceToOut.p == p) +- { +- return fLastDistanceToOut.value; +- } +- else +- { +- tmpp = const_cast(&(fLastDistanceToOut.p)); +- tmpdist = const_cast(&(fLastDistanceToOut.value)); +- tmpp->set(p.x(), p.y(), p.z()); +- } +- + // + // Calculate DistanceToOut(p) + // +@@ -791,8 +675,7 @@ G4double G4TwistedTubs::DistanceToOut( const G4ThreeVector& p ) const + } + case (kSurface) : + { +- *tmpdist = 0.; +- return fLastDistanceToOut.value; ++ return 0; + } + case (kInside) : + { +@@ -819,9 +702,7 @@ G4double G4TwistedTubs::DistanceToOut( const G4ThreeVector& p ) const + bestxx = xx; + } + } +- *tmpdist = distance; +- +- return fLastDistanceToOut.value; ++ return distance; + } + default : + { +diff --git a/source/geometry/solids/specific/src/G4VTwistedFaceted.cc b/source/geometry/solids/specific/src/G4VTwistedFaceted.cc +index b8d5c74539453e7a5a5f99623c5e4c9477ff8014..5a524e3398509d340955028835cdf6d52b70b66b 100644 +--- a/source/geometry/solids/specific/src/G4VTwistedFaceted.cc ++++ b/source/geometry/solids/specific/src/G4VTwistedFaceted.cc +@@ -54,6 +54,7 @@ namespace + G4Mutex polyhedronMutex = G4MUTEX_INITIALIZER; + } + ++ + //===================================================================== + //* constructors ------------------------------------------------------ + +@@ -222,12 +223,7 @@ G4VTwistedFaceted::G4VTwistedFaceted(const G4VTwistedFaceted& rhs) + fDx3(rhs.fDx3), fDx4(rhs.fDx4), fDz(rhs.fDz), fDx(rhs.fDx), fDy(rhs.fDy), + fAlph(rhs.fAlph), fTAlph(rhs.fTAlph), fdeltaX(rhs.fdeltaX), + fdeltaY(rhs.fdeltaY), fPhiTwist(rhs.fPhiTwist), fLowerEndcap(nullptr), +- fUpperEndcap(nullptr), fSide0(nullptr), fSide90(nullptr), fSide180(nullptr), fSide270(nullptr), +- fLastInside(rhs.fLastInside), fLastNormal(rhs.fLastNormal), +- fLastDistanceToIn(rhs.fLastDistanceToIn), +- fLastDistanceToOut(rhs.fLastDistanceToOut), +- fLastDistanceToInWithV(rhs.fLastDistanceToInWithV), +- fLastDistanceToOutWithV(rhs.fLastDistanceToOutWithV) ++ fUpperEndcap(nullptr), fSide0(nullptr), fSide90(nullptr), fSide180(nullptr), fSide270(nullptr) + { + CreateSurfaces(); + } +@@ -257,11 +253,6 @@ G4VTwistedFaceted& G4VTwistedFaceted::operator = (const G4VTwistedFaceted& rhs) + fCubicVolume= rhs.fCubicVolume; fSurfaceArea= rhs.fSurfaceArea; + fRebuildPolyhedron = false; + delete fpPolyhedron; fpPolyhedron = nullptr; +- fLastInside= rhs.fLastInside; fLastNormal= rhs.fLastNormal; +- fLastDistanceToIn= rhs.fLastDistanceToIn; +- fLastDistanceToOut= rhs.fLastDistanceToOut; +- fLastDistanceToInWithV= rhs.fLastDistanceToInWithV; +- fLastDistanceToOutWithV= rhs.fLastDistanceToOutWithV; + + CreateSurfaces(); + +@@ -347,20 +338,7 @@ G4VTwistedFaceted::CalculateExtent( const EAxis pAxis, + EInside G4VTwistedFaceted::Inside(const G4ThreeVector& p) const + { + +- G4ThreeVector *tmpp; +- EInside *tmpin; +- if (fLastInside.p == p) +- { +- return fLastInside.inside; +- } +- else +- { +- tmpp = const_cast(&(fLastInside.p)); +- tmpin = const_cast(&(fLastInside.inside)); +- tmpp->set(p.x(), p.y(), p.z()); +- } +- +- *tmpin = kOutside ; ++ EInside tmpin = kOutside ; + + G4double phi = p.z()/(2*fDz) * fPhiTwist ; // rotate the point to z=0 + G4double cphi = std::cos(-phi) ; +@@ -414,13 +392,13 @@ EInside G4VTwistedFaceted::Inside(const G4ThreeVector& p) const + if ( posy <= yMax - kCarTolerance*0.5 + && posy >= yMin + kCarTolerance*0.5 ) + { +- if (std::fabs(posz) <= fDz - kCarTolerance*0.5 ) *tmpin = kInside ; +- else if (std::fabs(posz) <= fDz + kCarTolerance*0.5 ) *tmpin = kSurface ; ++ if (std::fabs(posz) <= fDz - kCarTolerance*0.5 ) tmpin = kInside ; ++ else if (std::fabs(posz) <= fDz + kCarTolerance*0.5 ) tmpin = kSurface ; + } + else if ( posy <= yMax + kCarTolerance*0.5 + && posy >= yMin - kCarTolerance*0.5 ) + { +- if (std::fabs(posz) <= fDz + kCarTolerance*0.5 ) *tmpin = kSurface ; ++ if (std::fabs(posz) <= fDz + kCarTolerance*0.5 ) tmpin = kSurface ; + } + } + else if ( posx <= xMax + kCarTolerance*0.5 +@@ -429,15 +407,15 @@ EInside G4VTwistedFaceted::Inside(const G4ThreeVector& p) const + if ( posy <= yMax + kCarTolerance*0.5 + && posy >= yMin - kCarTolerance*0.5 ) + { +- if (std::fabs(posz) <= fDz + kCarTolerance*0.5) *tmpin = kSurface ; ++ if (std::fabs(posz) <= fDz + kCarTolerance*0.5) tmpin = kSurface ; + } + } + + #ifdef G4TWISTDEBUG +- G4cout << "inside = " << fLastInside.inside << G4endl ; ++ G4cout << "inside = " << tmpin << G4endl ; + #endif + +- return fLastInside.inside; ++ return tmpin; + + } + +@@ -454,15 +432,6 @@ G4ThreeVector G4VTwistedFaceted::SurfaceNormal(const G4ThreeVector& p) const + // Which of the three or four surfaces are we closest to? + // + +- if (fLastNormal.p == p) +- { +- return fLastNormal.vec; +- } +- +- auto tmpp = const_cast(&(fLastNormal.p)); +- auto tmpnormal = const_cast(&(fLastNormal.vec)); +- auto tmpsurface = const_cast(fLastNormal.surface); +- tmpp->set(p.x(), p.y(), p.z()); + + G4double distance = kInfinity; + +@@ -490,10 +459,7 @@ G4ThreeVector G4VTwistedFaceted::SurfaceNormal(const G4ThreeVector& p) const + } + } + +- tmpsurface[0] = surfaces[besti]; +- *tmpnormal = tmpsurface[0]->GetNormal(bestxx, true); +- +- return fLastNormal.vec; ++ return surfaces[besti]->GetNormal(bestxx, true); + } + + +@@ -510,26 +476,6 @@ G4double G4VTwistedFaceted::DistanceToIn (const G4ThreeVector& p, + // The function returns kInfinity if no intersection or + // just grazing within tolerance. + +- // +- // checking last value +- // +- +- G4ThreeVector* tmpp; +- G4ThreeVector* tmpv; +- G4double* tmpdist; +- if (fLastDistanceToInWithV.p == p && fLastDistanceToInWithV.vec == v) +- { +- return fLastDistanceToIn.value; +- } +- else +- { +- tmpp = const_cast(&(fLastDistanceToInWithV.p)); +- tmpv = const_cast(&(fLastDistanceToInWithV.vec)); +- tmpdist = const_cast(&(fLastDistanceToInWithV.value)); +- tmpp->set(p.x(), p.y(), p.z()); +- tmpv->set(v.x(), v.y(), v.z()); +- } +- + // + // Calculate DistanceToIn(p,v) + // +@@ -547,8 +493,7 @@ G4double G4VTwistedFaceted::DistanceToIn (const G4ThreeVector& p, + G4ThreeVector normal = SurfaceNormal(p); + if (normal*v < 0) + { +- *tmpdist = 0.; +- return fLastDistanceToInWithV.value; ++ return 0; + } + } + +@@ -574,7 +519,7 @@ G4double G4VTwistedFaceted::DistanceToIn (const G4ThreeVector& p, + for (const auto & surface : surfaces) + { + #ifdef G4TWISTDEBUG +- G4cout << G4endl << "surface " << i << ": " << G4endl << G4endl ; ++ G4cout << G4endl << "surface " << &surface - &*surfaces << ": " << G4endl << G4endl ; + #endif + G4double tmpdistance = surface->DistanceToIn(p, v, xx); + #ifdef G4TWISTDEBUG +@@ -592,9 +537,8 @@ G4double G4VTwistedFaceted::DistanceToIn (const G4ThreeVector& p, + G4cout << "best distance = " << distance << G4endl ; + #endif + +- *tmpdist = distance; + // timer.Stop(); +- return fLastDistanceToInWithV.value; ++ return distance; + } + + +@@ -608,23 +552,6 @@ G4double G4VTwistedFaceted::DistanceToIn (const G4ThreeVector& p) const + // allowing for tolerance + // + +- // +- // checking last value +- // +- +- G4ThreeVector* tmpp; +- G4double* tmpdist; +- if (fLastDistanceToIn.p == p) +- { +- return fLastDistanceToIn.value; +- } +- else +- { +- tmpp = const_cast(&(fLastDistanceToIn.p)); +- tmpdist = const_cast(&(fLastDistanceToIn.value)); +- tmpp->set(p.x(), p.y(), p.z()); +- } +- + // + // Calculate DistanceToIn(p) + // +@@ -639,8 +566,7 @@ G4double G4VTwistedFaceted::DistanceToIn (const G4ThreeVector& p) const + + case (kSurface) : + { +- *tmpdist = 0.; +- return fLastDistanceToIn.value; ++ return 0; + } + + case (kOutside) : +@@ -671,8 +597,7 @@ G4double G4VTwistedFaceted::DistanceToIn (const G4ThreeVector& p) const + bestxx = xx; + } + } +- *tmpdist = distance; +- return fLastDistanceToIn.value; ++ return distance; + } + + default: +@@ -702,26 +627,6 @@ G4VTwistedFaceted::DistanceToOut( const G4ThreeVector& p, + // The function returns kInfinity if no intersection or + // just grazing within tolerance. + +- // +- // checking last value +- // +- +- G4ThreeVector* tmpp; +- G4ThreeVector* tmpv; +- G4double* tmpdist; +- if (fLastDistanceToOutWithV.p == p && fLastDistanceToOutWithV.vec == v ) +- { +- return fLastDistanceToOutWithV.value; +- } +- else +- { +- tmpp = const_cast(&(fLastDistanceToOutWithV.p)); +- tmpv = const_cast(&(fLastDistanceToOutWithV.vec)); +- tmpdist = const_cast(&(fLastDistanceToOutWithV.value)); +- tmpp->set(p.x(), p.y(), p.z()); +- tmpv->set(v.x(), v.y(), v.z()); +- } +- + // + // Calculate DistanceToOut(p,v) + // +@@ -737,17 +642,15 @@ G4VTwistedFaceted::DistanceToOut( const G4ThreeVector& p, + // if the particle is exiting from the volume, return 0 + // + G4ThreeVector normal = SurfaceNormal(p); +- G4VTwistSurface *blockedsurface = fLastNormal.surface[0]; + if (normal*v > 0) + { + if (calcNorm) + { +- *norm = (blockedsurface->GetNormal(p, true)); +- *validNorm = blockedsurface->IsValidNorm(); ++ *norm = normal; ++ *validNorm = true; + } +- *tmpdist = 0.; + // timer.Stop(); +- return fLastDistanceToOutWithV.value; ++ return 0; + } + } + +@@ -789,8 +692,7 @@ G4VTwistedFaceted::DistanceToOut( const G4ThreeVector& p, + } + } + +- *tmpdist = distance; +- return fLastDistanceToOutWithV.value; ++ return distance; + } + + +@@ -802,24 +704,6 @@ G4double G4VTwistedFaceted::DistanceToOut( const G4ThreeVector& p ) const + // DistanceToOut(p): + // Calculate distance to surface of shape from `inside', + // allowing for tolerance +- +- // +- // checking last value +- // +- +- G4ThreeVector* tmpp; +- G4double* tmpdist; +- +- if (fLastDistanceToOut.p == p) +- { +- return fLastDistanceToOut.value; +- } +- else +- { +- tmpp = const_cast(&(fLastDistanceToOut.p)); +- tmpdist = const_cast(&(fLastDistanceToOut.value)); +- tmpp->set(p.x(), p.y(), p.z()); +- } + + // + // Calculate DistanceToOut(p) +@@ -848,8 +732,7 @@ G4double G4VTwistedFaceted::DistanceToOut( const G4ThreeVector& p ) const + } + case (kSurface) : + { +- *tmpdist = 0.; +- retval = fLastDistanceToOut.value; ++ retval = 0; + break; + } + +@@ -881,9 +764,7 @@ G4double G4VTwistedFaceted::DistanceToOut( const G4ThreeVector& p ) const + bestxx = xx; + } + } +- *tmpdist = distance; +- +- retval = fLastDistanceToOut.value; ++ retval = distance; + break; + } + diff --git a/var/spack/repos/builtin/packages/genemark-et/package.py b/var/spack/repos/builtin/packages/genemark-et/package.py index 8a344157fed7d5..0a65beaa6252c4 100644 --- a/var/spack/repos/builtin/packages/genemark-et/package.py +++ b/var/spack/repos/builtin/packages/genemark-et/package.py @@ -62,8 +62,7 @@ def filter_sbang(self): pattern = "^#!.*/usr/bin/perl" repl = "#!{0}".format(self.spec["perl"].command.path) files = glob.iglob("*.pl") - for file in files: - filter_file(pattern, repl, *files, backup=False) + filter_file(pattern, repl, *files, backup=False) def setup_run_environment(self, env): env.prepend_path("PERL5LIB", self.prefix.lib) diff --git a/var/spack/repos/builtin/packages/genesis/package.py b/var/spack/repos/builtin/packages/genesis/package.py index d12d5c900663bc..61ccc3dfe37644 100644 --- a/var/spack/repos/builtin/packages/genesis/package.py +++ b/var/spack/repos/builtin/packages/genesis/package.py @@ -84,7 +84,7 @@ def configure_args(self): options.extend(self.enable_or_disable("openmp")) options.extend(self.enable_or_disable("single")) options.extend(self.enable_or_disable("hmdisk")) - if "+cuda" in spec: + if spec.satisfies("+cuda"): options.append("--enable-gpu") options.append("--with-cuda=%s" % spec["cuda"].prefix) else: @@ -99,7 +99,7 @@ def setup_build_environment(self, env): env.set("CC", self.spec["mpi"].mpicc, force=True) env.set("CXX", self.spec["mpi"].mpicxx, force=True) env.set("LAPACK_LIBS", self.spec["lapack"].libs.ld_flags) - if "+cuda" in self.spec: + if self.spec.satisfies("+cuda"): cuda_arch = self.spec.variants["cuda_arch"].value cuda_gencode = " ".join(self.cuda_flags(cuda_arch)) env.set("NVCCFLAGS", cuda_gencode) diff --git a/var/spack/repos/builtin/packages/genie/package.py b/var/spack/repos/builtin/packages/genie/package.py index 1193687e1e01c6..590307649c677d 100644 --- a/var/spack/repos/builtin/packages/genie/package.py +++ b/var/spack/repos/builtin/packages/genie/package.py @@ -22,6 +22,7 @@ class Genie(Package): maintainers("davehadley") version("master", branch="master") + version("3.4.2", sha256="c5935aea86d2ba9897ab55bb581622c561575957d19e572691d3bc0833ed9512") version("3.0.6", sha256="ab56ea85d0c1d09029254365bfe75a1427effa717389753b9e0c1b6c2eaa5eaf") version("3.0.4", sha256="53f034618fef9f7f0e17d1c4ed72743e4bba590e824b795177a1a8a8486c861e") version("3.0.2", sha256="34d6c37017b2387c781aea7bc727a0aac0ef45d6b3f3982cc6f3fc82493f65c3") @@ -60,9 +61,16 @@ class Genie(Package): # GENIE Makefile's think that the spack compiler is invalid. # Disables this check. patch("genie_disable_gopt_with_compiler_check.patch", level=0, when="@2.11:") + patch("GENIE-Generator.patch") patch("GENIE-Reweight.patch") + patch( + "https://patch-diff.githubusercontent.com/raw/GENIE-MC/Generator/pull/376.patch?full_index=1", + sha256="7eca9bf44251cd99edd962483ca24c5072f8e2eee688f1e95b076425f2dc59f6", + when="@3.4.2", + ) + # Flags for GENIE"s optional but disabled by default features variant( "atmo", default=False, description="Enable GENIE Atmospheric neutrino event generation app" @@ -134,17 +142,17 @@ def _configure_args(self, spec, prefix): "--with-lhapdf6-inc=" + spec["lhapdf"].prefix.include, "--with-lhapdf6-lib=" + spec["lhapdf"].prefix.lib, ] - if "+vleextension" in self.spec: + if self.spec.satisfies("+vleextension"): args += ["--enable-vle-extension"] - if "+t2k" in self.spec: + if self.spec.satisfies("+t2k"): args += ["--enable-t2k"] - if "+fnal" in self.spec: + if self.spec.satisfies("+fnal"): args += ["--enable-fnal"] - if "+atmo" in self.spec: + if self.spec.satisfies("+atmo"): args += ["--enable-atmo"] - if "+nucleondecay" in self.spec: + if self.spec.satisfies("+nucleondecay"): args += ["--enable-nucleon-decay"] - if "+masterclass" in self.spec: + if self.spec.satisfies("+masterclass"): args += ["--enable-masterclass"] return args diff --git a/var/spack/repos/builtin/packages/genomeworks/package.py b/var/spack/repos/builtin/packages/genomeworks/package.py index 5c8263440d64df..4128923dbc1021 100644 --- a/var/spack/repos/builtin/packages/genomeworks/package.py +++ b/var/spack/repos/builtin/packages/genomeworks/package.py @@ -59,7 +59,7 @@ class Genomeworks(CMakePackage, CudaPackage): def cmake_args(self): args = [] spec = self.spec - if "+cuda" in spec: + if spec.satisfies("+cuda"): args.append("-DWITH_CUDA=ON") args.append("-Dgw_cuda_gen_all_arch=ON") args.append("-DTHRUST_IGNORE_CUB_VERSION_CHECK=ON") diff --git a/var/spack/repos/builtin/packages/geomodel/package.py b/var/spack/repos/builtin/packages/geomodel/package.py index 43f81110c54477..9d5978f7120e99 100644 --- a/var/spack/repos/builtin/packages/geomodel/package.py +++ b/var/spack/repos/builtin/packages/geomodel/package.py @@ -18,6 +18,8 @@ class Geomodel(CMakePackage): license("Apache-2.0", checked_by="wdconinc") + version("7.0.0", sha256="9ad86e9f3e2d67b9056b70550d347db8017f4d5acf829804afc61e4fe7b6a527") + version("6.5.0", sha256="8a2f71493e54ea4d393f4c0075f3ca13df132f172c891825f3ab949cda052c5f") version("6.4.0", sha256="369f91f021be83d294ba6a9bdbe00077625e9fe798a396aceece8970e7dd5838") version("6.3.0", sha256="d2b101e06d20a8a3b638e6021f517a939f49ea6d8347ce40c927c27efe66b28c") version("6.2.0", sha256="99bb3908bf710ce5ba0bcdd192942705a183a9f2886079df091dc69423b7bdf1") diff --git a/var/spack/repos/builtin/packages/geopm-runtime/package.py b/var/spack/repos/builtin/packages/geopm-runtime/package.py index 974daed7d04737..74fb3736eebfe0 100644 --- a/var/spack/repos/builtin/packages/geopm-runtime/package.py +++ b/var/spack/repos/builtin/packages/geopm-runtime/package.py @@ -58,6 +58,7 @@ class GeopmRuntime(AutotoolsPackage): # Autotools dependencies depends_on("automake", type="build") + depends_on("autoconf", type="build") depends_on("libtool", type="build") depends_on("file") @@ -113,7 +114,7 @@ def configure_directory(self): @property def install_targets(self): target = ["install"] - if "+checkprogs" in self.spec: + if self.spec.satisfies("+checkprogs"): target += ["checkprogs"] return target @@ -161,7 +162,7 @@ def setup_run_environment(self, env): lib_dir = self.prefix.lib env.prepend_path("LD_LIBRARY_PATH", lib_dir) - if "+checkprogs" in self.spec: + if self.spec.satisfies("+checkprogs"): env.set("GEOPM_SOURCE", self.stage.source_path) env.prepend_path("PYTHONPATH", self.stage.source_path) env.set("GEOPM_INSTALL", self.prefix) diff --git a/var/spack/repos/builtin/packages/geopm-service/package.py b/var/spack/repos/builtin/packages/geopm-service/package.py index 54aa00e6b14494..2bfaa68a0026e6 100644 --- a/var/spack/repos/builtin/packages/geopm-service/package.py +++ b/var/spack/repos/builtin/packages/geopm-service/package.py @@ -67,6 +67,7 @@ class GeopmService(AutotoolsPackage): # Autotools dependencies depends_on("automake", type="build") + depends_on("autoconf", type="build") depends_on("libtool", type="build") depends_on("file") @@ -141,7 +142,7 @@ def configure_args(self): args += self.enable_or_disable("levelzero") args += self.enable_or_disable("nvml") - if "+nvml" in self.spec: + if self.spec.satisfies("+nvml"): args += [ "--with-nvml=" + join_path( diff --git a/var/spack/repos/builtin/packages/geos/package.py b/var/spack/repos/builtin/packages/geos/package.py index d84f45d3c2798d..1359fdb8bce82c 100644 --- a/var/spack/repos/builtin/packages/geos/package.py +++ b/var/spack/repos/builtin/packages/geos/package.py @@ -22,6 +22,7 @@ class Geos(CMakePackage): license("LGPL-2.1-or-later") maintainers("adamjstewart") + version("3.13.0", sha256="47ec83ff334d672b9e4426695f15da6e6368244214971fabf386ff8ef6df39e4") version("3.12.2", sha256="34c7770bf0090ee88488af98767d08e779f124fa33437e0aabec8abd4609fec6") version("3.12.1", sha256="d6ea7e492224b51193e8244fe3ec17c4d44d0777f3c32ca4fb171140549a0d03") version("3.12.0", sha256="d96db96011259178a35555a0f6d6e75a739e52a495a6b2aa5efb3d75390fbc39") @@ -66,10 +67,11 @@ class Geos(CMakePackage): version("3.3.4", sha256="cd5400aa5f3fe32246dfed5d238c5017e1808162c865c016480b3e6c07271904") version("3.3.3", sha256="dfcf4bd70ab212a5b7bad21d01b84748f101a545092b56dafdc3882ef3bddec9") - depends_on("c", type="build") # generated - depends_on("cxx", type="build") # generated + depends_on("c", type="build") + depends_on("cxx", type="build") generator("ninja") + depends_on("cmake@3.15:", when="@3.13:", type="build") depends_on("cmake@3.13:", when="@3.10:", type="build") depends_on("cmake@3.8:", type="build") @@ -89,7 +91,7 @@ def cmake_args(self): args = [] # https://github.com/libgeos/geos/issues/460 - if "%intel" in self.spec: + if self.spec.satisfies("%intel"): args.append(self.define("BUILD_ASTYLE", False)) args.append(self.define_from_variant("BUILD_SHARED_LIBS", "shared")) diff --git a/var/spack/repos/builtin/packages/gettext/package.py b/var/spack/repos/builtin/packages/gettext/package.py index 063835f048aa69..9b761b9f77f235 100644 --- a/var/spack/repos/builtin/packages/gettext/package.py +++ b/var/spack/repos/builtin/packages/gettext/package.py @@ -31,8 +31,8 @@ class Gettext(AutotoolsPackage, GNUMirrorPackage): version("0.19.8.1", sha256="105556dbc5c3fbbc2aa0edb46d22d055748b6f5c7cd7a8d99f8e7eb84e938be4") version("0.19.7", sha256="378fa86a091cec3acdece3c961bb8d8c0689906287809a8daa79dc0c6398d934") - depends_on("c", type="build") # generated - depends_on("cxx", type="build") # generated + depends_on("c", type="build") + depends_on("cxx", type="build") # Recommended variants variant("curses", default=True, description="Use libncurses") @@ -83,7 +83,7 @@ def patch(self): # From the configure script: "we don't want to use an external libxml, because its # dependencies and their dynamic relocations have an impact on the startup time", well, # *we* do. - if self.spec.satisfies("@0.20:"): # libtextstyle/configure not present prior + if self.spec.satisfies("@0.20:+libxml2"): # libtextstyle/configure not present prior filter_file( "gl_cv_libxml_force_included=yes", "gl_cv_libxml_force_included=no", @@ -93,7 +93,7 @@ def patch(self): def flag_handler(self, name, flags): # this goes together with gl_cv_libxml_force_included=no - if name == "ldflags": + if name == "ldflags" and self.spec.satisfies("+libxml2"): flags.append("-lxml2") return (flags, None, None) @@ -125,12 +125,12 @@ def configure_args(self): else: config_args.append("--without-libiconv-prefix") - if "+curses" in spec: + if spec.satisfies("+curses"): config_args.append("--with-ncurses-prefix={0}".format(spec["ncurses"].prefix)) else: config_args.append("--disable-curses") - if "+libxml2" in spec: + if spec.satisfies("+libxml2"): config_args.append("--with-libxml2-prefix={0}".format(spec["libxml2"].prefix)) else: config_args.append("--with-included-libxml") @@ -141,7 +141,7 @@ def configure_args(self): if "+xz" not in spec: config_args.append("--without-xz") - if "+libunistring" in spec: + if spec.satisfies("+libunistring"): config_args.append( "--with-libunistring-prefix={0}".format(spec["libunistring"].prefix) ) diff --git a/var/spack/repos/builtin/packages/gfal2-util/package.py b/var/spack/repos/builtin/packages/gfal2-util/package.py new file mode 100644 index 00000000000000..874b1f58d7f0ca --- /dev/null +++ b/var/spack/repos/builtin/packages/gfal2-util/package.py @@ -0,0 +1,21 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class Gfal2Util(PythonPackage): + """CLI for gfal2.""" + + homepage = "https://dmc-docs.web.cern.ch/dmc-docs/gfal2-util.html" + url = "https://github.com/cern-fts/gfal2-util/archive/refs/tags/v1.9.0.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("1.9.0", sha256="9a5194b7ac80381c0787ec7c2405cc3e060fc03bb99e80bbeb388ec3675cb13d") + + depends_on("py-setuptools", type="build") diff --git a/var/spack/repos/builtin/packages/gfal2/package.py b/var/spack/repos/builtin/packages/gfal2/package.py new file mode 100644 index 00000000000000..4b892903c5017a --- /dev/null +++ b/var/spack/repos/builtin/packages/gfal2/package.py @@ -0,0 +1,91 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class Gfal2(CMakePackage): + """Multi-protocol data management library.""" + + homepage = "https://dmc-docs.web.cern.ch/dmc-docs/" + url = "https://github.com/cern-fts/gfal2/archive/refs/tags/v2.23.0.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("2.23.0", sha256="e3fc9c2ccb2f54b1d0d460545e1b6c581470d2a2968928a8973045089892e509") + + variant("dcap", default=False, description="Enable dcap plugin") + variant("file", default=False, description="Enable file plugin") + variant("gridftp", default=False, description="Enable gridftp plugin") + variant("http", default=False, description="Enable http plugin") + variant("sftp", default=False, description="Enable sftp plugin") + variant("sftp", default=False, description="Enable sftp plugin") + variant("srm", default=False, description="Enable srm plugin") + variant("xrootd", default=False, description="Enable xrootd plugin") + + depends_on("c", type="build") + depends_on("cxx", type="build") + + depends_on("glib") + depends_on("json-c") + depends_on("openldap") + + depends_on("dcap", when="+dcap") + depends_on("zlib", when="+file") + depends_on("davix +thirdparty", when="+http") + depends_on("cryptopp", when="+http") + depends_on("libssh2", when="+sftp") + depends_on("xrootd", when="+xrootd") + + with when("+gridftp"): + depends_on("globus-common") + depends_on("globus-ftp-client") + depends_on("globus-ftp-control") + depends_on("globus-gass-copy") + depends_on("globus-gss-assist") + depends_on("globus-gssapi-gsi") + + with when("+srm"): + depends_on("globus-common") + depends_on("globus-gss-assist") + depends_on("globus-gssapi-gsi") + depends_on("srm-ifce") + + depends_on("googletest", type="test") + + def patch(self): + # FindCryptopp.cmake looks in user-specified ${CRYPTOPP_LOCATION} + # for both library and headers + filter_file( + r"find_library\(CRYPTOPP_LIBRARIES", + "find_library(CRYPTOPP_LIBRARIES PATH_SUFFIXES lib lib64", + "cmake/modules/FindCryptopp.cmake", + ) + filter_file( + r"find_path\(CRYPTOPP_INCLUDE_DIRS", + "find_path(CRYPTOPP_INCLUDE_DIRS PATH_SUFFIXES include/cryptopp", + "cmake/modules/FindCryptopp.cmake", + ) + + def cmake_args(self): + args = [ + self.define("MAIN_CORE", True), + self.define("MAIN_TRANSFER", True), + self.define("SKIP_TESTS", not self.run_tests), + self.define_from_variant("PLUGIN_DCAP", "dcap"), + self.define_from_variant("PLUGIN_FILE", "file"), + self.define_from_variant("PLUGIN_GRIDFTP", "gridftp"), + self.define_from_variant("PLUGIN_HTTP", "http"), + self.define_from_variant("PLUGIN_SFTP", "sftp"), + self.define_from_variant("PLUGIN_SRM", "srm"), + self.define_from_variant("PLUGIN_XROOTD", "xrootd"), + ] + if self.spec.satisfies("+http"): + args.append(self.define("CRYPTOPP_LOCATION", self.spec["cryptopp"].prefix)) + if self.spec.satisfies("+xrootd"): + args.append(self.define("XROOTD_LOCATION", self.spec["xrootd"].prefix)) + return args diff --git a/var/spack/repos/builtin/packages/gh/package.py b/var/spack/repos/builtin/packages/gh/package.py index 90f40c6313812b..fddbc6311b7337 100644 --- a/var/spack/repos/builtin/packages/gh/package.py +++ b/var/spack/repos/builtin/packages/gh/package.py @@ -16,6 +16,7 @@ class Gh(GoPackage): license("MIT") + version("2.58.0", sha256="90894536c797147586db775d06ec2040c45cd7eef941f7ccbea46f4e5997c81c") version("2.50.0", sha256="683d0dee90e1d24a6673d13680e0d41963ddc6dd88580ab5119acec790d1b4d7") version("2.49.2", sha256="e839ea302ad99b70ce3efcb903f938ecbbb919798e49bc2f2034ad506ae0b0f5") version("2.43.1", sha256="1ea3f451fb7002c1fb95a7fab21e9ab16591058492628fe264c5878e79ec7c90") @@ -43,10 +44,24 @@ class Gh(GoPackage): depends_on("go@1.21:", type="build", when="@2.33.0:") depends_on("go@1.22:", type="build", when="@2.47.0:") - -class GoBuilder(spack.build_systems.go.GoBuilder): @property def build_args(self): args = super().build_args args.extend(["-trimpath", "./cmd/gh"]) return args + + @run_after("install") + def install_completions(self): + gh = Executable(self.prefix.bin.gh) + + mkdirp(bash_completion_path(self.prefix)) + with open(bash_completion_path(self.prefix) / "gh", "w") as file: + gh("completion", "-s", "bash", output=file) + + mkdirp(fish_completion_path(self.prefix)) + with open(fish_completion_path(self.prefix) / "gh.fish", "w") as file: + gh("completion", "-s", "fish", output=file) + + mkdirp(zsh_completion_path(self.prefix)) + with open(zsh_completion_path(self.prefix) / "_gh", "w") as file: + gh("completion", "-s", "zsh", output=file) diff --git a/var/spack/repos/builtin/packages/gimp/package.py b/var/spack/repos/builtin/packages/gimp/package.py index d3c01af6697efb..5634be93063352 100644 --- a/var/spack/repos/builtin/packages/gimp/package.py +++ b/var/spack/repos/builtin/packages/gimp/package.py @@ -25,6 +25,7 @@ class Gimp(AutotoolsPackage): license("GPL-3.0-or-later") + version("2.10.38", sha256="50a845eec11c8831fe8661707950f5b8446e35f30edfb9acf98f85c1133f856e") version("2.10.32", sha256="3f15c70554af5dcc1b46e6dc68f3d8f0a6cc9fe56b6d78ac08c0fd859ab89a25") version("2.10.30", sha256="88815daa76ed7d4277eeb353358bafa116cd2fcd2c861d95b95135c1d52b67dc") version("2.10.28", sha256="4f4dc22cff1ab5f026feaa2ab55e05775b3a11e198186b47bdab79cbfa078826") @@ -100,7 +101,7 @@ def configure_args(self): "GIO_USE_TLS=gnutls", "GIO_EXTRA_MODULES={0}/lib/gio/modules".format(self.spec["glib-networking"].prefix), ] - if "+libxpm" in self.spec: + if self.spec.satisfies("+libxpm"): args.append("--with-libxpm={0}".format(self.spec["libxpm"].prefix)) return args diff --git a/var/spack/repos/builtin/packages/ginkgo/package.py b/var/spack/repos/builtin/packages/ginkgo/package.py index b4638d9666f1b4..dd5dc4b557db94 100644 --- a/var/spack/repos/builtin/packages/ginkgo/package.py +++ b/var/spack/repos/builtin/packages/ginkgo/package.py @@ -129,7 +129,7 @@ class Ginkgo(CMakePackage, CudaPackage, ROCmPackage): def setup_build_environment(self, env): spec = self.spec - if "+sycl" in spec: + if spec.satisfies("+sycl"): env.set("MKLROOT", join_path(spec["intel-oneapi-mkl"].prefix, "mkl", "latest")) env.set("DPL_ROOT", join_path(spec["intel-oneapi-dpl"].prefix, "dpl", "latest")) # The `IntelSYCLConfig.cmake` is broken with spack. By default, it @@ -189,13 +189,13 @@ def cmake_args(self): if self.run_tests: args.append("-DGINKGO_USE_EXTERNAL_GTEST=ON") - if "+cuda" in spec: + if spec.satisfies("+cuda"): archs = spec.variants["cuda_arch"].value if archs != "none": arch_str = ";".join(archs) args.append("-DGINKGO_CUDA_ARCHITECTURES={0}".format(arch_str)) - if "+rocm" in spec: + if spec.satisfies("+rocm"): args.append("-DHIP_PATH={0}".format(spec["hip"].prefix)) args.append("-DHIP_CLANG_PATH={0}/bin".format(spec["llvm-amdgpu"].prefix)) args.append("-DHIP_CLANG_INCLUDE_PATH={0}/include".format(spec["llvm-amdgpu"].prefix)) @@ -213,7 +213,7 @@ def cmake_args(self): self.define("CMAKE_MODULE_PATH", self.spec["hip"].prefix.lib.cmake.hip) ) - if "+sycl" in self.spec: + if self.spec.satisfies("+sycl"): sycl_compatible_compilers = ["icpx"] if not (os.path.basename(self.compiler.cxx) in sycl_compatible_compilers): raise InstallError("ginkgo +sycl requires icpx compiler.") @@ -243,7 +243,7 @@ def _build_and_run_test(self, script): ] # Fix: For HIP tests, add the ARCH compilation flags when not present - if "+rocm" in self.spec: + if self.spec.satisfies("+rocm"): src_path = join_path(src_dir, "CMakeLists.txt") cmakelists = open(src_path, "rt") data = cmakelists.read() diff --git a/var/spack/repos/builtin/packages/git-annex/package.py b/var/spack/repos/builtin/packages/git-annex/package.py index 62df61d23e0fb0..2cecdfce1bfb31 100644 --- a/var/spack/repos/builtin/packages/git-annex/package.py +++ b/var/spack/repos/builtin/packages/git-annex/package.py @@ -124,7 +124,7 @@ def determine_version(cls, exe): def install(self, spec, prefix): install_tree(".", prefix.bin) - if "~standalone" in spec: + if spec.satisfies("~standalone"): # use git provided by spack instead of the one in the package git_files = ["git", "git-receive-pack", "git-shell", "git-upload-pack"] for i in git_files: diff --git a/var/spack/repos/builtin/packages/git/package.py b/var/spack/repos/builtin/packages/git/package.py index bc4803a6b20be5..da8c14c6ad170a 100644 --- a/var/spack/repos/builtin/packages/git/package.py +++ b/var/spack/repos/builtin/packages/git/package.py @@ -185,7 +185,7 @@ def setup_build_environment(self, env): # In that case the node in the DAG gets truncated and git DOES NOT # have a gettext dependency. spec = self.spec - if "+nls" in spec: + if spec.satisfies("+nls"): if "intl" in spec["gettext"].libs.names: extlib_bits = [] if not is_system_path(spec["gettext"].prefix): @@ -200,7 +200,7 @@ def setup_build_environment(self, env): # For build step: env.append_flags("EXTLIBS", curlconfig("--static-libs", output=str).strip()) - if "~perl" in self.spec: + if self.spec.satisfies("~perl"): env.append_flags("NO_PERL", "1") def configure_args(self): @@ -216,14 +216,14 @@ def configure_args(self): if self.spec["iconv"].name == "libiconv": configure_args.append(f"--with-iconv={self.spec['iconv'].prefix}") - if "+perl" in self.spec: + if self.spec.satisfies("+perl"): configure_args.append("--with-perl={0}".format(spec["perl"].command.path)) - if "^pcre" in self.spec: + if self.spec.satisfies("^pcre"): configure_args.append("--with-libpcre={0}".format(spec["pcre"].prefix)) - if "^pcre2" in self.spec: + if self.spec.satisfies("^pcre2"): configure_args.append("--with-libpcre2={0}".format(spec["pcre2"].prefix)) - if "+tcltk" in self.spec: + if self.spec.satisfies("+tcltk"): configure_args.append("--with-tcltk={0}".format(self.spec["tk"].prefix.bin.wish)) else: configure_args.append("--without-tcltk") @@ -241,7 +241,7 @@ def check(self): def build(self, spec, prefix): args = [] - if "~nls" in self.spec: + if self.spec.satisfies("~nls"): args.append("NO_GETTEXT=1") make(*args) @@ -251,7 +251,7 @@ def build(self, spec, prefix): def install(self, spec, prefix): args = ["install"] - if "~nls" in self.spec: + if self.spec.satisfies("~nls"): args.append("NO_GETTEXT=1") make(*args) @@ -263,11 +263,26 @@ def install(self, spec, prefix): @run_after("install") def install_completions(self): - install_tree("contrib/completion", self.prefix.share) + mkdirp(bash_completion_path(self.prefix)) + install( + "contrib/completion/git-completion.bash", + join_path(bash_completion_path(self.prefix), "git"), + ) + + mkdirp(zsh_completion_path(self.prefix)) + filter_file( + r"\$bash_completion\/git", + join_path(bash_completion_path(self.prefix), "git"), + "contrib/completion/git-completion.zsh", + ) + install( + "contrib/completion/git-completion.zsh", + join_path(zsh_completion_path(self.prefix), "_git"), + ) @run_after("install") def install_manpages(self): - if "~man" in self.spec: + if self.spec.satisfies("~man"): return prefix = self.prefix @@ -279,7 +294,7 @@ def install_manpages(self): @run_after("install") def install_subtree(self): - if "+subtree" in self.spec: + if self.spec.satisfies("+subtree"): with working_dir("contrib/subtree"): make_args = ["V=1", "prefix={}".format(self.prefix.bin)] make(" ".join(make_args)) @@ -292,7 +307,7 @@ def setup_run_environment(self, env): # Libs from perl-alien-svn and apr-util are required in # LD_LIBRARY_PATH # TODO: extend to other platforms - if "+svn platform=linux" in self.spec: + if self.spec.satisfies("+svn platform=linux"): perl_svn = self.spec["perl-alien-svn"] env.prepend_path( "LD_LIBRARY_PATH", diff --git a/var/spack/repos/builtin/packages/gl2ps/package.py b/var/spack/repos/builtin/packages/gl2ps/package.py index af24489a976a9e..6826fd4fb00721 100644 --- a/var/spack/repos/builtin/packages/gl2ps/package.py +++ b/var/spack/repos/builtin/packages/gl2ps/package.py @@ -63,7 +63,7 @@ def cmake_args(self): if spec.satisfies("platform=windows"): options.append(self.define_from_variant("BUILD_SHARED_LIBS", "shared")) - if "~doc" in spec: + if spec.satisfies("~doc"): # Make sure we don't look. options.append(self.define("CMAKE_DISABLE_FIND_PACKAGE_LATEX", True)) diff --git a/var/spack/repos/builtin/packages/glab/package.py b/var/spack/repos/builtin/packages/glab/package.py index fb4d9007fb6fca..58ed827e1fd112 100644 --- a/var/spack/repos/builtin/packages/glab/package.py +++ b/var/spack/repos/builtin/packages/glab/package.py @@ -6,7 +6,7 @@ from spack.package import * -class Glab(Package): +class Glab(GoPackage): """GitLab's official command line tool.""" homepage = "https://gitlab.com/gitlab-org/cli" @@ -16,6 +16,7 @@ class Glab(Package): license("MIT") + version("1.46.1", sha256="935f732ddacc6e54fc83d06351fc25454ac8a58c465c3efa43e066ea226257c2") version("1.36.0", sha256="8d6c759ebfe9c6942fcdb7055a4a5c7209a3b22beb25947f906c9aef3bc067e8") version("1.35.0", sha256="7ed31c7a9b425fc15922f83c5dd8634a2758262a4f25f92583378655fcad6303") version("1.33.0", sha256="447a9b76acb5377642a4975908f610a3082026c176329c7c8cfed1461d2e1570") @@ -31,18 +32,29 @@ class Glab(Package): version("1.20.0", sha256="6beb0186fa50d0dea3b05fcfe6e4bc1f9be0c07aa5fa15b37ca2047b16980412") depends_on("go@1.13:", type="build") - depends_on("go@1.17:", type="build", when="@1.22.0:") - depends_on("go@1.18:", type="build", when="@1.23.0:") - - phases = ["build", "install"] - - def setup_build_environment(self, env): - # Point GOPATH at the top of the staging dir for the build step. - env.prepend_path("GOPATH", self.stage.path) - - def build(self, spec, prefix): - make() - - def install(self, spec, prefix): - mkdirp(prefix.bin) - install("bin/glab", prefix.bin) + depends_on("go@1.17:", type="build", when="@1.22:") + depends_on("go@1.18:", type="build", when="@1.23:") + depends_on("go@1.19:", type="build", when="@1.35:") + depends_on("go@1.21:", type="build", when="@1.37:") + depends_on("go@1.22.3:", type="build", when="@1.41:") + depends_on("go@1.22.4:", type="build", when="@1.42:") + depends_on("go@1.22.5:", type="build", when="@1.44:") + depends_on("go@1.23:", type="build", when="@1.46:") + + build_directory = "cmd/glab" + + @run_after("install") + def install_completions(self): + glab = Executable(self.prefix.bin.glab) + + mkdirp(bash_completion_path(self.prefix)) + with open(bash_completion_path(self.prefix) / "glab", "w") as file: + glab("completion", "-s", "bash", output=file) + + mkdirp(fish_completion_path(self.prefix)) + with open(fish_completion_path(self.prefix) / "glab.fish", "w") as file: + glab("completion", "-s", "fish", output=file) + + mkdirp(zsh_completion_path(self.prefix)) + with open(zsh_completion_path(self.prefix) / "_glab", "w") as file: + glab("completion", "-s", "zsh", output=file) diff --git a/var/spack/repos/builtin/packages/glib/package.py b/var/spack/repos/builtin/packages/glib/package.py index 90ad73946da22a..1d378bb4a5dc23 100644 --- a/var/spack/repos/builtin/packages/glib/package.py +++ b/var/spack/repos/builtin/packages/glib/package.py @@ -292,20 +292,20 @@ class MesonBuilder(BaseBuilder, spack.build_systems.meson.MesonBuilder): def meson_args(self): args = [] if self.spec.satisfies("@2.63.5:"): - if "+libmount" in self.spec: + if self.spec.satisfies("+libmount"): args.append("-Dlibmount=enabled") else: args.append("-Dlibmount=disabled") else: - if "+libmount" in self.spec: + if self.spec.satisfies("+libmount"): args.append("-Dlibmount=true") else: args.append("-Dlibmount=false") - if "tracing=dtrace" in self.spec: + if self.spec.satisfies("tracing=dtrace"): args.append("-Ddtrace=true") else: args.append("-Ddtrace=false") - if "tracing=systemtap" in self.spec: + if self.spec.satisfies("tracing=systemtap"): args.append("-Dsystemtap=true") else: args.append("-Dsystemtap=false") @@ -337,7 +337,7 @@ def fix_python_path(self): class AutotoolsBuilder(BaseBuilder, spack.build_systems.autotools.AutotoolsBuilder): def configure_args(self): args = [] - if "+libmount" in self.spec: + if self.spec.satisfies("+libmount"): args.append("--enable-libmount") else: args.append("--disable-libmount") @@ -356,7 +356,7 @@ def configure_args(self): else: args.append("--disable-" + value) else: - if "tracing=dtrace" in self.spec or "tracing=systemtap" in self.spec: + if self.spec.satisfies("tracing=dtrace") or self.spec.satisfies("tracing=systemtap"): args.append("--enable-tracing") else: args.append("--disable-tracing") diff --git a/var/spack/repos/builtin/packages/globalarrays/package.py b/var/spack/repos/builtin/packages/globalarrays/package.py index 82ad9080f602a1..bf7844924c70f8 100644 --- a/var/spack/repos/builtin/packages/globalarrays/package.py +++ b/var/spack/repos/builtin/packages/globalarrays/package.py @@ -75,7 +75,7 @@ def configure_args(self): "--with-lapack={0}".format(lapack_libs), ] - if "+scalapack" in self.spec: + if self.spec.satisfies("+scalapack"): scalapack_libs = self.spec["scalapack"].libs.ld_flags args.append("--with-scalapack={0}".format(scalapack_libs)) diff --git a/var/spack/repos/builtin/packages/globus-callout/package.py b/var/spack/repos/builtin/packages/globus-callout/package.py new file mode 100644 index 00000000000000..982082bdf728ab --- /dev/null +++ b/var/spack/repos/builtin/packages/globus-callout/package.py @@ -0,0 +1,31 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class GlobusCallout(AutotoolsPackage): + """The Grid Community Toolkit (GCT) is an open source software + toolkit used for building grid systems and applications. It is a fork + of the Globus Toolkit originally created by the Globus Alliance. + It is supported by the Grid Community Forum (GridCF) that provides + community-based support for core software packages in grid computing. + + This package contains the Globus Callout Library - provides a + platform independent way of dealing with runtime loadable functions. + """ + + homepage = "https://github.com/gridcf/gct/tree/master/callout/source" + url = "https://repo.gridcf.org/gct6/sources/globus_callout-4.3.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("4.3", sha256="367e3fda18c3c3eb2b12496abc504186d0bfa0dadc666f626f580a443bba3000") + + depends_on("c", type="build") + + depends_on("globus-common@15:") diff --git a/var/spack/repos/builtin/packages/globus-common/package.py b/var/spack/repos/builtin/packages/globus-common/package.py new file mode 100644 index 00000000000000..c141110d867f10 --- /dev/null +++ b/var/spack/repos/builtin/packages/globus-common/package.py @@ -0,0 +1,28 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class GlobusCommon(AutotoolsPackage): + """The Grid Community Toolkit (GCT) is an open source software + toolkit used for building grid systems and applications. It is a fork + of the Globus Toolkit originally created by the Globus Alliance. + It is supported by the Grid Community Forum (GridCF) that provides + community-based support for core software packages in grid computing. + + This package contains the Common Library Programs. + """ + + homepage = "https://github.com/gridcf/gct/tree/master/common/source" + url = "https://repo.gridcf.org/gct6/sources/globus_common-18.14.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("18.14", sha256="22368942a78e608d8fe6d9f7379abc628e2bd7af54a98c7d2bddc265d6f0ba45") + + depends_on("c", type="build") diff --git a/var/spack/repos/builtin/packages/globus-ftp-client/package.py b/var/spack/repos/builtin/packages/globus-ftp-client/package.py new file mode 100644 index 00000000000000..454d3aab691001 --- /dev/null +++ b/var/spack/repos/builtin/packages/globus-ftp-client/package.py @@ -0,0 +1,43 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class GlobusFtpClient(AutotoolsPackage): + """The Grid Community Toolkit (GCT) is an open source software + toolkit used for building grid systems and applications. It is a fork + of the Globus Toolkit originally created by the Globus Alliance. + It is supported by the Grid Community Forum (GridCF) that provides + community-based support for core software packages in grid computing. + + This package contains the GridFTP Client Library. + """ + + homepage = "https://github.com/gridcf/gct/tree/master/gridftp/client/source" + url = "https://repo.gridcf.org/gct6/sources/globus_ftp_client-9.8.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("9.8", sha256="aa83229f70352e106fc29f28cef4fc8fdab37c794603e7b425f193d947e5926c") + + depends_on("c", type="build") + + depends_on("autoconf", type="build") + depends_on("automake", type="build") + depends_on("libtool", type="build") + depends_on("m4", type="build") + + depends_on("openssl") + depends_on("globus-common@15:") + depends_on("globus-ftp-control@4:") + depends_on("globus-gsi-callback@4:") + depends_on("globus-gsi-credential@5:") + depends_on("globus-gsi-sysconfig@5:") + depends_on("globus-gssapi-gsi@10:") + depends_on("globus-xio@3:") + depends_on("globus-xio-popen-driver@2:") diff --git a/var/spack/repos/builtin/packages/globus-ftp-control/package.py b/var/spack/repos/builtin/packages/globus-ftp-control/package.py new file mode 100644 index 00000000000000..5b4d233015f3c3 --- /dev/null +++ b/var/spack/repos/builtin/packages/globus-ftp-control/package.py @@ -0,0 +1,40 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class GlobusFtpControl(AutotoolsPackage): + """The Grid Community Toolkit (GCT) is an open source software + toolkit used for building grid systems and applications. It is a fork + of the Globus Toolkit originally created by the Globus Alliance. + It is supported by the Grid Community Forum (GridCF) that provides + community-based support for core software packages in grid computing. + + This package contains the GridFTP Control Library. + """ + + homepage = "https://github.com/gridcf/gct/tree/master/gridftp/control/source" + url = "https://repo.gridcf.org/gct6/sources/globus_ftp_control-9.7.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("9.10", sha256="86677b4aef54b32bcdc11bb48d63f0a30ee520c8aa60e1f0f51d6cd671ee4010") + + depends_on("c", type="build") + + depends_on("autoconf", type="build") + depends_on("automake", type="build") + depends_on("libtool", type="build") + depends_on("m4", type="build") + + depends_on("globus-common@14:") + depends_on("globus-gss-assist@11:") + depends_on("globus-gssapi-gsi@13:") + depends_on("globus-io@11:") + depends_on("globus-xio@3:") + depends_on("globus-gssapi-error@4:") diff --git a/var/spack/repos/builtin/packages/globus-gass-copy/package.py b/var/spack/repos/builtin/packages/globus-gass-copy/package.py new file mode 100644 index 00000000000000..f95e69effb062a --- /dev/null +++ b/var/spack/repos/builtin/packages/globus-gass-copy/package.py @@ -0,0 +1,37 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class GlobusGassCopy(AutotoolsPackage): + """The Grid Community Toolkit (GCT) is an open source software + toolkit used for building grid systems and applications. It is a fork + of the Globus Toolkit originally created by the Globus Alliance. + It is supported by the Grid Community Forum (GridCF) that provides + community-based support for core software packages in grid computing. + + This package contains the Globus Gass Copy Programs. + """ + + homepage = "https://github.com/gridcf/gct/tree/master/gass/copy/source" + url = "https://repo.gridcf.org/gct6/sources/globus_gass_copy-10.13.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("10.13", sha256="f8b301b99de8f236733486767409d952024e16ff44ccfa8627063eefcbc8fe45") + + depends_on("c", type="build") + + depends_on("globus-common@15:") + depends_on("globus-ftp-client@7:") + depends_on("globus-ftp-control@4:") + depends_on("globus-gsi-sysconfig@4:") + depends_on("globus-gass-transfer@7:") + depends_on("globus-io@8:") + depends_on("globus-gssapi-gsi@9:") + depends_on("globus-gssapi-error@4:") diff --git a/var/spack/repos/builtin/packages/globus-gass-transfer/package.py b/var/spack/repos/builtin/packages/globus-gass-transfer/package.py new file mode 100644 index 00000000000000..f4a4f5e0355ea8 --- /dev/null +++ b/var/spack/repos/builtin/packages/globus-gass-transfer/package.py @@ -0,0 +1,38 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class GlobusGassTransfer(AutotoolsPackage): + """The Grid Community Toolkit (GCT) is an open source software + toolkit used for building grid systems and applications. It is a fork + of the Globus Toolkit originally created by the Globus Alliance. + It is supported by the Grid Community Forum (GridCF) that provides + community-based support for core software packages in grid computing. + + This package contains the Globus Gass Transfer. + """ + + homepage = "https://github.com/gridcf/gct/blob/master/gass/transfer/source" + url = "https://repo.gridcf.org/gct6/sources/globus_gass_transfer-9.4.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("9.4", sha256="c5ad54d0e4959f7dc4131918ad9d40d49db2823b84aec8229127826a9601fbf9") + + depends_on("c", type="build") + + depends_on("autoconf", type="build") + depends_on("automake", type="build") + depends_on("libtool", type="build") + depends_on("m4", type="build") + + depends_on("globus-common@14:") + depends_on("globus-gssapi-gsi@10:") + depends_on("globus-gss-assist@8:") + depends_on("globus-io@8:") diff --git a/var/spack/repos/builtin/packages/globus-gsi-callback/package.py b/var/spack/repos/builtin/packages/globus-gsi-callback/package.py new file mode 100644 index 00000000000000..1f63f68bc13f30 --- /dev/null +++ b/var/spack/repos/builtin/packages/globus-gsi-callback/package.py @@ -0,0 +1,34 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class GlobusGsiCallback(AutotoolsPackage): + """The Grid Community Toolkit (GCT) is an open source software + toolkit used for building grid systems and applications. It is a fork + of the Globus Toolkit originally created by the Globus Alliance. + It is supported by the Grid Community Forum (GridCF) that provides + community-based support for core software packages in grid computing. + + This package contains the Globus GSI Callback Library. + """ + + homepage = "https://github.com/gridcf/gct/tree/master/gsi/callback/source" + url = "https://repo.gridcf.org/gct6/sources/globus_gsi_callback-6.2.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("6.2", sha256="ffac5435b7d3a78db3c1f856fbe41e7951d5f7d60df3af4ce8cf5b9e303a6f68") + + depends_on("c", type="build") + + depends_on("globus-common@14:") + depends_on("globus-openssl-module@3:") + depends_on("globus-gsi-openssl-error@2:") + depends_on("globus-gsi-cert-utils@8:") + depends_on("globus-gsi-sysconfig@5:") diff --git a/var/spack/repos/builtin/packages/globus-gsi-cert-utils/package.py b/var/spack/repos/builtin/packages/globus-gsi-cert-utils/package.py new file mode 100644 index 00000000000000..a17c6def1c09d4 --- /dev/null +++ b/var/spack/repos/builtin/packages/globus-gsi-cert-utils/package.py @@ -0,0 +1,32 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class GlobusGsiCertUtils(AutotoolsPackage): + """The Grid Community Toolkit (GCT) is an open source software + toolkit used for building grid systems and applications. It is a fork + of the Globus Toolkit originally created by the Globus Alliance. + It is supported by the Grid Community Forum (GridCF) that provides + community-based support for core software packages in grid computing. + + This package contains the Globus GSI Cert Utils Library Programs. + """ + + homepage = "https://github.com/gridcf/gct/blob/master/gsi/cert_utils/source" + url = "https://repo.gridcf.org/gct6/sources/globus_gsi_cert_utils-10.11.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("10.11", sha256="0bcbef5e04feda1900407970e52e81ad94f68bceef35313f82c810ddb5bff6ba") + + depends_on("c", type="build") + depends_on("openssl@1:") + depends_on("globus-common@14:") + depends_on("globus-openssl-module@3:") + depends_on("globus-gsi-openssl-error@2:") diff --git a/var/spack/repos/builtin/packages/globus-gsi-credential/package.py b/var/spack/repos/builtin/packages/globus-gsi-credential/package.py new file mode 100644 index 00000000000000..9d68a84369cd34 --- /dev/null +++ b/var/spack/repos/builtin/packages/globus-gsi-credential/package.py @@ -0,0 +1,33 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class GlobusGsiCredential(AutotoolsPackage): + """The Grid Community Toolkit (GCT) is an open source software + toolkit used for building grid systems and applications. It is a fork + of the Globus Toolkit originally created by the Globus Alliance. + It is supported by the Grid Community Forum (GridCF) that provides + community-based support for core software packages in grid computing. + + This package contains the Globus GSI Credential Library. + """ + + homepage = "https://github.com/gridcf/gct/tree/master/gsi/credential/source" + url = "https://repo.gridcf.org/gct6/sources/globus_gsi_credential-8.4.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("8.4", sha256="19e8fde9d4b335d60a021ac58c7559e5c34981e9332a8e574eda0b44ec160fa7") + + depends_on("c", type="build") + depends_on("globus-common@14:") + depends_on("globus-gsi-openssl-error@2:") + depends_on("globus-gsi-cert-utils@8:") + depends_on("globus-gsi-sysconfig@5:") + depends_on("globus-gsi-callback@4:") diff --git a/var/spack/repos/builtin/packages/globus-gsi-openssl-error/package.py b/var/spack/repos/builtin/packages/globus-gsi-openssl-error/package.py new file mode 100644 index 00000000000000..573859cdb4801e --- /dev/null +++ b/var/spack/repos/builtin/packages/globus-gsi-openssl-error/package.py @@ -0,0 +1,36 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class GlobusGsiOpensslError(AutotoolsPackage): + """The Grid Community Toolkit (GCT) is an open source software + toolkit used for building grid systems and applications. It is a fork + of the Globus Toolkit originally created by the Globus Alliance. + It is supported by the Grid Community Forum (GridCF) that provides + community-based support for core software packages in grid computing. + + This package contains the Globus OpenSSL Error Handling. + """ + + homepage = "https://github.com/gridcf/gct/blob/master/gsi/openssl_error/source" + url = "https://repo.gridcf.org/gct6/sources/globus_gsi_openssl_error-4.4.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("4.4", sha256="1879ff269154431700ed158a75acc6e10ca0c96af95d92bc2fa63b7fe998fa6e") + + depends_on("c", type="build") + + depends_on("autoconf", type="build") + depends_on("automake", type="build") + depends_on("libtool", type="build") + depends_on("m4", type="build") + + depends_on("openssl@1:") + depends_on("globus-common@14:") diff --git a/var/spack/repos/builtin/packages/globus-gsi-proxy-core/package.py b/var/spack/repos/builtin/packages/globus-gsi-proxy-core/package.py new file mode 100644 index 00000000000000..c81d6128305971 --- /dev/null +++ b/var/spack/repos/builtin/packages/globus-gsi-proxy-core/package.py @@ -0,0 +1,42 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class GlobusGsiProxyCore(AutotoolsPackage): + """The Grid Community Toolkit (GCT) is an open source software + toolkit used for building grid systems and applications. It is a fork + of the Globus Toolkit originally created by the Globus Alliance. + It is supported by the Grid Community Forum (GridCF) that provides + community-based support for core software packages in grid computing. + + This package contains the Globus GSI Proxy Core Library. + """ + + homepage = "https://github.com/gridcf/gct/blob/master/gsi/proxy/proxy_core/source" + url = "https://repo.gridcf.org/gct6/sources/globus_gsi_proxy_core-9.8.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("9.8", sha256="b0865b298d96ffbf6963c0fcb14eb7fd311de67fb25890a677bd6ace13475da3") + + depends_on("c", type="build") + + depends_on("autoconf", type="build") + depends_on("automake", type="build") + depends_on("libtool", type="build") + depends_on("m4", type="build") + + depends_on("openssl@1:") + depends_on("globus-common@14:") + depends_on("globus-openssl-module@3:") + depends_on("globus-gsi-openssl-error@2:") + depends_on("globus-gsi-cert-utils@8:") + depends_on("globus-gsi-sysconfig@5:") + depends_on("globus-gsi-proxy-ssl@4:") + depends_on("globus-gsi-credential@5:") diff --git a/var/spack/repos/builtin/packages/globus-gsi-proxy-ssl/package.py b/var/spack/repos/builtin/packages/globus-gsi-proxy-ssl/package.py new file mode 100644 index 00000000000000..e8bfa9342be460 --- /dev/null +++ b/var/spack/repos/builtin/packages/globus-gsi-proxy-ssl/package.py @@ -0,0 +1,30 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class GlobusGsiProxySsl(AutotoolsPackage): + """The Grid Community Toolkit (GCT) is an open source software + toolkit used for building grid systems and applications. It is a fork + of the Globus Toolkit originally created by the Globus Alliance. + It is supported by the Grid Community Forum (GridCF) that provides + community-based support for core software packages in grid computing. + + This package contains the Globus GSI Proxy SSL Library. + """ + + homepage = "https://github.com/gridcf/gct/tree/master/gsi/proxy/proxy_ssl/source" + url = "https://repo.gridcf.org/gct6/sources/globus_gsi_proxy_ssl-6.5.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("6.5", sha256="4f20042d80a1fe28b40d9f7f4a1fc9f2790645e9b3f426a659b0c3f01eb04259") + + depends_on("c", type="build") + + depends_on("openssl@1:") diff --git a/var/spack/repos/builtin/packages/globus-gsi-sysconfig/package.py b/var/spack/repos/builtin/packages/globus-gsi-sysconfig/package.py new file mode 100644 index 00000000000000..006ff1cc7f189c --- /dev/null +++ b/var/spack/repos/builtin/packages/globus-gsi-sysconfig/package.py @@ -0,0 +1,32 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class GlobusGsiSysconfig(AutotoolsPackage): + """The Grid Community Toolkit (GCT) is an open source software + toolkit used for building grid systems and applications. It is a fork + of the Globus Toolkit originally created by the Globus Alliance. + It is supported by the Grid Community Forum (GridCF) that provides + community-based support for core software packages in grid computing. + + This package contains the Globus GSI System Config Library. + """ + + homepage = "https://github.com/gridcf/gct/blob/master/gsi/sysconfig/source" + url = "https://repo.gridcf.org/gct6/sources/globus_gsi_sysconfig-9.6.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("9.6", sha256="7d843374eb64605dda206b84cad2a5c39a1bc9b18e9bfd93591c8fcb6d5a1a7a") + + depends_on("c", type="build") + + depends_on("globus-common@15:") + depends_on("globus-openssl-module@e3:") + depends_on("globus-gsi-openssl-error@2:") diff --git a/var/spack/repos/builtin/packages/globus-gss-assist/package.py b/var/spack/repos/builtin/packages/globus-gss-assist/package.py new file mode 100644 index 00000000000000..a49237f6b85497 --- /dev/null +++ b/var/spack/repos/builtin/packages/globus-gss-assist/package.py @@ -0,0 +1,40 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class GlobusGssAssist(AutotoolsPackage): + """The Grid Community Toolkit (GCT) is an open source software + toolkit used for building grid systems and applications. It is a fork + of the Globus Toolkit originally created by the Globus Alliance. + It is supported by the Grid Community Forum (GridCF) that provides + community-based support for core software packages in grid computing. + + This package contains the GSSAPI Assist library Programs. + """ + + homepage = "https://github.com/gridcf/gct/blob/master/gsi/gss_assist/source" + url = "https://repo.gridcf.org/gct6/sources/globus_gss_assist-12.7.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("12.7", sha256="5184e0f1a09a64651472f19b79101fc6d966056fd9e1ee29512e41f694eae759") + + depends_on("c", type="build") + + depends_on("autoconf", type="build") + depends_on("automake", type="build") + depends_on("libtool", type="build") + depends_on("m4", type="build") + + depends_on("globus-common@14:") + depends_on("globus-gsi-sysconfig@7:") + depends_on("globus-gsi-cert-utils@8:") + depends_on("globus-gssapi-gsi@13:") + depends_on("globus-callout@2:") + depends_on("globus-gsi-credential@6:") diff --git a/var/spack/repos/builtin/packages/globus-gssapi-error/package.py b/var/spack/repos/builtin/packages/globus-gssapi-error/package.py new file mode 100644 index 00000000000000..b2d16c4420245a --- /dev/null +++ b/var/spack/repos/builtin/packages/globus-gssapi-error/package.py @@ -0,0 +1,37 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class GlobusGssapiError(AutotoolsPackage): + """The Grid Community Toolkit (GCT) is an open source software + toolkit used for building grid systems and applications. It is a fork + of the Globus Toolkit originally created by the Globus Alliance. + It is supported by the Grid Community Forum (GridCF) that provides + community-based support for core software packages in grid computing. + + This package contains the GSSAPI Error Library. + """ + + homepage = "https://github.com/gridcf/gct/blob/master/gsi/gssapi_error/source" + url = "https://repo.gridcf.org/gct6/sources/globus_gssapi_error-6.3.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("6.3", sha256="943261f337ca5547f0e4fed47c8beac14cb125837b265f152c216f9b068dabc4") + + depends_on("c", type="build") + + depends_on("autoconf", type="build") + depends_on("automake", type="build") + depends_on("libtool", type="build") + depends_on("m4", type="build") + + depends_on("globus-common@14:") + depends_on("globus-gss-assist@8:") + depends_on("globus-gssapi-gsi@9:") diff --git a/var/spack/repos/builtin/packages/globus-gssapi-gsi/package.py b/var/spack/repos/builtin/packages/globus-gssapi-gsi/package.py new file mode 100644 index 00000000000000..f47d9f37ec617d --- /dev/null +++ b/var/spack/repos/builtin/packages/globus-gssapi-gsi/package.py @@ -0,0 +1,45 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class GlobusGssapiGsi(AutotoolsPackage): + """The Grid Community Toolkit (GCT) is an open source software + toolkit used for building grid systems and applications. It is a fork + of the Globus Toolkit originally created by the Globus Alliance. + It is supported by the Grid Community Forum (GridCF) that provides + community-based support for core software packages in grid computing. + + This package contains the GSSAPI library. + """ + + homepage = "https://github.com/gridcf/gct/tree/master/gsi/gssapi/source" + url = "https://repo.gridcf.org/gct6/sources/globus_gssapi_gsi-14.20.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("14.20", sha256="2ba4e905f1dbbbee8ade01a6d0d59a9b5e816620fe5b080de0524b5331614236") + + depends_on("c", type="build") + + depends_on("autoconf", type="build") + depends_on("automake", type="build") + depends_on("libtool", type="build") + depends_on("m4", type="build") + depends_on("awk", type="build") + + depends_on("openssl") + + depends_on("globus-common@14:") + depends_on("globus-openssl-module@3:") + depends_on("globus-gsi-openssl-error@2:") + depends_on("globus-gsi-cert-utils@8:") + depends_on("globus-gsi-credential@5:") + depends_on("globus-gsi-callback@4:") + depends_on("globus-gsi-proxy-core@8:") + depends_on("globus-gsi-sysconfig@8:") diff --git a/var/spack/repos/builtin/packages/globus-io/package.py b/var/spack/repos/builtin/packages/globus-io/package.py new file mode 100644 index 00000000000000..0c3ce0dd5c3dd4 --- /dev/null +++ b/var/spack/repos/builtin/packages/globus-io/package.py @@ -0,0 +1,41 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class GlobusIo(AutotoolsPackage): + """The Grid Community Toolkit (GCT) is an open source software + toolkit used for building grid systems and applications. It is a fork + of the Globus Toolkit originally created by the Globus Alliance. + It is supported by the Grid Community Forum (GridCF) that provides + community-based support for core software packages in grid computing. + + This package contains the uniform I/O interface to stream and + datagram style communications. + """ + + homepage = "https://github.com/gridcf/gct/tree/master/io/compat" + url = "https://repo.gridcf.org/gct6/sources/globus_io-12.4.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("12.4", sha256="992de8d1d6c1a0c4edccd798084b6a7f8b93155ba7ae110d836dc248a2f7005a") + + depends_on("c", type="build") + + depends_on("autoconf", type="build") + depends_on("automake", type="build") + depends_on("libtool", type="build") + depends_on("m4", type="build") + + depends_on("globus-common@14:") + depends_on("globus-xio@3:") + depends_on("globus-gss-assist@8:") + depends_on("globus-gssapi-gsi@10:") + depends_on("globus-xio-gsi-driver@2:") + depends_on("globus-gssapi-error@4:") diff --git a/var/spack/repos/builtin/packages/globus-openssl-module/package.py b/var/spack/repos/builtin/packages/globus-openssl-module/package.py new file mode 100644 index 00000000000000..0252b985b6fa0b --- /dev/null +++ b/var/spack/repos/builtin/packages/globus-openssl-module/package.py @@ -0,0 +1,32 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class GlobusOpensslModule(AutotoolsPackage): + """The Grid Community Toolkit (GCT) is an open source software + toolkit used for building grid systems and applications. It is a fork + of the Globus Toolkit originally created by the Globus Alliance. + It is supported by the Grid Community Forum (GridCF) that provides + community-based support for core software packages in grid computing. + + This package contains the Globus OpenSSL Module Wrapper. + """ + + homepage = "https://github.com/gridcf/gct/blob/master/gsi/openssl_module" + url = "https://repo.gridcf.org/gct6/sources/globus_openssl_module-5.2.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("5.2", sha256="6dfcbe4af7a23d16745946131da938181cee3adfe08504df4bb4ab3160c23467") + + depends_on("c", type="build") + + depends_on("globus-common@14:") + depends_on("globus-gsi-proxy-ssl@4:") + depends_on("globus-gsi-openssl-error@2:") diff --git a/var/spack/repos/builtin/packages/globus-xio-gsi-driver/package.py b/var/spack/repos/builtin/packages/globus-xio-gsi-driver/package.py new file mode 100644 index 00000000000000..630de7603c94c1 --- /dev/null +++ b/var/spack/repos/builtin/packages/globus-xio-gsi-driver/package.py @@ -0,0 +1,39 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class GlobusXioGsiDriver(AutotoolsPackage): + """The Grid Community Toolkit (GCT) is an open source software + toolkit used for building grid systems and applications. It is a fork + of the Globus Toolkit originally created by the Globus Alliance. + It is supported by the Grid Community Forum (GridCF) that provides + community-based support for core software packages in grid computing. + + This package contains the Globus XIO GSI Driver. + """ + + homepage = "https://github.com/gridcf/gct/blob/master/xio/drivers/gsi" + url = "https://repo.gridcf.org/gct6/sources/globus_xio_gsi_driver-5.4.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("5.4", sha256="9a28f8da77efbd8560bcfacdd514f81f5653d1c612d7fe3c479e52a4c8c1ed76") + + depends_on("c", type="build") + + depends_on("autoconf", type="build") + depends_on("automake", type="build") + depends_on("libtool", type="build") + depends_on("m4", type="build") + + depends_on("globus-common@14:") + depends_on("globus-gssapi-gsi@13:") + depends_on("globus-gssapi-error@4:") + depends_on("globus-gss-assist@11:") + depends_on("globus-xio@3:") diff --git a/var/spack/repos/builtin/packages/globus-xio-pipe-driver/package.py b/var/spack/repos/builtin/packages/globus-xio-pipe-driver/package.py new file mode 100644 index 00000000000000..4a649591cdc281 --- /dev/null +++ b/var/spack/repos/builtin/packages/globus-xio-pipe-driver/package.py @@ -0,0 +1,31 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class GlobusXioPipeDriver(AutotoolsPackage): + """The Grid Community Toolkit (GCT) is an open source software + toolkit used for building grid systems and applications. It is a fork + of the Globus Toolkit originally created by the Globus Alliance. + It is supported by the Grid Community Forum (GridCF) that provides + community-based support for core software packages in grid computing. + + This package contains the Globus Pipe Driver. + """ + + homepage = "https://github.com/gridcf/gct/blob/master/xio/drivers/pipe/source" + url = "https://repo.gridcf.org/gct6/sources/globus_xio_pipe_driver-4.1.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("4.1", sha256="90860e3bf7c66791f873f488b3b31892d386ac9d73dd4bb366ae8d39fd16ba66") + + depends_on("c", type="build") + + depends_on("globus-common@14:") + depends_on("globus-xio@3:") diff --git a/var/spack/repos/builtin/packages/globus-xio-popen-driver/package.py b/var/spack/repos/builtin/packages/globus-xio-popen-driver/package.py new file mode 100644 index 00000000000000..8b0eb093ade45d --- /dev/null +++ b/var/spack/repos/builtin/packages/globus-xio-popen-driver/package.py @@ -0,0 +1,33 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class GlobusXioPopenDriver(AutotoolsPackage): + """The Grid Community Toolkit (GCT) is an open source software + toolkit used for building grid systems and applications. It is a fork + of the Globus Toolkit originally created by the Globus Alliance. + It is supported by the Grid Community Forum (GridCF) that provides + community-based support for core software packages in grid computing. + + This package contains the Globus XIO Pipe Open Driver, which allows + a user to execute a program and treat it as a transport driver by + routing data through pipes. + """ + + homepage = "https://github.com/gridcf/gct/blob/master/xio/drivers/popen/source" + url = "https://repo.gridcf.org/gct6/sources/globus_xio_popen_driver-4.1.tar.gz" + + maintainers("github_user1", "github_user2") + + license("Apache-2.0", checked_by="wdconinc") + + version("4.1", sha256="6e9875c0d279511d8c476f71a46346712512284ade0623cd780c4e504908c110") + + depends_on("c", type="build") + + depends_on("globus-common@14:") + depends_on("globus-xio@3:") diff --git a/var/spack/repos/builtin/packages/globus-xio/package.py b/var/spack/repos/builtin/packages/globus-xio/package.py new file mode 100644 index 00000000000000..bbd131f5b7a3d9 --- /dev/null +++ b/var/spack/repos/builtin/packages/globus-xio/package.py @@ -0,0 +1,35 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class GlobusXio(AutotoolsPackage): + """The Grid Community Toolkit (GCT) is an open source software + toolkit used for building grid systems and applications. It is a fork + of the Globus Toolkit originally created by the Globus Alliance. + It is supported by the Grid Community Forum (GridCF) that provides + community-based support for core software packages in grid computing. + + This package contains the Globus XIO Framework. + """ + + homepage = "https://github.com/gridcf/gct/blob/master/xio/src" + url = "https://repo.gridcf.org/gct6/sources/globus_xio-6.6.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("6.6", sha256="2ea379df7c2f918a05902bf3e9347667bb172c4893e819913f7975e9e89205fc") + + depends_on("c", type="build") + + depends_on("autoconf", type="build") + depends_on("automake", type="build") + depends_on("libtool", type="build") + depends_on("m4", type="build") + + depends_on("globus-common@14:") diff --git a/var/spack/repos/builtin/packages/glow/package.py b/var/spack/repos/builtin/packages/glow/package.py index 979d56da20740a..2c20cfda216a68 100644 --- a/var/spack/repos/builtin/packages/glow/package.py +++ b/var/spack/repos/builtin/packages/glow/package.py @@ -33,8 +33,18 @@ class Glow(GoPackage): version("1.0.2", sha256="2d98c1e780d750b83d8da094de4c2a999c324021906e6d813b7c75d0320243c8") version("1.0.1", sha256="78d163bea8e6c13fb343f1e3586e93e0392e5052c408a248cc2f0fcc7aa38618") - def install(self, spec, prefix): - mkdirp(prefix.bin) - install("glow", prefix.bin) - mkdirp(prefix.completions) - install_tree(".", prefix.completions) + @run_after("install") + def install_completions(self): + glow = Executable(self.prefix.bin.glow) + + mkdirp(bash_completion_path(self.prefix)) + with open(bash_completion_path(self.prefix) / "glow", "w") as file: + glow("completion", "bash", output=file) + + mkdirp(fish_completion_path(self.prefix)) + with open(fish_completion_path(self.prefix) / "glow.fish", "w") as file: + glow("completion", "fish", output=file) + + mkdirp(zsh_completion_path(self.prefix)) + with open(zsh_completion_path(self.prefix) / "_glow", "w") as file: + glow("completion", "zsh", output=file) diff --git a/var/spack/repos/builtin/packages/glpk/package.py b/var/spack/repos/builtin/packages/glpk/package.py index 0c93cdcd7ecd44..ea7a1047932236 100644 --- a/var/spack/repos/builtin/packages/glpk/package.py +++ b/var/spack/repos/builtin/packages/glpk/package.py @@ -33,7 +33,7 @@ class Glpk(AutotoolsPackage, GNUMirrorPackage): def configure_args(self): options = [] - if "+gmp" in self.spec: + if self.spec.satisfies("+gmp"): options.append("--with-gmp") return options diff --git a/var/spack/repos/builtin/packages/gmp/package.py b/var/spack/repos/builtin/packages/gmp/package.py index dd87a3d2175366..df7a05e381ca54 100644 --- a/var/spack/repos/builtin/packages/gmp/package.py +++ b/var/spack/repos/builtin/packages/gmp/package.py @@ -65,6 +65,6 @@ def flag_handler(self, name, flags): def configure_args(self): args = self.enable_or_disable("cxx") args += self.enable_or_disable("libs") - if "libs=static" in self.spec: + if self.spec.satisfies("libs=static"): args.append("--with-pic") return args diff --git a/var/spack/repos/builtin/packages/gmsh/package.py b/var/spack/repos/builtin/packages/gmsh/package.py index 636abe009602b4..79517a3cf5bd7a 100644 --- a/var/spack/repos/builtin/packages/gmsh/package.py +++ b/var/spack/repos/builtin/packages/gmsh/package.py @@ -80,6 +80,9 @@ class Gmsh(CMakePackage): # https://gmsh.info/doc/texinfo/gmsh.html#Compiling-the-source-code # We make changes to the GMSH default, such as external blas. + depends_on("libpng", when="+fltk") + depends_on("libjpeg-turbo", when="+fltk") + depends_on("zlib-api") depends_on("blas", when="~eigen") depends_on("lapack", when="~eigen") depends_on("eigen@3:", when="+eigen+external") diff --git a/var/spack/repos/builtin/packages/gmt/package.py b/var/spack/repos/builtin/packages/gmt/package.py index 6d207642eee753..be2b4ec5c74a8f 100644 --- a/var/spack/repos/builtin/packages/gmt/package.py +++ b/var/spack/repos/builtin/packages/gmt/package.py @@ -130,16 +130,16 @@ def cmake_args(self): self.define("DCW_PATH", "dcw"), ] - if "+ghostscript" in spec: + if spec.satisfies("+ghostscript"): args.append(self.define("GS", spec["ghostscript"].prefix.bin.gs)) - if "+geos" in spec: + if spec.satisfies("+geos"): args.append(self.define("GEOS_CONFIG", spec["geos"].prefix.bin.join("geos-config"))) - if "+pcre" in spec: + if spec.satisfies("+pcre"): args.append(self.define("PCRE2_CONFIG", spec["pcre2"].prefix.bin.join("pcre2-config"))) - if "+fftw" in spec: + if spec.satisfies("+fftw"): args.extend( [ self.define("FFTW3_INCLUDE_DIR", spec["fftw"].headers.directories[0]), @@ -147,7 +147,7 @@ def cmake_args(self): ] ) - if "+glib" in spec: + if spec.satisfies("+glib"): args.extend( [ self.define("GLIB_INCLUDE_DIR", spec["glib"].headers.directories[0]), @@ -155,7 +155,7 @@ def cmake_args(self): ] ) - if "graphicsmagick" in spec: + if spec.satisfies("graphicsmagick"): args.extend( [ self.define("GM", spec["graphicsmagick"].prefix.bin.gm), @@ -163,7 +163,7 @@ def cmake_args(self): ] ) - if "+ffmpeg" in spec: + if spec.satisfies("+ffmpeg"): args.append(self.define("FFMPEG", spec["ffmpeg"].prefix.bin.ffmpeg)) return args diff --git a/var/spack/repos/builtin/packages/gnina/package.py b/var/spack/repos/builtin/packages/gnina/package.py index 38d91e32c85718..f9d1dded275bf7 100644 --- a/var/spack/repos/builtin/packages/gnina/package.py +++ b/var/spack/repos/builtin/packages/gnina/package.py @@ -74,7 +74,7 @@ class Gnina(CMakePackage, CudaPackage): def cmake_args(self): args = ["-DBLAS=Open"] # Use OpenBLAS instead of Atlas' BLAS - if "+gninavis" in self.spec: + if self.spec.satisfies("+gninavis"): args.append(f"-DRDKIT_INCLUDE_DIR={self.spec['rdkit'].prefix.include.rdkit}") return args diff --git a/var/spack/repos/builtin/packages/gnuplot/package.py b/var/spack/repos/builtin/packages/gnuplot/package.py index 0f69b3c654e9a3..fc5f19f1ecc63c 100644 --- a/var/spack/repos/builtin/packages/gnuplot/package.py +++ b/var/spack/repos/builtin/packages/gnuplot/package.py @@ -91,12 +91,12 @@ def configure_args(self): options += self.with_or_without("readline", "prefix") - if "+pbm" in spec: + if spec.satisfies("+pbm"): options.append("--with-bitmap-terminals") else: options.append("--without-bitmap-terminals") - if "+X" in spec: + if spec.satisfies("+X"): # It seems there's an open bug for wxWidgets support # See : http://sourceforge.net/p/gnuplot/bugs/1694/ os.environ["TERMLIBS"] = "-lX11" @@ -104,7 +104,7 @@ def configure_args(self): else: options.append("--without-x") - if "+qt" in spec: + if spec.satisfies("+qt"): options.append("--with-qt=qt5") # QT needs C++11 compiler: os.environ["CXXFLAGS"] = "{0}".format(self.compiler.cxx11_flag) @@ -134,22 +134,22 @@ def configure_args(self): else: options.append("--with-qt=no") - if "+wx" in spec: + if spec.satisfies("+wx"): options.append("--with-wx=%s" % spec["wxwidgets"].prefix) else: options.append("--disable-wxwidgets") - if "+gd" in spec: + if spec.satisfies("+gd"): options.append("--with-gd=%s" % spec["libgd"].prefix) else: options.append("--without-gd") - if "+cairo" in spec: + if spec.satisfies("+cairo"): options.append("--with-cairo") else: options.append("--without-cairo") - if "+libcerf" in spec: + if spec.satisfies("+libcerf"): options.append("--with-libcerf") else: options.append("--without-libcerf") diff --git a/var/spack/repos/builtin/packages/gnutls/package.py b/var/spack/repos/builtin/packages/gnutls/package.py index 71db94256c71d2..d3ef1b8a32450f 100644 --- a/var/spack/repos/builtin/packages/gnutls/package.py +++ b/var/spack/repos/builtin/packages/gnutls/package.py @@ -38,6 +38,9 @@ class Gnutls(AutotoolsPackage): variant("zlib", default=True, description="Enable zlib compression support") variant("guile", default=False, description="Enable Guile bindings") + variant( + "brotli", default=True, description="Enable brotli compression support", when="@3.7.4:" + ) # gnutls+guile is currently broken on MacOS. See Issue #11668 conflicts("+guile", when="platform=darwin") @@ -54,6 +57,7 @@ class Gnutls(AutotoolsPackage): depends_on("libidn2@:2.0", when="@:3.5") depends_on("libidn2") depends_on("zlib-api", when="+zlib") + depends_on("brotli", when="+brotli") depends_on("gettext") depends_on("pkgconfig", type="build") @@ -66,7 +70,7 @@ def url_for_version(self, version): def setup_build_environment(self, env): spec = self.spec - if "+guile" in spec: + if spec.satisfies("+guile"): env.set("GUILE", spec["guile"].prefix.bin.guile) def configure_args(self): @@ -79,15 +83,9 @@ def configure_args(self): args.append("--with-included-unistring") args.append("--without-p11-kit") # p11-kit@0.23.1: ... - if "+zlib" in spec: - args.append("--with-zlib") - else: - args.append("--without-zlib") - - if "+guile" in spec: - args.append("--enable-guile") - else: - args.append("--disable-guile") + args += self.with_or_without("zlib") + args += self.with_or_without("brotli") + args += self.enable_or_disable("guile") if self.run_tests: args.extend(["--enable-tests", "--enable-valgrind-tests", "--enable-full-test-suite"]) diff --git a/var/spack/repos/builtin/packages/go/package.py b/var/spack/repos/builtin/packages/go/package.py index 05ef84c252ee39..bb073dccd12a12 100644 --- a/var/spack/repos/builtin/packages/go/package.py +++ b/var/spack/repos/builtin/packages/go/package.py @@ -41,6 +41,7 @@ class Go(Package): license("BSD-3-Clause") + version("1.23.1", sha256="6ee44e298379d146a5e5aa6b1c5b5d5f5d0a3365eabdd70741e6e21340ec3b0d") version("1.22.6", sha256="9e48d99d519882579917d8189c17e98c373ce25abaebb98772e2927088992a51") version("1.22.4", sha256="fed720678e728a7ca30ba8d1ded1caafe27d16028fab0232b8ba8e22008fb784") diff --git a/var/spack/repos/builtin/packages/goblin-hmc-sim/package.py b/var/spack/repos/builtin/packages/goblin-hmc-sim/package.py index 74865bfcef6915..bad1c82d1c2044 100644 --- a/var/spack/repos/builtin/packages/goblin-hmc-sim/package.py +++ b/var/spack/repos/builtin/packages/goblin-hmc-sim/package.py @@ -15,7 +15,7 @@ class GoblinHmcSim(MakefilePackage): homepage = "https://github.com/tactcomplabs/gc64-hmcsim" git = "https://github.com/tactcomplabs/gc64-hmcsim" # The version numbers track the SST they were released with - url = "https://github.com/tactcomplabs/gc64-hmcsim/archive/sst-8.0.0-release.tar.gz" + url = "https://github.com/tactcomplabs/gc64-hmcsim/archive/refs/tags/sst-8.0.0-release.tar.gz" # This works with parallel builds outside Spack # For some reason .o files get thrashed inside Spack parallel = False diff --git a/var/spack/repos/builtin/packages/goma/package.py b/var/spack/repos/builtin/packages/goma/package.py index 2bcb29e9141c59..e698441f3c3741 100644 --- a/var/spack/repos/builtin/packages/goma/package.py +++ b/var/spack/repos/builtin/packages/goma/package.py @@ -18,6 +18,8 @@ class Goma(CMakePackage): license("GPL-2.0-or-later") + version("7.8.2", commit="968790728b7544f6e362792748c3842d6c5e2bd9") + version("7.7.0", commit="936caf27cab74023d8dfd792cc5411b8c92f2a04") version("7.6.1", commit="c799e935009b85e00979fa8b248952194f6ade7a") version("7.4.3", commit="bb0cf8030f9e8d61066d052ea6fad67fe49651f8") version("7.3.0", commit="415f442953e2171afae1f8ad55868052c6f511ce") diff --git a/var/spack/repos/builtin/packages/google-cloud-cpp/package.py b/var/spack/repos/builtin/packages/google-cloud-cpp/package.py new file mode 100644 index 00000000000000..7a477505cc94ca --- /dev/null +++ b/var/spack/repos/builtin/packages/google-cloud-cpp/package.py @@ -0,0 +1,48 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class GoogleCloudCpp(CMakePackage): + """C++ Client Libraries for Google Cloud Platform.""" + + homepage = "https://cloud.google.com/cpp" + url = "https://github.com/googleapis/google-cloud-cpp/archive/refs/tags/v2.28.0.tar.gz" + + maintainers("dbolduc") + + license("Apache-2.0", checked_by="dbolduc") + + sanity_check_is_dir = ["lib", "include"] + + version("2.28.0", sha256="1d51910cb4419f6100d8b9df6bccd33477d09f50e378f12b06dae0f137ed7bc6") + + depends_on("abseil-cpp") + depends_on("curl") + depends_on("google-crc32c") + depends_on("grpc") + depends_on("nlohmann-json") + depends_on("protobuf") + + variant("shared", default=False, description="Build shared instead of static libraries") + variant( + "cxxstd", + default="11", + values=("11", "14", "17", "20"), + multi=False, + description="Use the specified C++ standard when building.", + ) + + def cmake_args(self): + args = [ + self.define_from_variant("BUILD_SHARED_LIBS", "shared"), + self.define_from_variant("CMAKE_CXX_STANDARD", "cxxstd"), + "-DBUILD_TESTING:Bool=OFF", + "-DGOOGLE_CLOUD_CPP_WITH_MOCKS:Bool=OFF", + "-DGOOGLE_CLOUD_CPP_ENABLE_EXAMPLES:Bool=OFF", + "-DGOOGLE_CLOUD_CPP_ENABLE:String=__ga_libraries__", + ] + return args diff --git a/var/spack/repos/builtin/packages/googletest/package.py b/var/spack/repos/builtin/packages/googletest/package.py index c57b394da4b496..87c603732026fc 100644 --- a/var/spack/repos/builtin/packages/googletest/package.py +++ b/var/spack/repos/builtin/packages/googletest/package.py @@ -68,7 +68,7 @@ def install(self, spec, prefix): install_tree(join_path(self.stage.source_path, "include"), prefix.include) mkdirp(prefix.lib) - if "+shared" in spec: + if spec.satisfies("+shared"): install("libgtest.{0}".format(dso_suffix), prefix.lib) install("libgtest_main.{0}".format(dso_suffix), prefix.lib) else: diff --git a/var/spack/repos/builtin/packages/gosam-contrib/package.py b/var/spack/repos/builtin/packages/gosam-contrib/package.py index fe6accd3816318..9c49e53458f9c4 100644 --- a/var/spack/repos/builtin/packages/gosam-contrib/package.py +++ b/var/spack/repos/builtin/packages/gosam-contrib/package.py @@ -39,14 +39,14 @@ def patch(self): def flag_handler(self, name, flags): if name in ["cflags", "cxxflags", "cppflags"]: - if "+pic" in self.spec: + if self.spec.satisfies("+pic"): flags.append(self.compiler.cc_pic_flag) if name == "fflags": if "gfortran" in self.compiler.fc: flags.append("-std=legacy") - if "+pic" in self.spec: + if self.spec.satisfies("+pic"): flags.append(self.compiler.fc_pic_flag) return (None, flags, None) diff --git a/var/spack/repos/builtin/packages/gperftools/package.py b/var/spack/repos/builtin/packages/gperftools/package.py index f6630aedebd679..8afbc078392df7 100644 --- a/var/spack/repos/builtin/packages/gperftools/package.py +++ b/var/spack/repos/builtin/packages/gperftools/package.py @@ -22,6 +22,7 @@ class Gperftools(AutotoolsPackage, CMakePackage): build_system(conditional("cmake", when="@2.8.1:"), "autotools", default="cmake") + version("2.16", sha256="f12624af5c5987f2cc830ee534f754c3c5961eec08004c26a8b80de015cf056f") version("2.15", sha256="c69fef855628c81ef56f12e3c58f2b7ce1f326c0a1fe783e5cae0b88cbbe9a80") version("2.14", sha256="6b561baf304b53d0a25311bd2e29bc993bed76b7c562380949e7cb5e3846b299") version("2.13", sha256="4882c5ece69f8691e51ffd6486df7d79dbf43b0c909d84d3c0883e30d27323e7") @@ -50,6 +51,8 @@ class Gperftools(AutotoolsPackage, CMakePackage): depends_on("unwind", when="+libunwind") depends_on("cmake@3.12:", type="build", when="build_system=cmake") + # https://github.com/gperftools/gperftools/commit/9dfab2cdce5ec1ebb36e2a20e5031ef49cbe8087 + conflicts("build_system=cmake", when="@2.16:") # Linker error: src/base/dynamic_annotations.cc:46: undefined reference to # `TCMallocGetenvSafe' diff --git a/var/spack/repos/builtin/packages/gpgme/package.py b/var/spack/repos/builtin/packages/gpgme/package.py index b6e8dde011b411..444f21dedfa7c4 100644 --- a/var/spack/repos/builtin/packages/gpgme/package.py +++ b/var/spack/repos/builtin/packages/gpgme/package.py @@ -33,7 +33,7 @@ class Gpgme(AutotoolsPackage): depends_on("gnupg", type="build") depends_on("libgpg-error", type="build") - depends_on("libassuan", type="build") + depends_on("libassuan@2.4.2:2", type=("build", "link")) @classmethod def determine_version(cls, exe): diff --git a/var/spack/repos/builtin/packages/gpi-2/package.py b/var/spack/repos/builtin/packages/gpi-2/package.py index b4bb3fbe0389dd..70ca28ff4340ca 100644 --- a/var/spack/repos/builtin/packages/gpi-2/package.py +++ b/var/spack/repos/builtin/packages/gpi-2/package.py @@ -105,17 +105,17 @@ def old_install(self, spec, prefix): self.set_specific_cflags(spec) config_args = ["-p {0}".format(prefix)] - if "fabrics=ethernet" in spec: + if spec.satisfies("fabrics=ethernet"): config_args += ["--with-ethernet"] - elif "fabrics=infiniband" in spec: + elif spec.satisfies("fabrics=infiniband"): config_args += ["--with-infiniband={0}".format(spec["rdma-core"].prefix)] - if "schedulers=loadleveler" in spec: + if spec.satisfies("schedulers=loadleveler"): config_args += ["--with-ll"] - if "+fortran" in spec: + if spec.satisfies("+fortran"): config_args += ["--with-fortran=true"] else: config_args += ["--with-fortran=false"] - if "+mpi" in spec: + if spec.satisfies("+mpi"): config_args += ["--with-mpi={0}".format(spec["mpi"].prefix)] with working_dir(self.build_directory): @@ -147,7 +147,7 @@ def configure_args(self): config_args.extend(self.with_or_without("fortran")) # Mpi - if "+mpi" in spec: + if spec.satisfies("+mpi"): config_args += ["--with-mpi={0}".format(spec["mpi"].prefix)] # Fabrics if "fabrics=none" not in spec: diff --git a/var/spack/repos/builtin/packages/gptl/package.py b/var/spack/repos/builtin/packages/gptl/package.py index 6fc1f2a6d24344..70395d99bc55a6 100644 --- a/var/spack/repos/builtin/packages/gptl/package.py +++ b/var/spack/repos/builtin/packages/gptl/package.py @@ -35,7 +35,7 @@ class Gptl(AutotoolsPackage): def configure_args(self): args = [] - if "+pmpi" in self.spec: + if self.spec.satisfies("+pmpi"): args.append("--enable-pmpi") args.append("CC=" + self.spec["mpi"].mpicc) args.append("CXX=" + self.spec["mpi"].mpicxx) @@ -43,13 +43,13 @@ def configure_args(self): args.append("F90=" + self.spec["mpi"].mpifc) args.append("F77=" + self.spec["mpi"].mpif77) - if "+papi" in self.spec: + if self.spec.satisfies("+papi"): args.append("--enable-papi") - if "+nestedomp" in self.spec: + if self.spec.satisfies("+nestedomp"): args.append("--enable-nestedomp") - if "+disable-unwind" in self.spec: + if self.spec.satisfies("+disable-unwind"): args.append("--disable-libunwind") return args diff --git a/var/spack/repos/builtin/packages/gptune/package.py b/var/spack/repos/builtin/packages/gptune/package.py index 672cd3ab814bf9..dd047980593048 100644 --- a/var/spack/repos/builtin/packages/gptune/package.py +++ b/var/spack/repos/builtin/packages/gptune/package.py @@ -2,11 +2,19 @@ # Spack Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) - +import os from spack.package import * +def terminate_bash_failures(dir): + """Ensure bash scripts within the directory fail as soon as a command + within fails.""" + for f in os.listdir(dir): + if f.endswith(".sh"): + filter_file(r"#!/bin/bash", r"#!/bin/bash" + "\nset -e", join_path(dir, f)) + + class Gptune(CMakePackage): """GPTune is an autotuning framework that relies on multitask and transfer learnings to help solve the underlying black-box optimization problem using @@ -93,7 +101,6 @@ def cmake_args(self): return args examples_src_dir = "examples" - src_dir = "GPTune" nodes = 1 cores = 4 @@ -101,45 +108,14 @@ def cmake_args(self): def cache_test_sources(self): """Copy the example source files after the package is installed to an install test subdirectory for use during `spack test run`.""" - self.cache_extra_test_sources([self.examples_src_dir]) - - def setup_run_environment(self, env): - env.set("GPTUNE_INSTALL_PATH", python_platlib) + cache_extra_test_sources(self, [self.examples_src_dir]) - def test(self): - spec = self.spec + # Create the environment setup script comp_name = self.compiler.name comp_version = str(self.compiler.version).replace(".", ",") - test_dir = join_path(self.test_suite.current_test_cache_dir, self.examples_src_dir) - - if "+superlu" in spec: - superludriver = join_path(spec["superlu-dist"].prefix.lib, "EXAMPLE/pddrive_spawn") - op = ["-r", superludriver, "."] - # copy superlu-dist executables to the correct place - wd = join_path(test_dir, "SuperLU_DIST") - self.run_test("rm", options=["-rf", "superlu_dist"], work_dir=wd) - self.run_test( - "git", - options=["clone", "https://github.com/xiaoyeli/superlu_dist.git"], - work_dir=wd, - ) - self.run_test("mkdir", options=["-p", "build"], work_dir=wd + "/superlu_dist") - self.run_test("mkdir", options=["-p", "EXAMPLE"], work_dir=wd + "/superlu_dist/build") - self.run_test("cp", options=op, work_dir=wd + "/superlu_dist/build/EXAMPLE") - - if "+hypre" in spec: - hypredriver = join_path(spec["hypre"].prefix.bin, "ij") - op = ["-r", hypredriver, "."] - # copy superlu-dist executables to the correct place - wd = join_path(test_dir, "Hypre") - self.run_test("rm", options=["-rf", "hypre"], work_dir=wd) - self.run_test( - "git", options=["clone", "https://github.com/hypre-space/hypre.git"], work_dir=wd - ) - self.run_test("cp", options=op, work_dir=wd + "/hypre/src/test/") - - wd = self.test_suite.current_test_cache_dir - with open("{0}/run_env.sh".format(wd), "w") as envfile: + spec = self.spec + script_path = f"{install_test_root(self)}/run_env.sh" + with open(script_path, "w") as envfile: envfile.write('if [[ $NERSC_HOST = "cori" ]]; then\n') envfile.write(" export machine=cori\n") envfile.write('elif [[ $(uname -s) = "Darwin" ]]; then\n') @@ -154,13 +130,15 @@ def test(self): envfile.write(" export machine=unknownlinux\n") envfile.write("fi\n") envfile.write("export GPTUNEROOT=$PWD\n") - envfile.write("export MPIRUN={0}\n".format(which(spec["mpi"].prefix.bin + "/mpirun"))) - envfile.write("export PYTHONPATH={0}:$PYTHONPATH\n".format(python_platlib + "/gptune")) + mpirun = spec["mpi"].prefix.bin.mpirun + envfile.write(f"export MPIRUN={mpirun}\n") + gptune_path = join_path(python_platlib, "gptune") + envfile.write(f"export PYTHONPATH={gptune_path}:$PYTHONPATH\n") envfile.write("export proc=$(spack arch)\n") - envfile.write("export mpi={0}\n".format(spec["mpi"].name)) - envfile.write("export compiler={0}\n".format(comp_name)) - envfile.write("export nodes={0} \n".format(self.nodes)) - envfile.write("export cores={0} \n".format(self.cores)) + envfile.write(f"export mpi={spec['mpi'].name}\n") + envfile.write(f"export compiler={comp_name}\n") + envfile.write(f"export nodes={self.nodes} \n") + envfile.write(f"export cores={self.cores} \n") envfile.write("export ModuleEnv=$machine-$proc-$mpi-$compiler \n") envfile.write( 'software_json=$(echo ",\\"software_configuration\\":' @@ -214,28 +192,112 @@ def test(self): + '{\\"nodes\\":$nodes,\\"cores\\":$cores}}}") \n' ) - # copy the environment configuration files to non-cache directories - op = ["run_env.sh", python_platlib + "/gptune/."] - self.run_test("cp", options=op, work_dir=wd) - op = ["run_env.sh", self.install_test_root + "/."] - self.run_test("cp", options=op, work_dir=wd) - - apps = ["Scalapack-PDGEQRF_RCI"] - if "+mpispawn" in spec: - apps = apps + ["GPTune-Demo", "Scalapack-PDGEQRF"] - if "+superlu" in spec: - apps = apps + ["SuperLU_DIST_RCI"] - if "+mpispawn" in spec: - apps = apps + ["SuperLU_DIST"] - if "+hypre" in spec: - if "+mpispawn" in spec: - apps = apps + ["Hypre"] + # copy the environment configuration to the python install directory + cp = which("cp") + cp(script_path, join_path(python_platlib, "gptune")) - for app in apps: - wd = join_path(test_dir, app) - self.run_test( - "bash", - options=["run_examples.sh"], - work_dir=wd, - purpose="gptune smoke test for {0}".format(app), + def setup_run_environment(self, env): + env.set("GPTUNE_INSTALL_PATH", python_platlib) + + cmd = {"bash": which("bash"), "cp": which("cp"), "git": which("git"), "rm": which("rm")} + + def test_hypre(self): + """set up and run hypre example""" + spec = self.spec + if spec.satisfies("~hypre") or spec.satisfies("~mpispawn"): + raise SkipTest("Package must be installed with +hypre+mpispawn") + + # https://github.com/spack/spack/pull/45383#discussion_r1737987370 + if not self.spec["hypre"].satisfies("@2.19.0"): + raise SkipTest("Package test only works for hypre@2.19.0") + + test_dir = join_path(self.test_suite.current_test_cache_dir, self.examples_src_dir) + + # copy hypre executables to the correct place + wd = join_path(test_dir, "Hypre") + with working_dir(wd): + self.cmd["rm"]("-rf", "hypre") + self.cmd["git"]( + "clone", + "--depth", + "1", + "--branch", + f"v{self.spec['hypre'].version.string}", + "https://github.com/hypre-space/hypre.git", ) + + hypre_test_dir = join_path(wd, "hypre", "src", "test") + mkdirp(hypre_test_dir) + self.cmd["cp"]("-r", self.spec["hypre"].prefix.bin.ij, hypre_test_dir) + + # now run the test example + with working_dir(join_path(test_dir, "Hypre")): + terminate_bash_failures(".") + self.cmd["bash"]("run_examples.sh") + + def test_superlu(self): + """set up and run superlu tests""" + if self.spec.satisfies("~superlu"): + raise SkipTest("Package must be installed with +superlu") + + # https://github.com/spack/spack/pull/45383#discussion_r1737987370 + if self.spec["superlu-dist"].version < Version("7.1"): + raise SkipTest("Package must be installed with superlu-dist@:7.1") + + test_dir = join_path(self.test_suite.current_test_cache_dir, self.examples_src_dir) + + # copy only works for-dist executables to the correct place + wd = join_path(test_dir, "SuperLU_DIST") + with working_dir(wd): + self.cmd["rm"]("-rf", "superlu_dist") + version = self.spec["superlu-dist"].version.string + tag = f"v{version}" if version.replace(".", "").isdigit() else version + # TODO: Replace this IF/when superlu-dist renames its "master" + # branch's version from "develop" to "master". + tag = "master" if tag == "develop" else tag + self.cmd["git"]( + "clone", + "--depth", + "1", + "--branch", + tag, + "https://github.com/xiaoyeli/superlu_dist.git", + ) + + superludriver = self.spec["superlu-dist"].prefix.lib.EXAMPLE.pddrive_spawn + example_dir = join_path(wd, "superlu_dist", "build", "EXAMPLE") + mkdirp(example_dir) + self.cmd["cp"]("-r", superludriver, example_dir) + + apps = ["SuperLU_DIST", "SuperLU_DIST_RCI"] + for app in apps: + with test_part(self, f"test_superlu_{app}", purpose=f"run {app} example"): + if app == "SuperLU_DIST" and self.spec.satisfies("~mpispawn"): + raise SkipTest("Package must be installed with +superlu+mpispawn") + with working_dir(join_path(test_dir, app)): + terminate_bash_failures(".") + self.cmd["bash"]("run_examples.sh") + + def test_demo(self): + """Run the demo test""" + if self.spec.satisfies("~mpispawn"): + raise SkipTest("Package must be installed with +mpispawn") + + test_dir = join_path(self.test_suite.current_test_cache_dir, self.examples_src_dir) + + with working_dir(join_path(test_dir, "GPTune-Demo")): + terminate_bash_failures(".") + self.cmd["bash"]("run_examples.sh") + + def test_scalapack(self): + """Run scalapack tests""" + test_dir = join_path(self.test_suite.current_test_cache_dir, self.examples_src_dir) + + apps = ["Scalapack-PDGEQRF", "Scalapack-PDGEQRF_RCI"] + for app in apps: + with test_part(self, f"test_scalapack_{app}", purpose=f"run {app} example"): + if app == "Scalapack-PDGEQRF" and self.spec.satisfies("~mpispawn"): + raise SkipTest("Package must be installed with +superlu+mpispawn") + with working_dir(join_path(test_dir, app)): + terminate_bash_failures(".") + self.cmd["bash"]("run_examples.sh") diff --git a/var/spack/repos/builtin/packages/gpu-burn/package.py b/var/spack/repos/builtin/packages/gpu-burn/package.py index c53ff6707ef0e9..8cc872ed6867ed 100644 --- a/var/spack/repos/builtin/packages/gpu-burn/package.py +++ b/var/spack/repos/builtin/packages/gpu-burn/package.py @@ -30,7 +30,7 @@ class GpuBurn(MakefilePackage, CudaPackage): def edit(self, spec, prefix): # update cuda architecture if necessary - if "+cuda" in self.spec: + if self.spec.satisfies("+cuda"): cuda_arch = self.spec.variants["cuda_arch"].value archflag = " ".join(CudaPackage.cuda_flags(cuda_arch)) with open("Makefile", "w") as fh: diff --git a/var/spack/repos/builtin/packages/grackle/package.py b/var/spack/repos/builtin/packages/grackle/package.py index a859ab4ad144cb..63b0c4b5ce2e22 100644 --- a/var/spack/repos/builtin/packages/grackle/package.py +++ b/var/spack/repos/builtin/packages/grackle/package.py @@ -5,6 +5,7 @@ import os.path +from spack.hooks.sbang import filter_shebang from spack.package import * @@ -15,23 +16,39 @@ class Grackle(Package): simulation code """ - homepage = "http://grackle.readthedocs.io/en/grackle-3.1/" - url = "https://bitbucket.org/grackle/grackle/get/grackle-3.1.tar.bz2" + homepage = "http://grackle.readthedocs.io/en/latest/" + url = "https://github.com/grackle-project/grackle/archive/refs/tags/grackle-3.1.tar.gz" - version("3.1", sha256="504fb080c7f8578c92dcde76cf9e8b851331a38ac76fc4a784df4ecbe1ff2ae8") - version("3.0", sha256="9219033332188d615e49135a3b030963f076b3afee098592b0c3e9f8bafdf504") - version("2.2", sha256="b1d201313c924df38d1e677015f7c31dce42083ef6a0e0936bb9410ccd8a3655") - version("2.0.1", sha256="8f784aaf53d98ddb52b448dc51eb9ec452261a2dbb360170a798693b85165f7d") + version("3.1", sha256="5705985a70d65bc2478cc589ca26f631a8de90e3c8f129a6b2af69db17c01079") + version("3.0", sha256="41e9ba1fe18043a98db194a6f5b9c76a7f0296a95a457d2b7d73311195b7d781") + version("2.2", sha256="5855cb0f93736fd8dd47efeb0abdf36af9339ede86de7f895f527513566c0fae") + version("2.0.1", sha256="bcdf6b3ff7b7515ae5e9f1f3369b2690ed8b3c450040e92a03e40582f57a0864") variant("float", default=False, description="Build with float") - depends_on("libtool", when="@2.2") + depends_on("libtool", when="@2.2:") + depends_on("c", type="build") + depends_on("fortran", type="build") + depends_on("tcsh", type="build") depends_on("mpi") depends_on("hdf5+mpi") parallel = False + @run_before("install") + def filter_sbang(self): + """Run before install so that the standard Spack sbang install hook + can fix up the path to the tcsh binary. + """ + tcsh = self.spec["tcsh"].command + with working_dir(self.stage.source_path): + match = "^#!/bin/csh.*" + substitute = f"#!{tcsh}" + filter_file(match, substitute, "configure") + # Since scripts are run during installation, we need to add sbang + filter_shebang("configure") + def install(self, spec, prefix): template_name = "{0.architecture}-{0.compiler.name}" grackle_architecture = template_name.format(spec) @@ -59,7 +76,7 @@ def install(self, spec, prefix): filter_file(key, value, makefile) configure() - with working_dir("src/clib"): + with working_dir(join_path(self.stage.source_path, "src", "clib")): make("clean") make("machine-{0}".format(grackle_architecture)) make("opt-high") diff --git a/var/spack/repos/builtin/packages/gradle/package.py b/var/spack/repos/builtin/packages/gradle/package.py index 5b78f6325c846c..243c06ae621674 100644 --- a/var/spack/repos/builtin/packages/gradle/package.py +++ b/var/spack/repos/builtin/packages/gradle/package.py @@ -19,6 +19,9 @@ class Gradle(Package): license("Apache-2.0", checked_by="wdconinc") + version("8.10.2", sha256="2ab88d6de2c23e6adae7363ae6e29cbdd2a709e992929b48b6530fd0c7133bd6") + version("8.10.1", sha256="fdfca5dbc2834f0ece5020465737538e5ba679deeff5ab6c09621d67f8bb1a15") + version("8.10", sha256="682b4df7fe5accdca84a4d1ef6a3a6ab096b3efd5edf7de2bd8c758d95a93703") version("8.9", sha256="258e722ec21e955201e31447b0aed14201765a3bfbae296a46cf60b70e66db70") version("8.8", sha256="f8b4f4772d302c8ff580bc40d0f56e715de69b163546944f787c87abf209c961") version("8.7", sha256="194717442575a6f96e1c1befa2c30e9a4fc90f701d7aee33eb879b79e7ff05c0") diff --git a/var/spack/repos/builtin/packages/graphicsmagick/package.py b/var/spack/repos/builtin/packages/graphicsmagick/package.py index 60a5e2123db093..e3713d294644db 100644 --- a/var/spack/repos/builtin/packages/graphicsmagick/package.py +++ b/var/spack/repos/builtin/packages/graphicsmagick/package.py @@ -42,7 +42,6 @@ class Graphicsmagick(AutotoolsPackage): depends_on("libpng") depends_on("libsm") depends_on("libtiff") - depends_on("libtool") depends_on("libxml2") depends_on("xz") depends_on("zlib-api") diff --git a/var/spack/repos/builtin/packages/graphviz/package.py b/var/spack/repos/builtin/packages/graphviz/package.py index 573c8abef5f0d2..ca3552c3fd2906 100644 --- a/var/spack/repos/builtin/packages/graphviz/package.py +++ b/var/spack/repos/builtin/packages/graphviz/package.py @@ -164,7 +164,7 @@ def setup_build_environment(self, env): # Set MACOSX_DEPLOYMENT_TARGET to 10.x due to old configure super().setup_build_environment(env) - if "+quartz" in self.spec: + if self.spec.satisfies("+quartz"): env.set("OBJC", self.compiler.cc) @when("%clang platform=darwin") @@ -209,7 +209,7 @@ def configure_args(self): args.append("--with-{0}includedir={1}".format(var, spec[var].prefix.include)) args.append("--with-{0}libdir={1}".format(var, spec[var].prefix.lib)) - if "+zlib" in spec: + if spec.satisfies("+zlib"): args.append("--with-zlibincludedir={}".format(spec["zlib-api"].prefix.include)) args.append("--with-zliblibdir={}".format(spec["zlib-api"].prefix.lib)) diff --git a/var/spack/repos/builtin/packages/grass/package.py b/var/spack/repos/builtin/packages/grass/package.py index aa1414ea190263..d66a88b32937cc 100644 --- a/var/spack/repos/builtin/packages/grass/package.py +++ b/var/spack/repos/builtin/packages/grass/package.py @@ -117,132 +117,132 @@ def configure_args(self): "--with-proj-share={0}".format(spec["proj"].prefix.share.proj), ] - if "+cxx" in spec: + if spec.satisfies("+cxx"): args.append("--with-cxx") else: args.append("--without-cxx") - if "+tiff" in spec: + if spec.satisfies("+tiff"): args.append("--with-tiff") else: args.append("--without-tiff") - if "+png" in spec: + if spec.satisfies("+png"): args.append("--with-png") else: args.append("--without-png") - if "+postgres" in spec: + if spec.satisfies("+postgres"): args.append("--with-postgres") else: args.append("--without-postgres") - if "+mysql" in spec: + if spec.satisfies("+mysql"): args.append("--with-mysql") else: args.append("--without-mysql") - if "+sqlite" in spec: + if spec.satisfies("+sqlite"): args.append("--with-sqlite") else: args.append("--without-sqlite") - if "+opengl" in spec: + if spec.satisfies("+opengl"): args.append("--with-opengl") else: args.append("--without-opengl") - if "+odbc" in spec: + if spec.satisfies("+odbc"): args.append("--with-odbc") else: args.append("--without-odbc") - if "+fftw" in spec: + if spec.satisfies("+fftw"): args.append("--with-fftw") else: args.append("--without-fftw") - if "+blas" in spec: + if spec.satisfies("+blas"): args.append("--with-blas") else: args.append("--without-blas") - if "+lapack" in spec: + if spec.satisfies("+lapack"): args.append("--with-lapack") else: args.append("--without-lapack") - if "+cairo" in spec: + if spec.satisfies("+cairo"): args.append("--with-cairo") else: args.append("--without-cairo") - if "+freetype" in spec: + if spec.satisfies("+freetype"): args.append("--with-freetype") else: args.append("--without-freetype") - if "+readline" in spec: + if spec.satisfies("+readline"): args.append("--with-readline") else: args.append("--without-readline") - if "+regex" in spec: + if spec.satisfies("+regex"): args.append("--with-regex") else: args.append("--without-regex") - if "+pthread" in spec: + if spec.satisfies("+pthread"): args.append("--with-pthread") else: args.append("--without-pthread") - if "+openmp" in spec: + if spec.satisfies("+openmp"): args.append("--with-openmp") else: args.append("--without-openmp") - if "+opencl" in spec: + if spec.satisfies("+opencl"): args.append("--with-opencl") else: args.append("--without-opencl") - if "+bzlib" in spec: + if spec.satisfies("+bzlib"): args.append("--with-bzlib") else: args.append("--without-bzlib") - if "+zstd" in spec: + if spec.satisfies("+zstd"): args.append("--with-zstd") else: args.append("--without-zstd") - if "+gdal" in spec: + if spec.satisfies("+gdal"): args.append("--with-gdal={0}/gdal-config".format(spec["gdal"].prefix.bin)) else: args.append("--without-gdal") - if "+liblas" in spec: + if spec.satisfies("+liblas"): args.append("--with-liblas={0}/liblas-config".format(spec["liblas"].prefix.bin)) else: args.append("--without-liblas") - if "+wxwidgets" in spec: + if spec.satisfies("+wxwidgets"): args.append("--with-wxwidgets={0}/wx-config".format(spec["wxwidgets"].prefix.bin)) else: args.append("--without-wxwidgets") - if "+netcdf" in spec: + if spec.satisfies("+netcdf"): args.append("--with-netcdf={0}/bin/nc-config".format(spec["netcdf-c"].prefix)) else: args.append("--without-netcdf") - if "+geos" in spec: + if spec.satisfies("+geos"): args.append("--with-geos={0}/bin/geos-config".format(spec["geos"].prefix)) else: args.append("--without-geos") - if "+x" in spec: + if spec.satisfies("+x"): args.append("--with-x") else: args.append("--without-x") diff --git a/var/spack/repos/builtin/packages/grep/package.py b/var/spack/repos/builtin/packages/grep/package.py index caeeb0bec89d29..1ff968569f99f8 100644 --- a/var/spack/repos/builtin/packages/grep/package.py +++ b/var/spack/repos/builtin/packages/grep/package.py @@ -32,7 +32,7 @@ class Grep(AutotoolsPackage): def configure_args(self): args = [] - if "+pcre" in self.spec: + if self.spec.satisfies("+pcre"): args.append("--enable-perl-regexp") else: args.append("--disable-perl-regexp") diff --git a/var/spack/repos/builtin/packages/grib-api/package.py b/var/spack/repos/builtin/packages/grib-api/package.py index 70d3d2517d73c7..2f207025a95856 100644 --- a/var/spack/repos/builtin/packages/grib-api/package.py +++ b/var/spack/repos/builtin/packages/grib-api/package.py @@ -105,7 +105,7 @@ def cmake_args(self): for var, opt in var_opt_list ] - if "+netcdf" in self.spec: + if self.spec.satisfies("+netcdf"): args.extend( [ "-DENABLE_NETCDF=ON", @@ -128,12 +128,12 @@ def cmake_args(self): if self.spec.variants["jp2k"].value == "openjpeg": args.append("-DOPENJPEG_PATH=" + self.spec["openjpeg"].prefix) - if "+png" in self.spec: + if self.spec.satisfies("+png"): args.extend(["-DENABLE_PNG=ON", "-DZLIB_ROOT=" + self.spec["zlib-api"].prefix]) else: args.append("-DENABLE_PNG=OFF") - if "+aec" in self.spec: + if self.spec.satisfies("+aec"): args.extend( [ "-DENABLE_AEC=ON", diff --git a/var/spack/repos/builtin/packages/grid/package.py b/var/spack/repos/builtin/packages/grid/package.py index ad782b35726701..9d1b6b3fe0f9c1 100644 --- a/var/spack/repos/builtin/packages/grid/package.py +++ b/var/spack/repos/builtin/packages/grid/package.py @@ -77,12 +77,12 @@ def configure_args(self): args = ["--with-gmp", "--with-mpfr"] if spec.satisfies("^intel-mkl"): - if "+fftw" in spec or "+lapack" in spec: + if spec.satisfies("+fftw") or spec.satisfies("+lapack"): args.append("--enable-mkl") else: - if "+fftw" in spec: + if spec.satisfies("+fftw"): args.append("--with-fftw={0}".format(self.spec["fftw-api"].prefix)) - if "+lapack" in spec: + if spec.satisfies("+lapack"): args.append("--enable-lapack={0}".format(self.spec["lapack"].prefix)) # lapack is searched only as `-llapack`, so anything else # wouldn't be found, causing an error. diff --git a/var/spack/repos/builtin/packages/gridlab-d/package.py b/var/spack/repos/builtin/packages/gridlab-d/package.py index 6f18648920d19e..882b065fb53734 100644 --- a/var/spack/repos/builtin/packages/gridlab-d/package.py +++ b/var/spack/repos/builtin/packages/gridlab-d/package.py @@ -42,7 +42,7 @@ class GridlabD(AutotoolsPackage): def configure_args(self): args = [] - if "+helics" in self.spec: + if self.spec.satisfies("+helics"): # Taken from # https://github.com/GMLC-TDC/HELICS-Tutorial/tree/master/setup args.append("--with-helics=" + self.spec["helics"].prefix) diff --git a/var/spack/repos/builtin/packages/groff/package.py b/var/spack/repos/builtin/packages/groff/package.py index 47a216b5190475..8e96bc06ada787 100644 --- a/var/spack/repos/builtin/packages/groff/package.py +++ b/var/spack/repos/builtin/packages/groff/package.py @@ -82,7 +82,7 @@ def determine_version(cls, exe): def configure_args(self): args = ["--disable-silent-rules"] args.extend(self.with_or_without("x")) - if "@1.22.4:" in self.spec: + if self.spec.satisfies("@1.22.4:"): args.extend(self.with_or_without("uchardet")) if self.spec["iconv"].name == "libiconv": args.append(f"--with-libiconv-prefix={self.spec['iconv'].prefix}") diff --git a/var/spack/repos/builtin/packages/gromacs/package.py b/var/spack/repos/builtin/packages/gromacs/package.py index 9b149aa2ce82b0..0d8942d66f1218 100644 --- a/var/spack/repos/builtin/packages/gromacs/package.py +++ b/var/spack/repos/builtin/packages/gromacs/package.py @@ -384,14 +384,14 @@ def patch(self): string=True, ) - if "+plumed" in self.spec: + if self.spec.satisfies("+plumed"): self.spec["plumed"].package.apply_patch(self) if self.spec.satisfies("%nvhpc"): # Disable obsolete workaround filter_file("ifdef __PGI", "if 0", "src/gromacs/fileio/xdrf.h") - if "+cuda" in self.spec: + if self.spec.satisfies("+cuda"): # Upstream supports building of last two major versions of Gromacs. # Older versions of Gromacs need to be patched to build with more recent # versions of CUDA library. @@ -486,7 +486,7 @@ def cmake_args(self): # In other words, the mapping between package variants and the # GMX CMake variables is often non-trivial. - if "+mpi" in self.spec: + if self.spec.satisfies("+mpi"): options.append("-DGMX_MPI:BOOL=ON") if self.pkg.version < Version("2020"): # Ensures gmxapi builds properly @@ -542,39 +542,39 @@ def cmake_args(self): else: options.append("-DGMX_GPLUSPLUS_PATH=%s/g++" % self.spec["gcc"].prefix.bin) - if "+double" in self.spec: + if self.spec.satisfies("+double"): options.append("-DGMX_DOUBLE:BOOL=ON") - if "+nosuffix" in self.spec: + if self.spec.satisfies("+nosuffix"): options.append("-DGMX_DEFAULT_SUFFIX:BOOL=OFF") - if "~shared" in self.spec: + if self.spec.satisfies("~shared"): options.append("-DBUILD_SHARED_LIBS:BOOL=OFF") options.append("-DGMXAPI:BOOL=OFF") - if "+hwloc" in self.spec: + if self.spec.satisfies("+hwloc"): options.append("-DGMX_HWLOC:BOOL=ON") else: options.append("-DGMX_HWLOC:BOOL=OFF") if self.pkg.version >= Version("2021"): - if "+cuda" in self.spec: + if self.spec.satisfies("+cuda"): options.append("-DGMX_GPU:STRING=CUDA") - elif "+opencl" in self.spec: + elif self.spec.satisfies("+opencl"): options.append("-DGMX_GPU:STRING=OpenCL") - elif "+sycl" in self.spec: + elif self.spec.satisfies("+sycl"): options.append("-DGMX_GPU:STRING=SYCL") else: options.append("-DGMX_GPU:STRING=OFF") else: - if "+cuda" in self.spec or "+opencl" in self.spec: + if self.spec.satisfies("+cuda") or self.spec.satisfies("+opencl"): options.append("-DGMX_GPU:BOOL=ON") - if "+opencl" in self.spec: + if self.spec.satisfies("+opencl"): options.append("-DGMX_USE_OPENCL=ON") else: options.append("-DGMX_GPU:BOOL=OFF") - if "+cuda" in self.spec: + if self.spec.satisfies("+cuda"): options.append("-DCUDA_TOOLKIT_ROOT_DIR:STRING=" + self.spec["cuda"].prefix) if not self.spec.satisfies("cuda_arch=none"): cuda_arch = self.spec.variants["cuda_arch"].value @@ -588,28 +588,28 @@ def cmake_args(self): if self.spec["blas"].libs: options.append("-DGMX_BLAS_USER={0}".format(self.spec["blas"].libs.joined(";"))) - if "+cp2k" in self.spec: + if self.spec.satisfies("+cp2k"): options.append("-DGMX_CP2K:BOOL=ON") options.append("-DCP2K_DIR:STRING={0}".format(self.spec["cp2k"].prefix)) - if "+cufftmp" in self.spec: + if self.spec.satisfies("+cufftmp"): options.append("-DGMX_USE_CUFFTMP=ON") options.append( f'-DcuFFTMp_ROOT={self.spec["nvhpc"].prefix}/Linux_{self.spec.target.family}' + f'/{self.spec["nvhpc"].version}/math_libs' ) - if "+heffte" in self.spec: + if self.spec.satisfies("+heffte"): options.append("-DGMX_USE_HEFFTE=on") options.append(f'-DHeffte_ROOT={self.spec["heffte"].prefix}') - if "+intel-data-center-gpu-max" in self.spec: + if self.spec.satisfies("+intel-data-center-gpu-max"): options.append("-DGMX_GPU_NB_CLUSTER_SIZE=8") options.append("-DGMX_GPU_NB_NUM_CLUSTER_PER_CELL_X=1") - if "~nblib" in self.spec: + if self.spec.satisfies("~nblib"): options.append("-DGMX_INSTALL_NBLIB_API=OFF") - if "~gmxapi" in self.spec: + if self.spec.satisfies("~gmxapi"): options.append("-DGMXAPI=OFF") # Activate SIMD based on properties of the target @@ -685,7 +685,7 @@ def cmake_args(self): ) ) - if "+cycle_subcounters" in self.spec: + if self.spec.satisfies("+cycle_subcounters"): options.append("-DGMX_CYCLE_SUBCOUNTERS:BOOL=ON") else: options.append("-DGMX_CYCLE_SUBCOUNTERS:BOOL=OFF") @@ -719,7 +719,7 @@ def cmake_args(self): else: # we rely on the fftw-api@3 options.append("-DGMX_FFT_LIBRARY=fftw3") - if "^amdfftw" in self.spec: + if self.spec.satisfies("^[virtuals=fftw-api] amdfftw"): options.append("-DGMX_FFT_LIBRARY=fftw3") options.append( "-DFFTWF_INCLUDE_DIRS={0}".format(self.spec["amdfftw"].headers.directories[0]) @@ -727,14 +727,14 @@ def cmake_args(self): options.append( "-DFFTWF_LIBRARIES={0}".format(self.spec["amdfftw"].libs.joined(";")) ) - elif "^armpl-gcc" in self.spec: + elif self.spec.satisfies("^armpl-gcc"): options.append( "-DFFTWF_INCLUDE_DIR={0}".format(self.spec["armpl-gcc"].headers.directories[0]) ) options.append( "-DFFTWF_LIBRARY={0}".format(self.spec["armpl-gcc"].libs.joined(";")) ) - elif "^acfl" in self.spec: + elif self.spec.satisfies("^acfl"): options.append( "-DFFTWF_INCLUDE_DIR={0}".format(self.spec["acfl"].headers.directories[0]) ) @@ -742,7 +742,7 @@ def cmake_args(self): # Ensure that the GROMACS log files report how the code was patched # during the build, so that any problems are easier to diagnose. - if "+plumed" in self.spec: + if self.spec.satisfies("+plumed"): options.append("-DGMX_VERSION_STRING_OF_FORK=PLUMED-spack") else: options.append("-DGMX_VERSION_STRING_OF_FORK=spack") diff --git a/var/spack/repos/builtin/packages/grpc/package.py b/var/spack/repos/builtin/packages/grpc/package.py index 8ecd862756fa78..2aaba6ca8db53f 100644 --- a/var/spack/repos/builtin/packages/grpc/package.py +++ b/var/spack/repos/builtin/packages/grpc/package.py @@ -13,6 +13,7 @@ class Grpc(CMakePackage): license("Apache-2.0 AND BSD-3-Clause AND MIT") + version("1.66.1", sha256="79ed4ab72fa9589b20f8b0b76c16e353e4cfec1d773d33afad605d97b5682c61") version("1.64.0", sha256="d5509e40fb24f6390deeef8a88668124f4ec77d2ebb3b1a957b235a2f08b70c0") version("1.63.0", sha256="493d9905aa09124c2f44268b66205dd013f3925a7e82995f36745974e97af609") version("1.62.2", sha256="e5d5e0dd96fe9452fe24cc8c827381dca484c54d171fb512a198025fec81a3c8") @@ -47,8 +48,8 @@ class Grpc(CMakePackage): version("1.24.3", sha256="c84b3fa140fcd6cce79b3f9de6357c5733a0071e04ca4e65ba5f8d306f10f033") version("1.23.1", sha256="dd7da002b15641e4841f20a1f3eb1e359edb69d5ccf8ac64c362823b05f523d9") - depends_on("c", type="build") # generated - depends_on("cxx", type="build") # generated + depends_on("c", type="build") + depends_on("cxx", type="build") variant("shared", default=False, description="Build shared instead of static libraries") variant( @@ -65,6 +66,7 @@ class Grpc(CMakePackage): ) depends_on("protobuf") + depends_on("protobuf@3.22:", when="@1.55:") depends_on("openssl") depends_on("zlib-api") depends_on("c-ares") diff --git a/var/spack/repos/builtin/packages/gslib/package.py b/var/spack/repos/builtin/packages/gslib/package.py index 65d9e9fdbbf9f1..45e3f4e1135d2f 100644 --- a/var/spack/repos/builtin/packages/gslib/package.py +++ b/var/spack/repos/builtin/packages/gslib/package.py @@ -50,7 +50,7 @@ def install(self, spec, prefix): if "+mpiio" not in spec: filter_file(r"MPIIO.*?=.*1", "MPIIO = 0", makefile) - if "+mpi" in spec: + if spec.satisfies("+mpi"): cc = spec["mpi"].mpicc else: filter_file(r"MPI.*?=.*1", "MPI = 0", makefile) @@ -58,7 +58,7 @@ def install(self, spec, prefix): make_cmd = "CC=" + cc - if "+blas" in spec: + if spec.satisfies("+blas"): filter_file(r"BLAS.*?=.*0", "BLAS = 1", makefile) blas = spec["blas"].libs ld_flags = blas.ld_flags diff --git a/var/spack/repos/builtin/packages/gtkplus/package.py b/var/spack/repos/builtin/packages/gtkplus/package.py index 4c7bd0fdd1b105..0db55334b023df 100644 --- a/var/spack/repos/builtin/packages/gtkplus/package.py +++ b/var/spack/repos/builtin/packages/gtkplus/package.py @@ -6,7 +6,7 @@ from spack.package import * -class Gtkplus(MesonPackage): +class Gtkplus(AutotoolsPackage, MesonPackage): """The GTK+ package contains libraries used for creating graphical user interfaces for applications.""" @@ -15,6 +15,12 @@ class Gtkplus(MesonPackage): license("LGPL-2.0-or-later") + build_system( + conditional("autotools", when="@:3.24.35"), + conditional("meson", when="@3.24.9:"), + default="autotools", + ) + version("3.24.41", sha256="47da61487af3087a94bc49296fd025ca0bc02f96ef06c556e7c8988bd651b6fa") version("3.24.29", sha256="f57ec4ade8f15cab0c23a80dcaee85b876e70a8823d9105f067ce335a8268caa") version("3.24.26", sha256="2cc1b2dc5cad15d25b6abd115c55ffd8331e8d4677745dd3ce6db725b4fff1e9") @@ -45,8 +51,8 @@ class Gtkplus(MesonPackage): variant("cups", default=False, description="enable cups support") # See meson.build for version requirements - depends_on("meson@0.48.0:", when="@3.24:", type="build") - depends_on("ninja", when="@3.24:", type="build") + depends_on("meson@0.48.0:", when="build_system=meson", type="build") + depends_on("ninja", when="build_system=meson", type="build") # Needed to build man pages: # depends_on('docbook-xml', when='@3.24:', type='build') # depends_on('docbook-xsl', when='@3.24:', type='build') @@ -70,6 +76,7 @@ class Gtkplus(MesonPackage): depends_on("fixesproto", when="@3:") depends_on("gettext", when="@3:") depends_on("cups", when="+cups") + depends_on("libxfixes", when="@:2") patch("no-demos.patch", when="@2.0:2") @@ -91,14 +98,20 @@ def patch(self): def setup_run_environment(self, env): env.prepend_path("GI_TYPELIB_PATH", join_path(self.prefix.lib, "girepository-1.0")) - def setup_dependent_build_environment(self, env, dependent_spec): + def setup_dependent_run_environment(self, env, dependent_spec): env.prepend_path("XDG_DATA_DIRS", self.prefix.share) env.prepend_path("GI_TYPELIB_PATH", join_path(self.prefix.lib, "girepository-1.0")) - def setup_dependent_run_environment(self, env, dependent_spec): + +class BuildEnvironment: + + def setup_dependent_build_environment(self, env, dependent_spec): env.prepend_path("XDG_DATA_DIRS", self.prefix.share) env.prepend_path("GI_TYPELIB_PATH", join_path(self.prefix.lib, "girepository-1.0")) + +class MesonBuilder(BuildEnvironment, spack.build_systems.meson.MesonBuilder): + def meson_args(self): args = [] @@ -113,6 +126,13 @@ def meson_args(self): return args + def check(self): + """All build time checks open windows in the X server, don't do that""" + pass + + +class AutotoolsBuilder(BuildEnvironment, spack.build_systems.autotools.AutotoolsBuilder): + def configure_args(self): true = which("true") args = [ @@ -124,22 +144,10 @@ def configure_args(self): "GTKDOC_MKPDF={0}".format(true), "GTKDOC_REBASE={0}".format(true), ] - if "~cups" in self.spec: + if self.spec.satisfies("~cups"): args.append("--disable-cups") return args - @when("@:3.20.10") - def meson(self, spec, prefix): - configure(*self.configure_args()) - - @when("@:3.20.10") - def build(self, spec, prefix): - make() - - @when("@:3.20.10") - def install(self, spec, prefix): - make("install") - def check(self): """All build time checks open windows in the X server, don't do that""" pass diff --git a/var/spack/repos/builtin/packages/guacamole-client/package.py b/var/spack/repos/builtin/packages/guacamole-client/package.py index 7b1cb8d11cd5f4..1aed681f84ee2f 100644 --- a/var/spack/repos/builtin/packages/guacamole-client/package.py +++ b/var/spack/repos/builtin/packages/guacamole-client/package.py @@ -15,6 +15,19 @@ class GuacamoleClient(MavenPackage): license("Apache-2.0") + version("1.5.5", sha256="ebbd3c0b73ddafbf6656d11324163f5b8d410f94b472791e6fa75fca13a5d30b") version("1.2.0", sha256="2327368a32e61cf82032311be79ded4e5eefbc59ac9fb6e0a054b4f49168843e") - depends_on("java@8", type=("build", "run")) + # remove usage of deprecated AccessController class, deprecated in java 17 + patch( + "https://github.com/apache/guacamole-client/commit/b315e6aac84550948763a2bc99f12ceb2a28dca1.patch?full_index=1", + sha256="3529eb8bfd3d025682463cbce3f5a58bdbcacfa58c915c5471e00913c89f7474", + when="@1.5:1.5.5", + ) + + depends_on("java@8:", type=("build", "run")) + depends_on("java@:16", type=("build", "run"), when="@:1.4") + + def build_args(self): + # The file .spack_patched is flagged as an unapproved license + return ["-Drat.numUnapprovedLicenses=1"] diff --git a/var/spack/repos/builtin/packages/guacamole-server/package.py b/var/spack/repos/builtin/packages/guacamole-server/package.py index 42ac61c9256a40..0b0805dcc13373 100644 --- a/var/spack/repos/builtin/packages/guacamole-server/package.py +++ b/var/spack/repos/builtin/packages/guacamole-server/package.py @@ -16,15 +16,18 @@ class GuacamoleServer(AutotoolsPackage): license("GPL-3.0-or-later") - version("1.1.0", sha256="d0f0c66ebfa7a4fd6689ae5240f21797b5177945a042388b691b15b8bd5c81a8") + version("1.5.5", sha256="50430c0f0f3b92f2cd3e60436fab0cedee8c1a9f762696a666016347039c731e") + with default_args(deprecated=True): + # https://nvd.nist.gov/vuln/detail/CVE-2023-43826 + version("1.1.0", sha256="d0f0c66ebfa7a4fd6689ae5240f21797b5177945a042388b691b15b8bd5c81a8") - depends_on("c", type="build") # generated + depends_on("c", type="build") depends_on("autoconf", type="build") depends_on("automake", type="build") depends_on("libtool", type="build") depends_on("m4", type="build") - depends_on("cairo") + depends_on("cairo +pdf +png") # pdf enables zlib support required for CairoScript depends_on("libjpeg") depends_on("libpng") depends_on("uuid") diff --git a/var/spack/repos/builtin/packages/guile/package.py b/var/spack/repos/builtin/packages/guile/package.py index 24b73341fbac6e..170b0f92bae96a 100644 --- a/var/spack/repos/builtin/packages/guile/package.py +++ b/var/spack/repos/builtin/packages/guile/package.py @@ -41,7 +41,7 @@ class Guile(AutotoolsPackage, GNUMirrorPackage): depends_on("bdw-gc@7.0: threads=dgux386", when="threads=dgux386") depends_on("gmp@4.2:") depends_on("gettext") - depends_on("libtool@1.5.6:") + depends_on("libtool@1.5.6:", type="link") # links to libltdl.so depends_on("libunistring@0.9.3:") depends_on("libffi") depends_on("readline", when="+readline") @@ -70,12 +70,12 @@ def configure_args(self): "--with-libintl-prefix={0}".format(spec["gettext"].prefix), ] - if "threads=none" in spec: + if spec.satisfies("threads=none"): config_args.append("--without-threads") else: config_args.append("--with-threads") - if "+readline" in spec: + if spec.satisfies("+readline"): config_args.append("--with-libreadline-prefix={0}".format(spec["readline"].prefix)) else: config_args.append("--without-libreadline-prefix") diff --git a/var/spack/repos/builtin/packages/gunrock/package.py b/var/spack/repos/builtin/packages/gunrock/package.py index 5cdfa5f3a247f2..bcb9189aac12a8 100644 --- a/var/spack/repos/builtin/packages/gunrock/package.py +++ b/var/spack/repos/builtin/packages/gunrock/package.py @@ -163,5 +163,5 @@ def install(self, spec, prefix): with working_dir(self.build_directory): install_tree("lib", prefix.lib) # bin dir is created only if tests/examples are built - if "+tests" in spec: + if spec.satisfies("+tests"): install_tree("bin", prefix.bin) diff --git a/var/spack/repos/builtin/packages/gxsview/package.py b/var/spack/repos/builtin/packages/gxsview/package.py index a0418477527625..0d94df2f6eed1c 100644 --- a/var/spack/repos/builtin/packages/gxsview/package.py +++ b/var/spack/repos/builtin/packages/gxsview/package.py @@ -66,7 +66,7 @@ def qmake_args(self): ) # Below to avoid undefined reference to `std::filesystem::__cxx11::path::_M_split_cmpts()' if self.spec.satisfies("%gcc@8.0:8.9") or self.spec.satisfies("%fj"): - if "^vtk@9:" in self.spec: + if self.spec.satisfies("^vtk@9:"): fic = "vtk9.pri" else: fic = "vtk8.pri" diff --git a/var/spack/repos/builtin/packages/h5hut/package.py b/var/spack/repos/builtin/packages/h5hut/package.py index cfef678975db2f..d400a3cef4f941 100644 --- a/var/spack/repos/builtin/packages/h5hut/package.py +++ b/var/spack/repos/builtin/packages/h5hut/package.py @@ -43,7 +43,7 @@ class H5hut(AutotoolsPackage): def validate(self): """Checks if Fortran compiler is available.""" - if "+fortran" in self.spec and not self.compiler.fc: + if self.spec.satisfies("+fortran") and not self.compiler.fc: raise RuntimeError("Cannot build Fortran variant without a Fortran compiler.") def flag_handler(self, name, flags): @@ -59,10 +59,10 @@ def configure_args(self): spec = self.spec config_args = ["--enable-shared"] - if "+fortran" in spec: + if spec.satisfies("+fortran"): config_args.append("--enable-fortran") - if "+mpi" in spec: + if spec.satisfies("+mpi"): config_args.extend( [ "--enable-parallel", @@ -71,7 +71,7 @@ def configure_args(self): ] ) - if "+fortran" in spec: + if spec.satisfies("+fortran"): config_args.append("FC={0}".format(spec["mpi"].mpifc)) return config_args diff --git a/var/spack/repos/builtin/packages/h5utils/package.py b/var/spack/repos/builtin/packages/h5utils/package.py index 7818d5bfb50817..10e4a2802dee88 100644 --- a/var/spack/repos/builtin/packages/h5utils/package.py +++ b/var/spack/repos/builtin/packages/h5utils/package.py @@ -47,17 +47,17 @@ def configure_args(self): spec = self.spec args = [] - if "+vis5d" in spec: + if spec.satisfies("+vis5d"): args.append(f"--with-v5d={spec['vis5d'].prefix}") else: args.append("--without-v5d") - if "+octave" in spec: + if spec.satisfies("+octave"): args.append("--with-octave") else: args.append("--without-octave") - if "+hdf" in spec: + if spec.satisfies("+hdf"): args.append("--with-hdf4") else: args.append("--without-hdf4") diff --git a/var/spack/repos/builtin/packages/h5z-zfp/package.py b/var/spack/repos/builtin/packages/h5z-zfp/package.py index 237137b7c8e6bf..f1979dd6ae84f7 100644 --- a/var/spack/repos/builtin/packages/h5z-zfp/package.py +++ b/var/spack/repos/builtin/packages/h5z-zfp/package.py @@ -34,7 +34,7 @@ class H5zZfp(CMakePackage): def make_defs(self): cc = spack_cc fc = spack_fc - if "^hdf5+mpi" in self.spec: + if self.spec.satisfies("^hdf5+mpi"): cc = self.spec["mpi"].mpicc fc = self.spec["mpi"].mpifc make_defs = [ @@ -44,7 +44,7 @@ def make_defs(self): "ZFP_HOME=%s" % self.spec["zfp"].prefix, ] - if "+fortran" in self.spec and fc: + if self.spec.satisfies("+fortran") and fc: make_defs += ["FC=%s" % fc] else: make_defs += ["FC="] diff --git a/var/spack/repos/builtin/packages/halide/package.py b/var/spack/repos/builtin/packages/halide/package.py index 565ec5d16be7c7..df6832bf914140 100644 --- a/var/spack/repos/builtin/packages/halide/package.py +++ b/var/spack/repos/builtin/packages/halide/package.py @@ -118,7 +118,7 @@ def cmake_args(self): for target in llvm_targets: args += [self.define("TARGET_{0}".format(target[0]), target[1])] - if "+python" in spec: + if spec.satisfies("+python"): args += [ self.define("PYBIND11_USE_FETCHCONTENT", False), self.define("Halide_INSTALL_PYTHONDIR", python_platlib), diff --git a/var/spack/repos/builtin/packages/harfbuzz/package.py b/var/spack/repos/builtin/packages/harfbuzz/package.py index d8cd57a9292ebb..08d661912acfe0 100644 --- a/var/spack/repos/builtin/packages/harfbuzz/package.py +++ b/var/spack/repos/builtin/packages/harfbuzz/package.py @@ -2,10 +2,14 @@ # Spack Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) +import sys + import spack.build_systems.autotools import spack.build_systems.meson from spack.package import * +IS_WINDOWS = sys.platform == "win32" + class Harfbuzz(MesonPackage, AutotoolsPackage): """The Harfbuzz package contains an OpenType text shaping engine.""" @@ -20,6 +24,8 @@ class Harfbuzz(MesonPackage, AutotoolsPackage): license("MIT") + version("10.0.1", sha256="b2cb13bd351904cb9038f907dc0dee0ae07127061242fe3556b2795c4e9748fc") + version("10.0.0", sha256="c2dfe016ad833a5043ecc6579043f04e8e6d50064e02ad449bb466e6431e3e04") version("9.0.0", sha256="a41b272ceeb920c57263ec851604542d9ec85ee3030506d94662067c7b6ab89e") version("8.5.0", sha256="77e4f7f98f3d86bf8788b53e6832fb96279956e1c3961988ea3d4b7ca41ddc27") version("8.4.0", sha256="af4ea73e25ab748c8c063b78c2f88e48833db9b2ac369e29bd115702e789755e") @@ -84,12 +90,15 @@ class Harfbuzz(MesonPackage, AutotoolsPackage): description="Enable CoreText shaper backend on macOS", ) - depends_on("pkgconfig", type="build") - depends_on("glib") - depends_on("gobject-introspection") + for plat in ["linux", "darwin", "freebsd"]: + with when(f"platform={plat}"): + depends_on("pkgconfig", type="build") + depends_on("glib") + depends_on("gobject-introspection") + depends_on("cairo+pdf+ft") + depends_on("icu4c") depends_on("freetype") - depends_on("cairo+pdf+ft") depends_on("zlib-api") depends_on("graphite2", when="+graphite2") @@ -146,13 +155,16 @@ class MesonBuilder(spack.build_systems.meson.MesonBuilder, SetupEnvironment): def meson_args(self): graphite2 = "enabled" if self.pkg.spec.satisfies("+graphite2") else "disabled" coretext = "enabled" if self.pkg.spec.satisfies("+coretext") else "disabled" - return [ + config_args = [ # disable building of gtk-doc files following #9885 and #9771 "-Ddocs=disabled", "-Dfreetype=enabled", f"-Dgraphite2={graphite2}", f"-Dcoretext={coretext}", ] + if IS_WINDOWS: + config_args.extend(["-Dcairo=disabled", "-Dglib=disabled"]) + return config_args class AutotoolsBuilder(spack.build_systems.autotools.AutotoolsBuilder, SetupEnvironment): diff --git a/var/spack/repos/builtin/packages/hazelcast/package.py b/var/spack/repos/builtin/packages/hazelcast/package.py index 53511bd5d20e3b..29725b6f379f7a 100644 --- a/var/spack/repos/builtin/packages/hazelcast/package.py +++ b/var/spack/repos/builtin/packages/hazelcast/package.py @@ -15,8 +15,9 @@ class Hazelcast(MavenPackage): homepage = "http://www.hazelcast.com/" url = "https://github.com/hazelcast/hazelcast/archive/v3.12.8.tar.gz" - license("Apache-2.0") + license("Apache-2.0", checked_by="wdconinc") + version("5.5.0", sha256="bbf0c9b9de89512a41d698c02477c88c4955600f34741ee42e26838409e2e526") version("5.2.3", sha256="026c213d3bb520b6c44587ae2a67eca50b9a5a0fc56d2cdedfb2c09c7858a11f") version("4.0.2", sha256="4f01682583ae6603365ac7a24c568d7598cc3c1cbd736e5c6ed98bd75e39ffa3") version("4.0.1", sha256="c9c7d5cbcf70c5e1eb72890df2b4104639f7543f11c6ac5d3e80cd2d4a0d2181") @@ -24,6 +25,4 @@ class Hazelcast(MavenPackage): version("3.12.7", sha256="0747de968082bc50202f825b4010be28a3885b3dbcee4b83cbe21b2f8b26a7e0") version("3.11.7", sha256="c9f636b8813027d4cc24459bd27740549f89b4f11f62a868079bcb5b41d9b2bb") - depends_on("c", type="build") # generated - depends_on("java@8:", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/hdf-eos2/package.py b/var/spack/repos/builtin/packages/hdf-eos2/package.py index 1b41abbf6509dc..aae0b559cf34f1 100644 --- a/var/spack/repos/builtin/packages/hdf-eos2/package.py +++ b/var/spack/repos/builtin/packages/hdf-eos2/package.py @@ -71,7 +71,7 @@ class HdfEos2(AutotoolsPackage): # Build dependencies depends_on("hdf") # Because hdf always depends on zlib and jpeg in spack, the tests below in configure_args - # (if "jpeg" in self.spec:) always returns true and hdf-eos2 wants zlib and jpeg, too. + # (if self.spec.satisfies("^jpeg"):) always returns true and hdf-eos2 wants zlib and jpeg, too. depends_on("zlib-api") depends_on("jpeg") depends_on("szip", when="^hdf +szip") @@ -151,15 +151,15 @@ def configure_args(self): # Provide config args for dependencies extra_args.append("--with-hdf4={0}".format(self.spec["hdf"].prefix)) - if "jpeg" in self.spec: + if self.spec.satisfies("^jpeg"): # Allow handling whatever provider of jpeg are using tmp = self.spec["jpeg"].libs.directories if tmp: tmp = tmp[0] extra_args.append("--with-jpeg={0}".format(tmp)) - if "szip" in self.spec: + if self.spec.satisfies("^szip"): extra_args.append("--with-szlib={0}".format(self.spec["szip"].prefix)) - if "zlib" in self.spec: + if self.spec.satisfies("^zlib"): extra_args.append("--with-zlib={0}".format(self.spec["zlib-api"].prefix)) return extra_args diff --git a/var/spack/repos/builtin/packages/hdf-eos5/package.py b/var/spack/repos/builtin/packages/hdf-eos5/package.py index d459ccb0f235e8..2af16da1ca108a 100644 --- a/var/spack/repos/builtin/packages/hdf-eos5/package.py +++ b/var/spack/repos/builtin/packages/hdf-eos5/package.py @@ -107,9 +107,9 @@ def configure_args(self): # Provide config args for dependencies extra_args.append("--with-hdf5={0}".format(self.spec["hdf5"].prefix)) - if "szip" in self.spec: + if self.spec.satisfies("^szip"): extra_args.append("--with-szlib={0}".format(self.spec["szip"].prefix)) - if "zlib-api" in self.spec: + if self.spec.satisfies("^zlib-api"): extra_args.append("--with-zlib={0}".format(self.spec["zlib-api"].prefix)) return extra_args diff --git a/var/spack/repos/builtin/packages/hdf/package.py b/var/spack/repos/builtin/packages/hdf/package.py index 6fea882e220fa0..85acc3dbb3ec6d 100644 --- a/var/spack/repos/builtin/packages/hdf/package.py +++ b/var/spack/repos/builtin/packages/hdf/package.py @@ -121,7 +121,7 @@ def libs(self): elif "static" in query_parameters: shared = False else: - shared = "+shared" in self.spec + shared = self.spec.satisfies("+shared") libs = find_libraries(libraries, root=self.prefix, shared=shared, recursive=True) @@ -134,15 +134,15 @@ def libs(self): if not shared and "transitive" in query_parameters: libs += self.spec["jpeg:transitive"].libs libs += self.spec["zlib:transitive"].libs - if "+szip" in self.spec: + if self.spec.satisfies("+szip"): libs += self.spec["szip:transitive"].libs - if "+external-xdr" in self.spec and self.spec["rpc"].name == "libtirpc": + if self.spec.satisfies("+external-xdr") and self.spec["rpc"].name == "libtirpc": libs += self.spec["rpc:transitive"].libs return libs def flag_handler(self, name, flags): - if "+pic" in self.spec: + if self.spec.satisfies("+pic"): if name == "cflags": flags.append(self.compiler.cc_pic_flag) elif name == "fflags": @@ -175,12 +175,12 @@ def configure_args(self): config_args += self.enable_or_disable("fortran") config_args += self.enable_or_disable("java") - if "+szip" in self.spec: + if self.spec.satisfies("+szip"): config_args.append("--with-szlib=%s" % self.spec["szip"].prefix) else: config_args.append("--without-szlib") - if "~external-xdr" in self.spec: + if self.spec.satisfies("~external-xdr"): config_args.append("--enable-hdf4-xdr") elif self.spec["rpc"].name == "libtirpc": # We should not specify '--disable-hdf4-xdr' due to a bug in the diff --git a/var/spack/repos/builtin/packages/hdf5/find_package_zlib.patch b/var/spack/repos/builtin/packages/hdf5/find_package_zlib.patch new file mode 100644 index 00000000000000..73b65e826d598e --- /dev/null +++ b/var/spack/repos/builtin/packages/hdf5/find_package_zlib.patch @@ -0,0 +1,12 @@ +diff --git a/CMakeFilters.cmake b/CMakeFilters.cmake +index dbd68fd110..3d06b13d57 100644 +--- a/CMakeFilters.cmake ++++ b/CMakeFilters.cmake +@@ -70,7 +70,6 @@ option (HDF5_ENABLE_Z_LIB_SUPPORT "Enable Zlib Filters" ON) + if (HDF5_ENABLE_Z_LIB_SUPPORT) + if (NOT H5_ZLIB_HEADER) + if (NOT ZLIB_USE_EXTERNAL) +- find_package (ZLIB NAMES ${ZLIB_PACKAGE_NAME}${HDF_PACKAGE_EXT} COMPONENTS static shared) + if (NOT ZLIB_FOUND) + find_package (ZLIB) # Legacy find + endif () diff --git a/var/spack/repos/builtin/packages/hdf5/package.py b/var/spack/repos/builtin/packages/hdf5/package.py index d5f47519ba1f31..d42d4d1122fa04 100644 --- a/var/spack/repos/builtin/packages/hdf5/package.py +++ b/var/spack/repos/builtin/packages/hdf5/package.py @@ -20,10 +20,9 @@ class Hdf5(CMakePackage): flexible and efficient I/O and for high volume and complex data. """ - homepage = "https://portal.hdfgroup.org" - url = "https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.14/hdf5-1.14.3/src/hdf5-1.14.3.tar.gz" - list_url = "https://support.hdfgroup.org/ftp/HDF5/releases" - list_depth = 3 + homepage = "https://support.hdfgroup.org" + url = "https://support.hdfgroup.org/releases/hdf5/v1_14/v1_14_5/downloads/hdf5-1.14.5.tar.gz" + git = "https://github.com/HDFGroup/hdf5.git" maintainers("lrknox", "brtnfld", "byrnHDF", "gheber", "hyoklee", "lkurz") @@ -39,7 +38,8 @@ class Hdf5(CMakePackage): # The 'develop' version is renamed so that we could uninstall (or patch) it # without affecting other develop version. - version("develop-1.15", branch="develop") + version("develop-1.17", branch="develop") + version("develop-1.16", branch="hdf5_1_16") version("develop-1.14", branch="hdf5_1_14") version("develop-1.12", branch="hdf5_1_12") version("develop-1.10", branch="hdf5_1_10") @@ -47,14 +47,37 @@ class Hdf5(CMakePackage): # Odd versions are considered experimental releases # Even versions are maintenance versions + version( + "1.14.5", + sha256="ec2e13c52e60f9a01491bb3158cb3778c985697131fc6a342262d32a26e58e44", + url="https://support.hdfgroup.org/releases/hdf5/v1_14/v1_14_5/downloads/hdf5-1.14.5.tar.gz", + preferred=True, + ) + version( + "1.14.4-3", + sha256="019ac451d9e1cf89c0482ba2a06f07a46166caf23f60fea5ef3c37724a318e03", + url="https://support.hdfgroup.org/releases/hdf5/v1_14/v1_14_4/downloads/hdf5-1.14.4-3.tar.gz", + ) version( "1.14.3", sha256="09cdb287aa7a89148c1638dd20891fdbae08102cf433ef128fd345338aa237c7", - preferred=True, + url="https://support.hdfgroup.org/releases/hdf5/v1_14/v1_14_3/downloads/hdf5-1.14.3.tar.gz", + ) + version( + "1.14.2", + sha256="1c342e634008284a8c2794c8e7608e2eaf26d01d445fb3dfd7f33cb2fb51ac53", + url="https://support.hdfgroup.org/releases/hdf5/v1_14/v1_14_2/downloads/hdf5-1.14.2.tar.gz", + ) + version( + "1.14.1-2", + sha256="cbe93f275d5231df28ced9549253793e40cd2b555e3d288df09d7b89a9967b07", + url="https://support.hdfgroup.org/releases/hdf5/v1_14/v1_14_1/downloads/hdf5-1.14.1-2.tar.gz", + ) + version( + "1.14.0", + sha256="a571cc83efda62e1a51a0a912dd916d01895801c5025af91669484a1575a6ef4", + url="https://support.hdfgroup.org/releases/hdf5/v1_14/v1_14_0/downloads/hdf5-1.14.0.tar.gz", ) - version("1.14.2", sha256="1c342e634008284a8c2794c8e7608e2eaf26d01d445fb3dfd7f33cb2fb51ac53") - version("1.14.1-2", sha256="cbe93f275d5231df28ced9549253793e40cd2b555e3d288df09d7b89a9967b07") - version("1.14.0", sha256="a571cc83efda62e1a51a0a912dd916d01895801c5025af91669484a1575a6ef4") version("1.12.3", sha256="c15adf34647918dd48150ea1bd9dffd3b32a3aec5298991d56048cc3d39b4f6f") version("1.12.2", sha256="2a89af03d56ce7502dcae18232c241281ad1773561ec00c0f0e8ee2463910f14") version("1.12.1", sha256="79c66ff67e666665369396e9c90b32e238e501f345afd2234186bfb8331081ca") @@ -131,7 +154,13 @@ class Hdf5(CMakePackage): depends_on("java", type=("build", "run"), when="+java") depends_on("szip", when="+szip") + depends_on("zlib-api") + # See https://github.com/HDFGroup/hdf5/pull/4147 + depends_on( + "zlib-ng~new_strategies", + when="@:1.14.3,develop-1.8:develop-1.12 ^[virtuals=zlib-api] zlib-ng", + ) # The compiler wrappers (h5cc, h5fc, etc.) run 'pkg-config'. # Skip this on Windows since pkgconfig is autotools @@ -172,6 +201,12 @@ class Hdf5(CMakePackage): "+fortran", when="@1.13.3:^cmake@:3.22", msg="cmake_minimum_required is not set correctly." ) + # HDF5 searches for zlib CMake config files before it falls back to + # FindZLIB.cmake. We don't build zlib with CMake by default, so have to + # delete the first search, otherwise it may find a system zlib. See + # https://github.com/HDFGroup/hdf5/issues/4904 + patch("find_package_zlib.patch", when="@1.8.16:1.14.4") + # There are several officially unsupported combinations of the features: # 1. Thread safety is not guaranteed via high-level C-API but in some cases # it works. @@ -296,9 +331,7 @@ def patch(self): ) def url_for_version(self, version): - url = ( - "https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-{0}/hdf5-{1}/src/hdf5-{1}.tar.gz" - ) + url = "https://support.hdfgroup.org/archive/support/ftp/HDF5/releases/hdf5-{0}/hdf5-{1}/src/hdf5-{1}.tar.gz" return url.format(version.up_to(2), version) def flag_handler(self, name, flags): @@ -317,13 +350,9 @@ def flag_handler(self, name, flags): cmake_flags.append(self.compiler.cc_pic_flag) if spec.satisfies("@1.8.21 %oneapi@2023.0.0"): cmake_flags.append("-Wno-error=int-conversion") - if spec.satisfies("%apple-clang@15:"): - cmake_flags.append("-Wl,-ld_classic") elif name == "cxxflags": if spec.satisfies("@:1.8.12+cxx~shared"): cmake_flags.append(self.compiler.cxx_pic_flag) - if spec.satisfies("%apple-clang@15:"): - cmake_flags.append("-Wl,-ld_classic") elif name == "fflags": if spec.satisfies("%cce+fortran"): # Cray compiler generates module files with uppercase names by @@ -334,7 +363,7 @@ def flag_handler(self, name, flags): if spec.satisfies("@:1.8.12+fortran~shared"): cmake_flags.append(self.compiler.fc_pic_flag) elif name == "ldlibs": - if "+fortran %fj" in spec: + if spec.satisfies("+fortran %fj"): cmake_flags.extend(["-lfj90i", "-lfj90f", "-lfjsrcinfo", "-lelf"]) return flags, None, (cmake_flags or None) @@ -352,7 +381,7 @@ def libs(self): """ query_parameters = self.spec.last_query.extra_parameters - shared = "+shared" in self.spec + shared = self.spec.satisfies("+shared") # This map contains a translation from query_parameters # to the libraries needed @@ -493,7 +522,7 @@ def setup_run_environment(self, env): @run_before("cmake") def fortran_check(self): - if "+fortran" in self.spec and not self.compiler.fc: + if self.spec.satisfies("+fortran") and not self.compiler.fc: msg = "cannot build a Fortran variant without a Fortran compiler" raise RuntimeError(msg) @@ -545,7 +574,7 @@ def cmake_args(self): # MSMPI does not provide compiler wrappers # and pointing these variables at the MSVC compilers # breaks CMake's mpi detection for MSMPI. - if "+mpi" in spec and "msmpi" not in spec: + if spec.satisfies("+mpi") and "msmpi" not in spec: args.extend( [ "-DMPI_CXX_COMPILER:PATH=%s" % spec["mpi"].mpicxx, @@ -553,7 +582,7 @@ def cmake_args(self): ] ) - if "+fortran" in spec: + if spec.satisfies("+fortran"): args.extend(["-DMPI_Fortran_COMPILER:PATH=%s" % spec["mpi"].mpifc]) # work-around for https://github.com/HDFGroup/hdf5/issues/1320 @@ -631,7 +660,7 @@ def fix_package_config(self): def link_debug_libs(self): # When build_type is Debug, the hdf5 build appends _debug to all library names. # Dependents of hdf5 (netcdf-c etc.) can't handle those, thus make symlinks. - if "build_type=Debug" in self.spec: + if self.spec.satisfies("build_type=Debug"): libs = find(self.prefix.lib, "libhdf5*_debug.*", recursive=False) with working_dir(self.prefix.lib): for lib in libs: diff --git a/var/spack/repos/builtin/packages/heasoft/package.py b/var/spack/repos/builtin/packages/heasoft/package.py index eaa0135ebf3093..72db8410e61944 100644 --- a/var/spack/repos/builtin/packages/heasoft/package.py +++ b/var/spack/repos/builtin/packages/heasoft/package.py @@ -93,7 +93,7 @@ def patch(self): join_path("tcltk", "BUILD_DIR", "hd_config_info"), ) - if "+X" in self.spec: + if self.spec.satisfies("+X"): filter_file( r"(\s+XDIR => ).*", r"\1'{0}',".format(self.spec["libx11"].libs.directories[0]), @@ -109,7 +109,7 @@ def configure_args(self): config_args += self.enable_or_disable("x", variant="X") - if "+X" in self.spec: + if self.spec.satisfies("+X"): config_args.extend( [ "--x-includes={0}".format(self.spec["libx11"].headers.directories[0]), diff --git a/var/spack/repos/builtin/packages/heffte/package.py b/var/spack/repos/builtin/packages/heffte/package.py index a397f95f740b8c..7ad6c880435f5c 100644 --- a/var/spack/repos/builtin/packages/heffte/package.py +++ b/var/spack/repos/builtin/packages/heffte/package.py @@ -100,7 +100,7 @@ def cmake_args(self): self.define_from_variant("Heffte_ENABLE_PYTHON", "python"), ] - if "+cuda" in self.spec and self.spec.satisfies("@:2.3.0"): + if self.spec.satisfies("+cuda") and self.spec.satisfies("@:2.3.0"): cuda_arch = self.spec.variants["cuda_arch"].value if len(cuda_arch) > 0 or cuda_arch[0] != "none": nvcc_flags = "" @@ -111,7 +111,7 @@ def cmake_args(self): archs = ";".join(cuda_arch) args.append("-DCMAKE_CUDA_ARCHITECTURES=%s" % archs) - if "+rocm" in self.spec: + if self.spec.satisfies("+rocm"): args.append("-DCMAKE_CXX_COMPILER={0}".format(self.spec["hip"].hipcc)) rocm_arch = self.spec.variants["amdgpu_target"].value @@ -143,7 +143,7 @@ def test_make_test(self): options = [cmake_dir] options.append(self.define("Heffte_DIR", self.spec.prefix.lib.cmake.Heffte)) - if "+rocm" in self.spec: + if self.spec.satisfies("+rocm"): # path name is 'hsa-runtime64' but python cannot have '-' in variable name hsa_runtime = join_path(self.spec["hsa-rocr-dev"].prefix.lib.cmake, "hsa-runtime64") options.extend( diff --git a/var/spack/repos/builtin/packages/helics/package.py b/var/spack/repos/builtin/packages/helics/package.py index 3f3da4d106fd1c..072e746c861705 100644 --- a/var/spack/repos/builtin/packages/helics/package.py +++ b/var/spack/repos/builtin/packages/helics/package.py @@ -142,7 +142,9 @@ def cmake_args(self): # HELICS shared library options args.append( - "-DHELICS_DISABLE_C_SHARED_LIB={0}".format("OFF" if "+c_shared" in spec else "ON") + "-DHELICS_DISABLE_C_SHARED_LIB={0}".format( + "OFF" if spec.satisfies("+c_shared") else "ON" + ) ) args.append(from_variant("HELICS_BUILD_CXX_SHARED_LIB", "cxx_shared")) @@ -150,13 +152,17 @@ def cmake_args(self): args.append(from_variant("HELICS_BUILD_APP_EXECUTABLES", "apps")) args.append(from_variant("HELICS_BUILD_APP_LIBRARY", "apps_lib")) args.append( - "-DHELICS_DISABLE_WEBSERVER={0}".format("OFF" if "+webserver" in spec else "ON") + "-DHELICS_DISABLE_WEBSERVER={0}".format( + "OFF" if spec.satisfies("+webserver") else "ON" + ) ) args.append(from_variant("HELICS_BUILD_BENCHMARKS", "benchmarks")) # Extra HELICS library dependencies - args.append("-DHELICS_DISABLE_BOOST={0}".format("OFF" if "+boost" in spec else "ON")) - args.append("-DHELICS_DISABLE_ASIO={0}".format("OFF" if "+asio" in spec else "ON")) + args.append( + "-DHELICS_DISABLE_BOOST={0}".format("OFF" if spec.satisfies("+boost") else "ON") + ) + args.append("-DHELICS_DISABLE_ASIO={0}".format("OFF" if spec.satisfies("+asio") else "ON")) # Encryption args.append(from_variant("HELICS_ENABLE_ENCRYPTION", "encryption")) @@ -178,5 +184,5 @@ def cmake_args(self): def setup_run_environment(self, env): spec = self.spec - if "+python" in spec: + if spec.satisfies("+python"): env.prepend_path("PYTHONPATH", self.prefix.python) diff --git a/var/spack/repos/builtin/packages/hepmc3/package.py b/var/spack/repos/builtin/packages/hepmc3/package.py index ef913984788b90..fc2e42b7c458ae 100644 --- a/var/spack/repos/builtin/packages/hepmc3/package.py +++ b/var/spack/repos/builtin/packages/hepmc3/package.py @@ -16,7 +16,7 @@ class Hepmc3(CMakePackage): tags = ["hep"] - maintainers("vvolkl") + maintainers("vvolkl", "luketpickering") license("LGPL-3.0-or-later") @@ -70,7 +70,7 @@ def cmake_args(self): spec = self.spec from_variant = self.define_from_variant args = [ - from_variant("HEPMC3_ENABLE_PROTOBUF", "protobuf"), + from_variant("HEPMC3_ENABLE_PROTOBUFIO", "protobuf"), from_variant("HEPMC3_ENABLE_PYTHON", "python"), from_variant("HEPMC3_ENABLE_ROOTIO", "rootio"), from_variant("HEPMC3_INSTALL_INTERFACES", "interfaces"), @@ -92,5 +92,7 @@ def cmake_args(self): args.append( self.define("HEPMC3_CXX_STANDARD", spec["root"].variants["cxxstd"].value) ) + elif spec.satisfies("+protobuf"): + args.append(self.define("HEPMC3_CXX_STANDARD", "14")) return args diff --git a/var/spack/repos/builtin/packages/hermes-shm/package.py b/var/spack/repos/builtin/packages/hermes-shm/package.py new file mode 100644 index 00000000000000..6b51724548add4 --- /dev/null +++ b/var/spack/repos/builtin/packages/hermes-shm/package.py @@ -0,0 +1,87 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +from spack.package import * + + +class HermesShm(CMakePackage): + """Hermes Shared Memory contains a variety of data structures + and synchronization primitives which are compatible with shared memory. + """ + + homepage = "https://github.com/grc-iit/hermes-shm/wiki" + git = "https://github.com/grc-iit/hermes-shm.git" + + maintainers("lukemartinlogan", "hyoklee") + + version("master", branch="master") + version( + "1.1.0", + url="https://github.com/grc-iit/hermes-shm/archive/refs/tags/v1.1.0.tar.gz", + sha256="2270d629373447a2872d7109b5a5e66027dc8d8178d3ba84eb48a875f49b6bdf", + ) + version( + "1.0.0", + url="https://github.com/lukemartinlogan/hermes_shm/archive/refs/tags/v1.0.0.tar.gz", + sha256="a79f01d531ce89985ad59a2f62b41d74c2385e48d929e2f4ad895ae34137573b", + ) + + # Main variants + variant("mochi", default=True, description="Build with mochi-thallium support") + variant("cereal", default=True, description="Build with cereal support") + variant("boost", default=True, description="Build with boost support") + variant("mpiio", default=True, description="Build with MPI support") + variant("vfd", default=False, description="Build with HDF5 support") + variant("zmq", default=False, description="Build ZeroMQ tests") + variant("adios", default=False, description="Build Adios support") + + # Required deps + depends_on("pkgconfig", type="build") + depends_on("catch2@3.0.1") + depends_on("yaml-cpp") + depends_on("doxygen@1.9.3", type="build") + depends_on("libelf") + + # Machine variants + variant("ares", default=False, description="Build in ares") + depends_on("libfabric fabrics=sockets,tcp,udp,verbs,mlx,rxm,rxd,shm", when="+ares") + + # Main dependencies + depends_on("mochi-thallium+cereal@0.10.1", when="+mochi") + depends_on("cereal", when="+cereal") + depends_on( + "boost@1.7: +context +fiber +coroutine +regex +system \ + +filesystem +serialization +pic +math", + when="+boost", + ) + depends_on("mpi", when="+mpiio") + depends_on("hdf5@1.14.0", when="+vfd") + depends_on("libzmq", "+zmq") + depends_on("adios2", when="+adios") + + # Compress variant + variant("compress", default=False, description="Build with compression support") + with when("+compress"): + depends_on("lzo") + depends_on("bzip2") + depends_on("zstd") + depends_on("lz4") + depends_on("zlib") + depends_on("xz") + depends_on("brotli") + depends_on("snappy") + depends_on("c-blosc2") + + # Encryption variant + variant("encrypt", default=False, description="Build with encryption support") + depends_on("openssl", when="+encrypt") + + def cmake_args(self): + return [ + self.define_from_variant("HERMES_ENABLE_VFD", "vfd"), + self.define_from_variant("HERMES_ENABLE_COMPRESSION", "compress"), + self.define_from_variant("HERMES_ENABLE_ENCRYPTION", "encrypt"), + self.define_from_variant("HERMES_RPC_THALLIUM", "mochi"), + self.define_from_variant("HERMES_ENABLE_ZMQ_TESTS", "zmq"), + ] diff --git a/var/spack/repos/builtin/packages/hh-suite/package.py b/var/spack/repos/builtin/packages/hh-suite/package.py index 4735ddd9f42e72..66496a89811bb2 100644 --- a/var/spack/repos/builtin/packages/hh-suite/package.py +++ b/var/spack/repos/builtin/packages/hh-suite/package.py @@ -37,7 +37,7 @@ class HhSuite(CMakePackage): def build_args(self, spec, prefix): args = [] - if "+mpi" in self.spec: + if self.spec.satisfies("+mpi"): args.append("-DCHECK_MPI=1") else: args.append("-DCHECK_MPI=0") diff --git a/var/spack/repos/builtin/packages/highfive/package.py b/var/spack/repos/builtin/packages/highfive/package.py index b78e98622ecc3f..4cba54adaa2dcd 100644 --- a/var/spack/repos/builtin/packages/highfive/package.py +++ b/var/spack/repos/builtin/packages/highfive/package.py @@ -58,8 +58,8 @@ class Highfive(CMakePackage): def cmake_args(self): args = [ - "-DUSE_BOOST:Bool={0}".format("+boost" in self.spec), - "-DHIGHFIVE_PARALLEL_HDF5:Bool={0}".format("+mpi" in self.spec), + "-DUSE_BOOST:Bool={0}".format(self.spec.satisfies("+boost")), + "-DHIGHFIVE_PARALLEL_HDF5:Bool={0}".format(self.spec.satisfies("+mpi")), "-DHIGHFIVE_UNIT_TESTS:Bool=false", "-DHIGHFIVE_EXAMPLES:Bool=false", "-DHDF5_ROOT:String={0}".format(self.spec["hdf5"].prefix), diff --git a/var/spack/repos/builtin/packages/highway/package.py b/var/spack/repos/builtin/packages/highway/package.py index c944a6776426af..d36d9b6080b4ee 100644 --- a/var/spack/repos/builtin/packages/highway/package.py +++ b/var/spack/repos/builtin/packages/highway/package.py @@ -36,7 +36,6 @@ class Highway(CMakePackage): depends_on("googletest", type="test") def cmake_args(self): - spec = self.spec define = self.define from_variant = self.define_from_variant @@ -46,9 +45,6 @@ def cmake_args(self): define("HWY_ENABLE_TESTS", self.run_tests), define("BUILD_TESTING", self.run_tests), define("HWY_SYSTEM_GTEST", self.run_tests), - define( - "HWY_CMAKE_ARM7", spec.satisfies("%gcc@:6.1.0") or spec.satisfies("%clang@:16") - ), ] return args diff --git a/var/spack/repos/builtin/packages/hiop/package.py b/var/spack/repos/builtin/packages/hiop/package.py index 2495796d9be73f..1b29d8b3acdcbb 100644 --- a/var/spack/repos/builtin/packages/hiop/package.py +++ b/var/spack/repos/builtin/packages/hiop/package.py @@ -22,6 +22,9 @@ class Hiop(CMakePackage, CudaPackage, ROCmPackage): license("BSD-3-Clause") # Most recent tagged snapshot is the preferred version when profiling. + version( + "1.1.0", tag="v1.1.0", commit="7ccfa86a71fdb670ae690199ac676f3c1365799a", submodules=True + ) version( "1.0.3", tag="v1.0.3", commit="6161396d9b562c39e7e6fe686ab46a2ec7927482", submodules=True ) @@ -178,7 +181,7 @@ def cmake_args(self): args = [] spec = self.spec - use_gpu = "+cuda" in spec or "+rocm" in spec + use_gpu = spec.satisfies("+cuda") or spec.satisfies("+rocm") if use_gpu: args.extend( @@ -218,7 +221,7 @@ def cmake_args(self): # args.append( # self.define('HIOP_CTEST_LAUNCH_COMMAND', 'srun -t 10:00')) - if "+mpi" in spec: + if spec.satisfies("+mpi"): args.extend( [ self.define("MPI_HOME", spec["mpi"].prefix), @@ -237,7 +240,7 @@ def cmake_args(self): # self.define('MPI_Fortran_LINK_FLAGS', # '-L/path/to/libfabric/lib64/ -lfabric')) - if "+cuda" in spec: + if spec.satisfies("+cuda"): cuda_arch_list = spec.variants["cuda_arch"].value if cuda_arch_list[0] != "none": args.append(self.define("CMAKE_CUDA_ARCHITECTURES", cuda_arch_list)) @@ -250,7 +253,7 @@ def cmake_args(self): # args.append( # self.define('HIP_CLANG_INCLUDE_PATH', # '/opt/rocm-X.Y.Z/llvm/lib/clang/14.0.0/include/')) - if "+rocm" in spec: + if spec.satisfies("+rocm"): args.append(self.define("CMAKE_CXX_COMPILER", spec["hip"].hipcc)) rocm_arch_list = spec.variants["amdgpu_target"].value @@ -258,7 +261,7 @@ def cmake_args(self): args.append(self.define("GPU_TARGETS", rocm_arch_list)) args.append(self.define("AMDGPU_TARGETS", rocm_arch_list)) - if "+kron" in spec: + if spec.satisfies("+kron"): args.append(self.define("HIOP_UMFPACK_DIR", spec["suite-sparse"].prefix)) # Unconditionally disable strumpack, even when +sparse. This may be @@ -266,7 +269,7 @@ def cmake_args(self): # fully supported in spack at the moment. args.append(self.define("HIOP_USE_STRUMPACK", False)) - if "+sparse" in spec: + if spec.satisfies("+sparse"): args.append(self.define("HIOP_COINHSL_DIR", spec["coinhsl"].prefix)) return args diff --git a/var/spack/repos/builtin/packages/hip-tensor/package.py b/var/spack/repos/builtin/packages/hip-tensor/package.py index 9d0c887726647c..697a73f78f075c 100644 --- a/var/spack/repos/builtin/packages/hip-tensor/package.py +++ b/var/spack/repos/builtin/packages/hip-tensor/package.py @@ -17,6 +17,8 @@ class HipTensor(CMakePackage, ROCmPackage): maintainers("srekolam", "afzpatel") version("master", branch="master") + version("6.2.1", sha256="592dbe73f5f95ba512f7fbe9975a68dbea85846be74da15344d74952b286f243") + version("6.2.0", sha256="adb7459416864fb2664064f5bea5fb669839247b702209a6415b396813626b31") version("6.1.2", sha256="ac0e07a3019bcce4a0a98aafa4922d5fc9e953bed07084abef5306c851717783") version("6.1.1", sha256="09bcdbf6b1d20dc4d75932abd335a9a534b16a8343858121daa5813a38f5ad3a") version("6.1.0", sha256="9cc43b1b3394383f22f30e194d8753ca6ff1887c83ec1de5823cb2e94976eeed") @@ -28,12 +30,22 @@ class HipTensor(CMakePackage, ROCmPackage): depends_on("cxx", type="build") # generated variant("asan", default=False, description="Build with address-sanitizer enabled or disabled") - - for ver in ["5.7.0", "5.7.1", "6.0.0", "6.0.2", "6.1.0", "6.1.1", "6.1.2", "master"]: + for ver in [ + "5.7.0", + "5.7.1", + "6.0.0", + "6.0.2", + "6.1.0", + "6.1.1", + "6.1.2", + "6.2.0", + "6.2.1", + "master", + ]: depends_on(f"composable-kernel@{ver}", when=f"@{ver}") depends_on(f"rocm-cmake@{ver}", when=f"@{ver}") - for ver in ["6.1.0", "6.1.1", "6.1.2"]: + for ver in ["6.1.0", "6.1.1", "6.1.2", "6.2.0", "6.2.1"]: depends_on(f"hipcc@{ver}", when=f"@{ver}") def setup_build_environment(self, env): diff --git a/var/spack/repos/builtin/packages/hip/package.py b/var/spack/repos/builtin/packages/hip/package.py index 70f46a5d730eca..f0235f1aea6deb 100644 --- a/var/spack/repos/builtin/packages/hip/package.py +++ b/var/spack/repos/builtin/packages/hip/package.py @@ -27,6 +27,8 @@ class Hip(CMakePackage): license("MIT") version("master", branch="master") + version("6.2.1", sha256="a8b86666a59867cae67409c4a45e0b8f29a6328c9739e6512c2b5612376f30cf") + version("6.2.0", sha256="7ca261eba79793427674bf2372c92ac5483cc0fac5278f8ad611de396fad8bee") version("6.1.2", sha256="9ba5f70a553b48b2cea25c7e16b97ad49320750c0152763b173b63b9f151e783") version("6.1.1", sha256="09e8013b8071fca2cf914758001bbd1dccaa237e798e945970e4356cb9b90050") version("6.1.0", sha256="6fd57910a16d0b54df822807e67b6207146233a2de5a46c6a05b940a21e2c4d7") @@ -84,6 +86,8 @@ class Hip(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"hsakmt-roct@{ver}", when=f"@{ver}") depends_on(f"hsa-rocr-dev@{ver}", when=f"@{ver}") @@ -106,6 +110,8 @@ class Hip(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"hipify-clang@{ver}", when=f"@{ver}") @@ -121,15 +127,21 @@ class Hip(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"rocm-core@{ver}", when=f"@{ver}") + # hipcc likes to add `-lnuma` by default :( # ref https://github.com/ROCm/HIP/pull/2202 depends_on("numactl", when="@3.7.0:") - for ver in ["6.0.0", "6.0.2", "6.1.0", "6.1.1", "6.1.2"]: + for ver in ["6.0.0", "6.0.2", "6.1.0", "6.1.1", "6.1.2", "6.2.0", "6.2.1"]: depends_on(f"hipcc@{ver}", when=f"@{ver}") + for ver in ["6.2.0", "6.2.1"]: + depends_on(f"rocprofiler-register@{ver}", when=f"@{ver}") + # roc-obj-ls requirements depends_on("perl-file-which") depends_on("perl-uri-encode") @@ -189,6 +201,8 @@ class Hip(CMakePackage): ) # Add hip-clr sources thru the below for d_version, d_shasum in [ + ("6.2.1", "e9cff3a8663defdbda833d49c9e7160171eca14dc285ffe4061378607d6c890d"), + ("6.2.0", "620e4c6a7f05651cc7a170bc4700fef8cae002420307a667c638b981d00b25e8"), ("6.1.2", "1a1e21640035d957991559723cd093f0c7e202874423667d2ba0c7662b01fea4"), ("6.1.1", "2db02f335c9d6fa69befcf7c56278e5cecfe3db0b457eaaa41206c2585ef8256"), ("6.1.0", "49b23eef621f4e8e528bb4de8478a17436f42053a2f7fde21ff221aa683205c7"), @@ -242,6 +256,8 @@ class Hip(CMakePackage): ) # Add hipother sources thru the below for d_version, d_shasum in [ + ("6.2.1", "5d99e498c1fece44a421574282fc89c6a2499979eaa9f850e5caa7fa3a8938b8"), + ("6.2.0", "1f854b0c07d71b10450080e3bbffe47adaf10a9745a9212797d991756a100174"), ("6.1.2", "2740d1e3dcf1f2d07d2a8db6acf4c972941ae392172b83fd8ddcfe8706a40d0b"), ("6.1.1", "8b975623c8ed1db53feea2cfd5d29f2a615e890aee1157d0d17adeb97200643f"), ("6.1.0", "43a48ccc82f705a15852392ee7419e648d913716bfc04063a53d2d17979b1b46"), @@ -260,6 +276,8 @@ class Hip(CMakePackage): # Add hiptests sources thru the below for d_version, d_shasum in [ + ("6.2.1", "90fcf0169889533b882d289f9cb8a7baf9bd46a3ce36752b915083931dc839f1"), + ("6.2.0", "314837dbac78be71844ceb959476470c484fdcd4fb622ff8de9277783e0fcf1c"), ("6.1.2", "5b14e4a30d8d8fb56c43e262009646ba9188eac1c8ff882d9a606a4bec69b56b"), ("6.1.1", "10c96ee72adf4580056292ab17cfd858a2fd7bc07abeb41c6780bd147b47f7af"), ("6.1.0", "cf3a6a7c43116032d933cc3bc88bfc4b17a4ee1513c978e751755ca11a5ed381"), @@ -457,6 +475,19 @@ def set_variables(self, env): env.set("HIP_PATH", self.spec.prefix) env.set("HIP_PLATFORM", "nvidia") + # Set up hipcc/hip-clang to use the specific GCC toolchain that is + # being used to compile. This is only important for external ROCm + # installations, which may otherwise pick up the wrong GCC toolchain. + if self.spec.external and self.spec.satisfies("%gcc"): + # This is picked up by hipcc. + env.append_path( + "HIPCC_COMPILE_FLAGS_APPEND", + f"--gcc-toolchain={self.compiler.prefix}", + separator=" ", + ) + # This is picked up by CMake when using HIP as a CMake language. + env.append_path("HIPFLAGS", f"--gcc-toolchain={self.compiler.prefix}", separator=" ") + def setup_build_environment(self, env): self.set_variables(env) @@ -568,19 +599,19 @@ def cmake_args(self): args.append(self.define("HIP_COMMON_DIR", self.stage.source_path)) args.append(self.define("HIP_CATCH_TEST", "OFF")) - if "@:5.5" in self.spec: + if self.spec.satisfies("@:5.5"): args.append(self.define("ROCCLR_PATH", self.stage.source_path + "rocclr")) args.append(self.define("AMD_OPENCL_PATH", self.stage.source_path + "opencl")) - if "@5.3.0:" in self.spec: + if self.spec.satisfies("@5.3.0:"): args.append("-DCMAKE_INSTALL_LIBDIR=lib") - if "@5.6.0:" in self.spec: + if self.spec.satisfies("@5.6.0:"): args.append(self.define("ROCCLR_PATH", self.stage.source_path + "/clr/rocclr")) args.append(self.define("AMD_OPENCL_PATH", self.stage.source_path + "/clr/opencl")) args.append(self.define("CLR_BUILD_HIP", True)), args.append(self.define("CLR_BUILD_OCL", False)), - if "@5.6:5.7" in self.spec: + if self.spec.satisfies("@5.6:5.7"): args.append(self.define("HIPCC_BIN_DIR", self.stage.source_path + "/hipcc/bin")), - if "@6.0:" in self.spec: + if self.spec.satisfies("@6.0:"): args.append(self.define("HIPCC_BIN_DIR", self.spec["hipcc"].prefix.bin)), return args @@ -602,7 +633,7 @@ def cache_test_sources(self): cache_extra_test_sources(self, [self.test_src_dir]) def test_samples(self): - # configure, build and run all hip samples + """build and run all hip samples""" if self.spec.satisfies("@5.1:5.5"): test_dir = join_path(self.test_suite.current_test_cache_dir, self.test_src_dir_old) elif self.spec.satisfies("@5.6:"): diff --git a/var/spack/repos/builtin/packages/hipblas/package.py b/var/spack/repos/builtin/packages/hipblas/package.py index 6563a804a69e24..1e928b27d5f5c2 100644 --- a/var/spack/repos/builtin/packages/hipblas/package.py +++ b/var/spack/repos/builtin/packages/hipblas/package.py @@ -24,6 +24,8 @@ class Hipblas(CMakePackage, CudaPackage, ROCmPackage): version("develop", branch="develop") version("master", branch="master") + version("6.2.1", sha256="b770b6ebd27d5c12ad01827195e996469bfc826e8a2531831df475fc8d7f6b2e") + version("6.2.0", sha256="33688a4d929b13e1fd800aff7e0833a9f7abf3913754b6b15995595e0d434e94") version("6.1.2", sha256="73699892855775a67f48c38beae78169a516078c17f1ed5d67c80abe5d308502") version("6.1.1", sha256="087ea82dff13c8162bf93343b174b18f1d58681711bce4fb7c8dc7212020c099") version("6.1.0", sha256="5f8193c4ef0508967e608a8adf86d63066a984c5803a4d05dd617021d6298091") @@ -75,7 +77,7 @@ class Hipblas(CMakePackage, CudaPackage, ROCmPackage): depends_on("rocm-cmake@5.2.0:", type="build", when="@5.2.0:5.7") depends_on("rocm-cmake@4.5.0:", type="build") - for ver in ["6.0.0", "6.0.2", "6.1.0", "6.1.1", "6.1.2"]: + for ver in ["6.0.0", "6.0.2", "6.1.0", "6.1.1", "6.1.2", "6.2.0"]: depends_on(f"rocm-cmake@{ver}", when=f"+rocm @{ver}") depends_on(f"rocm-openmp-extras@{ver}", type="test", when=f"+rocm @{ver}") @@ -97,6 +99,8 @@ class Hipblas(CMakePackage, CudaPackage, ROCmPackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", "master", "develop", ]: diff --git a/var/spack/repos/builtin/packages/hipblaslt/package.py b/var/spack/repos/builtin/packages/hipblaslt/package.py index d7a9a5c141b289..c70d6a001bbfe6 100644 --- a/var/spack/repos/builtin/packages/hipblaslt/package.py +++ b/var/spack/repos/builtin/packages/hipblaslt/package.py @@ -17,6 +17,8 @@ class Hipblaslt(CMakePackage): maintainers("srekolam", "afzpatel", "renjithravindrankannath") license("MIT") + version("6.2.1", sha256="9b062b1d6d945349c31828030c8c1d99fe57d14a1837196ff9aa67bf10ef43f1") + version("6.2.0", sha256="aec9edc75ae4438aa712192c784e2bed683d2839b502b6aadb18f6012306749b") version("6.1.2", sha256="fcfe950f7b87c421565abe090b2de6f463afc1549841002f105ecca7bbbf59e5") version("6.1.1", sha256="1e21730ade59b5e32432fa0981383f689a380b1ffc92fe950822722da9521a72") version("6.1.0", sha256="90fc2f2c9e11c87e0529e824e4b0561dbc850f8ffa21be6932ae63cbaa27cdf0") @@ -35,7 +37,7 @@ class Hipblaslt(CMakePackage): ) variant("asan", default=False, description="Build with address-sanitizer enabled or disabled") - for ver in ["6.0.0", "6.0.2", "6.1.0", "6.1.1", "6.1.2"]: + for ver in ["6.0.0", "6.0.2", "6.1.0", "6.1.1", "6.1.2", "6.2.0", "6.2.1"]: depends_on(f"hip@{ver}", when=f"@{ver}") depends_on(f"hipblas@{ver}", when=f"@{ver}") depends_on(f"rocm-openmp-extras@{ver}", type="test", when=f"@{ver}") @@ -51,7 +53,7 @@ class Hipblaslt(CMakePackage): patch("001_Set_LLVM_Paths_And_Add_Includes.patch", when="@6.0") # Below patch sets the proper path for clang++ and clang-offload-blunder. # Also adds hipblas and msgpack include directories for 6.1.0 release. - patch("0001-Set-LLVM_Path-Add-Hiblas-Include-to-CmakeLists-6.1.Patch", when="@6.1") + patch("0001-Set-LLVM_Path-Add-Hiblas-Include-to-CmakeLists-6.1.Patch", when="@6.1:6.2") def setup_build_environment(self, env): env.set("CXX", self.spec["hip"].hipcc) diff --git a/var/spack/repos/builtin/packages/hipcc/0001-Update-the-ROCMINFO-HIPCLANG-PATHS-inside-hipcc-6.2.0.patch b/var/spack/repos/builtin/packages/hipcc/0001-Update-the-ROCMINFO-HIPCLANG-PATHS-inside-hipcc-6.2.0.patch new file mode 100644 index 00000000000000..22b386136b97c5 --- /dev/null +++ b/var/spack/repos/builtin/packages/hipcc/0001-Update-the-ROCMINFO-HIPCLANG-PATHS-inside-hipcc-6.2.0.patch @@ -0,0 +1,57 @@ +From 8d2e14328cd99bbad2eaa498c207cf41f688fc30 Mon Sep 17 00:00:00 2001 +From: sreenivasa murthy kolam +Date: Mon, 23 Sep 2024 10:34:16 +0000 +Subject: [PATCH] Use the rocminfo_path and hipclang_path inside the hipcc.pl + and hipbin_amd.h + +--- + amd/hipcc/bin/hipcc.pl | 9 ++++++--- + amd/hipcc/src/hipBin_amd.h | 2 +- + 2 files changed, 7 insertions(+), 4 deletions(-) + +diff --git a/amd/hipcc/bin/hipcc.pl b/amd/hipcc/bin/hipcc.pl +index 27839e5..fcb8d4e 100755 +--- a/amd/hipcc/bin/hipcc.pl ++++ b/amd/hipcc/bin/hipcc.pl +@@ -160,11 +160,13 @@ if ($HIP_PLATFORM eq "amd") { + if($isWindows) { + $execExtension = ".exe"; + } +- $HIPCC=get_normalized_path("$HIP_CLANG_PATH/clang++" . $execExtension); ++ # hip_clang_path is set inside the hip recipe ++ $HIP_CLANG_PATH= $ENV{'HIP_CLANG_PATH'}; ++ $HIPCC="${HIP_CLANG_PATH}/clang++" . $execExtension; + + # If $HIPCC clang++ is not compiled, use clang instead + if ( ! -e $HIPCC ) { +- $HIPCC=get_normalized_path("$HIP_CLANG_PATH/clang" . $execExtension); ++ $HIPCC="${HIP_CLANG_PATH}/clang" . $execExtension; + $HIPLDFLAGS = "--driver-mode=g++"; + } + # to avoid using dk linker or MSVC linker +@@ -480,7 +482,8 @@ if($HIP_PLATFORM eq "amd"){ + $targetsStr = $ENV{HCC_AMDGPU_TARGET}; + } elsif (not $isWindows) { + # Else try using rocm_agent_enumerator +- $ROCM_AGENT_ENUM = "${ROCM_PATH}/bin/rocm_agent_enumerator"; ++ $ROCMINFO_PATH = $ENV{'ROCMINFO_PATH'} // $ROCMINFO_PATH; ++ $ROCM_AGENT_ENUM = "${ROCMINFO_PATH}/bin/rocm_agent_enumerator"; + $targetsStr = `${ROCM_AGENT_ENUM} -t GPU`; + $targetsStr =~ s/\n/,/g; + } +diff --git a/amd/hipcc/src/hipBin_amd.h b/amd/hipcc/src/hipBin_amd.h +index 57d0098..d53d081 100644 +--- a/amd/hipcc/src/hipBin_amd.h ++++ b/amd/hipcc/src/hipBin_amd.h +@@ -752,7 +752,7 @@ void HipBinAmd::executeHipCCCmd(vector argv) { + } else if (os != windows) { + // Else try using rocm_agent_enumerator + string ROCM_AGENT_ENUM; +- ROCM_AGENT_ENUM = roccmPath + "/bin/rocm_agent_enumerator"; ++ ROCM_AGENT_ENUM = string(getenv("ROCMINFO_PATH")) + "/bin/rocm_agent_enumerator"; + targetsStr = ROCM_AGENT_ENUM +" -t GPU"; + SystemCmdOut sysOut = hipBinUtilPtr_->exec(targetsStr.c_str()); + regex toReplace("\n+"); +-- +2.39.3 + diff --git a/var/spack/repos/builtin/packages/hipcc/package.py b/var/spack/repos/builtin/packages/hipcc/package.py index d94ce19e0c57d6..d793d39af6a413 100644 --- a/var/spack/repos/builtin/packages/hipcc/package.py +++ b/var/spack/repos/builtin/packages/hipcc/package.py @@ -24,6 +24,8 @@ def url_for_version(self, version): maintainers("srekolam", "renjithravindrankannath", "afzpatel") license("MIT") + version("6.2.1", sha256="4840f109d8f267c28597e936c869c358de56b8ad6c3ed4881387cf531846e5a7") + version("6.2.0", sha256="12ce17dc920ec6dac0c5484159b3eec00276e4a5b301ab1250488db3b2852200") version("6.1.2", sha256="300e9d6a137dcd91b18d5809a316fddb615e0e7f982dc7ef1bb56876dff6e097") version("6.1.1", sha256="f1a67efb49f76a9b262e9735d3f75ad21e3bd6a05338c9b15c01e6c625c4460d") version("6.1.0", sha256="6bd9912441de6caf6b26d1323e1c899ecd14ff2431874a2f5883d3bc5212db34") @@ -39,7 +41,8 @@ def url_for_version(self, version): depends_on("numactl") patch("0014-remove-compiler-rt-linkage-for-host.6.0.patch", when="@6.0") - patch("0014-remove-compiler-rt-linkage-for-host.6.1.patch", when="@6.1:") + patch("0014-remove-compiler-rt-linkage-for-host.6.1.patch", when="@6.1") + patch("0001-Update-the-ROCMINFO-HIPCLANG-PATHS-inside-hipcc-6.2.0.patch", when="@6.2:") @property def root_cmakelists_dir(self): diff --git a/var/spack/repos/builtin/packages/hipcub/package.py b/var/spack/repos/builtin/packages/hipcub/package.py index 686645f8425d8e..5a85b8eb581387 100644 --- a/var/spack/repos/builtin/packages/hipcub/package.py +++ b/var/spack/repos/builtin/packages/hipcub/package.py @@ -17,6 +17,8 @@ class Hipcub(CMakePackage, CudaPackage, ROCmPackage): license("BSD-3-Clause") maintainers("srekolam", "renjithravindrankannath") + version("6.2.1", sha256="e0203e72afac4da19cb1d62896fff404ec44517141b420bd38f6e962e52ef6fd") + version("6.2.0", sha256="8dda8b77740e722fd4cf7223476313fc873bad75d50e6cb86ff284a91d76752d") version("6.1.2", sha256="830a0f3231e07fcc6cd6261c4e1af2d7d0ac4862c606ecdc80c2635557ca3d9f") version("6.1.1", sha256="967716d67e4270c599a60b770d543ea9148948edb907a0fa4d8be3a1785c2058") version("6.1.0", sha256="39ac03053ecf35f1faf212e5b197b03c0104b74b0833f7cce5cf625c273ba71c") @@ -74,6 +76,8 @@ class Hipcub(CMakePackage, CudaPackage, ROCmPackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"rocprim@{ver}", when=f"+rocm @{ver}") depends_on(f"rocm-cmake@{ver}:", type="build", when=f"@{ver}") diff --git a/var/spack/repos/builtin/packages/hipfft/package.py b/var/spack/repos/builtin/packages/hipfft/package.py index bb9024dd9e78db..e70b3112032c79 100644 --- a/var/spack/repos/builtin/packages/hipfft/package.py +++ b/var/spack/repos/builtin/packages/hipfft/package.py @@ -24,6 +24,8 @@ class Hipfft(CMakePackage, CudaPackage, ROCmPackage): license("MIT") version("master", branch="master") + version("6.2.1", sha256="5f668fa8b5ed10d47d164d887699d3c14d900d78f6a31bf953f8fbbc08bc5fd1") + version("6.2.0", sha256="8d19aebb1bbfea1f235ca08d34393ce39bea35dc9cbfa72a3cf7cdf1c56410e7") version("6.1.2", sha256="6753e45d9c671d58e68bed2b0c1bfcd40fad9d690dba3fe6011e67e51dbe3cc6") version("6.1.1", sha256="df84e488098d457a7411f6b459537fa5c5ee160027efc3a9a076980bbe57c4d3") version("6.1.0", sha256="1a9cf598a932192f7f12b8987d96477f09186f9a95c5a28742f9caeb81640c95") @@ -81,6 +83,9 @@ class Hipfft(CMakePackage, CudaPackage, ROCmPackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", + "master", ]: depends_on(f"rocm-cmake@{ver}:", type="build", when=f"@{ver}") depends_on(f"rocfft@{ver}", when=f"+rocm @{ver}") diff --git a/var/spack/repos/builtin/packages/hipfort/package.py b/var/spack/repos/builtin/packages/hipfort/package.py index a4823db0e24442..5158908b35e731 100644 --- a/var/spack/repos/builtin/packages/hipfort/package.py +++ b/var/spack/repos/builtin/packages/hipfort/package.py @@ -17,6 +17,8 @@ class Hipfort(CMakePackage): license("MIT") maintainers("cgmb", "srekolam", "renjithravindrankannath") + version("6.2.1", sha256="5258f2dd63aeebe29ce566e654c47b8e2e1f5eb8ca3da92af09c54517b259f32") + version("6.2.0", sha256="7f6db61a0ac7771e5c4604a6113b36736f6c7f05cabd7e1df8e832c98b87311d") version("6.1.2", sha256="f60d07fa3e5b09246c8908b2876addf175a91e91c8b0fac85b000f88b6743c7c") version("6.1.1", sha256="646f7077399db7a70d7102fda8307d0a11039f616399a4a06a64fd824336419f") version("6.1.0", sha256="70d3ccc9f3536f62686e73934f5972ed011c4df7654ed1f8e6d2d42c4289f47e") @@ -59,6 +61,8 @@ class Hipfort(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"hip@{ver}", type="build", when=f"@{ver}") diff --git a/var/spack/repos/builtin/packages/hipify-clang/0001-use-source-permission-for-hipify-perl.patch b/var/spack/repos/builtin/packages/hipify-clang/0001-use-source-permission-for-hipify-perl.patch new file mode 100644 index 00000000000000..8d9290e40c8205 --- /dev/null +++ b/var/spack/repos/builtin/packages/hipify-clang/0001-use-source-permission-for-hipify-perl.patch @@ -0,0 +1,12 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 0d105e2..0c1bbb5 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -177,6 +177,7 @@ if (NOT HIPIFY_CLANG_TESTS_ONLY) + install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin + DESTINATION . ++ USE_SOURCE_PERMISSIONS + PATTERN "hipify-perl" + PATTERN "*.sh" + PATTERN "findcode.sh" EXCLUDE diff --git a/var/spack/repos/builtin/packages/hipify-clang/package.py b/var/spack/repos/builtin/packages/hipify-clang/package.py index df63043cca3882..44c593938cbbbf 100644 --- a/var/spack/repos/builtin/packages/hipify-clang/package.py +++ b/var/spack/repos/builtin/packages/hipify-clang/package.py @@ -20,6 +20,8 @@ class HipifyClang(CMakePackage): license("MIT") version("master", branch="master") + version("6.2.1", sha256="db5680d677222596cf9edfb84ae96b37db829a40a2e0243d26ff24a16e03ff74") + version("6.2.0", sha256="11bfbde7c40e5cd5de02a47ec30dc6df4b233a12126bf7ee449432a30a3e6e1e") version("6.1.2", sha256="7cc1e3fd7690a3e1d99cd07f2bd62ee73682cceeb4a46918226fc70f8092eb68") version("6.1.1", sha256="240b83ccbe1b6514a6af6c2261e306948ce6c2b1c4d1056e830bbaebddeabd82") version("6.1.0", sha256="dc61b476081750130c62c7540fce49ee3a45a2b74e185d20049382574c1842d1") @@ -46,7 +48,8 @@ class HipifyClang(CMakePackage): patch("0001-install-hipify-clang-in-bin-dir-and-llvm-clangs-head.patch", when="@5.1.0:5.5") patch("0002-install-hipify-clang-in-bin-dir-and-llvm-clangs-head.patch", when="@5.6:6.0") - patch("0003-install-hipify-clang-in-bin-dir-and-llvm-clangs-head.patch", when="@6.1:") + patch("0003-install-hipify-clang-in-bin-dir-and-llvm-clangs-head.patch", when="@6.1") + patch("0001-use-source-permission-for-hipify-perl.patch", when="@6.2") depends_on("cmake@3.5:", type="build") for ver in [ @@ -65,6 +68,8 @@ class HipifyClang(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", "master", ]: depends_on(f"llvm-amdgpu@{ver}", when=f"@{ver}") @@ -81,6 +86,8 @@ class HipifyClang(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"rocm-core@{ver}", when=f"@{ver}") diff --git a/var/spack/repos/builtin/packages/hiprand/package.py b/var/spack/repos/builtin/packages/hiprand/package.py index 3a639126545b9c..61b1702680ece5 100644 --- a/var/spack/repos/builtin/packages/hiprand/package.py +++ b/var/spack/repos/builtin/packages/hiprand/package.py @@ -24,6 +24,8 @@ class Hiprand(CMakePackage, CudaPackage, ROCmPackage): version("develop", branch="develop") version("master", branch="master") + version("6.2.1", sha256="0d4585b8adbc299f3fdc2c74bb20ffd4285027b861a759c3e62ce564589465da") + version("6.2.0", sha256="daaf32506eaaf3c3b715ed631387c27992cfe0d938353a88ad6acedc735eb54b") version("6.1.2", sha256="f0f129811c144dd711e967305c7af283cefb94bfdbcd2a11296b92a9e966be2c") version("6.1.1", sha256="dde1526fb6cde17b18bc9ee6daa719056fc468dfbda5801b9a61260daf2b4498") version("6.1.0", sha256="f9d71af23092f8faa888d2c14713ee4d4d350454818ca9331d422c81c2587c1f") @@ -93,6 +95,8 @@ class Hiprand(CMakePackage, CudaPackage, ROCmPackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", "master", "develop", ]: diff --git a/var/spack/repos/builtin/packages/hipsolver/package.py b/var/spack/repos/builtin/packages/hipsolver/package.py index 1b53a6b04cbb70..82c35643e70c44 100644 --- a/var/spack/repos/builtin/packages/hipsolver/package.py +++ b/var/spack/repos/builtin/packages/hipsolver/package.py @@ -29,6 +29,7 @@ class Hipsolver(CMakePackage, CudaPackage, ROCmPackage): version("develop", branch="develop") version("master", branch="master") + version("6.2.0", sha256="637577a9cc38e4865894dbcd7eb35050e3de5d45e6db03472e836b318602a84d") version("6.1.2", sha256="406a8e5b82daae2fc03e0a738b5a054ade01bb41785cee4afb9e21c7ec91d492") version("6.1.1", sha256="01d4553458f417824807c069cacfc65d23f6cac79536158473b4356986c8fafd") version("6.1.0", sha256="3cb89ca486cdbdfcb1a07c35ee65f60219ef7bc62a5b0f94ca1a3206a0106495") @@ -99,6 +100,7 @@ class Hipsolver(CMakePackage, CudaPackage, ROCmPackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", "master", "develop", ]: @@ -137,6 +139,7 @@ def setup_build_environment(self, env): def cmake_args(self): args = [ self.define("BUILD_CLIENTS_SAMPLES", "OFF"), + self.define("BUILD_FORTRAN_BINDINGS", "OFF"), self.define("BUILD_CLIENTS_TESTS", self.run_tests), self.define("SUITE_SPARSE_PATH", self.spec["suite-sparse"].prefix), self.define("ROCBLAS_PATH", self.spec["rocblas"].prefix), diff --git a/var/spack/repos/builtin/packages/hipsparse/package.py b/var/spack/repos/builtin/packages/hipsparse/package.py index 57db492ea414db..65a9a9a18f192e 100644 --- a/var/spack/repos/builtin/packages/hipsparse/package.py +++ b/var/spack/repos/builtin/packages/hipsparse/package.py @@ -21,6 +21,8 @@ class Hipsparse(CMakePackage, CudaPackage, ROCmPackage): libraries = ["libhipsparse"] license("MIT") + version("6.2.1", sha256="5a3241c857f705b1e5c64b3f5163575726e64a8d19f3957f7326622fda277710") + version("6.2.0", sha256="e51b9871d764763519c14be2ec52c1e1ae3959b439afb4be6518b9f9a6f0ebaf") version("6.1.2", sha256="dd44f9b6000b3b0ac0fa238037a80f79d6745a689d4a6755f2d595643be1ef6d") version("6.1.1", sha256="307cff012f0465942dd6666cb00ae60c35941699677c4b26b08e4832bc499059") version("6.1.0", sha256="1d9277a11f71474ea4a9f8419a7a2c37170a86969584e5724e385ec74241e565") @@ -80,6 +82,8 @@ class Hipsparse(CMakePackage, CudaPackage, ROCmPackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"rocm-cmake@{ver}:", type="build", when=f"@{ver}") depends_on(f"rocsparse@{ver}", when=f"+rocm @{ver}") diff --git a/var/spack/repos/builtin/packages/hipsparselt/0001-update-llvm-path-add-hipsparse-include-dir-for-spack-6.2.patch b/var/spack/repos/builtin/packages/hipsparselt/0001-update-llvm-path-add-hipsparse-include-dir-for-spack-6.2.patch new file mode 100644 index 00000000000000..143b0e592610ef --- /dev/null +++ b/var/spack/repos/builtin/packages/hipsparselt/0001-update-llvm-path-add-hipsparse-include-dir-for-spack-6.2.patch @@ -0,0 +1,77 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index e10585c..a29bc63 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -185,7 +185,7 @@ else() + set( tensile_fork "ROCmSoftwarePlatform" CACHE STRING "Tensile fork to use" ) + file (STRINGS "tensilelite_tag.txt" read_tensile_tag) + set( tensile_tag ${read_tensile_tag} CACHE STRING "Tensile tag to download" ) +- virtualenv_install("git+https://github.com/${tensile_fork}/hipBLASLt.git@${tensile_tag}#subdirectory=tensilelite") ++ virtualenv_install("git+https://github.com/ROCm/hipBLASLt.git@modify-tensilelite-spack-6.2#subdirectory=tensilelite") + + message (STATUS "using GIT Tensile fork=${tensile_fork} from branch=${tensile_tag}") + endif() +diff --git a/clients/gtest/CMakeLists.txt b/clients/gtest/CMakeLists.txt +index 2057db0..6085133 100644 +--- a/clients/gtest/CMakeLists.txt ++++ b/clients/gtest/CMakeLists.txt +@@ -53,6 +53,7 @@ target_include_directories( hipsparselt-test + $ + $ # may be blank if not used + $ ++ $ + ) + message("BLIS_INCLUDE_DIR=" ${BLIS_INCLUDE_DIR}) + target_link_libraries( hipsparselt-test PRIVATE ${BLAS_LIBRARY} ${GTEST_BOTH_LIBRARIES} roc::hipsparselt ) +diff --git a/clients/samples/CMakeLists.txt b/clients/samples/CMakeLists.txt +index 6b303d5..c6d608c 100644 +--- a/clients/samples/CMakeLists.txt ++++ b/clients/samples/CMakeLists.txt +@@ -50,6 +50,11 @@ foreach( exe ${sample_list_all} ) + $ + ) + ++ target_include_directories( ${exe} ++ SYSTEM PRIVATE ++ $ ++ ) ++ + if( CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + # GCC or hip-clang needs specific flags to turn on f16c intrinsics + target_compile_options( ${exe} PRIVATE -mf16c ) +diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt +index aac8506..e282268 100644 +--- a/library/CMakeLists.txt ++++ b/library/CMakeLists.txt +@@ -58,6 +58,9 @@ include(src/CMakeLists.txt) + # Create hipSPARSELt library + add_library(hipsparselt ${hipsparselt_source} ${hipsparselt_headers_public}) + add_library(roc::hipsparselt ALIAS hipsparselt) ++target_include_directories( hipsparselt PRIVATE ${HIPSPARSE_INCLUDE_DIRS} ) ++target_include_directories( hipsparselt PRIVATE ${MSGPACK_DIR}/include ) ++ + + # Target compile definitions + if(NOT BUILD_CUDA) +diff --git a/library/src/CMakeLists.txt b/library/src/CMakeLists.txt +index 85f7cde..4c52b34 100755 +--- a/library/src/CMakeLists.txt ++++ b/library/src/CMakeLists.txt +@@ -61,7 +61,7 @@ if(NOT BUILD_CUDA) + if(Tensile_CPU_THREADS MATCHES "^[0-9]+$") + # only including threads argument if number + TensileCreateLibraryFiles( +- "${CMAKE_CURRENT_SOURCE_DIR}/src/hcc_detail/rocsparselt/src/spmm/Tensile/Logic/${Tensile_LOGIC}" ++ "${CMAKE_CURRENT_SOURCE_DIR}/src/hcc_detail/rocsparselt/src/spmm/Tensile/Logic" + "${PROJECT_BINARY_DIR}/Tensile" + ARCHITECTURE ${Tensile_ARCHITECTURE} + CODE_OBJECT_VERSION ${Tensile_CODE_OBJECT_VERSION} +@@ -72,7 +72,7 @@ if(NOT BUILD_CUDA) + ) + else() + TensileCreateLibraryFiles( +- "${CMAKE_CURRENT_SOURCE_DIR}/src/hcc_detail/rocsparselt/src/spmm/Tensile/Logic/${Tensile_LOGIC}" ++ "${CMAKE_CURRENT_SOURCE_DIR}/src/hcc_detail/rocsparselt/src/spmm/Tensile/Logic" + "${PROJECT_BINARY_DIR}/Tensile" + ARCHITECTURE ${Tensile_ARCHITECTURE} + CODE_OBJECT_VERSION ${Tensile_CODE_OBJECT_VERSION} diff --git a/var/spack/repos/builtin/packages/hipsparselt/package.py b/var/spack/repos/builtin/packages/hipsparselt/package.py index 72a0a904c57602..e96305ba2cb74a 100644 --- a/var/spack/repos/builtin/packages/hipsparselt/package.py +++ b/var/spack/repos/builtin/packages/hipsparselt/package.py @@ -21,6 +21,8 @@ class Hipsparselt(CMakePackage, ROCmPackage): maintainers("srekolam", "afzpatel", "renjithravindrankannath") license("MIT") + version("6.2.1", sha256="a23287bc759442aebaccce0306f5e3938865240e13553847356c25c54214a0d4") + version("6.2.0", sha256="a25a3ce0ed3cc616b1a4e38bfdd5e68463bb9fe791a56d1367b8a6373bb63d12") version("6.1.2", sha256="a5a01fec7bc6e1f4792ccd5c8eaee7b42deac315c54298a7ce5265e5551e8640") version("6.1.1", sha256="ca6da099d9e385ffce2b68404f395a93b199af1592037cf52c620f9148a6a78d") version("6.1.0", sha256="66ade6de4fd19d144cab27214352faf5b00bbe12afe59472efb441b16d090265") @@ -43,7 +45,7 @@ class Hipsparselt(CMakePackage, ROCmPackage): ) variant("asan", default=False, description="Build with address-sanitizer enabled or disabled") - for ver in ["6.0.0", "6.0.2", "6.1.0", "6.1.1", "6.1.2"]: + for ver in ["6.0.0", "6.0.2", "6.1.0", "6.1.1", "6.1.2", "6.2.0", "6.2.1"]: depends_on(f"hip@{ver}", when=f"@{ver}") depends_on(f"hipsparse@{ver}", when=f"@{ver}") depends_on(f"rocm-openmp-extras@{ver}", when=f"@{ver}", type="test") @@ -64,6 +66,7 @@ class Hipsparselt(CMakePackage, ROCmPackage): # tensorlite subdir of hipblas . Also adds hipsparse and msgpack include directories # for 6.1.0 release. patch("0001-update-llvm-path-add-hipsparse-include-dir-for-spack-6.1.patch", when="@6.1") + patch("0001-update-llvm-path-add-hipsparse-include-dir-for-spack-6.2.patch", when="@6.2") def setup_build_environment(self, env): env.set("CXX", self.spec["hip"].hipcc) diff --git a/var/spack/repos/builtin/packages/hipsycl/package.py b/var/spack/repos/builtin/packages/hipsycl/package.py index 1a17760aac23ed..0a60f5f18922d8 100644 --- a/var/spack/repos/builtin/packages/hipsycl/package.py +++ b/var/spack/repos/builtin/packages/hipsycl/package.py @@ -25,6 +25,7 @@ class Hipsycl(CMakePackage, ROCmPackage): license("BSD-2-Clause") version("stable", branch="stable", submodules=True) + version("24.06.0", commit="fc51dae9006d6858fc9c33148cc5f935bb56b075", submodules=True) version("24.02.0", commit="974adc33ea5a35dd8b5be68c7a744b37482b8b64", submodules=True) version("23.10.0", commit="3952b468c9da89edad9dff953cdcab0a3c3bf78c", submodules=True) version("0.9.4", commit="99d9e24d462b35e815e0e59c1b611936c70464ae", submodules=True) @@ -47,8 +48,10 @@ class Hipsycl(CMakePackage, ROCmPackage): # hipSYCL 0.8.0 supported only LLVM 8-10: # (https://github.com/AdaptiveCpp/AdaptiveCpp/blob/v0.8.0/CMakeLists.txt#L29-L37) depends_on("llvm@8:10", when="@0.8.0") + # https://github.com/spack/spack/issues/45029 and https://github.com/spack/spack/issues/43142 + conflicts("^gcc@12", when="@23.10.0") # https://github.com/OpenSYCL/OpenSYCL/pull/918 was introduced after 0.9.4 - conflicts("^llvm@16:", when="@:0.9.4") + conflicts("^gcc@12.2.0", when="@:0.9.4") # LLVM PTX backend requires cuda7:10.1 (https://tinyurl.com/v82k5qq) depends_on("cuda@9:10.1", when="@0.8.1: +cuda ^llvm@9") depends_on("cuda@9:", when="@0.8.1: +cuda ^llvm@10:") @@ -72,13 +75,15 @@ class Hipsycl(CMakePackage, ROCmPackage): "further info please refer to: " "https://github.com/illuhad/hipSYCL/blob/master/doc/install-cuda.md", ) + # https://github.com/spack/spack/issues/46681 + conflicts("^llvm@19", when="@24.02.0:24.06.0") def cmake_args(self): spec = self.spec args = [ "-DWITH_CPU_BACKEND:Bool=TRUE", - "-DWITH_ROCM_BACKEND:Bool={0}".format("TRUE" if "+rocm" in spec else "FALSE"), - "-DWITH_CUDA_BACKEND:Bool={0}".format("TRUE" if "+cuda" in spec else "FALSE"), + "-DWITH_ROCM_BACKEND:Bool={0}".format("TRUE" if spec.satisfies("+rocm") else "FALSE"), + "-DWITH_CUDA_BACKEND:Bool={0}".format("TRUE" if spec.satisfies("+cuda") else "FALSE"), # prevent hipSYCL's cmake to look for other LLVM installations # if the specified one isn't compatible "-DDISABLE_LLVM_VERSION_CHECK:Bool=TRUE", @@ -116,9 +121,9 @@ def cmake_args(self): ) args.append("-DCLANG_EXECUTABLE_PATH:String={0}".format(llvm_clang_bin)) # explicit CUDA toolkit - if "+cuda" in spec: + if spec.satisfies("+cuda"): args.append("-DCUDA_TOOLKIT_ROOT_DIR:String={0}".format(spec["cuda"].prefix)) - if "+rocm" in spec: + if spec.satisfies("+rocm"): args.append("-DWITH_ACCELERATED_CPU:STRING=OFF") args.append("-DROCM_PATH:STRING={0}".format(os.environ.get("ROCM_PATH"))) if self.spec.satisfies("@24.02.0:"): @@ -161,7 +166,7 @@ def adjust_core_config(config): # the libc++.so and libc++abi.so dyn linked to the sycl # ptx backend rpaths = set() - if "~rocm" in spec: + if self.spec.satisfies("~rocm"): so_paths = filesystem.find_libraries( "libc++", self.spec["llvm"].prefix, shared=True, recursive=True ) diff --git a/var/spack/repos/builtin/packages/hiredis/package.py b/var/spack/repos/builtin/packages/hiredis/package.py index be1d469c8900f7..39eb4aaa5b81f4 100644 --- a/var/spack/repos/builtin/packages/hiredis/package.py +++ b/var/spack/repos/builtin/packages/hiredis/package.py @@ -46,13 +46,17 @@ class Hiredis(MakefilePackage, CMakePackage): class MakefileBuilder(spack.build_systems.makefile.MakefileBuilder): @property def build_targets(self): - use_ssl = 1 if "+ssl" in self.spec else 0 - run_test_async = 1 if "+test_async" in self.spec else 0 + use_ssl = 1 if self.spec.satisfies("+ssl") else 0 + run_test_async = 1 if self.spec.satisfies("+test_async") else 0 return ["USE_SSL={0}".format(use_ssl), "TEST_ASYNC={0}".format(run_test_async)] def install(self, pkg, spec, prefix): make("PREFIX={0}".format(prefix), "install") - if "+test" in self.spec or "+test_async" in self.spec or "+test_ssl" in self.spec: + if ( + self.spec.satisfies("+test") + or self.spec.satisfies("+test_async") + or self.spec.satisfies("+test_ssl") + ): make("PREFIX={0}".format(prefix), "test") @run_after("install") @@ -63,9 +67,9 @@ def darwin_fix(self): class CMakeBuilder(spack.build_systems.cmake.CMakeBuilder): def cmake_args(self): - build_test = not ("+test" in self.spec) - ssl_test = ("+test_ssl" in self.spec) and ("+test" in self.spec) - async_test = ("+test_async" in self.spec) and ("+test" in self.spec) + build_test = not self.spec.satisfies("+test") + ssl_test = self.spec.satisfies("+test_ssl") and self.spec.satisfies("+test") + async_test = self.spec.satisfies("+test_async") and self.spec.satisfies("+test") args = [ self.define_from_variant("ENABLE_SSL", "ssl"), diff --git a/var/spack/repos/builtin/packages/hisat2/package.py b/var/spack/repos/builtin/packages/hisat2/package.py index 6821930bb184bd..ca96899314f9dc 100644 --- a/var/spack/repos/builtin/packages/hisat2/package.py +++ b/var/spack/repos/builtin/packages/hisat2/package.py @@ -89,24 +89,20 @@ def filter_sbang(self): pattern = "^#!.*/usr/bin/env python" repl = f"#!{self.spec['python'].command.path}" files = ["hisat2-build", "hisat2-inspect"] - for file in files: - filter_file(pattern, repl, *files, backup=False) + filter_file(pattern, repl, *files, backup=False) pattern = "^#!.*/usr/bin/env perl" repl = f"#!{self.spec['perl'].command.path}" files = ["hisat2"] - for file in files: - filter_file(pattern, repl, *files, backup=False) + filter_file(pattern, repl, *files, backup=False) pattern = "^#!.*/usr/bin/env python3" repl = f"#!{self.spec['python'].command.path}" files = glob.glob("*.py") - for file in files: - filter_file(pattern, repl, *files, backup=False) + filter_file(pattern, repl, *files, backup=False) with working_dir(self.prefix.scripts): pattern = "^#!.*/usr/bin/perl" repl = f"#!{self.spec['perl'].command.path}" files = glob.glob("*.pl") - for file in files: - filter_file(pattern, repl, *files, backup=False) + filter_file(pattern, repl, *files, backup=False) diff --git a/var/spack/repos/builtin/packages/hive/package.py b/var/spack/repos/builtin/packages/hive/package.py index da071c8bb7c89c..8a26d742e453b9 100644 --- a/var/spack/repos/builtin/packages/hive/package.py +++ b/var/spack/repos/builtin/packages/hive/package.py @@ -17,8 +17,9 @@ class Hive(Package): homepage = "https://hive.apache.org/" url = "https://www.apache.org/dist/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz" - license("Apache-2.0") + license("Apache-2.0", checked_by="wdconinc") + version("3.1.3", sha256="0c9b6a6359a7341b6029cc9347435ee7b379f93846f779d710b13f795b54bb16") version("3.1.2", sha256="d75dcf36908b4e7b9b0ec9aec57a46a6628b97b276c233cb2c2f1a3e89b13462") version("2.3.6", sha256="0b3736edc8d15f01ed649bfce7d74346c35fd57567411e9d0c3f48578f76610d") version("1.2.2", sha256="763b246a1a1ceeb815493d1e5e1d71836b0c5b9be1c4cd9c8d685565113771d1") diff --git a/var/spack/repos/builtin/packages/hmmer/package.py b/var/spack/repos/builtin/packages/hmmer/package.py index 9a35cd76ecef05..8e12b522873802 100644 --- a/var/spack/repos/builtin/packages/hmmer/package.py +++ b/var/spack/repos/builtin/packages/hmmer/package.py @@ -41,10 +41,10 @@ class Hmmer(Package): def install(self, spec, prefix): configure_args = ["--prefix={0}".format(prefix)] - if "+gsl" in self.spec: + if self.spec.satisfies("+gsl"): configure_args.extend(["--with-gsl", "LIBS=-lgsl -lgslcblas"]) - if "+mpi" in self.spec: + if self.spec.satisfies("+mpi"): configure_args.append("--enable-mpi") configure(*configure_args) diff --git a/var/spack/repos/builtin/packages/homer/package.py b/var/spack/repos/builtin/packages/homer/package.py index 7ee7b7fbdc7b34..17a3b7e13e645f 100644 --- a/var/spack/repos/builtin/packages/homer/package.py +++ b/var/spack/repos/builtin/packages/homer/package.py @@ -50,5 +50,5 @@ def install(self, spec, prefix): perl("configureHomer.pl", "-local") # download extra data if requested - if "+data" in spec: + if spec.satisfies("+data"): perl("configureHomer.pl", "-install", "-all") diff --git a/var/spack/repos/builtin/packages/hoomd-blue/package.py b/var/spack/repos/builtin/packages/hoomd-blue/package.py index e5e3a96fa7cf1d..b58222cb1cd524 100644 --- a/var/spack/repos/builtin/packages/hoomd-blue/package.py +++ b/var/spack/repos/builtin/packages/hoomd-blue/package.py @@ -71,14 +71,14 @@ def cmake_args(self): cmake_args = ["-DCMAKE_INSTALL_PREFIX={0}".format(python_platlib)] # MPI support - if "+mpi" in spec: + if spec.satisfies("+mpi"): os.environ["MPI_HOME"] = spec["mpi"].prefix cmake_args.append("-DENABLE_MPI=ON") else: cmake_args.append("-DENABLE_MPI=OFF") # CUDA support - if "+cuda" in spec: + if spec.satisfies("+cuda"): cmake_args.append("-DENABLE_CUDA=ON") else: cmake_args.append("-DENABLE_CUDA=OFF") @@ -95,7 +95,7 @@ def cmake_args(self): cmake_args.append("-DENABLE_MPI_CUDA=OFF") # Documentation - if "+doc" in spec: + if spec.satisfies("+doc"): cmake_args.append("-DENABLE_DOXYGEN=ON") else: cmake_args.append("-DENABLE_DOXYGEN=OFF") diff --git a/var/spack/repos/builtin/packages/hpcc/package.py b/var/spack/repos/builtin/packages/hpcc/package.py index 0a6c77863f9a53..e8a9acb6dea99b 100644 --- a/var/spack/repos/builtin/packages/hpcc/package.py +++ b/var/spack/repos/builtin/packages/hpcc/package.py @@ -7,6 +7,7 @@ import platform import re +from spack.build_environment import optimization_flags from spack.package import * @@ -85,7 +86,7 @@ class Hpcc(MakefilePackage): } def patch(self): - if "fftw" in self.spec: + if self.spec.satisfies("^fftw"): # spack's fftw2 prefix headers with floating point type filter_file(r"^\s*#include ", "#include ", "FFT/wrapfftw.h") filter_file( @@ -161,7 +162,7 @@ def edit(self, spec, prefix): if spec.satisfies("%intel"): # with intel-parallel-studio+mpi the '-march' arguments # are not passed to icc - arch_opt = spec.architecture.target.optimization_flags(spec.compiler) + arch_opt = optimization_flags(self.compiler, spec.target) self.config["@CCFLAGS@"] = f"-O3 -restrict -ansi-alias -ip {arch_opt}" self.config["@CCNOOPT@"] = "-restrict" self._write_make_arch(spec, prefix) diff --git a/var/spack/repos/builtin/packages/hpccg/package.py b/var/spack/repos/builtin/packages/hpccg/package.py index 676bf9764d0781..86244d74aa4299 100644 --- a/var/spack/repos/builtin/packages/hpccg/package.py +++ b/var/spack/repos/builtin/packages/hpccg/package.py @@ -31,7 +31,7 @@ class Hpccg(MakefilePackage): def build_targets(self): targets = [] - if "+mpi" in self.spec: + if self.spec.satisfies("+mpi"): targets.append("CXX={0}".format(self.spec["mpi"].mpicxx)) targets.append("LINKER={0}".format(self.spec["mpi"].mpicxx)) targets.append("USE_MPI=-DUSING_MPI") @@ -39,7 +39,7 @@ def build_targets(self): targets.append("CXX=c++") targets.append("LINKER=c++") - if "+openmp" in self.spec: + if self.spec.satisfies("+openmp"): targets.append("USE_OMP=-DUSING_OMP") targets.append("OMP_FLAGS={0}".format(self.compiler.openmp_flag)) diff --git a/var/spack/repos/builtin/packages/hpcg/package.py b/var/spack/repos/builtin/packages/hpcg/package.py index 52da05d90699a1..9e0affb3b804b7 100644 --- a/var/spack/repos/builtin/packages/hpcg/package.py +++ b/var/spack/repos/builtin/packages/hpcg/package.py @@ -76,7 +76,7 @@ def configure(self, spec, prefix): CXXFLAGS += " -Rpass=loop-vectorize" CXXFLAGS += " -Rpass-missed=loop-vectorize" CXXFLAGS += " -Rpass-analysis=loop-vectorize " - if "+openmp" in self.spec: + if self.spec.satisfies("+openmp"): CXXFLAGS += self.compiler.openmp_flag config = [ # Shell diff --git a/var/spack/repos/builtin/packages/hpctoolkit/package.py b/var/spack/repos/builtin/packages/hpctoolkit/package.py index 0c6d77b65f3db6..548bfad92ccc45 100644 --- a/var/spack/repos/builtin/packages/hpctoolkit/package.py +++ b/var/spack/repos/builtin/packages/hpctoolkit/package.py @@ -179,6 +179,7 @@ class Hpctoolkit(AutotoolsPackage, MesonPackage): depends_on("xz", type="link") depends_on("xz+pic libs=static", type="link", when="@:2023.08") depends_on("yaml-cpp@0.7.0: +shared", when="@2022.10:") + depends_on("googletest@1.8.1: +gmock", type="test", when="@develop") depends_on("zlib-api") depends_on("zlib+shared", when="^[virtuals=zlib-api] zlib") @@ -263,7 +264,7 @@ def setup_run_environment(self, env): env.prepend_path("MANPATH", spec.prefix.share.man) env.prepend_path("CPATH", spec.prefix.include) env.prepend_path("LD_LIBRARY_PATH", spec.prefix.lib.hpctoolkit) - if "+viewer" in spec: + if spec.satisfies("+viewer"): env.prepend_path("PATH", spec["hpcviewer"].prefix.bin) env.prepend_path("MANPATH", spec["hpcviewer"].prefix.share.man) @@ -329,18 +330,18 @@ def configure_args(self): if spec.satisfies("@2022.10:"): args.append("--with-yaml-cpp=%s" % spec["yaml-cpp"].prefix) - if "+cuda" in spec: + if spec.satisfies("+cuda"): args.append("--with-cuda=%s" % spec["cuda"].prefix) - if "+level_zero" in spec: + if spec.satisfies("+level_zero"): args.append("--with-level0=%s" % spec["oneapi-level-zero"].prefix) # gtpin requires level_zero - if "+gtpin" in spec: + if spec.satisfies("+gtpin"): args.append("--with-gtpin=%s" % spec["intel-gtpin"].prefix) args.append("--with-igc=%s" % spec["oneapi-igc"].prefix) - if "+opencl" in spec: + if spec.satisfies("+opencl"): args.append("--with-opencl=%s" % spec["opencl-c-headers"].prefix) if spec.satisfies("+rocm"): @@ -399,17 +400,20 @@ def meson_args(self): spec = self.spec args = [ - "-Dhpcprof_mpi=" + ("enabled" if "+mpi" in spec else "disabled"), - "-Dpython=" + ("enabled" if "+python" in spec else "disabled"), - "-Dpapi=" + ("enabled" if "+papi" in spec else "disabled"), - "-Dopencl=" + ("enabled" if "+opencl" in spec else "disabled"), - "-Dcuda=" + ("enabled" if "+cuda" in spec else "disabled"), - "-Drocm=" + ("enabled" if "+rocm" in spec else "disabled"), - "-Dlevel0=" + ("enabled" if "+level_zero" in spec else "disabled"), - "-Dgtpin=" + ("enabled" if "+gtpin" in spec else "disabled"), + "-Dhpcprof_mpi=" + ("enabled" if spec.satisfies("+mpi") else "disabled"), + "-Dpython=" + ("enabled" if spec.satisfies("+python") else "disabled"), + "-Dpapi=" + ("enabled" if spec.satisfies("+papi") else "disabled"), + "-Dopencl=" + ("enabled" if spec.satisfies("+opencl") else "disabled"), + "-Dcuda=" + ("enabled" if spec.satisfies("+cuda") else "disabled"), + "-Drocm=" + ("enabled" if spec.satisfies("+rocm") else "disabled"), + "-Dlevel0=" + ("enabled" if spec.satisfies("+level_zero") else "disabled"), + "-Dgtpin=" + ("enabled" if spec.satisfies("+gtpin") else "disabled"), ] - if "@:2024.01" in spec: + if spec.satisfies("@develop"): + args.append("-Dtests=" + ("enabled" if self.pkg.run_tests else "disabled")) + + if spec.satisfies("@:2024.01"): args.append(f"--native-file={self.gen_prefix_file()}") return args @@ -444,29 +448,29 @@ def gen_prefix_file(self): cfg["properties"]["prefix_yaml_cpp"] = f"'''{spec['yaml-cpp'].prefix}'''" - if "+cuda" in spec: + if spec.satisfies("+cuda"): cfg["properties"]["prefix_cuda"] = f"'''{spec['cuda'].prefix}'''" - if "+level_zero" in spec: + if spec.satisfies("+level_zero"): cfg["properties"]["prefix_level0"] = f"'''{spec['oneapi-level-zero'].prefix}'''" - if "+gtpin" in spec: + if spec.satisfies("+gtpin"): cfg["properties"]["prefix_gtpin"] = f"'''{spec['intel-gtpin'].prefix}'''" cfg["properties"]["prefix_igc"] = f"'''{spec['oneapi-igc'].prefix}'''" - if "+opencl" in spec: + if spec.satisfies("+opencl"): cfg["properties"]["prefix_opencl"] = f"'''{spec['opencl-c-headers'].prefix}'''" - if "+rocm" in spec: + if spec.satisfies("+rocm"): cfg["properties"]["prefix_rocm_hip"] = f"'''{spec['hip'].prefix}'''" cfg["properties"]["prefix_rocm_hsa"] = f"'''{spec['hsa-rocr-dev'].prefix}'''" cfg["properties"]["prefix_rocm_tracer"] = f"'''{spec['roctracer-dev'].prefix}'''" cfg["properties"]["prefix_rocm_profiler"] = f"'''{spec['rocprofiler-dev'].prefix}'''" - if "+python" in spec: + if spec.satisfies("+python"): cfg["binaries"]["python"] = f"'''{spec['python'].command}'''" - if "+mpi" in spec: + if spec.satisfies("+mpi"): cfg["binaries"]["mpicxx"] = f"'''{spec['mpi'].mpicxx}'''" native_fd, native_path = tempfile.mkstemp( diff --git a/var/spack/repos/builtin/packages/hpcviewer/package.py b/var/spack/repos/builtin/packages/hpcviewer/package.py index 495c7650839ba6..e5aae93bdbda97 100644 --- a/var/spack/repos/builtin/packages/hpcviewer/package.py +++ b/var/spack/repos/builtin/packages/hpcviewer/package.py @@ -26,6 +26,8 @@ class Hpcviewer(Package): skip_version_audit = ["platform=windows"] darwin_sha = { + ("2024.09", "aarch64"): "f2e5b516105fe99315950ac4cc3bce120afadeca57cfaa16d58684756950d373", + ("2024.09", "x86_64"): "dd7a807a70c384e73d9abfe67b9e41de5dedcec2da4a36cc487bb9cd1ed6b366", ("2024.02", "aarch64"): "0f2bf2f89b7b9656b1b249efc8b24763f7865e8ddae5b22a3c21cc79fda49ce9", ("2024.02", "x86_64"): "7f61166155f326179e309aa18568b44d98a2219973a323cd4713123b5bf6fd54", ("2023.07", "aarch64"): "6e3146fc3c6d778a256938a3589818ad3ac6496415f9fe27a012b6c1e7fbe766", @@ -50,6 +52,9 @@ class Hpcviewer(Package): } viewer_sha = { + ("2024.09", "aarch64"): "22f2fd477652a252375554270f82068691462e93d1fea4b7c1620e26ca0c9148", + ("2024.09", "ppc64le"): "eabfa180fc023b9d0d3db06763ec5bb9abc278d65a9763cd26d214605d1b8dd4", + ("2024.09", "x86_64"): "4b3acd19f96ffd387e5aca7a51fcaad4919449223ce77332c91d616660c2850a", ("2024.02", "aarch64"): "b64166060ee0d2165fdb885ca7a0658c0d7656b2fcf3e5fc735127f3e577ed7b", ("2024.02", "ppc64le"): "83ea588d547c4a8bc13db0ed5c763770e7b40b44b0318b75b54ccd226410aa0d", ("2024.02", "x86_64"): "fa4d769ef93c666f2702d0cbc4bb49bd5f48c0c15a0eb4cbad6105807bcd57b0", @@ -164,7 +169,8 @@ class Hpcviewer(Package): when=f"@{ver}", ) - depends_on("java@11:", type=("build", "run"), when="@2021.0:") + depends_on("java@17:", type=("build", "run"), when="@2024.09:") + depends_on("java@11:", type=("build", "run"), when="@2021.0:2024.02") depends_on("java@8", type=("build", "run"), when="@:2020") # Install for MacOSX / Darwin diff --git a/var/spack/repos/builtin/packages/hpgmg/package.py b/var/spack/repos/builtin/packages/hpgmg/package.py index 8045f7297362aa..cd37b5a70289ba 100644 --- a/var/spack/repos/builtin/packages/hpgmg/package.py +++ b/var/spack/repos/builtin/packages/hpgmg/package.py @@ -52,24 +52,24 @@ class Hpgmg(MakefilePackage): def configure_args(self): args = [] - if "+fe" in self.spec and not ("@0.3" in self.spec): + if self.spec.satisfies("+fe") and not self.spec.satisfies("@0.3"): args.append("--fe") - if "fv=serial" in self.spec: + if self.spec.satisfies("fv=serial"): args.append("--no-fv-mpi") - if "mpi" in self.spec: + if self.spec.satisfies("^mpi"): args.append("--CC={0}".format(self.spec["mpi"].mpicc)) cflags = [] - if "fv=none" in self.spec: + if self.spec.satisfies("fv=none"): args.append("--no-fv") else: # Apple's Clang doesn't support OpenMP if not self.spec.satisfies("%apple-clang"): cflags.append(self.compiler.openmp_flag) - if "+debug" in self.spec: + if self.spec.satisfies("+debug"): cflags.append("-g") else: cflags.append("-O3") diff --git a/var/spack/repos/builtin/packages/hpl/package.py b/var/spack/repos/builtin/packages/hpl/package.py index 184fe6c2b7e298..b57692b0504721 100644 --- a/var/spack/repos/builtin/packages/hpl/package.py +++ b/var/spack/repos/builtin/packages/hpl/package.py @@ -50,7 +50,7 @@ def configure(self, spec, prefix): config = [] # OpenMP support - if "+openmp" in spec: + if spec.satisfies("+openmp"): config.append("OMP_DEFS = {0}".format(self.compiler.openmp_flag)) config.extend( @@ -106,7 +106,7 @@ def configure_args(self): filter_file(r"^libs10=.*", "libs10=%s" % self.spec["blas"].libs.ld_flags, "configure") cflags, ldflags = ["-O3"], [] - if "+openmp" in self.spec: + if self.spec.satisfies("+openmp"): cflags.append(self.compiler.openmp_flag) if ( @@ -116,10 +116,10 @@ def configure_args(self): ): ldflags.append(self.spec["blas"].libs.ld_flags) - if "%aocc" in self.spec: - if "%aocc@3:" in self.spec: + if self.spec.satisfies("%aocc"): + if self.spec.satisfies("%aocc@3:"): ldflags.extend(["-lamdlibm", "-lm"]) - if "%aocc@4:" in self.spec: + if self.spec.satisfies("%aocc@4:"): ldflags.append("-lamdalloc") if self.spec["blas"].name == "fujitsu-ssl2" and ( diff --git a/var/spack/repos/builtin/packages/hpx-kokkos/package.py b/var/spack/repos/builtin/packages/hpx-kokkos/package.py index f2ea7b1d61a53d..c01af6c03f95f5 100644 --- a/var/spack/repos/builtin/packages/hpx-kokkos/package.py +++ b/var/spack/repos/builtin/packages/hpx-kokkos/package.py @@ -81,7 +81,7 @@ def cmake_args(self): self.define("HPX_KOKKOS_ENABLE_BENCHMARKS", self.run_tests), ] - if "+rocm" in self.spec: + if self.spec.satisfies("+rocm"): args += [self.define("CMAKE_CXX_COMPILER", self.spec["hip"].hipcc)] return args diff --git a/var/spack/repos/builtin/packages/hpx/package.py b/var/spack/repos/builtin/packages/hpx/package.py index 910d20b6b5e2f3..b40de24c0eed2e 100644 --- a/var/spack/repos/builtin/packages/hpx/package.py +++ b/var/spack/repos/builtin/packages/hpx/package.py @@ -241,8 +241,8 @@ def cmake_args(self): self.define_from_variant("HPX_WITH_ASYNC_CUDA", "async_cuda"), self.define("HPX_WITH_TESTS", self.run_tests), self.define("HPX_WITH_NETWORKING", "networking=none" not in spec), - self.define("HPX_WITH_PARCELPORT_TCP", "networking=tcp" in spec), - self.define("HPX_WITH_PARCELPORT_MPI", "networking=mpi" in spec), + self.define("HPX_WITH_PARCELPORT_TCP", spec.satisfies("networking=tcp")), + self.define("HPX_WITH_PARCELPORT_MPI", spec.satisfies("networking=mpi")), self.define( "HPX_WITH_MAX_CPU_COUNT", format_max_cpu_count(spec.variants["max_cpu_count"].value), @@ -260,7 +260,7 @@ def cmake_args(self): args += [self.define("HPX_WITH_UNITY_BUILD", True)] # HIP support requires compiling with hipcc - if "+rocm" in self.spec: + if self.spec.satisfies("+rocm"): args += [self.define("CMAKE_CXX_COMPILER", self.spec["hip"].hipcc)] if self.spec.satisfies("^cmake@3.21.0:3.21.2"): args += [self.define("__skip_rocmclang", True)] @@ -268,13 +268,13 @@ def cmake_args(self): # Instrumentation args += self.instrumentation_args() - if "instrumentation=thread_debug" in spec: + if spec.satisfies("instrumentation=thread_debug"): args += [ self.define("HPX_WITH_THREAD_DEBUG_INFO", True), self.define("HPX_WITH_LOGGING", True), ] - if "instrumentation=apex" in spec: + if spec.satisfies("instrumentation=apex"): args += [ self.define("APEX_WITH_OTF2", True), self.define("OTF2_ROOT", spec["otf2"].prefix), diff --git a/var/spack/repos/builtin/packages/hpx5/package.py b/var/spack/repos/builtin/packages/hpx5/package.py index a0f4cc27c11920..eccb045c21e4ec 100644 --- a/var/spack/repos/builtin/packages/hpx5/package.py +++ b/var/spack/repos/builtin/packages/hpx5/package.py @@ -84,24 +84,24 @@ def configure_args(self): # '--with-papi=papi', # currently disabled in HPX ] - if "+cxx11" in spec: + if spec.satisfies("+cxx11"): args += ["--enable-hpx++"] - if "+debug" in spec: + if spec.satisfies("+debug"): args += ["--enable-debug"] - if "+instrumentation" in spec: + if spec.satisfies("+instrumentation"): args += ["--enable-instrumentation"] - if "+mpi" in spec or "+photon" in spec: + if spec.satisfies("+mpi") or spec.satisfies("+photon"): # photon requires mpi args += ["--enable-mpi"] # Choose pkg-config name for MPI library - if "^openmpi" in spec: + if spec.satisfies("^openmpi"): args += ["--with-mpi=ompi-cxx"] - elif "^mpich" in spec: + elif spec.satisfies("^mpich"): args += ["--with-mpi=mpich"] - elif "^mvapich2" in spec: + elif spec.satisfies("^mvapich2"): args += ["--with-mpi=mvapich2-cxx"] else: args += ["--with-mpi=system"] @@ -110,17 +110,17 @@ def configure_args(self): # if '+metis' in spec: # args += ['--with-metis=???'] - if "+opencl" in spec: + if spec.satisfies("+opencl"): args += ["--enable-opencl"] - if "^pocl" in spec: + if spec.satisfies("^pocl"): args += ["--with-opencl=pocl"] else: args += ["--with-opencl=system"] - if "+photon" in spec: + if spec.satisfies("+photon"): args += ["--enable-photon"] - if "+pic" in spec: + if spec.satisfies("+pic"): args += ["--with-pic"] return args diff --git a/var/spack/repos/builtin/packages/hsa-rocr-dev/package.py b/var/spack/repos/builtin/packages/hsa-rocr-dev/package.py index a0825f64e774b9..579a7b01ba3262 100644 --- a/var/spack/repos/builtin/packages/hsa-rocr-dev/package.py +++ b/var/spack/repos/builtin/packages/hsa-rocr-dev/package.py @@ -17,13 +17,15 @@ class HsaRocrDev(CMakePackage): homepage = "https://github.com/ROCm/ROCR-Runtime" git = "https://github.com/ROCm/ROCR-Runtime.git" - url = "https://github.com/ROCm/ROCR-Runtime/archive/rocm-6.0.2.tar.gz" + url = "https://github.com/ROCm/ROCR-Runtime/archive/rocm-6.2.1.tar.gz" tags = ["rocm"] maintainers("srekolam", "renjithravindrankannath", "haampie") libraries = ["libhsa-runtime64"] version("master", branch="master") + version("6.2.1", sha256="dbe477b323df636f5e3221471780da156c938ec00dda4b50639aa8d7fb9248f4") + version("6.2.0", sha256="c98090041fa56ca4a260709876e2666f85ab7464db9454b177a189e1f52e0b1a") version("6.1.2", sha256="6eb7a02e5f1e5e3499206b9e74c9ccdd644abaafa2609dea0993124637617866") version("6.1.1", sha256="72841f112f953c16619938273370eb8727ddf6c2e00312856c9fca54db583b99") version("6.1.0", sha256="50386ebcb7ff24449afa2a10c76a059597464f877225c582ba3e097632a43f9c") @@ -73,6 +75,8 @@ class HsaRocrDev(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", "master", ]: depends_on(f"hsakmt-roct@{ver}", when=f"@{ver}") @@ -92,6 +96,8 @@ class HsaRocrDev(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"rocm-core@{ver}", when=f"@{ver}") diff --git a/var/spack/repos/builtin/packages/hsakmt-roct/package.py b/var/spack/repos/builtin/packages/hsakmt-roct/package.py index 074a5b078ca92f..75ca27d1f6b7b0 100644 --- a/var/spack/repos/builtin/packages/hsakmt-roct/package.py +++ b/var/spack/repos/builtin/packages/hsakmt-roct/package.py @@ -22,6 +22,8 @@ class HsakmtRoct(CMakePackage): maintainers("srekolam", "renjithravindrankannath") version("master", branch="master") + version("6.2.1", sha256="bba5dd8cce595d94d6a8e467dbd6de9e921f81e665ca8aac1e346e0ade7620f0") + version("6.2.0", sha256="73df98ca2be8a887cb76554c23f148ef6556bdbccfac99f34111fa1f87fd7c5d") version("6.1.2", sha256="097a5b7eb136300667b36bd35bf55e4a283a1ed04e614cf24dddca0a65c86389") version("6.1.1", sha256="c586d8a04fbd9a7bc0a15e0a6a161a07f88f654402bb11694bd8aebc343c00f0") version("6.1.0", sha256="1085055068420821f7a7adb816692412b5fb38f89d67b9edb9995198f39e2f31") @@ -65,6 +67,8 @@ class HsakmtRoct(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"rocm-core@{ver}", when=f"@{ver}") depends_on(f"llvm-amdgpu@{ver}", type="test", when=f"@{ver}") diff --git a/var/spack/repos/builtin/packages/httpd/package.py b/var/spack/repos/builtin/packages/httpd/package.py index cf4ac9e99ccc55..99954782549fba 100644 --- a/var/spack/repos/builtin/packages/httpd/package.py +++ b/var/spack/repos/builtin/packages/httpd/package.py @@ -13,35 +13,23 @@ class Httpd(AutotoolsPackage): homepage = "https://httpd.apache.org/" url = "https://archive.apache.org/dist/httpd/httpd-2.4.43.tar.bz2" - license("Apache-2.0") + license("Apache-2.0", checked_by="wdconinc") - version("2.4.59", sha256="ec51501ec480284ff52f637258135d333230a7d229c3afa6f6c2f9040e321323") - version("2.4.55", sha256="11d6ba19e36c0b93ca62e47e6ffc2d2f2884942694bce0f23f39c71bdc5f69ac") + version("2.4.62", sha256="674188e7bf44ced82da8db522da946849e22080d73d16c93f7f4df89e25729ec") - # https://nvd.nist.gov/vuln/detail/CVE-2022-31813 + # https://nvd.nist.gov/vuln/detail/CVE-2024-38477 version( - "2.4.43", - sha256="a497652ab3fc81318cdc2a203090a999150d86461acff97c1065dc910fe10f43", + "2.4.59", + sha256="ec51501ec480284ff52f637258135d333230a7d229c3afa6f6c2f9040e321323", deprecated=True, ) version( - "2.4.41", - sha256="133d48298fe5315ae9366a0ec66282fa4040efa5d566174481077ade7d18ea40", + "2.4.55", + sha256="11d6ba19e36c0b93ca62e47e6ffc2d2f2884942694bce0f23f39c71bdc5f69ac", deprecated=True, ) - version( - "2.4.39", - sha256="b4ca9d05773aa59b54d66cd8f4744b945289f084d3be17d7981d1783a5decfa2", - deprecated=True, - ) - version( - "2.4.38", - sha256="7dc65857a994c98370dc4334b260101a7a04be60e6e74a5c57a6dee1bc8f394a", - deprecated=True, - ) - - depends_on("c", type="build") # generated + depends_on("c", type="build") depends_on("m4", type="build") depends_on("autoconf", type="build") depends_on("automake", type="build") diff --git a/var/spack/repos/builtin/packages/hudi/package.py b/var/spack/repos/builtin/packages/hudi/package.py index 5bac21e23a466c..887146409a4fa4 100644 --- a/var/spack/repos/builtin/packages/hudi/package.py +++ b/var/spack/repos/builtin/packages/hudi/package.py @@ -12,7 +12,7 @@ class Hudi(MavenPackage): Hudi manages the storage of large analytical datasets on DFS.""" homepage = "https://hudi.apache.org/" - url = "https://github.com/apache/hudi/archive/release-0.5.3.tar.gz" + url = "https://github.com/apache/hudi/archive/refs/tags/release-0.5.3.tar.gz" license("Apache-2.0") diff --git a/var/spack/repos/builtin/packages/hugo/package.py b/var/spack/repos/builtin/packages/hugo/package.py index 5bb339e8010602..ef9c4f3838836a 100644 --- a/var/spack/repos/builtin/packages/hugo/package.py +++ b/var/spack/repos/builtin/packages/hugo/package.py @@ -8,7 +8,7 @@ from spack.package import * -class Hugo(Package): +class Hugo(GoPackage): """The world's fastest framework for building websites.""" homepage = "https://gohugo.io" @@ -20,6 +20,7 @@ class Hugo(Package): license("Apache-2.0") + version("0.135.0", sha256="a75c4c684d2125255f214d11b9834a5ec6eb64353f4de2c06952d2b3b7430f0e") version("0.127.0", sha256="549c7ebdf2ee6b3107ea10a9fbd9932a91bb3f30f7e8839245f6d8e318aca88c") version("0.126.3", sha256="2a1d65b09884e3c57a8705db99487404856c947dd847cf7bb845e0e1825b33ec") version("0.118.2", sha256="915d7dcb44fba949c80858f9c2a55a11256162ba28a9067752f808cfe8faedaa") @@ -33,11 +34,11 @@ class Hugo(Package): version("0.107.0", sha256="31d959a3c1633087d338147782d03bdef65323b67ff3efcec7b40241413e270a") version("0.106.0", sha256="9219434beb51466487b9f8518edcbc671027c1998e5a5820d76d517e1dfbd96a") - # Uses go modules. - # See https://gohugo.io/getting-started/installing/#fetch-from-github - depends_on("go@1.11:", when="@0.48:", type="build") - depends_on("go@1.18:", when="@0.106:", type="build") - depends_on("go@1.20:", when="@0.123:", type="build") + depends_on("go@1.11:", type="build", when="@0.48:") + depends_on("go@1.18:", type="build", when="@0.106:") + depends_on("go@1.20:", type="build", when="@0.123:") + depends_on("go@1.21.8:", type="build", when="@0.131:") + depends_on("go@1.22.6:", type="build", when="@0.133:") variant("extended", default=False, description="Enable extended features") @@ -49,17 +50,26 @@ def determine_version(cls, exe): match = re.search(r"Hugo Static Site Generator v(\S+)", output) return match.group(1) if match else None - def setup_build_environment(self, env): - # Point GOPATH at the top of the staging dir for the build step. - env.prepend_path("GOPATH", self.stage.path) - - def build(self, spec, prefix): - go_args = ["build"] + @property + def build_args(self): + args = super().build_args if self.spec.satisfies("+extended"): - go_args.extend(["--tags", "extended"]) + args.extend(["--tags", "extended"]) + + return args + + @run_after("install") + def install_completions(self): + hugo = Executable(self.prefix.bin.hugo) + + mkdirp(bash_completion_path(self.prefix)) + with open(bash_completion_path(self.prefix) / "hugo", "w") as file: + hugo("completion", "bash", output=file) - go(*go_args) + mkdirp(fish_completion_path(self.prefix)) + with open(fish_completion_path(self.prefix) / "hugo.fish", "w") as file: + hugo("completion", "fish", output=file) - def install(self, spec, prefix): - mkdirp(prefix.bin) - install("hugo", prefix.bin) + mkdirp(zsh_completion_path(self.prefix)) + with open(zsh_completion_path(self.prefix) / "_hugo", "w") as file: + hugo("completion", "zsh", output=file) diff --git a/var/spack/repos/builtin/packages/hwloc/package.py b/var/spack/repos/builtin/packages/hwloc/package.py index 892619bf75250b..8c51fe761cf3a1 100644 --- a/var/spack/repos/builtin/packages/hwloc/package.py +++ b/var/spack/repos/builtin/packages/hwloc/package.py @@ -26,7 +26,7 @@ class Hwloc(AutotoolsPackage, CudaPackage, ROCmPackage): """ homepage = "https://www.open-mpi.org/projects/hwloc/" - url = "https://download.open-mpi.org/release/hwloc/v2.0/hwloc-2.0.2.tar.gz" + url = "https://download.open-mpi.org/release/hwloc/v2.11/hwloc-2.11.1.tar.bz2" git = "https://github.com/open-mpi/hwloc.git" maintainers("bgoglin") @@ -178,7 +178,7 @@ def configure_args(self): if "+rocm" not in self.spec: args.append("--disable-rsmi") - if "+rocm" in self.spec: + if self.spec.satisfies("+rocm"): args.append("--with-rocm={0}".format(self.spec["hip"].prefix)) args.append("--with-rocm-version={0}".format(self.spec["hip"].version)) @@ -194,11 +194,13 @@ def configure_args(self): args.extend(self.enable_or_disable("pci")) args.extend(self.enable_or_disable("libs")) - if "+cuda" in self.spec: + if self.spec.satisfies("+cuda"): args.append("--with-cuda={0}".format(self.spec["cuda"].prefix)) args.append("--with-cuda-version={0}".format(self.spec["cuda"].version)) - if "+oneapi-level-zero" in self.spec: + if self.spec.satisfies("+oneapi-level-zero"): args.append("--enable-levelzero") + else: + args.append("--disable-levelzero") return args diff --git a/var/spack/repos/builtin/packages/hydrogen/package.py b/var/spack/repos/builtin/packages/hydrogen/package.py index 582204c140b825..b4116df1c4fd13 100644 --- a/var/spack/repos/builtin/packages/hydrogen/package.py +++ b/var/spack/repos/builtin/packages/hydrogen/package.py @@ -139,7 +139,7 @@ class Hydrogen(CachedCMakePackage, CudaPackage, ROCmPackage): @property def libs(self): - shared = True if "+shared" in self.spec else False + shared = True if self.spec.satisfies("+shared") else False return find_libraries("libHydrogen", root=self.prefix, shared=shared, recursive=True) def cmake_args(self): @@ -175,7 +175,7 @@ def initconfig_compiler_entries(self): # FIXME: Enforce this better in the actual CMake. entries.append(cmake_cache_string("CMAKE_CXX_STANDARD", "17")) - entries.append(cmake_cache_option("BUILD_SHARED_LIBS", "+shared" in spec)) + entries.append(cmake_cache_option("BUILD_SHARED_LIBS", spec.satisfies("+shared"))) entries.append(cmake_cache_option("CMAKE_EXPORT_COMPILE_COMMANDS", True)) entries.append(cmake_cache_option("MPI_ASSUME_NO_BUILTIN_MPI", True)) @@ -200,7 +200,7 @@ def initconfig_hardware_entries(self): spec = self.spec entries = super(Hydrogen, self).initconfig_hardware_entries() - entries.append(cmake_cache_option("Hydrogen_ENABLE_CUDA", "+cuda" in spec)) + entries.append(cmake_cache_option("Hydrogen_ENABLE_CUDA", spec.satisfies("+cuda"))) if spec.satisfies("+cuda"): entries.append(cmake_cache_string("CMAKE_CUDA_STANDARD", "17")) if not spec.satisfies("cuda_arch=none"): @@ -215,7 +215,7 @@ def initconfig_hardware_entries(self): if len(cuda_flags) > 0: entries.append(cmake_cache_string("CMAKE_CUDA_FLAGS", " ".join(cuda_flags))) - entries.append(cmake_cache_option("Hydrogen_ENABLE_ROCM", "+rocm" in spec)) + entries.append(cmake_cache_option("Hydrogen_ENABLE_ROCM", spec.satisfies("+rocm"))) if spec.satisfies("+rocm"): entries.append(cmake_cache_string("CMAKE_HIP_STANDARD", "17")) if not spec.satisfies("amdgpu_target=none"): @@ -233,30 +233,36 @@ def initconfig_package_entries(self): entries = super(Hydrogen, self).initconfig_package_entries() # Basic Hydrogen options - entries.append(cmake_cache_option("Hydrogen_ENABLE_TESTING", "+test" in spec)) + entries.append(cmake_cache_option("Hydrogen_ENABLE_TESTING", spec.satisfies("+test"))) entries.append(cmake_cache_option("Hydrogen_GENERAL_LAPACK_FALLBACK", True)) - entries.append(cmake_cache_option("Hydrogen_USE_64BIT_INTS", "+int64" in spec)) - entries.append(cmake_cache_option("Hydrogen_USE_64BIT_BLAS_INTS", "+int64_blas" in spec)) + entries.append(cmake_cache_option("Hydrogen_USE_64BIT_INTS", spec.satisfies("+int64"))) + entries.append( + cmake_cache_option("Hydrogen_USE_64BIT_BLAS_INTS", spec.satisfies("+int64_blas")) + ) # Advanced dependency options - entries.append(cmake_cache_option("Hydrogen_ENABLE_ALUMINUM", "+al" in spec)) - entries.append(cmake_cache_option("Hydrogen_ENABLE_CUB", "+cub" in spec)) - entries.append(cmake_cache_option("Hydrogen_ENABLE_GPU_FP16", "+cuda +half" in spec)) - entries.append(cmake_cache_option("Hydrogen_ENABLE_HALF", "+half" in spec)) - entries.append(cmake_cache_option("Hydrogen_ENABLE_OPENMP", "+openmp" in spec)) + entries.append(cmake_cache_option("Hydrogen_ENABLE_ALUMINUM", spec.satisfies("+al"))) + entries.append(cmake_cache_option("Hydrogen_ENABLE_CUB", spec.satisfies("+cub"))) + entries.append( + cmake_cache_option("Hydrogen_ENABLE_GPU_FP16", spec.satisfies("+cuda +half")) + ) + entries.append(cmake_cache_option("Hydrogen_ENABLE_HALF", spec.satisfies("+half"))) + entries.append(cmake_cache_option("Hydrogen_ENABLE_OPENMP", spec.satisfies("+openmp"))) entries.append( - cmake_cache_option("Hydrogen_ENABLE_OMP_TASKLOOP", "+omp_taskloops" in spec) + cmake_cache_option("Hydrogen_ENABLE_OMP_TASKLOOP", spec.satisfies("+omp_taskloops")) ) # Note that CUDA/ROCm are handled above. - if "blas=openblas" in spec: - entries.append(cmake_cache_option("Hydrogen_USE_OpenBLAS", "blas=openblas" in spec)) + if spec.satisfies("blas=openblas"): + entries.append( + cmake_cache_option("Hydrogen_USE_OpenBLAS", spec.satisfies("blas=openblas")) + ) # CMAKE_PREFIX_PATH should handle this entries.append(cmake_cache_string("OpenBLAS_DIR", spec["openblas"].prefix)) - elif "blas=mkl" in spec or spec.satisfies("^intel-mkl"): + elif spec.satisfies("blas=mkl") or spec.satisfies("^intel-mkl"): entries.append(cmake_cache_option("Hydrogen_USE_MKL", True)) - elif "blas=essl" in spec or spec.satisfies("^essl"): + elif spec.satisfies("blas=essl") or spec.satisfies("^essl"): entries.append(cmake_cache_string("BLA_VENDOR", "IBMESSL")) # IF IBM ESSL is used it needs help finding the proper LAPACK libraries entries.append( @@ -273,7 +279,7 @@ def initconfig_package_entries(self): % ";".join("-l{0}".format(lib) for lib in self.spec["essl"].libs.names), ) ) - elif "blas=accelerate" in spec: + elif spec.satisfies("blas=accelerate"): entries.append(cmake_cache_option("Hydrogen_USE_ACCELERATE", True)) elif spec.satisfies("^netlib-lapack"): entries.append(cmake_cache_string("BLA_VENDOR", "Generic")) diff --git a/var/spack/repos/builtin/packages/hypar/package.py b/var/spack/repos/builtin/packages/hypar/package.py index f8c69c30d6a613..6236b1b1bac65a 100644 --- a/var/spack/repos/builtin/packages/hypar/package.py +++ b/var/spack/repos/builtin/packages/hypar/package.py @@ -18,14 +18,14 @@ class Hypar(AutotoolsPackage): """ homepage = "http://hypar.github.io/" - url = "https://bitbucket.org/deboghosh/hypar/get/v4.1.tar.gz" - git = "https://bitbucket.org/deboghosh/hypar.git" + url = "https://github.com/debog/hypar/archive/refs/tags/v4.1.tar.gz" + git = "https://github.com/debog/hypar.git" maintainers("debog") tags = ["proxy-app", "ecp-proxy-app"] - version("4.1", sha256="36c11dcfda006115f4656ff73790992e5caea99dbc64776c9db4e0a29b4c60da") + version("4.1", sha256="b3bfc6da28d78e2cc89868a35990617e4f77521b68911772887c2f8d0b1fec21") variant("mpi", default=True, description="Build with MPI support") variant("openmp", default=False, description="Build with OpenMP support") @@ -47,17 +47,18 @@ class Hypar(AutotoolsPackage): def configure_args(self): args = [] spec = self.spec - if "+mpi" in spec: - args.append("--enable-mpi") + if spec.satisfies("+mpi"): args.append("--with-mpi-dir={0}".format(spec["mpi"].prefix)) - if "+openmp" in spec: + else: + args.append("--enable-serial") + if spec.satisfies("+openmp"): args.append("--enable-omp") - if "+scalapack" in spec: + if spec.satisfies("+scalapack"): args.append("--enable-scalapack") args.append("--with-blas-dir={0}".format(spec["blas"].prefix)) args.append("--with-lapack-dir={0}".format(spec["lapack"].prefix)) args.append("--with-scalapack-dir={0}".format(spec["scalapack"].prefix)) - if "+fftw" in spec: + if spec.satisfies("+fftw"): args.append("--enable-fftw") args.append("--with-fftw-dir={0}".format(spec["fftw"].prefix)) return args diff --git a/var/spack/repos/builtin/packages/hypre-cmake/package.py b/var/spack/repos/builtin/packages/hypre-cmake/package.py index f794658cf77db4..df5be36f64b4df 100644 --- a/var/spack/repos/builtin/packages/hypre-cmake/package.py +++ b/var/spack/repos/builtin/packages/hypre-cmake/package.py @@ -82,7 +82,7 @@ def cmake_args(self): return args def setup_build_environment(self, env): - if "+cuda" in self.spec: + if self.spec.satisfies("+cuda"): env.set("CUDA_HOME", self.spec["cuda"].prefix) env.set("CUDA_PATH", self.spec["cuda"].prefix) cuda_arch = self.spec.variants["cuda_arch"].value @@ -90,7 +90,7 @@ def setup_build_environment(self, env): arch_sorted = list(sorted(cuda_arch, reverse=True)) env.set("HYPRE_CUDA_SM", arch_sorted[0]) # In CUDA builds hypre currently doesn't handle flags correctly - env.append_flags("CXXFLAGS", "-O2" if "~debug" in self.spec else "-g") + env.append_flags("CXXFLAGS", "-O2" if self.spec.satisfies("~debug") else "-g") extra_install_tests = join_path("src", "examples") @@ -152,6 +152,6 @@ def libs(self): """Export the hypre library. Sample usage: spec['hypre'].libs.ld_flags """ - is_shared = "+shared" in self.spec + is_shared = self.spec.satisfies("+shared") libs = find_libraries("libHYPRE", root=self.prefix, shared=is_shared, recursive=True) return libs or None diff --git a/var/spack/repos/builtin/packages/hypre/package.py b/var/spack/repos/builtin/packages/hypre/package.py index ad0659072de0c6..8d3c262c672576 100644 --- a/var/spack/repos/builtin/packages/hypre/package.py +++ b/var/spack/repos/builtin/packages/hypre/package.py @@ -26,6 +26,7 @@ class Hypre(AutotoolsPackage, CudaPackage, ROCmPackage): license("MIT") version("develop", branch="master") + version("2.32.0", sha256="2277b6f01de4a7d0b01cfe12615255d9640eaa02268565a7ce1a769beab25fa1") version("2.31.0", sha256="9a7916e2ac6615399de5010eb39c604417bb3ea3109ac90e199c5c63b0cb4334") version("2.30.0", sha256="8e2af97d9a25bf44801c6427779f823ebc6f306438066bba7fcbc2a5f9b78421") version("2.29.0", sha256="98b72115407a0e24dbaac70eccae0da3465f8f999318b2c9241631133f42d511") @@ -329,7 +330,7 @@ def configure_args(self): configure_args.append("--with-magma-lib=%s" % spec["magma"].libs) configure_args.append("--with-magma") - if "+gpu-aware-mpi" in spec: + if spec.satisfies("+gpu-aware-mpi"): configure_args.append("--enable-gpu-aware-mpi") configure_args.extend(self.enable_or_disable("fortran")) @@ -348,7 +349,7 @@ def setup_build_environment(self, env): env.set("CUDA_HOME", spec["cuda"].prefix) env.set("CUDA_PATH", spec["cuda"].prefix) # In CUDA builds hypre currently doesn't handle flags correctly - env.append_flags("CXXFLAGS", "-O2" if "~debug" in spec else "-g") + env.append_flags("CXXFLAGS", "-O2" if spec.satisfies("~debug") else "-g") if spec.satisfies("+rocm"): # As of 2022/04/05, the following are set by 'llvm-amdgpu' and @@ -426,6 +427,6 @@ def libs(self): """Export the hypre library. Sample usage: spec['hypre'].libs.ld_flags """ - is_shared = "+shared" in self.spec + is_shared = self.spec.satisfies("+shared") libs = find_libraries("libHYPRE", root=self.prefix, shared=is_shared, recursive=True) return libs or None diff --git a/var/spack/repos/builtin/packages/ibm-databroker/package.py b/var/spack/repos/builtin/packages/ibm-databroker/package.py index 422a9edf9a205a..8f3b4ed990ac8f 100644 --- a/var/spack/repos/builtin/packages/ibm-databroker/package.py +++ b/var/spack/repos/builtin/packages/ibm-databroker/package.py @@ -47,6 +47,6 @@ class IbmDatabroker(CMakePackage, PythonExtension): def cmake_args(self): args = [] args.append("-DDEFAULT_BE=redis") - if "+python" in self.spec: + if self.spec.satisfies("+python"): args.append("-DPYDBR=1") return args diff --git a/var/spack/repos/builtin/packages/icedtea/package.py b/var/spack/repos/builtin/packages/icedtea/package.py index d98e6c59d53696..9499abc5bfb6e7 100644 --- a/var/spack/repos/builtin/packages/icedtea/package.py +++ b/var/spack/repos/builtin/packages/icedtea/package.py @@ -158,9 +158,9 @@ def configure_args(self): os.environ["POTENTIAL_CC"] = os.environ["CC"] os.environ["WGET"] = self.spec["wget"].command.path args = [] - if "~X" in self.spec: + if self.spec.satisfies("~X"): args.append("--enable-headless") - if "+shenandoah" in self.spec: + if self.spec.satisfies("+shenandoah"): args.append("--with-hotspot-build=shenandoah") args.append("--with-hotspot-src-zip=" + self.stage[9].archive_file) args.append("--with-hotspot-checksum=no") diff --git a/var/spack/repos/builtin/packages/icon/package.py b/var/spack/repos/builtin/packages/icon/package.py index a1ab0d0745c13c..d5066545509456 100644 --- a/var/spack/repos/builtin/packages/icon/package.py +++ b/var/spack/repos/builtin/packages/icon/package.py @@ -144,13 +144,13 @@ def configure_args(self): ]: args += self.enable_or_disable(x) - if "+art" in self.spec: + if self.spec.satisfies("+art"): args.append("--enable-art") libs += self.spec["libxml2"].libs else: args.append("--disable-art") - if "+coupling" in self.spec: + if self.spec.satisfies("+coupling"): args.append("--enable-coupling") libs += self.spec["libfyaml"].libs else: @@ -168,7 +168,7 @@ def configure_args(self): ) libs += self.spec["serialbox:fortran"].libs - if "+grib2" in self.spec: + if self.spec.satisfies("+grib2"): args.append("--enable-grib2") libs += self.spec["eccodes:c"].libs else: @@ -179,7 +179,7 @@ def configure_args(self): libs += self.spec["netcdf-fortran"].libs libs += self.spec["netcdf-c"].libs - if "+mpi" in self.spec: + if self.spec.satisfies("+mpi"): args.extend( [ "--enable-mpi", @@ -214,7 +214,7 @@ def configure_args(self): flags["ICON_BUNDLED_CFLAGS"].append("-O2") flags["FCFLAGS"].append("-g") flags["ICON_FCFLAGS"].append("-O2") - if "+ocean" in self.spec: + if self.spec.satisfies("+ocean"): flags["ICON_OCEAN_FCFLAGS"].extend(["-O3", "-fno-tree-loop-vectorize"]) args.extend( ["--enable-fcgroup-OCEAN", "ICON_OCEAN_PATH=src/hamocc:src/ocean:src/sea_ice"] @@ -239,10 +239,10 @@ def configure_args(self): ] ) - if "%oneapi+coupling" in self.spec: + if self.spec.satisfies("%oneapi+coupling"): flags["ICON_YAC_CFLAGS"].extend(["-O2", "-fp-model precise"]) - if "+ocean" in self.spec: + if self.spec.satisfies("+ocean"): flags["ICON_OCEAN_FCFLAGS"].extend( ["-O3", "-assume norealloc_lhs", "-reentrancy threaded"] ) @@ -250,10 +250,10 @@ def configure_args(self): ["--enable-fcgroup-OCEAN", "ICON_OCEAN_PATH=src/hamocc:src/ocean:src/sea_ice"] ) - if "+openmp" in self.spec: + if self.spec.satisfies("+openmp"): flags["ICON_OCEAN_FCFLAGS"].extend(["-DOCE_SOLVE_OMP"]) - if "+ecrad" in self.spec: + if self.spec.satisfies("+ecrad"): flags["ICON_ECRAD_FCFLAGS"].extend(["-qno-opt-dynamic-align", "-no-fma", "-fpe0"]) elif self.compiler.name == "nvhpc": @@ -267,7 +267,7 @@ def configure_args(self): ["-acc=gpu", "-gpu=cc{0}".format(self.nvidia_targets[gpu])] ) - if "%nvhpc@:23.9+coupling" in self.spec: + if self.spec.satisfies("%nvhpc@:23.9+coupling"): args.append("yac_cv_fc_is_contiguous_works=yes") else: diff --git a/var/spack/repos/builtin/packages/igraph/package.py b/var/spack/repos/builtin/packages/igraph/package.py index f201aa97ab6592..c741f316f1c00e 100644 --- a/var/spack/repos/builtin/packages/igraph/package.py +++ b/var/spack/repos/builtin/packages/igraph/package.py @@ -51,7 +51,7 @@ def cmake_args(self): "-DBLA_VENDOR=OpenBLAS", ] - if "+shared" in self.spec: + if self.spec.satisfies("+shared"): args.append("-DBUILD_SHARED_LIBS=ON") else: args.append("-DBUILD_SHARED_LIBS=OFF") diff --git a/var/spack/repos/builtin/packages/igv/package.py b/var/spack/repos/builtin/packages/igv/package.py index 62c4817c9cae9d..ca3d1bc8431485 100644 --- a/var/spack/repos/builtin/packages/igv/package.py +++ b/var/spack/repos/builtin/packages/igv/package.py @@ -34,7 +34,7 @@ def install(self, spec, prefix): mkdirp(prefix.bin) install("igv.args", prefix) files = ["igv.sh", "igv_hidpi.sh"] - if "+igvtools" in spec: + if spec.satisfies("+igvtools"): files.extend(["igvtools", "igvtools_gui", "igvtools_gui_hidpi"]) for f in files: filter_file("^prefix=.*$", "prefix=" + prefix, f) diff --git a/var/spack/repos/builtin/packages/imagemagick/package.py b/var/spack/repos/builtin/packages/imagemagick/package.py index 3d74e7546bab78..cae37bc79bab30 100644 --- a/var/spack/repos/builtin/packages/imagemagick/package.py +++ b/var/spack/repos/builtin/packages/imagemagick/package.py @@ -15,17 +15,38 @@ class Imagemagick(AutotoolsPackage): license("ImageMagick") + version("7.1.1-39", sha256="b2eb652d9221bdeb65772503891d8bfcfc36b3b1a2c9bb35b9d247a08965fd5d") version("7.1.1-29", sha256="27bd25f945efdd7e38f6f9845a7c0a391fdb732f652dda140b743769c5f106e8") version("7.1.1-11", sha256="98bb2783da7d5b06e7543529bd07b50d034fba611ff15e8817a0f4f73957d934") - version("7.1.0-62", sha256="d282117bc6d0e91ad1ad685d096623b96ed8e229f911c891d83277b350ef884a") - version("7.1.0-60", sha256="94424cc13c5ba18e0e5d5badb834ce74eab11207b00ea32c1f533a5e34c85887") - version("7.0.11-14", sha256="dfa5aa3f7f289f12c2f9ee6c7c19b02ae857b4eec02f40298f60f5c11048a016") - version("7.0.10-62", sha256="84442158aea070095efa832cfe868fd99d6befdf609444f0c9e9f1b4f25480cd") - version("7.0.9-27", sha256="aeea7768bf330d87efa80fa89f03c5acc2382eae32d1d871acb813e5b116395a") - version("7.0.8-7", sha256="fadb36b59f310e9eee5249ecb2326b323a64da6cc716dd6d08ece8ea2c780b81") - version("7.0.5-9", sha256="b85b269e0ed1628e88e840053823f8a33c314b2271f04762f43d33e9d0b4d264") - version("7.0.2-7", sha256="f2f18a97f861c1668befdaff0cc3aaafb2111847aab028a88b4c2cb017acfbaa") - version("7.0.2-6", sha256="7d49ca8030f895c683cae69c52d8edfc4876de651f5b8bfdbea907e222480bd3") + with default_args(deprecated=True): + # https://nvd.nist.gov/vuln/detail/CVE-2023-34153 + version( + "7.1.0-62", sha256="d282117bc6d0e91ad1ad685d096623b96ed8e229f911c891d83277b350ef884a" + ) + version( + "7.1.0-60", sha256="94424cc13c5ba18e0e5d5badb834ce74eab11207b00ea32c1f533a5e34c85887" + ) + version( + "7.0.11-14", sha256="dfa5aa3f7f289f12c2f9ee6c7c19b02ae857b4eec02f40298f60f5c11048a016" + ) + version( + "7.0.10-62", sha256="84442158aea070095efa832cfe868fd99d6befdf609444f0c9e9f1b4f25480cd" + ) + version( + "7.0.9-27", sha256="aeea7768bf330d87efa80fa89f03c5acc2382eae32d1d871acb813e5b116395a" + ) + version( + "7.0.8-7", sha256="fadb36b59f310e9eee5249ecb2326b323a64da6cc716dd6d08ece8ea2c780b81" + ) + version( + "7.0.5-9", sha256="b85b269e0ed1628e88e840053823f8a33c314b2271f04762f43d33e9d0b4d264" + ) + version( + "7.0.2-7", sha256="f2f18a97f861c1668befdaff0cc3aaafb2111847aab028a88b4c2cb017acfbaa" + ) + version( + "7.0.2-6", sha256="7d49ca8030f895c683cae69c52d8edfc4876de651f5b8bfdbea907e222480bd3" + ) depends_on("c", type="build") # generated depends_on("cxx", type="build") # generated @@ -34,8 +55,6 @@ class Imagemagick(AutotoolsPackage): variant("rsvg", default=False, description="Enable RSVG support") depends_on("pkgconfig@0.20:", type="build") - depends_on("libtool", when="@:7.1.0-60", type="build") - depends_on("libtool", when="@7.0.8:7.1.0-60", type=("build", "link")) depends_on("fontconfig@2.1:") depends_on("freetype@2.8:") @@ -48,7 +67,6 @@ class Imagemagick(AutotoolsPackage): depends_on("ghostscript-fonts", when="+ghostscript") depends_on("libsm", when="@:7.1.0-60 platform=linux") - depends_on("libtool", when="platform=linux") def configure_args(self): args = [] diff --git a/var/spack/repos/builtin/packages/impalajit/package.py b/var/spack/repos/builtin/packages/impalajit/package.py index c61f3c301ea90e..fb2bcf2852fdce 100644 --- a/var/spack/repos/builtin/packages/impalajit/package.py +++ b/var/spack/repos/builtin/packages/impalajit/package.py @@ -46,7 +46,6 @@ def cmake_args(self): args.append(self.define_from_variant("SHARED_LIB", "shared")) args.append(self.define("TESTS", self.run_tests)) - if self.compiler != "intel": + if not self.spec.satisfies("%intel"): args.append("-DINTEL_COMPILER=OFF") - return args diff --git a/var/spack/repos/builtin/packages/infernal/package.py b/var/spack/repos/builtin/packages/infernal/package.py index a3ac6998c57395..90ef8da99b46e3 100644 --- a/var/spack/repos/builtin/packages/infernal/package.py +++ b/var/spack/repos/builtin/packages/infernal/package.py @@ -30,7 +30,7 @@ class Infernal(AutotoolsPackage): def configure_args(self): args = [] - if "+mpi" in self.spec: + if self.spec.satisfies("+mpi"): args.append("--enable-mpi") else: args.append("--disable-mpi") diff --git a/var/spack/repos/builtin/packages/intel-llvm/package.py b/var/spack/repos/builtin/packages/intel-llvm/package.py index 5c5fbe17d8c1e0..c87b61c5e6ea43 100644 --- a/var/spack/repos/builtin/packages/intel-llvm/package.py +++ b/var/spack/repos/builtin/packages/intel-llvm/package.py @@ -32,7 +32,7 @@ def setup_build_environment(self, env): env.append_flags("CXXFLAGS", self.compiler.cxx11_flag) def setup_run_environment(self, env): - if "+clang" in self.spec: + if self.spec.satisfies("+clang"): env.set("CC", join_path(self.spec.prefix.bin, "clang")) env.set("CXX", join_path(self.spec.prefix.bin, "clang++")) diff --git a/var/spack/repos/builtin/packages/intel-mpi-benchmarks/package.py b/var/spack/repos/builtin/packages/intel-mpi-benchmarks/package.py index 5ef9e675a9450c..1ed9b1ce1517ba 100644 --- a/var/spack/repos/builtin/packages/intel-mpi-benchmarks/package.py +++ b/var/spack/repos/builtin/packages/intel-mpi-benchmarks/package.py @@ -98,25 +98,25 @@ def parallel(self): def build_targets(self): spec = self.spec targets = [] - if "+mpi1" in spec: + if spec.satisfies("+mpi1"): targets.append("MPI1") - if "+ext" in spec: + if spec.satisfies("+ext"): targets.append("EXT") - if "+io" in spec: + if spec.satisfies("+io"): targets.append("IO") - if "+nbc" in spec: + if spec.satisfies("+nbc"): targets.append("NBC") - if "+p2p" in spec: + if spec.satisfies("+p2p"): targets.append("P2P") - if "+rma" in spec: + if spec.satisfies("+rma"): targets.append("RMA") - if "+mt" in spec: + if spec.satisfies("+mt"): targets.append("MT") if spec.satisfies("@2019:"): targets = ["TARGET=" + target for target in targets] - if "+check" in spec: + if spec.satisfies("+check"): targets.append("CPPFLAGS=-DCHECK") return targets @@ -129,17 +129,17 @@ def install(self, spec, prefix): mkdir(prefix.bin) with working_dir(self.build_directory): - if "+mpi1" in spec: + if spec.satisfies("+mpi1"): install("IMB-MPI1", prefix.bin) - if "+ext" in spec: + if spec.satisfies("+ext"): install("IMB-EXT", prefix.bin) - if "+io" in spec: + if spec.satisfies("+io"): install("IMB-IO", prefix.bin) - if "+nbc" in spec: + if spec.satisfies("+nbc"): install("IMB-NBC", prefix.bin) - if "+p2p" in spec: + if spec.satisfies("+p2p"): install("IMB-P2P", prefix.bin) - if "+rma" in spec: + if spec.satisfies("+rma"): install("IMB-RMA", prefix.bin) - if "+mt" in spec: + if spec.satisfies("+mt"): install("IMB-MT", prefix.bin) diff --git a/var/spack/repos/builtin/packages/intel-oneapi-advisor/package.py b/var/spack/repos/builtin/packages/intel-oneapi-advisor/package.py index 545bee01d95f15..6523c0c1edd81e 100644 --- a/var/spack/repos/builtin/packages/intel-oneapi-advisor/package.py +++ b/var/spack/repos/builtin/packages/intel-oneapi-advisor/package.py @@ -24,6 +24,12 @@ class IntelOneapiAdvisor(IntelOneApiLibraryPackageWithSdk): "https://software.intel.com/content/www/us/en/develop/tools/oneapi/components/advisor.html" ) + version( + "2024.3.0", + url="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/e36c14f6-6142-44ff-b498-d4ff169cc8b0/l_oneapi_advisor_p_2024.3.0.43_offline.sh", + sha256="6d230a0d11b972c4c677e041a6077216de79037376f5776b3b291113e25335be", + expand=False, + ) version( "2024.2.1", url="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/65f69c5c-b41f-4688-8a41-ece8f2bbbb5a/l_oneapi_advisor_p_2024.2.1.44_offline.sh", diff --git a/var/spack/repos/builtin/packages/intel-oneapi-compilers/package.py b/var/spack/repos/builtin/packages/intel-oneapi-compilers/package.py index 3b35d9c3ae6fc0..9a965c2d50f56b 100644 --- a/var/spack/repos/builtin/packages/intel-oneapi-compilers/package.py +++ b/var/spack/repos/builtin/packages/intel-oneapi-compilers/package.py @@ -446,7 +446,11 @@ def extend_config_flags(self): llvm_flags.append("-Wno-unused-command-line-argument") self.write_config_file(common_flags + llvm_flags, self._llvm_bin, ["icx", "icpx"]) - self.write_config_file(common_flags + classic_flags, self._llvm_bin, ["ifx"]) + self.write_config_file( + common_flags + (llvm_flags if self.spec.satisfies("@2022.1.0:") else classic_flags), + self._llvm_bin, + ["ifx"], + ) self.write_config_file(common_flags + classic_flags, self._classic_bin, ["ifort"]) self.write_config_file(common_flags + classic_flags, self._classic_bin, ["icc", "icpc"]) diff --git a/var/spack/repos/builtin/packages/intel-oneapi-dal/package.py b/var/spack/repos/builtin/packages/intel-oneapi-dal/package.py index 5e4fa856f0ecfb..97bddf49d5a74a 100644 --- a/var/spack/repos/builtin/packages/intel-oneapi-dal/package.py +++ b/var/spack/repos/builtin/packages/intel-oneapi-dal/package.py @@ -26,6 +26,12 @@ class IntelOneapiDal(IntelOneApiLibraryPackage): "https://software.intel.com/content/www/us/en/develop/tools/oneapi/components/onedal.html" ) + version( + "2024.7.0", + url="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/ed2c397a-9a78-4466-9179-b39b7da07e83/l_daal_oneapi_p_2024.7.0.14_offline.sh", + sha256="aa7b072fe019ce253a111b38055f3949222d7be5231b4df2780a7ded16cd9097", + expand=False, + ) version( "2024.6.0", url="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/1edf7074-80f8-4b97-aad3-5023b41b7ecd/l_daal_oneapi_p_2024.6.0.418_offline.sh", diff --git a/var/spack/repos/builtin/packages/intel-oneapi-mkl/package.py b/var/spack/repos/builtin/packages/intel-oneapi-mkl/package.py index fc517708857ced..06c0252936da99 100644 --- a/var/spack/repos/builtin/packages/intel-oneapi-mkl/package.py +++ b/var/spack/repos/builtin/packages/intel-oneapi-mkl/package.py @@ -25,6 +25,12 @@ class IntelOneapiMkl(IntelOneApiLibraryPackage): "https://software.intel.com/content/www/us/en/develop/tools/oneapi/components/onemkl.html" ) + version( + "2024.2.2", + url="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/89a381f6-f85d-4dda-ae62-30d51470f53c/l_onemkl_p_2024.2.2.17_offline.sh", + sha256="6b64ab95567bee53d6cf7e78f9f7b15695902fb9da0d20c29e638ad001b6b348", + expand=False, + ) version( "2024.2.1", url="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/6e00e368-b61d-4f87-a409-9b510c022a37/l_onemkl_p_2024.2.1.105_offline.sh", diff --git a/var/spack/repos/builtin/packages/intel-oneapi-mpi/package.py b/var/spack/repos/builtin/packages/intel-oneapi-mpi/package.py index 98485a754af905..023af78e4a056d 100644 --- a/var/spack/repos/builtin/packages/intel-oneapi-mpi/package.py +++ b/var/spack/repos/builtin/packages/intel-oneapi-mpi/package.py @@ -157,15 +157,15 @@ def component_dir(self): @property def env_script_args(self): - if "+external-libfabric" in self.spec: + if self.spec.satisfies("+external-libfabric"): return ("-i_mpi_ofi_internal=0",) else: return () def wrapper_names(self): - if "+generic-names" in self.spec: + if self.spec.satisfies("+generic-names"): return ["mpicc", "mpicxx", "mpif77", "mpif90", "mpifc"] - elif "+classic-names" in self.spec: + elif self.spec.satisfies("+classic-names"): return ["mpiicc", "mpiicpc", "mpiifort", "mpiifort", "mpiifort"] else: return ["mpiicx", "mpiicpx", "mpiifx", "mpiifx", "mpiifx"] @@ -202,14 +202,14 @@ def setup_dependent_build_environment(self, env, dependent_spec): @property def libs(self): libs = [] - if "+ilp64" in self.spec: + if self.spec.satisfies("+ilp64"): libs += find_libraries("libmpi_ilp64", self.component_prefix.lib.release) libs += find_libraries(["libmpicxx", "libmpifort"], self.component_prefix.lib) libs += find_libraries("libmpi", self.component_prefix.lib.release) libs += find_system_libraries(["libdl", "librt", "libpthread"]) # Find libfabric for libmpi.so - if "+external-libfabric" in self.spec: + if self.spec.satisfies("+external-libfabric"): libs += self.spec["libfabric"].libs else: libs += find_libraries(["libfabric"], self.component_prefix.libfabric.lib) diff --git a/var/spack/repos/builtin/packages/intel-oneapi-runtime/package.py b/var/spack/repos/builtin/packages/intel-oneapi-runtime/package.py index 88e119e6979e84..961a8e301cff28 100644 --- a/var/spack/repos/builtin/packages/intel-oneapi-runtime/package.py +++ b/var/spack/repos/builtin/packages/intel-oneapi-runtime/package.py @@ -29,6 +29,7 @@ class IntelOneapiRuntime(Package): LIBRARIES = [ "imf", "intlc", + "irc", "irng", "svml", "ifcore", # Fortran diff --git a/var/spack/repos/builtin/packages/intel-oneapi-vtune/package.py b/var/spack/repos/builtin/packages/intel-oneapi-vtune/package.py index f11c5745726448..74700b30008346 100644 --- a/var/spack/repos/builtin/packages/intel-oneapi-vtune/package.py +++ b/var/spack/repos/builtin/packages/intel-oneapi-vtune/package.py @@ -25,6 +25,12 @@ class IntelOneapiVtune(IntelOneApiLibraryPackageWithSdk): homepage = "https://software.intel.com/content/www/us/en/develop/tools/oneapi/components/vtune-profiler.html" + version( + "2024.3.0", + url="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/d7e1fdb1-cfc7-40fb-bf46-3719e9372d67/l_oneapi_vtune_p_2024.3.0.31_offline.sh", + sha256="da9f45ee4a5ea337756e85e58e40b235417cffbca6813cf224db49061947253d", + expand=False, + ) version( "2024.2.1", url="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/d703d28b-d70b-4c90-bdb1-c3562c1084e5/l_oneapi_vtune_p_2024.2.1.68_offline.sh", diff --git a/var/spack/repos/builtin/packages/intel-pin/package.py b/var/spack/repos/builtin/packages/intel-pin/package.py index c884312358427f..b1acaf43de84f2 100644 --- a/var/spack/repos/builtin/packages/intel-pin/package.py +++ b/var/spack/repos/builtin/packages/intel-pin/package.py @@ -18,6 +18,26 @@ class IntelPin(Package): license("MIT") + version( + "3.31", + sha256="82216144e3df768f0203b671ff48605314f13266903eb42dac01b91310eba956", + url="https://software.intel.com/sites/landingpage/pintool/downloads/pin-external-3.31-98869-gfa6f126a8-gcc-linux.tar.gz", + ) + version( + "3.30", + sha256="be4f1130445c3fc4d83b7afad85c421d418f60013c33e8ee457bc7c9c194de1b", + url="https://software.intel.com/sites/landingpage/pintool/downloads/pin-3.30-98830-g1d7b601b3-gcc-linux.tar.gz", + ) + version( + "3.29", + sha256="45c2a68d4b2184117584a55db17b44c86f9476e9cb8109b2fae50a965b1ea64f", + url="https://software.intel.com/sites/landingpage/pintool/downloads/pin-3.29-98790-g1a445fcd1-gcc-linux.tar.gz", + ) + version( + "3.28", + sha256="5a5a3337f3f16176b97edcd3366b561936e1068fba4ebcfed4b836d81d45847b", + url="https://software.intel.com/sites/landingpage/pintool/downloads/pin-3.28-98749-g6643ecee5-gcc-linux.tar.gz", + ) version( "3.27", sha256="e7d44d25668632007d5a109e5033415e91db543b8ce9e665893a05e852b67707", diff --git a/var/spack/repos/builtin/packages/intel-tbb/package.py b/var/spack/repos/builtin/packages/intel-tbb/package.py index 3e71329a6384eb..f0c1fa95e52a99 100644 --- a/var/spack/repos/builtin/packages/intel-tbb/package.py +++ b/var/spack/repos/builtin/packages/intel-tbb/package.py @@ -187,7 +187,7 @@ def url_for_version(self, version): @property def libs(self): - shared = True if "+shared" in self.spec else False + shared = True if self.spec.satisfies("+shared") else False return find_libraries("libtbb*", root=self.prefix, shared=shared, recursive=True) diff --git a/var/spack/repos/builtin/packages/intel-xed/package.py b/var/spack/repos/builtin/packages/intel-xed/package.py index b1ff16d51f0fea..1d1a547d5d984b 100644 --- a/var/spack/repos/builtin/packages/intel-xed/package.py +++ b/var/spack/repos/builtin/packages/intel-xed/package.py @@ -124,11 +124,11 @@ def install(self, spec, prefix): "--no-werror", f"--prefix={prefix}", ) - if "+optimize" in spec: + if spec.satisfies("+optimize"): mfile.add_default_arg("--opt=2") - if "+debug" in spec: + if spec.satisfies("+debug"): mfile.add_default_arg("--debug") - if "+pic" in spec: + if spec.satisfies("+pic"): mfile.add_default_arg( f"--extra-ccflags={self.compiler.cc_pic_flag}", f"--extra-cxxflags={self.compiler.cxx_pic_flag}", @@ -144,11 +144,11 @@ def install(self, spec, prefix): mfile( f"--install-dir={shared_kit}", "--shared", - *(["examples"] if "+examples" in spec else []), + *(["examples"] if spec.satisfies("+examples") else []), "install", ) - if "+examples" in self.spec: + if self.spec.satisfies("+examples"): # Install the example binaries to share/xed/examples install_tree(join_path(shared_kit, "bin"), prefix.share.xed.examples) diff --git a/var/spack/repos/builtin/packages/ior/package.py b/var/spack/repos/builtin/packages/ior/package.py index d8bb3f97e968d8..72e4a62c81ef33 100644 --- a/var/spack/repos/builtin/packages/ior/package.py +++ b/var/spack/repos/builtin/packages/ior/package.py @@ -66,18 +66,18 @@ def configure_args(self): env["CC"] = spec["mpi"].mpicc - if "+hdf5" in spec: + if spec.satisfies("+hdf5"): config_args.append("--with-hdf5") config_args.append("CFLAGS=-D H5_USE_16_API") else: config_args.append("--without-hdf5") - if "+ncmpi" in spec: + if spec.satisfies("+ncmpi"): config_args.append("--with-ncmpi") else: config_args.append("--without-ncmpi") - if "+lustre" in spec: + if spec.satisfies("+lustre"): config_args.append("--with-lustre") else: config_args.append("--without-lustre") diff --git a/var/spack/repos/builtin/packages/ipm/package.py b/var/spack/repos/builtin/packages/ipm/package.py index f522fb7296963c..9eb248ff526f40 100644 --- a/var/spack/repos/builtin/packages/ipm/package.py +++ b/var/spack/repos/builtin/packages/ipm/package.py @@ -79,25 +79,25 @@ def autoreconf(self, spec, prefix): def configure_args(self): args = [] spec = self.spec - if "+papi" in spec: + if spec.satisfies("+papi"): args.append("--with-papi={0}".format(spec["papi"].prefix)) - if "+cuda" in spec: + if spec.satisfies("+cuda"): args.append("--with-cudapath={0}".format(spec["cuda"].prefix)) - if "+libunwind" in spec: + if spec.satisfies("+libunwind"): args.append("--with-libunwind={0}".format(spec["libunwind"].prefix)) - if "+papi_multiplexing" in spec: + if spec.satisfies("+papi_multiplexing"): args.append("--enable-papi-multiplexing") - if "+posixio" in spec: + if spec.satisfies("+posixio"): args.append("--enable-posixio") - if "+pmon" in spec: + if spec.satisfies("+pmon"): args.append("--enable-pmon") - if "+coll_details" in spec: + if spec.satisfies("+coll_details"): args.append("--enable-coll-details") args.extend( diff --git a/var/spack/repos/builtin/packages/ipopt/ipopt_mumps_mpi_comm_option.patch b/var/spack/repos/builtin/packages/ipopt/ipopt_mumps_mpi_comm_option.patch new file mode 100644 index 00000000000000..44c15cfbf47f8a --- /dev/null +++ b/var/spack/repos/builtin/packages/ipopt/ipopt_mumps_mpi_comm_option.patch @@ -0,0 +1,56 @@ +diff --git a/src/Algorithm/LinearSolvers/IpMumpsSolverInterface.cpp b/src/Algorithm/LinearSolvers/IpMumpsSolverInterface.cpp +index 62089361..306966b4 100644 +--- a/src/Algorithm/LinearSolvers/IpMumpsSolverInterface.cpp ++++ b/src/Algorithm/LinearSolvers/IpMumpsSolverInterface.cpp +@@ -97,13 +97,11 @@ MumpsSolverInterface::MumpsSolverInterface() + mumps_->job = -1; //initialize mumps + mumps_->par = 1; //working host for sequential version + mumps_->sym = 2; //general symmetric matrix +- mumps_->comm_fortran = USE_COMM_WORLD; + + #ifndef IPOPT_MUMPS_NOMUTEX + const std::lock_guard lock(mumps_call_mutex); + #endif + +- mumps_c(mumps_); + mumps_->icntl[2] = 0; // global info stream + mumps_->icntl[3] = 0; // print level + mumps_ptr_ = (void*) mumps_; +@@ -180,6 +178,11 @@ void MumpsSolverInterface::RegisterOptions( + "Threshold to consider a pivot at zero in detection of linearly dependent constraints with MUMPS.", + 0.0, + "This is CNTL(3) in MUMPS.", true); ++ roptions->AddIntegerOption( ++ "mumps_mpi_communicator", ++ "MPI communicator used for matrix operations", ++ USE_COMM_WORLD, ++ "This sets the MPI communicator. MPI_COMM_WORLD is the default. Any other value should be the return value from MPI_Comm_c2f"); + } + + /// give name of MUMPS with version info +@@ -217,13 +220,24 @@ bool MumpsSolverInterface::InitializeImpl( + options.GetIntegerValue("mumps_scaling", mumps_scaling_, prefix); + options.GetNumericValue("mumps_dep_tol", mumps_dep_tol_, prefix); + ++ MUMPS_STRUC_C* mumps_ = static_cast(mumps_ptr_); ++ ++#ifndef IPOPT_MUMPS_NOMUTEX ++ const std::lock_guard lock(mumps_call_mutex); ++#endif ++ ++ Index mpi_comm; ++ options.GetIntegerValue("mumps_mpi_communicator", mpi_comm, prefix); ++ mumps_->comm_fortran = static_cast(mpi_comm); ++ ++ mumps_c(mumps_); ++ + // Reset all private data + initialized_ = false; + pivtol_changed_ = false; + refactorize_ = false; + have_symbolic_factorization_ = false; + +- MUMPS_STRUC_C* mumps_ = static_cast(mumps_ptr_); + if( !warm_start_same_structure_ ) + { + mumps_->n = 0; diff --git a/var/spack/repos/builtin/packages/ipopt/package.py b/var/spack/repos/builtin/packages/ipopt/package.py index 39f63123bef358..e4912b437da775 100644 --- a/var/spack/repos/builtin/packages/ipopt/package.py +++ b/var/spack/repos/builtin/packages/ipopt/package.py @@ -12,10 +12,13 @@ class Ipopt(AutotoolsPackage): homepage = "https://github.com/coin-or/Ipopt" url = "https://github.com/coin-or/Ipopt/archive/refs/tags/releases/3.13.2.tar.gz" - maintainers("goxberry") + maintainers("chapman39", "tepperly") license("EPL-2.0") + version("3.14.14", sha256="264d2d3291cd1cd2d0fa0ad583e0a18199e3b1378c3cb015b6c5600083f1e036") + version("3.14.13", sha256="2afcb057e7cf8ed7e07f50ee0a4a06d2e4d39e0f964777e9dd55fe56199a5e0a") + version("3.14.12", sha256="6b06cd6280d5ca52fc97ca95adaaddd43529e6e8637c274e21ee1072c3b4577f") version("3.14.9", sha256="e12eba451269ec30f4cf6e2acb8b35399f0d029c97dff10465416f5739c8cf7a") version("3.14.5", sha256="9ebbbbf14a64e998e3fba5d2662a8f9bd03f97b1406017e78ae54e5d105ae932") version("3.14.4", sha256="60865150b6fad19c5968395b57ff4a0892380125646c3afa2a714926f5ac9487") @@ -43,19 +46,19 @@ class Ipopt(AutotoolsPackage): version("3.12.1", sha256="bde8c415136bb38d5a3c5935757399760c6cabf67e9362702e59ab6027f030ec") version("3.12.0", sha256="b42f44eb53540205ede4584cced5d88a7b3ec2f1fac6e173a105496307e273a0") - depends_on("c", type="build") # generated - depends_on("cxx", type="build") # generated - depends_on("fortran", type="build") # generated + depends_on("c", type="build") + depends_on("cxx", type="build") variant("coinhsl", default=False, description="Build with Coin Harwell Subroutine Libraries") variant("metis", default=False, description="Build with METIS partitioning support") variant("debug", default=False, description="Build debug instead of optimized version") variant("mumps", default=True, description="Build with support for linear solver MUMPS") + variant("java", default=False, description="Include Java support") depends_on("blas") depends_on("lapack") depends_on("pkgconfig", type="build") - depends_on("mumps+double~mpi", when="+mumps") + depends_on("mumps+double", when="+mumps") depends_on("coinhsl", when="+coinhsl") depends_on("metis@4.0:", when="+metis") @@ -63,6 +66,7 @@ class Ipopt(AutotoolsPackage): conflicts("~mumps", when="~coinhsl") patch("ipopt_ppc_build.patch", when="arch=ppc64le") + patch("ipopt_mumps_mpi_comm_option.patch", when="+mumps") flag_handler = build_system_flags build_directory = "spack-build" @@ -93,9 +97,11 @@ def configure_args(self): else: args.extend(["--with-lapack-lflags={0} {1}".format(lapack_lib, blas_lib)]) - if "+mumps" in spec: + if spec.satisfies("+mumps"): mumps_dir = spec["mumps"].prefix - mumps_flags = "-ldmumps -lmumps_common -lpord -lmpiseq" + mumps_flags = "-ldmumps -lmumps_common -lpord" + if "^mumps~mpi" in spec: + mumps_flags = mumps_flags + "-lmpiseq" mumps_libcmd = "-L%s " % mumps_dir.lib + mumps_flags if spec.satisfies("@:3.12.13"): args.extend( @@ -112,8 +118,10 @@ def configure_args(self): "--with-mumps-cflags=%s" % mumps_dir.include, ] ) + if "^mumps+mpi" in spec: + args.extend(["--disable-mpiinit"]) - if "coinhsl" in spec: + if spec.satisfies("+coinhsl"): hsl_ld_flags = "-ldl {0}".format(spec["coinhsl"].libs.ld_flags) if spec.satisfies("^coinhsl+blas"): @@ -134,8 +142,12 @@ def configure_args(self): "--with-hsl-cflags=%s" % spec["coinhsl"].prefix.include, ] ) + else: + # Fixes dynamic linking errors relating to failure to find hsllib.so + if spec.satisfies("@3.13:"): + args.extend(["--without-hsl"]) - if "metis" in spec: + if spec.satisfies("+metis"): if spec.satisfies("@:3.12.13"): args.extend( [ @@ -144,10 +156,15 @@ def configure_args(self): ] ) + if spec.satisfies("+java"): + args.extend(["--enable-java"]) + else: + args.extend(["--disable-java"]) + # The IPOPT configure file states that '--enable-debug' implies # '--disable-shared', but adding '--enable-shared' overrides # '--disable-shared' and builds a shared library with debug symbols - if "+debug" in spec: + if spec.satisfies("+debug"): args.append("--enable-debug") else: args.append("--disable-debug") diff --git a/var/spack/repos/builtin/packages/iproute2/package.py b/var/spack/repos/builtin/packages/iproute2/package.py index 3232bee99d2874..967cdaebfdae55 100644 --- a/var/spack/repos/builtin/packages/iproute2/package.py +++ b/var/spack/repos/builtin/packages/iproute2/package.py @@ -9,8 +9,8 @@ class Iproute2(AutotoolsPackage): """This is a set of utilities for Linux networking.""" - homepage = "https://github.com/shemminger/iproute2" - url = "https://github.com/shemminger/iproute2/archive/v5.9.0.tar.gz" + homepage = "https://wiki.linuxfoundation.org/networking/iproute2" + url = "https://github.com/iproute2/iproute2/archive/v5.9.0.tar.gz" depends_on("bison", type="build") depends_on("flex", type="build") @@ -18,6 +18,13 @@ class Iproute2(AutotoolsPackage): license("GPL-2.0-or-later") + version("6.11.0", sha256="e5ad1c86aa788a979ba1b68cd6ee948b37983d99efabf6a0bf556b061569cc4d") + version("6.10.0", sha256="060ee42dfcdf8b9daf9f986eee26d16ac5bdf39c8784702957b13bebec538541") + version("6.2.0", sha256="813d41443d4ee0b189531e0d63f955ce94367ef80b184bcd27a30be86ae715e0") + version("6.1.0", sha256="63b6057041be86fee8af3468d86fdc1eb2afe1d56500f298413baf89575eff1e") + version("6.0.0", sha256="0a92b8d04710ab4e649ec25eb919768ba44d3047f26e80621368689d0f3c5a59") + version("5.17.0", sha256="ab5ed83d901d42a8dd5ec539ab8de35c65f921f002331fc7adfd359def33158d") + version("5.15.0", sha256="e10161fabe68714b34d565b6efff41b987ffec077f79beec497688c155881ea6") version("5.11.0", sha256="16b79e6ce65d4d5fd425cef2fd92a58c403a93faeeed0e0a3202b36a8e857d1f") version("5.10.0", sha256="164f1de457eefbdadb98d82c309a0977542b34e7a2dfe81e497a0b93675cb3d2") version("5.9.0", sha256="1afde56d416f136b1236ac2f8276e4edbe114ca3c2ab12f11af11b84cf0992e4") diff --git a/var/spack/repos/builtin/packages/iq-tree/package.py b/var/spack/repos/builtin/packages/iq-tree/package.py index 15ac27772a7b40..25bc11cf593066 100644 --- a/var/spack/repos/builtin/packages/iq-tree/package.py +++ b/var/spack/repos/builtin/packages/iq-tree/package.py @@ -57,13 +57,13 @@ def cmake_args(self): args = [] iqflags = [] - if "+lsd2" in spec: + if spec.satisfies("+lsd2"): args.append("-DUSE_LSD2=ON") - if "+openmp" in spec: + if spec.satisfies("+openmp"): iqflags.append("omp") - if "+mpi" in spec: + if spec.satisfies("+mpi"): iqflags.append("mpi") if not iqflags: diff --git a/var/spack/repos/builtin/packages/ispc/package.py b/var/spack/repos/builtin/packages/ispc/package.py index b15ced302a766d..f892540c6780d4 100644 --- a/var/spack/repos/builtin/packages/ispc/package.py +++ b/var/spack/repos/builtin/packages/ispc/package.py @@ -27,6 +27,7 @@ class Ispc(CMakePackage): license("BSD-3-Clause") version("main", branch="main") + version("1.24.0", sha256="fac82c8f3f7ece2bc96620cef0b34e10b29462de9349447bcd8c3ba98cfdcd72") version("1.23.0", sha256="e268eabed9a9021b4402725ed1c120b8eca776ee4aaf50ddeb0e4adaadda05f9") version("1.22.0", sha256="1f115eeed7df5028c19c9b256887949ca88c29c146f641b031d8e080297f5acd") version("1.21.1", sha256="99bbb1d1f15bc4433d6a63b5bb35b321af3e3af753c3b28a61850d1748e8a89f") @@ -56,6 +57,7 @@ class Ispc(CMakePackage): depends_on("llvm libcxx=none", when="platform=darwin", type="build") depends_on("llvm targets=arm,aarch64", when="target=arm:", type="build") depends_on("llvm targets=arm,aarch64", when="target=aarch64:", type="build") + depends_on("llvm@:18.1", when="@:1.24", type="build") depends_on("llvm@:17", when="@:1.23", type="build") depends_on("llvm@:15", when="@:1.20", type="build") depends_on("llvm@:14", when="@:1.18", type="build") diff --git a/var/spack/repos/builtin/packages/istio/package.py b/var/spack/repos/builtin/packages/istio/package.py index 76161511121f4b..fd824e7234c50d 100644 --- a/var/spack/repos/builtin/packages/istio/package.py +++ b/var/spack/repos/builtin/packages/istio/package.py @@ -8,21 +8,31 @@ from spack.package import * _versions = { + "1.23.2": { + "Linux-aarch64": "c2f1ca6cec376cb7eaff5807124b6d7ebcef9c84ff9f3fb7ad3ed1e942cfefab", + "Linux-x86_64": "c4bbcb95e3015f63f9aa76ac07a544d4c2f46d6d3b20971559d9216eb07b676b", + }, + # Deprecated versions + # https://nvd.nist.gov/vuln/detail/CVE-2022-31045 "1.6.7": { "Linux-aarch64": "22b0f94efafe9f221c00f4599d9a04e473554515e5fdf8d119fd27e27e36c89f", "Linux-x86_64": "3243d2c4bb7a116aa04a6bc21d289fb73cdc704988af1749d2a1f0fb5426be36", + "deprecated": True, }, "1.6.6": { "Linux-aarch64": "b122a0abde24b7680194f504815db5e054483b3657292a6150104e9d129787a5", "Linux-x86_64": "3f092ffb3a1c13eccfadb42fe14166049535945f349241f90a91d97e57036da7", + "deprecated": True, }, "1.6.5": { "Linux-aarch64": "c32ed12be0e2bb33bae510fd6b680656990bf2c2ba6059277b6f463a195355a0", "Linux-x86_64": "68e58e8aec544c2b72377f7c334f90f6215bc819f3ed71ac952692cc5c9b73ac", + "deprecated": True, }, "1.6.4": { "Linux-aarch64": "700416965f48f91ce5a654513b5aa4ed56dd5875e98af203389b3d20d55016b2", "Linux-x86_64": "97ce26edad734b4a324b1a3914cead3a38ac70a029dbe09777a483ec192d04df", + "deprecated": True, }, } @@ -41,7 +51,7 @@ class Istio(Package): key = "{0}-{1}".format(platform.system(), platform.machine()) sha_val = packages.get(key) if sha_val: - version(ver, sha256=sha_val) + version(ver, sha256=sha_val, deprecated=packages.get("deprecated", False)) def url_for_version(self, version): url = "https://github.com/istio/istio/releases/download/{0}/istio-{0}-linux-{1}.tar.gz" diff --git a/var/spack/repos/builtin/packages/itensor/package.py b/var/spack/repos/builtin/packages/itensor/package.py index 4efc48948abc7c..12ba468096a722 100644 --- a/var/spack/repos/builtin/packages/itensor/package.py +++ b/var/spack/repos/builtin/packages/itensor/package.py @@ -92,12 +92,12 @@ def edit(self, spec, prefix): filter_file(r"^BLAS_LAPACK_LIBFLAGS.+", vlib, mf) # 3.HDF5 - if "+hdf5" in spec: + if spec.satisfies("+hdf5"): hdf5p = f"HDF5_PREFIX={spec['hdf5'].prefix.lib}" filter_file("^#HDF5.+", hdf5p, mf) # 4.openmp - if "+openmp" in spec: + if spec.satisfies("+openmp"): filter_file("#ITENSOR_USE_OMP", "ITENSOR_USE_OMP", mf) filter_file("-fopenmp", self.compiler.openmp_flag, mf) @@ -105,7 +105,7 @@ def edit(self, spec, prefix): filter_file(r"^PREFIX.+", f"PREFIX={os.getcwd()}", mf) # 5.shared - if "+shared" in spec: + if spec.satisfies("+shared"): filter_file("ITENSOR_MAKE_DYLIB=0", "ITENSOR_MAKE_DYLIB=1", mf) def install(self, spec, prefix): diff --git a/var/spack/repos/builtin/packages/json-c/package.py b/var/spack/repos/builtin/packages/json-c/package.py index fbd69a01b6ac22..59da279e5e79fc 100644 --- a/var/spack/repos/builtin/packages/json-c/package.py +++ b/var/spack/repos/builtin/packages/json-c/package.py @@ -48,11 +48,10 @@ def patch(self): filter_file("-Werror", "", "CMakeLists.txt") def flag_handler(self, name, flags): - iflags = [] if name == "cflags": if self.spec.satisfies("%oneapi"): - iflags.append("-Wno-error=implicit-function-declaration") - return (iflags, None, None) + flags.append("-Wno-error=implicit-function-declaration") + return (flags, None, None) @run_after("install") def darwin_fix(self): diff --git a/var/spack/repos/builtin/packages/julia/package.py b/var/spack/repos/builtin/packages/julia/package.py index c912c9aab4e8f7..0508410e896f9f 100644 --- a/var/spack/repos/builtin/packages/julia/package.py +++ b/var/spack/repos/builtin/packages/julia/package.py @@ -26,12 +26,16 @@ class Julia(MakefilePackage): maintainers("vchuravy", "haampie", "giordano") version("master", branch="master") + version("1.11.0", sha256="a938c6b7758a83e817b56db3e542bd85e6d74db75e1381b1ba24cd6e3dc8c566") + version("1.10.4", sha256="c46ed8166fe860a7258d088a0add68dfdf11ad64cc4c0b1f113570862d3ef777") version("1.10.3", sha256="b3cd34c839d25b98a162070b4e3abd5f34564ffdad13e07073be7885e5678a18") version("1.10.2", sha256="e3d20c02975da054aeb18d32ed84c5d760d54d2563e45e25017684a5a105d185") + version("1.9.3", sha256="8d7dbd8c90e71179e53838cdbe24ff40779a90d7360e29766609ed90d982081d") version("1.9.2", sha256="015438875d591372b80b09d01ba899657a6517b7c72ed41222298fef9d4ad86b") version("1.9.0", sha256="48f4c8a7d5f33d0bc6ce24226df20ab49e385c2d0c3767ec8dfdb449602095b2") + version("1.8.5", sha256="d31026cc6b275d14abce26fd9fd5b4552ac9d2ce8bde4291e494468af5743031") version("1.8.4", sha256="b7b8ee64fb947db8d61104f231e1b25342fe330d29e0d2273f93c264f32c5333") version("1.8.3", sha256="4d8d460fcae5c6f8306a3e3c14371635c1a26f47c3ce62b2950cf9234b6ec849") @@ -66,9 +70,24 @@ class Julia(MakefilePackage): depends_on("libuv", when="@:1.7") depends_on("libuv-julia@1.42.0", when="@1.8.0:1.8.1") depends_on("libuv-julia@1.44.2", when="@1.8.2:1.9") - depends_on("libuv-julia@1.44.3", when="@1.10.0:") + depends_on("libuv-julia@1.44.3", when="@1.10.0:1.10") + depends_on("libuv-julia@1.48.0", when="@1.11.0:") depends_on("suite-sparse@5.4:5.10", when="@1.6:1.9") + with when("@1.11.0:1.11"): + # libssh2.so.1, libpcre2-8.so.0, libmbedtls.so.14, libmbedcrypto.so.7, libmbedx509.so.1, + # libopenlibm.so.4, libblastrampoline.so.5, libgit2.so.1.7, libnghttp2.so.14, + # libcurl.so.4 + depends_on("libblastrampoline@5.11.0:5") + depends_on("libgit2@1.7.2:1.7") + depends_on("libssh2@1.11") + depends_on("llvm@16.0.6 +lld shlib_symbol_version=JL_LLVM_16.0") + depends_on("mbedtls@2.28.2:2.28") + depends_on("openlibm@0.8.1:0.8", when="+openlibm") + depends_on("nghttp2@1.59.0:1.59") + depends_on("curl@8.6.0:") + depends_on("suite-sparse@7.7.0") + with when("@1.10.0:1.10"): # libssh2.so.1, libpcre2-8.so.0, libmbedtls.so.14, libmbedcrypto.so.7, libmbedx509.so.1, # libopenlibm.so.4, libblastrampoline.so.5, libgit2.so.1.6, libnghttp2.so.14, @@ -174,6 +193,14 @@ class Julia(MakefilePackage): sha256="25cdc0271e7722d4a7cc6f72abcb17bfe205fc741bbe3716a21759c3eee7d32c", ), ) + depends_on( + "llvm", + when="^llvm@16.0.6", + patches=patch( + "https://raw.githubusercontent.com/spack/patches/d042ae8f41493547d4263d249a13546f2c971972/julia/4997cd3006a3171d9b33f9a72ff9fdadc84e91a7c86aa044dcf495eef3a02893.patch", + sha256="4997cd3006a3171d9b33f9a72ff9fdadc84e91a7c86aa044dcf495eef3a02893", + ), + ) # Patches for libuv depends_on( diff --git a/var/spack/repos/builtin/packages/justbuild/package.py b/var/spack/repos/builtin/packages/justbuild/package.py index 7261ed86a3f62d..18c4939dd26651 100644 --- a/var/spack/repos/builtin/packages/justbuild/package.py +++ b/var/spack/repos/builtin/packages/justbuild/package.py @@ -24,6 +24,7 @@ class Justbuild(Package): license("Apache-2.0") version("master", branch="master") + version("1.3.2", tag="v1.3.2", commit="27a56845398b07471f8185648a79a63f97851659") version("1.3.1", tag="v1.3.1", commit="b248838ed0f01bc5824caee3a555e7fd22d5ad10") version("1.3.0", tag="v1.3.0", commit="a7be2417f358049e6a0e28e01bc4020d8de2fdc5") version("1.2.5", tag="v1.2.5", commit="0f7447e3f50e68ecfe00b2db06fb5f154842ac5a") diff --git a/var/spack/repos/builtin/packages/kafka/package.py b/var/spack/repos/builtin/packages/kafka/package.py index 2c46dfc2d4cb66..85f4ec7e3745dd 100644 --- a/var/spack/repos/builtin/packages/kafka/package.py +++ b/var/spack/repos/builtin/packages/kafka/package.py @@ -21,7 +21,15 @@ class Kafka(Package): license("EPL-2.0") version( - "2.13-3.7.0", sha256="65f26e5937bbb76dfe78dfb416730dfa7e3378b27e13fd1e204f1a1099bfaf9c" + "2.13-3.8.0", sha256="e0297cc6fdb09ef9d9905751b25d2b629c17528f8629b60561eeff87ce29099c" + ) + version( + "2.13-3.7.1", sha256="62acae4a143dd983dc7eb4804d5744ba0c50b199b508f599ef001020e2558fc9" + ) + version( + "2.13-3.7.0", + sha256="65f26e5937bbb76dfe78dfb416730dfa7e3378b27e13fd1e204f1a1099bfaf9c", + deprecated=True, ) version( "2.13-3.5.1", sha256="f7b74d544023f2c0ec52a179de59975cb64e34ea03650d829328b407b560e4da" diff --git a/var/spack/repos/builtin/packages/kahip/cstdint.patch b/var/spack/repos/builtin/packages/kahip/cstdint.patch new file mode 100644 index 00000000000000..01831e824e5da7 --- /dev/null +++ b/var/spack/repos/builtin/packages/kahip/cstdint.patch @@ -0,0 +1,11 @@ +diff -Naur spack-src/lib/io/mmap_graph_io.h spack-src/lib/io/mmap_graph_io.patched.h +--- spack-src/lib/io/mmap_graph_io.h 2024-08-22 17:56:05.689983013 +0200 ++++ spack-src/lib/io/mmap_graph_io.patched.h 2024-08-22 17:58:10.915413214 +0200 +@@ -1,6 +1,7 @@ + #pragma once + + #include ++#include + #include + #include + #include diff --git a/var/spack/repos/builtin/packages/kahip/package.py b/var/spack/repos/builtin/packages/kahip/package.py index 6a757784c120dc..314e37296c697d 100644 --- a/var/spack/repos/builtin/packages/kahip/package.py +++ b/var/spack/repos/builtin/packages/kahip/package.py @@ -69,6 +69,8 @@ class Kahip(CMakePackage): patch("fix-sconstruct-for-py3.patch", when="@2:2.10 ^python@3:") patch("fix-sconstruct-for-py3-v2.00.patch", when="@2.00 ^python@3:") + patch("cstdint.patch", when="@3:") + # 'when' decorators to override new CMake build approach (old build was SConstruct). @when("@:2.10") def patch(self): diff --git a/var/spack/repos/builtin/packages/kaldi/package.py b/var/spack/repos/builtin/packages/kaldi/package.py index 0f115e244fffda..7411a8e257e327 100644 --- a/var/spack/repos/builtin/packages/kaldi/package.py +++ b/var/spack/repos/builtin/packages/kaldi/package.py @@ -58,28 +58,30 @@ def install(self, spec, prefix): configure_args.append("--speex-root=" + spec["speex"].prefix) configure_args.append("--cub-root=" + spec["cuda"].prefix.include) - if "~shared" in spec: + if spec.satisfies("~shared"): configure_args.append("--static") else: configure_args.append("--shared") - if "^openblas" in spec: + if spec.satisfies("^[virtuals=blas] openblas"): configure_args.append("--mathlib=OPENBLAS") configure_args.append("--openblas-root=" + spec["blas"].prefix) if "+openmp" in spec["blas"].variants: configure_args.append("--threaded-math=yes") - elif "^atlas" in spec: + elif spec.satisfies("^[virtuals=blas] atlas"): configure_args.append("--mathlib=ATLAS") configure_args.append("--atlas-root=" + spec["blas"].prefix) if "+pthread" in spec["blas"].variants: configure_args.append("--threaded-atlas") - elif "^intel-parallel-studio" in spec or "^intel-mkl" in spec: + elif spec.satisfies("^[virtuals=blas] intel-parallel-studio") or spec.satisfies( + "^[virtuals=blas] intel-mkl" + ): configure_args.append("--mathlib=MKL") configure_args.append("--mkl-root=" + spec["blas"].prefix.mkl) if "+openmp" in spec["blas"].variants: configure_args.append("--mkl-threading=iomp") - if "+cuda" in spec: + if spec.satisfies("+cuda"): configure_args.append("--use-cuda=yes") configure_args.append("--cudatk-dir=" + spec["cuda"].prefix) diff --git a/var/spack/repos/builtin/packages/kassiopeia/package.py b/var/spack/repos/builtin/packages/kassiopeia/package.py index e6912a446c1758..75f2b63c8f8bdf 100644 --- a/var/spack/repos/builtin/packages/kassiopeia/package.py +++ b/var/spack/repos/builtin/packages/kassiopeia/package.py @@ -63,7 +63,7 @@ def patch(self): ) def cmake_args(self): - if "+root" in self.spec: + if self.spec.satisfies("+root"): cxxstd = self.spec["root"].variants["cxxstd"].value else: if self.spec.satisfies("@:3.8.1"): diff --git a/var/spack/repos/builtin/packages/keepalived/package.py b/var/spack/repos/builtin/packages/keepalived/package.py index 757111350a1cf4..58042c927d9359 100644 --- a/var/spack/repos/builtin/packages/keepalived/package.py +++ b/var/spack/repos/builtin/packages/keepalived/package.py @@ -17,6 +17,7 @@ class Keepalived(AutotoolsPackage): license("GPL-2.0-only") + version("2.3.1", sha256="92f4b69bfd998e2306d1995ad16fdad1b59e70be694c883385c5f55e02c62aa3") version("2.0.19", sha256="0e2f8454765bc6a5fa26758bd9cec18aae42882843cdd24848aff0ae65ce4ca7") version("2.0.18", sha256="1423a2b1b8e541211029b9e1e1452e683bbe5f4b0b287eddd609aaf5ff024fd0") version("2.0.17", sha256="8965ffa2ffe243014f9c0245daa65f00a9930cf746edf33525d28a86f97497b4") @@ -27,7 +28,8 @@ class Keepalived(AutotoolsPackage): version("2.0.12", sha256="fd50e433d784cfd948de5726752cf89ab7001f587fe10a5110c6c7cbda4b7b5e") version("2.0.11", sha256="a298b0c02a20959cfc365b62c14f45abd50d5e0595b2869f5bce10ec2392fa48") - depends_on("c", type="build") # generated + depends_on("c", type="build") + depends_on("pkgconfig", type="build") depends_on("openssl") diff --git a/var/spack/repos/builtin/packages/kicad/package.py b/var/spack/repos/builtin/packages/kicad/package.py index be431d8a0eafe7..04ce3b555fcd55 100644 --- a/var/spack/repos/builtin/packages/kicad/package.py +++ b/var/spack/repos/builtin/packages/kicad/package.py @@ -130,6 +130,5 @@ def install_libraries(self): for ver, lib, checksum in self.resource_list: if self.spec.version == Version(ver): with working_dir("kicad-{0}-{1}".format(lib, ver)): - args = std_cmake_args - cmake(*args) + cmake(*self.std_cmake_args) make("install") diff --git a/var/spack/repos/builtin/packages/kokkos-kernels/package.py b/var/spack/repos/builtin/packages/kokkos-kernels/package.py index e4af48534f5fb8..f8dc26ad8969e3 100644 --- a/var/spack/repos/builtin/packages/kokkos-kernels/package.py +++ b/var/spack/repos/builtin/packages/kokkos-kernels/package.py @@ -25,6 +25,7 @@ class KokkosKernels(CMakePackage, CudaPackage): # openssl sha256 kokkos-kernels-x.y.z.tar.gz version("develop", branch="develop") version("master", branch="master") + version("4.4.01", sha256="9f741449f5ace5a7d8a5a81194ff2108e5525d16f08fcd9bb6c9bb4853d7720d") version("4.4.00", sha256="6559871c091eb5bcff53bae5a0f04f2298971d1aa1b2c135bd5a2dae3f9376a2") version("4.3.01", sha256="749553a6ea715ba1e56fa0b13b42866bb9880dba7a94e343eadf40d08c68fab8") version("4.3.00", sha256="03c3226ee97dbca4fa56fe69bc4eefa0673e23c37f2741943d9362424a63950e") @@ -52,6 +53,7 @@ class KokkosKernels(CMakePackage, CudaPackage): depends_on("kokkos") depends_on("kokkos@master", when="@master") depends_on("kokkos@develop", when="@develop") + depends_on("kokkos@4.4.01", when="@4.4.01") depends_on("kokkos@4.4.00", when="@4.4.00") depends_on("kokkos@4.3.01", when="@4.3.01") depends_on("kokkos@4.3.00", when="@4.3.00") @@ -165,11 +167,15 @@ class KokkosKernels(CMakePackage, CudaPackage): variant("shared", default=True, description="Build shared libraries") + # sanity check + sanity_check_is_file = [join_path("include", "KokkosKernels_config.h")] + sanity_check_is_dir = ["include"] + def cmake_args(self): spec = self.spec options = [] - isdiy = "+diy" in spec + isdiy = spec.satisfies("+diy") if isdiy: options.append("-DSpack_WORKAROUND=On") diff --git a/var/spack/repos/builtin/packages/kokkos-legacy/package.py b/var/spack/repos/builtin/packages/kokkos-legacy/package.py index a9c9a7706ebcd0..c0eebf980c7ecd 100644 --- a/var/spack/repos/builtin/packages/kokkos-legacy/package.py +++ b/var/spack/repos/builtin/packages/kokkos-legacy/package.py @@ -246,7 +246,7 @@ def install(self, spec, prefix): cuda_options_args = [] # PIC - if "+pic" in spec: + if spec.satisfies("+pic"): g_args.append("--cxxflags=-fPIC") # C++ standard @@ -255,19 +255,19 @@ def install(self, spec, prefix): g_args.append(f"--cxxstandard={cxxstandard}") # Build Debug - if "+debug" in spec: + if spec.satisfies("+debug"): g_args.append("--debug") # Backends - if "+serial" in spec: + if spec.satisfies("+serial"): g_args.append("--with-serial") - if "+openmp" in spec: + if spec.satisfies("+openmp"): g_args.append("--with-openmp") - if "+pthreads" in spec: + if spec.satisfies("+pthreads"): g_args.append("--with-pthread") - if "+qthreads" in spec: + if spec.satisfies("+qthreads"): g_args.append(f"--with-qthreads={spec['qthreads'].prefix}") - if "+cuda" in spec: + if spec.satisfies("+cuda"): g_args.append(f"--with-cuda={spec['cuda'].prefix}") # Host architectures host_arch = spec.variants["host_arch"].value @@ -282,31 +282,31 @@ def install(self, spec, prefix): g_args.append(f"--arch={','.join(arch_args)}") # CUDA options - if "+force_uvm" in spec: + if spec.satisfies("+force_uvm"): cuda_options_args.append("force_uvm") - if "+use_ldg" in spec: + if spec.satisfies("+use_ldg"): cuda_options_args.append("use_ldg") - if "+rdc" in spec: + if spec.satisfies("+rdc"): cuda_options_args.append("rdc") - if "+enable_lambda" in spec: + if spec.satisfies("+enable_lambda"): cuda_options_args.append("enable_lambda") if cuda_options_args: g_args.append(f"--with-cuda-options={','.join(cuda_options_args)}") # Kokkos options - if "+aggressive_vectorization" in spec: + if spec.satisfies("+aggressive_vectorization"): kokkos_options_args.append("aggressive_vectorization") - if "+disable_profiling" in spec: + if spec.satisfies("+disable_profiling"): kokkos_options_args.append("disable_profiling") - if "+disable_dualview_modify_check" in spec: + if spec.satisfies("+disable_dualview_modify_check"): kokkos_options_args.append("disable_dualview_modify_check") - if "+enable_profile_load_print" in spec: + if spec.satisfies("+enable_profile_load_print"): kokkos_options_args.append("enable_profile_load_print") - if "+compiler_warnings" in spec: + if spec.satisfies("+compiler_warnings"): kokkos_options_args.append("compiler_warnings") - if "+disable_deprecated_code" in spec: + if spec.satisfies("+disable_deprecated_code"): kokkos_options_args.append("disable_deprecated_code") - if "+enable_eti" in spec: + if spec.satisfies("+enable_eti"): kokkos_options_args.append("enable_eti") if kokkos_options_args: g_args.append(f"--with-options={','.join(kokkos_options_args)}") diff --git a/var/spack/repos/builtin/packages/kokkos-nvcc-wrapper/package.py b/var/spack/repos/builtin/packages/kokkos-nvcc-wrapper/package.py index 3768fcff0673aa..ae8aca3945b592 100644 --- a/var/spack/repos/builtin/packages/kokkos-nvcc-wrapper/package.py +++ b/var/spack/repos/builtin/packages/kokkos-nvcc-wrapper/package.py @@ -21,6 +21,7 @@ class KokkosNvccWrapper(Package): license("BSD-3-Clause") + version("4.4.01", sha256="3f7096d17eaaa4004c7497ac082bf1ae3ff47b5104149e54af021a89414c3682") version("4.4.00", sha256="c638980cb62c34969b8c85b73e68327a2cb64f763dd33e5241f5fd437170205a") version("4.3.01", sha256="5998b7c732664d6b5e219ccc445cd3077f0e3968b4be480c29cd194b4f45ec70") version("4.3.00", sha256="53cf30d3b44dade51d48efefdaee7a6cf109a091b702a443a2eda63992e5fe0d") diff --git a/var/spack/repos/builtin/packages/kokkos/package.py b/var/spack/repos/builtin/packages/kokkos/package.py index 5229561ffcc6b9..fe9989afb5f8d6 100644 --- a/var/spack/repos/builtin/packages/kokkos/package.py +++ b/var/spack/repos/builtin/packages/kokkos/package.py @@ -27,6 +27,7 @@ class Kokkos(CMakePackage, CudaPackage, ROCmPackage): version("master", branch="master") version("develop", branch="develop") + version("4.4.01", sha256="3f7096d17eaaa4004c7497ac082bf1ae3ff47b5104149e54af021a89414c3682") version("4.4.00", sha256="c638980cb62c34969b8c85b73e68327a2cb64f763dd33e5241f5fd437170205a") version("4.3.01", sha256="5998b7c732664d6b5e219ccc445cd3077f0e3968b4be480c29cd194b4f45ec70") version("4.3.00", sha256="53cf30d3b44dade51d48efefdaee7a6cf109a091b702a443a2eda63992e5fe0d") @@ -264,6 +265,13 @@ class Kokkos(CMakePackage, CudaPackage, ROCmPackage): "KokkosConfigCommon.cmake", relative_root=os.path.join("lib64", "cmake", "Kokkos") ) + # sanity check + sanity_check_is_file = [ + join_path("include", "KokkosCore_config.h"), + join_path("include", "Kokkos_Core.hpp"), + ] + sanity_check_is_dir = ["bin", "include"] + @classmethod def get_microarch(cls, target): """Get the Kokkos microarch name for a Spack target (spec.target).""" @@ -312,7 +320,7 @@ def cmake_args(self): ] spack_microarches = [] - if "+cuda" in spec: + if spec.satisfies("+cuda"): if isinstance(spec.variants["cuda_arch"].value, str): cuda_arch = spec.variants["cuda_arch"].value else: @@ -328,7 +336,7 @@ def cmake_args(self): if kokkos_microarch_name: spack_microarches.append(kokkos_microarch_name) - if "+rocm" in spec: + if spec.satisfies("+rocm"): for amdgpu_target in spec.variants["amdgpu_target"].value: if amdgpu_target != "none": if amdgpu_target in self.amdgpu_arch_map: @@ -352,10 +360,10 @@ def cmake_args(self): if spec.variants[tpl].value: options.append(self.define(tpl + "_DIR", spec[tpl].prefix)) - if "+rocm" in self.spec: + if self.spec.satisfies("+rocm"): options.append(self.define("CMAKE_CXX_COMPILER", self.spec["hip"].hipcc)) options.append(self.define("Kokkos_ENABLE_ROCTHRUST", True)) - elif "+wrapper" in self.spec: + elif self.spec.satisfies("+wrapper"): options.append( self.define("CMAKE_CXX_COMPILER", self.spec["kokkos-nvcc-wrapper"].kokkos_cxx) ) @@ -367,11 +375,7 @@ def cmake_args(self): # which breaks GPU-aware with Cray-MPICH # See https://github.com/kokkos/kokkos/pull/6402 # TODO: disable this once Cray-MPICH is fixed - if ( - self.spec.satisfies("@4.2.00:") - and "mpi" in self.spec - and self.spec["mpi"].name == "cray-mpich" - ): + if self.spec.satisfies("@4.2.00:") and self.spec.satisfies("^[virtuals=mpi] cray-mpich"): options.append(self.define("Kokkos_ENABLE_IMPL_CUDA_MALLOC_ASYNC", False)) # Remove duplicate options @@ -408,8 +412,12 @@ def test_run(self): raise SkipTest(f"{cmake_path} is missing") cmake = self.spec["cmake"].command - cmake(cmake_path, "-DEXECUTABLE_OUTPUT_PATH=" + cmake_path) + cmake_args = ["-DEXECUTABLE_OUTPUT_PATH=" + cmake_path] + if self.spec.satisfies("+rocm"): + prefix_paths = ";".join(spack.build_environment.get_cmake_prefix_path(self)) + cmake_args.append("-DCMAKE_PREFIX_PATH={0}".format(prefix_paths)) + cmake(cmake_path, *cmake_args) make = which("make") make() make(cmake_path, "test") diff --git a/var/spack/repos/builtin/packages/krakenuniq/package.py b/var/spack/repos/builtin/packages/krakenuniq/package.py index 53d8b865bdc33a..848dc0b9b4adb4 100644 --- a/var/spack/repos/builtin/packages/krakenuniq/package.py +++ b/var/spack/repos/builtin/packages/krakenuniq/package.py @@ -35,7 +35,7 @@ class Krakenuniq(Package): def install(self, spec, prefix): local_script = which("./install_krakenuniq.sh") - if "+jellyfish" in self.spec: + if self.spec.satisfies("+jellyfish"): local_script("-j", prefix.bin) else: local_script(prefix.bin) diff --git a/var/spack/repos/builtin/packages/krims/package.py b/var/spack/repos/builtin/packages/krims/package.py index 17ba1149a48d7e..2670d5d0b8f81e 100644 --- a/var/spack/repos/builtin/packages/krims/package.py +++ b/var/spack/repos/builtin/packages/krims/package.py @@ -68,10 +68,10 @@ def cmake_args(self): args = [ "-DAUTOCHECKOUT_MISSING_REPOS=OFF", # - "-DBUILD_SHARED_LIBS=" + str("+shared" in spec), + "-DBUILD_SHARED_LIBS=" + str(spec.satisfies("+shared")), # TODO Hard-disable tests for now, since rapidcheck not in Spack "-DKRIMS_ENABLE_TESTS=OFF", - "-DKRIMS_ENABLE_EXAMPLES=" + str("+examples" in spec), + "-DKRIMS_ENABLE_EXAMPLES=" + str(spec.satisfies("+examples")), ] return args diff --git a/var/spack/repos/builtin/packages/kripke/package.py b/var/spack/repos/builtin/packages/kripke/package.py index 7bd6c2dc7c7242..2cfabaed50fc1e 100644 --- a/var/spack/repos/builtin/packages/kripke/package.py +++ b/var/spack/repos/builtin/packages/kripke/package.py @@ -103,14 +103,14 @@ def cmake_args(self): ] ) - if "+caliper" in spec: + if spec.satisfies("+caliper"): args.append("-DENABLE_CALIPER=ON") - if "+mpi" in spec: + if spec.satisfies("+mpi"): args.append("-DENABLE_MPI=ON") args.append(self.define("CMAKE_CXX_COMPILER", self.spec["mpi"].mpicxx)) - if "+rocm" in spec: + if spec.satisfies("+rocm"): # Set up the hip macros needed by the build args.append("-DENABLE_HIP=ON") args.append("-DHIP_ROOT_DIR={0}".format(spec["hip"].prefix)) @@ -123,7 +123,7 @@ def cmake_args(self): # Ensure build with hip is disabled args.append("-DENABLE_HIP=OFF") - if "+cuda" in spec: + if spec.satisfies("+cuda"): args.append("-DENABLE_CUDA=ON") args.append(self.define("CMAKE_CUDA_HOST_COMPILER", self.spec["mpi"].mpicxx)) if not spec.satisfies("cuda_arch=none"): diff --git a/var/spack/repos/builtin/packages/kubectl/package.py b/var/spack/repos/builtin/packages/kubectl/package.py index b36f26f37ad256..f5d03af3fa3646 100644 --- a/var/spack/repos/builtin/packages/kubectl/package.py +++ b/var/spack/repos/builtin/packages/kubectl/package.py @@ -6,7 +6,7 @@ from spack.package import * -class Kubectl(Package): +class Kubectl(GoPackage): """ Kubectl is a command-line interface for Kubernetes clusters. """ @@ -18,18 +18,12 @@ class Kubectl(Package): license("Apache-2.0") + version("1.31.1", sha256="83094915698a9c24f93d1ffda3f17804a4024d3b65eabf681e77a62b35137208") + version("1.31.0", sha256="6679eb90815cc4c3bef6c1b93f7a8451bf3f40d003f45ab57fdc9f8c4e8d4b4f") version("1.27.1", sha256="3a3f7c6b8cf1d9f03aa67ba2f04669772b1205b89826859f1636062d5f8bec3f") version("1.27.0", sha256="536025dba2714ee5e940bb0a6b1df9ca97c244fa5b00236e012776a69121c323") - depends_on("c", type="build") # generated - depends_on("bash", type="build") - depends_on("go", type="build") - - phases = ["build", "install"] - - def build(self, spec, prefix): - make("-f", "build/root/Makefile", "WHAT=cmd/kubectl") + depends_on("go@1.22:", type="build", when="@1.30:") - def install(self, spec, prefix): - install_tree("_output/bin", prefix.bin) + build_directory = "cmd/kubectl" diff --git a/var/spack/repos/builtin/packages/kvtree/package.py b/var/spack/repos/builtin/packages/kvtree/package.py index a7d091f23fc16f..68328da1975431 100644 --- a/var/spack/repos/builtin/packages/kvtree/package.py +++ b/var/spack/repos/builtin/packages/kvtree/package.py @@ -55,7 +55,7 @@ def cmake_args(self): spec = self.spec args = [] args.append(self.define_from_variant("MPI")) - if "+mpi" in spec: + if spec.satisfies("+mpi"): args.append(self.define("MPI_C_COMPILER", spec["mpi"].mpicc)) args.append(self.define_from_variant("KVTREE_FILE_LOCK", "file_lock")) diff --git a/var/spack/repos/builtin/packages/laghos/package.py b/var/spack/repos/builtin/packages/laghos/package.py index fb4277d20e8c14..0c3b59cc40ce47 100644 --- a/var/spack/repos/builtin/packages/laghos/package.py +++ b/var/spack/repos/builtin/packages/laghos/package.py @@ -63,7 +63,7 @@ def build_targets(self): targets.append("TEST_MK=%s" % spec["mfem"].package.test_mk) if spec.satisfies("@:2.0"): targets.append("CXX=%s" % spec["mpi"].mpicxx) - if "+ofast %gcc" in self.spec: + if self.spec.satisfies("+ofast %gcc"): targets.append("CXXFLAGS = -Ofast -finline-functions") return targets diff --git a/var/spack/repos/builtin/packages/lammps-example-plugin/package.py b/var/spack/repos/builtin/packages/lammps-example-plugin/package.py index e82a8d4a471f12..4233b0da2b3c0f 100644 --- a/var/spack/repos/builtin/packages/lammps-example-plugin/package.py +++ b/var/spack/repos/builtin/packages/lammps-example-plugin/package.py @@ -26,6 +26,11 @@ class LammpsExamplePlugin(CMakePackage): # marked deprecated=True # * patch releases older than a stable release should be marked deprecated=True version("develop", branch="develop") + version( + "20240829", + sha256="6112e0cc352c3140a4874c7f74db3c0c8e30134024164509ecf3772b305fde2e", + preferred=True, + ) version("20240627", sha256="2174a99d266279823a8c57629ee1c21ec357816aefd85f964d9f859fe9222aa5") version("20240417", sha256="158b288725c251fd8b30dbcf61749e0d6a042807da92af865a7d3c413efdd8ea") version( @@ -38,9 +43,10 @@ class LammpsExamplePlugin(CMakePackage): ) version("20231121", sha256="704d8a990874a425bcdfe0245faf13d712231ba23f014a3ebc27bc14398856f1") version( - "20230802.3", - sha256="6666e28cb90d3ff01cbbda6c81bdb85cf436bbb41604a87f2ab2fa559caa8510", - preferred=True, + "20230802.4", sha256="6eed007cc24cda80b5dd43372b2ad4268b3982bb612669742c8c336b79137b5b" + ) + version( + "20230802.3", sha256="6666e28cb90d3ff01cbbda6c81bdb85cf436bbb41604a87f2ab2fa559caa8510" ) depends_on("cxx", type="build") @@ -59,7 +65,7 @@ def url_for_version(self, version): update, ) - depends_on("lammps+plugin+lib") + depends_on("lammps+plugin+lib+openmp-package") root_cmakelists_dir = "examples/plugins" @@ -67,7 +73,7 @@ def patch(self): with open("examples/plugins/CMakeLists.txt", "a") as f: print("include(GNUInstallDirs)", file=f) print( - "install(TARGETS morse2plugin nve2plugin helloplugin zero2plugin morse2plugin" + "install(TARGETS morse2plugin nve2plugin helloplugin zero2plugin morse2plugin " "LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/lammps/plugins)", file=f, ) diff --git a/var/spack/repos/builtin/packages/lammps/package.py b/var/spack/repos/builtin/packages/lammps/package.py index 69163fb93c8345..7486b5272196ef 100644 --- a/var/spack/repos/builtin/packages/lammps/package.py +++ b/var/spack/repos/builtin/packages/lammps/package.py @@ -5,6 +5,7 @@ import datetime as dt import os +from spack.build_environment import optimization_flags from spack.package import * @@ -29,21 +30,43 @@ class Lammps(CMakePackage, CudaPackage, ROCmPackage, PythonExtension): # marked deprecated=True # * patch releases older than a stable release should be marked deprecated=True version("develop", branch="develop") - version("20240627", sha256="2174a99d266279823a8c57629ee1c21ec357816aefd85f964d9f859fe9222aa5") - version("20240417", sha256="158b288725c251fd8b30dbcf61749e0d6a042807da92af865a7d3c413efdd8ea") version( - "20240207.1", sha256="3ba62c2a1ed463fceedf313a1c3ea2997994aa102379a8d35b525ea424f56776" + "20240829", + sha256="6112e0cc352c3140a4874c7f74db3c0c8e30134024164509ecf3772b305fde2e", + preferred=True, + ) + version( + "20240627", + sha256="2174a99d266279823a8c57629ee1c21ec357816aefd85f964d9f859fe9222aa5", + deprecated=True, + ) + version( + "20240417", + sha256="158b288725c251fd8b30dbcf61749e0d6a042807da92af865a7d3c413efdd8ea", + deprecated=True, + ) + version( + "20240207.1", + sha256="3ba62c2a1ed463fceedf313a1c3ea2997994aa102379a8d35b525ea424f56776", + deprecated=True, ) version( "20240207", sha256="d518f32de4eb2681f2543be63926411e72072dd7d67c1670c090b5baabed98ac", deprecated=True, ) - version("20231121", sha256="704d8a990874a425bcdfe0245faf13d712231ba23f014a3ebc27bc14398856f1") + version( + "20231121", + sha256="704d8a990874a425bcdfe0245faf13d712231ba23f014a3ebc27bc14398856f1", + deprecated=True, + ) + version( + "20230802.4", sha256="6eed007cc24cda80b5dd43372b2ad4268b3982bb612669742c8c336b79137b5b" + ) version( "20230802.3", sha256="6666e28cb90d3ff01cbbda6c81bdb85cf436bbb41604a87f2ab2fa559caa8510", - preferred=True, + deprecated=True, ) version( "20230802.2", @@ -372,7 +395,7 @@ class Lammps(CMakePackage, CudaPackage, ROCmPackage, PythonExtension): depends_on("cxx", type="build") # mdi, scafacos, ml-quip, qmmm require C, but not available in Spack - for c_pkg in ("adios", "atc", "awpmd", "ml-pod", "electrode", "kim", "h5md", "tools"): + for c_pkg in ("adios", "atc", "awpmd", "ml-pod", "electrode", "kim", "h5md", "tools", "rheo"): depends_on("c", type="build", when=f"+{c_pkg}") # scafacos, ml-quip require Fortran, but not available in Spack @@ -380,6 +403,8 @@ class Lammps(CMakePackage, CudaPackage, ROCmPackage, PythonExtension): depends_on("fortran", type="build", when=f"+{fc_pkg}") stable_versions = { + "20240829", + "20230802.4", "20230802.3", "20230802.2", "20230802.1", @@ -495,6 +520,7 @@ def url_for_version(self, version): "reaction": {"when": "@20210702:"}, "reax": {"when": "@:20181212"}, "reaxff": {"when": "@20210702:"}, + "rheo": {"when": "@20240829:"}, "replica": {}, "rigid": {"default": True}, "shock": {}, @@ -569,6 +595,7 @@ def url_for_version(self, version): variant("jpeg", default=False, description="Build with jpeg support") variant("png", default=False, description="Build with png support") variant("ffmpeg", default=False, description="Build with ffmpeg support") + variant("curl", default=False, description="Build with curl support", when="@20240829:") variant("openmp", default=True, description="Build with OpenMP") variant("opencl", default=False, description="Build with OpenCL") variant( @@ -658,6 +685,7 @@ def url_for_version(self, version): depends_on("jpeg", when="+jpeg") depends_on("kim-api", when="+kim") depends_on("curl", when="@20190329:+kim") + depends_on("curl", when="+curl") depends_on("libpng", when="+png") depends_on("ffmpeg", when="+ffmpeg") depends_on("kokkos+deprecated_code+shared@3.0.00", when="@20200303+kokkos") @@ -688,6 +716,7 @@ def url_for_version(self, version): depends_on("hipcub", when="~kokkos +rocm") depends_on("llvm-amdgpu ", when="+rocm", type="build") depends_on("rocm-openmp-extras", when="+rocm +openmp", type="build") + depends_on("gsl@2.6:", when="+rheo") # propagate CUDA and ROCm architecture when +kokkos for arch in CudaPackage.cuda_arch_values: @@ -706,7 +735,6 @@ def url_for_version(self, version): conflicts("+cuda", when="+opencl") conflicts("+rocm", when="+opencl") conflicts("+body", when="+poems@:20180628") - conflicts("+latte", when="@:20170921") conflicts("+python", when="~lib") conflicts("+qeq", when="~manybody") conflicts("+user-atc", when="~manybody") @@ -756,6 +784,12 @@ def url_for_version(self, version): sha256="3dedd807f63a21c543d1036439099f05c6031fd98e7cb1ea7825822fc074106e", when="@20220623.3:20230208 +kokkos +rocm +kspace", ) + # Fixed in https://github.com/lammps/lammps/pull/4305 + patch( + "https://github.com/lammps/lammps/commit/49bdc3e26449634f150602a66d0dab34d09dbc0e.patch?full_index=1", + sha256="b8d1f08a82329e493e040de2bde9d2291af173a0fe6c7deb24750cc22823c421", + when="@20240829 %cce", + ) # Older LAMMPS does not compile with Kokkos 4.x conflicts( @@ -810,12 +844,12 @@ def cmake_args(self): self.define("ENABLE_TESTING", self.run_tests), self.define("DOWNLOAD_POTENTIALS", False), ] - if "~kokkos" in spec: + if spec.satisfies("~kokkos"): # LAMMPS can be build with the GPU package OR the KOKKOS package # Using both in a single build is discouraged. # +cuda only implies that one of the two is used # by default it will use the GPU package if kokkos wasn't enabled - if "+cuda" in spec: + if spec.satisfies("+cuda"): args.append(self.define("PKG_GPU", True)) args.append(self.define("GPU_API", "cuda")) args.append(self.define_from_variant("GPU_PREC", "gpu_precision")) @@ -823,13 +857,13 @@ def cmake_args(self): if cuda_arch != "none": args.append(self.define("GPU_ARCH", "sm_{0}".format(cuda_arch[0]))) args.append(self.define_from_variant("CUDA_MPS_SUPPORT", "cuda_mps")) - elif "+opencl" in spec: + elif spec.satisfies("+opencl"): # LAMMPS downloads and bundles its own OpenCL ICD Loader by default args.append(self.define("USE_STATIC_OPENCL_LOADER", False)) args.append(self.define("PKG_GPU", True)) args.append(self.define("GPU_API", "opencl")) args.append(self.define_from_variant("GPU_PREC", "gpu_precision")) - elif "+rocm" in spec: + elif spec.satisfies("+rocm"): args.append(self.define("PKG_GPU", True)) args.append(self.define("GPU_API", "hip")) args.append(self.define_from_variant("GPU_PREC", "gpu_precision")) @@ -865,7 +899,7 @@ def cmake_args(self): args.append(self.define("CMAKE_CXX_FLAGS_RELWITHDEBINFO", cxx_flags)) # Overwrite generic cpu tune option - cmake_tune_flags = spec.architecture.target.optimization_flags(spec.compiler) + cmake_tune_flags = optimization_flags(self.compiler, spec.target) args.append(self.define("CMAKE_TUNE_FLAGS", cmake_tune_flags)) args.append(self.define_from_variant("LAMMPS_SIZES", "lammps_sizes")) @@ -873,6 +907,7 @@ def cmake_args(self): args.append(self.define_from_variant("WITH_JPEG", "jpeg")) args.append(self.define_from_variant("WITH_PNG", "png")) args.append(self.define_from_variant("WITH_FFMPEG", "ffmpeg")) + args.append(self.define_from_variant("WITH_CURL", "curl")) for pkg, params in self.supported_packages.items(): if "when" not in params or spec.satisfies(params["when"]): @@ -891,27 +926,27 @@ def cmake_args(self): # for transposing 3d FFT data. args.append(self.define("FFT_SINGLE", spec.satisfies("fftw_precision=single"))) - if "+user-adios" in spec or "+adios" in spec: + if spec.satisfies("+user-adios") or spec.satisfies("+adios"): args.append(self.define("ADIOS2_DIR", self.spec["adios2"].prefix)) - if "+user-plumed" in spec or "+plumed" in spec: + if spec.satisfies("+user-plumed") or spec.satisfies("+plumed"): args.append(self.define("DOWNLOAD_PLUMED", False)) if "+shared" in self.spec["plumed"]: args.append(self.define("PLUMED_MODE", "shared")) else: args.append(self.define("PLUMED_MODE", "static")) - if "+user-smd" in spec or "+machdyn" in spec: + if spec.satisfies("+user-smd") or spec.satisfies("+machdyn"): args.append(self.define("DOWNLOAD_EIGEN3", False)) args.append(self.define("EIGEN3_INCLUDE_DIR", self.spec["eigen"].prefix.include)) - if "+user-hdnnp" in spec or "+ml-hdnnp" in spec: + if spec.satisfies("+user-hdnnp") or spec.satisfies("+ml-hdnnp"): args.append(self.define("DOWNLOAD_N2P2", False)) args.append(self.define("N2P2_DIR", self.spec["n2p2"].prefix)) - if "+rocm" in spec: + if spec.satisfies("+rocm"): args.append(self.define("CMAKE_CXX_COMPILER", spec["hip"].hipcc)) - if "@:20231121" in spec: - if "^hip@:5.4" in spec: + if spec.satisfies("@:20231121"): + if spec.satisfies("^hip@:5.4"): args.append(self.define("HIP_PATH", f"{spec['hip'].prefix}/hip")) - elif "^hip@5.5:" in spec: + elif spec.satisfies("^hip@5.5:"): args.append(self.define("HIP_PATH", spec["hip"].prefix)) return args @@ -922,14 +957,14 @@ def setup_build_environment(self, env): def setup_run_environment(self, env): env.set("LAMMPS_POTENTIALS", self.prefix.share.lammps.potentials) - if "+python" in self.spec: + if self.spec.satisfies("+python"): if self.spec.platform == "darwin": env.prepend_path("DYLD_FALLBACK_LIBRARY_PATH", self.prefix.lib) env.prepend_path("DYLD_FALLBACK_LIBRARY_PATH", self.prefix.lib64) else: env.prepend_path("LD_LIBRARY_PATH", self.prefix.lib) env.prepend_path("LD_LIBRARY_PATH", self.prefix.lib64) - if "+plugin" in self.spec: + if self.spec.satisfies("+plugin"): env.prepend_path("LAMMPS_PLUGIN_PATH", self.prefix.lib.lammps.plugins) env.prepend_path("LAMMPS_PLUGIN_PATH", self.prefix.lib64.lammps.plugins) diff --git a/var/spack/repos/builtin/packages/lapackpp/package.py b/var/spack/repos/builtin/packages/lapackpp/package.py index c295cf716f6e1f..db32de97e15430 100644 --- a/var/spack/repos/builtin/packages/lapackpp/package.py +++ b/var/spack/repos/builtin/packages/lapackpp/package.py @@ -104,15 +104,15 @@ def cmake_args(self): backend = "none" if self.version >= Version("2022.07.00"): - if "+cuda" in spec: + if spec.satisfies("+cuda"): backend = "cuda" - if "+rocm" in spec: + if spec.satisfies("+rocm"): backend = "hip" - if "+sycl" in spec: + if spec.satisfies("+sycl"): backend = "sycl" args = [ - "-DBUILD_SHARED_LIBS=%s" % ("+shared" in spec), + "-DBUILD_SHARED_LIBS=%s" % spec.satisfies("+shared"), "-Dbuild_tests=%s" % self.run_tests, "-DLAPACK_LIBRARIES=%s" % spec["lapack"].libs.joined(";"), "-Dgpu_backend=%s" % backend, diff --git a/var/spack/repos/builtin/packages/latex2html/package.py b/var/spack/repos/builtin/packages/latex2html/package.py index cc9346e4faa044..a37e7a964c3b05 100644 --- a/var/spack/repos/builtin/packages/latex2html/package.py +++ b/var/spack/repos/builtin/packages/latex2html/package.py @@ -119,7 +119,7 @@ def configure_args(self): exe = which(p) if exe: args.append("--with-{0}={1}".format(p, str(exe))) - if "+svg" in spec: + if spec.satisfies("+svg"): p = "pdftocairo" exe = join_path(spec["poppler"].prefix.bin, p) if os.path.exists(exe): diff --git a/var/spack/repos/builtin/packages/latte/package.py b/var/spack/repos/builtin/packages/latte/package.py index 735d478a1dfe0b..19a9a4927511b9 100644 --- a/var/spack/repos/builtin/packages/latte/package.py +++ b/var/spack/repos/builtin/packages/latte/package.py @@ -40,13 +40,13 @@ class Latte(CMakePackage): def cmake_args(self): options = [] - if "+shared" in self.spec: + if self.spec.satisfies("+shared"): options.append("-DBUILD_SHARED_LIBS=ON") else: options.append("-DBUILD_SHARED_LIBS=OFF") - if "+mpi" in self.spec: + if self.spec.satisfies("+mpi"): options.append("-DO_MPI=yes") - if "+progress" in self.spec: + if self.spec.satisfies("+progress"): options.append("-DPROGRESS=yes") blas_list = ";".join(self.spec["blas"].libs) diff --git a/var/spack/repos/builtin/packages/laynii/package.py b/var/spack/repos/builtin/packages/laynii/package.py new file mode 100644 index 00000000000000..54332bd2edc367 --- /dev/null +++ b/var/spack/repos/builtin/packages/laynii/package.py @@ -0,0 +1,31 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +import glob + +from spack.package import * + + +class Laynii(MakefilePackage): + """Stand alone fMRI software suite for layer-fMRI analyses.""" + + homepage = "https://layerfmri.com" + url = "https://github.com/layerfMRI/LAYNII/archive/refs/tags/v2.7.0.tar.gz" + + license("BSD-3-Clause") + + version("2.7.0", sha256="f0f45c6e80afaca1d89a4721dda70f152c175434e19358974a221ef9c713826b") + + depends_on("cxx", type="build") + + depends_on("zlib") + + def edit(self, spec, prefix): + pass + + def install(self, spec, prefix): + mkdir(prefix.bin) + for file in glob.glob("LN*"): + install(file, prefix.bin) diff --git a/var/spack/repos/builtin/packages/lazygit/package.py b/var/spack/repos/builtin/packages/lazygit/package.py index 517dbb29842195..7ef76106b866a9 100644 --- a/var/spack/repos/builtin/packages/lazygit/package.py +++ b/var/spack/repos/builtin/packages/lazygit/package.py @@ -17,7 +17,10 @@ class Lazygit(GoPackage): license("MIT") + version("0.44.1", sha256="02b67d38e07ae89b0ddd3b4917bd0cfcdfb5e158ed771566d3eb81f97f78cc26") version("0.41.0", sha256="f2176fa253588fe4b7118bf83f4316ae3ecb914ae1e99aad8c474e23cea49fb8") version("0.40.2", sha256="146bd63995fcf2f2373bbc2143b3565b7a2be49a1d4e385496265ac0f69e4128") - depends_on("c", type="build") # generated + depends_on("go@1.20:", type="build", when="@0.40:") + depends_on("go@1.21:", type="build", when="@0.41:") + depends_on("go@1.22:", type="build", when="@0.42:") diff --git a/var/spack/repos/builtin/packages/lazyten/package.py b/var/spack/repos/builtin/packages/lazyten/package.py index 76edae2c609e40..9b426725591e74 100644 --- a/var/spack/repos/builtin/packages/lazyten/package.py +++ b/var/spack/repos/builtin/packages/lazyten/package.py @@ -75,10 +75,10 @@ def cmake_args(self): args = [ "-DAUTOCHECKOUT_MISSING_REPOS=OFF", # - "-DBUILD_SHARED_LIBS=" + str("+shared" in spec), + "-DBUILD_SHARED_LIBS=" + str(spec.satisfies("+shared")), # TODO Hard-disable tests for now, since rapidcheck not in Spack "-DLAZYTEN_ENABLE_TESTS=OFF", - "-DLAZYTEN_ENABLE_EXAMPLES=" + str("+examples" in spec), + "-DLAZYTEN_ENABLE_EXAMPLES=" + str(spec.satisfies("+examples")), ] # Tell lazyten where to look for the krims cmake config @@ -98,7 +98,7 @@ def cmake_args(self): ] ) - if "+arpack" in spec: + if spec.satisfies("+arpack"): args.append("-DARPACK_DIR=" + spec["arpack-ng"].prefix) args.append("-DARPACK_LIBRARY=" + ";".join(spec["arpack-ng"].libs)) diff --git a/var/spack/repos/builtin/packages/lbann/package.py b/var/spack/repos/builtin/packages/lbann/package.py index 63db92d0353caf..0686530d21c5a1 100644 --- a/var/spack/repos/builtin/packages/lbann/package.py +++ b/var/spack/repos/builtin/packages/lbann/package.py @@ -226,7 +226,7 @@ class Lbann(CachedCMakePackage, CudaPackage, ROCmPackage): depends_on("python@3: +shared", type=("build", "run"), when="+pfe") extends("python", when="+pfe") depends_on("py-setuptools", type="build", when="+pfe") - depends_on("py-protobuf+cpp@3.10.0:4.21.12", type=("build", "run"), when="+pfe") + depends_on("py-protobuf@3.10.0:4.21.12", type=("build", "run"), when="+pfe") depends_on("protobuf@3.10.0:3.21.12") depends_on("zlib-api", when="^protobuf@3.11.0:") @@ -266,7 +266,7 @@ def _get_sys_type(self, spec): @property def libs(self): - shared = True if "+shared" in self.spec else False + shared = True if self.spec.satisfies("+shared") else False return find_libraries("liblbann", root=self.prefix, shared=shared, recursive=True) @property @@ -286,7 +286,7 @@ def initconfig_compiler_entries(self): spec = self.spec entries = super().initconfig_compiler_entries() entries.append(cmake_cache_string("CMAKE_CXX_STANDARD", "17")) - entries.append(cmake_cache_option("BUILD_SHARED_LIBS", "+shared" in spec)) + entries.append(cmake_cache_option("BUILD_SHARED_LIBS", spec.satisfies("+shared"))) if not spec.satisfies("^cmake@3.23.0"): # There is a bug with using Ninja generator in this version # of CMake @@ -298,7 +298,7 @@ def initconfig_compiler_entries(self): entries.append(cmake_cache_string("CMAKE_SHARED_LINKER_FLAGS", linker_flags)) # Use lld high performance linker - if "+lld" in spec: + if spec.satisfies("+lld"): entries.append( cmake_cache_string( "CMAKE_EXE_LINKER_FLAGS", "{0} -fuse-ld=lld".format(linker_flags) @@ -311,7 +311,7 @@ def initconfig_compiler_entries(self): ) # Use gold high performance linker - if "+gold" in spec: + if spec.satisfies("+gold"): entries.append( cmake_cache_string( "CMAKE_EXE_LINKER_FLAGS", "{0} -fuse-ld=gold".format(linker_flags) @@ -340,7 +340,7 @@ def initconfig_hardware_entries(self): spec = self.spec entries = super().initconfig_hardware_entries() - if "+cuda" in spec: + if spec.satisfies("+cuda"): if self.spec.satisfies("%clang"): for flag in self.spec.compiler_flags["cxxflags"]: if "gcc-toolchain" in flag: @@ -393,7 +393,9 @@ def initconfig_package_entries(self): entries.append(cmake_cache_option("LBANN_WITH_ALUMINUM", True)) entries.append(cmake_cache_option("LBANN_WITH_CONDUIT", True)) entries.append(cmake_cache_option("LBANN_WITH_HWLOC", True)) - entries.append(cmake_cache_option("LBANN_WITH_ROCTRACER", "+rocm +distconv" in spec)) + entries.append( + cmake_cache_option("LBANN_WITH_ROCTRACER", spec.satisfies("+rocm +distconv")) + ) entries.append(cmake_cache_option("LBANN_WITH_TBINF", False)) entries.append( cmake_cache_string("LBANN_DATATYPE", "{0}".format(spec.variants["dtype"].value)) diff --git a/var/spack/repos/builtin/packages/lc-framework/package.py b/var/spack/repos/builtin/packages/lc-framework/package.py index 085fb07bafe932..60ff03576b29a8 100644 --- a/var/spack/repos/builtin/packages/lc-framework/package.py +++ b/var/spack/repos/builtin/packages/lc-framework/package.py @@ -43,7 +43,7 @@ class LcFramework(CMakePackage, CudaPackage): def cmake_args(self): args = [self.define_from_variant("LC_BUILD_LIBPRESSIO_PLUGIN", "libpressio")] - if "+cuda" in self.spec: + if self.spec.satisfies("+cuda"): args.append(self.define_from_variant("LC_BUILD_CUDA", "cuda")) args.append(self.builder.define_cuda_architectures(self)) diff --git a/var/spack/repos/builtin/packages/lcio/package.py b/var/spack/repos/builtin/packages/lcio/package.py index cd6b34540e1bbd..c768ee39be1f1c 100644 --- a/var/spack/repos/builtin/packages/lcio/package.py +++ b/var/spack/repos/builtin/packages/lcio/package.py @@ -21,6 +21,7 @@ class Lcio(CMakePackage): license("BSD-3-Clause") version("master", branch="master") + version("2.22.2", sha256="e5ad9690af85160ef52dd407fc0995451b4293f3aee415a8ea8a950de63d87a1") version("2.22.1", sha256="4bc3d2c83af7b1c65d6736dd14ee82f41af7ce9bfc7cfe779c5f47417e8dc326") version("2.22", sha256="95676977a0427f5ecc857e8504b13f332c2c2e5769dc00f6beecff3c73dab395") version("2.21", sha256="a9f0a9922ab2ef17c6f1b8f7187bfc341f27567745a43c0480c103b617dfcea6") diff --git a/var/spack/repos/builtin/packages/lcms/package.py b/var/spack/repos/builtin/packages/lcms/package.py index 42ee9af89fec07..ce452131b2f394 100644 --- a/var/spack/repos/builtin/packages/lcms/package.py +++ b/var/spack/repos/builtin/packages/lcms/package.py @@ -3,10 +3,12 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) +import pathlib + from spack.package import * -class Lcms(AutotoolsPackage): +class Lcms(AutotoolsPackage, MSBuildPackage): """Little cms is a color management library. Implements fast transforms between ICC profiles. It is focused on speed, and is portable across several platforms (MIT license).""" @@ -35,6 +37,27 @@ def url_for_version(self, version): depends_on("libtiff") depends_on("zlib-api") + build_system("autotools", "msbuild") + @property def libs(self): return find_libraries("liblcms2", root=self.prefix, recursive=True) + + +class MSBuildBuilder(spack.build_systems.msbuild.MSBuildBuilder): + @property + def build_directory(self): + return ( + pathlib.Path(self.pkg.stage.source_path) + / "Projects" + / f"VC{self.pkg.compiler.visual_studio_version}" + ) + + def setup_build_environment(self, env): + env.prepend_path( + "INCLUDE", + ";".join([dep.prefix.include for dep in self.spec.dependencies(deptype="link")]), + ) + + def msbuild_args(self): + return ["lcms2.sln"] diff --git a/var/spack/repos/builtin/packages/ldc/package.py b/var/spack/repos/builtin/packages/ldc/package.py index 5a75282f05f791..d44db2b064247f 100644 --- a/var/spack/repos/builtin/packages/ldc/package.py +++ b/var/spack/repos/builtin/packages/ldc/package.py @@ -43,7 +43,9 @@ def cmake_args(self): args = [ "-DD_COMPILER:STRING={0}".format(ldmd2), - "-DBUILD_SHARED_LIBS:BOOL={0}".format("ON" if "+shared" in self.spec else "OFF"), + "-DBUILD_SHARED_LIBS:BOOL={0}".format( + "ON" if self.spec.satisfies("+shared") else "OFF" + ), "-DLDC_INSTALL_LTOPLUGIN:BOOL=ON", "-DLDC_BUILD_WITH_LTO:BOOL=OFF", ] diff --git a/var/spack/repos/builtin/packages/legion/package.py b/var/spack/repos/builtin/packages/legion/package.py index fbbbcf9a7f5c0e..74f46d380ae1f3 100644 --- a/var/spack/repos/builtin/packages/legion/package.py +++ b/var/spack/repos/builtin/packages/legion/package.py @@ -29,6 +29,7 @@ class Legion(CMakePackage, ROCmPackage): maintainers("pmccormick", "streichler", "elliottslaughter") tags = ["e4s"] + version("24.09.0", tag="legion-24.09.0", commit="4a03402467547b99530042cfe234ceec2cd31b2e") version("24.06.0", tag="legion-24.06.0", commit="3f27977943626ef23038ef0049b7ad1b389caad1") version("24.03.0", tag="legion-24.03.0", commit="c61071541218747e35767317f6f89b83f374f264") version("23.12.0", tag="legion-23.12.0", commit="8fea67ee694a5d9fb27232a7976af189d6c98456") @@ -92,7 +93,9 @@ class Legion(CMakePackage, ROCmPackage): patch("hip-offload-arch.patch", when="@23.03.0 +rocm") def patch(self): - if "network=gasnet conduit=ofi-slingshot11 ^cray-mpich+wrappers" in self.spec: + if self.spec.satisfies( + "network=gasnet conduit=ofi-slingshot11 ^[virtuals=mpi] cray-mpich+wrappers" + ): filter_file( r"--with-mpi-cc=cc", f"--with-mpi-cc={self.spec['mpi'].mpicc}", diff --git a/var/spack/repos/builtin/packages/lesstif/package.py b/var/spack/repos/builtin/packages/lesstif/package.py index ddeb248a41e134..f8966c74efa83c 100644 --- a/var/spack/repos/builtin/packages/lesstif/package.py +++ b/var/spack/repos/builtin/packages/lesstif/package.py @@ -42,8 +42,8 @@ def configure_args(self): "--disable-debug", "--enable-production", "--disable-dependency-tracking", - "--enable-shared" if "+shared" in spec else "--disable-shared", - "--enable-static" if "+static" in spec else "--disable-static", + "--enable-shared" if spec.satisfies("+shared") else "--disable-shared", + "--enable-static" if spec.satisfies("+static") else "--disable-static", ] return args diff --git a/var/spack/repos/builtin/packages/leveldb/package.py b/var/spack/repos/builtin/packages/leveldb/package.py index 679a913a886604..6c153c8f4302de 100644 --- a/var/spack/repos/builtin/packages/leveldb/package.py +++ b/var/spack/repos/builtin/packages/leveldb/package.py @@ -70,7 +70,7 @@ def install(self, spec, prefix): def cmake_args(self): args = [] - if "+shared" in self.spec: + if self.spec.satisfies("+shared"): args.append("-DBUILD_SHARED_LIBS=ON") else: args.append("-DBUILD_SHARED_LIBS=OFF") diff --git a/var/spack/repos/builtin/packages/lhapdf/package.py b/var/spack/repos/builtin/packages/lhapdf/package.py index c38f7b31606be8..9a86639a458bcb 100644 --- a/var/spack/repos/builtin/packages/lhapdf/package.py +++ b/var/spack/repos/builtin/packages/lhapdf/package.py @@ -50,7 +50,7 @@ def setup_build_environment(self, env): # Add -lintl if provided by gettext, otherwise libintl is provided by the system's glibc: if ( self.spec.satisfies("+python") - and "gettext" in self.spec + and self.spec.satisfies("^gettext") and "intl" in self.spec["gettext"].libs.names ): env.append_flags("LDFLAGS", "-L" + self.spec["gettext"].prefix.lib) diff --git a/var/spack/repos/builtin/packages/libarchive/package.py b/var/spack/repos/builtin/packages/libarchive/package.py index 388d6a7973c321..124b8a25f0188e 100644 --- a/var/spack/repos/builtin/packages/libarchive/package.py +++ b/var/spack/repos/builtin/packages/libarchive/package.py @@ -17,14 +17,42 @@ class Libarchive(AutotoolsPackage): license("BSD-2-Clause AND BSD-3-Clause AND Public-Domain") - version("3.7.4", sha256="7875d49596286055b52439ed42f044bd8ad426aa4cc5aabd96bfe7abb971d5e8") - version("3.7.3", sha256="f27a97bc22ceb996e72502df47dc19f99f9a0f09181ae909f09f3c9eb17b67e2") - version("3.7.2", sha256="df404eb7222cf30b4f8f93828677890a2986b66ff8bf39dac32a804e96ddf104") - version("3.7.1", sha256="5d24e40819768f74daf846b99837fc53a3a9dcdf3ce1c2003fe0596db850f0f0") - version("3.7.0", sha256="d937886a14b48c4287c4d343644feb294a14b31b7926ba9a4f1777123ce7c2cc") - version("3.6.2", sha256="ba6d02f15ba04aba9c23fd5f236bb234eab9d5209e95d1c4df85c44d5f19b9b3") + version("3.7.6", sha256="b4071807367b15b72777c2eaac80f42c8ea2d20212ab279514a19fe1f6f96ef4") + version("3.7.5", sha256="37556113fe44d77a7988f1ef88bf86ab68f53d11e85066ffd3c70157cc5110f1") # Deprecated versions + # https://nvd.nist.gov/vuln/detail/CVE-2024-48957 + version( + "3.7.4", + sha256="7875d49596286055b52439ed42f044bd8ad426aa4cc5aabd96bfe7abb971d5e8", + deprecated=True, + ) + version( + "3.7.3", + sha256="f27a97bc22ceb996e72502df47dc19f99f9a0f09181ae909f09f3c9eb17b67e2", + deprecated=True, + ) + version( + "3.7.2", + sha256="df404eb7222cf30b4f8f93828677890a2986b66ff8bf39dac32a804e96ddf104", + deprecated=True, + ) + version( + "3.7.1", + sha256="5d24e40819768f74daf846b99837fc53a3a9dcdf3ce1c2003fe0596db850f0f0", + deprecated=True, + ) + version( + "3.7.0", + sha256="d937886a14b48c4287c4d343644feb294a14b31b7926ba9a4f1777123ce7c2cc", + deprecated=True, + ) + version( + "3.6.2", + sha256="ba6d02f15ba04aba9c23fd5f236bb234eab9d5209e95d1c4df85c44d5f19b9b3", + deprecated=True, + ) + # https://nvd.nist.gov/vuln/detail/CVE-2021-31566 version( "3.5.2", @@ -136,7 +164,7 @@ def configure_args(self): args += self.with_or_without("xar") args += self.enable_or_disable("programs") - if "+iconv" in spec: + if spec.satisfies("+iconv"): if spec["iconv"].name == "libiconv": args.append(f"--with-libiconv-prefix={spec['iconv'].prefix}") else: diff --git a/var/spack/repos/builtin/packages/libbeagle/package.py b/var/spack/repos/builtin/packages/libbeagle/package.py index 530815089c5f4e..312c98ebf89063 100644 --- a/var/spack/repos/builtin/packages/libbeagle/package.py +++ b/var/spack/repos/builtin/packages/libbeagle/package.py @@ -48,7 +48,7 @@ class Libbeagle(AutotoolsPackage, CudaPackage): def patch(self): # update cuda architecture if necessary - if "+cuda" in self.spec: + if self.spec.satisfies("+cuda"): cuda_arch = self.spec.variants["cuda_arch"].value archflag = "-arch=compute_{0}".format(cuda_arch) @@ -73,12 +73,12 @@ def configure_args(self): "--disable-march-native" ] - if "+cuda" in self.spec: + if self.spec.satisfies("+cuda"): args.append("--with-cuda={0}".format(self.spec["cuda"].prefix)) else: args.append("--without-cuda") - if "+opencl" in self.spec: + if self.spec.satisfies("+opencl"): args.append("--with-opencl={0}".format(self.spec["opencl"].prefix)) else: args.append("--without-opencl") diff --git a/var/spack/repos/builtin/packages/libblastrampoline/package.py b/var/spack/repos/builtin/packages/libblastrampoline/package.py index fe8bb8d28cd848..f10e7089ce995c 100644 --- a/var/spack/repos/builtin/packages/libblastrampoline/package.py +++ b/var/spack/repos/builtin/packages/libblastrampoline/package.py @@ -17,6 +17,9 @@ class Libblastrampoline(MakefilePackage): license("MIT") + version("5.11.0", sha256="4ea6c134843bd868f78d7ee0c61bf8bdda5334f20deaa6d3cd5bc6caafc4af17") + version("5.10.1", sha256="1185a2a85453827823c224727e7cd665b7af8f48af5d2cd0225bd45389112e81") + version("5.9.0", sha256="fe62c48eab6000a348d6d0cc3f2ebd2c38c6cae460468b56539b8438d42dc589") version("5.8.0", sha256="aeceb01ebebdd1068a1147b636451c46c16d64f9e22694075abda4dddfffe13d") version("5.4.0", sha256="e1a2258b0ad31cc41e6e9b8ba36f5c239fd1a267f2657ef3d3f669cc5b811f6a") version("5.3.0", sha256="95bca73f1567e2acd1110d0dfe5bb58fc86718555cd6eab89f0a769534df3b62") diff --git a/var/spack/repos/builtin/packages/libcanberra/package.py b/var/spack/repos/builtin/packages/libcanberra/package.py index 19807aa5fae72a..7e09b89f094d4c 100644 --- a/var/spack/repos/builtin/packages/libcanberra/package.py +++ b/var/spack/repos/builtin/packages/libcanberra/package.py @@ -39,14 +39,14 @@ class Libcanberra(AutotoolsPackage): depends_on("gtkplus", when="+gtk") depends_on("libvorbis") - depends_on("libtool", type="build") + depends_on("libtool", type="link") # libltdl depends_on("pkgconfig", type="build") def configure_args(self): args = ["--enable-static"] - if "+gtk" in self.spec: + if self.spec.satisfies("+gtk"): args.append("--enable-gtk") else: args.append("--disable-gtk") diff --git a/var/spack/repos/builtin/packages/libceed/package.py b/var/spack/repos/builtin/packages/libceed/package.py index 04f438ab30418a..5900047a790623 100644 --- a/var/spack/repos/builtin/packages/libceed/package.py +++ b/var/spack/repos/builtin/packages/libceed/package.py @@ -76,12 +76,12 @@ def common_make_opts(self): # Use verbose building output makeopts = ["V=1"] - if "@:0.2" in spec: - makeopts += ["NDEBUG=%s" % ("" if "+debug" in spec else "1")] + if spec.satisfies("@:0.2"): + makeopts += ["NDEBUG=%s" % ("" if spec.satisfies("+debug") else "1")] - elif "@0.4:" in spec: + elif spec.satisfies("@0.4:"): # Determine options based on the compiler: - if "+debug" in spec: + if spec.satisfies("+debug"): opt = "-g" elif compiler.name == "gcc": opt = "-O3 -g -ffp-contract=fast" @@ -114,7 +114,7 @@ def common_make_opts(self): if spec.satisfies("@:0.7") and "avx" in self.spec.target: makeopts.append("AVX=1") - if "+cuda" in spec: + if spec.satisfies("+cuda"): makeopts += ["CUDA_DIR=%s" % spec["cuda"].prefix] makeopts += ["CUDA_ARCH=sm_%s" % spec.variants["cuda_arch"].value] if spec.satisfies("@:0.4"): @@ -128,17 +128,17 @@ def common_make_opts(self): # Disable CUDA auto-detection: makeopts += ["CUDA_DIR=/disable-cuda"] - if "+rocm" in spec: + if spec.satisfies("+rocm"): makeopts += ["HIP_DIR=%s" % spec["hip"].prefix] amdgpu_target = ",".join(spec.variants["amdgpu_target"].value) makeopts += ["HIP_ARCH=%s" % amdgpu_target] if spec.satisfies("@0.8"): makeopts += ["HIPBLAS_DIR=%s" % spec["hipblas"].prefix] - if "+libxsmm" in spec: + if spec.satisfies("+libxsmm"): makeopts += ["XSMM_DIR=%s" % spec["libxsmm"].prefix] - if "+magma" in spec: + if spec.satisfies("+magma"): makeopts += ["MAGMA_DIR=%s" % spec["magma"].prefix] return makeopts diff --git a/var/spack/repos/builtin/packages/libcint/package.py b/var/spack/repos/builtin/packages/libcint/package.py index 98fef4336768e6..cb9ec5aec28a7e 100644 --- a/var/spack/repos/builtin/packages/libcint/package.py +++ b/var/spack/repos/builtin/packages/libcint/package.py @@ -68,11 +68,11 @@ class Libcint(CMakePackage): def cmake_args(self): spec = self.spec args = [ - "-DWITH_RANGE_COULOMB=" + str("+coulomb_erf" in spec), - "-DPYPZPX=" + str("+pypzpx" in spec), - "-DWITH_F12=" + str("+f12" in spec), - "-DBUILD_SHARED_LIBS=" + str("+shared" in spec), - "-DENABLE_TEST=" + str("+test" in spec), + "-DWITH_RANGE_COULOMB=" + str(spec.satisfies("+coulomb_erf")), + "-DPYPZPX=" + str(spec.satisfies("+pypzpx")), + "-DWITH_F12=" + str(spec.satisfies("+f12")), + "-DBUILD_SHARED_LIBS=" + str(spec.satisfies("+shared")), + "-DENABLE_TEST=" + str(spec.satisfies("+test")), "-DENABLE_EXAMPLE=OFF", # Requires fortran compiler ] return args diff --git a/var/spack/repos/builtin/packages/libcroco/package.py b/var/spack/repos/builtin/packages/libcroco/package.py index 45a6c6ef696c92..ebb68789434e4e 100644 --- a/var/spack/repos/builtin/packages/libcroco/package.py +++ b/var/spack/repos/builtin/packages/libcroco/package.py @@ -32,7 +32,7 @@ class Libcroco(AutotoolsPackage): def configure_args(self): config_args = [] - if "+doc" in self.spec: + if self.spec.satisfies("+doc"): config_args.extend( [ "--enable-gtk-doc", diff --git a/var/spack/repos/builtin/packages/libde265/package.py b/var/spack/repos/builtin/packages/libde265/package.py index 340f8061fd0824..175c52c3a687a3 100644 --- a/var/spack/repos/builtin/packages/libde265/package.py +++ b/var/spack/repos/builtin/packages/libde265/package.py @@ -19,7 +19,7 @@ class Libde265(CMakePackage): license("LGPL-3.0-or-later") - version("1.0.9", sha256="153554f407718a75f1e0ae197d35b43147ce282118a54f894554dbe27c32163d") + version("1.0.15", sha256="d4e55706dfc5b2c5c9702940b675ce2d3e7511025c6894eaddcdbaf0b15fd3f3") depends_on("c", type="build") # generated depends_on("cxx", type="build") # generated diff --git a/var/spack/repos/builtin/packages/libdrm/package.py b/var/spack/repos/builtin/packages/libdrm/package.py index 49239cc8bba14d..5a6aa91b2710fe 100644 --- a/var/spack/repos/builtin/packages/libdrm/package.py +++ b/var/spack/repos/builtin/packages/libdrm/package.py @@ -19,6 +19,7 @@ class Libdrm(AutotoolsPackage, MesonPackage): license("MIT") + version("2.4.123", sha256="a2b98567a149a74b0f50e91e825f9c0315d86e7be9b74394dae8b298caadb79e") version("2.4.122", sha256="d9f5079b777dffca9300ccc56b10a93588cdfbc9dde2fae111940dfb6292f251") version("2.4.121", sha256="909084a505d7638887f590b70791b3bbd9069c710c948f5d1f1ce6d080cdfcab") version("2.4.120", sha256="3bf55363f76c7250946441ab51d3a6cc0ae518055c0ff017324ab76cdefb327a") @@ -98,6 +99,6 @@ def configure_args(self): class MesonBuilder(spack.build_systems.meson.MesonBuilder): def meson_args(self): if self.spec.satisfies("@:2.4.112"): - return ["-Dman-pages=" + ("true" if "+docs" in self.spec else "false")] + return ["-Dman-pages=" + ("true" if self.spec.satisfies("+docs") else "false")] else: - return ["-Dman-pages=" + ("enabled" if "+docs" in self.spec else "disabled")] + return ["-Dman-pages=" + ("enabled" if self.spec.satisfies("+docs") else "disabled")] diff --git a/var/spack/repos/builtin/packages/libdwarf/package.py b/var/spack/repos/builtin/packages/libdwarf/package.py index a55d24b6e09624..e62211790b774b 100644 --- a/var/spack/repos/builtin/packages/libdwarf/package.py +++ b/var/spack/repos/builtin/packages/libdwarf/package.py @@ -30,6 +30,7 @@ class Libdwarf(CMakePackage, Package): license("LGPL-2.1-only") + version("0.11.0", sha256="846071fb220ac1952f9f15ebbac6c7831ef50d0369b772c07a8a8139a42e07d2") version("0.10.1", sha256="b511a2dc78b98786064889deaa2c1bc48a0c70115c187900dd838474ded1cc19") with default_args(deprecated=True): version( diff --git a/var/spack/repos/builtin/packages/libedit/package.py b/var/spack/repos/builtin/packages/libedit/package.py index 5a85f50e334f4f..98ecb9251b8ce2 100644 --- a/var/spack/repos/builtin/packages/libedit/package.py +++ b/var/spack/repos/builtin/packages/libedit/package.py @@ -12,8 +12,14 @@ class Libedit(AutotoolsPackage): homepage = "https://thrysoee.dk/editline/" url = "https://thrysoee.dk/editline/libedit-20170329-3.1.tar.gz" - license("BSD-3-Clause") + license("BSD-3-Clause", checked_by="wdconinc") + version( + "3.1-20240808", sha256="5f0573349d77c4a48967191cdd6634dd7aa5f6398c6a57fe037cc02696d6099f" + ) + version( + "3.1-20240517", sha256="3a489097bb4115495f3bd85ae782852b7097c556d9500088d74b6fa38dbd12ff" + ) version( "3.1-20230828", sha256="4ee8182b6e569290e7d1f44f0f78dac8716b35f656b76528f699c69c98814dad" ) @@ -33,7 +39,7 @@ class Libedit(AutotoolsPackage): "3.1-20150325", sha256="c88a5e4af83c5f40dda8455886ac98923a9c33125699742603a88a0253fcc8c5" ) - depends_on("c", type="build") # generated + depends_on("c", type="build") depends_on("pkgconfig", type="build") depends_on("ncurses") diff --git a/var/spack/repos/builtin/packages/libepoxy/package.py b/var/spack/repos/builtin/packages/libepoxy/package.py index 1a530a072cfca1..800dbc7303b2b3 100644 --- a/var/spack/repos/builtin/packages/libepoxy/package.py +++ b/var/spack/repos/builtin/packages/libepoxy/package.py @@ -6,16 +6,22 @@ from spack.package import * -class Libepoxy(AutotoolsPackage): +class Libepoxy(AutotoolsPackage, MesonPackage): """Epoxy is a library for handling OpenGL function pointer management for you.""" homepage = "https://github.com/anholt/libepoxy" - url = "https://github.com/anholt/libepoxy/releases/download/1.4.3/libepoxy-1.4.3.tar.xz" - list_url = "https://github.com/anholt/libepoxy/releases" + url = "https://github.com/anholt/libepoxy/archive/refs/tags/1.5.9.tar.gz" license("MIT") + build_system( + conditional("autotools", when="@:1.5.4"), + conditional("meson", when="@1.4.0:"), + default="meson", + ) + + version("1.5.10", sha256="a7ced37f4102b745ac86d6a70a9da399cc139ff168ba6b8002b4d8d43c900c15") version("1.4.3", sha256="0b808a06c9685a62fca34b680abb8bc7fb2fda074478e329b063c1f872b826f6") depends_on("c", type="build") # generated @@ -26,6 +32,35 @@ class Libepoxy(AutotoolsPackage): variant("glx", default=True, description="enable GLX support") + def url_for_version(self, version): + if self.spec.satisfies("@1.5.10:"): + # no more release artifacts are uploaded + return f"https://github.com/anholt/libepoxy/archive/refs/tags/{version}.tar.gz" + else: + return f"https://github.com/anholt/libepoxy/releases/download/{version}/libepoxy-{version}.tar.xz" + + +class MesonBuilder(spack.build_systems.meson.MesonBuilder): + + def meson_args(self): + # Disable egl, otherwise configure fails with: + # error: Package requirements (egl) were not met + # Package 'egl', required by 'virtual:world', not found + args = ["-Degl=no"] + + # Option glx defaults to auto and was failing on PPC64LE systems + # because libx11 was missing from the dependences. This explicitly + # enables/disables glx support. + if self.spec.satisfies("+glx"): + args.append("-Dglx=yes") + else: + args.append("-Dglx=no") + + return args + + +class AutotoolsBuilder(spack.build_systems.autotools.AutotoolsBuilder): + def configure_args(self): # Disable egl, otherwise configure fails with: # error: Package requirements (egl) were not met @@ -35,7 +70,7 @@ def configure_args(self): # --enable-glx defaults to auto and was failing on PPC64LE systems # because libx11 was missing from the dependences. This explicitly # enables/disables glx support. - if "+glx" in self.spec: + if self.spec.satisfies("+glx"): args.append("--enable-glx=yes") else: args.append("--enable-glx=no") diff --git a/var/spack/repos/builtin/packages/libevent/package.py b/var/spack/repos/builtin/packages/libevent/package.py index f209436385e5af..2fff5bc04f1b16 100644 --- a/var/spack/repos/builtin/packages/libevent/package.py +++ b/var/spack/repos/builtin/packages/libevent/package.py @@ -61,7 +61,7 @@ def libs(self): def configure_args(self): spec = self.spec configure_args = [] - if "+openssl" in spec: + if spec.satisfies("+openssl"): configure_args.append("--enable-openssl") else: configure_args.append("--disable-openssl") diff --git a/var/spack/repos/builtin/packages/libexif/package.py b/var/spack/repos/builtin/packages/libexif/package.py index 1ca6eb2ca5bfbb..5c22c9f8f8e415 100644 --- a/var/spack/repos/builtin/packages/libexif/package.py +++ b/var/spack/repos/builtin/packages/libexif/package.py @@ -8,14 +8,21 @@ class Libexif(AutotoolsPackage, SourceforgePackage): """A library to parse an EXIF file and read the data from those tags""" - homepage = "https://sourceforge.net/projects/libexif/" - sourceforge_mirror_path = "libexif/libexif-0.6.21.tar.bz2" + homepage = "https://libexif.github.io/" + url = "https://github.com/libexif/libexif/releases/download/v0.6.24/libexif-0.6.24.tar.bz2" maintainers("TheQueasle") - license("LGPL-2.0-or-later") + license("LGPL-2.1-or-later", checked_by="wdconinc") + version("0.6.24", sha256="d47564c433b733d83b6704c70477e0a4067811d184ec565258ac563d8223f6ae") version("0.6.21", sha256="16cdaeb62eb3e6dfab2435f7d7bccd2f37438d21c5218ec4e58efa9157d4d41a") - depends_on("c", type="build") # generated + depends_on("c", type="build") depends_on("glib") + + def url_for_version(self, version): + if self.spec.satisfies("@:0.6.21"): + return f"https://downloads.sourceforge.net/project/libexif/libexif/{version}/libexif-{version}.tar.bz2" + else: + return f"https://github.com/libexif/libexif/releases/download/v{version}/libexif-{version}.tar.bz2" diff --git a/var/spack/repos/builtin/packages/libfabric/package.py b/var/spack/repos/builtin/packages/libfabric/package.py index 49dbacde6744a3..7aaa7dd73f2b0a 100644 --- a/var/spack/repos/builtin/packages/libfabric/package.py +++ b/var/spack/repos/builtin/packages/libfabric/package.py @@ -24,6 +24,8 @@ class Libfabric(AutotoolsPackage, CudaPackage): license("GPL-2.0-or-later") version("main", branch="main") + version("1.22.0", sha256="485e6cafa66c9e4f6aa688d2c9526e274c47fda3a783cf1dd8f7c69a07e2d5fe") + version("1.21.1", sha256="54befa6697352f3179c79c4a79225ae71694f29eefad5d0d5a14b5444ff986dd") version("1.21.0", sha256="0c1b7b830d9147f661e5d7f359250b85b5a9885c330464cd3b5e5d35b86551c7") version("1.20.2", sha256="75b89252a0b8b3eae8e60f7098af1598445a99a99e8fc1ff458e2fd5d4ef8cde") version("1.20.1", sha256="fd88d65c3139865d42a6eded24e121aadabd6373239cef42b76f28630d6eed76") @@ -197,7 +199,7 @@ def configure_args(self): args.extend(self.enable_or_disable("debug")) - if "+kdreg" in self.spec: + if self.spec.satisfies("+kdreg"): args.append("--with-kdreg=yes") else: args.append("--with-kdreg=no") diff --git a/var/spack/repos/builtin/packages/libfirefly/package.py b/var/spack/repos/builtin/packages/libfirefly/package.py index 4230fb8b72ec72..c6b41864e724fb 100644 --- a/var/spack/repos/builtin/packages/libfirefly/package.py +++ b/var/spack/repos/builtin/packages/libfirefly/package.py @@ -19,6 +19,7 @@ class Libfirefly(CMakePackage): version("master", branch="master") version("2.1.0", sha256="4de4b216c73199a1826de7a0d45205b401603315347d7947d8b5950d3e6b893d") + version("3.0.0", sha256="af7477962bf052452f4ba906ee85d55c1bbfaad6fc8e03403ed265b264ca209a") depends_on("cxx", type="build") # generated @@ -26,6 +27,7 @@ class Libfirefly(CMakePackage): "double-precision", description="Enables double type instead of float when enabled", default=True, + when="@2.1.0", ) def cmake_args(self): diff --git a/var/spack/repos/builtin/packages/libflame/package.py b/var/spack/repos/builtin/packages/libflame/package.py index e43d9d358a4a2f..765e588ee4cc32 100644 --- a/var/spack/repos/builtin/packages/libflame/package.py +++ b/var/spack/repos/builtin/packages/libflame/package.py @@ -72,22 +72,22 @@ def configure_args(self): # https://github.com/flame/libflame/issues/24 config_args = ["LIBS=" + self.spec["blas"].libs.ld_flags] - if "+lapack2flame" in self.spec: + if self.spec.satisfies("+lapack2flame"): config_args.append("--enable-lapack2flame") else: config_args.append("--disable-lapack2flame") - if "+static" in self.spec: + if self.spec.satisfies("+static"): config_args.append("--enable-static-build") else: config_args.append("--disable-static-build") - if "+shared" in self.spec: + if self.spec.satisfies("+shared"): config_args.append("--enable-dynamic-build") else: config_args.append("--disable-dynamic-build") - if "+debug" in self.spec: + if self.spec.satisfies("+debug"): config_args.append("--enable-debug") else: config_args.append("--disable-debug") diff --git a/var/spack/repos/builtin/packages/libfms/package.py b/var/spack/repos/builtin/packages/libfms/package.py index 109f09800b4122..c32b15b764c48c 100644 --- a/var/spack/repos/builtin/packages/libfms/package.py +++ b/var/spack/repos/builtin/packages/libfms/package.py @@ -33,7 +33,7 @@ class Libfms(CMakePackage): def cmake_args(self): args = [] args.extend([self.define_from_variant("BUILD_SHARED_LIBS", "shared")]) - if "+conduit" in self.spec: + if self.spec.satisfies("+conduit"): args.extend([self.define("CONDUIT_DIR", self.spec["conduit"].prefix)]) return args @@ -52,6 +52,6 @@ def libs(self): """Export the FMS library. Sample usage: spec['libfms'].libs.ld_flags """ - is_shared = "+shared" in self.spec + is_shared = self.spec.satisfies("+shared") libs = find_libraries("libfms", root=self.prefix, shared=is_shared, recursive=True) return libs or None # Raise an error if no libs are found diff --git a/var/spack/repos/builtin/packages/libfuse/package.py b/var/spack/repos/builtin/packages/libfuse/package.py index 5177736a113c0d..57d62e0bf69aea 100644 --- a/var/spack/repos/builtin/packages/libfuse/package.py +++ b/var/spack/repos/builtin/packages/libfuse/package.py @@ -106,19 +106,19 @@ def determine_version(cls, exe): def meson_args(self): args = [] - if "+utils" in self.spec: + if self.spec.satisfies("+utils"): args.append("-Dutils=true") args.append("-Dexamples=true") else: args.append("-Dutils=false") args.append("-Dexamples=false") - if "+useroot" in self.spec: + if self.spec.satisfies("+useroot"): args.append("-Duseroot=true") else: args.append("-Duseroot=false") - if "~system_install" in self.spec: + if self.spec.satisfies("~system_install"): # Fix meson's setup if meson does not have the host system's udev package: args.append("-Dudevrulesdir={0}".format(self.prefix.etc.rules.d)) @@ -147,10 +147,14 @@ def meson(self, spec, prefix): ] args.append( - "--enable-static" if "default_library=static" in self.spec else "--disable-static" + "--enable-static" + if self.spec.satisfies("default_library=static") + else "--disable-static" ) args.append( - "--enable-shared" if "default_library=shared" in self.spec else "--disable-shared" + "--enable-shared" + if self.spec.satisfies("default_library=shared") + else "--disable-shared" ) configure(*args) diff --git a/var/spack/repos/builtin/packages/libgain/package.py b/var/spack/repos/builtin/packages/libgain/package.py index 13360d0a79bc01..3df08f4a24d696 100644 --- a/var/spack/repos/builtin/packages/libgain/package.py +++ b/var/spack/repos/builtin/packages/libgain/package.py @@ -30,5 +30,5 @@ def flag_handler(self, name, flags): @property def libs(self): - shared = "+shared" in self.spec + shared = self.spec.satisfies("+shared") return find_libraries("libGaIn", root=self.prefix, shared=shared, recursive=True) diff --git a/var/spack/repos/builtin/packages/libgeotiff/package.py b/var/spack/repos/builtin/packages/libgeotiff/package.py index 3a50f6d2fad66b..169291925141a1 100644 --- a/var/spack/repos/builtin/packages/libgeotiff/package.py +++ b/var/spack/repos/builtin/packages/libgeotiff/package.py @@ -63,17 +63,17 @@ def configure_args(self): args = ["--with-libtiff={0}".format(spec["libtiff"].prefix)] - if "+zlib" in spec: + if spec.satisfies("+zlib"): args.append("--with-zlib={0}".format(spec["zlib-api"].prefix)) else: args.append("--with-zlib=no") - if "+jpeg" in spec: + if spec.satisfies("+jpeg"): args.append("--with-jpeg={0}".format(spec["jpeg"].prefix)) else: args.append("--with-jpeg=no") - if "+proj" in spec: + if spec.satisfies("+proj"): args.append("--with-proj={0}".format(spec["proj"].prefix)) else: args.append("--with-proj=no") diff --git a/var/spack/repos/builtin/packages/libgit2/package.py b/var/spack/repos/builtin/packages/libgit2/package.py index 19655d280a07c8..2ba56471b64fcc 100644 --- a/var/spack/repos/builtin/packages/libgit2/package.py +++ b/var/spack/repos/builtin/packages/libgit2/package.py @@ -105,16 +105,16 @@ def flag_handler(self, name, flags): def cmake_args(self): args = [] - if "https=system" in self.spec: - if "platform=linux" in self.spec: + if self.spec.satisfies("https=system"): + if self.spec.satisfies("platform=linux"): args.append("-DUSE_HTTPS=OpenSSL") - elif "platform=darwin" in self.spec: + elif self.spec.satisfies("platform=darwin"): args.append("-DUSE_HTTPS=SecureTransport") else: # Let CMake try to find an HTTPS implementation. Mileage on # your platform may vary args.append("-DUSE_HTTPS=ON") - elif "https=openssl" in self.spec: + elif self.spec.satisfies("https=openssl"): args.append("-DUSE_HTTPS=OpenSSL") else: args.append("-DUSE_HTTPS=OFF") @@ -122,7 +122,7 @@ def cmake_args(self): args.append(f"-DUSE_SSH={'ON' if '+ssh' in self.spec else 'OFF'}") # The curl backed is not supported after 0.27.x - if "@:0.27 +curl" in self.spec: + if self.spec.satisfies("@:0.27 +curl"): args.append(f"-DCURL={'ON' if '+curl' in self.spec else 'OFF'}") # Control tests diff --git a/var/spack/repos/builtin/packages/libhio/package.py b/var/spack/repos/builtin/packages/libhio/package.py index b9a67e35bf21a0..fbabcb9d45dde2 100644 --- a/var/spack/repos/builtin/packages/libhio/package.py +++ b/var/spack/repos/builtin/packages/libhio/package.py @@ -62,7 +62,7 @@ def configure_args(self): args = [] args.append("--with-external_bz2={0}".format(spec["bzip2"].prefix)) - if "+hdf5" in spec: + if spec.satisfies("+hdf5"): args.append("--with-hdf5={0}".format(spec["hdf5"].prefix)) args.append("--with-external-json={0}".format(spec["json-c"].prefix)) diff --git a/var/spack/repos/builtin/packages/libiberty/package.py b/var/spack/repos/builtin/packages/libiberty/package.py index f5bf3acb4b08ee..a76d140078ac73 100644 --- a/var/spack/repos/builtin/packages/libiberty/package.py +++ b/var/spack/repos/builtin/packages/libiberty/package.py @@ -60,7 +60,7 @@ def flag_handler(self, name, flags): else: flags.append("-O2") - if "+pic" in self.spec: + if self.spec.satisfies("+pic"): flags.append(self.compiler.cc_pic_flag) return (None, None, flags) diff --git a/var/spack/repos/builtin/packages/libiconv/package.py b/var/spack/repos/builtin/packages/libiconv/package.py index bbc0178a95da1e..26db964f1c83a6 100644 --- a/var/spack/repos/builtin/packages/libiconv/package.py +++ b/var/spack/repos/builtin/packages/libiconv/package.py @@ -60,5 +60,5 @@ def configure_args(self): @property def libs(self): - shared = "libs=shared" in self.spec + shared = self.spec.satisfies("libs=shared") return find_libraries(["libiconv"], root=self.prefix, recursive=True, shared=shared) diff --git a/var/spack/repos/builtin/packages/libint/package.py b/var/spack/repos/builtin/packages/libint/package.py index cb5798b543beb1..cc09df56457e24 100644 --- a/var/spack/repos/builtin/packages/libint/package.py +++ b/var/spack/repos/builtin/packages/libint/package.py @@ -128,7 +128,7 @@ def setup_build_environment(self, env): # Change AR to xiar if we compile with Intel and we # find the executable - if "%intel" in self.spec and which("xiar"): + if self.spec.satisfies("%intel") and which("xiar"): env.set("AR", "xiar") def configure_args(self): @@ -158,7 +158,7 @@ def configure_args(self): if self.version < Version("2.0.0"): config_args.extend(["--with-libint-max-am=5", "--with-libderiv-max-am1=4"]) - if "@2.6.0:" in self.spec: + if self.spec.satisfies("@2.6.0:"): config_args += ["--with-libint-exportdir=generated"] config_args += self.enable_or_disable("debug", activation_value=lambda x: "opt") config_args += self.enable_or_disable("fma") @@ -204,7 +204,7 @@ def configure_args(self): @property def build_targets(self): - if "@2.6.0:" in self.spec: + if self.spec.satisfies("@2.6.0:"): return ["export"] return [] @@ -244,9 +244,9 @@ def build(self, spec, prefix): f"-DCMAKE_INSTALL_PREFIX={prefix}", "-DLIBINT2_BUILD_SHARED_AND_STATIC_LIBS=ON", ] - if "+fortran" in spec: + if spec.satisfies("+fortran"): cmake_args.append("-DENABLE_FORTRAN=ON") - if "+debug" in spec: + if spec.satisfies("+debug"): cmake_args.append("CMAKE_BUILD_TYPE=Debug") cmake = Executable("cmake") mkdirp("build") @@ -274,7 +274,7 @@ def install(self, spec, prefix): def patch(self): # Use Fortran compiler to link the Fortran example, not the C++ # compiler - if "+fortran" in self.spec: + if self.spec.satisfies("+fortran"): if not self.spec.satisfies("%fj"): filter_file( "$(CXX) $(CXXFLAGS)", diff --git a/var/spack/repos/builtin/packages/libjpeg-turbo/package.py b/var/spack/repos/builtin/packages/libjpeg-turbo/package.py index f5364a793c8b45..65b07ad458dfbb 100644 --- a/var/spack/repos/builtin/packages/libjpeg-turbo/package.py +++ b/var/spack/repos/builtin/packages/libjpeg-turbo/package.py @@ -3,6 +3,8 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) +import sys + from spack.package import * @@ -111,7 +113,8 @@ class LibjpegTurbo(CMakePackage, AutotoolsPackage): @property def libs(self): shared = self.spec.satisfies("libs=shared") - return find_libraries("libjpeg*", root=self.prefix, shared=shared, recursive=True) + name = "jpeg" if sys.platform == "win32" else "libjpeg*" + return find_libraries(name, root=self.prefix, shared=shared, recursive=True, runtime=False) class CMakeBuilder(spack.build_systems.cmake.CMakeBuilder): @@ -128,5 +131,5 @@ def cmake_args(self): @run_after("install") def darwin_fix(self): # The shared library is not installed correctly on Darwin; fix this - if self.spec.satisfies("platform=darwin") and ("+shared" in self.spec): + if self.spec.satisfies("platform=darwin") and self.spec.satisfies("+shared"): fix_darwin_install_name(self.prefix.lib) diff --git a/var/spack/repos/builtin/packages/libkml/package.py b/var/spack/repos/builtin/packages/libkml/package.py index 4f53a24f7d15e0..2c0fde6cfcbcbd 100644 --- a/var/spack/repos/builtin/packages/libkml/package.py +++ b/var/spack/repos/builtin/packages/libkml/package.py @@ -52,12 +52,12 @@ def cmake_args(self): args = [] - if "+java" in spec: + if spec.satisfies("+java"): args.append("-DWITH_JAVA:BOOL=ON") else: args.append("-DWITH_JAVA:BOOL=OFF") - if "+python" in spec: + if spec.satisfies("+python"): args.append("-DWITH_PYTHON:BOOL=ON") else: args.append("-DWITH_PYTHON:BOOL=OFF") diff --git a/var/spack/repos/builtin/packages/liblas/package.py b/var/spack/repos/builtin/packages/liblas/package.py index 4c85e04cf90570..3fa42839764155 100644 --- a/var/spack/repos/builtin/packages/liblas/package.py +++ b/var/spack/repos/builtin/packages/liblas/package.py @@ -37,22 +37,22 @@ class Liblas(CMakePackage): def cmake_args(self): args = [] - if "+endian" in self.spec: + if self.spec.satisfies("+endian"): args.append("-DWITH_ENDIANAWARE=ON") else: args.append("-DWITH_ENDIANAWARE=OFF") - if "+gdal" in self.spec: + if self.spec.satisfies("+gdal"): args.append("-DWITH_GDAL=ON") else: args.append("-DWITH_GDAL=OFF") - if "+geotiff" in self.spec: + if self.spec.satisfies("+geotiff"): args.append("-DWITH_GEOTIFF=ON") else: args.append("-DWITH_GEOTIFF=OFF") - if "+laszip" in self.spec: + if self.spec.satisfies("+laszip"): args.append("-DWITH_LASZIP=ON") else: args.append("-DWITH_LASZIP=OFF") diff --git a/var/spack/repos/builtin/packages/libmesh/package.py b/var/spack/repos/builtin/packages/libmesh/package.py index 53c41d9c33117b..0cd0ba6dac3363 100644 --- a/var/spack/repos/builtin/packages/libmesh/package.py +++ b/var/spack/repos/builtin/packages/libmesh/package.py @@ -152,7 +152,7 @@ class Libmesh(AutotoolsPackage): def configure_args(self): options = [] - if "+shared" in self.spec: + if self.spec.satisfies("+shared"): options.extend(["--enable-shared", "--disable-static"]) else: options.extend(["--disable-shared", "--enable-static"]) @@ -209,44 +209,44 @@ def configure_args(self): options.append("--enable-" + bundled_library + "=no") # and the ones which are dependencies of other bundled libraries: - if "+exodusii" in self.spec or "+netcdf" in self.spec: + if self.spec.satisfies("+exodusii") or self.spec.satisfies("+netcdf"): options.append("--enable-netcdf=yes") else: options.append("--enable-netcdf=no") - if "+vtk" in self.spec: + if self.spec.satisfies("+vtk"): options.append("--enable-vtk") options.append("--with-vtk=%s" % self.spec["vtk"].prefix) else: options.append("--disable-vtk") # handle external library dependencies: - if "+boost" in self.spec: + if self.spec.satisfies("+boost"): options.append("--with-boost=%s" % self.spec["boost"].prefix) else: options.append("--enable-boost=no") - if "+eigen" in self.spec: + if self.spec.satisfies("+eigen"): options.append("--with-eigen=%s" % self.spec["eigen"].prefix) else: options.append("--enable-eigen=no") - if "+metaphysicl" in self.spec: + if self.spec.satisfies("+metaphysicl"): options.append("--enable-metaphysicl") else: options.append("--disable-metaphysicl") - if "+perflog" in self.spec: + if self.spec.satisfies("+perflog"): options.append("--enable-perflog") else: options.append("--disable-perflog") - if "+blocked" in self.spec: + if self.spec.satisfies("+blocked"): options.append("--enable-blocked-storage") else: options.append("--disable-blocked-storage") - if "+hdf5" in self.spec: + if self.spec.satisfies("+hdf5"): options.append("--with-hdf5=%s" % self.spec["hdf5"].prefix) else: options.append("--enable-hdf5=no") @@ -255,34 +255,34 @@ def configure_args(self): if "+netcdf" not in self.spec: options.append("--disable-netcdf-4") - if "+metis" in self.spec: + if self.spec.satisfies("+metis"): options.append("--enable-metis") options.append("--enable-parmetis") - if "+petsc" in self.spec: + if self.spec.satisfies("+petsc"): options.append("--with-metis=PETSc") options.append("--with-parmetis=PETSc") else: options.append("--disable-metis") - if "+petsc" in self.spec or "+slepc" in self.spec: + if self.spec.satisfies("+petsc") or self.spec.satisfies("+slepc"): options.append("--enable-petsc=yes") options.append("PETSC_DIR=%s" % self.spec["petsc"].prefix) else: options.append("--enable-petsc=no") - if "+slepc" in self.spec: + if self.spec.satisfies("+slepc"): options.append("--enable-slepc=yes") options.append("SLEPC_DIR=%s" % self.spec["slepc"].prefix) else: options.append("--enable-slepc=no") # and, finally, other things: - if "+debug" in self.spec: + if self.spec.satisfies("+debug"): options.append("--with-methods=dbg") else: options.append("--with-methods=opt") - if "+mpi" in self.spec: + if self.spec.satisfies("+mpi"): options.append("CC=%s" % self.spec["mpi"].mpicc) options.append("CXX=%s" % self.spec["mpi"].mpicxx) options.append("--with-mpi=%s" % self.spec["mpi"].prefix) @@ -293,7 +293,7 @@ def configure_args(self): options.append("CC=%s" % self.compiler.cc) options.append("CXX=%s" % self.compiler.cxx) - if "threads=openmp" in self.spec: + if self.spec.satisfies("threads=openmp"): # OpenMP cannot be used if pthreads is not available: see # parallel/threads_pthread.h and parallel/threads.h options.append("--enable-openmp=yes") @@ -302,14 +302,14 @@ def configure_args(self): else: options.append("--enable-openmp=no") - if "threads=pthreads" in self.spec: + if self.spec.satisfies("threads=pthreads"): options.append("--with-thread-model=pthread") options.append("--enable-pthreads=yes") else: if "threads=openmp" not in self.spec: options.append("--enable-pthreads=no") - if "threads=tbb" in self.spec: + if self.spec.satisfies("threads=tbb"): options.append("--with-thread-model=tbb") options.append("--enable-tbb=yes") options.append("--with-tbb=%s" % self.spec["tbb"].prefix) diff --git a/var/spack/repos/builtin/packages/libmodbus/package.py b/var/spack/repos/builtin/packages/libmodbus/package.py index 1c20d6ff83378e..142e47ebca6270 100644 --- a/var/spack/repos/builtin/packages/libmodbus/package.py +++ b/var/spack/repos/builtin/packages/libmodbus/package.py @@ -12,19 +12,22 @@ class Libmodbus(AutotoolsPackage): and supports RTU (serial) and TCP (Ethernet) communications.""" homepage = "https://libmodbus.org/" - url = "https://libmodbus.org/releases/libmodbus-3.0.8.tar.gz" + url = "https://github.com/stephane/libmodbus/releases/download/v3.1.10/libmodbus-3.1.10.tar.gz" license("LGPL-2.1-or-later") - version("3.1.6", sha256="d7d9fa94a16edb094e5fdf5d87ae17a0dc3f3e3d687fead81835d9572cf87c16") - version("3.1.5", sha256="f7a9538f23a8786b1ee62a4b75879b5c0e194e728350de1b741ce7d595970f06") - version("3.1.4", sha256="c8c862b0e9a7ba699a49bc98f62bdffdfafd53a5716c0e162696b4bf108d3637") - version("3.1.3", sha256="9e02d79d715522e03b61c313c7278fcf80860816718587819318b8ad9c3fd0ce") - version("3.1.2", sha256="661e14f9dc904f3f1b034464ddaa5fd4b8472f8f5d1ea10a1148af85591b7ee9") - version("3.1.1", sha256="76d93aff749d6029f81dcf1fb3fd6abe10c9b48d376f3a03a4f41c5197c95c99") - version("3.0.8", sha256="022f0691d920b8aee3ee49d7af0f69b7ef80fc3c849a8e0281d5bc27db7a24ea") - version("3.0.7", sha256="6c26850cd5dedcf5dad40977ac7f2ee990a3667f6959a1e05e22959bdf537961") - version("3.0.6", sha256="046d63f10f755e2160dc56ef681e5f5ad3862a57c1955fd82e0ce036b69471b6") - version("3.0.5", sha256="19aad5d55fa315602d6e836a858a3802f1608f9d824afba05fa12a58a1b1e656") + version("3.1.10", sha256="899be4e25ab7fe5799d43f9567510d6f063d2e8f56136dd726b6fd976f9b2253") + with default_args(deprecated=True): + # https://nvd.nist.gov/vuln/detail/CVE-2022-0367 + version("3.1.6", sha256="d7d9fa94a16edb094e5fdf5d87ae17a0dc3f3e3d687fead81835d9572cf87c16") + version("3.1.5", sha256="f7a9538f23a8786b1ee62a4b75879b5c0e194e728350de1b741ce7d595970f06") + version("3.1.4", sha256="c8c862b0e9a7ba699a49bc98f62bdffdfafd53a5716c0e162696b4bf108d3637") + version("3.1.3", sha256="9e02d79d715522e03b61c313c7278fcf80860816718587819318b8ad9c3fd0ce") + version("3.1.2", sha256="661e14f9dc904f3f1b034464ddaa5fd4b8472f8f5d1ea10a1148af85591b7ee9") + version("3.1.1", sha256="76d93aff749d6029f81dcf1fb3fd6abe10c9b48d376f3a03a4f41c5197c95c99") + version("3.0.8", sha256="022f0691d920b8aee3ee49d7af0f69b7ef80fc3c849a8e0281d5bc27db7a24ea") + version("3.0.7", sha256="6c26850cd5dedcf5dad40977ac7f2ee990a3667f6959a1e05e22959bdf537961") + version("3.0.6", sha256="046d63f10f755e2160dc56ef681e5f5ad3862a57c1955fd82e0ce036b69471b6") + version("3.0.5", sha256="19aad5d55fa315602d6e836a858a3802f1608f9d824afba05fa12a58a1b1e656") depends_on("c", type="build") # generated diff --git a/var/spack/repos/builtin/packages/libmonitor/package.py b/var/spack/repos/builtin/packages/libmonitor/package.py index 58afd8126eb577..e72d9bc122f81e 100644 --- a/var/spack/repos/builtin/packages/libmonitor/package.py +++ b/var/spack/repos/builtin/packages/libmonitor/package.py @@ -64,10 +64,10 @@ def flag_handler(self, name, flags): def configure_args(self): args = [] - if "+hpctoolkit" in self.spec: + if self.spec.satisfies("+hpctoolkit"): args.append("--enable-client-signals=%s" % self.signals) - if "+dlopen" in self.spec: + if self.spec.satisfies("+dlopen"): args.append("--enable-dlfcn") else: args.append("--disable-dlfcn") diff --git a/var/spack/repos/builtin/packages/libmypaint/package.py b/var/spack/repos/builtin/packages/libmypaint/package.py index a457f1f80f914b..4ae0a1fb6c5bf6 100644 --- a/var/spack/repos/builtin/packages/libmypaint/package.py +++ b/var/spack/repos/builtin/packages/libmypaint/package.py @@ -41,10 +41,10 @@ class Libmypaint(AutotoolsPackage): def configure_args(self): args = [] - if "+gegl" in self.spec: + if self.spec.satisfies("+gegl"): args.append("--enable-gegl=yes") - if "+introspection" in self.spec: + if self.spec.satisfies("+introspection"): args.extend( ["--enable-introspection=yes", "--with-glib={0}".format(self.spec["glib"].prefix)] ) diff --git a/var/spack/repos/builtin/packages/libpcap/package.py b/var/spack/repos/builtin/packages/libpcap/package.py index 332ce47e0367f1..a4920fed1116c9 100644 --- a/var/spack/repos/builtin/packages/libpcap/package.py +++ b/var/spack/repos/builtin/packages/libpcap/package.py @@ -12,17 +12,17 @@ class Libpcap(AutotoolsPackage): homepage = "https://www.tcpdump.org/" list_url = "https://www.tcpdump.org/release/" url = "https://www.tcpdump.org/release/libpcap-1.8.1.tar.gz" + git = "https://github.com/the-tcpdump-group/libpcap" - license("BSD-3-Clause") + license("BSD-3-Clause", checked_by="wdconinc") + version("1.10.5", sha256="37ced90a19a302a7f32e458224a00c365c117905c2cd35ac544b6880a81488f0") version("1.10.4", sha256="ed19a0383fad72e3ad435fd239d7cd80d64916b87269550159d20e47160ebe5f") version("1.10.3", sha256="2a8885c403516cf7b0933ed4b14d6caa30e02052489ebd414dc75ac52e7559e6") version("1.10.0", sha256="8d12b42623eeefee872f123bd0dc85d535b00df4d42e865f993c40f7bfc92b1e") version("1.9.1", sha256="635237637c5b619bcceba91900666b64d56ecb7be63f298f601ec786ce087094") version("1.8.1", sha256="673dbc69fdc3f5a86fb5759ab19899039a8e5e6c631749e48dcd9c6f0c83541e") - depends_on("c", type="build") # generated - depends_on("cxx", type="build") # generated - + depends_on("c", type="build") depends_on("flex", type="build") depends_on("bison", type="build") diff --git a/var/spack/repos/builtin/packages/libpciaccess/package.py b/var/spack/repos/builtin/packages/libpciaccess/package.py index 4704611854212c..6cab9031dd779d 100644 --- a/var/spack/repos/builtin/packages/libpciaccess/package.py +++ b/var/spack/repos/builtin/packages/libpciaccess/package.py @@ -19,9 +19,8 @@ class Libpciaccess(AutotoolsPackage, XorgPackage): version("0.13.5", sha256="fe26ec788732b4ef60b550f2d3fa51c605d27f646e18ecec878f061807a3526e") version("0.13.4", sha256="74d92bda448e6fdb64fee4e0091255f48d625d07146a121653022ed3a0ca1f2f") - depends_on("c", type="build") # generated + depends_on("c", type="build") - depends_on("libtool", type="build") depends_on("pkgconfig", type="build") depends_on("util-macros", type="build") diff --git a/var/spack/repos/builtin/packages/libpng/package.py b/var/spack/repos/builtin/packages/libpng/package.py index ef86a2e4930fa3..7f3a85c2aebe88 100644 --- a/var/spack/repos/builtin/packages/libpng/package.py +++ b/var/spack/repos/builtin/packages/libpng/package.py @@ -48,8 +48,10 @@ class Libpng(CMakePackage): def libs(self): # v1.2 does not have a version-less symlink libraries = f"libpng{self.version.up_to(2).joined}" - shared = "libs=shared" in self.spec - return find_libraries(libraries, root=self.prefix, shared=shared, recursive=True) + shared = self.spec.satisfies("libs=shared") + return find_libraries( + libraries, root=self.prefix, shared=shared, recursive=True, runtime=False + ) class CMakeBuilder(CMakeBuilder): diff --git a/var/spack/repos/builtin/packages/libpressio-opt/package.py b/var/spack/repos/builtin/packages/libpressio-opt/package.py index 22ca887960430f..37c291e92ee821 100644 --- a/var/spack/repos/builtin/packages/libpressio-opt/package.py +++ b/var/spack/repos/builtin/packages/libpressio-opt/package.py @@ -10,7 +10,7 @@ class LibpressioOpt(CMakePackage): """Metacompressor which preforms optimization of compressor settings for LibPressio""" homepage = "https://github.com/robertu94/libpressio_opt" - git = "git@github.com:robertu94/libpressio_opt" + git = "https://github.com/robertu94/libpressio_opt.git" url = "https://github.com/robertu94/libpressio_opt/archive/refs/tags/0.11.0.tar.gz" maintainers("robertu94") diff --git a/var/spack/repos/builtin/packages/libpressio/package.py b/var/spack/repos/builtin/packages/libpressio/package.py index 564ab385878d93..095a4018838d0f 100644 --- a/var/spack/repos/builtin/packages/libpressio/package.py +++ b/var/spack/repos/builtin/packages/libpressio/package.py @@ -374,11 +374,14 @@ def cmake_args(self): self.define_from_variant("LIBPRESSIO_INSTALL_DOCS", "docs"), self.define_from_variant("BUILD_PYTHON_WRAPPER", "python"), self.define("LIBPRESSIO_HAS_MPI4PY", self.spec.satisfies("+python +mpi")), - self.define("LIBPRESSIO_BUILD_MODE", "FULL" if "+core" in self.spec else "CORE"), + self.define( + "LIBPRESSIO_BUILD_MODE", "FULL" if self.spec.satisfies("+core") else "CORE" + ), self.define("BUILD_TESTING", self.run_tests), # this flag was removed in 0.52.0, we should deprecate and remove this self.define( - "LIBPRESSIO_CXX_VERSION", "11" if "+boost" in self.spec else self.lp_cxx_version() + "LIBPRESSIO_CXX_VERSION", + "11" if self.spec.satisfies("+boost") else self.lp_cxx_version(), ), ] # if cuda is backed by the shim, we need to set these linker flags to @@ -386,15 +389,15 @@ def cmake_args(self): if self.spec.satisfies("+cusz +cuda"): args.append("-DCMAKE_EXE_LINKER_FLAGS=-Wl,--allow-shlib-undefined") # libpressio needs to know where to install the python libraries - if "+python" in self.spec: + if self.spec.satisfies("+python"): args.append(f"-DLIBPRESSIO_PYTHON_SITELIB={python_platlib}") # help ensure that libpressio finds the correct HDF5 package - if "+hdf5" in self.spec: + if self.spec.satisfies("+hdf5"): args.append("-DHDF5_ROOT=" + self.spec["hdf5"].prefix) return args def setup_run_environment(self, env): - if "+hdf5" in self.spec and "+json" in self.spec: + if self.spec.satisfies("+hdf5") and self.spec.satisfies("+json"): env.prepend_path("HDF5_PLUGIN_PATH", self.prefix.lib64) @run_after("build") @@ -404,7 +407,7 @@ def build_test(self): @run_after("build") def install_docs(self): - if "+docs" in self.spec: + if self.spec.satisfies("+docs"): with working_dir(self.build_directory): make("docs") diff --git a/var/spack/repos/builtin/packages/libproxy/package.py b/var/spack/repos/builtin/packages/libproxy/package.py index f7f826fd479fd3..612f6d01ee6f5a 100644 --- a/var/spack/repos/builtin/packages/libproxy/package.py +++ b/var/spack/repos/builtin/packages/libproxy/package.py @@ -40,12 +40,12 @@ def cmake_args(self): self.define("WITH_PYTHON2", False), self.define("WITH_VALA", False), ] - if "+python" in self.spec: + if self.spec.satisfies("+python"): args.append(self.define("PYTHON3_SITEPKG_DIR", python_platlib)) return args def setup_run_environment(self, env): - if "+python" in self.spec: + if self.spec.satisfies("+python"): libs = self.spec["libproxy"].libs.directories[0] if self.spec.satisfies("platform=darwin"): env.prepend_path("DYLD_FALLBACK_LIBRARY_PATH", libs) diff --git a/var/spack/repos/builtin/packages/libpsm3/package.py b/var/spack/repos/builtin/packages/libpsm3/package.py index 8bb57327616b27..6772a10a395144 100644 --- a/var/spack/repos/builtin/packages/libpsm3/package.py +++ b/var/spack/repos/builtin/packages/libpsm3/package.py @@ -56,8 +56,8 @@ def setup_run_environment(self, env): env.prepend_path("FI_PROVIDER_PATH", self.prefix.lib) env.set("FI_PROVIDER", "psm3") env.set("PSM3_ALLOW_ROUTERS", "1") - if "+sockets" in self.spec and "~verbs" in self.spec: + if self.spec.satisfies("+sockets ~verbs"): env.set("PSM3_HAL", "sockets") env.set("FI_PSM3_NAME_SERVER", "1") - if "+debug" in self.spec: + if self.spec.satisfies("+debug"): env.set("PSM3_IDENTIFY", "1") diff --git a/var/spack/repos/builtin/packages/libquo/package.py b/var/spack/repos/builtin/packages/libquo/package.py index 95650df42e4614..099dcf0ec55580 100644 --- a/var/spack/repos/builtin/packages/libquo/package.py +++ b/var/spack/repos/builtin/packages/libquo/package.py @@ -47,7 +47,7 @@ def configure_args(self): "CC={0}".format(self.spec["mpi"].mpicc), "FC={0}".format(self.spec["mpi"].mpifc), ] - if "%pgi" in self.spec: + if self.spec.satisfies("%pgi"): config_args.append("CFLAGS={0}".format(self.compiler.cc_pic_flag)) config_args.append("FCFLAGS={0}".format(self.compiler.fc_pic_flag)) return config_args diff --git a/var/spack/repos/builtin/packages/libressl/package.py b/var/spack/repos/builtin/packages/libressl/package.py index 6946c0c66efc28..4e060e3395b09b 100644 --- a/var/spack/repos/builtin/packages/libressl/package.py +++ b/var/spack/repos/builtin/packages/libressl/package.py @@ -18,11 +18,14 @@ class Libressl(AutotoolsPackage): license("custom") + version("3.9.2", sha256="7b031dac64a59eb6ee3304f7ffb75dad33ab8c9d279c847f92c89fb846068f97") + version("3.8.4", sha256="c0cef9cfe174ac366ce482f542fddb07721e7fa0caface34b49a8720fa37fe7d") + version("3.7.3", sha256="7948c856a90c825bd7268b6f85674a8dcd254bae42e221781b24e3f8dc335db3") version("3.7.2", sha256="b06aa538fefc9c6b33c4db4931a09a5f52d9d2357219afcbff7d93fe12ebf6f7") version("3.6.3", sha256="87b1bbe36e9eec8d0ae5f04c83d36b2c5b0e581784c7eb0817025ed29eadea37") version("3.6.1", sha256="acfac61316e93b919c28d62d53037ca734de85c46b4d703f19fd8395cf006774") - depends_on("c", type="build") # generated + depends_on("c", type="build") variant("shared", default=True, description="Build shared libraries") variant("static", default=False, description="Build static libraries") diff --git a/var/spack/repos/builtin/packages/librsb/package.py b/var/spack/repos/builtin/packages/librsb/package.py index c917ee47ba7a43..d78349824a0ef6 100644 --- a/var/spack/repos/builtin/packages/librsb/package.py +++ b/var/spack/repos/builtin/packages/librsb/package.py @@ -44,7 +44,7 @@ class Librsb(AutotoolsPackage): variant("verbose", default=False, description="Extra Library Verbosity. Good for learning.") def setup_build_environment(self, spack_env): - if "+asan" in self.spec: + if self.spec.satisfies("+asan"): spack_env.set("LSAN_OPTIONS", "verbosity=1:log_threads=1") spack_env.set("ASAN_OPTS", "detect_leaks=0") @@ -56,25 +56,25 @@ def configure_args(self): f"CPPFLAGS={self.spec['zlib-api'].headers.include_flags}", f"LDFLAGS={self.spec['zlib-api'].libs.search_flags}", ] - if "+asan" in self.spec: + if self.spec.satisfies("+asan"): args.append("CFLAGS=-O0 -ggdb -fsanitize=address -fno-omit-frame-pointer") args.append("CXXFLAGS=-O0 -ggdb -fsanitize=address -fno-omit-frame-pointer") args.append("LIBS=-lasan") args.append("FCLIBS=-lasan") args.append("--disable-shared") args.append("--enable-fortran-linker") - if "+debug" in self.spec: + if self.spec.satisfies("+debug"): args.append("--enable-allocator-wrapper") args.append("--enable-debug") - if "+native" in self.spec: + if self.spec.satisfies("+native"): args.append("CFLAGS=-O3 -march=native") args.append("CXXFLAGS=-O3 -march=native") args.append("FCFLAGS=-O3 -march=native") - if "+nospblas" in self.spec: + if self.spec.satisfies("+nospblas"): args.append("--disable-sparse-blas-interface") - if "+serial" in self.spec: + if self.spec.satisfies("+serial"): args.append("--disable-openmp") - if "+verbose" in self.spec: + if self.spec.satisfies("+verbose"): args.append("--enable-internals-error-verbosity=1") args.append("--enable-interface-error-verbosity=1") return args diff --git a/var/spack/repos/builtin/packages/librsvg/package.py b/var/spack/repos/builtin/packages/librsvg/package.py index f1d7437538ad94..843d4bd759dcab 100644 --- a/var/spack/repos/builtin/packages/librsvg/package.py +++ b/var/spack/repos/builtin/packages/librsvg/package.py @@ -75,7 +75,7 @@ def setup_run_environment(self, env): def configure_args(self): args = [] - if "+doc" in self.spec: + if self.spec.satisfies("+doc"): args.append("--enable-gtk-doc") else: args.extend( diff --git a/var/spack/repos/builtin/packages/libsamplerate/package.py b/var/spack/repos/builtin/packages/libsamplerate/package.py index d2c5be4cd6c163..095f94f80f9f23 100644 --- a/var/spack/repos/builtin/packages/libsamplerate/package.py +++ b/var/spack/repos/builtin/packages/libsamplerate/package.py @@ -10,17 +10,26 @@ class Libsamplerate(AutotoolsPackage): """libsamplerate (also known as Secret Rabbit Code) is a library for performing sample rate conversion of audio data.""" - homepage = "http://www.mega-nerd.com/libsamplerate/history.html" - url = "http://www.mega-nerd.com/libsamplerate/libsamplerate-0.1.9.tar.gz" + homepage = "http://libsndfile.github.io/libsamplerate/" + url = "https://github.com/libsndfile/libsamplerate/releases/download/0.2.2/libsamplerate-0.2.2.tar.xz" license("BSD-2-Clause") + version("0.2.2", sha256="3258da280511d24b49d6b08615bbe824d0cacc9842b0e4caf11c52cf2b043893") version("0.1.9", sha256="0a7eb168e2f21353fb6d84da152e4512126f7dc48ccb0be80578c565413444c1") version("0.1.8", sha256="93b54bdf46d5e6d2354b7034395fe329c222a966790de34520702bb9642f1c06") - depends_on("c", type="build") # generated + depends_on("c", type="build") depends_on("m4", type="build") depends_on("autoconf", type="build") depends_on("automake", type="build") depends_on("libtool", type="build") + + def url_for_version(self, version): + if self.spec.satisfies("@2.2:"): + return f"https://github.com/libsndfile/libsamplerate/releases/download/{version}/libsamplerate-{version}.tar.xz" + elif self.spec.satisfies("@2:2.1"): + return f"https://github.com/libsndfile/libsamplerate/releases/download/{version}/libsamplerate-{version}.tar.bz2" + else: + return f"http://www.mega-nerd.com/libsamplerate/libsamplerate-{version}.tar.gz" diff --git a/var/spack/repos/builtin/packages/libseccomp/package.py b/var/spack/repos/builtin/packages/libseccomp/package.py index 0dc52a6e62abe0..abe8f14a746f26 100644 --- a/var/spack/repos/builtin/packages/libseccomp/package.py +++ b/var/spack/repos/builtin/packages/libseccomp/package.py @@ -27,6 +27,6 @@ class Libseccomp(AutotoolsPackage): def configure_args(self): args = [] - if "+python" in self.spec: + if self.spec.satisfies("+python"): args.append("--enable-python") return args diff --git a/var/spack/repos/builtin/packages/libsharp/package.py b/var/spack/repos/builtin/packages/libsharp/package.py index e6464dc88486f9..b8c75ab3bacf3f 100644 --- a/var/spack/repos/builtin/packages/libsharp/package.py +++ b/var/spack/repos/builtin/packages/libsharp/package.py @@ -43,7 +43,7 @@ def configure_args(self): args.append("--disable-openmp") if "+mpi" not in self.spec: args.append("--disable-mpi") - if "+pic" in self.spec: + if self.spec.satisfies("+pic"): args.append("--enable-pic") return args diff --git a/var/spack/repos/builtin/packages/libsndfile/package.py b/var/spack/repos/builtin/packages/libsndfile/package.py index 9e262ca91253f5..a9ba1d2b48f5d8 100644 --- a/var/spack/repos/builtin/packages/libsndfile/package.py +++ b/var/spack/repos/builtin/packages/libsndfile/package.py @@ -12,12 +12,20 @@ class Libsndfile(AutotoolsPackage): through one standard library interface. It is released in source code format under the Gnu Lesser General Public License.""" - homepage = "http://www.mega-nerd.com/libsndfile/" - url = "http://www.mega-nerd.com/libsndfile/files/libsndfile-1.0.28.tar.gz" + homepage = "https://github.com/libsndfile/libsndfile" + url = ( + "https://github.com/libsndfile/libsndfile/releases/download/1.2.2/libsndfile-1.2.2.tar.xz" + ) license("LGPL-2.1-or-later") - version("1.0.28", sha256="1ff33929f042fa333aed1e8923aa628c3ee9e1eb85512686c55092d1e5a9dfa9") + version("1.2.2", sha256="3799ca9924d3125038880367bf1468e53a1b7e3686a934f098b7e1d286cdb80e") + # https://nvd.nist.gov/vuln/detail/CVE-2022-33064 + version( + "1.0.28", + sha256="1ff33929f042fa333aed1e8923aa628c3ee9e1eb85512686c55092d1e5a9dfa9", + deprecated=True, + ) depends_on("c", type="build") # generated depends_on("cxx", type="build") # generated @@ -32,9 +40,18 @@ class Libsndfile(AutotoolsPackage): depends_on("alsa-lib", when="+alsa") depends_on("flac@1.3.1:", when="+external-libs") depends_on("libogg@1.1.3:", when="+external-libs") + depends_on("libogg@1.3.0:", when="@1.0.31: +external-libs") depends_on("libvorbis@1.2.3:", when="+external-libs") depends_on("sqlite@3.2:", when="+sqlite") + def url_for_version(self, version): + if self.spec.satisfies("@1.1:"): + return f"https://github.com/libsndfile/libsndfile/releases/download/{version}/libsndfile-{version}.tar.xz" + elif self.spec.satisfies("@1.0.29:"): + return f"https://github.com/libsndfile/libsndfile/releases/download/v{version}/libsndfile-{version}.tar.bz2" + else: + return f"http://www.mega-nerd.com/libsndfile/files/libsndfile-{version}.tar.gz" + def configure_args(self): args = [] diff --git a/var/spack/repos/builtin/packages/libsodium/package.py b/var/spack/repos/builtin/packages/libsodium/package.py index 10ae833ad1fa2e..2b29d2db829a7d 100644 --- a/var/spack/repos/builtin/packages/libsodium/package.py +++ b/var/spack/repos/builtin/packages/libsodium/package.py @@ -22,8 +22,9 @@ class Libsodium(AutotoolsPackage): version("master", branch="master") version("stable", branch="stable") - version("next", branch="next") + version("next", branch="next", deprecated=True) + version("1.0.20", sha256="ebb65ef6ca439333c2bb41a0c1990587288da07f6c7fd07cb3a18cc18d30ce19") version("1.0.19", sha256="018d79fe0a045cca07331d37bd0cb57b2e838c51bc48fd837a1472e50068bbea") version("1.0.18", sha256="6f504490b342a4f8a4c4a02fc9b866cbef8622d5df4e5452b46be121e46636c1") version("1.0.17", sha256="0cc3dae33e642cc187b5ceb467e0ad0e1b51dcba577de1190e9ffa17766ac2b1") @@ -36,7 +37,10 @@ class Libsodium(AutotoolsPackage): version("1.0.0", sha256="ced1fe3d2066953fea94f307a92f8ae41bf0643739a44309cbe43aa881dbc9a5") version("0.7.1", sha256="ef46bbb5bac263ef6d3fc00ccc11d4690aea83643412919fe15369b9870280a7") - depends_on("c", type="build") # generated + depends_on("c", type="build") + + # https://github.com/jedisct1/libsodium/issues/1372 + conflicts("target=aarch64:", when="@1.0.19") def patch(self): # Necessary on ppc64le / aarch64, because Spack tries to execute these scripts diff --git a/var/spack/repos/builtin/packages/libsolv/package.py b/var/spack/repos/builtin/packages/libsolv/package.py index bb177bf3c2aa67..585287801082fa 100644 --- a/var/spack/repos/builtin/packages/libsolv/package.py +++ b/var/spack/repos/builtin/packages/libsolv/package.py @@ -29,7 +29,7 @@ class Libsolv(CMakePackage): def cmake_args(self): return [ - self.define("ENABLE_STATIC", "~shared" in self.spec), - self.define("DISABLE_DYNAMIC", "~shared" in self.spec), + self.define("ENABLE_STATIC", self.spec.satisfies("~shared")), + self.define("DISABLE_DYNAMIC", self.spec.satisfies("~shared")), self.define_from_variant("ENABLE_CONDA", "conda"), ] diff --git a/var/spack/repos/builtin/packages/libssh/package.py b/var/spack/repos/builtin/packages/libssh/package.py index d79d02d826ee12..5371b0c99debee 100644 --- a/var/spack/repos/builtin/packages/libssh/package.py +++ b/var/spack/repos/builtin/packages/libssh/package.py @@ -11,7 +11,12 @@ class Libssh(CMakePackage): homepage = "https://www.libssh.org" url = "https://www.libssh.org/files/0.8/libssh-0.8.5.tar.xz" + list_url = "https://www.libssh.org/files" + list_depth = 1 + version("0.11.0", sha256="860e814579e7606f3fc3db98c5807bef2ab60f793ec871d81bcd23acdcdd3e91") + version("0.10.6", sha256="1861d498f5b6f1741b6abc73e608478491edcf9c9d4b6630eef6e74596de9dc1") + version("0.9.8", sha256="9f834b732341d428d67bbe835b7d10ae97ccf25d6f5bd0288fa51ae683f2e7cd") version("0.8.9", sha256="8559e19da0c40b6f93482b6160219ad77a4d9f1dc190bf174757455c6ae26825") version("0.8.5", sha256="07d2c431240fc88f6b06bcb36ae267f9afeedce2e32f6c42f8844b205ab5a335") version("0.7.5", sha256="54e86dd5dc20e5367e58f3caab337ce37675f863f80df85b6b1614966a337095") diff --git a/var/spack/repos/builtin/packages/libstdcompat/package.py b/var/spack/repos/builtin/packages/libstdcompat/package.py index c9ccf77a0dee6d..3a5321fb4cb478 100644 --- a/var/spack/repos/builtin/packages/libstdcompat/package.py +++ b/var/spack/repos/builtin/packages/libstdcompat/package.py @@ -90,7 +90,7 @@ def cmake_args(self): args = [] cpp_compat = self.spec.variants["cpp_compat"].value - if "cpp_unstable" in self.spec: + if self.spec.satisfies("+cpp_unstable"): args.append("-DSTDCOMPAT_CXX_UNSTABLE=ON") if cpp_compat == "auto": diff --git a/var/spack/repos/builtin/packages/libtraceevent/package.py b/var/spack/repos/builtin/packages/libtraceevent/package.py index 4f3e736e636e3a..1948a40f62bb04 100644 --- a/var/spack/repos/builtin/packages/libtraceevent/package.py +++ b/var/spack/repos/builtin/packages/libtraceevent/package.py @@ -38,13 +38,13 @@ def common_targets(self): @property def build_targets(self): result = self.common_targets + ["all"] - if "+doc" in self.spec: + if self.spec.satisfies("+doc"): result.append("doc") return result @property def install_targets(self): result = self.common_targets + ["install"] - if "+doc" in self.spec: + if self.spec.satisfies("+doc"): result.append("doc-install") return result diff --git a/var/spack/repos/builtin/packages/libunistring/package.py b/var/spack/repos/builtin/packages/libunistring/package.py index 1a634202d51106..86155050fc63f4 100644 --- a/var/spack/repos/builtin/packages/libunistring/package.py +++ b/var/spack/repos/builtin/packages/libunistring/package.py @@ -46,6 +46,11 @@ def patch(self): # https://bugs.gentoo.org/688464#c9 (this links to all further info) filter_file("# pragma weak pthread_create", "", "tests/glthread/thread.h") + def flag_handler(self, name, flags): + if name == "cflags" and self.spec.satisfies("@1.1:") and self.spec.satisfies("%intel"): + flags.append(self.compiler.c18_flag) + return (flags, None, None) + @when("@master") def autoreconf(self, spec, prefix): which("./gitsub.sh")("pull") diff --git a/var/spack/repos/builtin/packages/libunwind/package.py b/var/spack/repos/builtin/packages/libunwind/package.py index fd0fb42448d5db..22e324af08c973 100644 --- a/var/spack/repos/builtin/packages/libunwind/package.py +++ b/var/spack/repos/builtin/packages/libunwind/package.py @@ -109,7 +109,7 @@ def flag_handler(self, name, flags): ): wrapper_flags.append("-fcommon") - if "+pic" in self.spec: + if self.spec.satisfies("+pic"): wrapper_flags.append(self.compiler.cc_pic_flag) return (wrapper_flags, None, flags) diff --git a/var/spack/repos/builtin/packages/libuv-julia/package.py b/var/spack/repos/builtin/packages/libuv-julia/package.py index 6dd7890673e2fc..00a62915871198 100644 --- a/var/spack/repos/builtin/packages/libuv-julia/package.py +++ b/var/spack/repos/builtin/packages/libuv-julia/package.py @@ -18,6 +18,7 @@ class LibuvJulia(AutotoolsPackage): license("CC-BY-4.0") # julia's libuv fork doesn't tag (all?) releases, so we fix commits. + version("1.48.0", commit="ca3a5a431a1c37859b6508e6b2a288092337029a") version("1.44.3", commit="2723e256e952be0b015b3c0086f717c3d365d97e") version("1.44.2", commit="e6f0e4900e195c8352f821abe2b3cffc3089547b") version("1.44.1", commit="1b2d16477fe1142adea952168d828a066e03ee4c") diff --git a/var/spack/repos/builtin/packages/libvips/package.py b/var/spack/repos/builtin/packages/libvips/package.py index abb360545e672f..cd16fd69ea5ce5 100644 --- a/var/spack/repos/builtin/packages/libvips/package.py +++ b/var/spack/repos/builtin/packages/libvips/package.py @@ -12,16 +12,23 @@ class Libvips(AutotoolsPackage): little memory.""" homepage = "https://libvips.github.io/libvips/" - url = "https://github.com/libvips/libvips/releases/download/v8.9.0/vips-8.9.0.tar.gz" + url = "https://github.com/libvips/libvips/releases/download/v8.15.3/vips-8.15.3.tar.xz" git = "https://github.com/libvips/libvips.git" - license("LGPL-2.1-or-later") + license("LGPL-2.1-or-later", checked_by="wdconinc") + version("8.15.3", sha256="3e27d9f536eafad64013958fe9e8a1964c90b564c731d49db7c1a1c11b1052a0") version("8.13.3", sha256="4eff5cdc8dbe1a05a926290a99014e20ba386f5dcca38d9774bef61413435d4c") version("8.10.5", sha256="a4eef2f5334ab6dbf133cd3c6d6394d5bdb3e76d5ea4d578b02e1bc3d9e1cfd8") version("8.9.1", sha256="45633798877839005016c9d3494e98dee065f5cb9e20f4552d3b315b8e8bce91") version("8.9.0", sha256="97334a5e70aff343d2587f23cb8068fc846a58cd937c89a446142ccf00ea0349") + build_system( + conditional("autotools", when="@:8.13"), + conditional("meson", when="@8.13:"), + default="meson", + ) + depends_on("c", type="build") # generated depends_on("cxx", type="build") # generated @@ -45,4 +52,8 @@ class Libvips(AutotoolsPackage): depends_on("libjpeg", when="+jpeg") depends_on("libtiff", when="+tiff") depends_on("libpng", when="+png") - depends_on("poppler", when="+poppler") + depends_on("poppler +glib", when="+poppler") + + def url_for_version(self, version): + ext = "xz" if version >= Version("8.14") else "gz" + return f"https://github.com/libvips/libvips/releases/download/v{version}/vips-{version}.tar.{ext}" diff --git a/var/spack/repos/builtin/packages/libvpx/package.py b/var/spack/repos/builtin/packages/libvpx/package.py index d1c56aafe35c2a..e47170935a8736 100644 --- a/var/spack/repos/builtin/packages/libvpx/package.py +++ b/var/spack/repos/builtin/packages/libvpx/package.py @@ -19,7 +19,15 @@ class Libvpx(AutotoolsPackage): license("BSD-3-Clause") - version("1.10.0", sha256="85803ccbdbdd7a3b03d930187cb055f1353596969c1f92ebec2db839fa4f834a") + version("1.14.1", sha256="901747254d80a7937c933d03bd7c5d41e8e6c883e0665fadcb172542167c7977") + + # Deprecated versions + # https://nvd.nist.gov/vuln/detail/CVE-2023-44488 + version( + "1.10.0", + sha256="85803ccbdbdd7a3b03d930187cb055f1353596969c1f92ebec2db839fa4f834a", + deprecated=True, + ) depends_on("c", type="build") # generated depends_on("cxx", type="build") # generated @@ -30,6 +38,6 @@ class Libvpx(AutotoolsPackage): def configure_args(self): extra_args = [] - if "+pic" in self.spec: + if self.spec.satisfies("+pic"): extra_args.append("--enable-pic") return extra_args diff --git a/var/spack/repos/builtin/packages/libwebsockets/package.py b/var/spack/repos/builtin/packages/libwebsockets/package.py index 37e66b3d153737..5347f241dfb5f5 100644 --- a/var/spack/repos/builtin/packages/libwebsockets/package.py +++ b/var/spack/repos/builtin/packages/libwebsockets/package.py @@ -15,6 +15,7 @@ class Libwebsockets(CMakePackage): license("MIT") + version("4.3.3", sha256="6fd33527b410a37ebc91bb64ca51bdabab12b076bc99d153d7c5dd405e4bdf90") version("2.2.1", sha256="e7f9eaef258e003c9ada0803a9a5636757a5bc0a58927858834fb38a87d18ad2") version("2.1.1", sha256="96183cbdfcd6e6a3d9465e854a924b7bfde6c8c6d3384d6159ad797c2e823b4d") version("2.1.0", sha256="bcc96aaa609daae4d3f7ab1ee480126709ef4f6a8bf9c85de40aae48e38cce66") @@ -26,3 +27,6 @@ class Libwebsockets(CMakePackage): depends_on("zlib-api") depends_on("openssl") + + def cmake_args(self): + return ["-DLWS_WITHOUT_TESTAPPS=ON"] diff --git a/var/spack/repos/builtin/packages/libwmf/package.py b/var/spack/repos/builtin/packages/libwmf/package.py index deb850e99e6f98..b29215418d719e 100644 --- a/var/spack/repos/builtin/packages/libwmf/package.py +++ b/var/spack/repos/builtin/packages/libwmf/package.py @@ -19,9 +19,16 @@ class Libwmf(AutotoolsPackage): license("LGPL-2.0-or-later") + version("0.2.13", sha256="18ba69febd2f515d98a2352de284a8051896062ac9728d2ead07bc39ea75a068") version("0.2.12", sha256="464ff63605d7eaf61a4a12dbd420f7a41a4d854675d8caf37729f5bc744820e2") version("0.2.11", sha256="e2a2664afd5abc71a42be7ad3c200f64de2b8889bf088eac1d32e205ce843803") + patch( + "https://github.com/caolanm/libwmf/commit/1f87c35bc2a36fdca760a4577761d30d9cc876e2.patch?full_index=1", + sha256="80ae84a904baa21e1566e3d2bca1c6aaa0a2a30f684fe50f25e7e5751ef3ec93", + when="@:0.2.13", + ) + depends_on("c", type="build") # generated depends_on("pkgconfig", type="build") diff --git a/var/spack/repos/builtin/packages/libxc/package.py b/var/spack/repos/builtin/packages/libxc/package.py index 05fb99c7e063ca..84e6878512970c 100644 --- a/var/spack/repos/builtin/packages/libxc/package.py +++ b/var/spack/repos/builtin/packages/libxc/package.py @@ -95,14 +95,14 @@ def setup_build_environment(self, env): # https://gitlab.com/libxc/libxc/-/issues/430 (configure script does not ensure C99) # TODO: Switch to cmake since this is better supported env.append_flags("CFLAGS", self.compiler.c99_flag) - if "%intel" in self.spec: + if self.spec.satisfies("%intel"): if which("xiar"): env.set("AR", "xiar") - if "%aocc" in self.spec: + if self.spec.satisfies("%aocc"): env.append_flags("FCFLAGS", "-fPIC") - if "+cuda" in self.spec: + if self.spec.satisfies("+cuda"): nvcc = self.spec["cuda"].prefix.bin.nvcc env.set("CCLD", "{0} -ccbin {1}".format(nvcc, spack_cc)) env.set("CC", "{0} -x cu -ccbin {1}".format(nvcc, spack_cc)) @@ -116,16 +116,16 @@ def configure_args(self): args = [] args += self.enable_or_disable("shared") args += self.enable_or_disable("cuda") - if "+kxc" in self.spec: + if self.spec.satisfies("+kxc"): args.append("--enable-kxc") - if "+lxc" in self.spec: + if self.spec.satisfies("+lxc"): args.append("--enable-lxc") return args @run_after("configure") def patch_libtool(self): """AOCC support for LIBXC""" - if "%aocc" in self.spec: + if self.spec.satisfies("%aocc"): filter_file( r"\$wl-soname \$wl\$soname", r"-fuse-ld=ld -Wl,-soname,\$soname", diff --git a/var/spack/repos/builtin/packages/libxml2/package.py b/var/spack/repos/builtin/packages/libxml2/package.py index fc665b12e44548..c799095ab659fc 100644 --- a/var/spack/repos/builtin/packages/libxml2/package.py +++ b/var/spack/repos/builtin/packages/libxml2/package.py @@ -16,7 +16,7 @@ class Libxml2(AutotoolsPackage, NMakePackage): project (but usable outside of the Gnome platform), it is free software available under the MIT License.""" - homepage = "http://xmlsoft.org" + homepage = "https://gitlab.gnome.org/GNOME/libxml2/-/wikis" url = "https://download.gnome.org/sources/libxml2/2.9/libxml2-2.9.13.tar.xz" list_url = "https://gitlab.gnome.org/GNOME/libxml2/-/releases" @@ -208,7 +208,7 @@ class BaseBuilder(metaclass=spack.builder.PhaseCallbacksMeta): @run_after("install") @on_package_attributes(run_tests=True) def import_module_test(self): - if "+python" in self.spec: + if self.spec.satisfies("+python"): with working_dir("spack-test", create=True): python("-c", "import libxml2") @@ -222,7 +222,7 @@ def configure_args(self): "--with-iconv={0}".format(spec["iconv"].prefix), ] - if "+python" in spec: + if spec.satisfies("+python"): args.extend( [ "--with-python={0}".format(spec["python"].home), @@ -273,6 +273,6 @@ def configure(self, pkg, spec, prefix): ) ), ] - if "+python" in spec: + if spec.satisfies("+python"): opts.append("python=yes") cscript("configure.js", *opts) diff --git a/var/spack/repos/builtin/packages/libxslt/package.py b/var/spack/repos/builtin/packages/libxslt/package.py index aeb2e1b0808de8..9c24949814907f 100644 --- a/var/spack/repos/builtin/packages/libxslt/package.py +++ b/var/spack/repos/builtin/packages/libxslt/package.py @@ -13,18 +13,30 @@ class Libxslt(AutotoolsPackage): implements most of the EXSLT set of processor-portable extensions functions and some of Saxon's evaluate and expressions extensions.""" - homepage = "http://www.xmlsoft.org/XSLT/index.html" - url = "http://xmlsoft.org/sources/libxslt-1.1.32.tar.gz" - - license("X11") - + homepage = "https://gitlab.gnome.org/GNOME/libxslt/-/wikis/home" + url = "https://download.gnome.org/sources/libxslt/1.1/libxslt-1.1.34.tar.xz" + git = "https://gitlab.gnome.org/GNOME/libxslt" + list_url = "https://download.gnome.org/sources/libxslt/" + list_depth = 1 + + license("X11", checked_by="wdconinc") + + version("1.1.42", sha256="85ca62cac0d41fc77d3f6033da9df6fd73d20ea2fc18b0a3609ffb4110e1baeb") + version("1.1.41", sha256="3ad392af91115b7740f7b50d228cc1c5fc13afc1da7f16cb0213917a37f71bda") + version("1.1.40", sha256="194715db023035f65fb566402f2ad2b5eab4c29d541f511305c40b29b1f48d13") + version("1.1.39", sha256="2a20ad621148339b0759c4d4e96719362dee64c9a096dbba625ba053846349f0") + version("1.1.38", sha256="1f32450425819a09acaff2ab7a5a7f8a2ec7956e505d7beeb45e843d0e1ecab1") + version("1.1.37", sha256="3a4b27dc8027ccd6146725950336f1ec520928f320f144eb5fa7990ae6123ab4") + version("1.1.36", sha256="12848f0a4408f65b530d3962cd9ff670b6ae796191cfeff37522b5772de8dc8e") + version("1.1.35", sha256="8247f33e9a872c6ac859aa45018bc4c4d00b97e2feac9eebc10c93ce1f34dd79") + version("1.1.34", sha256="98b1bd46d6792925ad2dfe9a87452ea2adebf69dcb9919ffd55bf926a7f93f7f") version("1.1.33", sha256="8e36605144409df979cab43d835002f63988f3dc94d5d3537c12796db90e38c8") version("1.1.32", sha256="526ecd0abaf4a7789041622c3950c0e7f2c4c8835471515fd77eec684a355460") version("1.1.29", sha256="b5976e3857837e7617b29f2249ebb5eeac34e249208d31f1fbf7a6ba7a4090ce") version("1.1.28", sha256="5fc7151a57b89c03d7b825df5a0fae0a8d5f05674c0e7cf2937ecec4d54a028c") version("1.1.26", sha256="55dd52b42861f8a02989d701ef716d6280bfa02971e967c285016f99c66e3db1") - depends_on("c", type="build") # generated + depends_on("c", type="build") variant("crypto", default=True, description="Build libexslt with crypto support") variant("python", default=False, description="Build Python bindings") @@ -40,15 +52,21 @@ class Libxslt(AutotoolsPackage): depends_on("python+shared", when="+python") extends("python", when="+python") + def url_for_version(self, v): + if v > Version("1.1.34"): + return f"https://download.gnome.org/sources/libxslt/{v.up_to(2)}/libxslt-{v}.tar.xz" + else: + return f"http://xmlsoft.org/sources/libxslt-{v}.tar.gz" + def configure_args(self): args = [] - if "+crypto" in self.spec: + if self.spec.satisfies("+crypto"): args.append("--with-crypto") else: args.append("--without-crypto") - if "+python" in self.spec: + if self.spec.satisfies("+python"): args.append("--with-python={0}".format(self.spec["python"].home)) else: args.append("--without-python") @@ -58,7 +76,7 @@ def configure_args(self): @run_after("install") @on_package_attributes(run_tests=True) def import_module_test(self): - if "+python" in self.spec: + if self.spec.satisfies("+python"): with working_dir("spack-test", create=True): python("-c", "import libxslt") diff --git a/var/spack/repos/builtin/packages/libxsmm/package.py b/var/spack/repos/builtin/packages/libxsmm/package.py index 2747aa7627f93e..16fb0dbeffdbdf 100644 --- a/var/spack/repos/builtin/packages/libxsmm/package.py +++ b/var/spack/repos/builtin/packages/libxsmm/package.py @@ -27,7 +27,7 @@ class Libxsmm(MakefilePackage): # after 2.0 release. version("main-2023-11", commit="0d9be905527ba575c14ca5d3b4c9673916c868b2") version("main", branch="main") - + version("1.17-cp2k", commit="6f883620f58afdeebab28039fc9cf580e76a5ec6") version("1.17", sha256="8b642127880e92e8a75400125307724635ecdf4020ca4481e5efe7640451bb92") version("1.16.3", sha256="e491ccadebc5cdcd1fc08b5b4509a0aba4e2c096f53d7880062a66b82a0baf84") version("1.16.2", sha256="bdc7554b56b9e0a380fc9c7b4f4394b41be863344858bc633bc9c25835c4c64e") @@ -113,14 +113,17 @@ def build(self, spec, prefix): "CXX={0}".format(spack_cxx), "FC={0}".format(spack_fc), "PREFIX=%s" % prefix, - "SYM=1", ] + if spec.target.family == "aarch64": + make_args += ["PLATFORM=1"] + else: + make_args += ["SYM=1"] # JIT (AVX and later) makes MNK, M, N, or K spec. superfluous # make_args += ['MNK=1 4 5 6 8 9 13 16 17 22 23 24 26 32'] # include call trace as the build is already de-optimized - if "+debug" in spec: + if spec.satisfies("+debug"): make_args += ["DBG=1"] make_args += ["TRACE=1"] @@ -128,10 +131,10 @@ def build(self, spec, prefix): if blas_val != "default": make_args += ["BLAS={0}".format(blas_val)] - if "+large_jit_buffer" in spec: + if spec.satisfies("+large_jit_buffer"): make_args += ["CODE_BUF_MAXSIZE=262144"] - if "+shared" in spec: + if spec.satisfies("+shared"): make(*(make_args + ["STATIC=0"])) # builds static libraries by default @@ -148,16 +151,16 @@ def install(self, spec, prefix): # always install libraries install_tree("lib", prefix.lib) - if "+header-only" in spec: + if spec.satisfies("+header-only"): install_tree("src", prefix.src) - if "+generator" in spec: + if spec.satisfies("+generator"): install_tree("bin", prefix.bin) mkdirp(prefix.doc) install(join_path("documentation", "*.md"), prefix.doc) install(join_path("documentation", "*.pdf"), prefix.doc) - if "@1.8.2:" in spec: + if spec.satisfies("@1.8.2:"): install("LICENSE.md", prefix.doc) else: install("README.md", prefix.doc) diff --git a/var/spack/repos/builtin/packages/liggghts/package.py b/var/spack/repos/builtin/packages/liggghts/package.py index 5e02d21d85b05a..58b213a4834b32 100644 --- a/var/spack/repos/builtin/packages/liggghts/package.py +++ b/var/spack/repos/builtin/packages/liggghts/package.py @@ -67,7 +67,7 @@ def edit(self, spec, prefix): ) makefile.filter(r"^#(VTK_LIB_USR=-L).*", r"\1{0}".format(vtk.prefix.lib)) - if "+mpi" in spec: + if spec.satisfies("+mpi"): mpi = spec["mpi"] makefile.filter(r"^#(MPICXX_USR=).*", r"\1{0}".format(mpi.mpicxx)) makefile.filter(r"^#(MPI_INC_USR=).*", r"\1{0}".format(mpi.prefix.include)) @@ -81,19 +81,19 @@ def edit(self, spec, prefix): # builds using its own target! makefile_auto.filter(r"^(.+)(EXTRA_ADDLIBS.*mpi_stubs.*)", r"\1#\2") - if "+jpeg" in spec: + if spec.satisfies("+jpeg"): jpeg = spec["jpeg"] makefile.filter(r"^(USE_JPG = ).*", r'\1"ON"') makefile.filter(r"^#(JPG_INC_USR=-I).*", r"\1{0}".format(jpeg.prefix.include)) makefile.filter(r"^#(JPG_LIB_USR=-L).*", r"\1{0}".format(jpeg.prefix.lib)) - if "+gzip" in spec: + if spec.satisfies("+gzip"): makefile.filter(r"^(USE_GZIP = ).*", r'\1"ON"') - if "+debug" in spec: + if spec.satisfies("+debug"): makefile.filter(r"^(USE_DEBUG = ).*", r'\1"ON"') - if "+profile" in spec: + if spec.satisfies("+profile"): makefile.filter(r"^(USE_PROFILE = ).*", r'\1"ON"') # Enable debug output of Makefile.auto in the log file diff --git a/var/spack/repos/builtin/packages/ligra/package.py b/var/spack/repos/builtin/packages/ligra/package.py index 737dd9c2509a62..39ebe95a736f15 100644 --- a/var/spack/repos/builtin/packages/ligra/package.py +++ b/var/spack/repos/builtin/packages/ligra/package.py @@ -30,7 +30,7 @@ class Ligra(MakefilePackage): depends_on("mkl", when="+mkl") def setup_build_environment(self, env): - if "+openmp" in self.spec: + if self.spec.satisfies("+openmp"): env.set("OPENMP", "1") # when +mkl, MKLROOT will be defined by intel-mkl package, # triggering a build with mkl support diff --git a/var/spack/repos/builtin/packages/likwid/package.py b/var/spack/repos/builtin/packages/likwid/package.py index 376f2ba46414e5..c6a7242ce91f10 100644 --- a/var/spack/repos/builtin/packages/likwid/package.py +++ b/var/spack/repos/builtin/packages/likwid/package.py @@ -108,13 +108,13 @@ def patch(self): filter_file("^#!/usr/bin/perl", "#!/usr/bin/env perl", *files) def setup_run_environment(self, env): - if "+cuda" in self.spec: + if self.spec.satisfies("+cuda"): libs = find_libraries( "libcupti", root=self.spec["cuda"].prefix, shared=True, recursive=True ) for lib in libs.directories: env.append_path("LD_LIBRARY_PATH", lib) - if "+rocm" in self.spec: + if self.spec.satisfies("+rocm"): libs = find_libraries( "librocprofiler64.so.1", root=self.spec["rocprofiler-dev"].prefix, @@ -176,14 +176,14 @@ def install(self, spec, prefix): "ACCESSMODE = {}".format(spec.variants["accessmode"].value), "config.mk", ) - if "accessmode=accessdaemon" in spec: + if spec.satisfies("accessmode=accessdaemon"): # Disable the chown, see the `spack_perms_fix` template and script filter_file("^INSTALL_CHOWN .*", "INSTALL_CHOWN =", "config.mk") else: filter_file("^BUILDFREQ .*", "BUILDFREQ = false", "config.mk") filter_file("^BUILDDAEMON .*", "BUILDDAEMON = false", "config.mk") - if "+fortran" in self.spec: + if self.spec.satisfies("+fortran"): filter_file("^FORTRAN_INTERFACE .*", "FORTRAN_INTERFACE = true", "config.mk") if self.compiler.name == "gcc": makepath = join_path("make", "include_GCC.mk") @@ -192,7 +192,7 @@ def install(self, spec, prefix): else: filter_file("^FORTRAN_INTERFACE .*", "FORTRAN_INTERFACE = false", "config.mk") - if "+cuda" in self.spec: + if self.spec.satisfies("+cuda"): filter_file("^NVIDIA_INTERFACE.*", "NVIDIA_INTERFACE = true", "config.mk") filter_file("^BUILDAPPDAEMON.*", "BUILDAPPDAEMON = true", "config.mk") cudainc = spec["cuda"].prefix.include @@ -206,7 +206,7 @@ def install(self, spec, prefix): else: filter_file("^NVIDIA_INTERFACE.*", "NVIDIA_INTERFACE = false", "config.mk") - if "+rocm" in self.spec: + if self.spec.satisfies("+rocm"): env["ROCM_HOME"] = spec["rocm-core"].prefix filter_file("^ROCM_INTERFACE.*", "ROCM_INTERFACE = true", "config.mk") filter_file("^BUILDAPPDAEMON.*", "BUILDAPPDAEMON = true", "config.mk") @@ -256,7 +256,7 @@ def install(self, spec, prefix): # the build log. See https://github.com/spack/spack/pull/10412. @run_after("install") def caveats(self): - if "accessmode=accessdaemon" in self.spec: + if self.spec.satisfies("accessmode=accessdaemon"): perm_script = "spack_perms_fix.sh" perm_script_path = join_path(self.spec.prefix, perm_script) daemons = glob.glob(join_path(self.spec.prefix, "sbin", "*")) diff --git a/var/spack/repos/builtin/packages/lima/package.py b/var/spack/repos/builtin/packages/lima/package.py new file mode 100644 index 00000000000000..42769c43b6baa3 --- /dev/null +++ b/var/spack/repos/builtin/packages/lima/package.py @@ -0,0 +1,28 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class Lima(Package): + """Linux virtual machines, with a focus on running containers""" + + homepage = "https://lima-vm.io" + url = "https://github.com/lima-vm/lima/archive/refs/tags/v0.23.2.tar.gz" + + maintainers("trws") + + license("Apache-2.0", checked_by="trws") + + version("0.23.2", sha256="fc21295f78d717efc921f8f6d1ec22f64da82bfe685d0d2d505aee76c53da1ff") + + depends_on("qemu@9:") + depends_on("go@1.22.0:") + + # NOTE: in truth this is a go build, it fetches many go packages during this build + # process, but at least uses the built qemu and local vz on macos + def install(self, spec, prefix): + make() + make("install", f"DESTDIR={prefix}", "PREFIX=") diff --git a/var/spack/repos/builtin/packages/linaro-forge/package.py b/var/spack/repos/builtin/packages/linaro-forge/package.py index 819fbc2f0c5ad2..a673f275bd92fe 100644 --- a/var/spack/repos/builtin/packages/linaro-forge/package.py +++ b/var/spack/repos/builtin/packages/linaro-forge/package.py @@ -23,6 +23,9 @@ class LinaroForge(Package): maintainers("kenche-linaro") if platform.machine() == "aarch64": + version( + "24.0.5", sha256="fc0c80ce9f66c6966faaca77de0f13e26da564c853e5bfc1e8acd17b65bc2ba0" + ) version( "24.0.4", sha256="d126e4690f7c9bf21e541721dac51dcee1f336a882211426bf98a15d80671e3d" ) @@ -94,6 +97,9 @@ class LinaroForge(Package): "21.1.3", sha256="eecbc5686d60994c5468b2d7cd37bebe5d9ac0ba37bd1f98fbfc69b071db541e" ) elif platform.machine() == "x86_64": + version( + "24.0.5", sha256="da0d4d6fa9120b5e7c4a248795b7f5da32c4987588ecb7406213c8c9846af2bc" + ) version( "24.0.4", sha256="001e7b7cd796d8e807971b99a9ca233c24f8fcd6eee4e9b4bbb0ec8560d44f08" ) diff --git a/var/spack/repos/builtin/packages/linux-external-modules/package.py b/var/spack/repos/builtin/packages/linux-external-modules/package.py index 4bbf9a4a1cb787..1934cb688d04e0 100644 --- a/var/spack/repos/builtin/packages/linux-external-modules/package.py +++ b/var/spack/repos/builtin/packages/linux-external-modules/package.py @@ -24,9 +24,9 @@ class LinuxExternalModules(MakefilePackage): # linux-external-modules. how_to = "https://docs.kernel.org/kbuild/modules.html" - maintainers("fleshling", "rountree") + maintainers("kyotsukete", "rountree") - license("GPL-2.0-only", checked_by="fleshling") + license("GPL-2.0-only", checked_by="kyotsukete") version("6.10.3", sha256="fa5f22fd67dd05812d39dca579320c493048e26c4a556048a12385e7ae6fc698") version("6.10.2", sha256="73d8520dd9cba5acfc5e7208e76b35d9740b8aae38210a9224e32ec4c0d29b70") diff --git a/var/spack/repos/builtin/packages/linux-perf/package.py b/var/spack/repos/builtin/packages/linux-perf/package.py index a9cba0e7c66b82..9e550d783db640 100644 --- a/var/spack/repos/builtin/packages/linux-perf/package.py +++ b/var/spack/repos/builtin/packages/linux-perf/package.py @@ -137,20 +137,20 @@ def install(self, spec, prefix): if version >= Version("6.4"): args.append("BUILD_NONDISTRO=1") - if "+libaudit" in spec: + if spec.satisfies("+libaudit"): checks.add("libaudit") args.append("NO_SYSCALL_TABLE=1") # will look for libaudit else: checks.add("syscall_table") args.append("NO_LIBAUDIT=1") - if "+debuginfod" in spec: + if spec.satisfies("+debuginfod"): if version >= Version("5.19"): # Not in --build-options before that checks.add("debuginfod") else: args.append("NO_LIBDEBUGINFOD=1") - if "+python" in spec: + if spec.satisfies("+python"): checks.add("libpython") args.extend( [ @@ -161,22 +161,22 @@ def install(self, spec, prefix): else: args.append("NO_LIBPYTHON=1") - if "+perl" in spec: + if spec.satisfies("+perl"): checks.add("libperl") else: args.append("NO_LIBPERL=1") - if "+openssl" in spec: + if spec.satisfies("+openssl"): checks.add("libcrypto") else: args.append("NO_LIBCRYPTO=1") - if "+slang" in spec: + if spec.satisfies("+slang"): checks.add("libslang") else: args.append("NO_SLANG=1") - if "+libpfm4" in spec: + if spec.satisfies("+libpfm4"): checks.add("libpfm4") if version < Version("6.4"): args.append("LIBPFM4=1") @@ -184,35 +184,35 @@ def install(self, spec, prefix): if version >= Version("6.4"): args.append("NO_LIBPFM4=1") - if "+babeltrace" in spec: + if spec.satisfies("+babeltrace"): # checks.add("babeltrace") # Not in --build-options ? args.append("LIBBABELTRACE_DIR={}".format(spec["babeltrace"].prefix)) else: args.append("NO_LIBBABELTRACE=1") - if "+libcap" in spec: + if spec.satisfies("+libcap"): # checks.add("libcap") # Not in --build-options ? pass else: args.append("NO_LIBCAP=1") - if "+numactl" in spec: + if spec.satisfies("+numactl"): checks.add("libnuma") else: args.append("NO_LIBNUMA=1") - if "+xz" in spec: + if spec.satisfies("+xz"): checks.add("lzma") else: args.append("NO_LZMA=1") - if "+zstd" in spec: + if spec.satisfies("+zstd"): checks.add("zstd") args.append("LIBZSTD_DIR={}".format(spec["zstd"].prefix)) else: args.append("NO_LIBZSTD=1") - if "+libtraceevent" in spec: + if spec.satisfies("+libtraceevent"): if version >= Version("6.2"): # Not in --build-options before that checks.add("libtraceevent") if version >= Version("6.10"): @@ -223,7 +223,7 @@ def install(self, spec, prefix): if version >= Version("6.2"): args.append("NO_LIBTRACEEVENT=1") - if "+jvmti" in spec: + if spec.satisfies("+jvmti"): # checks.add("jvmti") # Not in --build-options ? args.append("JDIR={}".format(spec["java"].prefix)) else: diff --git a/var/spack/repos/builtin/packages/lis/package.py b/var/spack/repos/builtin/packages/lis/package.py index 111cecc27ff22f..bae63b5b70d408 100644 --- a/var/spack/repos/builtin/packages/lis/package.py +++ b/var/spack/repos/builtin/packages/lis/package.py @@ -16,6 +16,8 @@ class Lis(AutotoolsPackage): homepage = "https://www.ssisc.org/lis/index.en.html" url = "https://www.ssisc.org/lis/dl/lis-2.0.27.zip" + version("2.1.6", sha256="7e2c4c5a1b96d2aa21fe799c073d7ca3cd5be79f350593d83102e37ca9780821") + version("2.1.5", sha256="4b78335cf85c327976536b8ac584f258dc9ae085e91b5d4a40879422b3e71543") version("2.1.4", sha256="d94d634db49fff2368bb615225ee4fdde919c63b7a9bc1f81f7d166a8c105f92") version("2.1.3", sha256="2ca0682198c2cdb6beb7866bd2b25071dc8964c6f76d8962477f848f39ff57ea") version("2.1.1", sha256="e1b227fb9c88be4d897be4211198e1e9e8258eb75127848d35b67a0182bf4538") diff --git a/var/spack/repos/builtin/packages/litestream/package.py b/var/spack/repos/builtin/packages/litestream/package.py index e91e14ed8fa056..8ff79e32f655b9 100644 --- a/var/spack/repos/builtin/packages/litestream/package.py +++ b/var/spack/repos/builtin/packages/litestream/package.py @@ -3,8 +3,6 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) -import os - from spack.package import * @@ -14,12 +12,12 @@ class Litestream(GoPackage): homepage = "https://github.com/benbjohnson/litestream" url = "https://github.com/benbjohnson/litestream/archive/refs/tags/v0.3.13.tar.gz" + maintainers("alecbcs") + license("Apache-2.0", checked_by="cmelone") version("0.3.13", sha256="92cb22323b8168f6efdfcad270772fea9e78c709a7149b1bf35d81fcb88bdaf9") + depends_on("go@1.21:", type="build", when="@0.3.12:") -class GoBuilder(spack.build_systems.go.GoBuilder): - @property - def build_directory(self): - return os.path.join(self.pkg.stage.source_path, "cmd", "litestream") + build_directory = "cmd/litestream" diff --git a/var/spack/repos/builtin/packages/llvm-amdgpu/package.py b/var/spack/repos/builtin/packages/llvm-amdgpu/package.py index 405ea30a1bcfae..bfa175a8df89a0 100644 --- a/var/spack/repos/builtin/packages/llvm-amdgpu/package.py +++ b/var/spack/repos/builtin/packages/llvm-amdgpu/package.py @@ -3,6 +3,8 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) import os +import re +import shutil from spack.package import * @@ -13,7 +15,7 @@ class LlvmAmdgpu(CMakePackage, CompilerPackage): homepage = "https://github.com/ROCm/llvm-project" git = "https://github.com/ROCm/llvm-project.git" - url = "https://github.com/ROCm/llvm-project/archive/rocm-6.1.2.tar.gz" + url = "https://github.com/ROCm/llvm-project/archive/rocm-6.2.0.tar.gz" tags = ["rocm"] executables = [r"amdclang", r"amdclang\+\+", r"amdflang", r"clang.*", r"flang.*", "llvm-.*"] generator("ninja") @@ -23,6 +25,8 @@ class LlvmAmdgpu(CMakePackage, CompilerPackage): license("Apache-2.0") version("master", branch="amd-stg-open") + version("6.2.1", sha256="4840f109d8f267c28597e936c869c358de56b8ad6c3ed4881387cf531846e5a7") + version("6.2.0", sha256="12ce17dc920ec6dac0c5484159b3eec00276e4a5b301ab1250488db3b2852200") version("6.1.2", sha256="300e9d6a137dcd91b18d5809a316fddb615e0e7f982dc7ef1bb56876dff6e097") version("6.1.1", sha256="f1a67efb49f76a9b262e9735d3f75ad21e3bd6a05338c9b15c01e6c625c4460d") version("6.1.0", sha256="6bd9912441de6caf6b26d1323e1c899ecd14ff2431874a2f5883d3bc5212db34") @@ -66,7 +70,8 @@ class LlvmAmdgpu(CMakePackage, CompilerPackage): provides("libllvm@15", when="@5.3:5.4") provides("libllvm@16", when="@5.5:5.6") - provides("libllvm@17", when="@5.7:") + provides("libllvm@17", when="@5.7:6.1") + provides("libllvm@18", when="@6.2:") depends_on("cmake@3.13.4:", type="build") depends_on("python", type="build") @@ -105,6 +110,14 @@ class LlvmAmdgpu(CMakePackage, CompilerPackage): when="@6.0:", ) + # Fix for https://github.com/llvm/llvm-project/issues/78530 + # Patch from https://github.com/llvm/llvm-project/pull/80071 + patch( + "https://github.com/ROCm/llvm-project/commit/c651b2b0d9d1393fb5191ac3acfe96e5ecc94bbc.patch?full_index=1", + sha256="eaf700a5b51d53324a93e5c951bc08b6311ce2053c44c1edfff5119f472d8080", + when="@:6.2", + ) + conflicts("^cmake@3.19.0") # https://github.com/spack/spack/issues/45746 @@ -144,6 +157,8 @@ class LlvmAmdgpu(CMakePackage, CompilerPackage): when="@master +rocm-device-libs", ) for d_version, d_shasum in [ + ("6.2.1", "dbe477b323df636f5e3221471780da156c938ec00dda4b50639aa8d7fb9248f4"), + ("6.2.0", "c98090041fa56ca4a260709876e2666f85ab7464db9454b177a189e1f52e0b1a"), ("6.1.2", "6eb7a02e5f1e5e3499206b9e74c9ccdd644abaafa2609dea0993124637617866"), ("6.1.1", "72841f112f953c16619938273370eb8727ddf6c2e00312856c9fca54db583b99"), ("6.1.0", "50386ebcb7ff24449afa2a10c76a059597464f877225c582ba3e097632a43f9c"), @@ -214,7 +229,7 @@ def cmake_args(self): ] # Enable rocm-device-libs as a external project - if "+rocm-device-libs" in self.spec: + if self.spec.satisfies("+rocm-device-libs"): if self.spec.satisfies("@:6.0"): dir = os.path.join(self.stage.source_path, "rocm-device-libs") elif self.spec.satisfies("@6.1:"): @@ -227,10 +242,10 @@ def cmake_args(self): ] ) - if "+llvm_dylib" in self.spec: + if self.spec.satisfies("+llvm_dylib"): args.append(self.define("LLVM_BUILD_LLVM_DYLIB", True)) - if "+link_llvm_dylib" in self.spec: + if self.spec.satisfies("+link_llvm_dylib"): args.append(self.define("LLVM_LINK_LLVM_DYLIB", True)) args.append(self.define("CLANG_LINK_CLANG_DYLIB", True)) @@ -260,7 +275,7 @@ def cmake_args(self): args.append(self.define("LLVM_ENABLE_PROJECTS", llvm_projects)) args.append(self.define("LLVM_ENABLE_RUNTIMES", llvm_runtimes)) args.append(self.define("LLVM_ENABLE_LIBCXX", "OFF")) - args.append(self.define("CLANG_LINK_FLANG_LEGACY", False)) + args.append(self.define("CLANG_LINK_FLANG_LEGACY", True)) args.append(self.define("CMAKE_CXX_STANDARD", 17)) args.append(self.define("FLANG_INCLUDE_DOCS", False)) args.append(self.define("LLVM_BUILD_DOCS", "ON")) @@ -284,6 +299,22 @@ def setup_dependent_run_environment(self, env, dependent_spec): llvm_amdgpu_home = self.spec["llvm-amdgpu"].prefix env.prepend_path("LD_LIBRARY_PATH", llvm_amdgpu_home + "/lib") + @run_after("install") + def post_install(self): + if self.spec.satisfies("@6.1: +rocm-device-libs"): + exe = self.prefix.bin.join("llvm-config") + output = Executable(exe)("--version", output=str, error=str) + version = re.split("[.]", output)[0] + mkdirp(join_path(self.prefix.lib.clang, version, "lib"), "amdgcn") + install_tree( + self.prefix.amdgcn, join_path(self.prefix.lib.clang, version, "lib", "amdgcn") + ) + shutil.rmtree(self.prefix.amdgcn) + os.symlink( + join_path(self.prefix.lib.clang, version, "lib", "amdgcn"), + os.path.join(self.prefix, "amdgcn"), + ) + # Required for enabling asan on dependent packages def setup_dependent_build_environment(self, env, dependent_spec): for root, _, files in os.walk(self.spec["llvm-amdgpu"].prefix): diff --git a/var/spack/repos/builtin/packages/llvm-doe/package.py b/var/spack/repos/builtin/packages/llvm-doe/package.py index 173678cb2d3e6d..6bf4f67e505108 100644 --- a/var/spack/repos/builtin/packages/llvm-doe/package.py +++ b/var/spack/repos/builtin/packages/llvm-doe/package.py @@ -9,8 +9,8 @@ import llnl.util.tty as tty -import spack.build_environment import spack.util.executable +from spack.build_systems.cmake import get_cmake_prefix_path from spack.package import * @@ -309,7 +309,7 @@ def cc(self): if self.spec.external: return self.spec.extra_attributes["compilers"].get("c", None) result = None - if "+clang" in self.spec: + if self.spec.satisfies("+clang"): result = os.path.join(self.spec.prefix.bin, "clang") return result @@ -320,7 +320,7 @@ def cxx(self): if self.spec.external: return self.spec.extra_attributes["compilers"].get("cxx", None) result = None - if "+clang" in self.spec: + if self.spec.satisfies("+clang"): result = os.path.join(self.spec.prefix.bin, "clang++") return result @@ -331,7 +331,7 @@ def fc(self): if self.spec.external: return self.spec.extra_attributes["compilers"].get("fc", None) result = None - if "+flang" in self.spec: + if self.spec.satisfies("+flang"): result = os.path.join(self.spec.prefix.bin, "flang") return result @@ -342,7 +342,7 @@ def f77(self): if self.spec.external: return self.spec.extra_attributes["compilers"].get("f77", None) result = None - if "+flang" in self.spec: + if self.spec.satisfies("+flang"): result = os.path.join(self.spec.prefix.bin, "flang") return result @@ -392,10 +392,10 @@ def setup_build_environment(self, env): env.prepend_path("PATH", self.stage.path) def setup_run_environment(self, env): - if "+clang" in self.spec: + if self.spec.satisfies("+clang"): env.set("CC", join_path(self.spec.prefix.bin, "clang")) env.set("CXX", join_path(self.spec.prefix.bin, "clang++")) - if "+flang" in self.spec: + if self.spec.satisfies("+flang"): env.set("FC", join_path(self.spec.prefix.bin, "flang")) env.set("F77", join_path(self.spec.prefix.bin, "flang")) @@ -422,7 +422,7 @@ def cmake_args(self): projects = [] runtimes = [] - if "+cuda" in spec: + if spec.satisfies("+cuda"): cmake_args.extend( [ define("CUDA_TOOLKIT_ROOT_DIR", spec["cuda"].prefix), @@ -436,7 +436,7 @@ def cmake_args(self): ), ] ) - if "+omp_as_runtime" in spec: + if spec.satisfies("+omp_as_runtime"): cmake_args.extend( [ define("LIBOMPTARGET_NVPTX_ENABLE_BCLIB", True), @@ -459,21 +459,21 @@ def cmake_args(self): cmake_args.append(from_variant("LIBOMPTARGET_ENABLE_DEBUG", "omp_debug")) - if "+lldb" in spec: + if spec.satisfies("+lldb"): if spec.version >= Version("10"): cmake_args.append(from_variant("LLDB_ENABLE_PYTHON", "python")) else: - cmake_args.append(define("LLDB_DISABLE_PYTHON", "~python" in spec)) + cmake_args.append(define("LLDB_DISABLE_PYTHON", spec.satisfies("~python"))) if spec.satisfies("@5.0.0: +python"): cmake_args.append(define("LLDB_USE_SYSTEM_SIX", True)) - if "+gold" in spec: + if spec.satisfies("+gold"): cmake_args.append(define("LLVM_BINUTILS_INCDIR", spec["binutils"].prefix.include)) - if "+clang" in spec: + if spec.satisfies("+clang"): projects.append("clang") projects.append("clang-tools-extra") - if "+omp_as_runtime" in spec: + if spec.satisfies("+omp_as_runtime"): runtimes.append("openmp") else: projects.append("openmp") @@ -485,22 +485,22 @@ def cmake_args(self): if self.spec.satisfies("@9:"): cmake_args.append(define("LLVM_ENABLE_Z3_SOLVER", self.spec.satisfies("@9:+z3"))) - if "+flang" in spec: + if spec.satisfies("+flang"): projects.append("flang") - if "+lldb" in spec: + if spec.satisfies("+lldb"): projects.append("lldb") - if "+lld" in spec: + if spec.satisfies("+lld"): projects.append("lld") - if "+compiler-rt" in spec: + if spec.satisfies("+compiler-rt"): projects.append("compiler-rt") - if "+libcxx" in spec: + if spec.satisfies("+libcxx"): projects.append("libcxx") projects.append("libcxxabi") - if "+mlir" in spec: + if spec.satisfies("+mlir"): projects.append("mlir") - if "+internal_unwind" in spec: + if spec.satisfies("+internal_unwind"): projects.append("libunwind") - if "+polly" in spec: + if spec.satisfies("+polly"): projects.append("polly") cmake_args.append(define("LINK_POLLY_INTO_TOOLS", True)) @@ -544,7 +544,7 @@ def cmake_args(self): projects.remove("openmp") projects.append("bolt") cmake_args.append("-DLIBOMP_USE_BOLT_DEFAULT=ON") - if "+argobots" in spec and spec.satisfies("@bolt"): + if spec.satisfies("+argobots") and spec.satisfies("@bolt"): cmake_args.append("-DLIBOMP_USE_ARGOBOTS=ON") if self.compiler.name == "gcc": @@ -571,9 +571,9 @@ def post_install(self): define = self.define # unnecessary if we build openmp via LLVM_ENABLE_RUNTIMES - if "+cuda ~omp_as_runtime" in self.spec: + if self.spec.satisfies("+cuda ~omp_as_runtime"): ompdir = "build-bootstrapped-omp" - prefix_paths = spack.build_environment.get_cmake_prefix_path(self) + prefix_paths = get_cmake_prefix_path(self) prefix_paths.append(str(spec.prefix)) # rebuild libomptarget to get bytecode runtime library files with working_dir(ompdir, create=True): @@ -600,10 +600,10 @@ def post_install(self): cmake(*cmake_args) ninja() ninja("install") - if "+python" in self.spec: + if self.spec.satisfies("+python"): install_tree("llvm/bindings/python", python_platlib) - if "+clang" in self.spec: + if self.spec.satisfies("+clang"): install_tree("clang/bindings/python", python_platlib) with working_dir(self.build_directory): diff --git a/var/spack/repos/builtin/packages/llvm-openmp-ompt/package.py b/var/spack/repos/builtin/packages/llvm-openmp-ompt/package.py index 5a7e206736e352..4e0385dd94442a 100644 --- a/var/spack/repos/builtin/packages/llvm-openmp-ompt/package.py +++ b/var/spack/repos/builtin/packages/llvm-openmp-ompt/package.py @@ -61,7 +61,7 @@ def cmake_args(self): # Build llvm-openmp-ompt as a stand alone library # CMAKE rpath variable prevents standalone error # where this package wants the llvm tools path - if "+standalone" in self.spec: + if self.spec.satisfies("+standalone"): cmake_args.extend( [ "-DLIBOMP_STANDALONE_BUILD=true", @@ -72,11 +72,11 @@ def cmake_args(self): # Build llvm-openmp-ompt using the tr6_forwards branch # This requires the version to be 5.0 (50) - if "@tr6_forwards" in self.spec: + if self.spec.satisfies("@tr6_forwards"): cmake_args.extend(["-DLIBOMP_OMP_VERSION=50"]) # Disable support for libomptarget - if "~libomptarget" in self.spec: + if self.spec.satisfies("~libomptarget"): cmake_args.extend(["-DOPENMP_ENABLE_LIBOMPTARGET=OFF"]) return cmake_args diff --git a/var/spack/repos/builtin/packages/llvm/package.py b/var/spack/repos/builtin/packages/llvm/package.py index f650e306272c25..297cda2ad1a3fb 100644 --- a/var/spack/repos/builtin/packages/llvm/package.py +++ b/var/spack/repos/builtin/packages/llvm/package.py @@ -10,8 +10,8 @@ import llnl.util.tty as tty from llnl.util.lang import classproperty -import spack.build_environment import spack.util.executable +from spack.build_systems.cmake import get_cmake_prefix_path from spack.package import * from spack.package_base import PackageBase @@ -56,6 +56,7 @@ class Llvm(CMakePackage, CudaPackage, LlvmDetection, CompilerPackage): license("Apache-2.0") version("main", branch="main") + version("19.1.0", sha256="0a08341036ca99a106786f50f9c5cb3fbe458b3b74cab6089fd368d0edb2edfe") version("18.1.8", sha256="09c08693a9afd6236f27a2ebae62cda656eba19021ef3f94d59e931d662d4856") version("18.1.7", sha256="b60df7cbe02cef2523f7357120fb0d46cbb443791cde3a5fb36b82c335c0afc9") version("18.1.6", sha256="01390edfae5b809e982b530ff9088e674c62b13aa92cb9dc1e067fa2cf501083") @@ -277,6 +278,8 @@ class Llvm(CMakePackage, CudaPackage, LlvmDetection, CompilerPackage): conflicts("+z3", when="~clang") conflicts("+lua", when="@:10") conflicts("+lua", when="~lldb") + # Python distutils were removed with 3.12 and are required to build LLVM <= 14 + conflicts("^python@3.12:", when="@:14") variant( "zstd", @@ -285,6 +288,8 @@ class Llvm(CMakePackage, CudaPackage, LlvmDetection, CompilerPackage): description="Enable zstd support for static analyzer / lld", ) + provides("libllvm@19", when="@19.0.0:19") + provides("libllvm@18", when="@18.0.0:18") provides("libllvm@17", when="@17.0.0:17") provides("libllvm@16", when="@16.0.0:16") provides("libllvm@15", when="@15.0.0:15") @@ -419,6 +424,19 @@ class Llvm(CMakePackage, CudaPackage, LlvmDetection, CompilerPackage): # cuda_arch value must be specified conflicts("cuda_arch=none", when="+cuda", msg="A value for cuda_arch must be specified.") + # clang/test/Misc/target-invalid-cpu-note.c + conflicts("cuda_arch=10") + conflicts("cuda_arch=11") + conflicts("cuda_arch=12") + conflicts("cuda_arch=13") + conflicts("cuda_arch=75", when="@:13") + conflicts("cuda_arch=80", when="@:13") + conflicts("cuda_arch=86", when="@:13") + conflicts("cuda_arch=87", when="@:15") + conflicts("cuda_arch=89", when="@:15") + conflicts("cuda_arch=90", when="@:15") + conflicts("cuda_arch=90a", when="@:17") + # LLVM bug https://bugs.llvm.org/show_bug.cgi?id=48234 # CMake bug: https://gitlab.kitware.com/cmake/cmake/-/issues/21469 # Fixed in upstream versions of both @@ -617,7 +635,7 @@ class Llvm(CMakePackage, CudaPackage, LlvmDetection, CompilerPackage): patch("sanitizer-platform-limits-posix-xdr-macos.patch", when="@10:14 platform=darwin") - patch("llvm-cmake-modules-FindZ3.patch", level=0, when="@14.0.6") + patch("llvm-cmake-modules-FindZ3.patch", level=0, when="@14.0.6") @when("@14:17") def patch(self): @@ -629,7 +647,6 @@ def patch(self): string=True, ) - compiler_version_regex = ( # Normal clang compiler versions are left as-is r"clang version ([^ )\n]+)-svn[~.\w\d-]*|" @@ -720,7 +737,7 @@ def cc(self): if self.spec.external: return self.spec.extra_attributes["compilers"].get("c", None) result = None - if "+clang" in self.spec: + if self.spec.satisfies("+clang"): result = os.path.join(self.spec.prefix.bin, "clang") return result @@ -731,7 +748,7 @@ def cxx(self): if self.spec.external: return self.spec.extra_attributes["compilers"].get("cxx", None) result = None - if "+clang" in self.spec: + if self.spec.satisfies("+clang"): result = os.path.join(self.spec.prefix.bin, "clang++") return result @@ -742,7 +759,7 @@ def fc(self): if self.spec.external: return self.spec.extra_attributes["compilers"].get("fc", None) result = None - if "+flang" in self.spec: + if self.spec.satisfies("+flang"): result = os.path.join(self.spec.prefix.bin, "flang") return result @@ -753,7 +770,7 @@ def f77(self): if self.spec.external: return self.spec.extra_attributes["compilers"].get("f77", None) result = None - if "+flang" in self.spec: + if self.spec.satisfies("+flang"): result = os.path.join(self.spec.prefix.bin, "flang") return result @@ -804,10 +821,10 @@ def setup_build_environment(self, env): env.prepend_path("PATH", self.stage.path) def setup_run_environment(self, env): - if "+clang" in self.spec: + if self.spec.satisfies("+clang"): env.set("CC", join_path(self.spec.prefix.bin, "clang")) env.set("CXX", join_path(self.spec.prefix.bin, "clang++")) - if "+flang" in self.spec: + if self.spec.satisfies("+flang"): env.set("FC", join_path(self.spec.prefix.bin, "flang")) env.set("F77", join_path(self.spec.prefix.bin, "flang")) @@ -849,7 +866,7 @@ def cmake_args(self): projects = [] runtimes = [] - if "+cuda" in spec: + if spec.satisfies("+cuda"): cmake_args.extend( [ define("CUDA_TOOLKIT_ROOT_DIR", spec["cuda"].prefix), @@ -863,7 +880,7 @@ def cmake_args(self): ), ] ) - if "openmp=runtime" in spec: + if spec.satisfies("openmp=runtime"): cmake_args.append(define("LIBOMPTARGET_NVPTX_ENABLE_BCLIB", True)) else: # still build libomptarget but disable cuda @@ -883,8 +900,10 @@ def cmake_args(self): # finding libhsa and enabling the AMDGPU plugin. Since we don't support this yet, # disable explicitly. See commit a05a0c3c2f8eefc80d84b7a87a23a4452d4a3087. cmake_args.append(define("LIBOMPTARGET_BUILD_AMDGPU_PLUGIN", False)) + if "python" in spec: # lit's Python needs to be set with this variable + cmake_args.append(define("python_executable", spec["python"].command.path)) - if "+lldb" in spec: + if spec.satisfies("+lldb"): projects.append("lldb") cmake_args.extend( [ @@ -895,62 +914,65 @@ def cmake_args(self): define("LLDB_ENABLE_LZMA", True), ] ) - if spec["ncurses"].satisfies("+termlib"): - cmake_args.append(define("LLVM_ENABLE_TERMINFO", True)) + if spec.satisfies("@19:"): + cmake_args.append(define("LLDB_CURSES_LIBS", spec["ncurses"].libs)) else: - cmake_args.append(define("LLVM_ENABLE_TERMINFO", False)) + if spec["ncurses"].satisfies("+termlib"): + cmake_args.append(define("LLVM_ENABLE_TERMINFO", True)) + else: + cmake_args.append(define("LLVM_ENABLE_TERMINFO", False)) if spec.version >= Version("10"): cmake_args.append(from_variant("LLDB_ENABLE_PYTHON", "python")) else: - cmake_args.append(define("LLDB_DISABLE_PYTHON", "~python" in spec)) + cmake_args.append(define("LLDB_DISABLE_PYTHON", spec.satisfies("~python"))) if spec.satisfies("@5.0.0: +python"): cmake_args.append(define("LLDB_USE_SYSTEM_SIX", True)) - else: + elif spec.satisfies("@:19"): cmake_args.append(define("LLVM_ENABLE_TERMINFO", False)) - if "+gold" in spec: + if spec.satisfies("+gold"): cmake_args.append(define("LLVM_BINUTILS_INCDIR", spec["binutils"].prefix.include)) - if "+clang" in spec: + if spec.satisfies("+clang"): projects.append("clang") projects.append("clang-tools-extra") - if "openmp=runtime" in spec: + if spec.satisfies("openmp=runtime"): runtimes.append("openmp") - elif "openmp=project" in spec: + elif spec.satisfies("openmp=project"): projects.append("openmp") - if "+offload" in spec: + if spec.satisfies("+offload"): runtimes.append("offload") - if "+libomptarget" in spec: + if spec.satisfies("+libomptarget"): cmake_args.append(define("OPENMP_ENABLE_LIBOMPTARGET", True)) else: cmake_args.append(define("OPENMP_ENABLE_LIBOMPTARGET", False)) - if "@8" in spec: + if spec.satisfies("@8"): cmake_args.append(from_variant("CLANG_ANALYZER_ENABLE_Z3_SOLVER", "z3")) - elif "@9:" in spec: + elif spec.satisfies("@9:"): cmake_args.append(from_variant("LLVM_ENABLE_Z3_SOLVER", "z3")) - if "+flang" in spec: + if spec.satisfies("+flang"): projects.append("flang") - if "+lld" in spec: + if spec.satisfies("+lld"): projects.append("lld") - if "compiler-rt=runtime" in spec: + if spec.satisfies("compiler-rt=runtime"): runtimes.append("compiler-rt") - elif "compiler-rt=project" in spec: + elif spec.satisfies("compiler-rt=project"): projects.append("compiler-rt") - if "libcxx=runtime" in spec: + if spec.satisfies("libcxx=runtime"): runtimes.extend(["libcxx", "libcxxabi"]) - elif "libcxx=project" in spec: + elif spec.satisfies("libcxx=project"): projects.extend(["libcxx", "libcxxabi"]) - if "+mlir" in spec: + if spec.satisfies("+mlir"): projects.append("mlir") - if "libunwind=runtime" in spec: + if spec.satisfies("libunwind=runtime"): runtimes.append("libunwind") - elif "libunwind=project" in spec: + elif spec.satisfies("libunwind=project"): projects.append("libunwind") - if "+polly" in spec: + if spec.satisfies("+polly"): projects.append("polly") cmake_args.append(define("LINK_POLLY_INTO_TOOLS", True)) @@ -964,6 +986,14 @@ def cmake_args(self): # CMAKE_INSTALL_RPATH to it, which fails. Statically link libc++abi.a # into libc++.so, linking with -lc++ or -stdlib=libc++ is enough. define("LIBCXX_ENABLE_STATIC_ABI_LIBRARY", True), + # Make sure that CMake does not pick host-installed tools for the build + # Until #45535 is merged, prevent CMake from delivering incompatible + # system tools like python3.12 to older LLVM versions like LLVM-14: + define("CMAKE_FIND_PACKAGE_PREFER_CONFIG", True), + define("CMAKE_FIND_USE_PACKAGE_ROOT_PATH", False), + define("CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY", False), + define("CMAKE_FIND_USE_PACKAGE_REGISTRY", False), + define("CMAKE_FIND_USE_SYSTEM_PATH", False), ] ) @@ -980,7 +1010,7 @@ def cmake_args(self): cmake_args.append(define("LLDB_USE_SYSTEM_DEBUGSERVER", True)) # LLDB test suite requires libc++ - if "libcxx=none" in spec: + if spec.satisfies("libcxx=none"): cmake_args.append(define("LLDB_INCLUDE_TESTS", False)) # Enable building with CLT [and not require full Xcode] @@ -1042,9 +1072,9 @@ def post_install(self): define = self.define # unnecessary if we build openmp via LLVM_ENABLE_RUNTIMES - if "+cuda openmp=project" in self.spec: + if self.spec.satisfies("+cuda openmp=project"): ompdir = "build-bootstrapped-omp" - prefix_paths = spack.build_environment.get_cmake_prefix_path(self) + prefix_paths = get_cmake_prefix_path(self) prefix_paths.append(str(spec.prefix)) # rebuild libomptarget to get bytecode runtime library files with working_dir(ompdir, create=True): @@ -1068,13 +1098,13 @@ def post_install(self): cmake(*cmake_args) ninja() ninja("install") - if "+python" in self.spec: + if self.spec.satisfies("+python"): if spec.version < Version("17.0.0"): # llvm bindings were removed in v17: # https://releases.llvm.org/17.0.1/docs/ReleaseNotes.html#changes-to-the-python-bindings install_tree("llvm/bindings/python", python_platlib) - if "+clang" in self.spec: + if self.spec.satisfies("+clang"): install_tree("clang/bindings/python", python_platlib) with working_dir(self.build_directory): diff --git a/var/spack/repos/builtin/packages/log4cxx/package.py b/var/spack/repos/builtin/packages/log4cxx/package.py index b8554125319bac..077f30c5ead635 100644 --- a/var/spack/repos/builtin/packages/log4cxx/package.py +++ b/var/spack/repos/builtin/packages/log4cxx/package.py @@ -14,18 +14,41 @@ class Log4cxx(CMakePackage): maintainers("nicmcd") - license("Apache-2.0") - - version("0.12.1", sha256="7bea5cb477f0e31c838f0e1f4f498cc3b30c2eae74703ddda923e7e8c2268d22") - version("0.12.0", sha256="bd5b5009ca914c8fa7944b92ea6b4ca6fb7d146f65d526f21bf8b3c6a0520e44") - - variant("cxxstd", default="17", description="C++ standard", values=("11", "17"), multi=False) + license("Apache-2.0", checked_by="wdconinc") + + version("1.2.0", sha256="09f4748aa5675ef5c0770bedbf5e00488668933c5a935a43ac5b85be2436c48a") + with default_args(deprecated=True): + # https://nvd.nist.gov/vuln/detail/CVE-2023-31038 + version( + "0.12.1", sha256="7bea5cb477f0e31c838f0e1f4f498cc3b30c2eae74703ddda923e7e8c2268d22" + ) + version( + "0.12.0", sha256="bd5b5009ca914c8fa7944b92ea6b4ca6fb7d146f65d526f21bf8b3c6a0520e44" + ) + + variant( + "cxxstd", + default="17", + description="C++ standard", + values=("11", "17"), + multi=False, + when="@:1.1", + ) + variant( + "cxxstd", + default="20", + description="C++ standard", + values=("11", "17", "20"), + multi=False, + when="@1.2:", + ) depends_on("cmake@3.13:", type="build") depends_on("apr-util") depends_on("apr") depends_on("boost+thread+system", when="cxxstd=11") + depends_on("expat") depends_on("zlib-api") depends_on("zip") diff --git a/var/spack/repos/builtin/packages/loki/package.py b/var/spack/repos/builtin/packages/loki/package.py index 643c3c46daf996..91bf32a1dec74e 100644 --- a/var/spack/repos/builtin/packages/loki/package.py +++ b/var/spack/repos/builtin/packages/loki/package.py @@ -31,14 +31,14 @@ def flag_handler(self, name, flags): return (flags, None, None) def build(self, spec, prefix): - if "+shared" in spec: + if spec.satisfies("+shared"): make("-C", "src", "build-shared") else: make("-C", "src", "build-static") def install(self, spec, prefix): make("-C", "include", "install", "prefix={0}".format(prefix)) - if "+shared" in spec: + if spec.satisfies("+shared"): make("-C", "src", "install-shared", "prefix={0}".format(prefix)) else: make("-C", "src", "install-static", "prefix={0}".format(prefix)) diff --git a/var/spack/repos/builtin/packages/lorene/package.py b/var/spack/repos/builtin/packages/lorene/package.py index 685495d9024fc5..abf63bd21fb5ea 100644 --- a/var/spack/repos/builtin/packages/lorene/package.py +++ b/var/spack/repos/builtin/packages/lorene/package.py @@ -41,8 +41,8 @@ class Lorene(MakefilePackage): def edit(self, spec, prefix): blas_libs = spec["blas"].libs.link_flags - fftw_incdirs = "-I" + spec["fftw"].prefix.include if "+fftw" in spec else "" - fftw_libdirs = "-L" + spec["fftw"].prefix.lib if "+fftw" in spec else "" + fftw_incdirs = "-I" + spec["fftw"].prefix.include if spec.satisfies("+fftw") else "" + fftw_libdirs = "-L" + spec["fftw"].prefix.lib if spec.satisfies("+fftw") else "" fftw_libs = spec["fftw"].libs.link_flags gsl_incdirs = "-I" + spec["gsl"].prefix.include gsl_libdirs = "-L" + spec["gsl"].prefix.lib @@ -91,7 +91,7 @@ def build(self, spec, prefix): # (We could circumvent the build system and simply compile all # source files, and do so in parallel.) make("cpp", "fortran", "export", *args) - if "+bin_star" in spec: + if spec.satisfies("+bin_star"): with working_dir(join_path("Codes", "Bin_star")): make( "-f", @@ -111,7 +111,7 @@ def install(self, spec, prefix): install_tree("Export/C++/Include", prefix.include) install_tree("C++/Include", prefix.include) mkdirp(prefix.bin) - if "+bin_star" in spec: + if spec.satisfies("+bin_star"): for exe in [ "coal", "lit_bin", @@ -125,5 +125,5 @@ def install(self, spec, prefix): @property def libs(self): - shared = "+shared" in self.spec + shared = self.spec.satisfies("+shared") return find_libraries("liblorene*", root=self.prefix, shared=shared, recursive=True) diff --git a/var/spack/repos/builtin/packages/lua/package.py b/var/spack/repos/builtin/packages/lua/package.py index 042011208c3135..d27e6dafa9b2c2 100644 --- a/var/spack/repos/builtin/packages/lua/package.py +++ b/var/spack/repos/builtin/packages/lua/package.py @@ -259,7 +259,7 @@ def build(self, spec, prefix): def install(self, spec, prefix): make("INSTALL_TOP=%s" % prefix, "install") - if "+shared" in spec: + if spec.satisfies("+shared"): static_to_shared_library( join_path(prefix.lib, "liblua.a"), arguments=["-lm", "-ldl"], @@ -269,7 +269,7 @@ def install(self, spec, prefix): # compatibility with ax_lua.m4 from autoconf-archive # https://www.gnu.org/software/autoconf-archive/ax_lua.html - if "+shared" in spec: + if spec.satisfies("+shared"): with working_dir(prefix.lib): # e.g., liblua.so.5.1.5 src_path = "liblua.{0}.{1}".format(dso_suffix, str(self.version.up_to(3))) @@ -290,7 +290,7 @@ def install(self, spec, prefix): @run_after("install") def link_pkg_config(self): - if "+pcfile" in self.spec: + if self.spec.satisfies("+pcfile"): versioned_pc_file_name = "lua{0}.pc".format(self.version.up_to(2)) symlink( join_path(self.prefix.lib, "pkgconfig", versioned_pc_file_name), diff --git a/var/spack/repos/builtin/packages/lucene/package.py b/var/spack/repos/builtin/packages/lucene/package.py index 784084835b3407..eebfef62db0e01 100644 --- a/var/spack/repos/builtin/packages/lucene/package.py +++ b/var/spack/repos/builtin/packages/lucene/package.py @@ -17,16 +17,29 @@ class Lucene(Package): list_url = "https://archive.apache.org/dist/lucene/java/" list_depth = 1 - license("BSD-2-Clause") - - version("9.10.0", sha256="c57b75ee0ea12b54337967b7854ebd12af3d7bad27245c1dc12a167ce2b1f8a7") - version("9.5.0", sha256="547277a2b6ce283422eccd14e9ee7ffb28b1af3975936959716c9b4d85843555") - version("8.3.1", sha256="acd61ad458d16f3c98b9dd4653c6a34dd666a965842e461f7cdf8947fa041e1a") - version("8.3.0", sha256="67c4f8081f24ff9f4eb4f2b999ac19f7a639b416e5b6f1c1c74e0524a481fc7e") - version("8.2.0", sha256="505cad34698b217fd6ceee581a8215223a47df5af820c94ca70a6bdbba9d5d7c") - version("8.1.1", sha256="d62b0acdf2b1ed7a25ccdb593ad8584caeaa20cc9870e22790d3ec7fa6240a8c") - - depends_on("java", type="run") + license("Apache-2.0", checked_by="wdconinc") + + version("10.0.0", sha256="b40c29039c363a9479947acfbc41efb381af7868233446412d625a197436a243") + version( + "9.12.0", + sha256="8d7c698e7bdee7580950c4323f091b996afb1b14c91d6d6e4e150ccff883c6c5", + preferred=True, + ) + with default_args(deprecated=True): + # https://nvd.nist.gov/vuln/detail/CVE-2024-45772 + version( + "9.10.0", sha256="c57b75ee0ea12b54337967b7854ebd12af3d7bad27245c1dc12a167ce2b1f8a7" + ) + version("9.5.0", sha256="547277a2b6ce283422eccd14e9ee7ffb28b1af3975936959716c9b4d85843555") + version("8.3.1", sha256="acd61ad458d16f3c98b9dd4653c6a34dd666a965842e461f7cdf8947fa041e1a") + version("8.3.0", sha256="67c4f8081f24ff9f4eb4f2b999ac19f7a639b416e5b6f1c1c74e0524a481fc7e") + version("8.2.0", sha256="505cad34698b217fd6ceee581a8215223a47df5af820c94ca70a6bdbba9d5d7c") + version("8.1.1", sha256="d62b0acdf2b1ed7a25ccdb593ad8584caeaa20cc9870e22790d3ec7fa6240a8c") + + # build.gradle minJavaVersion or versions.toml minJava + depends_on("java@8:", type="run") + depends_on("java@11:", type="run", when="@9:") + depends_on("java@21:", type="run", when="@10:") def install(self, spec, prefix): install_tree(".", prefix) diff --git a/var/spack/repos/builtin/packages/lulesh/package.py b/var/spack/repos/builtin/packages/lulesh/package.py index bac0bf86aa1868..3548c66c52bda8 100644 --- a/var/spack/repos/builtin/packages/lulesh/package.py +++ b/var/spack/repos/builtin/packages/lulesh/package.py @@ -33,19 +33,19 @@ def build_targets(self): targets = [] cxxflag = " -g -O3 -I. " ldflags = " -g -O3 " - if "~mpi" in self.spec: + if self.spec.satisfies("~mpi"): targets.append("CXX = {0} {1}".format(spack_cxx, " -DUSE_MPI=0 ")) else: targets.append("CXX = {0} {1}".format(self.spec["mpi"].mpicxx, " -DUSE_MPI=1")) targets.append("MPI_INC = {0}".format(self.spec["mpi"].prefix.include)) targets.append("MPI_LIB = {0}".format(self.spec["mpi"].prefix.lib)) - if "+visual" in self.spec: + if self.spec.satisfies("+visual"): targets.append("SILO_INCDIR = {0}".format(self.spec["silo"].prefix.include)) targets.append("SILO_LIBDIR = {0}".format(self.spec["silo"].prefix.lib)) cxxflag = " -g -DVIZ_MESH -I${SILO_INCDIR} " ldflags = " -g -L${SILO_LIBDIR} -Wl,-rpath=${SILO_LIBDIR} -lsiloh5 -lhdf5 " - if "+openmp" in self.spec: + if self.spec.satisfies("+openmp"): cxxflag += self.compiler.openmp_flag ldflags += self.compiler.openmp_flag diff --git a/var/spack/repos/builtin/packages/lvarray/package.py b/var/spack/repos/builtin/packages/lvarray/package.py index 180458015a3827..9fdb78ebabb7b6 100644 --- a/var/spack/repos/builtin/packages/lvarray/package.py +++ b/var/spack/repos/builtin/packages/lvarray/package.py @@ -105,7 +105,7 @@ def check(self): @run_after("build") def build_docs(self): - if "+docs" in self.spec: + if self.spec.satisfies("+docs"): with working_dir(self.build_directory): make("docs") @@ -118,7 +118,7 @@ def _get_sys_type(self, spec): def _get_host_config_path(self, spec): var = "" - if "+cuda" in spec: + if spec.satisfies("+cuda"): var = "-".join([var, "cuda"]) hostname = socket.gethostname().rstrip("1234567890") @@ -182,7 +182,7 @@ def hostconfig(self, spec, prefix, py_site_pkgs_dir=None): cfg.write("# CMake executable path: %s\n" % cmake_exe) cfg.write("#{0}\n\n".format("-" * 80)) - if "blt" in spec: + if spec.satisfies("^blt"): cfg.write(cmake_cache_entry("BLT_SOURCE_DIR", spec["blt"].prefix)) ####################### @@ -199,7 +199,7 @@ def hostconfig(self, spec, prefix, py_site_pkgs_dir=None): cflags = " ".join(spec.compiler_flags["cflags"]) cxxflags = " ".join(spec.compiler_flags["cxxflags"]) - if "%intel" in spec: + if spec.satisfies("%intel"): cflags += " -qoverride-limits" cxxflags += " -qoverride-limits" @@ -216,10 +216,10 @@ def hostconfig(self, spec, prefix, py_site_pkgs_dir=None): debug_flags = "-O0 -g" cfg.write(cmake_cache_string("CMAKE_CXX_FLAGS_DEBUG", debug_flags)) - if "%clang arch=linux-rhel7-ppc64le" in spec: + if spec.satisfies("%clang arch=linux-rhel7-ppc64le"): cfg.write(cmake_cache_entry("CMAKE_EXE_LINKER_FLAGS", "-Wl,--no-toc-optimize")) - if "+cuda" in spec: + if spec.satisfies("+cuda"): cfg.write("#{0}\n".format("-" * 80)) cfg.write("# Cuda\n") cfg.write("#{0}\n\n".format("-" * 80)) @@ -279,7 +279,7 @@ def hostconfig(self, spec, prefix, py_site_pkgs_dir=None): cfg.write("# Umpire\n") cfg.write("#{0}\n\n".format("-" * 80)) - if "+umpire" in spec: + if spec.satisfies("+umpire"): cfg.write(cmake_cache_option("ENABLE_UMPIRE", True)) cfg.write(cmake_cache_entry("UMPIRE_DIR", spec["umpire"].prefix)) else: @@ -289,7 +289,7 @@ def hostconfig(self, spec, prefix, py_site_pkgs_dir=None): cfg.write("# CHAI\n") cfg.write("#{0}\n\n".format("-" * 80)) - if "+chai" in spec: + if spec.satisfies("+chai"): cfg.write(cmake_cache_option("ENABLE_CHAI", True)) cfg.write(cmake_cache_entry("CHAI_DIR", spec["chai"].prefix)) else: @@ -299,7 +299,7 @@ def hostconfig(self, spec, prefix, py_site_pkgs_dir=None): cfg.write("# Caliper\n") cfg.write("#{0}\n\n".format("-" * 80)) - if "+caliper" in spec: + if spec.satisfies("+caliper"): cfg.write("#{0}\n".format("-" * 80)) cfg.write("# Caliper\n") cfg.write("#{0}\n\n".format("-" * 80)) @@ -312,7 +312,7 @@ def hostconfig(self, spec, prefix, py_site_pkgs_dir=None): cfg.write("#{0}\n".format("-" * 80)) cfg.write("# Python\n") cfg.write("#{0}\n\n".format("-" * 80)) - if "+pylvarray" in spec: + if spec.satisfies("+pylvarray"): cfg.write(cmake_cache_option("ENABLE_PYLVARRAY", True)) python_exe = os.path.join(spec["python"].prefix.bin, "python3") cfg.write(cmake_cache_entry("Python3_EXECUTABLE", python_exe)) @@ -322,7 +322,7 @@ def hostconfig(self, spec, prefix, py_site_pkgs_dir=None): cfg.write("#{0}\n".format("-" * 80)) cfg.write("# Documentation\n") cfg.write("#{0}\n\n".format("-" * 80)) - if "+docs" in spec: + if spec.satisfies("+docs"): cfg.write(cmake_cache_option("ENABLE_DOCS", True)) sphinx_dir = spec["py-sphinx"].prefix cfg.write( @@ -343,7 +343,7 @@ def hostconfig(self, spec, prefix, py_site_pkgs_dir=None): cfg.write("#{0}\n".format("-" * 80)) cfg.write("# addr2line\n") cfg.write("#{0}\n\n".format("-" * 80)) - cfg.write(cmake_cache_option("ENABLE_ADDR2LINE", "+addr2line" in spec)) + cfg.write(cmake_cache_option("ENABLE_ADDR2LINE", spec.satisfies("+addr2line"))) cfg.write("#{0}\n".format("-" * 80)) cfg.write("# Other\n") @@ -359,14 +359,14 @@ def cmake_args(self): # Shared libs options.append(self.define_from_variant("BUILD_SHARED_LIBS", "shared")) - if "~tests~examples~benchmarks" in spec: + if spec.satisfies("~tests~examples~benchmarks"): options.append("-DENABLE_TESTS=OFF") else: options.append("-DENABLE_TESTS=ON") - if "~test" in spec: + if spec.satisfies("~test"): options.append("-DDISABLE_UNIT_TESTS=ON") - elif "+tests" in spec and ("%intel" in spec or "%xl" in spec): + elif spec.satisfies("+tests") and (spec.satisfies("%intel") or spec.satisfies("%xl")): warnings.warn( "The LvArray unit tests take an excessive amount of" " time to build with the Intel or IBM compilers." diff --git a/var/spack/repos/builtin/packages/lz4/package.py b/var/spack/repos/builtin/packages/lz4/package.py index d0a4e20dafa1cf..375e75aa699840 100644 --- a/var/spack/repos/builtin/packages/lz4/package.py +++ b/var/spack/repos/builtin/packages/lz4/package.py @@ -25,6 +25,7 @@ class Lz4(CMakePackage, MakefilePackage): # liblz4 is BSD-2-clause; programs, manpages, and everything else are GPL2 license("BSD-2-Clause AND GPL-2.0-only", checked_by="tgamblin") + version("1.10.0", sha256="537512904744b35e232912055ccf8ec66d768639ff3abe5788d90d792ec5f48b") version("1.9.4", sha256="0b0e3aa07c8c063ddf40b082bdf7e37a1562bda40a0ff5272957f3e987e0e54b") version("1.9.3", sha256="030644df4611007ff7dc962d981f390361e6c97a34e5cbc393ddfbe019ffe2c1") version("1.9.2", sha256="658ba6191fa44c92280d4aa2c271b0f4fbc0e34d249578dd05e50e76d0e5efcc") @@ -74,13 +75,13 @@ def root_cmakelists_dir(self): def cmake_args(self): args = [self.define("CMAKE_POLICY_DEFAULT_CMP0042", "NEW")] # # no pic on windows - if "platform=windows" in self.spec: + if self.spec.satisfies("platform=windows"): args.append(self.define("LZ4_POSITION_INDEPENDENT_LIB", False)) args.append( - self.define("BUILD_SHARED_LIBS", True if "libs=shared" in self.spec else False) + self.define("BUILD_SHARED_LIBS", True if self.spec.satisfies("libs=shared") else False) ) args.append( - self.define("BUILD_STATIC_LIBS", True if "libs=static" in self.spec else False) + self.define("BUILD_STATIC_LIBS", True if self.spec.satisfies("libs=static") else False) ) args.append(self.define_from_variant("CMAKE_POSITION_INDEPENDENT_CODE", "pic")) return args @@ -107,8 +108,8 @@ def install(self, pkg, spec, prefix): make( "install", "PREFIX={0}".format(prefix), - "BUILD_SHARED={0}".format("yes" if "libs=shared" in self.spec else "no"), - "BUILD_STATIC={0}".format("yes" if "libs=static" in self.spec else "no"), + "BUILD_SHARED={0}".format("yes" if self.spec.satisfies("libs=shared") else "no"), + "BUILD_STATIC={0}".format("yes" if self.spec.satisfies("libs=static") else "no"), ) @run_after("install", when="platform=darwin") diff --git a/var/spack/repos/builtin/packages/madgraph5amc/gcc14.patch b/var/spack/repos/builtin/packages/madgraph5amc/gcc14.patch new file mode 100644 index 00000000000000..d7cf655bbd1282 --- /dev/null +++ b/var/spack/repos/builtin/packages/madgraph5amc/gcc14.patch @@ -0,0 +1,38 @@ +From b470cfe805e747204a86eedada1d90aae1ebceec Mon Sep 17 00:00:00 2001 +From: Joseph C Wang +Date: Sat, 24 Aug 2024 00:36:46 +0800 +Subject: [PATCH] add compile flags for gcc14 compilation + +This disables pointer mismatch warnings which are now errors in +gcc14. +--- + vendor/StdHEP/mcfio/src/GNUmakefile | 2 +- + vendor/StdHEP/src/stdhep/GNUmakefile | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/vendor/StdHEP/mcfio/src/GNUmakefile b/vendor/StdHEP/mcfio/src/GNUmakefile +index 591007abe3..14862ba79e 100644 +--- a/vendor/StdHEP/mcfio/src/GNUmakefile ++++ b/vendor/StdHEP/mcfio/src/GNUmakefile +@@ -13,7 +13,7 @@ BINDIR = ../../bin + include ../arch_mcfio + + FFLAGS += -std=legacy +-CFLAGS += -Wno-implicit-function-declaration ++CFLAGS += -Wno-implicit-function-declaration -Wno-incompatible-pointer-types + + FINC = -I. + CINC = -I. -I/usr/include/tirpc +diff --git a/vendor/StdHEP/src/stdhep/GNUmakefile b/vendor/StdHEP/src/stdhep/GNUmakefile +index b1d7591ef0..d0421788c9 100644 +--- a/vendor/StdHEP/src/stdhep/GNUmakefile ++++ b/vendor/StdHEP/src/stdhep/GNUmakefile +@@ -8,7 +8,7 @@ STDHEP_DIR = ../.. + #this has been added by MZ + FFLAGS+= -fd-lines-as-code -fPIE + FFLAGS += -std=legacy +-CFLAGS += -Wno-implicit-function-declaration ++CFLAGS += -Wno-implicit-function-declaration -Wno-incompatible-pointer-types + + SLIB = $(STDHEP_DIR)/lib + SBIN = $(STDHEP_DIR)/bin diff --git a/var/spack/repos/builtin/packages/madgraph5amc/package.py b/var/spack/repos/builtin/packages/madgraph5amc/package.py index eb08e306bdc244..4847a81225aefb 100644 --- a/var/spack/repos/builtin/packages/madgraph5amc/package.py +++ b/var/spack/repos/builtin/packages/madgraph5amc/package.py @@ -17,16 +17,38 @@ class Madgraph5amc(MakefilePackage): event manipulation and analysis.""" homepage = "https://launchpad.net/mg5amcnlo" - url = "https://launchpad.net/mg5amcnlo/2.0/2.7.x/+download/MG5_aMC_v2.7.3.tar.gz" + url = "https://launchpad.net/mg5amcnlo/lts/2.9.x/+download/MG5_aMC_v2.9.20.tar.gz" tags = ["hep"] - version( - "2.8.1", - sha256="acda34414beba201e529b8c03f87f4893fb3f99ed2956a131d60a387e76c5b8c", - url="https://launchpad.net/mg5amcnlo/2.0/2.8.x/+download/MG5_aMC_v2.8.1.tar.gz", - ) - version("2.7.3.py3", sha256="400c26f9b15b07baaad9bd62091ceea785c2d3a59618fdc27cad213816bc7225") + # Launchpad can sometimes be slow to respond + timeout = {"timeout": 60} + + with default_args(fetch_options=timeout): + version("3.5.6", sha256="d4f336196303df748074ac92f251db8e6592fca37b3059c2e0f2a764c7e50975") + version( + "2.9.20", + sha256="09a70e2e8b52e504bcaaa6527d3cec9641b043f5f853f2d11fa3c9970b7efae9", + preferred=True, + ) + with default_args(deprecated=True): + version( + "2.9.19", sha256="ec95d40ec8845e57682400ef24a3b769a4d0542e3a849b7c5e10105d0a0f8e61" + ) + version( + "2.9.17", sha256="6781c515ccc2005a953c35dcf9238632b761a937f1832bdfaa5514510b8c5a17" + ) + # Older versions have been removed, only the latest LTS versions are available: + version( + "2.8.3.2", + sha256="4077eee75f9255fe627755fe0ac5da5d72f5d5c4f70b6e06e4e564e9c512b215", + url="https://launchpad.net/mg5amcnlo/lts/2.8.x/+download/MG5_aMC_v2.8.3.2.tar.gz", + ) + version( + "2.7.3.py3", + sha256="400c26f9b15b07baaad9bd62091ceea785c2d3a59618fdc27cad213816bc7225", + url="https://launchpad.net/mg5amcnlo/lts/2.7.x/+download/MG5_aMC_v2.7.3.py3.tar.gz", + ) variant( "atlas", @@ -35,6 +57,7 @@ class Madgraph5amc(MakefilePackage): ) variant("ninja", default=False, description="Use external installation" + " of Ninja") variant("collier", default=False, description="Use external installation" + " of Collier") + variant("pythia8", default=False, description="Use external installation of Pythia8") conflicts("%gcc@10:", when="@2.7.3") @@ -46,15 +69,21 @@ class Madgraph5amc(MakefilePackage): depends_on("py-six", when="@2.7.3.py3,2.8.0:", type=("build", "run")) depends_on("python@3.7:", when="@2.7.3.py3", type=("build", "run")) - depends_on("python@2.7.0:2.8.0,3.7:", when="@2.8.0:", type=("build", "run")) depends_on("libtirpc") + depends_on("pythia8", when="+pythia8") - patch("array-bounds.patch") - patch("madgraph5amc.patch", level=0) - patch("madgraph5amc-2.7.3.atlas.patch", level=0, when="@2.7.3.py2+atlas") + patch("gcc14.patch", when="@:3.5.5%gcc@14:") + patch("array-bounds.patch", when="@:2.8.1") + patch("madgraph5amc.patch", level=0, when="@:2.9") patch("madgraph5amc-2.7.3.atlas.patch", level=0, when="@2.7.3.py3+atlas") patch("madgraph5amc-2.8.0.atlas.patch", level=0, when="@2.8.0+atlas") patch("madgraph5amc-2.8.0.atlas.patch", level=0, when="@2.8.1+atlas") + # Fix running from CVMFS on AFS, for example on lxplus at CERN + patch( + "https://patch-diff.githubusercontent.com/raw/mg5amcnlo/mg5amcnlo/pull/96.diff?full_index=1", + sha256="ac6644f1d0ef51d9bdb27a1519261f1cf27d075d39faa278fbc2849acbc5575d", + when="@3:3.5", + ) def edit(self, spec, prefix): def set_parameter(name, value): @@ -85,12 +114,6 @@ def build(self, spec, prefix): with working_dir(join_path("vendor", "CutTools")): make(parallel=False) - with working_dir(join_path("vendor", "StdHEP")): - for m in ["mcfio/arch_mcfio", "src/stdhep_arch"]: - arch = FileFilter(m) - arch.filter("CC.*=.*", "CC = {0}".format(spack_cc)) - make(parallel=False) - if "+atlas" in spec: if os.path.exists(join_path("bin", "compile.py")): compile_py = Executable(join_path("bin", "compile.py")) @@ -120,3 +143,20 @@ def installfile(filename): join_path("Template", "LO", "Source", ".make_opts"), join_path(prefix, "Template", "LO", "Source", "make_opts"), ) + + # TODO: Fix for reproducibility, see https://github.com/spack/spack/pull/41128#issuecomment-2305777485 + if "+pythia8" in spec: + with open("install-pythia8-interface", "w") as f: + f.write( + f"""set pythia8_path {spec['pythia8'].prefix} + install mg5amc_py8_interface + """ + ) + mg5 = Executable(join_path(prefix, "bin", "mg5_aMC")) + mg5("install-pythia8-interface") + + def url_for_version(self, version): + major = str(version).split(".")[0] + minor = str(version).split(".")[1] + url = f"https://launchpad.net/mg5amcnlo/{major}.0/{major}.{minor}.x/+download/MG5_aMC_v{version}.tar.gz" + return url diff --git a/var/spack/repos/builtin/packages/magma/package.py b/var/spack/repos/builtin/packages/magma/package.py index 6e91a051443d5b..86be7b09d97db6 100644 --- a/var/spack/repos/builtin/packages/magma/package.py +++ b/var/spack/repos/builtin/packages/magma/package.py @@ -66,6 +66,7 @@ class Magma(CMakePackage, CudaPackage, ROCmPackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", ]: depends_on(f"rocm-core@{ver}", when=f"@2.8.0: +rocm ^hip@{ver}") depends_on("python", when="@master", type="build") diff --git a/var/spack/repos/builtin/packages/makedepf90/package.py b/var/spack/repos/builtin/packages/makedepf90/package.py new file mode 100644 index 00000000000000..79ad93eb9826c0 --- /dev/null +++ b/var/spack/repos/builtin/packages/makedepf90/package.py @@ -0,0 +1,24 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class Makedepf90(AutotoolsPackage): + """Makedepf90 is a program for automatic creation of Makefile-style dependency lists for + Fortran source code.""" + + homepage = "https://salsa.debian.org/science-team/makedepf90" + url = "https://deb.debian.org/debian/pool/main/m/makedepf90/makedepf90_3.0.1.orig.tar.xz" + + maintainers("tukss") + + license("GPL-2.0-only", checked_by="tukss") + + version("3.0.1", sha256="a11601ea14ad793f23fca9c7e7df694b6337f962ccc930d995d72e172edf29ee") + + depends_on("c", type="build") + depends_on("flex", type="build") + depends_on("bison", type="build") diff --git a/var/spack/repos/builtin/packages/malt/package.py b/var/spack/repos/builtin/packages/malt/package.py index f5a4bfe01bd547..0532d6ded460e0 100644 --- a/var/spack/repos/builtin/packages/malt/package.py +++ b/var/spack/repos/builtin/packages/malt/package.py @@ -15,17 +15,22 @@ class Malt(CMakePackage): # Project infos homepage = "https://memtt.github.io/malt" - url = "https://github.com/memtt/malt/archive/v1.2.2.tar.gz" + url = "https://github.com/memtt/malt/releases/download/v1.2.4/malt-1.2.4.tar.bz2" maintainers("svalat") license("CECILL-C") # Versions - version("1.2.2", sha256="e19f49ad97bf2deedf0557eb00267f4dcf1c932c494dd07ada07fcdf5421935f") - version("1.2.1", sha256="0e4c0743561f9fcc04dc83457386167a9851fc9289765f8b4f9390384ae3618a") + version("1.2.4", sha256="47068fe981b4cbbfe30eeff37767d9057992f8515106d7809ce090d3390a712f") + version("1.2.3", sha256="edba5d9e6a11308f82b9c8b61871e47a8ae18493bf8bff7b6ff4f4a4369428de") + version("1.2.2", sha256="543cace664203fd9eb6b7d4945c573a3e507a43da105b5dc7ac03c78e9bb1a10") + version( + "1.2.1", + sha256="0e4c0743561f9fcc04dc83457386167a9851fc9289765f8b4f9390384ae3618a", + url="https://github.com/memtt/malt/archive/v1.2.1.tar.gz", + ) - depends_on("c", type="build") # generated - depends_on("cxx", type="build") # generated + depends_on("cxx", type="build") # Variants variant( diff --git a/var/spack/repos/builtin/packages/mapl/package.py b/var/spack/repos/builtin/packages/mapl/package.py index e82a5eb49897f5..ed7898a9369776 100644 --- a/var/spack/repos/builtin/packages/mapl/package.py +++ b/var/spack/repos/builtin/packages/mapl/package.py @@ -38,9 +38,14 @@ class Mapl(CMakePackage): version("develop", branch="develop") version("main", branch="main") + version("2.50.0", sha256="12282e547936f667f85c95d466273dcbaccbd600add72fa5981c0c734ccb1f7d") + version("2.49.1", sha256="975e349c7ff8be65d4e63f2a6adf74ca96127628505dbce16c7ba7a3901edc70") + version("2.49.0", sha256="fdf4d48bd38abd1059180b123c5d9fdc2781992c783244ddc51ab0f2ef63dd67") + version("2.48.0", sha256="60a0fc4fd82b1a05050666ae478da7d79d86305aff1643a57bc09cb5347323b7") version("2.47.2", sha256="d4ca384bf249b755454cd486a26bae76944a7cae3a706b9a7c9298825077cac0") version("2.47.1", sha256="ca3e94c0caa78a91591fe63603d1836196f5294d4baad7cf1d83b229b3a85916") version("2.47.0", sha256="66c862d2ab8bcd6969e9728091dbca54f1f420e97e41424c4ba93ef606088459") + version("2.46.4", sha256="f0c169254727d61bfc83beb3abd14f2562480c4cdbd2ad5bc1fe0419828a0ac2") version("2.46.3", sha256="333e1382ab744302d28b6f39e7f5504c7919d77d2443d70af952f60cbd8f27e7") version("2.46.2", sha256="6d397ad73042355967de8ef5b521d6135c004f96e93ae7b215f9ee325e75c6f0") version("2.46.1", sha256="f3090281de6293b484259d58f852c45b98759de8291d36a4950e6d348ece6573") @@ -146,11 +151,17 @@ class Mapl(CMakePackage): # Versions later than 3.14 remove FindESMF.cmake # from ESMA_CMake. + resource( + name="esma_cmake", + git="https://github.com/GEOS-ESM/ESMA_cmake.git", + tag="v3.51.0", + when="@2.48:", + ) resource( name="esma_cmake", git="https://github.com/GEOS-ESM/ESMA_cmake.git", tag="v3.46.0", - when="@2.47:", + when="@2.47", ) resource( name="esma_cmake", @@ -231,6 +242,7 @@ class Mapl(CMakePackage): variant("extdata2g", default=True, description="Use ExtData2G") variant("pfunit", default=False, description="Build with pFUnit support") variant("f2py", default=False, description="Build with f2py support") + variant("zstd", default=True, description="Build with ZSTD support", when="@2.49:") variant( "build_type", @@ -243,11 +255,15 @@ class Mapl(CMakePackage): conflicts("+pflogger", when="@:2.40.3 %intel@2021.7:") conflicts("+extdata2g", when="@:2.40.3 %intel@2021.7:") - depends_on("cmake@3.17:", type="build") + depends_on("cmake@3.23:", type="build", when="@2.50:") + depends_on("cmake@3.17:", type="build", when="@:2.49") depends_on("mpi") depends_on("hdf5") depends_on("netcdf-c") + depends_on("netcdf-c +zstd", when="+zstd") depends_on("netcdf-fortran") + + # ESMF dependency depends_on("esmf@8.6.1:", when="@2.45:") depends_on("esmf@8.6.0", when="@2.44") depends_on("esmf@8.5:", when="@2.40:2.43") @@ -257,46 +273,54 @@ class Mapl(CMakePackage): depends_on("esmf~debug", when="~debug") depends_on("esmf+debug", when="+debug") - depends_on("gftl@1.13.0:", when="@2.45:") + # udunits dependency from MAPL 2.48 onwards + depends_on("udunits", when="@2.48:") + + # gFTL dependency + depends_on("gftl@1.14.0:", when="@2.48:") + depends_on("gftl@1.13.0:", when="@2.45:2.47") depends_on("gftl@1.11.0:", when="@2.44") depends_on("gftl@1.10.0:", when="@2.40:2.43") depends_on("gftl@1.5.5:1.9", when="@:2.39") - # There was an interface change in gftl-shared, so we need to control versions - # MAPL 2.39 and older can use up to 1.6.0 but MAPL 2.40+ needs 1.6.1 or higher - depends_on("gftl-shared@1.8.0:", when="@2.45:") + # gFTL-Shared dependency + depends_on("gftl-shared@1.9.0:", when="@2.48:") + depends_on("gftl-shared@1.8.0:", when="@2.45:2.47") depends_on("gftl-shared@1.7.0:", when="@2.44") depends_on("gftl-shared@1.6.1:", when="@2.40:2.43") depends_on("gftl-shared@1.3.1:1.6.0", when="@:2.39") - # There was an interface change in yaFyaml, so we need to control versions - # MAPL 2.22 and older uses older version, MAPL 2.23+ and higher uses newer - # Note that MAPL 2.40+ no longer require yafyaml as we get yaml support - # via esmf 8.5.0 - depends_on("yafyaml@1.0-beta5", when="@:2.22+extdata2g") + # yafyaml dependency + # Note that MAPL 2.40+ no longer directly requires yafyaml as + # extdata2g gets yaml support via esmf 8.5.0, but pflogger will + # bring in yafyaml as a dependency. depends_on("yafyaml@1.0.4:", when="@2.23:2.39+extdata2g") + depends_on("yafyaml@1.0-beta5", when="@:2.22+extdata2g") - # pFlogger depends on yaFyaml in the same way. MAPL 2.22 and below uses old - # yaFyaml so we need to use old pFlogger, but MAPL 2.23+ uses new yaFyaml - depends_on("pflogger@:1.6 +mpi", when="@:2.22+pflogger") - depends_on("pflogger@1.9.1: +mpi", when="@2.23:2.39+pflogger") - depends_on("pflogger@1.9.5: +mpi", when="@2.40:2.43+pflogger") + # pflogger dependency + depends_on("pflogger@1.15.0: +mpi", when="@2.48:+pflogger") + depends_on("pflogger@1.14.0: +mpi", when="@2.45:2.47+pflogger") depends_on("pflogger@1.11.0: +mpi", when="@2.44+pflogger") - depends_on("pflogger@1.14.0: +mpi", when="@2.45:+pflogger") + depends_on("pflogger@1.9.5: +mpi", when="@2.40:2.43+pflogger") + depends_on("pflogger@1.9.1: +mpi", when="@2.23:2.39+pflogger") + depends_on("pflogger@:1.6 +mpi", when="@:2.22+pflogger") - # fArgParse v1.4.1 is the first usable version with MAPL - # we now require 1.5.0 with MAPL 2.40+ - depends_on("fargparse@1.7.0:", when="@2.45:+fargparse") + # fargparse dependency + depends_on("fargparse@1.8.0:", when="@2.48:+fargparse") + depends_on("fargparse@1.7.0:", when="@2.45:2.47+fargparse") depends_on("fargparse@1.6.0:", when="@2.44+fargparse") depends_on("fargparse@1.5.0:", when="@2.40:43+fargparse") depends_on("fargparse@1.4.1:1.4", when="@:2.39+fargparse") - depends_on("pfunit@4.9: +mpi +fhamcrest", when="@2.45:+pfunit") + # pfunit dependency + depends_on("pfunit@4.10: +mpi +fhamcrest", when="@2.48:+pfunit") + depends_on("pfunit@4.9: +mpi +fhamcrest", when="@2.45:2.47+pfunit") depends_on("pfunit@4.8: +mpi +fhamcrest", when="@2.44+pfunit") depends_on("pfunit@4.7.3: +mpi +fhamcrest", when="@2.40:+pfunit") depends_on("pfunit@4.6.1: +mpi +fhamcrest", when="@2.32:+pfunit") depends_on("pfunit@4.4.1: +mpi +fhamcrest", when="@2.26:+pfunit") depends_on("pfunit@4.2: +mpi +fhamcrest", when="@:2.25+pfunit") + depends_on("flap", when="+flap") depends_on("ecbuild", type="build") @@ -388,3 +412,14 @@ def setup_build_environment(self, env): # name is common and used all over the place, # and if it is set it breaks the mapl build. env.unset("BASEDIR") + + # We can run some tests to make sure the build is working + # but we can only do it if the pfunit variant is enabled + @when("+pfunit") + @run_after("build") + @on_package_attributes(run_tests=True) + def check(self): + with working_dir(self.builder.build_directory): + # The test suite contains a lot of tests. We select only those + # that are cheap. Note this requires MPI and 6 processes + ctest("--output-on-failure", "-L", "ESSENTIAL") diff --git a/var/spack/repos/builtin/packages/masurca/package.py b/var/spack/repos/builtin/packages/masurca/package.py index 28bd9b2304937c..24d894e29ab27c 100644 --- a/var/spack/repos/builtin/packages/masurca/package.py +++ b/var/spack/repos/builtin/packages/masurca/package.py @@ -12,7 +12,7 @@ class Masurca(Package): of the de Bruijn graph and Overlap-Layout-Consensus (OLC) approaches.""" - homepage = "http://www.genome.umd.edu/masurca.html" + homepage = "https://www.genome.umd.edu/masurca.html" url = "https://github.com/alekseyzimin/masurca/releases/download/v3.3.1/MaSuRCA-3.3.1.tar.gz" license("GPL-3.0-only") diff --git a/var/spack/repos/builtin/packages/mbedtls/package.py b/var/spack/repos/builtin/packages/mbedtls/package.py index 7f0bbc100006c7..73f463239d026c 100644 --- a/var/spack/repos/builtin/packages/mbedtls/package.py +++ b/var/spack/repos/builtin/packages/mbedtls/package.py @@ -14,112 +14,28 @@ class Mbedtls(MakefilePackage): """ homepage = "https://tls.mbed.org" - url = "https://github.com/ARMmbed/mbedtls/archive/mbedtls-2.2.1.tar.gz" + url = "https://github.com/Mbed-TLS/mbedtls/releases/download/v3.6.0/mbedtls-3.6.0.tar.bz2" + maintainers("haampie") license("Apache-2.0 OR GPL-2.0-or-later") # version 3.x + version("3.6.0", sha256="3ecf94fcfdaacafb757786a01b7538a61750ebd85c4b024f56ff8ba1490fcd38") version("3.3.0", sha256="a22ff38512697b9cd8472faa2ea2d35e320657f6d268def3a64765548b81c3ec") - version( - "3.2.1", - sha256="5850089672560eeaca03dc36678ee8573bb48ef6e38c94f5ce349af60c16da33", - deprecated=True, - ) - version( - "3.1.0", - sha256="64d01a3b22b91cf3a25630257f268f11bc7bfa37981ae6d397802dd4ccec4690", - deprecated=True, - ) - version( - "3.0.0", - sha256="377d376919be19f07c7e7adeeded088a525be40353f6d938a78e4f986bce2ae0", - deprecated=True, - ) # version 2.x + version("2.28.8", sha256="241c68402cef653e586be3ce28d57da24598eb0df13fcdea9d99bfce58717132") version("2.28.2", sha256="1db6d4196178fa9f8264bef5940611cd9febcd5d54ec05f52f1e8400f792b5a4") - version( - "2.28.1", - sha256="82ff5fda18ecbdee9053bdbeed6059c89e487f3024227131657d4c4536735ed1", - deprecated=True, - ) - version( - "2.28.0", - sha256="f644248f23cf04315cf9bb58d88c4c9471c16ca0533ecf33f86fb7749a3e5fa6", - deprecated=True, - ) - version( - "2.27.0", - sha256="4f6a43f06ded62aa20ef582436a39b65902e1126cbbe2fb17f394e9e9a552767", - deprecated=True, - ) + version("2.7.19", sha256="3da12b1cebe1a25da8365d5349f67db514aefcaa75e26082d7cb2fa3ce9608aa") + + # deprecated versions + # required by julia@1.6:1.7 version( "2.24.0", sha256="b5a779b5f36d5fc4cba55faa410685f89128702423ad07b36c5665441a06a5f3", deprecated=True, ) - version( - "2.16.12", - sha256="0afb4a4ce5b771f2fb86daee786362fbe48285f05b73cd205f46a224ec031783", - deprecated=True, - ) - version( - "2.16.11", - sha256="51bb9685c4f4ff9255da5659ff346b89dcaf129e3ba0f3b2b0c48a1a7495e701", - deprecated=True, - ) - version( - "2.16.9", - sha256="b7ca99ee10551b5b13242b7effebefd2a5cc38c287e5f5be1267d51ee45effe3", - deprecated=True, - ) - version( - "2.16.7", - sha256="4786b7d1676f5e4d248f3a7f2d28446876d64962634f060ff21b92c690cfbe86", - deprecated=True, - ) - version( - "2.16.1", - sha256="daf0d40f3016c34eb42d1e4b3b52be047e976d566aba8668977723c829af72f3", - deprecated=True, - ) - version("2.7.19", sha256="3da12b1cebe1a25da8365d5349f67db514aefcaa75e26082d7cb2fa3ce9608aa") - version( - "2.7.10", - sha256="42b19b30b86a798bdb69c5da2f8bbd7d72ffede9a35b888ab986a29480f9dc3e", - deprecated=True, - ) - version( - "2.3.0", - sha256="1614ee70be99a18ca8298148308fb725aad4ad31c569438bb51655a4999b14f9", - deprecated=True, - ) - version( - "2.2.1", - sha256="32819c62c20e8740a11b49daa5d09ac6f179edf120a87ac559cd63120b66b699", - deprecated=True, - ) - version( - "2.2.0", - sha256="75494361e412444b38ebb9c908b7e17a5fb582eb9c3fadb2fe9b21e96f1bf8cb", - deprecated=True, - ) - version( - "2.1.4", - sha256="a0ee4d3dd135baf67a3cf5ad9e70d67575561704325d6c93d8f087181f4db338", - deprecated=True, - ) - version( - "2.1.3", - sha256="94da4618d5a518b99f7914a5e348be436e3571113d9a9978d130725a1fc7bfac", - deprecated=True, - ) - version( - "1.3.16", - sha256="0c2666222b66cf09c4630fa60a715aafd7decb1a09933b75c0c540b0625ac5df", - deprecated=True, - ) depends_on("c", type="build") # generated @@ -160,6 +76,11 @@ class Mbedtls(MakefilePackage): # libs=shared building both shared and static libs. # conflicts('libs=shared', msg='Makefile build cannot build shared libs only now') + def url_for_version(self, version): + if self.spec.satisfies("@:2.28.7,3:3.5"): + return f"https://github.com/Mbed-TLS/mbedtls/archive/refs/tags/v{version}.tar.gz" + return f"https://github.com/Mbed-TLS/mbedtls/releases/download/v{version}/mbedtls-{version}.tar.bz2" + def flag_handler(self, name, flags): # Compile with PIC, if requested. if name == "cflags": diff --git a/var/spack/repos/builtin/packages/mdb/package.py b/var/spack/repos/builtin/packages/mdb/package.py new file mode 100644 index 00000000000000..f10bf37084c6cc --- /dev/null +++ b/var/spack/repos/builtin/packages/mdb/package.py @@ -0,0 +1,51 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class Mdb(PythonPackage): + """mdb is a command line debugger aimed at parallel programs using the MPI + programming paradigm.""" + + homepage = "https://mdb.readthedocs.io/en/latest" + pypi = "mdb_debugger/mdb_debugger-1.0.3.tar.gz" + + maintainers("tommelt") + + license("MIT", checked_by="tommelt") + + version("1.0.3", sha256="c45cffb320a51274519753b950b7b72cd91a8a5804941556120ed41bb8b491d8") + + depends_on("python@3.10: +tkinter", type=("build", "run")) + depends_on("py-pip", type=("build", "run")) + depends_on("py-setuptools", type="build") + + depends_on("py-click@8.1.7", type=("build", "run")) + depends_on("py-pexpect@4.9:", type=("build", "run")) + depends_on("py-typing-extensions", type=("build", "run")) + depends_on("py-matplotlib@3.8.3 backend=qt5agg", type=("build", "run")) + depends_on("py-pyqt5", type=("build", "run")) + + depends_on("mpi", type=("run")) + + variant("manpage", default=False, description="build and install manpage") + variant("termgraph", default=True, description="build with termgraph support") + + with when("+termgraph"): + depends_on("py-termgraph", type=("build", "run")) + + with when("+manpage"): + depends_on("py-sphinx", type=("build")) + depends_on("py-sphinx-rtd-theme", type=("build")) + depends_on("py-sphinx-click", type=("build")) + + @run_after("install") + def build_docs(self): + if self.spec.satisfies("+manpage"): + make("-C", "docs", "man") + + mkdirp(prefix.share.man.man1) + copy("docs/build/man/mdb.1", prefix.share.man.man1) diff --git a/var/spack/repos/builtin/packages/mdspan/package.py b/var/spack/repos/builtin/packages/mdspan/package.py index bb5be2536bc34d..00c815e2c39273 100644 --- a/var/spack/repos/builtin/packages/mdspan/package.py +++ b/var/spack/repos/builtin/packages/mdspan/package.py @@ -30,7 +30,7 @@ def cmake_args(self): if self.spec.satisfies("+tests"): args.append("-DMDSPAN_ENABLE_TESTS=ON") args.append("-DMDSPAN_USE_SYSTEM_GTEST=ON") - if self.spec.satisfies("+bencmarks"): + if self.spec.satisfies("+benchmarks"): args.append("-DMDSPAN_ENABLE_BENCHMARKS=ON") if self.spec.satisfies("+examples"): args.append("-DMDSPAN_ENABLE_EXAMPLES=ON") diff --git a/var/spack/repos/builtin/packages/medipack/package.py b/var/spack/repos/builtin/packages/medipack/package.py index 02c046215b55bf..ec07e792fbff0d 100644 --- a/var/spack/repos/builtin/packages/medipack/package.py +++ b/var/spack/repos/builtin/packages/medipack/package.py @@ -13,12 +13,14 @@ class Medipack(CMakePackage): homepage = "https://github.com/SciCompKL/MeDiPack" url = "https://github.com/SciCompKL/MeDiPack/archive/refs/tags/v1.2.2.tar.gz" + version("1.3.0", sha256="81daf8391ca00286a1276408badc7f1c9f76af889eb16940601c0ffb5f229e1d") version("1.2.2", sha256="8937fa1025c6fb12f516cacf38a7f776221e7e818b30f17ce334c63f78513aa7") version("1.2.1", sha256="c746196b98cfe24a212584cdb88bd12ebb14f4a54728070d605e0c6d0e75db8a") depends_on("cxx", type="build") # generated depends_on("cmake@3.12:", type="build", when="@1.2.2:") + depends_on("mpi") build_system( conditional("cmake", when="@1.2.2:"), @@ -27,7 +29,7 @@ class Medipack(CMakePackage): ) def install(self, spec, prefix): - mkdirp(join_path(prefix, "include")) - install_tree(join_path(self.stage.source_path, "include"), join_path(prefix, "include")) - mkdirp(join_path(prefix, "src")) - install_tree(join_path(self.stage.source_path, "src"), join_path(prefix, "src")) + mkdirp(self.prefix.include) + install_tree(join_path(self.stage.source_path, "include"), self.prefix.include) + mkdirp(self.prefix.src) + install_tree(join_path(self.stage.source_path, "src"), self.prefix.src) diff --git a/var/spack/repos/builtin/packages/mepo/package.py b/var/spack/repos/builtin/packages/mepo/package.py index ac2dd71ab4998b..a0b598cd7377eb 100644 --- a/var/spack/repos/builtin/packages/mepo/package.py +++ b/var/spack/repos/builtin/packages/mepo/package.py @@ -17,6 +17,7 @@ class Mepo(PythonPackage): license("Apache-2.0", checked_by="mathomp4") + version("2.1.0", sha256="24f94f7fbc15f740e13ace695e204d6370bf4156eca08c24bcbeacaacb1b6c12") version("2.0.0", sha256="8ca4aabd8ca350183db3b8e117b0cd87d9a20277e39931e2799c86bfa910ae71") version("2.0.0rc4", sha256="5f6113be565c561c08114355570a259042b25222a9e8e1dc6e6e44448381cd36") version("2.0.0rc3", sha256="c0c897a33f5018489e6cc14892961831c8922a3378ac30436496c52bf877aff7") diff --git a/var/spack/repos/builtin/packages/meshtool/package.py b/var/spack/repos/builtin/packages/meshtool/package.py index d5d63ddd6895f9..dfa74a9c854188 100644 --- a/var/spack/repos/builtin/packages/meshtool/package.py +++ b/var/spack/repos/builtin/packages/meshtool/package.py @@ -18,6 +18,7 @@ class Meshtool(MakefilePackage): # Version to use with openCARP releases # It is possible that different openCARP releases rely on the same # meshtool version + version("oc16.0", commit="867431d6bde35ad41104f611aa57130ef58cfb79") version("oc15.0", commit="867431d6bde35ad41104f611aa57130ef58cfb79") version("oc13.0", commit="867431d6bde35ad41104f611aa57130ef58cfb79") version("oc12.0", commit="867431d6bde35ad41104f611aa57130ef58cfb79") diff --git a/var/spack/repos/builtin/packages/meson/package.py b/var/spack/repos/builtin/packages/meson/package.py index afad0e56721836..e142fd09661902 100644 --- a/var/spack/repos/builtin/packages/meson/package.py +++ b/var/spack/repos/builtin/packages/meson/package.py @@ -2,6 +2,8 @@ # Spack Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) +import sys + from spack.package import * @@ -179,5 +181,11 @@ def setup_dependent_build_environment(self, env, dependent_spec): if self.spec.satisfies("platform=darwin"): env.set("STRIP", "strip -x") + def _meson_bin_dir(self): + bin_dir = self.spec.prefix.bin + if sys.platform == "win32": + bin_dir = self.spec.prefix.scripts + return bin_dir + def setup_dependent_package(self, module, dspec): - module.meson = Executable(self.spec.prefix.bin.meson) + module.meson = Executable(self._meson_bin_dir().meson) diff --git a/var/spack/repos/builtin/packages/mfem/package.py b/var/spack/repos/builtin/packages/mfem/package.py index 8efa3fbb3f90e0..b50af840f2725d 100644 --- a/var/spack/repos/builtin/packages/mfem/package.py +++ b/var/spack/repos/builtin/packages/mfem/package.py @@ -163,11 +163,11 @@ class Mfem(Package, CudaPackage, ROCmPackage): variant("static", default=True, description="Build static library") variant("shared", default=False, description="Build shared library") variant("mpi", default=True, sticky=True, description="Enable MPI parallelism") - # Can we make the default value for 'metis' to depend on the 'mpi' value? + # Can we make the default value for "metis" to depend on the "mpi" value? variant("metis", default=True, sticky=True, description="Enable METIS support") variant("openmp", default=False, description="Enable OpenMP parallelism") - # Note: '+cuda' and 'cuda_arch' variants are added by the CudaPackage - # Note: '+rocm' and 'amdgpu_target' variants are added by the ROCmPackage + # Note: "+cuda" and "cuda_arch" variants are added by the CudaPackage + # Note: "+rocm" and "amdgpu_target" variants are added by the ROCmPackage variant("occa", default=False, description="Enable OCCA backend") variant("raja", default=False, description="Enable RAJA backend") variant("libceed", default=False, description="Enable libCEED backend") @@ -417,7 +417,7 @@ class Mfem(Package, CudaPackage, ROCmPackage): depends_on("occa@1.0.8:", when="@:4.1+occa") depends_on("occa@1.1.0", when="@4.2.0:+occa") depends_on("occa+cuda", when="+occa+cuda") - # TODO: propagate '+rocm' variant to occa when it is supported + # TODO: propagate "+rocm" variant to occa when it is supported depends_on("raja@0.7.0:0.9.0", when="@4.0.0+raja") depends_on("raja@0.10.0:0.12.1", when="@4.0.1:4.2.0+raja") @@ -579,8 +579,8 @@ def find_optional_library(name, prefix): "PREFIX=%s" % prefix, "MFEM_USE_MEMALLOC=YES", "MFEM_DEBUG=%s" % yes_no("+debug"), - # NOTE: env['CXX'] is the spack c++ compiler wrapper. The real - # compiler is defined by env['SPACK_CXX']. + # NOTE: env["CXX"] is the spack c++ compiler wrapper. The real + # compiler is defined by env["SPACK_CXX"]. "CXX=%s" % env["CXX"], "MFEM_USE_LIBUNWIND=%s" % yes_no("+libunwind"), "%s=%s" % (zlib_var, yes_no("+zlib")), @@ -764,7 +764,7 @@ def find_optional_library(name, prefix): elif "^spectrum-mpi" in strumpack: sp_lib += [ld_flags_from_dirs([mpi.prefix.lib], ["mpi_ibm_mpifh"])] if "+openmp" in strumpack: - # The '+openmp' in the spec means strumpack will TRY to find + # The "+openmp" in the spec means strumpack will TRY to find # OpenMP; if not found, we should not add any flags -- how do # we figure out if strumpack found OpenMP? if not self.spec.satisfies("%apple-clang"): @@ -799,7 +799,7 @@ def find_optional_library(name, prefix): ) sp_lib += [ld_flags_from_library_list(zfp_lib)] if "+cuda" in strumpack: - # assuming also ('+cuda' in spec) + # assuming also ("+cuda" in spec) sp_lib += ["-lcusolver", "-lcublas"] options += [ "STRUMPACK_OPT=%s" % " ".join(sp_opt), @@ -914,7 +914,7 @@ def find_optional_library(name, prefix): headers = find_headers("libunwind", libunwind.prefix.include) headers.add_macro("-g") libs = find_optional_library("libunwind", libunwind.prefix) - # When mfem uses libunwind, it also needs 'libdl'. + # When mfem uses libunwind, it also needs "libdl". libs += LibraryList(find_system_libraries("libdl")) options += [ "LIBUNWIND_OPT=%s" % headers.cpp_flags, @@ -973,6 +973,9 @@ def find_optional_library(name, prefix): if "^rocthrust" in spec and not spec["hip"].external: # petsc+rocm needs the rocthrust header path hip_headers += spec["rocthrust"].headers + if "^rocprim" in spec and not spec["hip"].external: + # rocthrust [via petsc+rocm] has a dependency on rocprim + hip_headers += spec["rocprim"].headers if "^hipblas" in spec and not spec["hip"].external: # superlu-dist+rocm needs the hipblas header path hip_headers += spec["hipblas"].headers @@ -1297,7 +1300,7 @@ def libs(self): @property def config_mk(self): """Export the location of the config.mk file. - This property can be accessed using spec['mfem'].package.config_mk + This property can be accessed using spec["mfem"].package.config_mk """ dirs = [self.prefix, self.prefix.share.mfem] for d in dirs: @@ -1309,7 +1312,7 @@ def config_mk(self): @property def test_mk(self): """Export the location of the test.mk file. - This property can be accessed using spec['mfem'].package.test_mk. + This property can be accessed using spec["mfem"].package.test_mk. In version 3.3.2 and newer, the location of test.mk is also defined inside config.mk, variable MFEM_TEST_MK. """ diff --git a/var/spack/repos/builtin/packages/migraphx/package.py b/var/spack/repos/builtin/packages/migraphx/package.py index a4c8882a79daea..f282fc5293b52d 100644 --- a/var/spack/repos/builtin/packages/migraphx/package.py +++ b/var/spack/repos/builtin/packages/migraphx/package.py @@ -20,6 +20,8 @@ class Migraphx(CMakePackage): libraries = ["libmigraphx"] license("MIT") + version("6.2.1", sha256="a9479fd6846bae4a888f712c2fecee6a252951ae8979d9990b100450e4cd6c30") + version("6.2.0", sha256="7b36c1a0c44dd21f31ce6c9c4e7472923281aa7fdc693e75edd2670b101a6d48") version("6.1.2", sha256="829f4a2bd9fe3dee130dfcca103ddc7691da18382f5b683aaca8f3ceceaef355") version("6.1.1", sha256="e14a62678e97356236b45921e24f28ff430d670fb70456c3e5ebfeeb22160811") version("6.1.0", sha256="2ba44146397624845c64f3898bb1b08837ad7a49f133329e58eb04c05d1f36ac") @@ -94,6 +96,8 @@ class Migraphx(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"rocm-cmake@{ver}:", type="build", when=f"@{ver}") depends_on(f"hip@{ver}", when=f"@{ver}") @@ -101,7 +105,7 @@ class Migraphx(CMakePackage): depends_on(f"rocblas@{ver}", when=f"@{ver}") depends_on(f"miopen-hip@{ver}", when=f"@{ver}") - for ver in ["6.0.0", "6.0.2", "6.1.0", "6.1.1", "6.1.2"]: + for ver in ["6.0.0", "6.0.2", "6.1.0", "6.1.1", "6.1.2", "6.2.0", "6.2.1"]: depends_on(f"rocmlir@{ver}", when=f"@{ver}") @property diff --git a/var/spack/repos/builtin/packages/mimalloc/package.py b/var/spack/repos/builtin/packages/mimalloc/package.py index 7d5cd800622ff5..ff782be5550751 100644 --- a/var/spack/repos/builtin/packages/mimalloc/package.py +++ b/var/spack/repos/builtin/packages/mimalloc/package.py @@ -19,6 +19,7 @@ class Mimalloc(CMakePackage): version("dev-slice", branch="dev-slice") version("dev", branch="dev") version("master", branch="master") + version("2.1.7", sha256="0eed39319f139afde8515010ff59baf24de9e47ea316a315398e8027d198202d") version("2.1.2", sha256="2b1bff6f717f9725c70bf8d79e4786da13de8a270059e4ba0bdd262ae7be46eb") version("2.1.1", sha256="38b9660d0d1b8a732160191609b64057d8ccc3811ab18b7607bc93ca63a6010f") version("2.1.0", sha256="86e5e53e38bace59a9eb20d27e7bd7c5f448cb246a887d4f99478fa4809731fc") @@ -36,6 +37,7 @@ class Mimalloc(CMakePackage): depends_on("cxx", type="build") depends_on("cmake@3.0:", type="build") + conflicts("^cmake@:3.17", when="@2.1.7:") libs_values = ("shared", "static", "object") variant( diff --git a/var/spack/repos/builtin/packages/miniconda3/package.py b/var/spack/repos/builtin/packages/miniconda3/package.py index c28bf4be9cf751..4fdbf90436ad65 100644 --- a/var/spack/repos/builtin/packages/miniconda3/package.py +++ b/var/spack/repos/builtin/packages/miniconda3/package.py @@ -140,7 +140,7 @@ class Miniconda3(Package): """The minimalist bootstrap toolset for conda and Python3.""" - homepage = "https://conda.io/miniconda.html" + homepage = "https://docs.anaconda.com/miniconda/" for ver, packages in _versions.items(): key = "{0}-{1}".format(platform.system(), platform.machine()) diff --git a/var/spack/repos/builtin/packages/miopen-hip/package.py b/var/spack/repos/builtin/packages/miopen-hip/package.py index 52d9a28c1b1bf3..73c7d08c6c1da1 100644 --- a/var/spack/repos/builtin/packages/miopen-hip/package.py +++ b/var/spack/repos/builtin/packages/miopen-hip/package.py @@ -21,6 +21,8 @@ class MiopenHip(CMakePackage): libraries = ["libMIOpen"] license("MIT") + version("6.2.1", sha256="c7abe5ae7a332813a3c3da849e9a50b91221fe05c6bb622413e5b048b1f15982") + version("6.2.0", sha256="f4473f724362732019d505a0e01c17b060b542350859cb1e4bd4e3898b609276") version("6.1.2", sha256="c8ff4af72264b2049bfe2685d581ea0f3e43319db7bd00dc347159bcf2731614") version("6.1.1", sha256="cf568ea16dd23b32fe89e250bb33ed4722fea8aa7f407cc66ff37c37aab037ce") version("6.1.0", sha256="3b373117eaeaf618aab9b39bb22e9950fd49bd0e264c8587b0c51fa348afe0d1") @@ -84,12 +86,32 @@ class MiopenHip(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"rocm-cmake@{ver}:", type="build", when=f"@{ver}") depends_on(f"hip@{ver}", when=f"@{ver}") - depends_on(f"rocm-clang-ocl@{ver}", when=f"@{ver}") depends_on(f"rocblas@{ver}", when=f"@{ver}") + for ver in [ + "5.3.0", + "5.3.3", + "5.4.0", + "5.4.3", + "5.5.0", + "5.5.1", + "5.6.0", + "5.6.1", + "5.7.0", + "5.7.1", + "6.0.0", + "6.0.2", + "6.1.0", + "6.1.1", + "6.1.2", + ]: + depends_on(f"rocm-clang-ocl@{ver}", when=f"@{ver}") + for ver in ["5.3.0", "5.3.3"]: depends_on(f"mlirmiopen@{ver}", when=f"@{ver}") @@ -104,16 +126,20 @@ class MiopenHip(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on("nlohmann-json", type="link") depends_on(f"composable-kernel@{ver}", when=f"@{ver}") for ver in ["5.4.0", "5.4.3", "5.5.0"]: depends_on("nlohmann-json", type="link") depends_on(f"rocmlir@{ver}", when=f"@{ver}") - for ver in ["6.0.0", "6.0.2", "6.1.0", "6.1.1", "6.1.2"]: + for ver in ["6.0.0", "6.0.2", "6.1.0", "6.1.1", "6.1.2", "6.2.0", "6.2.1"]: depends_on("roctracer-dev@" + ver, when="@" + ver) for ver in ["6.1.0", "6.1.1", "6.1.2"]: depends_on("googletest") + for ver in ["6.2.0", "6.2.1"]: + depends_on(f"rocrand@{ver}", when=f"@{ver}") def setup_build_environment(self, env): lib_dir = self.spec["zlib-api"].libs.directories[0] @@ -160,7 +186,7 @@ def cmake_args(self): if self.spec.satisfies("@5.1.0:5.3"): mlir_inc = spec["mlirmiopen"].prefix.include args.append(self.define("CMAKE_CXX_FLAGS", "-I{0}".format(mlir_inc))) - if self.spec.satisfies("@5.4.0:"): + if self.spec.satisfies("@5.4.0:6.1"): args.append( "-DNLOHMANN_JSON_INCLUDE={0}".format(self.spec["nlohmann-json"].prefix.include) ) @@ -174,14 +200,21 @@ def cmake_args(self): args.append(self.define("MIOPEN_USE_MLIR", "OFF")) if self.spec.satisfies("@5.7.0:"): args.append(self.define("MIOPEN_ENABLE_AI_IMMED_MODE_FALLBACK", "OFF")) - args.append( - "-DNLOHMANN_JSON_INCLUDE={0}".format(self.spec["nlohmann-json"].prefix.include) - ) - if self.spec.satisfies("@6.0.0:"): + if self.spec.satisfies("@6:6.1"): args.append( "-DROCTRACER_INCLUDE_DIR={0}".format(self.spec["roctracer-dev"].prefix.include) ) args.append("-DROCTRACER_LIB_DIR={0}".format(self.spec["roctracer-dev"].prefix.lib)) - if self.spec.satisfies("@6.1:"): + if self.spec.satisfies("@6.1"): args.append("-DSQLITE_INCLUDE_DIR={0}".format(self.spec["sqlite"].prefix.include)) + if self.spec.satisfies("@6.2:"): + args.append( + self.define( + "CMAKE_CXX_FLAGS", + f"-I{self.spec['roctracer-dev'].prefix.include} " + f"-L{self.spec['roctracer-dev'].prefix.lib} " + f"-I{self.spec['nlohmann-json'].prefix.include} " + f"-I{self.spec['sqlite'].prefix.include} ", + ) + ) return args diff --git a/var/spack/repos/builtin/packages/mivisionx/package.py b/var/spack/repos/builtin/packages/mivisionx/package.py index 404b3f98437b24..f3e565f99f40a9 100644 --- a/var/spack/repos/builtin/packages/mivisionx/package.py +++ b/var/spack/repos/builtin/packages/mivisionx/package.py @@ -26,6 +26,8 @@ def url_for_version(self, version): return url.format(version) license("MIT") + version("6.2.1", sha256="591fe23ee1e2ab49f29aeeb835b5045e4ba00165c604ddfaa26bd8eb56cb367d") + version("6.2.0", sha256="ce28ac3aef76f28869c4dad9ffd9ef090e0b54ac58088f1f1eef803641125b51") version("6.1.2", sha256="0afa664931f566b7f5a3abd474dd641e56077529a2a5d7c788f5e6700e957ed6") version("6.1.1", sha256="3483b5167c47047cca78581cc6c9685138f9b5b25edb11618b720814788fc2a0") version("6.1.0", sha256="f18a72c4d12c36ab50f9c3a5c22fc3641feb11c99fed513540a16a65cd149fd1") @@ -60,7 +62,7 @@ def url_for_version(self, version): conflicts("+asan", when="os=centos8") patch("0001-add-half-include-path.patch", when="@5.5") - patch("0001-add-half-include-path-5.6.patch", when="@5.6:") + patch("0001-add-half-include-path-5.6.patch", when="@5.6:6.1") patch("0002-add-half-include-path-for-tests.patch", when="@5.5:6.0 +add_tests") patch("0002-add-half-include-path-for-tests-6.1.0.patch", when="@6.1.0: +add_tests") @@ -101,7 +103,7 @@ def patch(self): "amd_openvx_extensions/amd_nn/nn_hip/CMakeLists.txt", string=True, ) - if self.spec.satisfies("@5.5.0: + hip"): + if self.spec.satisfies("@5.5.0:6.1 + hip"): filter_file( r"${ROCM_PATH}/llvm/bin/clang++", "{0}/bin/clang++".format(self.spec["llvm-amdgpu"].prefix), @@ -249,6 +251,8 @@ def patch(self): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"miopen-hip@{ver}", when=f"@{ver}") for ver in [ @@ -266,6 +270,8 @@ def patch(self): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"migraphx@{ver}", when=f"@{ver}") depends_on(f"hip@{ver}", when=f"@{ver}") @@ -282,10 +288,12 @@ def patch(self): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"rocm-core@{ver}", when=f"@{ver}") depends_on("python@3.5:", type="build") - for ver in ["5.7.0", "5.7.1", "6.0.0", "6.0.2", "6.1.0", "6.1.1", "6.1.2"]: + for ver in ["5.7.0", "5.7.1", "6.0.0", "6.0.2", "6.1.0", "6.1.1", "6.1.2", "6.2.0", "6.2.1"]: depends_on(f"rpp@{ver}", when=f"@{ver}") def setup_run_environment(self, env): diff --git a/var/spack/repos/builtin/packages/mlpack/package.py b/var/spack/repos/builtin/packages/mlpack/package.py index a716e05cd1fd3d..c2ad3aa3baf595 100644 --- a/var/spack/repos/builtin/packages/mlpack/package.py +++ b/var/spack/repos/builtin/packages/mlpack/package.py @@ -20,6 +20,7 @@ class Mlpack(CMakePackage): license("BSD-3-Clause", checked_by="wdconinc") + version("4.5.0", sha256="aab70aee10c134ef3fe568843fe4b3bb5e8901af30ea666f57462ad950682317") version("4.4.0", sha256="61c604026d05af26c244b0e47024698bbf150dfcc9d77b64057941d7d64d6cf6") version("4.3.0", sha256="08cd54f711fde66fc3b6c9db89dc26776f9abf1a6256c77cfa3556e2a56f1a3d") version("4.2.1", sha256="2d2b8d61dc2e3179e0b6fefd5c217c57aa168c4d0b9c6868ddb94f6395a80dd5") @@ -39,6 +40,7 @@ class Mlpack(CMakePackage): # CMakeLists.txt depends_on("cmake@3.6:", type="build") depends_on("armadillo@9.800:") + depends_on("armadillo@10.8:", when="@4.5:") depends_on("ensmallen@2.10.0:") depends_on("cereal@1.1.2:") @@ -58,6 +60,7 @@ class Mlpack(CMakePackage): # ref: src/mlpack/bindings/python/CMakeLists.txt depends_on("py-cython@0.24:") depends_on("py-numpy") + depends_on("py-numpy@:1", when="@:4.4.0") depends_on("py-pandas@0.15.0:") # ref: src/mlpack/bindings/python/PythonInstall.cmake depends_on("py-pip") diff --git a/var/spack/repos/builtin/packages/mlperf-deepcam/package.py b/var/spack/repos/builtin/packages/mlperf-deepcam/package.py index 01ce1dbec6bd35..5baed86ac377f2 100644 --- a/var/spack/repos/builtin/packages/mlperf-deepcam/package.py +++ b/var/spack/repos/builtin/packages/mlperf-deepcam/package.py @@ -22,7 +22,7 @@ class MlperfDeepcam(Package, CudaPackage): depends_on("py-pycuda", type=("build", "run")) depends_on("py-mpi4py", type=("build", "run")) depends_on("py-torch+cuda", when="+cuda", type=("build", "run")) - depends_on("py-torch~cuda~cudnn~nccl", when="~cuda", type=("build", "run")) + depends_on("py-torch~cuda~nccl", when="~cuda", type=("build", "run")) depends_on("py-matplotlib", type=("build", "run")) depends_on("py-basemap", type=("build", "run")) depends_on("py-pillow", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/mold/package.py b/var/spack/repos/builtin/packages/mold/package.py index 8a156d27d513b6..00b02c8ae9cf87 100644 --- a/var/spack/repos/builtin/packages/mold/package.py +++ b/var/spack/repos/builtin/packages/mold/package.py @@ -16,6 +16,8 @@ class Mold(CMakePackage): license("MIT") + version("2.34.1", sha256="a8cf638045b4a4b2697d0bcc77fd96eae93d54d57ad3021bf03b0333a727a59d") + version("2.34.0", sha256="6067f41f624c32cb0f4e959ae7fabee5dd71dd06771e2c069c2b3a6a8eca3c8c") version("2.33.0", sha256="37b3aacbd9b6accf581b92ba1a98ca418672ae330b78fe56ae542c2dcb10a155") version("2.32.1", sha256="f3c9a527d884c635834fe7d79b3de959b00783bf9446280ea274d996f0335825") version("2.32.0", sha256="4b7e4146ea0f52be9adae8b417399f3676a041e65b55e3f25f088120d30a320b") diff --git a/var/spack/repos/builtin/packages/molgw/package.py b/var/spack/repos/builtin/packages/molgw/package.py index 64325684212c54..ed52c14dd32fa7 100644 --- a/var/spack/repos/builtin/packages/molgw/package.py +++ b/var/spack/repos/builtin/packages/molgw/package.py @@ -101,7 +101,7 @@ def edit(self, spec, prefix): if "+scalapack" in spec: flags["FC"] = "{0}".format(spec["mpi"].mpifc) else: - flags["FC"] = self.compiler.fc_names[0] + flags["FC"] = self.compiler.fc # Set FCFLAGS if self.compiler.flags.get("fflags") is not None: diff --git a/var/spack/repos/builtin/packages/mpas-model/package.py b/var/spack/repos/builtin/packages/mpas-model/package.py index dddf3d47fc6b56..7b738f2d76b3e6 100644 --- a/var/spack/repos/builtin/packages/mpas-model/package.py +++ b/var/spack/repos/builtin/packages/mpas-model/package.py @@ -69,6 +69,11 @@ class MpasModel(MakefilePackage): depends_on("mpi") depends_on("parallelio") + conflicts( + "%oneapi@:2024.1", + msg="ifx internal compiler error triggered by maps-model fixed in oneapi@2024.2", + ) + patch("makefile.patch", when="@7.0") parallel = False @@ -114,7 +119,7 @@ def target(self, model, action): cppflags.append("-DUNDERSCORE") elif satisfies("%fj"): fflags.extend(["-Free", "-Fwide", "-CcdRR8"]) - elif satisfies("%intel"): + elif satisfies("%intel") or satisfies("%oneapi"): fflags.extend(["-convert big_endian", "-FR"]) if satisfies("precision=double"): fflags.extend(["-r8"]) diff --git a/var/spack/repos/builtin/packages/mpc/package.py b/var/spack/repos/builtin/packages/mpc/package.py index 697c42d24c6c82..7095dbe29f680c 100644 --- a/var/spack/repos/builtin/packages/mpc/package.py +++ b/var/spack/repos/builtin/packages/mpc/package.py @@ -11,7 +11,7 @@ class Mpc(AutotoolsPackage, GNUMirrorPackage): with arbitrarily high precision and correct rounding of the result.""" - homepage = "http://www.multiprecision.org" + homepage = "https://www.multiprecision.org" gnu_mirror_path = "mpc/mpc-1.1.0.tar.gz" list_url = "http://www.multiprecision.org/mpc/download.html" diff --git a/var/spack/repos/builtin/packages/mpich/package.py b/var/spack/repos/builtin/packages/mpich/package.py index 60554b53d0f80c..5fc0538f15c7cc 100644 --- a/var/spack/repos/builtin/packages/mpich/package.py +++ b/var/spack/repos/builtin/packages/mpich/package.py @@ -30,6 +30,7 @@ class Mpich(AutotoolsPackage, CudaPackage, ROCmPackage): license("mpich2") version("develop", submodules=True) + version("4.2.3", sha256="7a019180c51d1738ad9c5d8d452314de65e828ee240bcb2d1f80de9a65be88a8") version("4.2.2", sha256="883f5bb3aeabf627cb8492ca02a03b191d09836bbe0f599d8508351179781d41") version("4.2.1", sha256="23331b2299f287c3419727edc2df8922d7e7abbb9fd0ac74e03b9966f9ad42d7") version("4.2.0", sha256="a64a66781b9e5312ad052d32689e23252f745b27ee8818ac2ac0c8209bc0b90e") @@ -134,6 +135,8 @@ class Mpich(AutotoolsPackage, CudaPackage, ROCmPackage): conflicts("datatype-engine=yaksa", when="device=ch3") conflicts("datatype-engine=yaksa", when="device=ch3:sock") + conflicts("datatype-engine=dataloop", when="+cuda") + conflicts("datatype-engine=dataloop", when="+rocm") variant( "hcoll", diff --git a/var/spack/repos/builtin/packages/mpifileutils/package.py b/var/spack/repos/builtin/packages/mpifileutils/package.py index 2d51b9425ec3c6..ffe5e9e9e70da7 100644 --- a/var/spack/repos/builtin/packages/mpifileutils/package.py +++ b/var/spack/repos/builtin/packages/mpifileutils/package.py @@ -65,11 +65,10 @@ class Mpifileutils(CMakePackage): def flag_handler(self, name, flags): spec = self.spec - iflags = [] if name == "cflags": if spec.satisfies("%oneapi"): - iflags.append("-Wno-error=implicit-function-declaration") - return (iflags, None, None) + flags.append("-Wno-error=implicit-function-declaration") + return (flags, None, None) def cmake_args(self): args = [ diff --git a/var/spack/repos/builtin/packages/mptensor/package.py b/var/spack/repos/builtin/packages/mptensor/package.py index 5558ca62427375..b3b3e972032f74 100644 --- a/var/spack/repos/builtin/packages/mptensor/package.py +++ b/var/spack/repos/builtin/packages/mptensor/package.py @@ -76,7 +76,7 @@ def setup_build_tests(self): print("Skipping copy of stand-alone test files: requires +mpi build") return - self.cache_extra_test_sources(".") + cache_extra_test_sources(self, ".") # Clean cached makefiles now so only done once print("Converting cached Makefile for stand-alone test use") diff --git a/var/spack/repos/builtin/packages/msr-safe/package.py b/var/spack/repos/builtin/packages/msr-safe/package.py new file mode 100644 index 00000000000000..d0c4d44a6d245a --- /dev/null +++ b/var/spack/repos/builtin/packages/msr-safe/package.py @@ -0,0 +1,61 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class MsrSafe(MakefilePackage): + """msr_safe provides controlled userspace access to model-specific registers (MSRs). + It allows system administrators to give register-level read access and bit-level write + access to trusted users in production environments. This access is useful where kernel + drivers have not caught up with new processor features, or performance constraints + requires batch access across dozens or hundreds of registers.""" + + homepage = "https://github.com/LLNL/msr-safe" + url = "https://github.com/LLNL/msr-safe/archive/refs/tags/v1.7.0.tar.gz" + + maintainers("kyotsukete", "rountree") + + license("GPL-2.0-only", checked_by="kyotsukete") + + variant( + "test_linux699", + default=False, + description="This variant is for testing against Linux kernel 6.9.9", + ) + + requires("@0.0.0_linux6.9.9", when="+test_linux699") + conflicts("@0.0.0_linux6.9.9", when="~test_linux699") + + # Version 0.0.0_linux6.9.9 is based on msr-safe@1.7.0 and solves for conflicts between 1.7.0 + # and the Linux kernel version 6.9.9. + version( + "0.0.0_linux6.9.9", + sha256="2b68670eda4467eaa9ddd7340522ab2000cf9d16d083607f9c481650ea1a2fc9", + url="https://github.com/rountree/msr-safe/archive/refs/heads/linux-6.9.9-cleanup.zip", + ) + version("1.7.0", sha256="bdf4f96bde92a23dc3a98716611ebbe7d302005305adf6a368cb25da9c8a609a") + version("1.6.0", sha256="defe9d12e2cdbcb1a9aa29bb09376d4156c3dbbeb7afc33315ca4b0b6859f5bb") + version("1.5.0", sha256="e91bac281339bcb0d119a74d68a73eafb5944fd933a893e0e3209576b4c6f233") + version("1.4.0", sha256="3e5a913e73978c9ce15ec5d2bf1a4583e9e5c30e4e75da0f76d9a7a6153398c0") + version("1.3.0", sha256="718dcc78272b45ffddf520078e7e54b0b6ce272f1ef0376de009a133149982a0") + version("1.2.0", sha256="d3c2e5280f94d65866f82a36fea50562dc3eaccbcaa81438562caaf35989d8e8") + version("1.1.0", sha256="5b723e9d360e15f3ed854a84de7430b2b77be1eb1515db03c66456db43684a83") + version("1.0.2", sha256="9511d021ab6510195e8cc3b0353a0ac414ab6965a188f47fbb8581f9156a970e") + + depends_on("linux-external-modules") + + @property + def build_targets(self): + return [ + "-C", + f"{self.spec['linux-external-modules'].prefix}", + f"M={self.build_directory}", + "modules", + ] + + @property + def install_targets(self): + return [f"DESTDIR={self.prefix}", "spack-install"] diff --git a/var/spack/repos/builtin/packages/mumps/package.py b/var/spack/repos/builtin/packages/mumps/package.py index 7750547cd2b0a0..d6a4434852410c 100644 --- a/var/spack/repos/builtin/packages/mumps/package.py +++ b/var/spack/repos/builtin/packages/mumps/package.py @@ -18,6 +18,7 @@ class Mumps(Package): maintainers("jcortial-safran") + version("5.7.3", sha256="84a47f7c4231b9efdf4d4f631a2cae2bdd9adeaabc088261d15af040143ed112") version("5.7.2", sha256="1362d377ce7422fc886c55212b4a4d2c381918b5ca4478f682a22d0627a8fbf8") version("5.6.2", sha256="13a2c1aff2bd1aa92fe84b7b35d88f43434019963ca09ef7e8c90821a8f1d59a") version("5.6.1", sha256="1920426d543e34d377604070fde93b8d102aa38ebdf53300cbce9e15f92e2896") diff --git a/var/spack/repos/builtin/packages/mvapich/package.py b/var/spack/repos/builtin/packages/mvapich/package.py index 37221fec277310..55aa19f3e2bfe2 100644 --- a/var/spack/repos/builtin/packages/mvapich/package.py +++ b/var/spack/repos/builtin/packages/mvapich/package.py @@ -69,7 +69,7 @@ class Mvapich(AutotoolsPackage): "pmi_version", description="Which pmi version to be used. If using pmi2 add it to your CFLAGS", default="simple", - values=("simple", "pmi2"), + values=("simple", "pmi2", "pmix"), multi=False, ) @@ -113,6 +113,7 @@ class Mvapich(AutotoolsPackage): depends_on("libfabric", when="netmod=ofi") depends_on("slurm", when="process_managers=slurm") depends_on("ucx", when="netmod=ucx") + depends_on("pmix", when="pmi_version=pmix") with when("process_managers=slurm"): conflicts("pmi_version=pmi2") @@ -120,6 +121,10 @@ class Mvapich(AutotoolsPackage): with when("process_managers=auto"): conflicts("pmi_version=pmi2") + with when("process_managers=hydra"): + conflicts("pmi_version=pmi2") + conflicts("pmi_version=pmix") + filter_compiler_wrappers("mpicc", "mpicxx", "mpif77", "mpif90", "mpifort", relative_root="bin") @classmethod @@ -265,6 +270,8 @@ def configure_args(self): args.extend(self.enable_or_disable("alloca")) args.append("--with-pmi=" + spec.variants["pmi_version"].value) + if "pmi_version=pmix" in spec: + args.append("--with-pmix={0}".format(spec["pmix"].prefix)) if "+debug" in self.spec: args.extend( diff --git a/var/spack/repos/builtin/packages/namd/package.py b/var/spack/repos/builtin/packages/namd/package.py index 273835e07ef2d7..47fcb3b03cc74c 100644 --- a/var/spack/repos/builtin/packages/namd/package.py +++ b/var/spack/repos/builtin/packages/namd/package.py @@ -9,6 +9,7 @@ import llnl.util.tty as tty +from spack.build_environment import optimization_flags from spack.package import * @@ -75,9 +76,24 @@ class Namd(MakefilePackage, CudaPackage, ROCmPackage): description="Enables Tcl and/or python interface", ) - variant("avxtiles", when="target=x86_64_v4:", default=False, description="Enable avxtiles") + variant( + "avxtiles", + when="target=x86_64_v4: @2.15:", + default=False, + description="Enable avxtiles supported with NAMD 2.15+", + ) variant("single_node_gpu", default=False, description="Single node GPU") + # Adding memopt variant to build memory-optimized mode that utilizes a compressed + # version of the molecular structure and also supports parallel I/O. + # Refer: https://www.ks.uiuc.edu/Research/namd/wiki/index.cgi?NamdMemoryReduction + variant( + "memopt", + when="@2.8:", + default=False, + description="Enable memory-optimized build supported with NAMD 2.8+", + ) + # init_tcl_pointers() declaration and implementation are inconsistent # "src/colvarproxy_namd.C", line 482: error: inherited member is not # allowed @@ -103,9 +119,13 @@ class Namd(MakefilePackage, CudaPackage, ROCmPackage): depends_on("tcl", when="interface=python") depends_on("python", when="interface=python") - conflicts("+avxtiles", when="@:2.14,3:", msg="AVXTiles algorithm requires NAMD 2.15") conflicts("+rocm", when="+cuda", msg="NAMD supports only one GPU backend at a time") conflicts("+single_node_gpu", when="~cuda~rocm") + conflicts( + "+memopt", + when="+single_node_gpu", + msg="memopt mode is not compatible with GPU-resident builds", + ) # https://www.ks.uiuc.edu/Research/namd/2.12/features.html # https://www.ks.uiuc.edu/Research/namd/2.13/features.html @@ -156,7 +176,7 @@ def _edit_arch_generic(self, spec, prefix): # this options are take from the default provided # configuration files # https://github.com/UIUC-PPL/charm/pull/2778 - archopt = spec.architecture.target.optimization_flags(spec.compiler) + archopt = optimization_flags(self.compiler, spec.target) if self.spec.satisfies("^charmpp@:6.10.1"): optims_opts = { @@ -304,6 +324,9 @@ def edit(self, spec, prefix): if "+single_node_gpu" in spec: opts.extend(["--with-single-node-hip"]) + if spec.satisfies("+memopt"): + opts.append("--with-memopt") + config = Executable("./config") config(self.build_directory, *opts) diff --git a/var/spack/repos/builtin/packages/nasm/package.py b/var/spack/repos/builtin/packages/nasm/package.py index a9861e96cedb7a..c3d64e47576bd3 100644 --- a/var/spack/repos/builtin/packages/nasm/package.py +++ b/var/spack/repos/builtin/packages/nasm/package.py @@ -22,6 +22,7 @@ class Nasm(AutotoolsPackage, Package): license("BSD-2-Clause") + version("2.16.03", sha256="5bc940dd8a4245686976a8f7e96ba9340a0915f2d5b88356874890e207bdb581") version("2.15.05", sha256="9182a118244b058651c576baa9d0366ee05983c4d4ae1d9ddd3236a9f2304997") version("2.14.02", sha256="b34bae344a3f2ed93b2ca7bf25f1ed3fb12da89eeda6096e3551fd66adeae9fc") version("2.13.03", sha256="23e1b679d64024863e2991e5c166e19309f0fe58a9765622b35bd31be5b2cc99") @@ -85,3 +86,8 @@ def install(self, pkg, spec, prefix): for file in rdoff: install(file, self.prefix.rdoff) + + def setup_dependent_build_environment(self, env, dependent_spec): + # This is required as NASM installs its binaries into an + # atypical location (i.e. flat in the prefix) + env.prepend_path("PATH", self.pkg.prefix) diff --git a/var/spack/repos/builtin/packages/nekrs/package.py b/var/spack/repos/builtin/packages/nekrs/package.py index 1472bd26c46bcf..3376682772fee9 100644 --- a/var/spack/repos/builtin/packages/nekrs/package.py +++ b/var/spack/repos/builtin/packages/nekrs/package.py @@ -5,16 +5,19 @@ import os +import spack.build_systems.cmake +import spack.build_systems.generic from spack.package import * -class Nekrs(Package, CudaPackage, ROCmPackage): +class Nekrs(Package, CMakePackage, CudaPackage, ROCmPackage): """nekRS is an open-source Navier Stokes solver based on the spectral element method targeting classical processors and hardware accelerators like GPUs""" homepage = "https://github.com/Nek5000/nekRS" git = "https://github.com/Nek5000/nekRS.git" + url = "https://github.com/Nek5000/nekRS/archive/refs/tags/v23.0.tar.gz" tags = [ "cfd", @@ -32,6 +35,11 @@ class Nekrs(Package, CudaPackage, ROCmPackage): license("BSD-3-Clause") + build_system( + conditional("cmake", when="@23.0:"), conditional("generic", when="@=21.0"), default="cmake" + ) + + version("23.0", sha256="2cb4ded69551b9614036e1a9d5ac54c8535826eae8f8b6a00ddb89043b2c392a") version("21.0", tag="v21.0", commit="bcd890bf3f9fb4d91224c83aeda75c33570f1eaa") depends_on("c", type="build") # generated @@ -52,17 +60,35 @@ class Nekrs(Package, CudaPackage, ROCmPackage): depends_on("git") depends_on("cmake") - @run_before("install") - def fortran_check(self): - if not self.compiler.f77: - msg = "Cannot build NekRS without a Fortran 77 compiler." - raise RuntimeError(msg) + def patch(self): + with working_dir("scripts"): + # Make sure nekmpi wrapper uses srun when we know OpenMPI + # is not built with mpiexec + if self.spec.satisfies("^openmpi~legacylaunchers"): + filter_file(r"mpirun -np", "srun -n", "nrsmpi") + filter_file(r"mpirun -np", "srun -n", "nrspre") + filter_file(r"mpirun -np", "srun -n", "nrsbmpi") + + def setup_run_environment(self, env): + # The 'env' is included in the Spack generated module files. + spec = self.spec + env.set("OCCA_CXX", self.compiler.cxx) + + cxxflags = spec.compiler_flags["cxxflags"] + if cxxflags: + # Run-time compiler flags: + env.set("OCCA_CXXFLAGS", " ".join(cxxflags)) - # Following 4 methods are stolen from OCCA since we are using OCCA - # shipped with nekRS. + if "+cuda" in spec: + cuda_dir = spec["cuda"].prefix + # Run-time CUDA compiler: + env.set("OCCA_CUDA_COMPILER", join_path(cuda_dir, "bin", "nvcc")) + + +class SetupEnvironment: def _setup_runtime_flags(self, s_env): spec = self.spec - s_env.set("OCCA_CXX", self.compiler.cxx) + s_env.set("OCCA_CXX", self.pkg.compiler.cxx) cxxflags = spec.compiler_flags["cxxflags"] if cxxflags: @@ -111,26 +137,14 @@ def setup_build_environment(self, env): env.set("OCCA_VERBOSE", "1") self._setup_runtime_flags(env) - def setup_run_environment(self, env): - # The 'env' is included in the Spack generated module files. - self._setup_runtime_flags(env) - def setup_dependent_build_environment(self, env, dependent_spec): # Export OCCA_* variables for everyone using this package from within # Spack. self._setup_runtime_flags(env) - def install(self, spec, prefix): - script_dir = "scripts" - - with working_dir(script_dir): - # Make sure nekmpi wrapper uses srun when we know OpenMPI - # is not built with mpiexec - if "^openmpi~legacylaunchers" in spec: - filter_file(r"mpirun -np", "srun -n", "nrsmpi") - filter_file(r"mpirun -np", "srun -n", "nrspre") - filter_file(r"mpirun -np", "srun -n", "nrsbmpi") +class GenericBuilder(spack.build_systems.generic.GenericBuilder): + def install(self, pkg, spec, prefix): makenrs = Executable(os.path.join(os.getcwd(), "makenrs")) makenrs.add_default_env("NEKRS_INSTALL_DIR", prefix) @@ -140,3 +154,17 @@ def install(self, spec, prefix): makenrs.add_default_env("TRAVIS", "true") makenrs(output=str, error=str, fail_on_error=True) + + +class CMakeBuilder(spack.build_systems.cmake.CMakeBuilder): + def cmake_args(self): + cxxflags = self.spec.compiler_flags["cxxflags"] + args = [ + self.define("CMAKE_CXX_COMPILER", self.spec["mpi"].mpicxx), + self.define("NEKRS_COMPILER_FLAGS", cxxflags), + self.define("OCCA_CXXFLAGS", cxxflags), + self.define_from_variant("ENABLE_CUDA", "cuda"), + self.define_from_variant("ENABLE_OPENCL", "opencl"), + self.define_from_variant("ENABLE_HIP", "rocm"), + ] + return args diff --git a/var/spack/repos/builtin/packages/neo4j/package.py b/var/spack/repos/builtin/packages/neo4j/package.py index 68852cbeb6022f..cab92756125adb 100644 --- a/var/spack/repos/builtin/packages/neo4j/package.py +++ b/var/spack/repos/builtin/packages/neo4j/package.py @@ -17,13 +17,16 @@ class Neo4j(MavenPackage): of magnitude performance benefits compared to relational DBs.""" homepage = "https://neo4j.com/" - url = "https://github.com/neo4j/neo4j/archive/4.0.3.tar.gz" + url = "https://github.com/neo4j/neo4j/archive/5.17.0.tar.gz" license("GPL-3.0-or-later") + version("5.17.0", sha256="13f43f099978ac639fd9008decaa783f04e3bd3d6957dd5109539e894dad879b") version("4.0.3", sha256="19d79052657665dd661bbe906b3552b88108bf379d39fa007b883fff718cabee") version("4.0.1", sha256="3f91f566e49000119c6a71d6127e73cfccdee37b68133a067b2ee05932c26dba") version("4.0.0", sha256="7173b97baf53be82b46f95fa52f99af591606a318e03915917ddd7141936fec5") version("3.5.16", sha256="1304fcd56b0f08f35b05d8b546fd844637ba1ffa5e00bb1e9a81a06b6242cb88") + depends_on("maven@3.8.2:", type="build", when="@5:") + depends_on("maven@3.6.2:", type="build", when="@4.4:") depends_on("maven@3.5.4:", type="build") diff --git a/var/spack/repos/builtin/packages/neocmakelsp/package.py b/var/spack/repos/builtin/packages/neocmakelsp/package.py new file mode 100644 index 00000000000000..f0e2f2091b7648 --- /dev/null +++ b/var/spack/repos/builtin/packages/neocmakelsp/package.py @@ -0,0 +1,27 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + + +from spack.package import * + + +class Neocmakelsp(CargoPackage): + """Another cmake lsp""" + + homepage = "https://neocmakelsp.github.io/" + url = "https://github.com/neocmakelsp/neocmakelsp/archive/refs/tags/v0.8.6.tar.gz" + + license("MIT", checked_by="pranav-sivaraman") + + version("0.8.6", sha256="4ed270190eb08f5571da036fb0f91d53c1c3e09bf4631f77f2133d56fd8e2437") + version("0.8.5", sha256="3f3cb8736468bd0a9e9199b6913ae8b6f323d6ecdab932ba1da16a091a8b0de1") + version("0.8.4", sha256="cf395c16d14d16ad54deda0fc6d2e9f1160163417c716ad18030e611947f9600") + version("0.8.3", sha256="b679394030b670ed57be3b75c9818ef5ee4fa2eb2b8e7bd16a1e254feccd1a0e") + version("0.8.2", sha256="f463d20a28735bf131449f9e5ba790d24ee11badc6f017c3b99f803200c50f8c") + version("0.8.1", sha256="23d2fd6f6bd0152dad9b6bdf9b5d6932d97ccd106bfb47d6d6fee563ea5a7eec") + version("0.8.0", sha256="7fbe5501d36885e7a93b8d2122eb8506e6fa7d75d43718f0ee0fab09bc7ee5e8") + version("0.7.9", sha256="d1b6219e19f1ab630fbcb6d3179fcac5dc8dca1b7af355bb7516bc4345ce461b") + version("0.7.8", sha256="1026ab9f7c60b2c9f880df12830f2927b28b50a06bb5732d5047aefe22fa9b2f") + version("0.7.7", sha256="9c761a54ae8a6b298eabc9b7cb215fceafd27e9193eb61e1d69cd7a5dc6dd1c1") diff --git a/var/spack/repos/builtin/packages/nest/package.py b/var/spack/repos/builtin/packages/nest/package.py index 5dcfcdec2de0fa..416930ac7b3242 100644 --- a/var/spack/repos/builtin/packages/nest/package.py +++ b/var/spack/repos/builtin/packages/nest/package.py @@ -53,7 +53,7 @@ class Nest(CMakePackage): depends_on("gsl", when="+gsl") depends_on("readline") - depends_on("libtool") + depends_on("libtool", type="link") # links against libltdl depends_on("pkgconfig", type="build") extends("python", when="+python") diff --git a/var/spack/repos/builtin/packages/net-snmp/package.py b/var/spack/repos/builtin/packages/net-snmp/package.py index 0bbdae054a63f1..9c427f19c3818c 100644 --- a/var/spack/repos/builtin/packages/net-snmp/package.py +++ b/var/spack/repos/builtin/packages/net-snmp/package.py @@ -14,10 +14,11 @@ class NetSnmp(AutotoolsPackage): license("Net-SNMP") + version("5.9.4", sha256="8b4de01391e74e3c7014beb43961a2d6d6fa03acc34280b9585f4930745b0544") version("5.9.1", sha256="eb7fd4a44de6cddbffd9a92a85ad1309e5c1054fb9d5a7dd93079c8953f48c3f") version("5.9", sha256="04303a66f85d6d8b16d3cc53bde50428877c82ab524e17591dfceaeb94df6071") - depends_on("c", type="build") # generated + depends_on("c", type="build") depends_on("perl-extutils-makemaker") depends_on("ncurses") diff --git a/var/spack/repos/builtin/packages/netlib-scalapack/package.py b/var/spack/repos/builtin/packages/netlib-scalapack/package.py index 38ad49f7957aad..245dcfaf0c7a70 100644 --- a/var/spack/repos/builtin/packages/netlib-scalapack/package.py +++ b/var/spack/repos/builtin/packages/netlib-scalapack/package.py @@ -41,15 +41,14 @@ class ScalapackBase(CMakePackage): patch("fix-build-macos.patch", when="@2.2.0") def flag_handler(self, name, flags): - iflags = [] if name == "cflags": if self.spec.satisfies("%gcc@14:"): # https://bugzilla.redhat.com/show_bug.cgi?id=2178710 - iflags.append("-std=gnu89") + flags.append("-std=gnu89") elif name == "fflags": if self.spec.satisfies("%cce"): - iflags.append("-hnopattern") - return (iflags, None, None) + flags.append("-hnopattern") + return (flags, None, None) @property def libs(self): diff --git a/var/spack/repos/builtin/packages/netlib-xblas/package.py b/var/spack/repos/builtin/packages/netlib-xblas/package.py index 9c0dde12557652..0b04a8f895e092 100644 --- a/var/spack/repos/builtin/packages/netlib-xblas/package.py +++ b/var/spack/repos/builtin/packages/netlib-xblas/package.py @@ -27,7 +27,8 @@ class NetlibXblas(AutotoolsPackage): version("1.0.248", sha256="b5fe7c71c2da1ed9bcdc5784a12c5fa9fb417577513fe8a38de5de0007f7aaa1") - depends_on("c", type="build") # generated + depends_on("c", type="build") + depends_on("m4", type="build") variant("fortran", default=True, description="Build Fortran interfaces") variant("plain_blas", default=True, description="As part of XBLAS, build plain BLAS routines") diff --git a/var/spack/repos/builtin/packages/neuron/package.py b/var/spack/repos/builtin/packages/neuron/package.py index 2887ea934286aa..2cb16fdd03d00f 100644 --- a/var/spack/repos/builtin/packages/neuron/package.py +++ b/var/spack/repos/builtin/packages/neuron/package.py @@ -3,6 +3,7 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) +from spack.build_environment import optimization_flags from spack.package import * @@ -149,7 +150,7 @@ def cmake_args(self): # add cpu arch specific optimisation flags to CMake so that they are passed # to embedded Makefile that neuron has for compiling MOD files - compilation_flags = self.spec.architecture.target.optimization_flags(self.spec.compiler) + compilation_flags = optimization_flags(self.compiler, self.spec.target) args.append(self.define("CMAKE_CXX_FLAGS", compilation_flags)) return args diff --git a/var/spack/repos/builtin/packages/nghttp2/package.py b/var/spack/repos/builtin/packages/nghttp2/package.py index 28c02713ece46e..e1442944b4b7da 100644 --- a/var/spack/repos/builtin/packages/nghttp2/package.py +++ b/var/spack/repos/builtin/packages/nghttp2/package.py @@ -15,8 +15,11 @@ class Nghttp2(AutotoolsPackage): license("MIT") + version("1.63.0", sha256="9318a2cc00238f5dd6546212109fb833f977661321a2087f03034e25444d3dbb") + version("1.62.1", sha256="d0b0b9d00500ee4aa3bfcac00145d3b1ef372fd301c35bff96cf019c739db1b4") version("1.62.0", sha256="482e41a46381d10adbdfdd44c1942ed5fd1a419e0ab6f4a5ff5b61468fe6f00d") version("1.61.0", sha256="aa7594c846e56a22fbf3d6e260e472268808d3b49d5e0ed339f589e9cc9d484c") + version("1.59.0", sha256="90fd27685120404544e96a60ed40398a3457102840c38e7215dc6dec8684470f") version("1.57.0", sha256="1e3258453784d3b7e6cc48d0be087b168f8360b5d588c66bfeda05d07ad39ffd") version("1.52.0", sha256="9877caa62bd72dde1331da38ce039dadb049817a01c3bdee809da15b754771b8") version("1.51.0", sha256="2a0bef286f65b35c24250432e7ec042441a8157a5b93519412d9055169d9ce54") @@ -48,4 +51,5 @@ def configure_args(self): "--with-mruby=no", "--with-neverbleed=no", "--with-boost=no", + "--with-wolfssl=no", ] diff --git a/var/spack/repos/builtin/packages/ngspice/package.py b/var/spack/repos/builtin/packages/ngspice/package.py index 7c2345120df04b..46394c9aa5b8dd 100644 --- a/var/spack/repos/builtin/packages/ngspice/package.py +++ b/var/spack/repos/builtin/packages/ngspice/package.py @@ -22,6 +22,7 @@ class Ngspice(AutotoolsPackage): # Master version by default adds the experimental adms feature version("master", branch="master") + version("43", sha256="14dd6a6f08531f2051c13ae63790a45708bd43f3e77886a6a84898c297b13699") version("42", sha256="737fe3846ab2333a250dfadf1ed6ebe1860af1d8a5ff5e7803c772cc4256e50a") version("41", sha256="1ce219395d2f50c33eb223a1403f8318b168f1e6d1015a7db9dbf439408de8c4") version("40", sha256="e303ca7bc0f594e2d6aa84f68785423e6bf0c8dad009bb20be4d5742588e890d") @@ -175,3 +176,7 @@ def flag_handler(self, name, flags): if "debug=yes" in self.spec: flags.append("-g") return (None, None, flags) + + def setup_run_environment(self, env): + if "build=lib" in self.spec: + env.prepend_path("LD_LIBRARY_PATH", self.prefix.lib) diff --git a/var/spack/repos/builtin/packages/npb/package.py b/var/spack/repos/builtin/packages/npb/package.py index 439a09e45ce9fb..62d5b86d0ec330 100644 --- a/var/spack/repos/builtin/packages/npb/package.py +++ b/var/spack/repos/builtin/packages/npb/package.py @@ -122,6 +122,10 @@ def edit(self, spec, prefix): nprocs = spec.variants["nprocs"].value if "implementation=mpi" in spec: + fflags = fflags = ["-O3"] + if spec.satisfies("%gcc@10:"): + fflags.append("-fallow-argument-mismatch") + definitions = { # Parallel Fortran "MPIFC": spec["mpi"].mpifc, @@ -129,7 +133,7 @@ def edit(self, spec, prefix): "FLINK": spec["mpi"].mpif77, "FMPI_LIB": spec["mpi"].libs.ld_flags, "FMPI_INC": "-I" + spec["mpi"].prefix.include, - "FFLAGS": "-O3", + "FFLAGS": " ".join(fflags), "FLINKFLAGS": "-O3", # Parallel C "MPICC": spec["mpi"].mpicc, diff --git a/var/spack/repos/builtin/packages/numactl/link-with-latomic-if-needed-v2.0.16.patch b/var/spack/repos/builtin/packages/numactl/link-with-latomic-if-needed-v2.0.16.patch new file mode 100644 index 00000000000000..995a42858cdf0b --- /dev/null +++ b/var/spack/repos/builtin/packages/numactl/link-with-latomic-if-needed-v2.0.16.patch @@ -0,0 +1,11 @@ +--- a/configure.ac ++++ b/configure.ac +@@ -24,6 +24,8 @@ AM_CONDITIONAL([HAVE_TREE_VECTORIZE], [test x"${tree_vectorize}" = x"true"]) + + AC_CONFIG_FILES([Makefile]) + ++AC_SEARCH_LIBS([__atomic_fetch_and_1], [atomic]) ++ + # GCC tries to be "helpful" and only issue a warning for unrecognized + # attributes. So we compile the test with Werror, so that if the + # attribute is not recognized the compilation fails diff --git a/var/spack/repos/builtin/packages/numactl/numactl-2.0.18-syscall-NR-ppc64.patch b/var/spack/repos/builtin/packages/numactl/numactl-2.0.18-syscall-NR-ppc64.patch new file mode 100644 index 00000000000000..b296e49e39067b --- /dev/null +++ b/var/spack/repos/builtin/packages/numactl/numactl-2.0.18-syscall-NR-ppc64.patch @@ -0,0 +1,14 @@ +diff --git a/syscall.c b/syscall.c +index 63b3e53..5b354c4 100644 +--- a/syscall.c ++++ b/syscall.c +@@ -141,7 +141,7 @@ + + #if !defined(__NR_set_mempolicy_home_node) + +-#if defined(__x86_64__) || defined(__aarch64__) ++#if defined(__x86_64__) || defined(__aarch64__) || defined(__PPC64__) + #define __NR_set_mempolicy_home_node 450 + #else + #error "Add syscalls for your architecture or update kernel headers" + diff --git a/var/spack/repos/builtin/packages/numactl/package.py b/var/spack/repos/builtin/packages/numactl/package.py index 0abd8d7c5a9434..cde391471cdafb 100644 --- a/var/spack/repos/builtin/packages/numactl/package.py +++ b/var/spack/repos/builtin/packages/numactl/package.py @@ -16,6 +16,9 @@ class Numactl(AutotoolsPackage): license("LGPL-2.1-only") + version("2.0.18", sha256="8cd6c13f3096e9c2293c1d732f56e2aa37a7ada1a98deed3fac7bd6da1aaaaf6") + version("2.0.17", sha256="af22829cda8b5bdee3d280e61291697bbd3f9bd372afdf119c9348b88369d40b") + version("2.0.16", sha256="a35c3bdb3efab5c65927e0de5703227760b1101f5e27ab741d8f32b3d5f0a44c") version("2.0.14", sha256="1ee27abd07ff6ba140aaf9bc6379b37825e54496e01d6f7343330cf1a4487035") version("2.0.12", sha256="7c3e819c2bdeb883de68bafe88776a01356f7ef565e75ba866c4b49a087c6bdf") version("2.0.11", sha256="3e099a59b2c527bcdbddd34e1952ca87462d2cef4c93da9b0bc03f02903f7089") @@ -25,8 +28,10 @@ class Numactl(AutotoolsPackage): patch("numactl-2.0.11-sysmacros.patch", when="@2.0.11") # https://github.com/numactl/numactl/issues/94 patch("numactl-2.0.14-symver.patch", when="@2.0.14") - patch("fix-empty-block.patch", when="@2.0.10:2.0.14") + patch("fix-empty-block.patch", when="@2.0.10:2.0.16") patch("link-with-latomic-if-needed.patch", when="@2.0.14") + patch("link-with-latomic-if-needed-v2.0.16.patch", when="@2.0.16") + patch("numactl-2.0.18-syscall-NR-ppc64.patch", when="@2.0.18 target=ppc64le:") depends_on("autoconf", type="build") depends_on("automake", type="build") diff --git a/var/spack/repos/builtin/packages/nvhpc/package.py b/var/spack/repos/builtin/packages/nvhpc/package.py index 537630e0ba30e1..ce918e96965c7c 100644 --- a/var/spack/repos/builtin/packages/nvhpc/package.py +++ b/var/spack/repos/builtin/packages/nvhpc/package.py @@ -21,6 +21,16 @@ # - package key must be in the form '{os}-{arch}' where 'os' is in the # format returned by platform.system() and 'arch' by platform.machine() _versions = { + "24.9": { + "Linux-aarch64": ( + "8d900f798ef806c64993fd4fedf2c2c812dd1ccdbac2a0d33fabcd0cd36f19cf", + "https://developer.download.nvidia.com/hpc-sdk/24.9/nvhpc_2024_249_Linux_aarch64_cuda_multi.tar.gz", + ), + "Linux-x86_64": ( + "30c493350cf67481e84cea60a3a869e01fa0bcb71df8e898266273fbdf0a7f26", + "https://developer.download.nvidia.com/hpc-sdk/24.9/nvhpc_2024_249_Linux_x86_64_cuda_multi.tar.gz", + ), + }, "24.7": { "Linux-aarch64": ( "256ae392ed961162f3f6dc633498db2b68441103a6192f5d4a1c18fa96e992e7", @@ -406,7 +416,7 @@ class Nvhpc(Package, CompilerPackage): homepage = "https://developer.nvidia.com/hpc-sdk" maintainers("samcmill") - tags = ["e4s"] + tags = ["e4s", "compiler"] skip_version_audit = ["platform=darwin", "platform=windows"] diff --git a/var/spack/repos/builtin/packages/nwchem/dft-d3_url.patch b/var/spack/repos/builtin/packages/nwchem/dft-d3_url.patch new file mode 100644 index 00000000000000..66d8508823e5df --- /dev/null +++ b/var/spack/repos/builtin/packages/nwchem/dft-d3_url.patch @@ -0,0 +1,13 @@ +--- a/src/nwpw/nwpwlib/nwpwxc/build_dftd3a.sh ++++ b/src/nwpw/nwpwlib/nwpwxc/build_dftd3a.sh +@@ -42,8 +42,8 @@ + check_patch + rm -f dftd3.f nwpwxc_vdw3a.F + export PATH=`pwd`:$PATH +-#URL1="https://www.chemie.uni-bonn.de/pctc/mulliken-center/software/dft-d3/" +-URL1="https://www.chemiebn.uni-bonn.de/pctc/mulliken-center/software/dft-d3/" ++URL1="https://www.chemie.uni-bonn.de/grimme/de/software/dft-d3/" ++#URL1="https://www.chemiebn.uni-bonn.de/pctc/mulliken-center/software/dft-d3/" + URL2="https://web.archive.org/web/20210527062154if_/https://www.chemie.uni-bonn.de/pctc/mulliken-center/software/dft-d3/" + declare -a urls=("$URL1" "$URL1" "$URL1" "$URL2" "$URL2") + TGZ=dftd3.tgz diff --git a/var/spack/repos/builtin/packages/nwchem/package.py b/var/spack/repos/builtin/packages/nwchem/package.py index e4f5829503d1ae..497ae0bf83872a 100644 --- a/var/spack/repos/builtin/packages/nwchem/package.py +++ b/var/spack/repos/builtin/packages/nwchem/package.py @@ -19,6 +19,12 @@ class Nwchem(Package): maintainers("jeffhammond") + version( + "7.2.3", + sha256="8cb4ec065215bc0316d8e01f67f1674a572f7d0f565c52e4a327975c04ddb6eb", + url="https://github.com/nwchemgit/nwchem/releases/download/v7.2.3-release/nwchem-7.2.3-release.revision-d690e065-srconly.2024-08-27.tar.bz2", + ) + version( "7.2.2", sha256="6b68e9c12eec38c09d92472bdd1ff130b93c1b5e1f65e4702aa7ee36c80e4af7", @@ -71,7 +77,11 @@ class Nwchem(Package): # https://github.com/nwchemgit/nwchem/commit/376f86f96eb982e83f10514e9dcd994564f973b4 # https://github.com/nwchemgit/nwchem/commit/c89fc9d1eca6689bce12564a63fdea95d962a123 # Prior versions of NWChem, including 7.0.2, were not able to link with FFTW - patch("fftw_splans.patch", when="@7.2.0:7.2.2 +fftw3") + patch("fftw_splans.patch", when="@7.2.0:7.2.3 +fftw3") + # This patch is for including a working link for dft-d3 download as existing link + # https://www.chemiebn.uni-bonn.de/pctc/mulliken-center/software/dft-d3//dftd3.tgz is not active + # Same is mentioned in https://metadata.ftp-master.debian.org/changelogs/main/n/nwchem/unstable_changelog + patch("dft-d3_url.patch", when="@7.2.0:7.2.2") depends_on("blas") depends_on("lapack") diff --git a/var/spack/repos/builtin/packages/ocaml/package.py b/var/spack/repos/builtin/packages/ocaml/package.py index 6da730dc53740f..595853ef3b3948 100644 --- a/var/spack/repos/builtin/packages/ocaml/package.py +++ b/var/spack/repos/builtin/packages/ocaml/package.py @@ -14,6 +14,10 @@ class Ocaml(Package): url = "https://caml.inria.fr/pub/distrib/ocaml-4.06/ocaml-4.06.0.tar.gz" maintainers("scemama") + version("5.2.0", sha256="3a7b5fb6d81bb42bbda84aadf5d84ff8bcbb149988087e7863bf5c2f4b27b187") + version("5.1.1", sha256="33b8c1df88700ba1f5123aa4bdbc7a125482feafc77e5081ef1725fddf290be1") + version("5.1.0", sha256="5e91492d87b193728a0729122b679039c73e75820dcf2724a31b262390d210c2") + version("5.0.0", sha256="969e1f7939736d39f2af533cd12cc64b05f060dbed087d7b760ee2503bfe56de") version("4.13.1", sha256="66a5353c5e7b33a8981446e857657aad45a3b82080ea5c67d4baa434eacfcf5f") version("4.12.0", sha256="9825e5903b852a7a5edb71a1ed68f5d5d55d6417e2dda514dda602bc6efeed7b") version("4.11.0", sha256="b5bd04bf794a676389b167633f01f8275acdd853149b137f7575f2c2ddef1377") diff --git a/var/spack/repos/builtin/packages/ocl-icd/package.py b/var/spack/repos/builtin/packages/ocl-icd/package.py index 6ef7dd87a0d221..42efeef4e25d6a 100644 --- a/var/spack/repos/builtin/packages/ocl-icd/package.py +++ b/var/spack/repos/builtin/packages/ocl-icd/package.py @@ -16,6 +16,7 @@ class OclIcd(AutotoolsPackage): license("BSD-2-Clause") + version("2.3.2", sha256="ec47d7dcd961ea06695b067e8b7edb82e420ddce03e0081a908c62fd0b8535c5") version("2.3.1", sha256="a32b67c2d52ffbaf490be9fc18b46428ab807ab11eff7664d7ff75e06cfafd6d") version("2.3.0", sha256="469f592ccd9b0547fb7212b17e1553b203d178634c20d3416640c0209e3ddd50") version("2.2.14", sha256="46df23608605ad548e80b11f4ba0e590cef6397a079d2f19adf707a7c2fbfe1b") diff --git a/var/spack/repos/builtin/packages/ollama/package.py b/var/spack/repos/builtin/packages/ollama/package.py index 98a171998fca97..7de54a4ce8a0d3 100644 --- a/var/spack/repos/builtin/packages/ollama/package.py +++ b/var/spack/repos/builtin/packages/ollama/package.py @@ -7,41 +7,44 @@ from spack.package import * -class Ollama(GoPackage): +class Ollama(GoPackage, CudaPackage): """Run Llama 2, Code Llama, and other models. Customize and create your own.""" homepage = "https://ollama.com" git = "https://github.com/ollama/ollama.git" - maintainers("teaguesterling") + maintainers("teaguesterling", "brettviren") - # We're using commit IDs because the `go generate` process will fail for some - # dependencies that expect to be within a git repo. This is also an issue with - # cached downloads, but I don't know how to fix that yet - version("0.1.31", commit="dc011d16b9ff160c0be3829fc39a43054f0315d0", submodules=True) - # This is the last verified non-preview version as of 20240413 - version( - "0.1.30", - commit="756c2575535641f1b96d94b4214941b90f4c30c7", - submodules=True, - preferred=True, - ) + # A shell script is run by `go generate` which assumes source is in a git + # repo. So we must use git VCS and not tarballs and defeat source caching. + with default_args(submodules=True, no_cache=True): + version("0.3.9", commit="a1cef4d0a5f31280ea82b350605775931a6163cb") + version("0.1.31", commit="dc011d16b9ff160c0be3829fc39a43054f0315d0") + # This is the last verified non-preview version as of 20240413 + version("0.1.30", commit="756c2575535641f1b96d94b4214941b90f4c30c7") depends_on("c", type="build") # generated depends_on("cxx", type="build") # generated license("MIT", checked_by="teaguesterling") - depends_on("cmake", type="build") - depends_on("go", type="build") - depends_on("gcc", type="build") + depends_on("cmake@3.24:", type="build") + depends_on("go@1.4.0:", type="build") depends_on("git", type="build") - depends_on("ccache", type="build") class GoBuilder(spack.build_systems.go.GoBuilder): phases = ("generate", "build", "install") + def setup_build_environment(self, env): + if self.spec.satisfies("+cuda"): + # These variables are consumed by gen_linux.sh which is called by + # "go generate". + cuda_prefix = self.spec["cuda"].prefix + env.set("CUDACXX", cuda_prefix.bin.nvcc) + env.set("CUDA_LIB_DIR", cuda_prefix.lib) + env.set("CMAKE_CUDA_ARCHITECTURES", spec.variants["cuda_arch"].value) + @property def generate_args(self): """Arguments for ``go generate``.""" diff --git a/var/spack/repos/builtin/packages/omega-h/package.py b/var/spack/repos/builtin/packages/omega-h/package.py index 63a1d45ff62516..e4432f2e104dcb 100644 --- a/var/spack/repos/builtin/packages/omega-h/package.py +++ b/var/spack/repos/builtin/packages/omega-h/package.py @@ -19,6 +19,11 @@ class OmegaH(CMakePackage, CudaPackage): maintainers("cwsmith") tags = ["e4s"] version("main", branch="main") + version( + "scorec.10.8.5", + commit="62026fc305356abb5e02a9fce3fead9cf5077fbe", + git="https://github.com/SCOREC/omega_h.git", + ) version( "scorec.10.7.0", commit="0e5de8618c3370f702e08c1b1af476dbbc118892", @@ -75,6 +80,12 @@ class OmegaH(CMakePackage, CudaPackage): when="@scorec.10.1.0:", msg="Thrust is broken in CUDA = 11.2.* see https://github.com/sandialabs/omega_h/issues/366", ) + conflicts( + "^cuda@:11.3", + when="@scorec.10.8.5:", + msg="see https://github.com/SCOREC/omega_h/issues/66", + ) + # the sandia repo has a fix for cuda > 11.2 support # see github.com/sandialabs/omega_h/pull/373 conflicts( @@ -163,7 +174,7 @@ def flag_handler(self, name, flags): def test_mesh(self): """test construction, adaptation, and conversion of a mesh""" - if self.spec.satisfies("@:9.34.0"): + if self.spec.satisfies("@:9.34.0") and not self.spec.satisfies("@:scorec"): raise SkipTest("Package must be installed as version 9.34.1 or later") with test_part(self, "test_mesh_create", purpose="mesh construction"): diff --git a/var/spack/repos/builtin/packages/omniperf/0001-remove-VERSION.sha-install.patch b/var/spack/repos/builtin/packages/omniperf/0001-remove-VERSION.sha-install.patch new file mode 100644 index 00000000000000..779dfa6763814a --- /dev/null +++ b/var/spack/repos/builtin/packages/omniperf/0001-remove-VERSION.sha-install.patch @@ -0,0 +1,24 @@ +From 0672d33d7c449fe75b0be5d476d1151b26e39b99 Mon Sep 17 00:00:00 2001 +From: Afzal Patel +Date: Thu, 5 Sep 2024 14:29:36 +0000 +Subject: [PATCH] Remove install for VERSION.sha + +--- + CMakeLists.txt | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 05aac32..9cf588a 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -278,7 +278,6 @@ install( + # support files and version info + install( + FILES src/argparser.py src/config.py src/omniperf_base.py src/roofline.py VERSION +- VERSION.sha + DESTINATION ${CMAKE_INSTALL_LIBEXECDIR}/${PROJECT_NAME} + COMPONENT main) + # src/omniperf_analyze +-- +2.43.5 + diff --git a/var/spack/repos/builtin/packages/omniperf/package.py b/var/spack/repos/builtin/packages/omniperf/package.py new file mode 100644 index 00000000000000..436ec037d0b2c9 --- /dev/null +++ b/var/spack/repos/builtin/packages/omniperf/package.py @@ -0,0 +1,50 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class Omniperf(CMakePackage): + """Advanced Profiling and Analytics for AMD Hardware""" + + homepage = "https://github.com/ROCm/omniperf" + git = "https://github.com/ROCm/omniperf.git" + url = "https://github.com/ROCm/omniperf/archive/refs/tags/rocm-6.2.1.tar.gz" + + tags = ["rocm"] + + maintainers("afzpatel", "srekolam", "renjithravindrankannath") + + license("MIT") + + version("6.2.1", sha256="c14cb73b9fe17a3cca31489a73e8ea49cb278093f8d64c433b1bac387445074a") + version("6.2.0", sha256="b2ad49324a07aef977833d62741509a5d799b92758db56a16b4ab5636b6e231e") + + depends_on("python@3.8:") + depends_on("py-pip", type="run") + depends_on("py-astunparse@1.6.2", type=("build", "run")) # wants exact version + depends_on("py-colorlover", type=("build", "run")) + depends_on("py-pyyaml") + depends_on("py-matplotlib") + depends_on("py-pandas") + depends_on("py-pymongo") + depends_on("py-tabulate") + depends_on("py-tqdm") + depends_on("py-kaleido") + depends_on("py-plotille") + depends_on("py-dash-svg", type=("build", "run")) + depends_on("py-dash", type=("build", "run")) + depends_on("py-dash-bootstrap-components", type=("build", "run")) + + # VERSION.sha is not in the auto-generated ROCm release tarball + patch("0001-remove-VERSION.sha-install.patch") + + def cmake_args(self): + args = [self.define("ENABLE_TESTS", self.run_tests)] + return args + + @run_after("install") + def after_install(self): + touch(join_path(self.spec.prefix.libexec.omniperf, "VERSION.sha")) diff --git a/var/spack/repos/builtin/packages/omnitrace/package.py b/var/spack/repos/builtin/packages/omnitrace/package.py index ba42a69c1495fe..3b558925aa7145 100644 --- a/var/spack/repos/builtin/packages/omnitrace/package.py +++ b/var/spack/repos/builtin/packages/omnitrace/package.py @@ -11,24 +11,57 @@ class Omnitrace(CMakePackage): """Application Profiling, Tracing, and Analysis""" - homepage = "https://amdresearch.github.io/omnitrace" - git = "https://github.com/AMDResearch/omnitrace.git" - maintainers("jrmadsen") + homepage = "https://rocm.docs.amd.com/projects/omnitrace/en/latest/index.html" + git = "https://github.com/ROCm/omnitrace.git" + url = "https://github.com/ROCm/omnitrace/archive/refs/tags/rocm-6.2.0.tar.gz" + maintainers("dgaliffiAMD", "afzpatel", "srekolam", "renjithravindrankannath", "jrmadsen") license("MIT") - version("main", branch="main", submodules=True) + version("amd-mainline", branch="amd-mainline", submodules=True) + version("amd-staging", branch="amd-staging", submodules=True) + version( + "1.12.0", tag="v1.12.0", commit="abff23ac4238da6d7891d9ac9f36a919e30bf759", submodules=True + ) + version( + "rocm-6.2.1", + tag="rocm-6.2.1", + commit="df91a342370401c93b5278bf082e520d6a0e22e9", + submodules=True, + ) + version( + "1.11.4", tag="v1.11.4", commit="6b0627f5b7d4b05c3b7b1da581e474d48ebe36cf", submodules=True + ) + version( + "rocm-6.2.0", + tag="rocm-6.2.0", + commit="f0bd9126a5456eb9e511d13261af262d17d9b61b", + submodules=True, + ) + version( + "1.11.0", tag="v1.11.0", commit="77d52814e9050004cfb11d7917e155b00ab861b1", submodules=True + ) + version( + "1.10.0", tag="v1.10.0", commit="9de3a6b0b4243bf8ec10164babdd99f64dbc65f2", submodules=True + ) + version( + "1.9.0", tag="v1.9.0", commit="9eafb2360296277103d2ee706fb5f90b12722668", submodules=True + ) + version( + "1.8.0", tag="v1.8.0", commit="7c73d981258cc3a29477756a95c1f90c5f8897dd", submodules=True + ) version("1.7.4", commit="12001d9633328f9f56210c7ebffce065bff06310", submodules=True) version("1.7.3", commit="2ebfe3fc30f977559142509edc4ea190c975992a", submodules=True) version("1.7.2", commit="a41a5c155e0d3780de4c83a76f28d7c8ffa6414f", submodules=True) version("1.7.1", commit="67f7471253b8e031e476d80d2bc00e569285c1bf", submodules=True) version("1.7.0", commit="2a387f909935d06c6a4874a5b11f38fb8521800e", submodules=True) - version("1.6.0", commit="15e6e6d979fcd5f549d952862400f292ec735b8c", submodules=True) - version("1.5.0", commit="2718596e5a6808a9278c3f6c8fddfaf977d3bcb6", submodules=True) - version("1.4.0", commit="23fb3946c7f4c0702b1b168e1d78b8b62597e3f1", submodules=True) - version("1.3.1", commit="641225f88304909fd2ca5407aec062d0fdf0ed8b", submodules=True) - version("1.3.0", commit="4dd144a32c8b83c44e132ef53f2b44fe4b4d5569", submodules=True) - version("1.2.0", commit="f82845388aab108ed1d1fc404f433a0def391bb3", submodules=True) + with default_args(deprecated=True): + version("1.6.0", commit="15e6e6d979fcd5f549d952862400f292ec735b8c", submodules=True) + version("1.5.0", commit="2718596e5a6808a9278c3f6c8fddfaf977d3bcb6", submodules=True) + version("1.4.0", commit="23fb3946c7f4c0702b1b168e1d78b8b62597e3f1", submodules=True) + version("1.3.1", commit="641225f88304909fd2ca5407aec062d0fdf0ed8b", submodules=True) + version("1.3.0", commit="4dd144a32c8b83c44e132ef53f2b44fe4b4d5569", submodules=True) + version("1.2.0", commit="f82845388aab108ed1d1fc404f433a0def391bb3", submodules=True) depends_on("c", type="build") # generated depends_on("cxx", type="build") # generated @@ -89,11 +122,26 @@ class Omnitrace(CMakePackage): depends_on("rocm-smi-lib", when="+rocm") depends_on("roctracer-dev", when="+rocm") depends_on("rocprofiler-dev", when="@1.3.0: +rocm") + depends_on("hip@5", when="@1:1.10 +rocm") + depends_on("rocm-smi-lib@5", when="@1:1.10 +rocm") + depends_on("roctracer-dev@5", when="@1:1.10 +rocm") + depends_on("rocprofiler-dev@5", when="@1.3.0:1.10 +rocm") + + for ver in ["6.2.0", "6.2.1"]: + depends_on(f"rocm-smi-lib@{ver}", when=f"@rocm-{ver} +rocm") + depends_on(f"hip@{ver}", when=f"@rocm-{ver} +rocm") + depends_on(f"roctracer-dev@{ver}", when=f"@rocm-{ver} +rocm") + depends_on(f"rocprofiler-dev@{ver}", when=f"@rocm-{ver} +rocm") + depends_on("papi+shared", when="+papi") depends_on("mpi", when="+mpi") depends_on("tau", when="+tau") depends_on("caliper", when="+caliper") depends_on("python@3:", when="+python", type=("build", "run")) + depends_on("dyninst@12", when="@1.8:,rocm-6.2:0 +rocm") + depends_on("m4", when="@1.8:,rocm-6.2:0 +rocm") + depends_on("texinfo", when="@1.8:,rocm-6.2:0 +rocm") + depends_on("libunwind", when="@1.8:,rocm-6.2:0 +rocm") def cmake_args(self): spec = self.spec @@ -134,8 +182,19 @@ def cmake_args(self): args.append(self.define("MPI_C_COMPILER", spec["mpi"].mpicc)) args.append(self.define("MPI_CXX_COMPILER", spec["mpi"].mpicxx)) + if spec.satisfies("@1.8:,rocm-6.2:0"): + args.append(self.define("dl_LIBRARY", "dl")) + args.append( + self.define("libunwind_INCLUDE_DIR", self.spec["libunwind"].prefix.include) + ) return args + def flag_handler(self, name, flags): + if self.spec.satisfies("@1.8:,rocm-6.2:0"): + if name == "ldflags": + flags.append("-lintl") + return (flags, None, None) + def setup_build_environment(self, env): if "+tau" in self.spec: import glob diff --git a/var/spack/repos/builtin/packages/onnx/package.py b/var/spack/repos/builtin/packages/onnx/package.py index 3cc781463ee7e1..ec9602c14befbe 100644 --- a/var/spack/repos/builtin/packages/onnx/package.py +++ b/var/spack/repos/builtin/packages/onnx/package.py @@ -17,9 +17,10 @@ class Onnx(CMakePackage): url = "https://github.com/onnx/onnx/archive/refs/tags/v1.9.0.tar.gz" git = "https://github.com/onnx/onnx.git" - license("Apache-2.0") + license("Apache-2.0", checked_by="wdconinc") version("master", branch="master") + version("1.16.2", sha256="84fc1c3d6133417f8a13af6643ed50983c91dacde5ffba16cc8bb39b22c2acbb") version("1.16.1", sha256="0e6aa2c0a59bb2d90858ad0040ea1807117cc2f05b97702170f18e6cd6b66fb3") version("1.16.0", sha256="0ce153e26ce2c00afca01c331a447d86fbf21b166b640551fe04258b4acfc6a4") version("1.15.0", sha256="c757132e018dd0dd171499ef74fca88b74c5430a20781ec53da19eb7f937ef68") @@ -61,7 +62,7 @@ class Onnx(CMakePackage): "1.1.0_2018-04-19", commit="7e1bed51cc508a25b22130de459830b5d5063c41" ) # py-torch@0.4.0 - depends_on("cxx", type="build") # generated + depends_on("cxx", type="build") generator("ninja") depends_on("cmake@3.1:", type="build") @@ -73,6 +74,9 @@ def patch(self): filter_file("CMAKE_CXX_STANDARD 11", "CMAKE_CXX_STANDARD 14", "CMakeLists.txt") def cmake_args(self): - # Try to get ONNX to use the same version of python as the spec is using - args = ["-DPY_VERSION={0}".format(self.spec["python"].version.up_to(2))] + args = [ + # Try to get ONNX to use the same version of python as the spec is using + self.define("PY_VERSION", self.spec["python"].version.up_to(2)), + self.define("ONNX_BUILD_TESTS", self.run_tests), + ] return args diff --git a/var/spack/repos/builtin/packages/opam/package.py b/var/spack/repos/builtin/packages/opam/package.py index d9c170fc180ae2..bae70b6d828e67 100644 --- a/var/spack/repos/builtin/packages/opam/package.py +++ b/var/spack/repos/builtin/packages/opam/package.py @@ -18,6 +18,11 @@ class Opam(AutotoolsPackage): maintainers("scemama") + version("2.2.1", sha256="07ad3887f61e0bc61a0923faae16fcc141285ece5b248a9e2cd4f902523cc121") + version("2.2.0", sha256="39334f36adbe280683487cf204b7b0642080fc5965747f7d6f7cc7b83cd7a192") + version("2.1.6", sha256="d2af5edc85f552e0cf5ec0ddcc949d94f2dc550dc5df595174a06a4eaf8af628") + version("2.1.5", sha256="09f8d9e410b2f5723c2bfedbf7970e3b305f5017895fcd91759f05e753ddcea5") + version("2.1.4", sha256="1643609f4eea758eb899dc8df57b88438e525d91592056f135e6e045d0d916cb") version("2.1.3", sha256="cb2ab00661566178318939918085aa4b5c35c727df83751fd92d114fdd2fa001") version("2.0.6", sha256="7c4bff5e5f3628ad00c53ee1b044ced8128ffdcfbb7582f8773fb433e12e07f4") version("2.0.5", sha256="776c7e64d6e24c2ef1efd1e6a71d36e007645efae94eaf860c05c1929effc76f") @@ -36,10 +41,18 @@ class Opam(AutotoolsPackage): depends_on("ocaml@:4.09.0", type="build", when="@:1.2.2") depends_on("ocaml", type="build", when="@2.0.0:") + # While this package is a makefile package, 'make' is really only used to + # call the locally built copy of dune, which is itself parallel, so there's + # no sense in calling make with >1 job. + # See: ocaml/opam#3585 spack/spack#46535 parallel = False sanity_check_is_file = ["bin/opam"] + @property + def build_directory(self): + return self.stage.source_path + @when("@:1.2.2") def setup_build_environment(self, env): """In OCaml <4.06.1, the default was -safe-string=0, and this has @@ -52,8 +65,27 @@ def setup_build_environment(self, env): # https://github.com/Homebrew/homebrew-core/blob/master/Formula/opam.rb env.set("OCAMLPARAM", "safe-string=0,_") # OCaml 4.06.0 compat + def configure(self, spec, prefix): + args = ["--prefix={0}".format(prefix)] + + with when("@:2.2"): + # NOTE: The config script really wants the vendored third party + # libraries to live in the /src_ext directory, not + # in the build directory when this flag is enabled. This is why the + # build directory must be set to the source path above. + args.append("--with-vendored-deps") + + return configure(*args) + def build(self, spec, prefix): - make("lib-ext") + # https://github.com/dbuenzli/cmdliner/issues/34#issuecomment-145236209 + if spec.satisfies("@:2.1"): + make("lib-ext") + make() + if spec.satisfies("@:1.2.2"): make("man") + + def install(self, spec, prefix): + make("install") diff --git a/var/spack/repos/builtin/packages/open-iscsi/package.py b/var/spack/repos/builtin/packages/open-iscsi/package.py index 9012dc92ae399b..f93ecfae800ae9 100644 --- a/var/spack/repos/builtin/packages/open-iscsi/package.py +++ b/var/spack/repos/builtin/packages/open-iscsi/package.py @@ -21,13 +21,16 @@ class OpenIscsi(MakefilePackage): version("2.0.877", sha256="69eb95b0c39dee2da9d0d751bfdcdb8d11f9d37390de15c1a0b4558f9d0c4a57") version("2.0.876", sha256="9f01327d5e100ed794dc5083fc18dc4a06a0c29c77b252e21abd1b8f56edd9a7") - depends_on("c", type="build") # generated + depends_on("c", type="build") depends_on("gettext") depends_on("uuid") depends_on("util-linux") depends_on("kmod") depends_on("open-isns") + + depends_on("autoconf", type="build") + depends_on("automake", type="build") depends_on("libtool", type="build") def setup_build_environment(self, env): @@ -35,7 +38,7 @@ def setup_build_environment(self, env): def setup_run_environment(self, env): env.prepend_path("PATH", self.prefix.sbin) - env.prepend_path("LD_LIBRARY_PATH", self.prefix.usr.lib64) def install(self, spec, prefix): - make("install", "DESTDIR={0}".format(prefix)) + etc_dir = join_path(prefix, "etc") + make("install", f"prefix={prefix}", f"exec_prefix={prefix}", f"etcdir={etc_dir}") diff --git a/var/spack/repos/builtin/packages/open-isns/package.py b/var/spack/repos/builtin/packages/open-isns/package.py index a389cf8ca9a552..3f9f7d10a5eabf 100644 --- a/var/spack/repos/builtin/packages/open-isns/package.py +++ b/var/spack/repos/builtin/packages/open-isns/package.py @@ -21,13 +21,15 @@ class OpenIsns(AutotoolsPackage): version("0.97", sha256="c1c9ae740172e55a1ff33bc22151ec3d916562bf5d60c8420cd64496343683a9") version("0.96", sha256="487fd0d87826423ea99dc159826d0b654a5da016ed670d4395a77bfa4f62e2ec") - depends_on("c", type="build") # generated + depends_on("c", type="build") def configure_args(self): args = ["--enable-shared"] return args def install(self, spec, prefix): - make("install") - make("install_hdrs") - make("install_lib") + etc_dir = join_path(prefix, "etc") + var_dir = join_path(prefix, "var") + make("install", f"etcdir={etc_dir}", f"vardir={var_dir}") + make("install_hdrs", f"etcdir={etc_dir}", f"vardir={var_dir}") + make("install_lib", f"etcdir={etc_dir}", f"vardir={var_dir}") diff --git a/var/spack/repos/builtin/packages/openbabel/package.py b/var/spack/repos/builtin/packages/openbabel/package.py index d7314e2714a9a4..e4e140faa3f1b9 100644 --- a/var/spack/repos/builtin/packages/openbabel/package.py +++ b/var/spack/repos/builtin/packages/openbabel/package.py @@ -12,7 +12,7 @@ class Openbabel(CMakePackage): search, convert, analyze, or store data from molecular modeling, chemistry, solid-state materials, biochemistry, or related areas.""" - homepage = "https://openbabel.org/wiki/Main_Page" + homepage = "https://openbabel.org/index.html" url = "https://github.com/openbabel/openbabel/archive/openbabel-3-0-0.tar.gz" git = "https://github.com/openbabel/openbabel.git" diff --git a/var/spack/repos/builtin/packages/openblas/openblas-0.3.28-thread-buffer.patch b/var/spack/repos/builtin/packages/openblas/openblas-0.3.28-thread-buffer.patch new file mode 100644 index 00000000000000..8c94a921a590b5 --- /dev/null +++ b/var/spack/repos/builtin/packages/openblas/openblas-0.3.28-thread-buffer.patch @@ -0,0 +1,14 @@ +--- a/driver/others/blas_server.c 2024-09-18 17:09:48.362101394 -0700 ++++ b/driver/others/blas_server.c 2024-09-18 17:12:59.690940586 -0700 +@@ -1076,6 +1076,11 @@ + main_status[cpu] = MAIN_RUNNING1; + #endif + ++if (buffer == NULL) { ++ blas_thread_buffer[cpu] = blas_memory_alloc(2); ++ buffer = blas_thread_buffer[cpu]; ++} ++ + //For target LOONGSON3R5, applying an offset to the buffer is essential + //for minimizing cache conflicts and optimizing performance. + #if defined(ARCH_LOONGARCH64) && !defined(NO_AFFINITY) diff --git a/var/spack/repos/builtin/packages/openblas/package.py b/var/spack/repos/builtin/packages/openblas/package.py index ed67cfe0d5dd82..188354a69efab3 100644 --- a/var/spack/repos/builtin/packages/openblas/package.py +++ b/var/spack/repos/builtin/packages/openblas/package.py @@ -26,6 +26,7 @@ class Openblas(CMakePackage, MakefilePackage): license("BSD-3-Clause") version("develop", branch="develop") + version("0.3.28", sha256="f1003466ad074e9b0c8d421a204121100b0751c96fc6fcf3d1456bd12f8a00a1") version("0.3.27", sha256="aa2d68b1564fe2b13bc292672608e9cdeeeb6dc34995512e65c3b10f4599e897") version("0.3.26", sha256="4e6e4f5cb14c209262e33e6816d70221a2fe49eb69eaf0a06f065598ac602c68") version("0.3.25", sha256="4c25cb30c4bb23eddca05d7d0a85997b8db6144f5464ba7f8c09ce91e2f35543") @@ -61,10 +62,6 @@ class Openblas(CMakePackage, MakefilePackage): version("0.2.16", sha256="766f350d0a4be614812d535cead8c816fc3ad3b9afcd93167ea5e4df9d61869b") version("0.2.15", sha256="73c40ace5978282224e5e122a41c8388c5a19e65a6f2329c2b7c0b61bacc9044") - depends_on("c", type="build") # generated - depends_on("cxx", type="build") # generated - depends_on("fortran", type="build") # generated - variant( "fortran", default=True, @@ -106,6 +103,14 @@ class Openblas(CMakePackage, MakefilePackage): provides("lapack@3.9.1:", when="@0.3.15:") provides("lapack@3.7.0", when="@0.2.20") + depends_on("c", type="build") + depends_on("cxx", type="build") + depends_on("fortran", type="build") + depends_on("perl", when="@:0.3.20", type="build") + + # https://github.com/OpenMathLib/OpenBLAS/pull/4879 + patch("openblas-0.3.28-thread-buffer.patch", when="@0.3.28") + # https://github.com/OpenMathLib/OpenBLAS/pull/4328 patch("xcode15-fortran.patch", when="@0.3.25 %apple-clang@15:") @@ -264,19 +269,18 @@ class Openblas(CMakePackage, MakefilePackage): msg="Visual Studio does not support OpenBLAS dynamic dispatch features", ) - depends_on("perl", type="build") + conflicts("target=x86_64_v4:", when="%intel@2021") build_system("makefile", "cmake", default="makefile") def flag_handler(self, name, flags): spec = self.spec - iflags = [] if name == "cflags": if spec.satisfies("@0.3.20: %oneapi") or spec.satisfies("@0.3.20: %arm"): - iflags.append("-Wno-error=implicit-function-declaration") + flags.append("-Wno-error=implicit-function-declaration") if spec.satisfies("~fortran %clang"): - iflags.append("-Wno-error=int-conversion") - return (iflags, None, None) + flags.append("-Wno-error=int-conversion") + return (flags, None, None) @classmethod def determine_version(cls, lib): @@ -545,6 +549,9 @@ def make_defs(self): if self.spec.satisfies("+bignuma"): make_defs.append("BIGNUMA=1") + if not self.spec.satisfies("target=x86_64_v4:"): + make_defs.append("NO_AVX512=1") + # Avoid that NUM_THREADS gets initialized with the host's number of CPUs. if self.spec.satisfies("threads=openmp") or self.spec.satisfies("threads=pthreads"): make_defs.append("NUM_THREADS=512") diff --git a/var/spack/repos/builtin/packages/opencarp/package.py b/var/spack/repos/builtin/packages/opencarp/package.py index 0316cc288cbcb5..289364536f2090 100644 --- a/var/spack/repos/builtin/packages/opencarp/package.py +++ b/var/spack/repos/builtin/packages/opencarp/package.py @@ -19,12 +19,15 @@ class Opencarp(CMakePackage): maintainers("MarieHouillon") version( - "15.0", - commit="2271a3cccd7137f1e28c043c10adbd80480f1462", + "16.0", + commit="295055b6a3859709730f62fc8d4fe0e87c4e20b9", submodules=False, no_cache=True, preferred=True, ) + version( + "15.0", commit="2271a3cccd7137f1e28c043c10adbd80480f1462", submodules=False, no_cache=True + ) version( "13.0", commit="e1e0deca7eddcfd210835f54430361c85a97a5a4", submodules=False, no_cache=True ) @@ -72,7 +75,7 @@ class Opencarp(CMakePackage): depends_on("py-carputils", when="+carputils", type=("build", "run")) depends_on("meshtool", when="+meshtool", type=("build", "run")) # Use specific versions of carputils and meshtool for releases - for ver in ["15.0", "13.0", "12.0", "11.0", "10.0", "9.0", "8.2", "8.1", "7.0"]: + for ver in ["16.0", "15.0", "13.0", "12.0", "11.0", "10.0", "9.0", "8.2", "8.1", "7.0"]: depends_on("py-carputils@oc" + ver, when="@" + ver + " +carputils") depends_on("meshtool@oc" + ver, when="@" + ver + " +meshtool") diff --git a/var/spack/repos/builtin/packages/opencv/package.py b/var/spack/repos/builtin/packages/opencv/package.py index a5985861b6c2bd..58110998851bb5 100644 --- a/var/spack/repos/builtin/packages/opencv/package.py +++ b/var/spack/repos/builtin/packages/opencv/package.py @@ -22,6 +22,9 @@ class Opencv(CMakePackage, CudaPackage): license("BSD-3-Clause") version("master", branch="master") + version("4.10.0", sha256="b2171af5be6b26f7a06b1229948bbb2bdaa74fcf5cd097e0af6378fce50a6eb9") + version("4.9.0", sha256="ddf76f9dffd322c7c3cb1f721d0887f62d747b82059342213138dc190f28bc6c") + version("4.8.1", sha256="62f650467a60a38794d681ae7e66e3e8cfba38f445e0bf87867e2f2cdc8be9d5") version("4.8.0", sha256="cbf47ecc336d2bff36b0dcd7d6c179a9bb59e805136af6b9670ca944aef889bd") version("4.7.0", sha256="8df0079cdbe179748a18d44731af62a245a45ebf5085223dc03133954c662973") version("4.6.0", sha256="1ec1cba65f9f20fe5a41fda1586e01c70ea0c9a6d7b67c9e13edf0cfe2239277") @@ -46,8 +49,8 @@ class Opencv(CMakePackage, CudaPackage): version("3.3.1", sha256="5dca3bb0d661af311e25a72b04a7e4c22c47c1aa86eb73e70063cd378a2aa6ee") version("3.3.0", sha256="8bb312b9d9fd17336dc1f8b3ac82f021ca50e2034afc866098866176d985adc6") - depends_on("c", type="build") # generated - depends_on("cxx", type="build") # generated + depends_on("c", type="build") + depends_on("cxx", type="build") contrib_vers = [ "3.3.0", @@ -73,6 +76,9 @@ class Opencv(CMakePackage, CudaPackage): "4.6.0", "4.7.0", "4.8.0", + "4.8.1", + "4.9.0", + "4.10.0", ] for cv in contrib_vers: resource( @@ -254,8 +260,8 @@ class Opencv(CMakePackage, CudaPackage): depends_on("python@3.2:", type=("build", "link", "run")) depends_on("py-setuptools", type="build") depends_on("py-numpy", type=("build", "run")) - # https://github.com/opencv/opencv-python/issues/943 - depends_on("py-numpy@:1", when="@:4.10.0.83", type=("build", "run")) + # https://github.com/opencv/opencv/issues/25455 + depends_on("py-numpy@:1", when="@:4.9", type=("build", "run")) extends("python", when="+python3") with when("+stitching"): @@ -486,6 +492,7 @@ class Opencv(CMakePackage, CudaPackage): with when("+hdf"): depends_on("hdf5") + depends_on("mpi", when="^hdf5+mpi") with when("+hfs"): with when("+cuda"): diff --git a/var/spack/repos/builtin/packages/opendatadetector/package.py b/var/spack/repos/builtin/packages/opendatadetector/package.py index a2be138b5734d6..6953fbd115a04b 100644 --- a/var/spack/repos/builtin/packages/opendatadetector/package.py +++ b/var/spack/repos/builtin/packages/opendatadetector/package.py @@ -32,10 +32,10 @@ class Opendatadetector(CMakePackage): def cmake_args(self): args = [] - # C++ Standard args.append("-DCMAKE_CXX_STANDARD=%s" % self.spec["root"].variants["cxxstd"].value) return args def setup_run_environment(self, env): + env.set("OPENDATADETECTOR_DATA", join_path(self.prefix.share, "OpenDataDetector")) env.prepend_path("LD_LIBRARY_PATH", self.prefix.lib) env.prepend_path("LD_LIBRARY_PATH", self.prefix.lib64) diff --git a/var/spack/repos/builtin/packages/openexr/package.py b/var/spack/repos/builtin/packages/openexr/package.py index f901aef212bb59..3e9c6ac01e1fc7 100644 --- a/var/spack/repos/builtin/packages/openexr/package.py +++ b/var/spack/repos/builtin/packages/openexr/package.py @@ -16,6 +16,7 @@ class Openexr(CMakePackage, AutotoolsPackage): license("BSD-3-Clause") # New versions should come from github now + version("3.3.1", sha256="58aad2b32c047070a52f1205b309bdae007442e0f983120e4ff57551eb6f10f1") version("3.2.3", sha256="f3f6c4165694d5c09e478a791eae69847cadb1333a2948ca222aa09f145eba63") version("3.2.0", sha256="b1b200606640547fceff0d3ebe01ac05c4a7ae2a131be7e9b3e5b9f491ef35b3") version("3.1.11", sha256="06b4a20d0791b5ec0f804c855d320a0615ce8445124f293616a086e093f1f1e1") @@ -88,6 +89,7 @@ class Openexr(CMakePackage, AutotoolsPackage): with when("build_system=cmake"): depends_on("cmake@3.12:", type="build") + depends_on("cmake@3.14:", type="build", when="@3.3:") @property def libs(self): diff --git a/var/spack/repos/builtin/packages/openimagedenoise/package.py b/var/spack/repos/builtin/packages/openimagedenoise/package.py index 57ac527e9ca616..0b271967064558 100644 --- a/var/spack/repos/builtin/packages/openimagedenoise/package.py +++ b/var/spack/repos/builtin/packages/openimagedenoise/package.py @@ -13,10 +13,11 @@ class Openimagedenoise(CMakePackage): under the permissive Apache 2.0 license.""" homepage = "https://www.openimagedenoise.org/" - url = "https://github.com/OpenImageDenoise/oidn/releases/download/v1.4.3/oidn-1.4.3.src.tar.gz" + url = "https://github.com/RenderKit/oidn/releases/download/v1.4.3/oidn-1.4.3.src.tar.gz" license("Apache-2.0") + version("2.3.0", sha256="cce3010962ec84e0ba1acd8c9055a3d8de402fedb1b463517cfeb920a276e427") version("2.2.2", sha256="d26b75fa216165086f65bf48c80648290f2cfed7d3c4bfc1e86c247b46c96b7e") version("2.1.0", sha256="ce144ba582ff36563d9442ee07fa2a4d249bc85aa93e5b25fc527ff4ee755ed6") version("2.0.1", sha256="328eeb9809d18e835dca7203224af3748578794784c026940c02eea09c695b90") diff --git a/var/spack/repos/builtin/packages/openimageio/package.py b/var/spack/repos/builtin/packages/openimageio/package.py index 1733210fc1ad76..4f03b0df35ed3c 100644 --- a/var/spack/repos/builtin/packages/openimageio/package.py +++ b/var/spack/repos/builtin/packages/openimageio/package.py @@ -4,34 +4,28 @@ # SPDX-License-Identifier: (Apache-2.0 OR MIT) from spack.package import * -from spack.pkg.builtin.boost import Boost class Openimageio(CMakePackage): - """OpenImageIO is a library for reading and writing images, and a bunch of - related classes, utilities, and applications.""" + """Reading, writing, and processing images in a wide variety of file formats, using + a format-agnostic API, aimed at VFX applications.""" - homepage = "https://www.openimageio.org" - url = "https://github.com/OpenImageIO/oiio/archive/Release-1.8.15.tar.gz" + homepage = "https://openimageio.readthedocs.io" + git = "https://github.com/AcademySoftwareFoundation/OpenImageIO" + url = "https://github.com/AcademySoftwareFoundation/OpenImageIO/archive/refs/tags/v2.5.14.0.tar.gz" license("Apache-2.0") - version("2.2.7.0", sha256="857ac83798d6d2bda5d4d11a90618ff19486da2e5a4c4ff022c5976b5746fe8c") - version("1.8.15", sha256="4d5b4ed3f2daaed69989f53c0f9364dd87c82dc0a09807b5b6e9008e2426e86f") + version("2.5.15.0", sha256="7779ef2c3d03c5ed95e13ff292de85c3f8cee301cd46baad0d2dc83c93bfe85c") - depends_on("cxx", type="build") # generated + depends_on("cxx", type="build") # Core dependencies depends_on("cmake@3.2.2:", type="build") - depends_on("boost@1.53:", type=("build", "link")) - - # TODO: replace this with an explicit list of components of Boost, - # for instance depends_on('boost +filesystem') - # See https://github.com/spack/spack/pull/22303 for reference - depends_on(Boost.with_default_variants, type=("build", "link")) - depends_on("libtiff@4.0:", type=("build", "link")) - depends_on("openexr@2.3:", type=("build", "link")) - depends_on("libpng@1.6:", type=("build", "link")) + depends_on("boost+atomic+filesystem+thread+chrono@1.53:") + depends_on("libtiff@4.0:") + depends_on("openexr@3.1:") + depends_on("libpng@1.6:") # Optional dependencies variant("ffmpeg", default=False, description="Support video frames") @@ -48,7 +42,10 @@ class Openimageio(CMakePackage): variant("qt", default=False, description="Build qt viewer") depends_on("qt@5.6.0:+opengl", when="+qt") - conflicts("target=aarch64:", when="@:1.8.15") + def url_for_version(self, version): + if version >= Version("2"): + return super().url_for_version(version) + return f"https://github.com/AcademySoftwareFoundation/OpenImageIO/archive/refs/tags/Release-{version}.tar.gz" def cmake_args(self): args = ["-DUSE_FFMPEG={0}".format("ON" if "+ffmpeg" in self.spec else "OFF")] diff --git a/var/spack/repos/builtin/packages/openmpi/package.py b/var/spack/repos/builtin/packages/openmpi/package.py index 07c9154c1434d0..4b2c81dc033967 100644 --- a/var/spack/repos/builtin/packages/openmpi/package.py +++ b/var/spack/repos/builtin/packages/openmpi/package.py @@ -481,7 +481,7 @@ class Openmpi(AutotoolsPackage, CudaPackage): ) # Additional support options - variant("atomics", default=False, description="Enable built-in atomics") + variant("atomics", default=True, description="Enable built-in atomics") variant("java", default=False, when="@1.7.4:", description="Build Java support") variant("static", default=False, description="Build static libraries") variant("sqlite3", default=False, when="@1.7.3:1", description="Build SQLite3 support") @@ -571,9 +571,10 @@ class Openmpi(AutotoolsPackage, CudaPackage): variant("openshmem", default=False, description="Enable building OpenSHMEM") variant("debug", default=False, description="Make debug build", when="build_system=autotools") - provides("mpi") - provides("mpi@:2.2", when="@1.6.5") - provides("mpi@:3.0", when="@1.7.5:") + provides("mpi@:2.0", when="@:1.2") + provides("mpi@:2.1", when="@1.3:1.7.2") + provides("mpi@:2.2", when="@1.7.3:1.7.4") + provides("mpi@:3.0", when="@1.7.5:1.10.7") provides("mpi@:3.1", when="@2.0.0:") if sys.platform != "darwin": @@ -667,11 +668,6 @@ class Openmpi(AutotoolsPackage, CudaPackage): # knem support was added in 1.5 conflicts("fabrics=knem", when="@:1.4") - conflicts( - "schedulers=slurm ~pmi", - when="@1.5.4", - msg="+pmi is required for openmpi to work with Slurm.", - ) conflicts( "schedulers=loadleveler", when="@3:", @@ -1007,7 +1003,7 @@ def configure_args(self): # Work around incompatibility with new apple-clang linker # https://github.com/open-mpi/ompi/issues/12427 - if spec.satisfies("@5: %apple-clang@15:"): + if spec.satisfies("@:4.1.6,5.0.0:5.0.3 %apple-clang@15:"): config_args.append("--with-wrapper-fcflags=-Wl,-ld_classic") # All rpath flags should be appended with self.compiler.cc_rpath_arg. @@ -1319,7 +1315,7 @@ def test_mpirun(self): self.run_installed_binary("mpirun", options, [f"openmpi-{self.spec.version}"]) def test_opmpi_info(self): - """test installed mpirun""" + """test installed ompi_info""" self.run_installed_binary("ompi_info", [], [f"Ident string: {self.spec.version}", "MCA"]) def test_version(self): diff --git a/var/spack/repos/builtin/packages/openpmd-api/package.py b/var/spack/repos/builtin/packages/openpmd-api/package.py index 338895684d7481..d05af6a7338f8c 100644 --- a/var/spack/repos/builtin/packages/openpmd-api/package.py +++ b/var/spack/repos/builtin/packages/openpmd-api/package.py @@ -10,7 +10,7 @@ class OpenpmdApi(CMakePackage): """C++ & Python API for Scientific I/O""" homepage = "https://www.openPMD.org" - url = "https://github.com/openPMD/openPMD-api/archive/0.15.2.tar.gz" + url = "https://github.com/openPMD/openPMD-api/archive/0.16.0.tar.gz" git = "https://github.com/openPMD/openPMD-api.git" maintainers("ax3l", "franzpoeschel") @@ -21,6 +21,7 @@ class OpenpmdApi(CMakePackage): # C++17 up until here version("develop", branch="dev") + version("0.16.0", sha256="b52222a4ab2511f9e3f6e21af222f57ab4fb6228623024fc5d982066333e104f") version("0.15.2", sha256="fbe3b356fe6f4589c659027c8056844692c62382e3ec53b953bed1c87e58ba13") version("0.15.1", sha256="0e81652152391ba4d2b62cfac95238b11233a4f89ff45e1fcffcc7bcd79dabe1") version("0.15.0", sha256="290e3a3c5814204ea6527d53423bfacf7a8dc490713227c9e0eaa3abf4756177") @@ -45,18 +46,20 @@ class OpenpmdApi(CMakePackage): variant("shared", default=True, description="Build a shared version of the library") variant("mpi", default=True, description="Enable parallel I/O") variant("hdf5", default=True, description="Enable HDF5 support") - variant("adios1", default=False, description="Enable ADIOS1 support") + variant("adios1", default=False, description="Enable ADIOS1 support", when="@:0.15") variant("adios2", default=True, description="Enable ADIOS2 support") variant("python", default=False, description="Enable Python bindings") depends_on("cmake@3.15.0:", type="build") + depends_on("cmake@3.22.0:", type="build", when="@0.16.0:") depends_on("catch2@2.6.1:2", type="test") depends_on("catch2@2.13.4:2", type="test", when="@0.14.0:") depends_on("catch2@2.13.10:2", type="test", when="@0.15.0:") depends_on("mpi@2.3:", when="+mpi") # might become MPI 3.0+ depends_on("nlohmann-json@3.9.1:") depends_on("mpark-variant@1.4.0:", when="@:0.14") # pre C++17 releases - depends_on("toml11@3.7.1:3.8.1", when="@0.15.0:") + depends_on("toml11@3.7.1:3", when="@0.15") + depends_on("toml11@3.7.1:", when="@0.16:") with when("+hdf5"): depends_on("hdf5@1.8.13:") depends_on("hdf5@1.8.13: ~mpi", when="~mpi") @@ -73,6 +76,7 @@ class OpenpmdApi(CMakePackage): depends_on("adios2@2.5.0: +mpi", when="+mpi") with when("+python"): depends_on("py-pybind11@2.6.2:", type="link") + depends_on("py-pybind11@2.13.0:", type="link", when="@0.16.0:") depends_on("py-numpy@1.15.1:", type=["test", "run"]) depends_on("py-mpi4py@2.1.0:", when="+mpi", type=["test", "run"]) depends_on("python@3.7:", type=["link", "test", "run"]) @@ -105,6 +109,13 @@ class OpenpmdApi(CMakePackage): when="@0.15.1", ) + # fix superbuild control in 0.16.0 + patch( + "https://github.com/openPMD/openPMD-api/pull/1678.patch?full_index=1", + sha256="e49fe79691bbb5aae2224d218f29801630d33f3a923c518f6bfb39ec22fd6a72", + when="@0.16.0", + ) + extends("python", when="+python") def cmake_args(self): diff --git a/var/spack/repos/builtin/packages/openspeedshop-utils/package.py b/var/spack/repos/builtin/packages/openspeedshop-utils/package.py index 0e9c5caf6d639a..c77a608fd21b3c 100644 --- a/var/spack/repos/builtin/packages/openspeedshop-utils/package.py +++ b/var/spack/repos/builtin/packages/openspeedshop-utils/package.py @@ -90,7 +90,7 @@ class OpenspeedshopUtils(CMakePackage): # Dependencies for openspeedshop that are common to all # the variants of the OpenSpeedShop build - depends_on("libtool", type="build") + depends_on("libtool", type="link") # links against libltdl depends_on("bison", type="build") depends_on("flex@2.6.1", type="build") diff --git a/var/spack/repos/builtin/packages/openspeedshop/package.py b/var/spack/repos/builtin/packages/openspeedshop/package.py index 5ceb5113300c74..6dddc60f97d49c 100644 --- a/var/spack/repos/builtin/packages/openspeedshop/package.py +++ b/var/spack/repos/builtin/packages/openspeedshop/package.py @@ -94,7 +94,7 @@ class Openspeedshop(CMakePackage): # Dependencies for openspeedshop that are common to all # the variants of the OpenSpeedShop build - depends_on("libtool", type="build") + depends_on("libtool", type="link") # links against libltdl depends_on("bison", type="build") depends_on("flex@2.6.1", type="build") diff --git a/var/spack/repos/builtin/packages/openssl/package.py b/var/spack/repos/builtin/packages/openssl/package.py index e21d427731c63c..a974bc8c97fb90 100644 --- a/var/spack/repos/builtin/packages/openssl/package.py +++ b/var/spack/repos/builtin/packages/openssl/package.py @@ -18,8 +18,7 @@ class Openssl(Package): # Uses Fake Autotools, should subclass Package homepage = "https://www.openssl.org" - # URL must remain http:// so Spack can bootstrap curl - url = "http://www.openssl.org/source/openssl-1.1.1d.tar.gz" + url = "https://www.openssl.org/source/openssl-1.1.1d.tar.gz" list_url = "https://www.openssl.org/source/old/" list_depth = 1 @@ -111,6 +110,7 @@ def libs(self): root=self.prefix, recursive=True, shared=self.spec.variants["shared"].value, + runtime=False, ) def handle_fetch_error(self, error): @@ -159,9 +159,11 @@ def install(self, spec, prefix): "--openssldir=%s" % join_path(prefix, "etc", "openssl"), ] if spec.satisfies("platform=windows"): - base_args.extend( - ['CC="%s"' % os.environ.get("CC"), 'CXX="%s"' % os.environ.get("CXX"), "VC-WIN64A"] - ) + if spec.satisfies("@:1"): + base_args.extend([f'CC="{self.compiler.cc}"', f'CXX="{self.compiler.cxx}"']) + else: + base_args.extend([f"CC={self.compiler.cc}", f"CXX={self.compiler.cxx}"]) + base_args.append("VC-WIN64A") else: base_args.extend( [ diff --git a/var/spack/repos/builtin/packages/ospray/package.py b/var/spack/repos/builtin/packages/ospray/package.py index 7dd9541cf1a21d..efa051d48fe53f 100644 --- a/var/spack/repos/builtin/packages/ospray/package.py +++ b/var/spack/repos/builtin/packages/ospray/package.py @@ -11,11 +11,12 @@ class Ospray(CMakePackage): high-performance, high-fidelity visualization on Intel Architecture CPUs.""" homepage = "https://www.ospray.org/" - url = "https://github.com/ospray/ospray/archive/v2.10.0.tar.gz" - git = "https://github.com/ospray/ospray.git" + url = "https://github.com/RenderKit/ospray/archive/v2.10.0.tar.gz" + git = "https://github.com/RenderKit/ospray.git" # maintainers("aumuell") + version("3.2.0", sha256="2c8108df2950bc5d1bc2a62f74629233dbe4f36e3f6a8ea032907d4a3fdc6750") version("3.1.0", sha256="0b9d7df900fe0474b12e5a2641bb9c3f5a1561217b2789834ebf994a15288a82") version("3.0.0", sha256="d8d8e632d77171c810c0f38f8d5c8387470ca19b75f5b80ad4d3d12007280288") version("2.12.0", sha256="268b16952b2dd44da2a1e40d2065c960bc2442dd09b63ace8b65d3408f596301") @@ -42,14 +43,16 @@ class Ospray(CMakePackage): depends_on("rkcommon@1.7:1.9", when="@2.7.0:2.8") depends_on("rkcommon@1.9", when="@2.9.0") depends_on("rkcommon@1.10:", when="@2.10.0:") - depends_on("rkcommon@1.11:", when="@2.11:") - depends_on("rkcommon@1.12:", when="@3:") - depends_on("rkcommon@1.13:", when="@3.1:") + depends_on("rkcommon@1.11.0", when="@2.11:2.12") + depends_on("rkcommon@1.12.0", when="@3.0") + depends_on("rkcommon@1.13.0", when="@3.1") + depends_on("rkcommon@1.14.0", when="@3.2") depends_on("embree@3.12: +ispc") depends_on("embree@3.13.1:", when="@2.7.0:") depends_on("embree@:3", when="@:2.10") depends_on("embree@4:", when="@2.11:") depends_on("embree@4.3:", when="@3:") + depends_on("embree@4.3.3:", when="@3.2:") with when("+volumes"): depends_on("openvkl@0.13.0:1", when="@2") depends_on("openvkl@1.0.1:", when="@2.7.0:") @@ -57,22 +60,27 @@ class Ospray(CMakePackage): depends_on("openvkl@1.3.0:", when="@2.10.0:") depends_on("openvkl@1.3.2:", when="@2.11:2") depends_on("openvkl@2:", when="@3:") + depends_on("openvkl@2.0.1:", when="@3.2:") with when("+denoiser"): depends_on("openimagedenoise@1.2.3:") depends_on("openimagedenoise@1.3:", when="@2.5:") depends_on("openimagedenoise@:1", when="@:2.11") depends_on("openimagedenoise@2:", when="@2.12:") depends_on("openimagedenoise@2.1:", when="@3:") + depends_on("openimagedenoise@2.3:", when="@3.2:") depends_on("ispc@1.14.1:", type=("build")) depends_on("ispc@1.16.0:", when="@2.7.0:", type=("build")) depends_on("ispc@1.18.0:", when="@2.10.0:", type=("build")) depends_on("ispc@1.19.0:", when="@2.11.0:", type=("build")) depends_on("ispc@1.20.0:", when="@2.12.0:", type=("build")) depends_on("ispc@1.21.1:", when="@3:", type=("build")) + depends_on("ispc@1.23.0:", when="@3.2:", type=("build")) depends_on("tbb") - depends_on("mpi", when="+mpi") - depends_on("snappy@1.1.8:", when="+mpi") + with when("+mpi"): + depends_on("mpi") + depends_on("snappy@1.1.8:") + depends_on("snappy@1.2.1:", when="@3.2:") def cmake_args(self): args = [ diff --git a/var/spack/repos/builtin/packages/pacparser/package.py b/var/spack/repos/builtin/packages/pacparser/package.py index 4cbd05788e7798..02892853da23a2 100644 --- a/var/spack/repos/builtin/packages/pacparser/package.py +++ b/var/spack/repos/builtin/packages/pacparser/package.py @@ -10,11 +10,12 @@ class Pacparser(MakefilePackage): """pacparser is a library to parse proxy auto-config (PAC) files.""" homepage = "https://pacparser.github.io/" - url = "https://github.com/manugarg/pacparser/releases/download/v1.4.0/pacparser-v1.4.0.tar.gz" + url = "https://github.com/manugarg/pacparser/archive/refs/tags/v1.4.5.tar.gz" git = "https://github.com/manugarg/pacparser.git" license("LGPL-3.0-or-later") + version("1.4.5", sha256="fac205f41d000e245519244dc3e730e649a0ac1c61b5f2d1d0660056e1680b2d") version("1.4.0", sha256="2e66c5fe635cd5dcb9bccca4aced925eca712632b81bada3b63682159c0f910e") version("1.3.9", commit="4bbfb15c96ea0b2aede2f7371e59f66e15722d41") version("1.3.8", sha256="4e2872de565b2b64ffc81ba503e0eba35b3f7ef4a023ddd4a328c7b9d2cac266") @@ -33,6 +34,12 @@ class Pacparser(MakefilePackage): variant("python", default=False, description="Build and install python bindings") + def url_for_version(self, version): + if version <= Version("1.4.0"): + return f"https://github.com/manugarg/pacparser/releases/download/v{version}/pacparser-v{version}.tar.gz" + else: + return f"https://github.com/manugarg/pacparser/archive/refs/tags/v{version}.tar.gz" + def build(self, spec, prefix): make('CC="%s"' % self.compiler.cc, 'CXX="%s"' % self.compiler.cxx, "-C", "src") if "+python" in spec: diff --git a/var/spack/repos/builtin/packages/parallel/package.py b/var/spack/repos/builtin/packages/parallel/package.py index 7ced55d382a204..ced0386a4d44dc 100644 --- a/var/spack/repos/builtin/packages/parallel/package.py +++ b/var/spack/repos/builtin/packages/parallel/package.py @@ -3,6 +3,7 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) +from spack.hooks.sbang import filter_shebang from spack.package import * @@ -15,8 +16,9 @@ class Parallel(AutotoolsPackage, GNUMirrorPackage): homepage = "https://www.gnu.org/software/parallel/" gnu_mirror_path = "parallel/parallel-20220522.tar.bz2" - license("GPL-3.0-or-later") + license("GPL-3.0-or-later", checked_by="wdconinc") + version("20240822", sha256="d7bbd95b7631980b172be04cbd2138d5f7d8c063d6da5ad8f9f70dfd88c8309d") version("20220522", sha256="bb6395f8d964e68f3bdb26a764d3c48b69bc5b759a92ac3ab2bd1895c7fa8c1f") version("20220422", sha256="96e4b73fff1302fc141a889ae43ab2e93f6c9e86ac60ef62ced02dbe70b73ca7") version("20220322", sha256="df93ccf6a9f529ad2126b7042aef0486603e938c77b405939c41702d38a4e6d8") @@ -49,3 +51,6 @@ def filter_sbang(self): substitute = f"#!{perl}" files = ["parallel", "niceload", "parcat", "sql"] filter_file(match, substitute, *files, **kwargs) + # Since scripts are run during installation, we need to add sbang + for file in files: + filter_shebang(file) diff --git a/var/spack/repos/builtin/packages/paraview/package.py b/var/spack/repos/builtin/packages/paraview/package.py index 2c7bc311deac0d..92cbdb89919f64 100644 --- a/var/spack/repos/builtin/packages/paraview/package.py +++ b/var/spack/repos/builtin/packages/paraview/package.py @@ -5,11 +5,14 @@ import itertools import os +import re import sys from subprocess import Popen from spack.package import * +IS_WINDOWS = sys.platform == "win32" + class Paraview(CMakePackage, CudaPackage, ROCmPackage): """ParaView is an open-source, multi-platform data analysis and @@ -32,10 +35,11 @@ class Paraview(CMakePackage, CudaPackage, ROCmPackage): version("master", branch="master", submodules=True) version( - "5.13.0", - sha256="886f530bebd6b24c6a7f8a5f4b1afa72c53d4737ccaa4b5fd5946b4e5a758c91", + "5.13.1", + sha256="a16503ce37b999c2967d84234596e7bf67ac98221851a288bb1399c7e1dc2004", preferred=True, ) + version("5.13.0", sha256="886f530bebd6b24c6a7f8a5f4b1afa72c53d4737ccaa4b5fd5946b4e5a758c91") version("5.12.1", sha256="927f880c13deb6dde4172f4727d2b66f5576e15237b35778344f5dd1ddec863e") version("5.12.0", sha256="d289afe7b48533e2ca4a39a3b48d3874bfe67cf7f37fdd2131271c57e64de20d") version("5.11.2", sha256="5c5d2f922f30d91feefc43b4a729015dbb1459f54c938896c123d2ac289c7a1e") @@ -182,8 +186,11 @@ class Paraview(CMakePackage, CudaPackage, ROCmPackage): # Starting from cmake@3.18, CUDA architecture managament can be delegated to CMake. # Hence, it is possible to rely on it instead of relying on custom logic updates from VTK-m for # newer architectures (wrt mapping). - for _arch in [arch for arch in CudaPackage.cuda_arch_values if int(arch) > 86]: - conflicts("cmake@:3.17", when=f"cuda_arch={_arch}") + pattern = re.compile(r"\d+") + for _arch in CudaPackage.cuda_arch_values: + _number = re.match(pattern, _arch).group() + if int(_number) > 86: + conflicts("cmake@:3.17", when=f"cuda_arch={_arch}") # We only support one single Architecture for _arch, _other_arch in itertools.permutations(CudaPackage.cuda_arch_values, 2): @@ -218,16 +225,23 @@ class Paraview(CMakePackage, CudaPackage, ROCmPackage): depends_on("tbb", when="+tbb") depends_on("mpi", when="+mpi") - depends_on("qt+opengl", when="@5.3.0:+qt+opengl2") - depends_on("qt~opengl", when="@5.3.0:+qt~opengl2") + depends_on("qt@:4", when="@:5.2.0+qt") + depends_on("qt+sql", when="+qt") + with when("+qt"): + depends_on("qt+opengl", when="@5.3.0:+opengl2") + depends_on("qt~opengl", when="@5.3.0:~opengl2") depends_on("gl@3.2:", when="+opengl2") depends_on("gl@1.2:", when="~opengl2") depends_on("glew") depends_on("libxt", when="platform=linux ^[virtuals=gl] glx") - requires("^[virtuals=gl] glx", when="+qt", msg="Qt support requires GLX") + for plat in ["linux", "darwin", "freebsd"]: + with when(f"platform={plat}"): + requires( + "^[virtuals=gl] glx", when="+qt", msg="Qt support requires GLX on non Windows" + ) depends_on("ospray@2.1:2", when="+raytracing") depends_on("openimagedenoise", when="+raytracing") @@ -563,6 +577,9 @@ def use_x11(): # so explicitly specify which QT major version is actually being used if spec.satisfies("+qt"): cmake_args.extend(["-DPARAVIEW_QT_VERSION=%s" % spec["qt"].version[0]]) + if IS_WINDOWS: + # Windows does not currently support Qt Quick + cmake_args.append("-DVTK_MODULE_ENABLE_VTK_GUISupportQtQuick:STRING=NO") if "+fortran" in spec: cmake_args.append("-DPARAVIEW_USE_FORTRAN:BOOL=ON") diff --git a/var/spack/repos/builtin/packages/pbmpi/package.py b/var/spack/repos/builtin/packages/pbmpi/package.py index be59df98832008..a02903fbec9275 100644 --- a/var/spack/repos/builtin/packages/pbmpi/package.py +++ b/var/spack/repos/builtin/packages/pbmpi/package.py @@ -9,7 +9,7 @@ class Pbmpi(MakefilePackage): """A Bayesian software for phylogenetic reconstruction using mixture models""" - homepage = "https://megasun.bch.umontreal.ca/People/lartillot/www/index.htm" + homepage = "https://github.com/bayesiancook/pbmpi" url = "https://github.com/bayesiancook/pbmpi/archive/refs/tags/v1.8c.tar.gz" git = "https://github.com/bayesiancook/pbmpi.git" diff --git a/var/spack/repos/builtin/packages/pcre/package.py b/var/spack/repos/builtin/packages/pcre/package.py index 4f7496f19c2bff..e9b4606ce884a4 100644 --- a/var/spack/repos/builtin/packages/pcre/package.py +++ b/var/spack/repos/builtin/packages/pcre/package.py @@ -57,6 +57,10 @@ class Pcre(AutotoolsPackage, CMakePackage): variant("pic", default=True, description="Enable position-independent code (PIC)") requires("+pic", when="+shared build_system=autotools") + with when("build_system=cmake"): + depends_on("zlib") + depends_on("bzip2") + class AutotoolsBuilder(spack.build_systems.autotools.AutotoolsBuilder): def configure_args(self): diff --git a/var/spack/repos/builtin/packages/pcre2/package.py b/var/spack/repos/builtin/packages/pcre2/package.py index 2e1f4c03f3be06..df79accc6ed67e 100644 --- a/var/spack/repos/builtin/packages/pcre2/package.py +++ b/var/spack/repos/builtin/packages/pcre2/package.py @@ -6,7 +6,7 @@ from spack.package import * -class Pcre2(AutotoolsPackage): +class Pcre2(AutotoolsPackage, CMakePackage): """The PCRE2 package contains Perl Compatible Regular Expression libraries. These are useful for implementing regular expression pattern matching using the same syntax and semantics as Perl 5.""" @@ -14,8 +14,9 @@ class Pcre2(AutotoolsPackage): homepage = "https://www.pcre.org" url = "https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.39/pcre2-10.39.tar.bz2" - license("BSD-3-Clause") + license("BSD-3-Clause AND PCRE2-exception", when="@10:", checked_by="wdconinc") + version("10.44", sha256="d34f02e113cf7193a1ebf2770d3ac527088d485d4e047ed10e5d217c6ef5de96") version("10.43", sha256="e2a53984ff0b07dfdb5ae4486bbb9b21cca8e7df2434096cc9bf1b728c350bcb") version("10.42", sha256="8d36cd8cb6ea2a4c2bb358ff6411b0c788633a2a45dabbf1aeb4b701d1b5e840") version("10.41", sha256="0f78cebd3e28e346475fb92e95fe9999945b4cbaad5f3b42aca47b887fb53308") @@ -26,11 +27,37 @@ class Pcre2(AutotoolsPackage): version("10.31", sha256="e07d538704aa65e477b6a392b32ff9fc5edf75ab9a40ddfc876186c4ff4d68ac") version("10.20", sha256="332e287101c9e9567d1ed55391b338b32f1f72c5b5ee7cc81ef2274a53ad487a") - depends_on("c", type="build") # generated + depends_on("c", type="build") variant("multibyte", default=True, description="Enable support for 16 and 32 bit characters.") variant("jit", default=False, description="enable Just-In-Time compiling support") + # Building static+shared can cause naming colisions and other problems + # for dependents on Windows. It generally does not cause problems on + # other systems, so this variant is not exposed for non-Windows. + variant("shared", default=True, description="build shared pcre2", when="platform=windows") + build_system("autotools", "cmake", default="autotools") + with when("build_system=cmake"): + depends_on("zlib") + depends_on("bzip2") + + @property + def libs(self): + if "+multibyte" in self.spec: + name = "pcre2-32" + else: + name = "pcre2-8" + is_shared = self.spec.satisfies("+shared") + if not self.spec.satisfies("platform=windows"): + name = "lib" + name + if self.spec.satisfies("platform=windows") and not is_shared: + name += "-static" + return find_libraries( + name, root=self.prefix, recursive=True, shared=is_shared, runtime=False + ) + + +class AutotoolsBuilder(spack.build_systems.autotools.AutotoolsBuilder): def configure_args(self): args = [] @@ -43,11 +70,23 @@ def configure_args(self): return args - @property - def libs(self): - if "+multibyte" in self.spec: - name = "libpcre2-32" - else: - name = "libpcre2-8" - return find_libraries(name, root=self.prefix, recursive=True) +class CMakeBuilder(spack.build_systems.cmake.CMakeBuilder): + def cmake_args(self): + args = [] + args.append(self.define_from_variant("PCRE2_BUILD_PCRE2_16", "multibyte")) + args.append(self.define_from_variant("PCRE2_BUILD_PCRE2_32", "multibyte")) + args.append(self.define_from_variant("PCRE2_SUPPORT_JIT", "jit")) + # Don't need to check for on or off, just if the variant is available + # If not specified, the build system will build both static and shared + # by default, this is in parity with the autotools build, so on + # linux and MacOS, the produced binaries are identical, Windows is the + # only outlier + if self.spec.satisfies("platform=windows"): + args.append(self.define_from_variant("BUILD_SHARED_LIBS", "shared")) + # PCRE allows building shared and static at the same time + # this is bad practice and a problem on some platforms + # Enforce mutual exclusivity here + args.append(self.define("BUILD_STATIC_LIBS", not self.spec.satisfies("+shared"))) + + return args diff --git a/var/spack/repos/builtin/packages/perl-alien-libxml2/package.py b/var/spack/repos/builtin/packages/perl-alien-libxml2/package.py index a48a7f88e9ecce..033bbe4400682b 100644 --- a/var/spack/repos/builtin/packages/perl-alien-libxml2/package.py +++ b/var/spack/repos/builtin/packages/perl-alien-libxml2/package.py @@ -14,8 +14,10 @@ class PerlAlienLibxml2(PerlPackage): license("GPL-1.0-or-later OR Artistic-1.0-Perl") + version("0.19", sha256="f4a674099bbd5747c0c3b75ead841f3b244935d9ef42ba35368024bd611174c9") version("0.10_01", sha256="2f45b308b33503292f48bf46a75fe1e653d6b209ba5caf0628d8cc103f8d61ac") depends_on("libxml2") depends_on("perl-alien-build", type=("build", "run")) + depends_on("perl-alien-build-plugin-download-gitlab", type=("build", "run"), when="@0.18:") depends_on("pkgconfig", type=("build")) diff --git a/var/spack/repos/builtin/packages/perl-bio-ensembl-io/package.py b/var/spack/repos/builtin/packages/perl-bio-ensembl-io/package.py new file mode 100644 index 00000000000000..5793e3bd51185b --- /dev/null +++ b/var/spack/repos/builtin/packages/perl-bio-ensembl-io/package.py @@ -0,0 +1,47 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +from spack.package import * + + +class PerlBioEnsemblIo(Package): + """File parsing and writing code for Ensembl.""" + + homepage = "https://github.com/Ensembl/ensembl-io/" + url = "https://github.com/Ensembl/ensembl-io/archive/release/111.zip" + + maintainers("teaguesterling") + + license("APACHE-2.0", checked_by="teaguesterling") + + for vers, sha in [ + ("112", "ccbffe7c15318075463db46be348655a5914762e05ff47da2d72a4c99414d39a"), + ("111", "f81d4c1aea88aac7105aaa3fec548e39b79f129c7abc08b55be7d0345aa5482c"), + ("110", "83cf00ecdb6184be480fc3cbf0ffc322d3e9411e14602396fda8d153345d6c2e"), + ]: + version(vers, sha256=sha) + depends_on(f"perl-bio-ensembl@{vers}", when=f"@{vers}") + + extends("perl") + + variant("scripts", default=False, description="Install scripts") + + depends_on("perl-bio-bigfile") + depends_on("perl-bio-db-hts") + depends_on("perl-bio-ensembl") + depends_on("perl-bioperl@1.6.924") + depends_on("perl-compress-bzip2") + depends_on("perl-json") + depends_on("perl-try-tiny") + depends_on("perl-uri") + depends_on("vcftools") + + def install(self, spec, prefix): + install_tree("modules", prefix.lib.perl5) + mkdirp(prefix.share.ensembl) + for extra in ["scripts"]: + if spec.satisfies(f"+{extra}"): + extra = extra.replace("_", "-") + target = join_path(prefix.share.ensembl, extra) + install_tree(extra, target) diff --git a/var/spack/repos/builtin/packages/perl-bio-ensembl-variation/package.py b/var/spack/repos/builtin/packages/perl-bio-ensembl-variation/package.py new file mode 100644 index 00000000000000..0078c280611a75 --- /dev/null +++ b/var/spack/repos/builtin/packages/perl-bio-ensembl-variation/package.py @@ -0,0 +1,88 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +from spack.package import * + + +class PerlBioEnsemblVariation(Package): + """The Ensembl Variation Perl API and SQL schema.""" + + homepage = "http://www.ensembl.org/info/docs/api/variation/" + url = "https://github.com/Ensembl/ensembl-variation/archive/release/112.zip" + + maintainers("teaguesterling") + + license("APACHE-2.0", checked_by="teaguesterling") + + for vers, sha in [ + ("112", "ad75ff0a9efbf2d5c10ab5087d414bac685819664d01fbe4a9765393bd742a7c"), + ("111", "b2171b3f5f82a2b7e849c0ec8dc254f4bace4b3faba1b3ab75c5eea596e33bef"), + ("110", "210d627dcb867d9fda3a0d94428da256f394c32e34df5171b9b9e604507e1f05"), + ]: + version(vers, sha256=sha) + depends_on(f"perl-bio-ensembl@{vers}", when=f"@{vers}") + depends_on(f"perl-bio-ensembl-io@{vers}", when=f"@{vers}+tools", type="run") + depends_on(f"perl-bio-ensembl-funcgen@{vers}", when=f"@{vers}", type="run") + + extends("perl") + + variant("sql", default=False, description="Install SQL files") + variant("schema", default=False, description="Install schema documentation") + variant("nextflow", default=False, description="Install nextflow workflows") + variant("scripts", default=False, description="Install additional scripts") + variant("tools", default=False, description="Install additional tools") + variant("ld", default=False, description="Compile LD calculation tools") + + depends_on("perl-bioperl@1.6.924") + depends_on("perl-bio-bigfile") + depends_on("perl-bio-db-hts") + depends_on("perl-sereal") + depends_on("perl-json") + depends_on("perl-set-intervaltree") + depends_on("perl-string-approx") + depends_on("perl-xml-hash-xs") + depends_on("perl-xml-libxml") + depends_on("perl-date-manip") + + with when("+ld"): + depends_on("htslib", type="build") + depends_on("gmake", type="build") + + phases = ("build", "install") + + def setup_build_environment(self, env): + if self.spec.satisfies("+ld"): + env.set("HTSLIB_DIR", self.spec["htslib"].prefix.include) + + def build(self, spec, prefix): + if spec.satisfies("+ld"): + make = which("make") + with working_dir("C_code"): + make() + if spec.satisfies("+tools"): + # Fix the fact that phenotype_annotation isn't executable + chmod = which("chmod") + chmod("+x", "tools/phenotype_annotation/phenotype_annotation") + + def install(self, spec, prefix): + install_tree("modules", prefix.lib.perl5) + + mkdirp(prefix.share.ensembl.variation) + for extra in ["sql", "schema", "nextflow", "scripts"]: + if spec.satisfies(f"+{extra}"): + target = join_path(prefix.share.ensembl, extra) + install_tree(extra, target) + + for requested, targets in { + "+ld": ["C_code/calc_genotypes", "C_code/ld_vcf"], + "+tools": [ + "tools/linkage_disequilibrium/ld_tool", + "tools/variant_simulator/simulate_variation", + "tools/phenotype_annotation/phenotype_annotation", + ], + }.items(): + if spec.satisfies(requested): + mkdirp(prefix.bin) + for target in targets: + install(target, prefix.bin) diff --git a/var/spack/repos/builtin/packages/perl-bio-ensembl/package.py b/var/spack/repos/builtin/packages/perl-bio-ensembl/package.py index 763c75e91de9ce..8cf860e3d72007 100644 --- a/var/spack/repos/builtin/packages/perl-bio-ensembl/package.py +++ b/var/spack/repos/builtin/packages/perl-bio-ensembl/package.py @@ -18,7 +18,7 @@ def url_for_version(self, version): license("APACHE-2.0", checked_by="teaguesterling") - version("112", sha256="8a6b46840df71c4332d2de6027596ed4417a26111800d7ff0636199363568235") + version("112", sha256="7c2c5265abe74b462cd4f8b26f140a4c4945cd0e2971f40711afbb4b38db5997") version("111", sha256="346c47c75a6fa8dcfd9f9d22e9f1e0ccc35b2fb99f75980a0c74d892e4ab2b6d") version("110", sha256="fdf725cad1a980ddf900f1af1a72bf1de355f15e408664930ed84aeccfefad15") diff --git a/var/spack/repos/builtin/packages/perl-bioperl/package.py b/var/spack/repos/builtin/packages/perl-bioperl/package.py index 790446ad915c7e..1385bd5911ec0e 100644 --- a/var/spack/repos/builtin/packages/perl-bioperl/package.py +++ b/var/spack/repos/builtin/packages/perl-bioperl/package.py @@ -32,87 +32,81 @@ class PerlBioperl(PerlPackage): and contribute your own if possible.""" homepage = "https://metacpan.org/pod/BioPerl" - url = "https://cpan.metacpan.org/authors/id/C/CD/CDRAUG/BioPerl-1.7.6.tar.gz" + url = "https://cpan.metacpan.org/authors/id/C/CJ/CJFIELDS/BioPerl-1.7.8.tar.gz" license("Artistic-1.0") + version("1.7.8", sha256="c490a3be7715ea6e4305efd9710e5edab82dabc55fd786b6505b550a30d71738") version( "1.7.6", sha256="df2a3efc991b9b5d7cc9d038a1452c6dac910c9ad2a0e47e408dd692c111688d", - preferred=True, + url="https://cpan.metacpan.org/authors/id/C/CD/CDRAUG/BioPerl-1.7.6.tar.gz", ) + version("1.6.924", sha256="616a7546bb3c58504de27304a0f6cb904e18b6bbcdb6a4ec8454f2bd37bb76d0") + + # This is technically the same as 1.7.2, but with a more conventional version number. version( "1.007002", sha256="17aa3aaab2f381bbcaffdc370002eaf28f2c341b538068d6586b2276a76464a1", url="https://cpan.metacpan.org/authors/id/C/CJ/CJFIELDS/BioPerl-1.007002.tar.gz", + deprecated=True, ) - depends_on("fortran", type="build") # generated - - # According to cpandeps.grinnz.com Module-Build is both a build and run - # time dependency for BioPerl - depends_on("perl-module-build", type=("build", "run")) - depends_on("perl-uri", type=("build", "run")) - depends_on("perl-io-string", type=("build", "run")) - depends_on("perl-data-stag", type=("build", "run")) - depends_on("perl-test-most", type=("build", "run")) - depends_on("perl-error", when="@1.7.6:", type=("build", "run")) - depends_on("perl-graph", when="@1.7.6:", type=("build", "run")) - depends_on("perl-http-message", when="@1.7.6:", type=("build", "run")) - depends_on("perl-io-stringy", when="@1.7.6:", type=("build", "run")) - depends_on("perl-ipc-run", when="@1.7.6:", type=("build", "run")) - depends_on("perl-list-moreutils", when="@1.7.6:", type=("build", "run")) - depends_on("perl-set-scalar", when="@1.7.6:", type=("build", "run")) - depends_on("perl-test-requiresinternet", when="@1.7.6:", type=("build", "run")) - depends_on("perl-xml-dom", when="@1.7.6:", type=("build", "run")) - depends_on("perl-xml-dom-xpath", when="@1.7.6:", type=("build", "run")) - depends_on("perl-xml-libxml", when="@1.7.6:", type=("build", "run")) - depends_on("perl-xml-sax", when="@1.7.6:", type=("build", "run")) - depends_on("perl-xml-sax-base", when="@1.7.6:", type=("build", "run")) - depends_on("perl-xml-sax-writer", when="@1.7.6:", type=("build", "run")) - depends_on("perl-xml-twig", when="@1.7.6:", type=("build", "run")) - depends_on("perl-xml-writer", when="@1.7.6:", type=("build", "run")) - depends_on("perl-yaml", when="@1.7.6:", type=("build", "run")) - depends_on("perl-libwww-perl", when="@1.7.6:", type=("build", "run")) - depends_on("perl-libxml-perl", when="@1.7.6:", type=("build", "run")) - - @when("@1.007002") - def configure(self, spec, prefix): - # Overriding default configure method in order to cater to interactive - # Build.pl - self.build_method = "Build.PL" - self.build_executable = Executable(join_path(self.stage.source_path, "Build")) - - # Config questions consist of: - # Do you want to run the Bio::DB::GFF or Bio::DB::SeqFeature::Store - # live database tests? y/n [n] - # - # Install [a]ll BioPerl scripts, [n]one, or choose groups - # [i]nteractively? [a] - # - # Do you want to run tests that require connection to servers across - # the internet (likely to cause some failures)? y/n [n] - # - # Eventually, someone can add capability for the other options, but - # the current answers are the most practical for a spack install. - - config_answers = ["n\n", "a\n", "n\n"] - config_answers_filename = "spack-config.in" - - with open(config_answers_filename, "w") as f: - f.writelines(config_answers) - - with open(config_answers_filename, "r") as f: - perl("Build.PL", "--install_base=%s" % self.prefix, input=f) - - # Need to also override the build and install methods to make sure that the - # Build script is run through perl and not use the shebang, as it might be - # too long. This is needed because this does not pick up the - # `@run_after(configure)` step defined in `PerlPackage`. - @when("@1.007002") - def build(self, spec, prefix): - perl("Build") - - @when("@1.007002") - def install(self, spec, prefix): - perl("Build", "install") + with default_args(type=("build", "run")): + depends_on("perl-data-stag") + depends_on("perl-error") + depends_on("perl-graph") + depends_on("perl-http-message") + depends_on("perl-io-string") + depends_on("perl-io-stringy") + depends_on("perl-ipc-run") + depends_on("perl-libwww-perl") + depends_on("perl-libxml-perl") + depends_on("perl-list-moreutils") + depends_on("perl-module-build") + depends_on("perl-set-scalar") + depends_on("perl-test-most") + depends_on("perl-test-requiresinternet") + depends_on("perl-uri") + depends_on("perl-xml-dom") + depends_on("perl-xml-dom-xpath") + depends_on("perl-xml-libxml") + depends_on("perl-xml-parser") + depends_on("perl-xml-sax") + depends_on("perl-xml-sax-base") + depends_on("perl-xml-sax-writer") + depends_on("perl-xml-simple") + depends_on("perl-xml-twig") + depends_on("perl-yaml") + + with when("@:1.7.0"): + depends_on("perl-clone") + depends_on("perl-db-file") + depends_on("perl-dbd-mysql") + depends_on("perl-dbd-pg") + depends_on("perl-dbd-sqlite") + depends_on("perl-dbi") + depends_on("perl-gd") + depends_on("perl-graphviz") + depends_on("perl-scalar-list-utils") + depends_on("perl-set-scalar") + depends_on("perl-svg") + + # TODO: + # variant("optionaldeps", default=False, description="Add optional dependencies") + # with when("@:1.7.0+optionaldeps"): + # depends_on("perl-sort-naturally") + # depends_on("perl-test-harness") + # depends_on("perl-text-parsewords") + # depends_on("perl-algorithm-munkres") + # depends_on("perl-array-compare") + # depends_on("perl-bio-phylo") + # depends_on("perl-convert-binary-c") + # depends_on("perl-html-entities") + # depends_on("perl-html-headparser") + # depends_on("perl-html-tableextract") + # depends_on("perl-svg-graph") + + def configure_args(self): + args = ["--accept=1"] + return args diff --git a/var/spack/repos/builtin/packages/perl-carp-clan/package.py b/var/spack/repos/builtin/packages/perl-carp-clan/package.py index 92c37875c9c4fd..ce0f79ee1a25ae 100644 --- a/var/spack/repos/builtin/packages/perl-carp-clan/package.py +++ b/var/spack/repos/builtin/packages/perl-carp-clan/package.py @@ -10,11 +10,18 @@ class PerlCarpClan(PerlPackage): """Report errors from perspective of caller of a "clan" of modules""" homepage = "https://metacpan.org/pod/Carp::Clan" - url = "https://cpan.metacpan.org/authors/id/K/KE/KENTNL/Carp-Clan-6.06.tar.gz" + url = "https://cpan.metacpan.org/authors/id/E/ET/ETHER/Carp-Clan-6.08.tar.gz" license("GPL-1.0-or-later OR Artistic-1.0-Perl") + version("6.08", sha256="c75f92e34422cc5a65ab05d155842b701452434e9aefb649d6e2289c47ef6708") version("6.06", sha256="ea4ac8f611354756d43cb369880032901e9cc4cc7e0bebb7b647186dac00c9d4") depends_on("perl-test-exception", type=("build", "run")) depends_on("perl-sub-uplevel", type=("build", "run")) + + def url_for_version(self, version): + if self.spec.satisfies("@6.08:"): + return f"https://cpan.metacpan.org/authors/id/E/ET/ETHER/Carp-Clan-{version}.tar.gz" + else: + return f"https://cpan.metacpan.org/authors/id/K/KE/KENTNL/Carp-Clan-{version}.tar.gz" diff --git a/var/spack/repos/builtin/packages/perl-class-data-inheritable/package.py b/var/spack/repos/builtin/packages/perl-class-data-inheritable/package.py index ef897865fe460d..8fcf1bd55c51db 100644 --- a/var/spack/repos/builtin/packages/perl-class-data-inheritable/package.py +++ b/var/spack/repos/builtin/packages/perl-class-data-inheritable/package.py @@ -10,9 +10,16 @@ class PerlClassDataInheritable(PerlPackage): """For creating accessor/mutators to class data.""" homepage = "https://metacpan.org/pod/Class::Data::Inheritable" - url = "https://cpan.metacpan.org/authors/id/T/TM/TMTM/Class-Data-Inheritable-0.08.tar.gz" + url = "https://cpan.metacpan.org/authors/id/R/RS/RSHERER/Class-Data-Inheritable-0.09.tar.gz" license("GPL-1.0-or-later OR Artistic-1.0-Perl") + version("0.09", sha256="44088d6e90712e187b8a5b050ca5b1c70efe2baa32ae123e9bd8f59f29f06e4d") version("0.08", sha256="9967feceea15227e442ec818723163eb6d73b8947e31f16ab806f6e2391af14a") depends_on("perl-extutils-makemaker", type="build") + + def url_for_version(self, version): + if self.spec.satisfies("@0.09:"): + return f"https://cpan.metacpan.org/authors/id/R/RS/RSHERER/Class-Data-Inheritable-{version}.tar.gz" + else: + return f"https://cpan.metacpan.org/authors/id/T/TM/TMTM/Class-Data-Inheritable-{version}.tar.gz" diff --git a/var/spack/repos/builtin/packages/perl-cpan-meta-check/package.py b/var/spack/repos/builtin/packages/perl-cpan-meta-check/package.py index 069443ecfcb4d4..0b25043f7985fe 100644 --- a/var/spack/repos/builtin/packages/perl-cpan-meta-check/package.py +++ b/var/spack/repos/builtin/packages/perl-cpan-meta-check/package.py @@ -15,6 +15,7 @@ class PerlCpanMetaCheck(PerlPackage): license("GPL-1.0-or-later OR Artistic-1.0-Perl") + version("0.018", sha256="f619d2df5ea0fd91c8cf83eb54acccb5e43d9e6ec1a3f727b3d0ac15d0cf378a") version("0.017", sha256="0454ab93f12780b1d579df15b5f939e09702e954be82028fadd40e8bc9b0f091") version("0.014", sha256="28a0572bfc1c0678d9ce7da48cf521097ada230f96eb3d063fcbae1cfe6a351f") diff --git a/var/spack/repos/builtin/packages/perl-data-optlist/package.py b/var/spack/repos/builtin/packages/perl-data-optlist/package.py index 48793304069269..06b90a041cac8b 100644 --- a/var/spack/repos/builtin/packages/perl-data-optlist/package.py +++ b/var/spack/repos/builtin/packages/perl-data-optlist/package.py @@ -14,6 +14,7 @@ class PerlDataOptlist(PerlPackage): license("GPL-1.0-or-later OR Artistic-1.0-Perl") + version("0.114", sha256="9fd1093b917a21fb79ae1607db53d113b4e0ad8fe0ae776cb077a7e50044fdf3") version("0.113", sha256="36aebc5817b7d4686b649434c2ee41f45c8bf97d4ca5a99f607cc40f695a4285") version("0.112", sha256="62c60ccaae88d5339ae36bcc8940b03388cf84adbf27828b1f8b300307103bab") version("0.110", sha256="366117cb2966473f2559f2f4575ff6ae69e84c69a0f30a0773e1b51a457ef5c3") diff --git a/var/spack/repos/builtin/packages/perl-dbi/package.py b/var/spack/repos/builtin/packages/perl-dbi/package.py index d66ed71422f960..1064d147d3cb76 100644 --- a/var/spack/repos/builtin/packages/perl-dbi/package.py +++ b/var/spack/repos/builtin/packages/perl-dbi/package.py @@ -12,9 +12,16 @@ class PerlDbi(PerlPackage): database interface independent of the actual database being used.""" homepage = "https://dbi.perl.org/" - url = "https://cpan.metacpan.org/authors/id/T/TI/TIMB/DBI-1.636.tar.gz" + url = "https://cpan.metacpan.org/authors/id/H/HM/HMBRAND/DBI-1.645.tgz" license("GPL-1.0-or-later OR Artistic-1.0-Perl") + version("1.645", sha256="e38b7a5efee129decda12383cf894963da971ffac303f54cc1b93e40e3cf9921") version("1.643", sha256="8a2b993db560a2c373c174ee976a51027dd780ec766ae17620c20393d2e836fa") version("1.636", sha256="8f7ddce97c04b4b7a000e65e5d05f679c964d62c8b02c94c1a7d815bb2dd676c") + + def url_for_version(self, version): + if version <= Version("1.643"): + return f"http://search.cpan.org/CPAN/authors/id/T/TI/TIMB/DBI-{version}.tar.gz" + else: + return f"https://cpan.metacpan.org/authors/id/H/HM/HMBRAND/DBI-{version}.tgz" diff --git a/var/spack/repos/builtin/packages/perl-extutils-config/package.py b/var/spack/repos/builtin/packages/perl-extutils-config/package.py index a70ec52532d0f9..8665321f81dbaa 100644 --- a/var/spack/repos/builtin/packages/perl-extutils-config/package.py +++ b/var/spack/repos/builtin/packages/perl-extutils-config/package.py @@ -14,6 +14,7 @@ class PerlExtutilsConfig(PerlPackage): license("GPL-1.0-or-later OR Artistic-1.0-Perl") + version("0.010", sha256="82e7e4e90cbe380e152f5de6e3e403746982d502dd30197a123652e46610c66d") version("0.009", sha256="4ef84e73aad50a3be332885d2a3b12f3cab1b1e0bad24e88297a123b4f39f3ce") version("0.008", sha256="ae5104f634650dce8a79b7ed13fb59d67a39c213a6776cfdaa3ee749e62f1a8c") depends_on("perl@5.6:", type=("build", "run", "test")) diff --git a/var/spack/repos/builtin/packages/perl-file-listing/package.py b/var/spack/repos/builtin/packages/perl-file-listing/package.py index 6a55cc4bb505d9..3aeaae5254381b 100644 --- a/var/spack/repos/builtin/packages/perl-file-listing/package.py +++ b/var/spack/repos/builtin/packages/perl-file-listing/package.py @@ -10,10 +10,11 @@ class PerlFileListing(PerlPackage): """Parse directory listing""" homepage = "https://metacpan.org/pod/File::Listing" - url = "https://cpan.metacpan.org/authors/id/G/GA/GAAS/File-Listing-6.04.tar.gz" + url = "https://cpan.metacpan.org/authors/id/P/PL/PLICEASE/File-Listing-6.16.tar.gz" license("GPL-1.0-or-later OR Artistic-1.0-Perl") + version("6.16", sha256="189b3a13fc0a1ba412b9d9ec5901e9e5e444cc746b9f0156d4399370d33655c6") version("6.04", sha256="1e0050fcd6789a2179ec0db282bf1e90fb92be35d1171588bd9c47d52d959cf5") provides("perl-file-listing-apache") @@ -23,4 +24,14 @@ class PerlFileListing(PerlPackage): provides("perl-file-listing-vms") depends_on("perl@5.6:", type=("build", "run", "test")) depends_on("perl-extutils-makemaker", type="build") - depends_on("perl-http-date", type="run") + depends_on("perl-http-date", type=("build", "run")) + + def url_for_version(self, version): + if self.spec.satisfies("@6.05:"): + return ( + f"https://cpan.metacpan.org/authors/id/P/PL/PLICEASE/File-Listing-{version}.tar.gz" + ) + else: + return ( + f"http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/File-Listing-{version}.tar.gz" + ) diff --git a/var/spack/repos/builtin/packages/perl-graphviz/package.py b/var/spack/repos/builtin/packages/perl-graphviz/package.py index 5cfc1d5a4fad0f..1e07c3f68194ef 100644 --- a/var/spack/repos/builtin/packages/perl-graphviz/package.py +++ b/var/spack/repos/builtin/packages/perl-graphviz/package.py @@ -18,6 +18,7 @@ class PerlGraphviz(PerlPackage): version("2.26", sha256="9a5d2520b3262bf30475272dd764a445f8e7f931bef88be0e3d3bff445da7328") + depends_on("graphviz", type=("build", "run", "test")) depends_on("perl-file-which@1.09:", type=("build", "run", "test")) depends_on("perl-ipc-run@0.6:", type=("build", "run", "test")) depends_on("perl-libwww-perl", type=("build", "run", "test")) diff --git a/var/spack/repos/builtin/packages/perl-http-cookies/package.py b/var/spack/repos/builtin/packages/perl-http-cookies/package.py index 67d43e76a0d378..516c1759bd1d31 100644 --- a/var/spack/repos/builtin/packages/perl-http-cookies/package.py +++ b/var/spack/repos/builtin/packages/perl-http-cookies/package.py @@ -14,6 +14,7 @@ class PerlHttpCookies(PerlPackage): license("GPL-1.0-or-later OR Artistic-1.0-Perl") + version("6.11", sha256="8c9a541a4a39f6c0c7e3d0b700b05dfdb830bd490a1b1942a7dedd1b50d9a8c8") version("6.10", sha256="e36f36633c5ce6b5e4b876ffcf74787cc5efe0736dd7f487bdd73c14f0bd7007") version("6.09", sha256="903f017afaa5b78599cc90efc14ecccc8cc2ebfb636eb8c02f8f16ba861d1fe0") version("6.08", sha256="49ebb73576eb41063c04bc079477df094496deec805ae033f3be338c23c3af59") diff --git a/var/spack/repos/builtin/packages/perl-http-daemon/package.py b/var/spack/repos/builtin/packages/perl-http-daemon/package.py index b139778450fd11..3d620b354fdac2 100644 --- a/var/spack/repos/builtin/packages/perl-http-daemon/package.py +++ b/var/spack/repos/builtin/packages/perl-http-daemon/package.py @@ -10,25 +10,36 @@ class PerlHttpDaemon(PerlPackage): """A simple http server class""" homepage = "https://metacpan.org/pod/HTTP::Daemon" - url = "https://cpan.metacpan.org/authors/id/O/OA/OALDERS/HTTP-Daemon-6.14.tar.gz" + url = "https://cpan.metacpan.org/authors/id/O/OA/OALDERS/HTTP-Daemon-6.16.tar.gz" license("GPL-1.0-or-later OR Artistic-1.0-Perl") + version("6.16", sha256="b38d092725e6fa4e0c4dc2a47e157070491bafa0dbe16c78a358e806aa7e173d") version("6.14", sha256="f0767e7f3cbb80b21313c761f07ad8ed253bce9fa2d0ba806b3fb72d309b2e1d") version("6.13", sha256="d184d1f3e51e690d60e4b00195aa69f679169c858f2aab419997c70892014516") version("6.12", sha256="df47bed10c38670c780fd0116867d5fd4693604acde31ba63380dce04c4e1fa6") version("6.01", sha256="43fd867742701a3f9fcc7bd59838ab72c6490c0ebaf66901068ec6997514adc2") - depends_on("perl-io-socket-ip@0.32:", type=("build", "run", "test")) depends_on("perl-extutils-makemaker", type="build") - depends_on("perl-http-status@6:", type="run") - depends_on("perl-test-needs", type=("build", "test")) - depends_on("perl-http-tiny@0.42:", type=("build", "test")) - depends_on("perl-uri", type=("build", "test")) - depends_on("perl@5.6:", type=("build", "run", "test")) - depends_on("perl-http-response@6:", type="run") depends_on("perl-http-date@6:", type="run") - depends_on("perl-module-build-tiny@0.34:", type="build") depends_on("perl-http-request@6:", type="run") + depends_on("perl-http-response@6:", type="run") + depends_on("perl-http-status@6:", type="run") + depends_on("perl-http-tiny@0.42:", type=("build", "test")) + depends_on("perl-io-socket-ip@0.32:", type=("build", "run", "test")) depends_on("perl-lwp-mediatypes@6:", type="run") + depends_on("perl-module-build-tiny@0.34:", type="build") depends_on("perl-module-metadata", type=("build", "test")) + depends_on("perl-test-needs", type=("build", "test")) + depends_on("perl-uri", type=("build", "test")) + depends_on("perl@5.6:", type=("build", "run", "test")) + + def url_for_version(self, version): + if self.spec.satisfies("@6.02:"): + return ( + f"https://cpan.metacpan.org/authors/id/O/OA/OALDERS/HTTP-Daemon-{version}.tar.gz" + ) + elif self.spec.satisfies("@6.05"): + return f"https://cpan.metacpan.org/authors/id/E/ET/ETHER/HTTP-Daemon-{version}.tar.gz" + else: + return f"http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/HTTP-Daemon-{version}.tar.gz" diff --git a/var/spack/repos/builtin/packages/perl-http-date/package.py b/var/spack/repos/builtin/packages/perl-http-date/package.py index 9397290dc67b7b..c69a23d925a08d 100644 --- a/var/spack/repos/builtin/packages/perl-http-date/package.py +++ b/var/spack/repos/builtin/packages/perl-http-date/package.py @@ -10,12 +10,20 @@ class PerlHttpDate(PerlPackage): """Date conversion routines""" homepage = "https://metacpan.org/pod/HTTP::Date" - url = "https://cpan.metacpan.org/authors/id/G/GA/GAAS/HTTP-Date-6.02.tar.gz" + url = "https://cpan.metacpan.org/authors/id/O/OA/OALDERS/HTTP-Date-6.06.tar.gz" license("GPL-1.0-or-later OR Artistic-1.0-Perl") + version("6.06", sha256="7b685191c6acc3e773d1fc02c95ee1f9fae94f77783175f5e78c181cc92d2b52") version("6.02", sha256="e8b9941da0f9f0c9c01068401a5e81341f0e3707d1c754f8e11f42a7e629e333") + depends_on("perl@5.6.2:", type=("build", "run", "test")) depends_on("perl-extutils-makemaker", type=("build", "test")) depends_on("perl-time-local@1.28:", type="run") depends_on("perl-time-zone", type="run") + + def url_for_version(self, version): + if self.spec.satisfies("@6.03:"): + return f"https://cpan.metacpan.org/authors/id/O/OA/OALDERS/HTTP-Date-{version}.tar.gz" + else: + return f"http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/HTTP-Date-{version}.tar.gz" diff --git a/var/spack/repos/builtin/packages/perl-io-socket-ssl/package.py b/var/spack/repos/builtin/packages/perl-io-socket-ssl/package.py index 7c9acd508ad7f6..2ec9218f333ea5 100644 --- a/var/spack/repos/builtin/packages/perl-io-socket-ssl/package.py +++ b/var/spack/repos/builtin/packages/perl-io-socket-ssl/package.py @@ -14,6 +14,7 @@ class PerlIoSocketSsl(PerlPackage): license("GPL-1.0-or-later OR Artistic-1.0-Perl") + version("2.089", sha256="f683112c1642967e9149f51ad553eccd017833b2f22eb23a9055609d2e3a14d1") version("2.085", sha256="95b2f7c0628a7e246a159665fbf0620d0d7835e3a940f22d3fdd47c3aa799c2e") version("2.074", sha256="36486b6be49da4d029819cf7069a7b41ed48af0c87e23be0f8e6aba23d08a832") version("2.073", sha256="b2c0b34df97cb1aa816221cee2454a1efd89b86ccbda810389a30e0d08cf57c8") diff --git a/var/spack/repos/builtin/packages/perl-io-stringy/package.py b/var/spack/repos/builtin/packages/perl-io-stringy/package.py index 4db1550b32b1e2..e8d1c1f7ca9ebd 100644 --- a/var/spack/repos/builtin/packages/perl-io-stringy/package.py +++ b/var/spack/repos/builtin/packages/perl-io-stringy/package.py @@ -21,6 +21,15 @@ class PerlIoStringy(PerlPackage): globref, or a FileHandle.""" homepage = "https://metacpan.org/pod/IO::Stringy" - url = "https://cpan.metacpan.org/authors/id/D/DS/DSKOLL/IO-stringy-2.111.tar.gz" + url = "https://cpan.metacpan.org/authors/id/C/CA/CAPOEIRAB/IO-Stringy-2.112.tar.gz" + version("2.113", sha256="51220fcaf9f66a639b69d251d7b0757bf4202f4f9debd45bdd341a6aca62fe4e") version("2.111", sha256="8c67fd6608c3c4e74f7324f1404a856c331dbf48d9deda6aaa8296ea41bf199d") + + def url_for_version(self, version): + if self.spec.satisfies("@2.112:"): + return ( + f"https://cpan.metacpan.org/authors/id/C/CA/CAPOEIRAB/IO-Stringy-{version}.tar.gz" + ) + else: + return f"https://cpan.metacpan.org/authors/id/D/DS/DSKOLL/IO-stringy-{version}.tar.gz" diff --git a/var/spack/repos/builtin/packages/perl-ipc-run3/package.py b/var/spack/repos/builtin/packages/perl-ipc-run3/package.py index 95025e3c583e7f..ae4e4feca30b17 100644 --- a/var/spack/repos/builtin/packages/perl-ipc-run3/package.py +++ b/var/spack/repos/builtin/packages/perl-ipc-run3/package.py @@ -14,4 +14,5 @@ class PerlIpcRun3(PerlPackage): maintainers("EbiArnie") + version("0.049", sha256="9d048ae7b9ae63871bae976ba01e081d887392d904e5d48b04e22d35ed22011a") version("0.048", sha256="3d81c3cc1b5cff69cca9361e2c6e38df0352251ae7b41e2ff3febc850e463565") diff --git a/var/spack/repos/builtin/packages/perl-lwp-mediatypes/package.py b/var/spack/repos/builtin/packages/perl-lwp-mediatypes/package.py index 0adee346ef7a68..fbf5901af3bc02 100644 --- a/var/spack/repos/builtin/packages/perl-lwp-mediatypes/package.py +++ b/var/spack/repos/builtin/packages/perl-lwp-mediatypes/package.py @@ -15,13 +15,17 @@ class PerlLwpMediatypes(PerlPackage): license("GPL-1.0-or-later OR Artistic-1.0-Perl") version("6.04", sha256="8f1bca12dab16a1c2a7c03a49c5e58cce41a6fec9519f0aadfba8dad997919d9") - version( - "6.02", - sha256="18790b0cc5f0a51468495c3847b16738f785a2d460403595001e0b932e5db676", - url="https://cpan.metacpan.org/authors/id/G/GA/GAAS/LWP-MediaTypes-6.02.tar.gz", - ) + version("6.02", sha256="18790b0cc5f0a51468495c3847b16738f785a2d460403595001e0b932e5db676") depends_on("perl-test-fatal", type=("build", "test")) depends_on("perl@5.6.2:", type="run") depends_on("perl-extutils-makemaker", type=("build", "test")) depends_on("perl-scalar-util", type="run") + + def url_for_version(self, version): + if self.spec.satisfies("@6.03:"): + return f"https://cpan.metacpan.org/authors/id/O/OA/OALDERS/LWP-MediaTypes-{version}.tar.gz" + else: + return ( + f"http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/LWP-MediaTypes-{version}.tar.gz" + ) diff --git a/var/spack/repos/builtin/packages/perl-lwp-protocol-https/package.py b/var/spack/repos/builtin/packages/perl-lwp-protocol-https/package.py index 4e928cff5a216a..4846dd41eb9ddb 100644 --- a/var/spack/repos/builtin/packages/perl-lwp-protocol-https/package.py +++ b/var/spack/repos/builtin/packages/perl-lwp-protocol-https/package.py @@ -10,10 +10,11 @@ class PerlLwpProtocolHttps(PerlPackage): """Provide https support for LWP::UserAgent""" homepage = "https://metacpan.org/pod/LWP::Protocol::https" - url = "http://cpan.metacpan.org/authors/id/G/GA/GAAS/LWP-Protocol-https-6.04.tar.gz" + url = "https://cpan.metacpan.org/authors/id/O/OA/OALDERS/LWP-Protocol-https-6.14.tar.gz" license("GPL-1.0-or-later OR Artistic-1.0-Perl") + version("6.14", sha256="59cdeabf26950d4f1bef70f096b0d77c5b1c5a7b5ad1b66d71b681ba279cbb2a") version("6.04", sha256="1ef67750ee363525cf729b59afde805ac4dc80eaf8d36ca01082a4d78a7af629") version("6.03", sha256="cb864de7677cc3fc9f8f4aaa17c2984d970fdfa46fc7e3cb90bc5ef2c3e3c6f1") @@ -27,3 +28,9 @@ class PerlLwpProtocolHttps(PerlPackage): depends_on("perl-io-socket-ssl@1.54:", type=("build", "run", "test")) depends_on("perl-test-requiresinternet", type=("build", "test")) depends_on("perl-lwp-protocol-http", type="run") + + def url_for_version(self, version): + if self.spec.satisfies("@6.07:"): + return f"https://cpan.metacpan.org/authors/id/O/OA/OALDERS/LWP-Protocol-https-{version}.tar.gz" + else: + return f"http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/LWP-Protocol-https-{version}.tar.gz" diff --git a/var/spack/repos/builtin/packages/perl-net-ssleay/package.py b/var/spack/repos/builtin/packages/perl-net-ssleay/package.py index b7209b676bda1d..7226c6d13801b4 100644 --- a/var/spack/repos/builtin/packages/perl-net-ssleay/package.py +++ b/var/spack/repos/builtin/packages/perl-net-ssleay/package.py @@ -10,37 +10,18 @@ class PerlNetSsleay(PerlPackage): """Perl extension for using OpenSSL""" homepage = "https://metacpan.org/pod/Net::SSLeay" - url = "https://cpan.metacpan.org/authors/id/C/CH/CHRISN/Net-SSLeay-1.92.tar.gz" + url = "https://cpan.metacpan.org/authors/id/C/CH/CHRISN/Net-SSLeay-1.94.tar.gz" license("Artistic-2.0") + version("1.94", sha256="9d7be8a56d1bedda05c425306cc504ba134307e0c09bda4a788c98744ebcd95d") version("1.93_01", sha256="876d022fbc719631b11d6bb4b6e78db3c19bbca578093c376c8f9900a4432aa3") - version( - "1.92", - sha256="47c2f2b300f2e7162d71d699f633dd6a35b0625a00cbda8c50ac01144a9396a9", - preferred=True, - ) + version("1.92", sha256="47c2f2b300f2e7162d71d699f633dd6a35b0625a00cbda8c50ac01144a9396a9") version("1.90", sha256="f8696cfaca98234679efeedc288a9398fcf77176f1f515dbc589ada7c650dc93") - version( - "1.85", - sha256="9d8188b9fb1cae3bd791979c20554925d5e94a138d00414f1a6814549927b0c8", - url="https://cpan.metacpan.org/authors/id/M/MI/MIKEM/Net-SSLeay-1.82.tar.gz", - ) - version( - "1.84", - sha256="823ec3cbb428309d6a9e56f362a9300693ce3215b7fede109adb7be361fff177", - url="https://cpan.metacpan.org/authors/id/M/MI/MIKEM/Net-SSLeay-1.82.tar.gz", - ) - version( - "1.83", - sha256="c45857c829a48ebf9ecc46e904d20827ad38dde0eb8d5e8b47895260ae6827b7", - url="https://cpan.metacpan.org/authors/id/M/MI/MIKEM/Net-SSLeay-1.82.tar.gz", - ) - version( - "1.82", - sha256="5895c519c9986a5e5af88e3b8884bbdc70e709ee829dc6abb9f53155c347c7e5", - url="https://cpan.metacpan.org/authors/id/M/MI/MIKEM/Net-SSLeay-1.82.tar.gz", - ) + version("1.85", sha256="9d8188b9fb1cae3bd791979c20554925d5e94a138d00414f1a6814549927b0c8") + version("1.84", sha256="823ec3cbb428309d6a9e56f362a9300693ce3215b7fede109adb7be361fff177") + version("1.83", sha256="c45857c829a48ebf9ecc46e904d20827ad38dde0eb8d5e8b47895260ae6827b7") + version("1.82", sha256="5895c519c9986a5e5af88e3b8884bbdc70e709ee829dc6abb9f53155c347c7e5") depends_on("c", type="build") # generated @@ -64,3 +45,9 @@ def configure(self, spec, prefix): with open(config_answers_filename, "r") as f: env["OPENSSL_PREFIX"] = self.spec["openssl"].prefix perl("Makefile.PL", "INSTALL_BASE={0}".format(prefix), input=f) + + def url_for_version(self, version): + if self.spec.satisfies("@1.86:"): + return f"https://cpan.metacpan.org/authors/id/C/CH/CHRISN/Net-SSLeay-{version}.tar.gz" + else: + return f"http://search.cpan.org/CPAN/authors/id/M/MI/MIKEM/Net-SSLeay-{version}.tar.gz" diff --git a/var/spack/repos/builtin/packages/perl-package-stash-xs/package.py b/var/spack/repos/builtin/packages/perl-package-stash-xs/package.py index bbc10ead6635c3..a36b3d22e32752 100644 --- a/var/spack/repos/builtin/packages/perl-package-stash-xs/package.py +++ b/var/spack/repos/builtin/packages/perl-package-stash-xs/package.py @@ -10,14 +10,22 @@ class PerlPackageStashXs(PerlPackage): """Faster and more correct implementation of the Package::Stash API""" homepage = "https://metacpan.org/pod/Package::Stash::XS" - url = "https://cpan.metacpan.org/authors/id/D/DO/DOY/Package-Stash-XS-0.28.tar.gz" + url = "https://cpan.metacpan.org/authors/id/E/ET/ETHER/Package-Stash-XS-0.30.tar.gz" license("GPL-1.0-or-later OR Artistic-1.0-Perl") + version("0.30", sha256="26bad65c1959c57379b3e139dc776fbec5f702906617ef27cdc293ddf1239231") version("0.28", sha256="23d8c5c25768ef1dc0ce53b975796762df0d6e244445d06e48d794886c32d486") + depends_on("perl-test-fatal", type=("build", "test")) depends_on("perl@5.8.1:", type=("build", "run", "test")) depends_on("perl-extutils-makemaker", type=("build", "test")) depends_on("perl-scalar-util", type=("build", "test")) depends_on("perl-test-needs", type=("build", "test")) depends_on("perl-test-requires", type=("build", "test")) + + def url_for_version(self, version): + if self.spec.satisfies("@0.29:"): + return f"https://cpan.metacpan.org/authors/id/E/ET/ETHER/Package-Stash-XS-{version}.tar.gz" + else: + return f"http://search.cpan.org/CPAN/authors/id/D/DO/DOY/Package-Stash-XS-{version}.tar.gz" diff --git a/var/spack/repos/builtin/packages/perl-package-stash/package.py b/var/spack/repos/builtin/packages/perl-package-stash/package.py index 1619da60227820..ac3414ae67d517 100644 --- a/var/spack/repos/builtin/packages/perl-package-stash/package.py +++ b/var/spack/repos/builtin/packages/perl-package-stash/package.py @@ -10,10 +10,11 @@ class PerlPackageStash(PerlPackage): """Routines for manipulating stashes""" homepage = "https://metacpan.org/pod/Package::Stash" - url = "https://cpan.metacpan.org/authors/id/D/DO/DOY/Package-Stash-0.37.tar.gz" + url = "https://cpan.metacpan.org/authors/id/E/ET/ETHER/Package-Stash-0.40.tar.gz" license("GPL-1.0-or-later OR Artistic-1.0-Perl") + version("0.40", sha256="5a9722c6d9cb29ee133e5f7b08a5362762a0b5633ff5170642a5b0686e95e066") version("0.37", sha256="06ab05388f9130cd377c0e1d3e3bafeed6ef6a1e22104571a9e1d7bfac787b2c") provides("perl-package-stash-pp") @@ -26,3 +27,13 @@ class PerlPackageStash(PerlPackage): depends_on("perl-module-implementation@0.6:", type="run") depends_on("perl-scalar-util", type="run") depends_on("perl-cpan-meta-check@0.11:", type=("build", "test")) + + def url_for_version(self, version): + if self.spec.satisfies("@0.38:"): + return ( + f"https://cpan.metacpan.org/authors/id/E/ET/ETHER/Package-Stash-{version}.tar.gz" + ) + else: + return ( + f"http://search.cpan.org/CPAN/authors/id/D/DO/DOY/Package-Stash-{version}.tar.gz" + ) diff --git a/var/spack/repos/builtin/packages/perl-params-util/package.py b/var/spack/repos/builtin/packages/perl-params-util/package.py index 3b6e591e185ea5..0d8a23ec3d7a77 100644 --- a/var/spack/repos/builtin/packages/perl-params-util/package.py +++ b/var/spack/repos/builtin/packages/perl-params-util/package.py @@ -10,12 +10,24 @@ class PerlParamsUtil(PerlPackage): """Simple, compact and correct param-checking functions""" homepage = "https://metacpan.org/pod/Params::Util" - url = "https://cpan.metacpan.org/authors/id/A/AD/ADAMK/Params-Util-1.07.tar.gz" + url = "https://cpan.metacpan.org/authors/id/R/RE/REHSACK/Params-Util-1.102.tar.gz" license("GPL-1.0-or-later OR Artistic-1.0-Perl") + version("1.102", sha256="499bb1b482db24fda277a51525596ad092c2bd51dd508fa8fec2e9f849097402") version("1.07", sha256="30f1ec3f2cf9ff66ae96f973333f23c5f558915bb6266881eac7423f52d7c76c") + provides("perl-params-util-pp") depends_on("perl-extutils-makemaker", type="build") depends_on("perl-test-leaktrace", type=("build", "test")) depends_on("perl-scalar-util@1.18:", type="run") + + def url_for_version(self, version): + if self.spec.satisfies("@1.099:"): + return ( + f"https://cpan.metacpan.org/authors/id/R/RE/REHSACK/Params-Util-{version}.tar.gz" + ) + else: + return ( + f"http://search.cpan.org/CPAN/authors/id/A/AD/ADAMK/Params-Util-{version}.tar.gz" + ) diff --git a/var/spack/repos/builtin/packages/perl-sort-naturally/package.py b/var/spack/repos/builtin/packages/perl-sort-naturally/package.py new file mode 100644 index 00000000000000..a4ba950b05fb47 --- /dev/null +++ b/var/spack/repos/builtin/packages/perl-sort-naturally/package.py @@ -0,0 +1,23 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PerlSortNaturally(PerlPackage): + """Sort lexically, but sort numeral parts numerically""" + + homepage = "https://metacpan.org/pod/Sort::Naturally" + url = "https://cpan.metacpan.org/authors/id/B/BI/BINGOS/Sort-Naturally-1.03.tar.gz" + + maintainers("EbiArnie") + + license("Artistic-1.0-Perl OR GPL-1.0-or-later") + + version("1.03", sha256="eaab1c5c87575a7826089304ab1f8ffa7f18e6cd8b3937623e998e865ec1e746") + + depends_on("perl@5.0.0:", type=("build", "link", "run", "test")) + + use_modules = ["Sort::Naturally"] diff --git a/var/spack/repos/builtin/packages/perl-task-weaken/package.py b/var/spack/repos/builtin/packages/perl-task-weaken/package.py index d2a3c2c9eea11c..964e8a1db4ae4b 100644 --- a/var/spack/repos/builtin/packages/perl-task-weaken/package.py +++ b/var/spack/repos/builtin/packages/perl-task-weaken/package.py @@ -10,15 +10,25 @@ class PerlTaskWeaken(PerlPackage): """Ensure that a platform has weaken support""" homepage = "https://metacpan.org/pod/Task::Weaken" - url = "https://cpan.metacpan.org/authors/id/A/AD/ADAMK/Task-Weaken-1.04.tar.gz" + url = "https://cpan.metacpan.org/authors/id/E/ET/ETHER/Task-Weaken-1.06.tar.gz" license("GPL-1.0-or-later OR Artistic-1.0-Perl") + version("1.06", sha256="2383fedb9dbaef646468ea824afbf7c801076720cfba0df2a7a074726dcd66be") version("1.04", sha256="67e271c55900fe7889584f911daa946e177bb60c8af44c32f4584b87766af3c4") depends_on("perl@5.6:", type=("build", "run", "test")) depends_on("perl-extutils-makemaker", type=("build", "test")) depends_on("perl-scalar-util", type=("build", "test")) + depends_on("perl-module-install", type="build", when="@:1.04") def setup_build_environment(self, env): env.prepend_path("PERL5LIB", self.stage.source_path) + + def url_for_version(self, version): + if self.spec.satisfies("@1.05:"): + return f"https://cpan.metacpan.org/authors/id/E/ET/ETHER/Task-Weaken-{version}.tar.gz" + else: + return ( + f"http://search.cpan.org/CPAN/authors/id/A/AD/ADAMK/Task-Weaken-{version}.tar.gz" + ) diff --git a/var/spack/repos/builtin/packages/perl-test-output/package.py b/var/spack/repos/builtin/packages/perl-test-output/package.py index b15dd67f543d50..69a8a470bc7379 100644 --- a/var/spack/repos/builtin/packages/perl-test-output/package.py +++ b/var/spack/repos/builtin/packages/perl-test-output/package.py @@ -14,6 +14,7 @@ class PerlTestOutput(PerlPackage): license("Artistic-2.0") + version("1.034", sha256="cc016f9c89d3a22f461cb88318f53b03645eaec4025d483ae3bd52a166af5f72") version("1.033", sha256="35f0a4ef2449fc78886b4c99e1c1d23f432c2fae98538a4489439eb17223bfc2") version("1.032", sha256="8b87e16b40199c9d62f07a821e1ff17a2701e42adffb281a649ed631823d5771") version("1.031", sha256="1bb5847f26bee90e71b0af2a9d3a5eec4e17a63aacaf18ce5215f350961c5bf7") diff --git a/var/spack/repos/builtin/packages/perl-timedate/package.py b/var/spack/repos/builtin/packages/perl-timedate/package.py index e85d8f3e1fe165..5cec10179b0c7b 100644 --- a/var/spack/repos/builtin/packages/perl-timedate/package.py +++ b/var/spack/repos/builtin/packages/perl-timedate/package.py @@ -16,6 +16,7 @@ class PerlTimedate(PerlPackage): license("GPL-1.0-or-later OR Artistic-1.0-Perl") + version("2.33", sha256="c0b69c4b039de6f501b0d9f13ec58c86b040c1f7e9b27ef249651c143d605eb2") version("2.30", sha256="75bd254871cb5853a6aa0403ac0be270cdd75c9d1b6639f18ecba63c15298e86") provides("perl-date-format@2.24") @@ -59,3 +60,9 @@ class PerlTimedate(PerlPackage): provides("perl-time-zone@2.24") depends_on("perl-extutils-makemaker", type="build") + + def url_for_version(self, version): + if self.spec.satisfies("@2.31:"): + return f"https://cpan.metacpan.org/authors/id/A/AT/ATOOMIC/TimeDate-{version}.tar.gz" + else: + return f"https://cpan.metacpan.org/authors/id/G/GB/GBARR/TimeDate-{version}.tar.gz" diff --git a/var/spack/repos/builtin/packages/petsc/package.py b/var/spack/repos/builtin/packages/petsc/package.py index af2d225246c950..876419cb85dcae 100644 --- a/var/spack/repos/builtin/packages/petsc/package.py +++ b/var/spack/repos/builtin/packages/petsc/package.py @@ -4,6 +4,8 @@ # SPDX-License-Identifier: (Apache-2.0 OR MIT) import os +import llnl.util.tty as tty + from spack.package import * @@ -21,6 +23,8 @@ class Petsc(Package, CudaPackage, ROCmPackage): tags = ["e4s"] version("main", branch="main") + version("3.22.0", sha256="2c03f7c0f7ad2649240d4989355cf7fb7f211b75156cd7d424e1d9dd7dfb290b") + version("3.21.6", sha256="cb2dc00742a89cf8acf9ff8aae189e6864e8b90f4997f087be6e54ff39c30d74") version("3.21.5", sha256="4eb1ec04c1a8988bd524f71f8d7d980dc1853d5be8791c0f19f3c09eef71fdd2") version("3.21.4", sha256="a9ae076d4617c7d84ce2bed37194022319c19f19b3930edf148b2bc8ecf2248d") version("3.21.3", sha256="6d9ceb99d84d275250c614192dad45955d4a7610e12d8292a07dc49403556d26") @@ -183,6 +187,16 @@ class Petsc(Package, CudaPackage, ROCmPackage): when="@3.20.0", sha256="ba327f8b2a0fa45209dfb7a4278f3e9a323965b5a668be204c1c77c17a963a7f", ) + patch( + "https://gitlab.com/petsc/petsc/-/commit/20d5ecbf88175ced320006c488dcefa2efb1e67f.diff", + when="@3.21 ^hip@6:", + sha256="2904ea20c71e2f21b8475513c3e5de7465e328e2485ae706b003aa79314e3e7c", + ) + patch( + "https://gitlab.com/petsc/petsc/-/commit/bdb83d9f3e3c55b3bd4c8732bfe2066c23f10f61.diff", + when="@3.21 ^hip@6:", + sha256="89cf2c9a01d4a3233c889dd98496a29bf43db1bc69195892f9e5405c537b87e3", + ) patch("hip-5.6.0-for-3.18.diff", when="@3.18:3.19 ^hipsparse@5.6.0") patch("hip-5.7-plus-for-3.18.diff", when="@3.18:3.19 ^hipsparse@5.7:") patch( @@ -253,6 +267,7 @@ def check_fortran_compiler(self): depends_on("hip", when="+rocm") with when("+rocm"): + depends_on("rocm-core") depends_on("hipblas") depends_on("hipsparse") depends_on("hipsolver") @@ -263,10 +278,11 @@ def check_fortran_compiler(self): depends_on("rocthrust") depends_on("rocprim") - # Build dependencies - depends_on("python@2.6:2.8,3.4:3.8", when="@:3.13", type="build") - depends_on("python@2.6:2.8,3.4:", when="@3.14:3.17", type="build") - depends_on("python@3.4:", when="@3.18:", type="build") + with default_args(type="build"): + depends_on("python@2.6:2.8,3.4:") + depends_on("python@3.4:", when="@3.18:") + depends_on("python@:3.8", when="@:3.13") + depends_on("python@:3.12", when="@:3.21") # import xdrlib # Other dependencies depends_on("metis@5:~int64+real64", when="@:3.7+metis~int64+double") @@ -602,7 +618,7 @@ def configure_options(self): hip_arch = spec.variants["amdgpu_target"].value options.append("--with-hip-arch={0}".format(hip_arch[0])) hip_pkgs = ["hipsparse", "hipblas", "hipsolver", "rocsparse", "rocsolver", "rocblas"] - hip_ipkgs = hip_pkgs + ["rocthrust", "rocprim"] + hip_ipkgs = hip_pkgs + ["rocthrust", "rocprim", "rocm-core"] hip_lpkgs = hip_pkgs if spec.satisfies("^rocrand@5.1:"): hip_ipkgs.extend(["rocrand"]) diff --git a/var/spack/repos/builtin/packages/pflotran/package.py b/var/spack/repos/builtin/packages/pflotran/package.py index 1396f9a783f924..8d5330406745c8 100644 --- a/var/spack/repos/builtin/packages/pflotran/package.py +++ b/var/spack/repos/builtin/packages/pflotran/package.py @@ -33,7 +33,7 @@ class Pflotran(AutotoolsPackage): depends_on("mpi") depends_on("hdf5@1.8.12:+mpi+fortran+hl") depends_on("petsc@main:+hdf5+metis", when="@develop") - depends_on("petsc@3.20:+hdf5+metis", when="@5.0.0") + depends_on("petsc@3.20:3.21+hdf5+metis", when="@5.0.0") depends_on("petsc@3.18:+hdf5+metis", when="@4.0.1") depends_on("petsc@3.16:+hdf5+metis", when="@3.0.2") diff --git a/var/spack/repos/builtin/packages/phist/package.py b/var/spack/repos/builtin/packages/phist/package.py index 34d704e3ce2cde..da926898e8c086 100644 --- a/var/spack/repos/builtin/packages/phist/package.py +++ b/var/spack/repos/builtin/packages/phist/package.py @@ -21,7 +21,7 @@ class Phist(CMakePackage): """ homepage = "https://bitbucket.org/essex/phist/" - url = "https://bitbucket.org/essex/phist/get/phist-1.11.2.tar.gz" + url = "https://bitbucket.org/essex/phist/get/phist-1.12.1.tar.gz" git = "https://bitbucket.org/essex/phist.git" maintainers("jthies") @@ -36,6 +36,9 @@ class Phist(CMakePackage): version("develop", branch="devel") version("master", branch="master") + # fixes for tpetra/ghost, clang/Intel-LLVM + version("1.12.1", sha256="6b8fe8a994bf6baf698aa691fc2cbecd62cc60219073e48bfe6fd954c0303b9f") + # compatible with trilinos@14: version("1.12.0", sha256="0f02e39b16d14cf7c47a3c468e788c7c0e71857eb1c0a4edb601e1e5b67e8668") @@ -140,6 +143,9 @@ class Phist(CMakePackage): description="generate Fortran 2003 bindings (requires Python3 and " "a Fortran compiler)", ) + # Build error with LLVM and recent Trilinos, fixed in phist-1.12.1 + conflicts("%clang", when="kernel_lib=tpetra @:1.12.0") + conflicts("%oneapi", when="kernel_lib=tpetra @:1.12.0") # Trilinos 14 had some tpetra/kokkos API changes that are reflected in the phist 1.12 tag conflicts("^trilinos@14:", when="@:1.11.2") # Build error with cray-libsci because they define macro 'I', workaround in phist-1.11.2 @@ -325,6 +331,7 @@ def check(self): @run_after("install") @on_package_attributes(run_tests=True) def test_install(self): + """run 'make test_install'""" # The build script of test_install expects the sources to be copied here: install_tree( join_path(self.stage.source_path, "exampleProjects"), diff --git a/var/spack/repos/builtin/packages/php/package.py b/var/spack/repos/builtin/packages/php/package.py index 9abe26f281e89f..6de2f97c2b891d 100644 --- a/var/spack/repos/builtin/packages/php/package.py +++ b/var/spack/repos/builtin/packages/php/package.py @@ -19,15 +19,32 @@ class Php(AutotoolsPackage): license("PHP-3.01") - version("7.4.1", sha256="4d9d7c5681bec3af38a935d033657dce09a9913498f8022d7ca163a7f2f493a7") - version("7.4.0", sha256="91d34b48025ab9789216df89e247b6904912eeeaeff38c300ef314bdda8920b0") - version("7.3.13", sha256="e68b8d9e659f2993eee912f05860e546fdc18e459f31cd2771f404df21285f0b") - version("7.3.12", sha256="d0672ea84c0ab184f636acff3230d376d89a2067d59a87a2f1842361ee1f97d6") - version("7.3.11", sha256="4d861b2f3bc640ded8b591ce87250161392a6244a3c84042da0c06fd8c500eb2") - version("7.2.26", sha256="da132a836cec8021c00f22952e6044d91628ee3d2ef92a95d65cf91bad810600") - version("7.2.25", sha256="049b2d291c45cb889d15fcd2bac6da7d15ca5d535d272d2f8879fb834bbf276e") - version("7.2.24", sha256="334c9915733f6a29e1462f64038b1b4b1b21cb18f4f5f980add86792b5550ab3") - version("7.1.33", sha256="f80a795a09328a9441bae4a8a60fa0d6d43ec5adc98f5aa5f51d06f4522c07fe") + version("8.3.12", sha256="d5d4e6ffc6d6b2f02a87c45741623e08045ec6509ade44a1033e0f8bbb374119") + version("7.4.33", sha256="dfbb2111160589054768a37086bda650a0041c89878449d078684d70d6a0e411") + with default_args(deprecated=True): + version("7.4.1", sha256="4d9d7c5681bec3af38a935d033657dce09a9913498f8022d7ca163a7f2f493a7") + version("7.4.0", sha256="91d34b48025ab9789216df89e247b6904912eeeaeff38c300ef314bdda8920b0") + version( + "7.3.13", sha256="e68b8d9e659f2993eee912f05860e546fdc18e459f31cd2771f404df21285f0b" + ) + version( + "7.3.12", sha256="d0672ea84c0ab184f636acff3230d376d89a2067d59a87a2f1842361ee1f97d6" + ) + version( + "7.3.11", sha256="4d861b2f3bc640ded8b591ce87250161392a6244a3c84042da0c06fd8c500eb2" + ) + version( + "7.2.26", sha256="da132a836cec8021c00f22952e6044d91628ee3d2ef92a95d65cf91bad810600" + ) + version( + "7.2.25", sha256="049b2d291c45cb889d15fcd2bac6da7d15ca5d535d272d2f8879fb834bbf276e" + ) + version( + "7.2.24", sha256="334c9915733f6a29e1462f64038b1b4b1b21cb18f4f5f980add86792b5550ab3" + ) + version( + "7.1.33", sha256="f80a795a09328a9441bae4a8a60fa0d6d43ec5adc98f5aa5f51d06f4522c07fe" + ) depends_on("c", type="build") # generated depends_on("cxx", type="build") # generated @@ -39,10 +56,13 @@ class Php(AutotoolsPackage): depends_on("pkgconfig", type="build") depends_on("bison", type="build") depends_on("re2c", type="build") + depends_on("bash", type="build") + depends_on("libiconv", when="@8:") depends_on("libxml2") depends_on("sqlite") - patch("sbang.patch") + patch("sbang-7.patch", when="@7") + patch("sbang-8.patch", when="@8") def patch(self): """ @@ -68,3 +88,8 @@ def patch(self): def autoreconf(self, spec, prefix): bash = which("bash") bash("./buildconf", "--force") + + @when("@8:") + def configure_args(self): + args = [f"--with-iconv={self.spec['libiconv'].prefix}"] + return args diff --git a/var/spack/repos/builtin/packages/php/sbang.patch b/var/spack/repos/builtin/packages/php/sbang-7.patch similarity index 100% rename from var/spack/repos/builtin/packages/php/sbang.patch rename to var/spack/repos/builtin/packages/php/sbang-7.patch diff --git a/var/spack/repos/builtin/packages/php/sbang-8.patch b/var/spack/repos/builtin/packages/php/sbang-8.patch new file mode 100644 index 00000000000000..c9afec864a3ba9 --- /dev/null +++ b/var/spack/repos/builtin/packages/php/sbang-8.patch @@ -0,0 +1,42 @@ +--- a/ext/phar/phar/pharcommand.inc.org ++++ b/ext/phar/phar/pharcommand.inc +@@ -68,6 +68,12 @@ class PharCommand extends CLICommand + 'inf' => ' Hash-bang line to start the archive (e.g. #!/usr/bin/php). The hash ' + .' mark itself \'#!\' and the newline character are optional.' + ), ++ 'z' => array( ++ 'typ' => 'any', ++ 'val' => NULL, ++ 'inf' => ' Hash-bang line to start the archive for spack. The hash ' ++ .' mark itself \'#!\' and the newline character are optional.' ++ ), + 'c' => array( + 'typ' => 'compalg', + 'val' => NULL, +@@ -467,7 +473,7 @@ class PharCommand extends CLICommand + */ + static function cli_cmd_arg_pack() + { +- $args = self::phar_args('abcFhilpsxy', 'pharnew'); ++ $args = self::phar_args('azbcFhilpsxy', 'pharnew'); + + $args[''] = array( + 'typ' => 'any', +@@ -572,6 +578,7 @@ class PharCommand extends CLICommand + } + + $alias = $this->args['a']['val']; ++ $spack_hb = $this->args['z']['val']; + $hashbang = $this->args['b']['val']; + $archive = $this->args['f']['val']; + $hash = $this->args['h']['val']; +@@ -583,6 +590,9 @@ class PharCommand extends CLICommand + $invregex = $this->args['x']['val']; + $input = $this->args['']['val']; + ++ if (isset($spack_hb)) { ++ $hashbang = "$spack_hb\n"; ++ } + $hash = self::phar_check_hash($hash, $privkey); + + $phar = new Phar($archive, 0, $alias); diff --git a/var/spack/repos/builtin/packages/pika/package.py b/var/spack/repos/builtin/packages/pika/package.py index 466212e1c69ccd..b67fc4c64cfde7 100644 --- a/var/spack/repos/builtin/packages/pika/package.py +++ b/var/spack/repos/builtin/packages/pika/package.py @@ -19,6 +19,7 @@ class Pika(CMakePackage, CudaPackage, ROCmPackage): license("BSL-1.0") + version("0.29.0", sha256="2c61079f52f3e135a8d0845a993e6e4fb64031fbee9b5cef0ead57efb6175e3c") version("0.28.0", sha256="a64ebac04135c0c8d392ddcd8d683fe02e2c0782abfe130754244d58f27ae6cf") version("0.27.0", sha256="4a58dc4014edc2074399e4a6ecfa244537c89ce1319b3e14ff3dfe617fb9f9e8") version("0.26.1", sha256="d7cc842238754019abdb536e22325e9a57186cd2ac8cc9c7140a5385f9d730f6") @@ -69,11 +70,12 @@ class Pika(CMakePackage, CudaPackage, ROCmPackage): description="Use the specified C++ standard when building", ) + mallocs = ("system", "jemalloc", "mimalloc", "tbbmalloc", "tcmalloc") variant( "malloc", default="mimalloc", description="Define which allocator will be linked in", - values=("system", "jemalloc", "mimalloc", "tbbmalloc", "tcmalloc"), + values=mallocs, ) default_generic_coroutines = True @@ -105,7 +107,6 @@ class Pika(CMakePackage, CudaPackage, ROCmPackage): ) # Build dependencies - depends_on("git", type="build") depends_on("cmake@3.18:", type="build") depends_on("cmake@3.22:", when="@0.8:", type="build") @@ -126,6 +127,8 @@ class Pika(CMakePackage, CudaPackage, ROCmPackage): # https://github.com/pika-org/pika/issues/686 conflicts("^fmt@10:", when="@:0.15 +cuda") conflicts("^fmt@10:", when="@:0.15 +rocm") + # https://github.com/pika-org/pika/pull/1074 + conflicts("^fmt@11:", when="@:0.23") depends_on("spdlog@1.9.2:", when="@0.25:") depends_on("hwloc@1.11.5:") # https://github.com/pika-org/pika/issues/1223 @@ -135,13 +138,20 @@ class Pika(CMakePackage, CudaPackage, ROCmPackage): depends_on("jemalloc", when="malloc=jemalloc") depends_on("mimalloc", when="malloc=mimalloc") depends_on("tbb", when="malloc=tbbmalloc") + for malloc in filter(lambda x: x != "system", mallocs): + conflicts("^apex +gperftools", when=f"+apex malloc={malloc}") + conflicts("^apex +jemalloc", when=f"+apex malloc={malloc}") depends_on("apex", when="+apex") depends_on("cuda@11:", when="+cuda") depends_on("hip@5.2:", when="@0.8: +rocm") + # https://github.com/pika-org/pika/issues/1238 + conflicts("%gcc@13:", when="+rocm") depends_on("hipblas", when="@:0.8 +rocm") depends_on("mpi", when="+mpi") - depends_on("stdexec", when="+stdexec") + with when("+stdexec"): + depends_on("stdexec") + depends_on("stdexec@24.09:", when="@0.29:") depends_on("rocblas", when="+rocm") depends_on("rocsolver", when="@0.5: +rocm") depends_on("tracy-client", when="+tracy") diff --git a/var/spack/repos/builtin/packages/plumed/package.py b/var/spack/repos/builtin/packages/plumed/package.py index ed5ba3db72d2a4..2c7fa8de66ea1f 100644 --- a/var/spack/repos/builtin/packages/plumed/package.py +++ b/var/spack/repos/builtin/packages/plumed/package.py @@ -32,6 +32,7 @@ class Plumed(AutotoolsPackage): version("master", branch="master") + version("2.9.2", sha256="301fbc958374f81d9b8c7a1eac73095f6dded52cce73ce33d64bdbebf51ac63d") version("2.9.1", sha256="e24563ad1eb657611918e0c978d9c5212340f128b4f1aa5efbd439a0b2e91b58") version("2.9.0", sha256="612d2387416b5f82dd8545709921440370e144fd46cef633654cf0ee43bac5f8") @@ -261,8 +262,8 @@ def filter_gslcblas(self): def patch(self): # Ensure Spack's wrappers are used to compile the Python interface env = ( - 'CXX={0} LDSHARED="{0} -pthread -shared" ' - 'LDCXXSHARED="{0} -pthread -shared"'.format(spack_cxx) + 'CC="{0}" LDSHARED="{0} -pthread -shared" ' + 'CXX="{1}" LDCXXSHARED="{1} -pthread -shared"'.format(spack_cc, spack_cxx) ) filter_file( "plumed_program_name=plumed", diff --git a/var/spack/repos/builtin/packages/pocl/package.py b/var/spack/repos/builtin/packages/pocl/package.py index 31fc0b3574cf92..9e6035a5e26b5f 100644 --- a/var/spack/repos/builtin/packages/pocl/package.py +++ b/var/spack/repos/builtin/packages/pocl/package.py @@ -21,7 +21,7 @@ class Pocl(CMakePackage): license("MIT") - version("master", branch="master") + version("main", branch="main") version("3.0", sha256="a3fd3889ef7854b90b8e4c7899c5de48b7494bf770e39fba5ad268a5cbcc719d") version("1.8", sha256="0f63377ae1826e16e90038fc8e7f65029be4ff6f9b059f6907174b5c0d1f8ab2") version("1.7", sha256="5f6bbc391ba144bc7becc3b90888b25468460d5aa6830f63a3b066137e7bfac3") @@ -47,7 +47,7 @@ class Pocl(CMakePackage): depends_on("cmake @2.8.12:", type="build") depends_on("hwloc") depends_on("hwloc@:1", when="@:1.1") - depends_on("libtool", type=("build", "link", "run")) + depends_on("libtool", type="link", when="@:1.3") # links against libltdl depends_on("pkgconfig", type="build") depends_on("llvm +clang") diff --git a/var/spack/repos/builtin/packages/podio/package.py b/var/spack/repos/builtin/packages/podio/package.py index a4c00ce226e560..8b76e75f998187 100644 --- a/var/spack/repos/builtin/packages/podio/package.py +++ b/var/spack/repos/builtin/packages/podio/package.py @@ -20,6 +20,7 @@ class Podio(CMakePackage): tags = ["hep", "key4hep"] version("master", branch="master") + version("1.1", sha256="2cb5040761f3da4383e1f126da25d68e99ecd8398e0ff12e7475a3745a7030a6") version("1.0.1", sha256="915531a2bcf638011bb6cc19715bbc46d846ec8b985555a1afdcd6abc017e21b") version("1.0", sha256="491f335e148708e387e90e955a6150e1fc2e01bf6b4980b65e257ab0619559a9") version("0.99", sha256="c823918a6ec1365d316e0a753feb9d492e28903141dd124a1be06efac7c1877a") diff --git a/var/spack/repos/builtin/packages/popt/package.py b/var/spack/repos/builtin/packages/popt/package.py index 037a0edd3c2677..97f6ed023a6b66 100644 --- a/var/spack/repos/builtin/packages/popt/package.py +++ b/var/spack/repos/builtin/packages/popt/package.py @@ -9,17 +9,24 @@ class Popt(AutotoolsPackage): """The popt library parses command line options.""" - homepage = "https://launchpad.net/popt" - url = "https://launchpad.net/popt/head/1.16/+download/popt-1.16.tar.gz" + homepage = "https://github.com/rpm-software-management/popt" + url = "https://ftp.osuosl.org/pub/rpm/popt/releases/popt-1.x/popt-1.19.tar.gz" license("MIT") + version("1.19", sha256="c25a4838fc8e4c1c8aacb8bd620edb3084a3d63bf8987fdad3ca2758c63240f9") version("1.16", sha256="e728ed296fe9f069a0e005003c3d6b2dde3d9cad453422a10d6558616d304cc8") - depends_on("c", type="build") # generated + depends_on("c", type="build") depends_on("iconv") + def url_for_version(self, version): + if self.spec.satisfies("@1.18:"): + return f"https://ftp.osuosl.org/pub/rpm/popt/releases/popt-{version.up_to(1)}.x/popt-{version}.tar.gz" + else: + return f"https://launchpad.net/popt/head/{version}/+download/popt-{version}.tar.gz" + def patch(self): # Remove flags not recognized by the NVIDIA compilers if self.spec.satisfies("%nvhpc@:20.11"): diff --git a/var/spack/repos/builtin/packages/postgresql/package.py b/var/spack/repos/builtin/packages/postgresql/package.py index 1356f75fc7c90d..81a3c43e2f06e6 100644 --- a/var/spack/repos/builtin/packages/postgresql/package.py +++ b/var/spack/repos/builtin/packages/postgresql/package.py @@ -21,12 +21,17 @@ class Postgresql(AutotoolsPackage): license("PostgreSQL") + version("16.4", sha256="971766d645aa73e93b9ef4e3be44201b4f45b5477095b049125403f9f3386d6f") version("16.3", sha256="331963d5d3dc4caf4216a049fa40b66d6bcb8c730615859411b9518764e60585") + version("15.8", sha256="4403515f9a69eeb3efebc98f30b8c696122bfdf895e92b3b23f5b8e769edcb6a") version("15.2", sha256="99a2171fc3d6b5b5f56b757a7a3cb85d509a38e4273805def23941ed2b8468c7") version("15.1", sha256="64fdf23d734afad0dfe4077daca96ac51dcd697e68ae2d3d4ca6c45cb14e21ae") + version("14.13", sha256="59aa3c4b495ab26a9ec69f3ad0a0228c51f0fe6facf3634dfad4d1197d613a56") version("14.5", sha256="d4f72cb5fb857c9a9f75ec8cf091a1771272802f2178f0b2e65b7b6ff64f4a30") version("14.0", sha256="ee2ad79126a7375e9102c4db77c4acae6ae6ffe3e082403b88826d96d927a122") + version("13.16", sha256="c9cbbb6129f02328204828066bb3785c00a85c8ca8fd329c2a8a53c1f5cd8865") version("13.1", sha256="12345c83b89aa29808568977f5200d6da00f88a035517f925293355432ffe61f") + version("12.20", sha256="2d543af3009fec7fd5af35f7a70c95085d3eef6b508e517aa9493e99b15e9ea9") version("12.2", sha256="ad1dcc4c4fc500786b745635a9e1eba950195ce20b8913f50345bb7d5369b5de") version("11.2", sha256="2676b9ce09c21978032070b6794696e0aa5a476e3d21d60afc036dc0a9c09405") version("11.1", sha256="90815e812874831e9a4bf6e1136bf73bc2c5a0464ef142e2dfea40cda206db08") @@ -58,10 +63,12 @@ class Postgresql(AutotoolsPackage): variant("tcl", default=False, description="Enable Tcl bindings.") variant("gssapi", default=False, description="Build with GSSAPI functionality.") variant("xml", default=False, description="Build with XML support.") + variant("icu", default=True, description="Build with ICU support.", when="@16:") depends_on("c", type="build") depends_on("cxx", when="~client_only", type="build") + depends_on("icu4c", when="@16: +icu") depends_on("readline", when="lineedit=readline") depends_on("libedit", when="lineedit=libedit") depends_on("openssl") @@ -100,6 +107,9 @@ def configure_args(self): if spec.satisfies("+xml"): args.append("--with-libxml") + if spec.satisfies("~icu"): + args.append("--without-icu") + return args def install(self, spec, prefix): diff --git a/var/spack/repos/builtin/packages/protobuf/package.py b/var/spack/repos/builtin/packages/protobuf/package.py index 686243790e69e9..59506daa8d995f 100644 --- a/var/spack/repos/builtin/packages/protobuf/package.py +++ b/var/spack/repos/builtin/packages/protobuf/package.py @@ -17,6 +17,9 @@ class Protobuf(CMakePackage): license("BSD-3-Clause") + version("3.28.2", sha256="1b6b6a7a7894f509f099c4469b5d4df525c2f3c9e4009e5b2db5b0f66cb8ee0e") + version("3.27.5", sha256="a4aa92d0a207298149bf553d9a3192f3562eb91740086f50fa52331e60fa480c") + version("3.26.1", sha256="f3c0830339eaa5036eba8ff8ce7fca5aa3088f7d616f7c3713d946f611ae92bf") version("3.25.3", sha256="da82be8acc5347c7918ef806ebbb621b24988f7e1a19b32cd7fc73bc29b59186") version("3.25.1", sha256="1a2affa2fbad568b9895b72e3c7cb1f72a14bf2501fba056c724dc68c249cd0f") version("3.25.0", sha256="540200ef1bb101cf3f86f257f7947035313e4e485eea1f7eed9bc99dd0e2cb68") @@ -81,8 +84,8 @@ class Protobuf(CMakePackage): version("3.1.0", sha256="fb2a314f4be897491bb2446697be693d489af645cb0e165a85e7e64e07eb134d") version("3.0.2", sha256="a0a265bcc9d4e98c87416e59c33afc37cede9fb277292523739417e449b18c1e") - depends_on("c", type="build") # generated - depends_on("cxx", type="build") # generated + depends_on("c", type="build") + depends_on("cxx", type="build") variant("shared", default=True, description="Enables the build of shared libraries") variant( @@ -133,6 +136,22 @@ class Protobuf(CMakePackage): patch("msvc-abseil-target-namespace.patch", when="@3.22 %msvc") + # Misisng #include "absl/container/internal/layout.h" + # See https://github.com/protocolbuffers/protobuf/pull/14042 + patch( + "https://github.com/protocolbuffers/protobuf/commit/e052928c94f5a9a6a6cbdb82e09ab4ee92b7815f.patch?full_index=1", + when="@3.22:3.24.3 ^abseil-cpp@20240116:", + sha256="20e3cc99a9513b256e219653abe1bfc7d6b6a5413e269676e3d442830f99a1af", + ) + + # Missing #include "absl/strings/str_cat.h" + # See https://github.com/protocolbuffers/protobuf/pull/14054 + patch( + "https://github.com/protocolbuffers/protobuf/commit/38a24729ec94e6576a1425951c898ad0b91ad2d2.patch?full_index=1", + when="@3.22:3.24.3 ^abseil-cpp@20240116:", + sha256="c061356db31cdce29c8cdd98a3a8219ef048ebc2318d0dec26c1f2c5e5dae29b", + ) + def fetch_remote_versions(self, *args, **kwargs): """Ignore additional source artifacts uploaded with releases, only keep known versions diff --git a/var/spack/repos/builtin/packages/pthreadpool/package.py b/var/spack/repos/builtin/packages/pthreadpool/package.py index 55492f80b51f0f..20a47589b3c7b3 100644 --- a/var/spack/repos/builtin/packages/pthreadpool/package.py +++ b/var/spack/repos/builtin/packages/pthreadpool/package.py @@ -67,4 +67,5 @@ def cmake_args(self): self.define("PTHREADPOOL_BUILD_BENCHMARKS", False), self.define("PTHREADPOOL_LIBRARY_TYPE", "shared"), self.define("PTHREADPOOL_ALLOW_DEPRECATED_API", True), + self.define("CMAKE_POSITION_INDEPENDENT_CODE", True), ] diff --git a/var/spack/repos/builtin/packages/pulseaudio/package.py b/var/spack/repos/builtin/packages/pulseaudio/package.py index 8a3396c520e703..81e6db06b456ff 100644 --- a/var/spack/repos/builtin/packages/pulseaudio/package.py +++ b/var/spack/repos/builtin/packages/pulseaudio/package.py @@ -44,7 +44,7 @@ class Pulseaudio(AutotoolsPackage): depends_on("libcap") depends_on("iconv") depends_on("libsndfile@1.0.18:") - depends_on("libtool@2.4:") # links to libltdl.so + depends_on("libtool@2.4:", type="link") # links to libltdl.so depends_on("libsm", when="+x11") depends_on("uuid", when="+x11") depends_on("libx11", when="+x11") diff --git a/var/spack/repos/builtin/packages/py-altair/package.py b/var/spack/repos/builtin/packages/py-altair/package.py index af10abc209a286..4fcccc48164871 100644 --- a/var/spack/repos/builtin/packages/py-altair/package.py +++ b/var/spack/repos/builtin/packages/py-altair/package.py @@ -9,10 +9,11 @@ class PyAltair(PythonPackage): """Declarative statistical visualization library for Python""" - pypi = "altair/altair-5.2.0.tar.gz" + pypi = "altair/altair-5.4.1.tar.gz" license("BSD-3-Clause") + version("5.4.1", sha256="0ce8c2e66546cb327e5f2d7572ec0e7c6feece816203215613962f0ec1d76a82") version("5.2.0", sha256="2ad7f0c8010ebbc46319cc30febfb8e59ccf84969a201541c207bc3a4fa6cf81") version("5.1.2", sha256="e5f52a71853a607c61ce93ad4a414b3d486cd0d46ac597a24ae8bd1ac99dd460") version("5.1.1", sha256="ad6cd6983c8db69a34dd68e42653f6172b7fc3775b7190005107f1b4fc60d64d") @@ -23,6 +24,10 @@ class PyAltair(PythonPackage): version("4.2.1", sha256="4939fd9119c57476bf305af9ca0bd1aa7779b2450b874d3623660e879d0fcad1") version("4.2.0", sha256="d87d9372e63b48cd96b2a6415f0cf9457f50162ab79dc7a31cd7e024dd840026") + variant("pandas", default=True, description="Enable pandas support") + + conflicts("~pandas", when="@:5.3.0") + depends_on("python@3.7:", type=("build", "run")) depends_on("py-setuptools@40.6:", type="build", when="@:4") depends_on("py-entrypoints", type=("build", "run"), when="@2.0.0:4") @@ -30,11 +35,15 @@ class PyAltair(PythonPackage): depends_on("py-hatchling", type=("build"), when="@5.0.0:") depends_on("py-importlib-metadata", type=("build", "run"), when="@5.0.0:5.0") - depends_on("py-typing-extensions@4.0.1:", type=("build", "run"), when="@5.0.0: ^python@:3.10") + depends_on( + "py-typing-extensions@4.0.1:", type=("build", "run"), when="@5.0.0:5.3.0 ^python@:3.10" + ) + depends_on("py-typing-extensions@4.10.0:", type=("build", "run"), when="@5.4.0: ^python@:3.13") depends_on("py-jinja2", type=("build", "run")) depends_on("py-jsonschema@3.0.0:", type=("build", "run")) - depends_on("py-numpy", type=("build", "run")) - depends_on("py-pandas@0.18:", type=("build", "run")) - depends_on("py-pandas@0.25:", type=("build", "run"), when="@5.1.0:") - depends_on("py-toolz", type=("build", "run")) + depends_on("py-numpy", type=("build", "run"), when="+pandas") + depends_on("py-pandas@0.18:", type=("build", "run"), when="+pandas") + depends_on("py-pandas@0.25:", type=("build", "run"), when="@5.1.0:+pandas") + depends_on("py-toolz", type=("build", "run"), when="@:5.3.0") depends_on("py-packaging", type=("build", "run"), when="@5.1.0:") + depends_on("py-narwhals@1.5.2:", type=("build", "run"), when="@5.4.0:") diff --git a/var/spack/repos/builtin/packages/py-amrex/package.py b/var/spack/repos/builtin/packages/py-amrex/package.py index 0aed56737352d4..60f8687445d9b6 100644 --- a/var/spack/repos/builtin/packages/py-amrex/package.py +++ b/var/spack/repos/builtin/packages/py-amrex/package.py @@ -11,7 +11,7 @@ class PyAmrex(CMakePackage, PythonExtension, CudaPackage, ROCmPackage): """AMReX Python Bindings with pybind11""" homepage = "https://amrex-codes.github.io/amrex/" - url = "https://github.com/AMReX-Codes/pyamrex/archive/refs/tags/24.08.tar.gz" + url = "https://github.com/AMReX-Codes/pyamrex/archive/refs/tags/24.10.tar.gz" git = "https://github.com/AMReX-Codes/pyamrex.git" maintainers("ax3l", "RTSandberg", "sayerhs", "WeiqunZhang") @@ -19,7 +19,12 @@ class PyAmrex(CMakePackage, PythonExtension, CudaPackage, ROCmPackage): license("BSD-3-Clause-LBNL") version("develop", branch="development") - version("24.08", sha256="e7179d88261f64744f392a2194ff2744fe323fe0e21d0742ba60458709a1b47e") + version("24.10", sha256="dc1752ed3fbd5113dcfdbddcfe6c3c458e572b288ac9d41ed3ed7db130591d74") + version( + "24.08", + sha256="e7179d88261f64744f392a2194ff2744fe323fe0e21d0742ba60458709a1b47e", + deprecated=True, + ) version( "24.04", sha256="ab85695bb9644b702d0fc84e77205d264d27ba94999cab912c8a3212a7eb77fc", @@ -32,7 +37,7 @@ class PyAmrex(CMakePackage, PythonExtension, CudaPackage, ROCmPackage): deprecated=True, ) - for v in ["24.08", "24.04", "24.03"]: + for v in ["24.10", "24.08", "24.04", "24.03"]: depends_on("amrex@{0}".format(v), when="@{0}".format(v), type=("build", "link")) variant( @@ -60,10 +65,11 @@ class PyAmrex(CMakePackage, PythonExtension, CudaPackage, ROCmPackage): depends_on("cxx", type="build") - depends_on("cmake@3.20:", type="build") + depends_on("cmake@3.20:3", type="build", when="@:24.08") + depends_on("cmake@3.24:3", type="build", when="@24.09:") depends_on("python@3.8:", type=("build", "run")) depends_on("py-mpi4py@2.1.0:", type=("build", "run"), when="+mpi") - depends_on("py-numpy@1.15.0:1", type=("build", "run")) + depends_on("py-numpy@1.15:", type=("build", "run")) depends_on("py-packaging@23:", type="build") depends_on("py-pip@23:", type="build") depends_on("py-setuptools@42:", type="build") diff --git a/var/spack/repos/builtin/packages/py-annotated-types/package.py b/var/spack/repos/builtin/packages/py-annotated-types/package.py new file mode 100644 index 00000000000000..f368a9c90c0df1 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-annotated-types/package.py @@ -0,0 +1,20 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyAnnotatedTypes(PythonPackage): + """Reusable constraint types to use with typing.Annotated.""" + + homepage = "https://github.com/annotated-types/annotated-types" + pypi = "annotated_types/annotated_types-0.7.0.tar.gz" + + license("MIT", checked_by="wdconinc") + + version("0.7.0", sha256="aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89") + + depends_on("py-hatchling", type="build") + depends_on("py-typing-extensions@4.0.0:", when="^python@:3.8", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-arch/package.py b/var/spack/repos/builtin/packages/py-arch/package.py new file mode 100644 index 00000000000000..c752127384deb4 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-arch/package.py @@ -0,0 +1,45 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyArch(PythonPackage): + """Autoregressive Conditional Heteroskedasticity (ARCH) and other tools + for financial econometrics, written in Python (with Cython and/or Numba + used to improve performance)""" + + homepage = "https://pypi.org/project/arch" + pypi = "arch/arch-7.0.0.tar.gz" + git = "https://github.com/bashtage/arch.git" + + maintainers("climbfuji") + + license("NCSA", checked_by="climbfuji") + + version("7.0.0", sha256="353c0dba5242287b8b6b587a70250d788436630bf3b7ef6106f577e45d1ec247") + + variant("numba", default=False, description="Enable numba backend") + variant("tutorial", default=True, description="Include dependencies for online tutorials") + + depends_on("python@3.9:", type=("build", "run")) + depends_on("py-setuptools@0.61:", type="build") + depends_on("py-setuptools-scm@8.0.3:8 +toml", type="build") + depends_on("py-cython@3.0.10:", type="build") + # https://github.com/bashtage/arch/blob/9ced09e2566c0ebcad962d2441b1e79e2aaa7c9f/pyproject.toml#L59 + # "numpy>=2.0.0rc1,<3" ??? + # https://github.com/bashtage/arch/blob/9ced09e2566c0ebcad962d2441b1e79e2aaa7c9f/requirements.txt#L1 + # numpy>=1.22.3 ??? + depends_on("py-numpy@1.22.3", type=("build", "run")) + + depends_on("py-scipy@1.8:", type="run") + depends_on("py-pandas@1.4:", type="run") + depends_on("py-statsmodels@0.12:", type="run") + depends_on("py-matplotlib@3:", type="run") + depends_on("py-numba@0.49:", type="run", when="+numba") + + # Note. py-arch does not depend on py-pandas-datareader, + # but all examples in the py-arch documentation use it. + depends_on("py-pandas-datareader@0.10:", type="run", when="+tutorial") diff --git a/var/spack/repos/builtin/packages/py-argcomplete/package.py b/var/spack/repos/builtin/packages/py-argcomplete/package.py index e1b2a57c5ff87e..1340b9b48d82c7 100644 --- a/var/spack/repos/builtin/packages/py-argcomplete/package.py +++ b/var/spack/repos/builtin/packages/py-argcomplete/package.py @@ -12,6 +12,8 @@ class PyArgcomplete(PythonPackage): homepage = "https://github.com/kislyuk/argcomplete" pypi = "argcomplete/argcomplete-1.12.0.tar.gz" + version("3.5.0", sha256="4349400469dccfb7950bb60334a680c58d88699bff6159df61251878dc6bf74b") + version("3.1.6", sha256="3b1f07d133332547a53c79437527c00be48cca3807b1d4ca5cab1b26313386a6") version("3.1.2", sha256="d5d1e5efd41435260b8f85673b74ea2e883affcbec9f4230c582689e8e78251b") version("3.0.8", sha256="b9ca96448e14fa459d7450a4ab5a22bbf9cee4ba7adddf03e65c398b5daeea28") version("2.0.0", sha256="6372ad78c89d662035101418ae253668445b391755cfe94ea52f1b9d22425b20") diff --git a/var/spack/repos/builtin/packages/py-asgiref/package.py b/var/spack/repos/builtin/packages/py-asgiref/package.py index 1d2aa90d53756f..cc595f34185ce6 100644 --- a/var/spack/repos/builtin/packages/py-asgiref/package.py +++ b/var/spack/repos/builtin/packages/py-asgiref/package.py @@ -14,6 +14,7 @@ class PyAsgiref(PythonPackage): license("BSD-3-Clause") + version("3.8.1", sha256="c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590") version("3.7.2", sha256="9e0ce3aa93a819ba5b45120216b23878cf6e8525eb3848653452b4192b92afed") version("3.5.2", sha256="4a29362a6acebe09bf1d6640db38c1dc3d9217c68e6f9f6204d72667fc19a424") version("3.5.0", sha256="2f8abc20f7248433085eda803936d98992f1343ddb022065779f37c5da0181d0") diff --git a/var/spack/repos/builtin/packages/py-awkward-cpp/package.py b/var/spack/repos/builtin/packages/py-awkward-cpp/package.py index ba43f7a3375a79..cc149dd981e81f 100644 --- a/var/spack/repos/builtin/packages/py-awkward-cpp/package.py +++ b/var/spack/repos/builtin/packages/py-awkward-cpp/package.py @@ -18,6 +18,7 @@ class PyAwkwardCpp(PythonPackage): license("BSD-3-Clause") + version("35", sha256="1f8b112a597bd2438794e1a721a63aa61869fa9598a17ac6bd811ad6f6400d06") version("12", sha256="429f7fcc37a671afa67fe9680f2edc3a123d1c74d399e5889c654f9529f9f8f2") version("11", sha256="02d719a4da7487564b29b8e8b78925a32ac818b6f5572c2f55912b4e0e59c7a4") version("10", sha256="d1c856cb6ef5cf3d4f67506a7efc59239f595635865cc9f4ab18440b8bfb11c6") @@ -33,10 +34,15 @@ class PyAwkwardCpp(PythonPackage): depends_on("cxx", type="build") # generated depends_on("python@3.7:", type=("build", "run")) + depends_on("python@3.8:", type=("build", "run"), when="@19:") depends_on("py-scikit-build-core@0.2.0:+pyproject", when="@11:", type="build") depends_on("py-pybind11", type=("build", "link")) depends_on("py-numpy@1.17.0:", when="@12:", type=("build", "run")) + depends_on("py-numpy@1.18.0:", when="@19:", type=("build", "run")) # older versions depends_on("py-numpy@1.14.5:", when="@:11", type=("build", "run")) depends_on("py-scikit-build-core@0.1.3:+pyproject", when="@:9", type="build") + + # https://github.com/scikit-hep/awkward/issues/3132#issuecomment-2136042870 + conflicts("%gcc@14:", when="@:33") diff --git a/var/spack/repos/builtin/packages/py-awkward/package.py b/var/spack/repos/builtin/packages/py-awkward/package.py index eac61100ab0afa..218c67b60a783d 100644 --- a/var/spack/repos/builtin/packages/py-awkward/package.py +++ b/var/spack/repos/builtin/packages/py-awkward/package.py @@ -18,6 +18,7 @@ class PyAwkward(PythonPackage): license("BSD-3-Clause") version("main", branch="main") + version("2.6.6", sha256="6eeb426ca41b51fe3c36fbe767b90259979b08c14e3562497a71195a447c8b3c") version("2.1.1", sha256="fda8e1634161b8b46b151c074ff0fc631fc0feaec2ec277c4b40a2095110b0dd") version("2.1.0", sha256="73f7a76a1fb43e2557befee54b1381f3e6d90636983cdc54da1c2bcb9ad4c1a8") version("2.0.10", sha256="8dae67afe50f5cf1677b4062f9b29dc7e6893420d0af5a0649364b117a3502af") @@ -66,7 +67,8 @@ class PyAwkward(PythonPackage): ("@2.0.8", "@9"), ("@2.0.9", "@10"), ("@2.0.10", "@11"), - ("@2.1.0:", "@12"), + ("@2.1.0:2.1.1", "@12"), + ("@2.6.6:", "@35"), ] for _awkward, _awkward_cpp in _awkward_to_awkward_cpp_map: depends_on("py-awkward-cpp{}".format(_awkward_cpp), when=_awkward, type=("build", "run")) @@ -74,9 +76,11 @@ class PyAwkward(PythonPackage): depends_on("python@2.7:2.8,3.5:", type=("build", "run")) depends_on("python@3.6:", when="@1.9:", type=("build", "run")) depends_on("python@3.7:", when="@1.10:", type=("build", "run")) + depends_on("python@3.8:", when="@2.3:", type=("build", "run")) depends_on("py-numpy@1.13.1:", when="@:1", type=("build", "run")) depends_on("py-numpy@1.14.5:", when="@2.0", type=("build", "run")) depends_on("py-numpy@1.17.0:", when="@2.1:", type=("build", "run")) + depends_on("py-numpy@1.18.0:", when="@2.3:", type=("build", "run")) depends_on("py-pybind11", type=("build", "link")) depends_on("py-importlib-resources", when="@2: ^python@:3.8", type=("build", "run")) depends_on("py-typing-extensions@4.1:", when="@2: ^python@:3.10", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-beautifulsoup4/package.py b/var/spack/repos/builtin/packages/py-beautifulsoup4/package.py index acfea0d1541b3a..8f84102e139bbe 100644 --- a/var/spack/repos/builtin/packages/py-beautifulsoup4/package.py +++ b/var/spack/repos/builtin/packages/py-beautifulsoup4/package.py @@ -18,6 +18,7 @@ class PyBeautifulsoup4(PythonPackage): # Requires pytest skip_modules = ["bs4.tests"] + version("4.12.3", sha256="74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051") version("4.12.2", sha256="492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da") version("4.11.1", sha256="ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693") version("4.10.0", sha256="c23ad23c521d818955a4151a67d81580319d4bf548d3d49f4223ae041ff98891") diff --git a/var/spack/repos/builtin/packages/py-biotite/package.py b/var/spack/repos/builtin/packages/py-biotite/package.py new file mode 100644 index 00000000000000..4d78b7c4432a98 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-biotite/package.py @@ -0,0 +1,35 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyBiotite(PythonPackage): + """Biotite is your Swiss army knife for bioinformatics. \ + Whether you want to identify homologous sequence regions in a protein family or you would \ + like to find disulfide bonds in a protein structure: Biotite has the right tool for you. \ + This package bundles popular tasks in computational molecular biology into a uniform Python \ + library.""" + + homepage = "https://www.biotite-python.org/latest/" + pypi = "biotite/biotite-1.0.1.tar.gz" + + license("BSD-3-Clause") + + version("1.0.1", sha256="7012158431fd488c26d78d33032550eea1d7af7afd01b48549a7fd239f63dab5") + + depends_on("python@3.10:", type=("build", "run")) + + depends_on("py-hatch-vcs@0.3.0:", type="build") + depends_on("py-hatchling", type="build") + depends_on("py-hatch", type="build") + depends_on("py-hatch-cython@0.5", type="build") + depends_on("py-cython@3.0", type="build") + + depends_on("py-numpy@1.25:", type=("build", "run")) + depends_on("py-msgpack@0.5.6:", type=("build", "run")) + depends_on("py-biotraj@1:1", type=("build", "run")) + depends_on("py-requests@2.12:", type=("build", "run")) + depends_on("py-networkx@2.0:", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-biotraj/package.py b/var/spack/repos/builtin/packages/py-biotraj/package.py new file mode 100644 index 00000000000000..e6fd921b115a2d --- /dev/null +++ b/var/spack/repos/builtin/packages/py-biotraj/package.py @@ -0,0 +1,28 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyBiotraj(PythonPackage): + """Reading structures from trajectory files.""" + + homepage = "https://pypi.org/project/biotraj/" + pypi = "biotraj/biotraj-1.1.0.tar.gz" + + license("LGPL-2.1") + + version("1.2.1", sha256="4d7ad33ad940dbcfb3c2bd228a18f33f88e04657786a9562173b58dc2dd05349") + + depends_on("python@3.10:", type=("build", "run")) + + depends_on("py-setuptools@64:", type=("build", "run")) + + depends_on("py-setuptools-scm@8:", type=("build", "run")) + depends_on("py-wheel", type=("build", "run")) + depends_on("py-cython@3.0:", type=("build", "run")) + + depends_on("py-numpy@1.25:", when="@1.2.1", type=("build", "run")) + depends_on("py-scipy@1.13:", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-blosum/package.py b/var/spack/repos/builtin/packages/py-blosum/package.py new file mode 100644 index 00000000000000..79d175cec449e7 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-blosum/package.py @@ -0,0 +1,20 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyBlosum(PythonPackage): + """The BLOcks SUbstitution Matrices (BLOSUM) are used to score alignments between protein \ + sequences and are therefore mainly used in bioinformatics.""" + + homepage = "https://github.com/not-a-feature/blosum" + pypi = "blosum/blosum-2.0.3.tar.gz" + + license("GPL-3.0", checked_by="ashim-mahara") + + version("2.0.3", sha256="6fee68975c04211fc7c298f58cbf1e5b021ea2879e51456d934238e89ea2ae9b") + + depends_on("py-setuptools@42:", type="build") diff --git a/var/spack/repos/builtin/packages/py-carputils/package.py b/var/spack/repos/builtin/packages/py-carputils/package.py index 695e63bee1d8c6..00bfde67ce3916 100644 --- a/var/spack/repos/builtin/packages/py-carputils/package.py +++ b/var/spack/repos/builtin/packages/py-carputils/package.py @@ -19,6 +19,7 @@ class PyCarputils(PythonPackage): version("master", branch="master") # Version to use with openCARP releases + version("oc16.0", commit="c40783d884de5ad8ae1b5102b68013b28e14cbe4") version("oc15.0", commit="50e2580b3f75711388eb55982a9b43871c3201f3") version("oc13.0", commit="216c3802c2ac2d14c739164dcd57f2e59aa2ede3") version("oc12.0", commit="4d7a1f0c604a2ad232e70cf9aa3a8daff5ffb195") diff --git a/var/spack/repos/builtin/packages/py-cartopy/package.py b/var/spack/repos/builtin/packages/py-cartopy/package.py index a31c1c50194fab..836a28b78981d9 100644 --- a/var/spack/repos/builtin/packages/py-cartopy/package.py +++ b/var/spack/repos/builtin/packages/py-cartopy/package.py @@ -10,13 +10,14 @@ class PyCartopy(PythonPackage): """Cartopy - a cartographic python library with matplotlib support.""" homepage = "https://scitools.org.uk/cartopy/docs/latest/" - pypi = "Cartopy/Cartopy-0.20.2.tar.gz" - - maintainers("adamjstewart") + pypi = "Cartopy/cartopy-0.20.2.tar.gz" skip_modules = ["cartopy.tests"] license("LGPL-3.0-or-later") + maintainers("adamjstewart") + version("0.24.1", sha256="01c910d5634c69a7efdec46e0a17d473d2328767f001d4dc0b5c4b48e585c8bd") + version("0.24.0", sha256="e044e0e0fa76bb7afde937bec541743dcbf6b6f23b933a21ebddcd20cfffb755") version("0.23.0", sha256="231f37b35701f2ba31d94959cca75e6da04c2eea3a7f14ce1c75ee3b0eae7676") version("0.22.0", sha256="b300f90120931d43f11ef87c064ea1dacec1b59a4940aa76ebf82cf09548bb49") version("0.21.1", sha256="89d5649712c8582231c6e11825a04c85f6f0cee94dbb89e4db23eabca1cc250a") @@ -32,7 +33,7 @@ class PyCartopy(PythonPackage): version("0.17.0", sha256="424bd9e9ddef6e48cbdee694ce589ec431be8591f15b6cb93cb2b333a29b2c61") version("0.16.0", sha256="f23dffa101f43dd91e866a49ebb5f5048be2a24ab8a921a5c07edabde746d9a4") - depends_on("cxx", type="build") # generated + depends_on("cxx", type="build") variant("epsg", default=False, when="@:0.19", description="Add support for epsg.io") variant( @@ -44,7 +45,9 @@ class PyCartopy(PythonPackage): # Based on wheel availability on PyPI with default_args(type=("build", "link", "run")): - depends_on("python@3.9:3.12", when="@0.23:") + depends_on("python@3.10:3.13", when="@0.24.1:") + depends_on("python@3.10:3.12", when="@0.24.0") + depends_on("python@3.9:3.12", when="@0.23") depends_on("python@3.9:3.11", when="@0.22") depends_on("python@3.8:3.11", when="@0.21") depends_on("python@:3.11", when="@0.20") @@ -64,7 +67,8 @@ class PyCartopy(PythonPackage): depends_on("py-setuptools-scm", when="@0.19:") with default_args(type=("build", "link", "run")): - depends_on("py-numpy@1.21:", when="@0.22:") + depends_on("py-numpy@1.23:", when="@0.24:") + depends_on("py-numpy@1.21:", when="@0.22:0.23") depends_on("py-numpy@1.18:", when="@0.20:21") depends_on("py-numpy@1.13.3:", when="@0.19") depends_on("py-numpy@1.10:", when="@0.17:0.18") @@ -73,15 +77,18 @@ class PyCartopy(PythonPackage): depends_on("py-numpy@:1", when="@:0.22") with default_args(type=("build", "run")): + depends_on("py-matplotlib@3.6:", when="@0.24:") depends_on("py-matplotlib@3.5:", when="@0.23:") depends_on("py-matplotlib@3.4:", when="@0.22:") depends_on("py-matplotlib@3.1:", when="@0.21") # https://github.com/SciTools/cartopy/issues/2086 depends_on("py-matplotlib@3.1:3.5", when="@0.20") + depends_on("py-shapely@1.8:", when="@0.24:") depends_on("py-shapely@1.7:", when="@0.22:") depends_on("py-shapely@1.6.4:", when="@0.21.1:0.21") depends_on("py-shapely@1.6.4:1", when="@0.20:0.21.0") depends_on("py-shapely@1.5.6:1", when="@:0.19") + depends_on("py-packaging@21:", when="@0.24:") depends_on("py-packaging@20:", when="@0.22:") depends_on("py-pyshp@2.3:", when="@0.23:") depends_on("py-pyshp@2.1:", when="@0.20:") @@ -93,15 +100,19 @@ class PyCartopy(PythonPackage): with default_args(type="run"): with when("+ows"): + depends_on("py-owslib@0.27:", when="@0.24:") depends_on("py-owslib@0.20:", when="@0.22:") depends_on("py-owslib@0.18:", when="@0.20:") depends_on("py-owslib@0.8.11:") + depends_on("pil@9.1:", when="@0.24:") depends_on("pil@6.1:", when="@0.20:") depends_on("pil@1.7.8:") with when("+plotting"): + depends_on("pil@9.1:", when="@0.24:") depends_on("pil@6.1:", when="@0.20:") depends_on("pil@1.7.8:") + depends_on("py-scipy@1.9:", when="@0.24:") depends_on("py-scipy@1.3.1:", when="@0.20:") depends_on("py-scipy@0.10:") @@ -126,6 +137,14 @@ class PyCartopy(PythonPackage): patch("proj6.patch", when="@0.17.0") + def url_for_version(self, version): + url = "https://files.pythonhosted.org/packages/source/C/Cartopy/{}-{}.tar.gz" + if version >= Version("0.24"): + name = "cartopy" + else: + name = "Cartopy" + return url.format(name, version) + def setup_build_environment(self, env): # Needed for `spack install --test=root py-cartopy` library_dirs = [] diff --git a/var/spack/repos/builtin/packages/py-cffi/package.py b/var/spack/repos/builtin/packages/py-cffi/package.py index 677823af8e98a4..6f312fd942fdf1 100644 --- a/var/spack/repos/builtin/packages/py-cffi/package.py +++ b/var/spack/repos/builtin/packages/py-cffi/package.py @@ -16,6 +16,7 @@ class PyCffi(PythonPackage): license("MIT") + version("1.17.1", sha256="1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824") version("1.16.0", sha256="bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0") version("1.15.1", sha256="d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9") version("1.15.0", sha256="920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954") @@ -33,11 +34,29 @@ class PyCffi(PythonPackage): # setuptools before distutils, but only on Windows. This could be made # unconditional to support Python 3.12 depends_on("python@:3.11", type=("build", "run")) + + # python 3.12 support was released in @1.16:, however the removal + # in python3.12 of distutils has resulted in an imperfect fix for prefix-based + # tools like spack, see: + # https://github.com/spack/spack/pull/46224 + # https://github.com/cython/cython/pull/5754#issuecomment-1752102480 + # until this is correctly fixed, do not enable 3.12 support + # depends_on("python@:3.12", type=("build", "run"), when="@1.16:") + depends_on("pkgconfig", type="build") depends_on("py-setuptools", type="build") + depends_on("py-setuptools@66.1:", type="build", when="@1.16:") depends_on("py-pycparser", type=("build", "run")) depends_on("libffi") + # This patch enables allocate write+execute memory for ffi.callback() on macos + # https://github.com/conda-forge/cffi-feedstock/pull/47/files + patch( + "https://raw.githubusercontent.com/conda-forge/cffi-feedstock/refs/heads/main/recipe/0003-apple-api.patch", + when="@1.16: platform=darwin", + sha256="db836e67e2973ba7d3f4185b385fda49e2398281fc10362e5e413b75fdf93bf0", + ) + def flag_handler(self, name, flags): if self.spec.satisfies("%clang@13:"): if name in ["cflags", "cxxflags", "cppflags"]: diff --git a/var/spack/repos/builtin/packages/py-cftime/package.py b/var/spack/repos/builtin/packages/py-cftime/package.py index 7bc37434c1603e..7c343d92a3c44c 100644 --- a/var/spack/repos/builtin/packages/py-cftime/package.py +++ b/var/spack/repos/builtin/packages/py-cftime/package.py @@ -12,7 +12,7 @@ class PyCftime(PythonPackage): netCDF conventions""" homepage = "https://unidata.github.io/cftime/" - url = "https://github.com/Unidata/cftime/archive/v1.0.3.4rel.tar.gz" + url = "https://github.com/Unidata/cftime/archive/refs/tags/v1.0.3.4rel.tar.gz" version("1.0.3.4", sha256="f261ff8c65ceef4799784cd999b256d608c177d4c90b083553aceec3b6c23fd3") diff --git a/var/spack/repos/builtin/packages/py-cmocean/package.py b/var/spack/repos/builtin/packages/py-cmocean/package.py index c8b235ebbfbd9d..2d20f5d1dcf722 100644 --- a/var/spack/repos/builtin/packages/py-cmocean/package.py +++ b/var/spack/repos/builtin/packages/py-cmocean/package.py @@ -15,6 +15,7 @@ class PyCmocean(PythonPackage): license("MIT") + version("4.0.3", sha256="37868399fb5f41b4eac596e69803f9bfaea49946514dfb2e7f48886854250d7c") version("3.0.3", sha256="abaf99383c1a60f52970c86052ae6c14eafa84fc16984488040283c02db77c0b") version("2.0", sha256="13eea3c8994d8e303e32a2db0b3e686f6edfb41cb21e7b0e663c2b17eea9b03a") @@ -23,3 +24,6 @@ class PyCmocean(PythonPackage): depends_on("py-matplotlib", type=("build", "run")) depends_on("py-numpy", type=("build", "run")) depends_on("py-packaging", when="@3:", type=("build", "run")) + + # https://github.com/matplotlib/cmocean/pull/99 + conflicts("^py-numpy@2:", when="@:3.0") diff --git a/var/spack/repos/builtin/packages/py-codespell/package.py b/var/spack/repos/builtin/packages/py-codespell/package.py index a88d7b3c2d213a..fae9709c4cb7a8 100644 --- a/var/spack/repos/builtin/packages/py-codespell/package.py +++ b/var/spack/repos/builtin/packages/py-codespell/package.py @@ -15,6 +15,7 @@ class PyCodespell(PythonPackage): license("GPL-2.0", checked_by="cmelone") + version("2.3.0", sha256="360c7d10f75e65f67bad720af7007e1060a5d395670ec11a7ed1fed9dd17471f") version("2.2.6", sha256="a8c65d8eb3faa03deabab6b3bbe798bea72e1799c7e9e955d57eca4096abcff9") depends_on("py-setuptools@64.0:", type="build") diff --git a/var/spack/repos/builtin/packages/py-contourpy/package.py b/var/spack/repos/builtin/packages/py-contourpy/package.py index 963e3e1255fb69..b51d9b9cbf6908 100644 --- a/var/spack/repos/builtin/packages/py-contourpy/package.py +++ b/var/spack/repos/builtin/packages/py-contourpy/package.py @@ -14,17 +14,33 @@ class PyContourpy(PythonPackage): license("BSD-3-Clause") + version("1.3.0", sha256="7ffa0db17717a8ffb127efd0c95a4362d996b892c2904db72428d5b52e1938a4") version("1.0.7", sha256="d8165a088d31798b59e91117d1f5fc3df8168d8b48c4acc10fc0df0d0bdbcc5e") version("1.0.5", sha256="896631cd40222aef3697e4e51177d14c3709fda49d30983269d584f034acc8a4") - depends_on("cxx", type="build") # generated + depends_on("py-pybind11", type=("build", "link")) + depends_on("cxx", type="build") - depends_on("python@3.8:", when="@1.0.7:", type=("build", "link", "run")) - depends_on("python@3.7:", type=("build", "link", "run")) - depends_on("py-pybind11@2.6:", type=("build", "link")) - depends_on("py-setuptools@42:", type="build") - depends_on("py-numpy@1.16:", type=("build", "run")) - # https://github.com/numpy/numpy/issues/26191 - depends_on("py-numpy@:1", when="@:1.2.0", type=("build", "run")) + with default_args(type="build"): + depends_on("meson@1.2:") + depends_on("py-meson-python@0.13.1:") + with default_args(type=("build", "link")): + depends_on("py-pybind11@2.13.1:", when="@1.3:") + depends_on("py-pybind11@2.6:") + + # Historical dependencies + depends_on("py-setuptools@42:", when="@:1.0") + depends_on("py-build", when="@:1.0.5") + + with default_args(type=("build", "link", "run")): + depends_on("python@3.9:", when="@1.3:") + depends_on("python@3.8:", when="@1.0.7:") + depends_on("python@3.7:") - depends_on("py-build", when="@:1.0.5", type="build") + with default_args(type=("build", "run")): + depends_on("py-numpy@1.23:", when="@1.3:") + depends_on("py-numpy@1.16:") + + # https://github.com/numpy/numpy/issues/26191 + conflicts("py-numpy@2:", when="@:1.2.0") + conflicts("py-pybind11@2.13.3") diff --git a/var/spack/repos/builtin/packages/py-cookiecutter/package.py b/var/spack/repos/builtin/packages/py-cookiecutter/package.py index 75e0d3e29d65b5..52784443899625 100644 --- a/var/spack/repos/builtin/packages/py-cookiecutter/package.py +++ b/var/spack/repos/builtin/packages/py-cookiecutter/package.py @@ -16,14 +16,32 @@ class PyCookiecutter(PythonPackage): license("BSD-3-Clause") - version("1.6.0", sha256="0c9018699b556b83d7c37b27fe0cc17485b90b6e1f47365b3cdddf77f6ca9d36") + version("2.6.0", sha256="da014a94d85c1b1be14be214662982c8c90d860834cbf9ddb2391a37ad7d08be") + with default_args(deprecated=True): + # https://nvd.nist.gov/vuln/detail/CVE-2022-24065 + version("1.7.3", sha256="5c16f9e33875f49bb091ef836b71ced63372aadc49799d78315db1d91d17d76d") + version("1.6.0", sha256="0c9018699b556b83d7c37b27fe0cc17485b90b6e1f47365b3cdddf77f6ca9d36") depends_on("py-setuptools", type="build") - depends_on("py-future@0.15.2:", type=("build", "run")) depends_on("py-binaryornot@0.2.0:", type=("build", "run")) - depends_on("py-jinja2@2.7:", type=("build", "run")) + depends_on("py-binaryornot@0.4.4:", type=("build", "run"), when="@1.7.1:") + depends_on("py-jinja2@2.7:3", type=("build", "run")) depends_on("py-click@5.0:", type=("build", "run")) - depends_on("py-whichcraft@0.4.0:", type=("build", "run")) - depends_on("py-poyo@0.1.0:", type=("build", "run")) - depends_on("py-jinja2-time@0.1.0:", type=("build", "run")) + depends_on("py-click@7.0:", type=("build", "run"), when="@1.7:") + depends_on("py-click@:7", type=("build", "run"), when="@:2.0") + depends_on("py-click@:8", type=("build", "run"), when="@2.1:") + depends_on("py-pyyaml@5.3.1:", type=("build", "run"), when="@2:") + depends_on("py-python-slugify@4:", type=("build", "run"), when="@1.7.1:") depends_on("py-requests@2.18.0:", type=("build", "run")) + depends_on("py-requests@2.23.0:", type=("build", "run"), when="@1.7.1:") + depends_on("py-arrow", type=("build", "run"), when="@2.2:") + depends_on("py-rich", type=("build", "run"), when="@2.3:") + + # Historical dependencies + depends_on("py-future@0.15.2:", type=("build", "run"), when="@:1.7.0") + depends_on("py-whichcraft@0.4.0:", type=("build", "run"), when="@:1") + depends_on("py-poyo@0.1.0:", type=("build", "run"), when="@:1") + depends_on("py-poyo@0.5.0:", type=("build", "run"), when="@1.7.1:1") + depends_on("py-jinja2-time@0.1.0:", type=("build", "run"), when="@:2.1") + depends_on("py-jinja2-time@0.2.0:", type=("build", "run"), when="@1.7.1:2.1") + depends_on("py-six@1.10:", type=("build", "run"), when="@1.7.2:1") diff --git a/var/spack/repos/builtin/packages/py-cupy/package.py b/var/spack/repos/builtin/packages/py-cupy/package.py index 8865cb68060b32..1e54a36779f39b 100644 --- a/var/spack/repos/builtin/packages/py-cupy/package.py +++ b/var/spack/repos/builtin/packages/py-cupy/package.py @@ -53,7 +53,8 @@ class PyCupy(PythonPackage, CudaPackage, ROCmPackage): for a in CudaPackage.cuda_arch_values: depends_on("nccl +cuda cuda_arch={0}".format(a), when="+cuda cuda_arch={0}".format(a)) - depends_on("cudnn", when="+cuda") + depends_on("cudnn@8.8", when="@12.0.0: +cuda") + depends_on("cudnn@8.5", when="@11.2.0:11.6.0 +cuda") depends_on("cutensor", when="@:12.1.0 +cuda") depends_on("cutensor@2.0.1.2", when="@13.1: +cuda") diff --git a/var/spack/repos/builtin/packages/py-cython/package.py b/var/spack/repos/builtin/packages/py-cython/package.py index 182a3286a25e54..96d60cb7681905 100644 --- a/var/spack/repos/builtin/packages/py-cython/package.py +++ b/var/spack/repos/builtin/packages/py-cython/package.py @@ -15,6 +15,11 @@ class PyCython(PythonPackage): license("Apache-2.0") + version( + "3.0.11", + sha256="7146dd2af8682b4ca61331851e6aebce9fe5158e75300343f80c07ca80b1faff", + url="https://files.pythonhosted.org/packages/source/cython/cython-3.0.11.tar.gz", + ) version("3.0.10", sha256="dcc96739331fb854dcf503f94607576cfe8488066c61ca50dfd55836f132de99") version("3.0.8", sha256="8333423d8fd5765e7cceea3a9985dd1e0a5dfeb2734629e1a2ed2d6233d39de6") version("3.0.7", sha256="fb299acf3a578573c190c858d49e0cf9d75f4bc49c3f24c5a63804997ef09213") diff --git a/var/spack/repos/builtin/packages/py-dash-bootstrap-components/package.py b/var/spack/repos/builtin/packages/py-dash-bootstrap-components/package.py new file mode 100644 index 00000000000000..0872af0ee3f2e8 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-dash-bootstrap-components/package.py @@ -0,0 +1,22 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + + +from spack.package import * + + +class PyDashBootstrapComponents(PythonPackage): + """Bootstrap themed components for use in Plotly Dash""" + + homepage = "https://dash-bootstrap-components.opensource.faculty.ai/" + pypi = "dash_bootstrap_components/dash_bootstrap_components-1.6.0.tar.gz" + git = "https://github.com/facultyai/dash-bootstrap-components/" + + license("Apache-2.0") + + version("1.6.0", sha256="960a1ec9397574792f49a8241024fa3cecde0f5930c971a3fc81f016cbeb1095") + + depends_on("python@3.8:", type=("build", "run")) + depends_on("py-setuptools", type="build") diff --git a/var/spack/repos/builtin/packages/py-dash-svg/package.py b/var/spack/repos/builtin/packages/py-dash-svg/package.py new file mode 100644 index 00000000000000..c3e5cd7e8fba27 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-dash-svg/package.py @@ -0,0 +1,19 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyDashSvg(PythonPackage): + """SVG support library for Plotly/Dash""" + + homepage = "https://github.com/stevej2608/dash-svg" + pypi = "dash_svg/dash_svg-0.0.12.tar.gz" + + license("MIT") + + version("0.0.12", sha256="a7115bf437d770b822c2dd53b9d9a981210619b7d17c925cbee04905fc761b4e") + + depends_on("py-setuptools", type="build") diff --git a/var/spack/repos/builtin/packages/py-dash/package.py b/var/spack/repos/builtin/packages/py-dash/package.py new file mode 100644 index 00000000000000..b68ae73d5b542b --- /dev/null +++ b/var/spack/repos/builtin/packages/py-dash/package.py @@ -0,0 +1,26 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyDash(PythonPackage): + """Dash is the most downloaded, trusted Python framework + for building ML & data science web apps.""" + + homepage = "https://dash.plotly.com/" + pypi = "dash/dash-2.17.1.tar.gz" + git = "https://github.com/plotly/dash.git" + + license("MIT") + + version("2.17.1", sha256="ee2d9c319de5dcc1314085710b72cd5fa63ff994d913bf72979b7130daeea28e") + + depends_on("python@3.8:", type=("build", "run")) + depends_on("py-setuptools", type="build") + depends_on("py-typing-extensions") + depends_on("py-flask") + depends_on("py-plotly") + depends_on("py-importlib-metadata") diff --git a/var/spack/repos/builtin/packages/py-dirtyjson/package.py b/var/spack/repos/builtin/packages/py-dirtyjson/package.py new file mode 100644 index 00000000000000..369dc26a62fecf --- /dev/null +++ b/var/spack/repos/builtin/packages/py-dirtyjson/package.py @@ -0,0 +1,19 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyDirtyjson(PythonPackage): + """JSON decoder for Python that can extract data from the muck""" + + homepage = "https://github.com/codecobblers/dirtyjson" + pypi = "dirtyjson/dirtyjson-1.0.8.tar.gz" + + license("MIT or AFL-2.1", checked_by="qwertos") + + version("1.0.8", sha256="90ca4a18f3ff30ce849d100dcf4a003953c79d3a2348ef056f1d9c22231a25fd") + + depends_on("py-setuptools", type="build") diff --git a/var/spack/repos/builtin/packages/py-django/package.py b/var/spack/repos/builtin/packages/py-django/package.py index 75411a79673fae..6d2a8c2cbe45b8 100644 --- a/var/spack/repos/builtin/packages/py-django/package.py +++ b/var/spack/repos/builtin/packages/py-django/package.py @@ -12,8 +12,10 @@ class PyDjango(PythonPackage): homepage = "https://www.djangoproject.com/" pypi = "Django/Django-5.0.1.tar.gz" - license("BSD-3-Clause") + license("BSD-3-Clause", checked_by="wdconinc") + version("5.1.1", sha256="021ffb7fdab3d2d388bc8c7c2434eb9c1f6f4d09e6119010bbb1694dda286bc2") + version("5.0.9", sha256="6333870d342329b60174da3a60dbd302e533f3b0bb0971516750e974a99b5a39") version("5.0.1", sha256="8c8659665bc6e3a44fefe1ab0a291e5a3fb3979f9a8230be29de975e57e8f854") version("3.0.5", sha256="d4666c2edefa38c5ede0ec1655424c56dc47ceb04b6d8d62a7eac09db89545c1") version("3.0.4", sha256="50b781f6cbeb98f673aa76ed8e572a019a45e52bdd4ad09001072dfd91ab07c8") @@ -25,8 +27,10 @@ class PyDjango(PythonPackage): version("2.2.10", sha256="1226168be1b1c7efd0e66ee79b0e0b58b2caa7ed87717909cd8a57bb13a7079a") depends_on("python@3.10:", when="@5:", type=("build", "run")) - depends_on("py-setuptools@40.8:", when="@5:", type="build") + depends_on("py-setuptools@61:69.2", when="@5.1:", type="build") + depends_on("py-setuptools@40.8:", when="@5:5.0", type="build") depends_on("py-setuptools", type="build") + depends_on("py-asgiref@3.8.1:3", when="@5.1:", type=("build", "run")) depends_on("py-asgiref@3.7:3", when="@5:", type=("build", "run")) depends_on("py-asgiref", type=("build", "run")) depends_on("py-sqlparse@0.3.1:", when="@5:", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-dm-tree/package.py b/var/spack/repos/builtin/packages/py-dm-tree/package.py index f00909fe73881a..c44acd8e308bcd 100644 --- a/var/spack/repos/builtin/packages/py-dm-tree/package.py +++ b/var/spack/repos/builtin/packages/py-dm-tree/package.py @@ -23,13 +23,37 @@ class PyDmTree(PythonPackage): version("0.1.8", sha256="0fcaabbb14e7980377439e7140bd05552739ca5e515ecb3119f234acee4b9430") version("0.1.7", sha256="30fec8aca5b92823c0e796a2f33b875b4dccd470b57e91e6c542405c5f77fd2a") - version("0.1.6", sha256="6776404b23b4522c01012ffb314632aba092c9541577004ab153321e87da439a") - version("0.1.5", sha256="a951d2239111dfcc468071bc8ff792c7b1e3192cab5a3c94d33a8b2bda3127fa") + version( + "0.1.6", + sha256="6776404b23b4522c01012ffb314632aba092c9541577004ab153321e87da439a", + deprecated=True, + ) + version( + "0.1.5", + sha256="a951d2239111dfcc468071bc8ff792c7b1e3192cab5a3c94d33a8b2bda3127fa", + deprecated=True, + ) - depends_on("cxx", type="build") # generated + depends_on("cxx", type="build") + + # Based on PyPI wheel availability + depends_on("python@:3.12", when="@0.1.8:", type=("build", "run")) + depends_on("python@:3.10", when="@0.1.6:0.1.7", type=("build", "run")) + depends_on("python@:3.8", when="@0.1.5", type=("build", "run")) depends_on("py-setuptools", type="build") - depends_on("cmake", when="@0.1.7:", type="build") + depends_on("cmake@3.12:", when="@0.1.7:", type="build") + depends_on("py-pybind11@2.10.1:", when="@0.1.8:") + depends_on("abseil-cpp", when="@0.1.8:") + + patch( + "https://github.com/google-deepmind/tree/pull/73.patch?full_index=1", + sha256="77dbd895611d412da99a5afbf312c3c49984ad02bd0e56ad342b2002a87d789c", + when="@0.1.8", + ) + conflicts("%gcc@13:", when="@:0.1.7") + + # Historical dependencies depends_on("bazel@:5", when="@:0.1.6", type="build") depends_on("py-six@1.12.0:", when="@:0.1.6", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-dnspython/package.py b/var/spack/repos/builtin/packages/py-dnspython/package.py index 5b4dc076109842..e445071890fbca 100644 --- a/var/spack/repos/builtin/packages/py-dnspython/package.py +++ b/var/spack/repos/builtin/packages/py-dnspython/package.py @@ -15,7 +15,12 @@ class PyDnspython(PythonPackage): license("ISC") + version("2.6.1", sha256="e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc") version("2.2.1", sha256="0f7569a4a6ff151958b64304071d370daa3243d15941a7beedf0c9fe5105603e") - depends_on("python@3.6:3", type=("build", "run")) - depends_on("py-poetry-core", type="build") + depends_on("python@3.8:", type=("build", "run"), when="@2.5:") + depends_on("python@3.7:", type=("build", "run"), when="@2.4:") + depends_on("python@3.6:3", type=("build", "run"), when="@:2.3") + depends_on("py-poetry-core", type="build", when="@:2.3") + depends_on("py-hatchling@1.17:", type="build", when="@2.4:") + depends_on("py-hatchling@1.21:", type="build", when="@2.6:") diff --git a/var/spack/repos/builtin/packages/py-dogpile-cache/package.py b/var/spack/repos/builtin/packages/py-dogpile-cache/package.py new file mode 100644 index 00000000000000..1d14e0638cd391 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-dogpile-cache/package.py @@ -0,0 +1,25 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyDogpileCache(PythonPackage): + """dogpile.cache is a Python caching API which provides a generic + interface to caching backends of any variety.""" + + homepage = "https://dogpilecache.sqlalchemy.org/en/latest/" + pypi = "dogpile.cache/dogpile.cache-1.3.3.tar.gz" + + maintainers("wdconinc") + + license("MIT", checked_by="wdconinc") + + version("1.3.3", sha256="f84b8ed0b0fb297d151055447fa8dcaf7bae566d4dbdefecdcc1f37662ab588b") + + depends_on("py-setuptools@61.2:", type="build") + depends_on("py-decorator@4.0.0:", type=("build", "run")) + depends_on("py-stevedore@3.0.0:", type=("build", "run")) + depends_on("py-typing-extensions@4.0.1:", type=("build", "run"), when="^python@:3.10") diff --git a/var/spack/repos/builtin/packages/py-evodiff/package.py b/var/spack/repos/builtin/packages/py-evodiff/package.py new file mode 100644 index 00000000000000..814f40510a276e --- /dev/null +++ b/var/spack/repos/builtin/packages/py-evodiff/package.py @@ -0,0 +1,38 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyEvodiff(PythonPackage): + """Python package for generation of protein sequences and evolutionary alignments via \ + discrete diffusion models""" + + homepage = "https://github.com/microsoft/evodiff" + pypi = "evodiff/evodiff-1.1.0.tar.gz" + + license("MIT", checked_by="ashim-mahara") + + version("1.1.0", sha256="c1f2d7bd0e46ad244f1c55066caefc5ad9b1bcf4e836be1832311b8cd74e923f") + + depends_on("py-setuptools@61.0:", type=("build")) + + depends_on("py-pandas", type=("build", "run")) + depends_on("py-lmdb", type=("build", "run")) + depends_on("py-numpy", type=("build", "run")) + depends_on("py-sequence-models", type=("build", "run")) + depends_on("py-scikit-learn", type=("build", "run")) + depends_on("py-blosum", type=("build", "run")) + depends_on("py-seaborn", type=("build", "run")) + depends_on("py-matplotlib", type=("build", "run")) + depends_on("py-fair-esm", type=("build", "run")) + depends_on("py-tqdm", type=("build", "run")) + depends_on("py-biotite", type=("build", "run")) + depends_on("py-requests", type=("build", "run")) + depends_on("py-mdanalysis", type=("build", "run")) + depends_on("py-pdb-tools", type=("build", "run")) + + # listed in the file setup.py but is not used anywhere in the source code + # depends_on("py-mlflow", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-fair-esm/package.py b/var/spack/repos/builtin/packages/py-fair-esm/package.py new file mode 100644 index 00000000000000..a157ebbc0f0abc --- /dev/null +++ b/var/spack/repos/builtin/packages/py-fair-esm/package.py @@ -0,0 +1,30 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyFairEsm(PythonPackage): + """Evolutionary Scale Modeling""" + + homepage = "https://github.com/facebookresearch/esm" + pypi = "fair-esm/fair-esm-2.0.0.tar.gz" + + license("MIT") + + version("2.0.0", sha256="4ed34d4598ec75ed6550a4e581d023bf8d4a8375317ecba6269bb68135f80c85") + + depends_on("py-setuptools@59.5.0:", type=("build")) + + variant("esmfold", default=True, description="Enable dependencies for OpenFold") + depends_on("py-biopython@1.79:", when="+esmfold", type=("build", "run")) + + depends_on("py-deepspeed", type=("build", "run")) + depends_on("py-dm-tree", type=("build", "run")) + depends_on("py-pytorch-lightning", type=("build", "run")) + depends_on("py-omegaconf", type=("build", "run")) + depends_on("py-ml-collections", type=("build", "run")) + depends_on("py-einops", type=("build", "run")) + depends_on("py-scipy", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-falcon/package.py b/var/spack/repos/builtin/packages/py-falcon/package.py index c6475fd12b8b59..2383ae4bfee6c9 100644 --- a/var/spack/repos/builtin/packages/py-falcon/package.py +++ b/var/spack/repos/builtin/packages/py-falcon/package.py @@ -11,7 +11,7 @@ class PyFalcon(PythonPackage): building large-scale app backends and microservices.""" homepage = "https://github.com/falconry/falcon" - url = "https://github.com/falconry/falcon/archive/3.0.0a2.tar.gz" + url = "https://github.com/falconry/falcon/archive/refs/tags/3.0.0a2.tar.gz" license("Apache-2.0") diff --git a/var/spack/repos/builtin/packages/py-fenics-basix/package.py b/var/spack/repos/builtin/packages/py-fenics-basix/package.py index 02f42c149a8076..5752cffa2aea94 100644 --- a/var/spack/repos/builtin/packages/py-fenics-basix/package.py +++ b/var/spack/repos/builtin/packages/py-fenics-basix/package.py @@ -17,6 +17,7 @@ class PyFenicsBasix(PythonPackage): license("MIT") version("main", branch="main") + version("0.9.0", sha256="60e96b2393084729b261cb10370f0e44d12735ab3dbd1f15890dec23b9e85329") version("0.8.0", sha256="b299af82daf8fa3e4845e17f202491fe71b313bf6ab64c767a5287190b3dd7fe") version("0.7.0", sha256="9bee81b396ee452eec8d9735f278cb44cb6994c6bc30aec8ed9bb4b12d83fa7f") version("0.6.0", sha256="687ae53153c98facac4080dcdc7081701db1dcea8c5e7ae3feb72aec17f83304") @@ -24,12 +25,14 @@ class PyFenicsBasix(PythonPackage): depends_on("cxx", type="build") # generated depends_on("fenics-basix@main", type=("build", "run"), when="@main") + depends_on("fenics-basix@0.9.0", type=("build", "run"), when="@0.9.0") depends_on("fenics-basix@0.8.0", type=("build", "run"), when="@0.8.0") depends_on("fenics-basix@0.7.0", type=("build", "run"), when="@0.7.0") depends_on("fenics-basix@0.6.0", type=("build", "run"), when="@0.6.0") # See python/CMakeLists.txt - depends_on("cmake@3.19:", when="@0.8:", type="build") + depends_on("cmake@3.21:", when="@0.9:", type="build") + depends_on("cmake@3.19:", when="@0.8", type="build") depends_on("cmake@3.16:", when="@:0.7", type="build") # See python/pyproject.toml @@ -38,7 +41,9 @@ class PyFenicsBasix(PythonPackage): depends_on("py-numpy@1.21:", type=("build", "run")) depends_on("py-pybind11@2.9.1:", when="@:0.7", type="build") depends_on("py-setuptools@42:", when="@:0.7", type="build") - depends_on("py-nanobind@1.6.0:", when="@0.8:", type="build") - depends_on("py-scikit-build-core+pyproject@0.5.0:", when="@0.8:", type="build") + depends_on("py-nanobind@2:", when="@0.10:", type="build") + depends_on("py-nanobind@1.6.0:", when="@0.8:0.9", type="build") + depends_on("py-scikit-build-core+pyproject@0.10:", when="@0.10:", type="build") + depends_on("py-scikit-build-core+pyproject@0.5.0:", when="@0.8:0.9", type="build") build_directory = "python" diff --git a/var/spack/repos/builtin/packages/py-fenics-ffcx/package.py b/var/spack/repos/builtin/packages/py-fenics-ffcx/package.py index 00b7e04962283e..b696a0abb4cbf9 100644 --- a/var/spack/repos/builtin/packages/py-fenics-ffcx/package.py +++ b/var/spack/repos/builtin/packages/py-fenics-ffcx/package.py @@ -17,6 +17,7 @@ class PyFenicsFfcx(PythonPackage): license("LGPL-3.0-or-later") version("main", branch="main") + version("0.9.0", sha256="afa517272a3d2249f513cb711c50b77cf8368dd0b8f5ea4b759142229204a448") version("0.8.0", sha256="8a854782dbd119ec1c23c4522a2134d5281e7f1bd2f37d64489f75da055282e3") version("0.7.0", sha256="7f3c3ca91d63ce7831d37799cc19d0551bdcd275bdfa4c099711679533dd1c71") version("0.6.0", sha256="076fad61d406afffd41019ae1abf6da3f76406c035c772abad2156127667980e") @@ -29,16 +30,16 @@ class PyFenicsFfcx(PythonPackage): # CFFI is required at runtime for JIT support depends_on("py-cffi", type=("build", "run")) - # py-numpy>=1.21 required because FFCx uses NumPy typing (version - # requirement not properly set in the FFCx pyproject.toml file) depends_on("py-numpy@1.21:", type=("build", "run")) depends_on("py-fenics-ufl@main", type=("build", "run"), when="@main") + depends_on("py-fenics-ufl@2024.2.0:", type=("build", "run"), when="@0.9") depends_on("py-fenics-ufl@2024.1.0:", type=("build", "run"), when="@0.8") depends_on("py-fenics-ufl@2023.2.0", type=("build", "run"), when="@0.7") depends_on("py-fenics-ufl@2023.1", type=("build", "run"), when="@0.6") depends_on("py-fenics-basix@main", type=("build", "run"), when="@main") + depends_on("py-fenics-basix@0.9", type=("build", "run"), when="@0.9") depends_on("py-fenics-basix@0.8", type=("build", "run"), when="@0.8") depends_on("py-fenics-basix@0.7", type=("build", "run"), when="@0.7") depends_on("py-fenics-basix@0.6", type=("build", "run"), when="@0.6") diff --git a/var/spack/repos/builtin/packages/py-fenics-ufl/package.py b/var/spack/repos/builtin/packages/py-fenics-ufl/package.py index b4e8cfe937dae6..418b875ad3fbe0 100644 --- a/var/spack/repos/builtin/packages/py-fenics-ufl/package.py +++ b/var/spack/repos/builtin/packages/py-fenics-ufl/package.py @@ -21,6 +21,7 @@ class PyFenicsUfl(PythonPackage): license("LGPL-3.0-or-later") version("main", branch="main") + version("2024.2.0", sha256="d9353d23ccbdd9887f8d6edab74c04fe06d818da972072081dbf0c25bc86f5a7") version( "2024.1.0.post1", sha256="6e38e93a2c8417271c9fb316e0d0ea5fe1101c6a37b2496fff8290e7ea7ead74" ) diff --git a/var/spack/repos/builtin/packages/py-fiona/package.py b/var/spack/repos/builtin/packages/py-fiona/package.py index 04901bbc851a6b..6d59878ab5375b 100644 --- a/var/spack/repos/builtin/packages/py-fiona/package.py +++ b/var/spack/repos/builtin/packages/py-fiona/package.py @@ -18,6 +18,7 @@ class PyFiona(PythonPackage): license("BSD-3-Clause") version("master", branch="master") + version("1.10.1", sha256="b00ae357669460c6491caba29c2022ff0acfcbde86a95361ea8ff5cd14a86b68") version("1.10.0", sha256="3529fd46d269ff3f70aeb9316a93ae95cf2f87d7e148a8ff0d68532bf81ff7ae") version("1.9.6", sha256="791b3494f8b218c06ea56f892bd6ba893dfa23525347761d066fb7738acda3b1") version("1.9.5", sha256="99e2604332caa7692855c2ae6ed91e1fffdf9b59449aa8032dd18e070e59a2f7") diff --git a/var/spack/repos/builtin/packages/py-flash-attn/package.py b/var/spack/repos/builtin/packages/py-flash-attn/package.py index 692f5f71de1c61..8d4c043cf9c155 100644 --- a/var/spack/repos/builtin/packages/py-flash-attn/package.py +++ b/var/spack/repos/builtin/packages/py-flash-attn/package.py @@ -20,6 +20,7 @@ class PyFlashAttn(PythonPackage): license("BSD") version("main", branch="main") + version("2.6.3", sha256="5bfae9500ad8e7d2937ebccb4906f3bc464d1bf66eedd0e4adabd520811c7b52") version( "2.5.9.post1", sha256="a92db1683a5b141a0f4371d251ae9f73e9aef629b3a58a50d0ef430266c68782" ) @@ -33,18 +34,21 @@ class PyFlashAttn(PythonPackage): depends_on("cxx", type="build") # generated with default_args(type="build"): - depends_on("py-ninja") depends_on("py-packaging") depends_on("py-psutil") depends_on("py-setuptools") + depends_on("ninja") with default_args(type=("build", "run")): depends_on("py-torch+cuda") - depends_on("ninja") depends_on("py-einops") - depends_on("py-packaging") with default_args(type=("build", "link", "run")): depends_on("py-pybind11") - depends_on("python@3.7:", type=("build", "run")) + depends_on("python@3.7:", type=("build", "run"), when="@:2.5") + depends_on("python@3.8:", type=("build", "run"), when="@2.6:") + + def setup_build_environment(self, env): + # If oom error, try lowering the number of jobs with `spack install -j` + env.set("MAX_JOBS", make_jobs) diff --git a/var/spack/repos/builtin/packages/py-fluiddyn/package.py b/var/spack/repos/builtin/packages/py-fluiddyn/package.py new file mode 100644 index 00000000000000..af76b817057ca8 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-fluiddyn/package.py @@ -0,0 +1,42 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyFluiddyn(PythonPackage): + """Framework for studying fluid dynamics.""" + + pypi = "fluiddyn/fluiddyn-0.6.5.tar.gz" + + maintainers("paugier") + + license("CECILL-B", checked_by="paugier") + + version("0.6.5", sha256="ad0df4c05855bd2ae702731983d310bfbb13802874ce83e2da6454bb7100b5df") + version("0.6.4", sha256="576eb0fa50012552b3a68dd17e81ce4f08ddf1e276812b02316016bb1c3a1342") + version("0.6.3", sha256="3c4c57ac8e48c55498aeafaf8b26daecefc03e6ac6e2c03a591e0f7fec13bb69") + version("0.6.2", sha256="40f772cfdf111797ae1c6cf7b67272207f2bc7c4f599085634cc1d74eb748ee5") + version("0.6.1", sha256="af75ed3adfaaa0f0d82822619ced2f9e0611ad15351c9cdbc1d802d67249c3de") + version("0.6.0", sha256="47ad53b3723487d3711ec4ea16bca2d7c270b5c5c5a0255f7684558d7397850e") + + depends_on("python@3.9:", type=("build", "run")) + depends_on("py-pdm-backend", type="build") + + with default_args(type="run"): + depends_on("py-numpy") + depends_on("py-matplotlib") + depends_on("py-h5py") + depends_on("py-h5netcdf") + depends_on("py-distro") + depends_on("py-simpleeval@0.9.13:") + depends_on("py-psutil@5.2.1:") + depends_on("py-ipython") + depends_on("py-scipy") + + with default_args(type="test"): + depends_on("py-pytest") + depends_on("py-pytest-allclose") + depends_on("py-pytest-mock") diff --git a/var/spack/repos/builtin/packages/py-fluidfft-builder/package.py b/var/spack/repos/builtin/packages/py-fluidfft-builder/package.py new file mode 100644 index 00000000000000..76ec14428e5195 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-fluidfft-builder/package.py @@ -0,0 +1,21 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyFluidfftBuilder(PythonPackage): + """Fluidfft plugin dependencies""" + + pypi = "fluidfft-builder/fluidfft_builder-0.0.2.tar.gz" + + maintainers("paugier") + license("MIT", checked_by="paugier") + + version("0.0.2", sha256="c0af9ceca27ae3a00ccf2f160703be9e394d8b886b8a02653b6c0a12a4f54a90") + + depends_on("python@3.9:", type=("build", "run")) + depends_on("py-flit-core@3.2:3", type="build") + depends_on("py-cython@3.0:", type="run") diff --git a/var/spack/repos/builtin/packages/py-fluidfft-fftw/package.py b/var/spack/repos/builtin/packages/py-fluidfft-fftw/package.py new file mode 100644 index 00000000000000..de0980d74fa4dc --- /dev/null +++ b/var/spack/repos/builtin/packages/py-fluidfft-fftw/package.py @@ -0,0 +1,31 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyFluidfftFftw(PythonPackage): + """Fluidfft plugin using fftw.""" + + pypi = "fluidfft_fftw/fluidfft_fftw-0.0.1.tar.gz" + + maintainers("paugier") + license("CECILL-B", checked_by="paugier") + + version("0.0.1", sha256="59967846e1d976508db30ff65987e9c1e6c024ec9c095849608ee8913b96d3ff") + + with default_args(type=("build", "run")): + depends_on("python@3.9:") + + with default_args(type="link"): + depends_on("fftw") + + with default_args(type="build"): + depends_on("py-meson-python") + depends_on("py-transonic@0.6.4:") + depends_on("py-fluidfft-builder") + depends_on("py-cython@3.0:") + + depends_on("py-fluidfft", type="run") diff --git a/var/spack/repos/builtin/packages/py-fluidfft-fftwmpi/package.py b/var/spack/repos/builtin/packages/py-fluidfft-fftwmpi/package.py new file mode 100644 index 00000000000000..2fb41dc98c1ff8 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-fluidfft-fftwmpi/package.py @@ -0,0 +1,32 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyFluidfftFftwmpi(PythonPackage): + """Fluidfft plugin using fftwmpi.""" + + pypi = "fluidfft-fftwmpi/fluidfft_fftwmpi-0.0.1.tar.gz" + + maintainers("paugier") + license("CECILL-B", checked_by="paugier") + + version("0.0.1", sha256="af3c606852e991c2c1b3ea4f7558c69ab9138b713a7166a6eedf48ef1af660d3") + + with default_args(type=("build", "run")): + extends("python@3.9:") + depends_on("py-mpi4py") + + with default_args(type="link"): + depends_on("fftw") + + with default_args(type="build"): + depends_on("py-meson-python") + depends_on("py-transonic@0.6.4:") + depends_on("py-fluidfft-builder") + depends_on("py-cython@3.0:") + + depends_on("py-fluidfft", type="run") diff --git a/var/spack/repos/builtin/packages/py-fluidfft-mpi-with-fftw/package.py b/var/spack/repos/builtin/packages/py-fluidfft-mpi-with-fftw/package.py new file mode 100644 index 00000000000000..83845330233910 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-fluidfft-mpi-with-fftw/package.py @@ -0,0 +1,32 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyFluidfftMpiWithFftw(PythonPackage): + """Fluidfft MPI plugin using fftw.""" + + pypi = "fluidfft-mpi_with_fftw/fluidfft_mpi_with_fftw-0.0.1.tar.gz" + + maintainers("paugier") + license("CECILL-B", checked_by="paugier") + + version("0.0.1", sha256="ab8c1867e745715892f8d30c9409e9509467a610f5a702ac7b5cfa003787f6ce") + + with default_args(type=("build", "run")): + depends_on("python@3.9:") + depends_on("py-mpi4py") + + with default_args(type="link"): + depends_on("fftw") + + with default_args(type="build"): + depends_on("py-meson-python") + depends_on("py-transonic@0.6.4:") + depends_on("py-fluidfft-builder") + depends_on("py-cython@3.0:") + + depends_on("py-fluidfft", type="run") diff --git a/var/spack/repos/builtin/packages/py-fluidfft-p3dfft/package.py b/var/spack/repos/builtin/packages/py-fluidfft-p3dfft/package.py new file mode 100644 index 00000000000000..95b6382ace206e --- /dev/null +++ b/var/spack/repos/builtin/packages/py-fluidfft-p3dfft/package.py @@ -0,0 +1,33 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyFluidfftP3dfft(PythonPackage): + """Fluidfft MPI plugin using p3dfft.""" + + pypi = "fluidfft-p3dfft/fluidfft_p3dfft-0.0.1.tar.gz" + + maintainers("paugier") + license("CECILL-B", checked_by="paugier") + + version("0.0.1", sha256="1c291236a43045b9f8b9725e568277c5f405d2e2d9f811ba1bc9c5e1d9f2f827") + + with default_args(type=("build", "run")): + depends_on("python@3.9:") + depends_on("py-mpi4py") + + with default_args(type="link"): + depends_on("p3dfft3") + depends_on("fftw") + + with default_args(type="build"): + depends_on("py-meson-python") + depends_on("py-transonic@0.6.4:") + depends_on("py-fluidfft-builder") + depends_on("py-cython@3.0:") + + depends_on("py-fluidfft", type="run") diff --git a/var/spack/repos/builtin/packages/py-fluidfft-pfft/package.py b/var/spack/repos/builtin/packages/py-fluidfft-pfft/package.py new file mode 100644 index 00000000000000..d55c3845fc9ba8 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-fluidfft-pfft/package.py @@ -0,0 +1,33 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyFluidfftPfft(PythonPackage): + """Fluidfft MPI plugin using pfft.""" + + pypi = "fluidfft-pfft/fluidfft_pfft-0.0.1.tar.gz" + + maintainers("paugier") + license("CECILL-B", checked_by="paugier") + + version("0.0.1", sha256="ef8255bd78c9d2dbfb11715542b221d457eedfa0a5b0bbdd1b95e8fbe64043c5") + + with default_args(type=("build", "run")): + depends_on("python@3.9:") + depends_on("py-mpi4py") + + with default_args(type="link"): + depends_on("fftw") + depends_on("pfft") + + with default_args(type="build"): + depends_on("py-meson-python") + depends_on("py-transonic@0.6.4:") + depends_on("py-fluidfft-builder") + depends_on("py-cython@3.0:") + + depends_on("py-fluidfft", type="run") diff --git a/var/spack/repos/builtin/packages/py-fluidfft/package.py b/var/spack/repos/builtin/packages/py-fluidfft/package.py new file mode 100644 index 00000000000000..e674665785f39b --- /dev/null +++ b/var/spack/repos/builtin/packages/py-fluidfft/package.py @@ -0,0 +1,38 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyFluidfft(PythonPackage): + """Efficient and easy Fast Fourier Transform (FFT) for Python.""" + + pypi = "fluidfft/fluidfft-0.4.2.tar.gz" + + maintainers("paugier") + + license("CECILL-B", checked_by="paugier") + + version("0.4.2", sha256="5e35f1fb647da2fa65c116bb0d598fc9cb975cd95c41022644c27dc726c36073") + version("0.4.1", sha256="b17e64c7b2be47c61d6ac7b713e0e8992cf900d2367381288c93a56090e6c0c1") + + variant("native", default=False, description="Compile with -march=native and -Ofast.") + + with default_args(type=("build", "run")): + depends_on("python@3.9:") + depends_on("py-transonic@0.6.4:") + + with default_args(type="build"): + depends_on("py-meson-python") + depends_on("py-pythran@0.9.7:") + + with default_args(type="run"): + depends_on("py-fluiddyn@0.2.3:") + depends_on("py-pyfftw@0.10.4:") + depends_on("py-importlib_metadata", when="^python@:3.10") + + def config_settings(self, spec, prefix): + settings = {"setup-args": {"-Dnative": spec.variants["native"].value}} + return settings diff --git a/var/spack/repos/builtin/packages/py-fluidsim-core/package.py b/var/spack/repos/builtin/packages/py-fluidsim-core/package.py new file mode 100644 index 00000000000000..c6c86d0e23c7e5 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-fluidsim-core/package.py @@ -0,0 +1,27 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyFluidsimCore(PythonPackage): + """Pure-Python core library for FluidSim framework.""" + + pypi = "fluidsim-core/fluidsim_core-0.8.3.tar.gz" + + maintainers("paugier") + license("CECILL", checked_by="paugier") + + version("0.8.3", sha256="2c829486d640f921e42b690b824fe52ce6fcb678a36535f06d76b872e353d211") + version("0.8.2", sha256="62a8b43fc7ede8c6efc5cc109ae5caca2c1f54891dff547511c8fe94caf0bd7c") + version("0.8.1", sha256="3dfb51d5db1a574089738a4b8e1c76e75da32b25dceb349207dcece73d1b1646") + version("0.8.0", sha256="4b7a23649df9d10cde6510280fb8683550549d4cbbc1ebb0bc6adc6e559915f7") + + depends_on("python@3.9:", type=("build", "run")) + depends_on("py-flit-core@3.2:3", type="build") + + with default_args(type="run"): + depends_on("py-fluiddyn") + depends_on("py-importlib_metadata", when="^python@:3.9") diff --git a/var/spack/repos/builtin/packages/py-fluidsim/package.py b/var/spack/repos/builtin/packages/py-fluidsim/package.py new file mode 100644 index 00000000000000..bf538c1772ed80 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-fluidsim/package.py @@ -0,0 +1,43 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * +from spack.pkg.builtin.py_fluidsim_core import PyFluidsimCore + + +class PyFluidsim(PythonPackage): + """Framework for studying fluid dynamics with simulations.""" + + pypi = "fluidsim/fluidsim-0.8.3.tar.gz" + + maintainers("paugier") + license("CECILL", checked_by="paugier") + + version("0.8.3", sha256="ff3df8c2e8c96a694b5656125e778fc5f6561699bae3b264cbb75e2070b94169") + version("0.8.2", sha256="eb36c2d7d588fbb088af026683a12bb14aa126bbbc91b999009130d6cb7920f9") + version("0.8.1", sha256="44c70f388c429856f5df24705cddb2e024d7d1376d2153e113ef111af90b857b") + version("0.8.0", sha256="01f6d489ce44fe4dc47357506ba227ae0e87b346758d8f067c13f319d0a9a881") + + variant("native", default=False, description="Compile with -march=native and -Ofast.") + + with default_args(type=("build", "run")): + extends("python@3.9:") + depends_on("py-transonic@0.6.4:") + + with default_args(type="build"): + depends_on("py-meson-python") + depends_on("py-pythran@0.9.7:") + + with default_args(type="run"): + for _v in PyFluidsimCore.versions: + depends_on(f"py-fluidsim-core@{_v}", when=f"@{_v}") + depends_on("py-fluidfft@0.4.0:") + depends_on("py-xarray") + depends_on("py-rich") + depends_on("py-scipy") + + def config_settings(self, spec, prefix): + settings = {"setup-args": {"-Dnative": spec.variants["native"].value}} + return settings diff --git a/var/spack/repos/builtin/packages/py-future/package.py b/var/spack/repos/builtin/packages/py-future/package.py index 14a51ad53bcb94..9ed6394c0f256b 100644 --- a/var/spack/repos/builtin/packages/py-future/package.py +++ b/var/spack/repos/builtin/packages/py-future/package.py @@ -15,6 +15,7 @@ class PyFuture(PythonPackage): license("MIT") + version("1.0.0", sha256="bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05") version("0.18.3", sha256="34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307") version("0.18.2", sha256="b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d") version("0.17.1", sha256="67045236dcfd6816dc439556d009594abf643e5eb48992e36beac09c2ca659b8") diff --git a/var/spack/repos/builtin/packages/py-genshi/package.py b/var/spack/repos/builtin/packages/py-genshi/package.py index fba512eca04e0c..d9112609a5f194 100644 --- a/var/spack/repos/builtin/packages/py-genshi/package.py +++ b/var/spack/repos/builtin/packages/py-genshi/package.py @@ -21,4 +21,5 @@ class PyGenshi(PythonPackage): depends_on("py-six", type=("build", "run", "test")) def test_testsuite(self): + """run unittest suite""" python("-m", "unittest", "-v", "genshi.tests.suite") diff --git a/var/spack/repos/builtin/packages/py-geopandas/package.py b/var/spack/repos/builtin/packages/py-geopandas/package.py index be699da3f59700..47194df24f17dc 100644 --- a/var/spack/repos/builtin/packages/py-geopandas/package.py +++ b/var/spack/repos/builtin/packages/py-geopandas/package.py @@ -22,6 +22,8 @@ class PyGeopandas(PythonPackage): license("BSD-3-Clause") version("master", branch="master") + version("1.0.1", sha256="b8bf70a5534588205b7a56646e2082fb1de9a03599651b3d80c99ea4c2ca08ab") + version("1.0.0", sha256="386d42c028047e2b0f09191d7859268304761c4711a247173a88891b6161f711") version("0.14.3", sha256="748af035d4a068a4ae00cab384acb61d387685c833b0022e0729aa45216b23ac") version("0.11.1", sha256="f0f0c8d0423d30cf81de2056d853145c4362739350a7f8f2d72cc7409ef1eca1") version("0.11.0", sha256="562fe7dc19a6e0f61532d654c4752f7bf46e0714990c5844fe3de3f9c99cb873") @@ -42,21 +44,27 @@ class PyGeopandas(PythonPackage): depends_on("python@3.9:", type=("build", "run"), when="@0.14:") depends_on("py-setuptools", type="build") depends_on("py-setuptools@61.0.0:", type="build", when="@0.14:") + depends_on("py-numpy", type=("build", "run")) + depends_on("py-numpy@1.22:", type=("build", "run"), when="@0.14.4:") + # Only for versions 0.x.y - replaced by py-pyogrio + depends_on("py-fiona", type=("build", "run"), when="@:0.99") + depends_on("py-fiona@1.8:", type=("build", "run"), when="@0.9:0.99") + depends_on("py-fiona@1.8.21:", type=("build", "run"), when="@0.14:0.99") + # Only for versions 1.x.y - replaces py-fiona + depends_on("py-pyogrio@0.7.2:", type=("build", "run"), when="@1:") + depends_on("py-packaging", type=("build", "run"), when="@0.11:") depends_on("py-pandas", type=("build", "run")) depends_on("py-pandas@0.23.0:", type=("build", "run"), when="@0.6:") depends_on("py-pandas@0.24.0:", type=("build", "run"), when="@0.9:") depends_on("py-pandas@0.25.0:", type=("build", "run"), when="@0.10:") depends_on("py-pandas@1.0.0:", type=("build", "run"), when="@0.11:") depends_on("py-pandas@1.4.0:", type=("build", "run"), when="@0.14:") - depends_on("py-shapely@:1", type=("build", "run")) - depends_on("py-shapely@1.6:1", type=("build", "run"), when="@0.9:0.10") - depends_on("py-shapely@1.7:1", type=("build", "run"), when="@0.11:") - depends_on("py-shapely@1.8.0:", type=("build", "run"), when="@0.14:") - depends_on("py-fiona", type=("build", "run")) - depends_on("py-fiona@1.8:", type=("build", "run"), when="@0.9:") - depends_on("py-fiona@1.8.21:", type=("build", "run"), when="@0.14:") depends_on("py-pyproj", type=("build", "run")) depends_on("py-pyproj@2.2.0:", type=("build", "run"), when="@0.7:") depends_on("py-pyproj@2.6.1.post1:", type=("build", "run"), when="@0.11:") depends_on("py-pyproj@3.3.0:", type=("build", "run"), when="@0.14:") - depends_on("py-packaging", type=("build", "run"), when="@0.11:") + depends_on("py-shapely@:1", type=("build", "run"), when="@:0.99") + depends_on("py-shapely@1.6:1", type=("build", "run"), when="@0.9:0.10") + depends_on("py-shapely@1.7:1", type=("build", "run"), when="@0.11:0.99") + depends_on("py-shapely@1.8.0:", type=("build", "run"), when="@0.14:") + depends_on("py-shapely@2.0.0:", type=("build", "run"), when="@1:") diff --git a/var/spack/repos/builtin/packages/py-gevent/cython.patch b/var/spack/repos/builtin/packages/py-gevent/cython.patch new file mode 100644 index 00000000000000..91e751f2f9fa0f --- /dev/null +++ b/var/spack/repos/builtin/packages/py-gevent/cython.patch @@ -0,0 +1,9 @@ +--- a/src/gevent/_gevent_cqueue.pxd ++++ b/src/gevent/_gevent_cqueue.pxd +@@ -75,7 +75,6 @@ cdef class ItemWaiter(Waiter): + cdef readonly Queue queue + + +-@cython.final + cdef class UnboundQueue(Queue): + pass \ No newline at end of file diff --git a/var/spack/repos/builtin/packages/py-gevent/package.py b/var/spack/repos/builtin/packages/py-gevent/package.py index fdcdad0f8d2712..f4a9d275ffb780 100644 --- a/var/spack/repos/builtin/packages/py-gevent/package.py +++ b/var/spack/repos/builtin/packages/py-gevent/package.py @@ -41,16 +41,13 @@ class PyGevent(PythonPackage): # https://github.com/gevent/gevent/issues/1599 conflicts("^py-cython@3:", when="@:20.5.0") - # https://github.com/gevent/gevent/issues/2031 - conflicts( - "^py-cython@3.0.10", - when="@:23.9.0", - msg="py-gevent fails to build when using cython@3.0.10", - ) # Deprecated compiler options. upstream PR: https://github.com/gevent/gevent/pull/1896 patch("icc.patch", when="@:21.12.0 %intel") + # https://github.com/gevent/gevent/issues/2031 + patch("cython.patch", when="@:24.2.1^py-cython@3.0.10:3.0.11") + @run_before("install") def recythonize(self): # Clean pre-generated cython files -- we've seen issues with Python 3.8 due to diff --git a/var/spack/repos/builtin/packages/py-glmsingle/package.py b/var/spack/repos/builtin/packages/py-glmsingle/package.py index 3b3e3c28c1dd72..aeb694ac755254 100644 --- a/var/spack/repos/builtin/packages/py-glmsingle/package.py +++ b/var/spack/repos/builtin/packages/py-glmsingle/package.py @@ -16,6 +16,7 @@ class PyGlmsingle(PythonPackage): license("BSD-3-Clause") version("main", branch="main") + version("1.2", sha256="1826e716d29451c6f64912f180e3c5aa5b1e45957f1df75d0bce32711448cc9b") version("1.1", sha256="3fe3cb1f0d1e96976f2c707b1f9e8ddb932b74f58e99debbfa6f17761fdbd37b") version("1.0", sha256="0481f8ea7637d7e9cb53a7f22c73ba67b9fb8aefebc8c6c98bd4712de95db6aa") @@ -29,6 +30,7 @@ class PyGlmsingle(PythonPackage): depends_on("py-fracridge", type=("build", "run")) depends_on("py-nibabel", when="@1.1:", type=("build", "run")) depends_on("py-h5py", when="@1.1:", type=("build", "run")) + depends_on("py-pandas", when="@1.2:", type=("build", "run")) with when("@:1.0"): depends_on("py-twine", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-greenlet/package.py b/var/spack/repos/builtin/packages/py-greenlet/package.py index d6ada7c60984d0..71dcc219cdc427 100644 --- a/var/spack/repos/builtin/packages/py-greenlet/package.py +++ b/var/spack/repos/builtin/packages/py-greenlet/package.py @@ -29,11 +29,12 @@ class PyGreenlet(PythonPackage): version("0.4.17", sha256="41d8835c69a78de718e466dd0e6bfd4b46125f21a67c3ff6d76d8d8059868d6b") version("0.4.13", sha256="0fef83d43bf87a5196c91e73cb9772f945a4caaff91242766c5916d1dd1381e4") - depends_on("c", type="build") # generated - depends_on("cxx", type="build") # generated + depends_on("c", type="build") + depends_on("cxx", type="build") with default_args(type=("build", "link", "run")): depends_on("python") depends_on("python@:3.11", when="@:2") + depends_on("python@:3.12", when="@:3.0") depends_on("py-setuptools", type="build") diff --git a/var/spack/repos/builtin/packages/py-gssapi/package.py b/var/spack/repos/builtin/packages/py-gssapi/package.py index f957a842db3f61..a236f3f3450d07 100644 --- a/var/spack/repos/builtin/packages/py-gssapi/package.py +++ b/var/spack/repos/builtin/packages/py-gssapi/package.py @@ -15,11 +15,13 @@ class PyGssapi(PythonPackage): maintainers("wdconinc") + version("1.9.0", sha256="f468fac8f3f5fca8f4d1ca19e3cd4d2e10bd91074e7285464b22715d13548afe") version("1.8.3", sha256="aa3c8d0b1526f52559552bb2c9d2d6be013d76a8e5db00b39a1db5727e93b0b0") version("1.8.2", sha256="b78e0a021cc91158660e4c5cc9263e07c719346c35a9c0f66725e914b235c89a") depends_on("py-cython@0.29.29:2", type="build", when="@:1.8.2") depends_on("py-cython@0.29.29:3", type="build", when="@1.8.3:") + depends_on("py-cython@3.0.3:3", type="build", when="@1.9.0:") depends_on("py-setuptools@40.6.0:", type="build") depends_on("py-decorator", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-hatch-cython/package.py b/var/spack/repos/builtin/packages/py-hatch-cython/package.py new file mode 100644 index 00000000000000..2aa6b3b65da060 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-hatch-cython/package.py @@ -0,0 +1,25 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyHatchCython(PythonPackage): + """cython hooks for hatch""" + + homepage = "https://github.com/joshua-auchincloss/hatch-cython" + pypi = "hatch_cython/hatch_cython-0.5.1.tar.gz" + + license("MIT") + + version("0.5.1", sha256="d01135e092544069c3e61f6dc36748ee369beacb893a5c43b9593a533f839703") + + depends_on("python@3.8:", type=("build", "run")) + + depends_on("py-setuptools", type="build") + depends_on("py-hatchling", type=("build", "run")) + depends_on("py-hatch", type=("build", "run")) + depends_on("py-cython", type=("build", "run")) + depends_on("py-typing-extensions", when="@:3.9", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-hatch-vcs/package.py b/var/spack/repos/builtin/packages/py-hatch-vcs/package.py index fe34688b98d2f5..8347b910723197 100644 --- a/var/spack/repos/builtin/packages/py-hatch-vcs/package.py +++ b/var/spack/repos/builtin/packages/py-hatch-vcs/package.py @@ -14,9 +14,11 @@ class PyHatchVcs(PythonPackage): license("MIT") + version("0.4.0", sha256="093810748fe01db0d451fabcf2c1ac2688caefd232d4ede967090b1c1b07d9f7") version("0.3.0", sha256="cec5107cfce482c67f8bc96f18bbc320c9aa0d068180e14ad317bbee5a153fee") version("0.2.0", sha256="9913d733b34eec9bb0345d0626ca32165a4ad2de15d1ce643c36d09ca908abff") + depends_on("py-hatchling@1.24.2:", when="@0.4:", type=("build", "run")) + depends_on("python@3.8:", when="@0.4:", type=("build", "run")) depends_on("py-hatchling@1.1:", when="@0.3:", type=("build", "run")) - depends_on("py-hatchling@0.21.0:", type=("build", "run")) depends_on("py-setuptools-scm@6.4.0:", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-hatch/package.py b/var/spack/repos/builtin/packages/py-hatch/package.py new file mode 100644 index 00000000000000..19b9f99d43ffb5 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-hatch/package.py @@ -0,0 +1,39 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyHatch(PythonPackage): + """Modern, extensible Python project management""" + + homepage = "https://hatch.pypa.io/latest/" + pypi = "hatch/hatch-1.12.0.tar.gz" + + license("MIT") + + version("1.12.0", sha256="ae80478d10312df2b44d659c93bc2ed4d33aecddce4b76378231bdf81c8bf6ad") + + depends_on("python@3.8:", type=("build", "run")) + + depends_on("py-hatchling@1.24.2:", type="build") + depends_on("py-hatch-vcs@0.3.0:", type="build") + depends_on("py-pyproject-hooks", type=("build")) + + depends_on("py-click@8.0.6:", type=("build", "run")) + depends_on("py-httpx@0.22.0:", type=("build", "run")) + depends_on("py-hyperlink@21.0.0:", type=("build", "run")) + depends_on("py-keyring@23.5.0:", type=("build", "run")) + depends_on("py-packaging@23.2:", type=("build", "run")) + depends_on("py-pexpect@4.8:4.8", type=("build", "run")) + depends_on("py-platformdirs@2.5.0:", type=("build", "run")) + depends_on("py-rich@11.2.0:", type=("build", "run")) + depends_on("py-shellingham@1.4.0:", type=("build", "run")) + depends_on("py-tomli-w@1.0:", type=("build", "run")) + depends_on("py-tomlkit@0.11.1:", type=("build", "run")) + depends_on("py-userpath@1.7:1.7", type=("build", "run")) + depends_on("py-uv@0.1.35:", type=("build", "run")) + depends_on("py-virtualenv@20.26.1:", type=("build", "run")) + depends_on("py-zstandard@:1", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-hatchling/package.py b/var/spack/repos/builtin/packages/py-hatchling/package.py index 6f8158487c8cd1..c5987b74de9d35 100644 --- a/var/spack/repos/builtin/packages/py-hatchling/package.py +++ b/var/spack/repos/builtin/packages/py-hatchling/package.py @@ -15,6 +15,8 @@ class PyHatchling(PythonPackage): license("MIT", checked_by="tgamblin") + version("1.25.0", sha256="7064631a512610b52250a4d3ff1bd81551d6d1431c4eb7b72e734df6c74f4262") + version("1.24.2", sha256="41ddc27cdb25db9ef7b68bef075f829c84cb349aa1bff8240797d012510547b0") version("1.21.0", sha256="5c086772357a50723b825fd5da5278ac7e3697cdf7797d07541a6c90b6ff754c") version("1.18.0", sha256="50e99c3110ce0afc3f7bdbadff1c71c17758e476731c27607940cfa6686489ca") version("1.17.0", sha256="b1244db3f45b4ef5a00106a46612da107cdfaf85f1580b8e1c059fefc98b0930") @@ -28,6 +30,7 @@ class PyHatchling(PythonPackage): depends_on("py-editables@0.3:", type=("build", "run")) depends_on("py-packaging@21.3:", type=("build", "run")) + depends_on("py-packaging@23.2:", when="@1.24.2:", type=("build", "run")) depends_on("py-pathspec@0.10.1:", when="@1.9:", type=("build", "run")) depends_on("py-pathspec@0.9:", type=("build", "run")) depends_on("py-pluggy@1:", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-horovod/package.py b/var/spack/repos/builtin/packages/py-horovod/package.py index 7f98321996c470..d7a2e9b3bbf36a 100644 --- a/var/spack/repos/builtin/packages/py-horovod/package.py +++ b/var/spack/repos/builtin/packages/py-horovod/package.py @@ -13,121 +13,51 @@ class PyHorovod(PythonPackage, CudaPackage): homepage = "https://github.com/horovod" git = "https://github.com/horovod/horovod.git" - - maintainers("adamjstewart", "aweits", "tgaddair", "thomas-bouvier") + submodules = True license("Apache-2.0") + maintainers("adamjstewart", "aweits", "tgaddair", "thomas-bouvier") - version("master", branch="master", submodules=True) - version( - "0.28.1", tag="v0.28.1", commit="1d217b59949986d025f6db93c49943fb6b6cc78f", submodules=True - ) - version( - "0.28.0", tag="v0.28.0", commit="587d72004736209a93ebda8cec0acdb7870db583", submodules=True - ) - version( - "0.27.0", tag="v0.27.0", commit="bfaca90d5cf66780a97d8799d4e1573855b64560", submodules=True - ) - version( - "0.26.1", tag="v0.26.1", commit="34604870eabd9dc670c222deb1da9acc6b9d7c03", submodules=True - ) - version( - "0.26.0", tag="v0.26.0", commit="c638dcec972750d4a75b229bc208cff9dc76b00a", submodules=True - ) - version( - "0.25.0", tag="v0.25.0", commit="48e0affcba962831668cd1222866af2d632920c2", submodules=True - ) - version( - "0.24.3", tag="v0.24.3", commit="a2d9e280c1210a8e364a7dc83ca6c2182fefa99d", submodules=True - ) - version( - "0.24.2", tag="v0.24.2", commit="b4c191c8d05086842517b3836285a85c6f96ab22", submodules=True - ) - version( - "0.24.1", tag="v0.24.1", commit="ebd135098571722469bb6290a6d098a9e1c96574", submodules=True - ) - version( - "0.24.0", tag="v0.24.0", commit="b089df66a29d3ba6672073eef3d42714d9d3626b", submodules=True - ) - version( - "0.23.0", tag="v0.23.0", commit="66ad6d5a3586decdac356e8ec95c204990bbc3d6", submodules=True - ) - version( - "0.22.1", tag="v0.22.1", commit="93a2f2583ed63391a904aaeb03b602729be90f15", submodules=True - ) - version( - "0.22.0", tag="v0.22.0", commit="3ff94801fbb4dbf6bc47c23888c93cad4887435f", submodules=True - ) - version( - "0.21.3", tag="v0.21.3", commit="6916985c9df111f36864724e2611827f64de8e11", submodules=True - ) - version( - "0.21.2", tag="v0.21.2", commit="c64b1d60c6bad7834f3315f12707f8ebf11c9c3d", submodules=True - ) - version( - "0.21.1", tag="v0.21.1", commit="a9dea74abc1f0b8e81cd2b6dd9fe81e2c4244e39", submodules=True - ) - version( - "0.21.0", tag="v0.21.0", commit="7d71874258fc8625ad8952defad0ea5b24531248", submodules=True - ) - version( - "0.20.3", tag="v0.20.3", commit="b3c4d81327590c9064d544622b6250d9a19ce2c2", submodules=True - ) - version( - "0.20.2", tag="v0.20.2", commit="cef4393eb980d4137bb91256da4dd847b7f44d1c", submodules=True - ) - version( - "0.20.1", tag="v0.20.1", commit="4099c2b7f34f709f0db1c09f06b2594d7b4b9615", submodules=True - ) - version( - "0.20.0", tag="v0.20.0", commit="396c1319876039ad8f5a56c007a020605ccb8277", submodules=True - ) - version( - "0.19.5", tag="v0.19.5", commit="b52e4b3e6ce5b1b494b77052878a0aad05c2e3ce", submodules=True - ) - version( - "0.19.4", tag="v0.19.4", commit="31f1f700b8fa6d3b6df284e291e302593fbb4fa3", submodules=True - ) - version( - "0.19.3", tag="v0.19.3", commit="ad63bbe9da8b41d0940260a2dd6935fa0486505f", submodules=True - ) - version( - "0.19.2", tag="v0.19.2", commit="f8fb21e0ceebbdc6ccc069c43239731223d2961d", submodules=True - ) - version( - "0.19.1", tag="v0.19.1", commit="9ad69e78e83c34568743e8e97b1504c6c7af34c3", submodules=True - ) - version( - "0.19.0", tag="v0.19.0", commit="1a805d9b20224069b294f361e47f5d9b55f426ff", submodules=True - ) - version( - "0.18.2", tag="v0.18.2", commit="bb2134b427e0e0c5a83624d02fafa4f14de623d9", submodules=True - ) - version( - "0.18.1", tag="v0.18.1", commit="0008191b3e61b5dfccddabe0129bbed7cd544c56", submodules=True - ) - version( - "0.18.0", tag="v0.18.0", commit="a639de51e9a38d5c1f99f458c045aeaebe70351e", submodules=True - ) - version( - "0.17.1", tag="v0.17.1", commit="399e70adc0f74184b5848d9a46b9b6ad67b5fe6d", submodules=True - ) - version( - "0.17.0", tag="v0.17.0", commit="2fed0410774b480ad19057320be9027be06b309e", submodules=True - ) - version( - "0.16.4", tag="v0.16.4", commit="2aac48c95c035bee7d68f9aff30e59319f46c21e", submodules=True - ) - version( - "0.16.3", tag="v0.16.3", commit="30a2148784478415dc31d65a6aa08d237f364b42", submodules=True - ) - version( - "0.16.2", tag="v0.16.2", commit="217774652eeccfcd60aa6e268dfd6b766d71b768", submodules=True - ) - - depends_on("c", type="build") # generated - depends_on("cxx", type="build") # generated - depends_on("fortran", type="build") # generated + version("master", branch="master") + version("0.28.1", tag="v0.28.1", commit="1d217b59949986d025f6db93c49943fb6b6cc78f") + version("0.28.0", tag="v0.28.0", commit="587d72004736209a93ebda8cec0acdb7870db583") + version("0.27.0", tag="v0.27.0", commit="bfaca90d5cf66780a97d8799d4e1573855b64560") + version("0.26.1", tag="v0.26.1", commit="34604870eabd9dc670c222deb1da9acc6b9d7c03") + version("0.26.0", tag="v0.26.0", commit="c638dcec972750d4a75b229bc208cff9dc76b00a") + version("0.25.0", tag="v0.25.0", commit="48e0affcba962831668cd1222866af2d632920c2") + version("0.24.3", tag="v0.24.3", commit="a2d9e280c1210a8e364a7dc83ca6c2182fefa99d") + version("0.24.2", tag="v0.24.2", commit="b4c191c8d05086842517b3836285a85c6f96ab22") + version("0.24.1", tag="v0.24.1", commit="ebd135098571722469bb6290a6d098a9e1c96574") + version("0.24.0", tag="v0.24.0", commit="b089df66a29d3ba6672073eef3d42714d9d3626b") + version("0.23.0", tag="v0.23.0", commit="66ad6d5a3586decdac356e8ec95c204990bbc3d6") + version("0.22.1", tag="v0.22.1", commit="93a2f2583ed63391a904aaeb03b602729be90f15") + version("0.22.0", tag="v0.22.0", commit="3ff94801fbb4dbf6bc47c23888c93cad4887435f") + version("0.21.3", tag="v0.21.3", commit="6916985c9df111f36864724e2611827f64de8e11") + version("0.21.2", tag="v0.21.2", commit="c64b1d60c6bad7834f3315f12707f8ebf11c9c3d") + version("0.21.1", tag="v0.21.1", commit="a9dea74abc1f0b8e81cd2b6dd9fe81e2c4244e39") + version("0.21.0", tag="v0.21.0", commit="7d71874258fc8625ad8952defad0ea5b24531248") + version("0.20.3", tag="v0.20.3", commit="b3c4d81327590c9064d544622b6250d9a19ce2c2") + version("0.20.2", tag="v0.20.2", commit="cef4393eb980d4137bb91256da4dd847b7f44d1c") + version("0.20.1", tag="v0.20.1", commit="4099c2b7f34f709f0db1c09f06b2594d7b4b9615") + version("0.20.0", tag="v0.20.0", commit="396c1319876039ad8f5a56c007a020605ccb8277") + version("0.19.5", tag="v0.19.5", commit="b52e4b3e6ce5b1b494b77052878a0aad05c2e3ce") + version("0.19.4", tag="v0.19.4", commit="31f1f700b8fa6d3b6df284e291e302593fbb4fa3") + version("0.19.3", tag="v0.19.3", commit="ad63bbe9da8b41d0940260a2dd6935fa0486505f") + version("0.19.2", tag="v0.19.2", commit="f8fb21e0ceebbdc6ccc069c43239731223d2961d") + version("0.19.1", tag="v0.19.1", commit="9ad69e78e83c34568743e8e97b1504c6c7af34c3") + version("0.19.0", tag="v0.19.0", commit="1a805d9b20224069b294f361e47f5d9b55f426ff") + version("0.18.2", tag="v0.18.2", commit="bb2134b427e0e0c5a83624d02fafa4f14de623d9") + version("0.18.1", tag="v0.18.1", commit="0008191b3e61b5dfccddabe0129bbed7cd544c56") + version("0.18.0", tag="v0.18.0", commit="a639de51e9a38d5c1f99f458c045aeaebe70351e") + version("0.17.1", tag="v0.17.1", commit="399e70adc0f74184b5848d9a46b9b6ad67b5fe6d") + version("0.17.0", tag="v0.17.0", commit="2fed0410774b480ad19057320be9027be06b309e") + version("0.16.4", tag="v0.16.4", commit="2aac48c95c035bee7d68f9aff30e59319f46c21e") + version("0.16.3", tag="v0.16.3", commit="30a2148784478415dc31d65a6aa08d237f364b42") + version("0.16.2", tag="v0.16.2", commit="217774652eeccfcd60aa6e268dfd6b766d71b768") + + depends_on("c", type="build") + depends_on("cxx", type="build") + depends_on("fortran", type="build") # https://github.com/horovod/horovod/blob/master/docs/install.rst variant( @@ -232,7 +162,20 @@ class PyHorovod(PythonPackage, CudaPackage): "controllers=gloo", when="@:0.20.0 platform=darwin", msg="Gloo cannot be compiled on MacOS" ) # https://github.com/horovod/horovod/issues/3996 - conflicts("^py-torch@2.1:", when="@:0.28.1") + patch( + "https://github.com/horovod/horovod/pull/3998.patch?full_index=1", + sha256="9ecd4e8e315764afab20f2086e24baccf8178779a3c663196b24dc55a23a6aca", + when="@0.25:0.28.1", + ) + conflicts("^py-torch@2.1:", when="@:0.24") + + # https://github.com/horovod/horovod/pull/3957 + patch( + "https://github.com/horovod/horovod/pull/3957.patch?full_index=1", + sha256="9e22e312c0cbf224b4135ba70bd4fd2e4170d8316c996643e360112abaac8f93", + when="@0.21:0.28.1", + ) + conflicts("%gcc@13:", when="@:0.20") # https://github.com/horovod/horovod/pull/1835 patch("fma.patch", when="@0.19.0:0.19.1") diff --git a/var/spack/repos/builtin/packages/py-httpcore/package.py b/var/spack/repos/builtin/packages/py-httpcore/package.py index 8a72e47aa05c06..45fbf4b22bb95e 100644 --- a/var/spack/repos/builtin/packages/py-httpcore/package.py +++ b/var/spack/repos/builtin/packages/py-httpcore/package.py @@ -15,15 +15,24 @@ class PyHttpcore(PythonPackage): license("BSD-3-Clause") + version("1.0.5", sha256="34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61") + version("0.18.0", sha256="13b5e5cd1dca1a6636a6aaea212b19f4f85cd88c366a2b82304181b769aab3c9") version("0.16.3", sha256="c5d6f04e2fc530f39e0c077e6a30caa53f1451096120f1f38b954afd0b17c0cb") version("0.14.7", sha256="7503ec1c0f559066e7e39bc4003fd2ce023d01cf51793e3c173b864eb456ead1") version("0.11.0", sha256="35ffc735d746b83f8fc6d36f82600e56117b9e8adc65d0c0423264b6ebfef7bf") - depends_on("py-setuptools", type="build") - depends_on("py-h11@0.13:0.14", when="@0.16.3", type=("build", "run")) - depends_on("py-h11@0.11:0.12", type=("build", "run"), when="@0.14.7") - depends_on("py-h11@0.8:0.9", type=("build", "run"), when="@0.11.0") - depends_on("py-sniffio@1", type=("build", "run")) - depends_on("py-anyio@3:4", when="@0.16.3", type=("build", "run")) - depends_on("py-anyio@3", type=("build", "run"), when="@0.14.7") - depends_on("py-certifi", type=("build", "run"), when="@0.14.7:") + depends_on("py-setuptools", when="@:1.16.3", type="build") + depends_on("py-hatchling", when="@0.18:", type="build") + depends_on("py-hatch-fancy-pypi-readme", when="@0.18:", type="build") + + with default_args(type=("build", "run")): + depends_on("py-certifi", when="@0.14.7:") + + depends_on("py-h11@0.8:0.9", when="@0.11.0") + depends_on("py-h11@0.11:0.12", when="@0.14.7") + depends_on("py-h11@0.13:0.14", when="@0.16.3:") + + depends_on("py-sniffio@1", when="@0") + + depends_on("py-anyio@3", when="@0.14.7") + depends_on("py-anyio@3:4", when="@0.16.3:0.18") diff --git a/var/spack/repos/builtin/packages/py-httpx/package.py b/var/spack/repos/builtin/packages/py-httpx/package.py index 4da435bbd3cc1c..37be8063c45923 100644 --- a/var/spack/repos/builtin/packages/py-httpx/package.py +++ b/var/spack/repos/builtin/packages/py-httpx/package.py @@ -11,10 +11,12 @@ class PyHttpx(PythonPackage): and async APIs, and support for both HTTP/1.1 and HTTP/2.""" homepage = "https://github.com/encode/httpx" - pypi = "httpx/httpx-0.15.2.tar.gz" + pypi = "httpx/httpx-0.27.0.tar.gz" license("BSD-3-Clause") + version("0.27.2", sha256="f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2") + version("0.27.0", sha256="a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5") version("0.23.3", sha256="9818458eb565bb54898ccb9b8b251a28785dd4a55afbc23d0eb410754fe7d0f9") version("0.22.0", sha256="d8e778f76d9bbd46af49e7f062467e3157a5a3d2ae4876a4bbfd8a51ed9c9cb4") version("0.15.2", sha256="713a2deaf96d85bbd4a1fbdf0edb27d6b4ee2c9aaeda8433042367e4b9e1628d") @@ -22,26 +24,36 @@ class PyHttpx(PythonPackage): variant("http2", default=False, when="@0.15.2:", description="Enable http2 support") + depends_on("python@3.8:", when="@0.27:", type=("build", "run")) + depends_on("py-setuptools", when="@:0.22", type="build") depends_on("py-hatchling", when="@0.23:", type="build") depends_on("py-hatch-fancy-pypi-readme", when="@0.23:", type="build") - depends_on("py-certifi", type=("build", "run")) - depends_on("py-httpcore@0.15:0.16", when="@0.23:", type=("build", "run")) - depends_on("py-httpcore@0.14.5:0.14", type=("build", "run"), when="@0.22") - depends_on("py-httpcore@0.11.0:0.11", type=("build", "run"), when="@0.15.2") - depends_on("py-rfc3986+idna2008@1.3:1", type=("build", "run"), when="@0.15.2:") - depends_on("py-rfc3986@1.3:1", type=("build", "run"), when="@0.11.1") - depends_on("py-sniffio", type=("build", "run"), when="@0.15.2:") - depends_on("py-sniffio@1.0:1", type=("build", "run"), when="@0.11.1") - - depends_on("py-h2@3.0:4", type=("build", "run"), when="@0.22.0:+http2") - depends_on("py-h2@3.0:3", type=("build", "run"), when="@0.15.2+http2") - depends_on("py-h2@3.0:3", type=("build", "run"), when="@0.11.1") - - # Historical dependencies - depends_on("py-setuptools", when="@:0.22", type="build") - depends_on("py-charset-normalizer", type=("build", "run"), when="@0.22") - depends_on("py-hstspreload", type=("build", "run"), when="@0.11.1") - depends_on("py-chardet@3.0:3", type=("build", "run"), when="@0.11.1") - depends_on("py-h11@0.8:0.9", type=("build", "run"), when="@0.11.1") - depends_on("py-idna@2.0:2", type=("build", "run"), when="@0.11.1") - depends_on("py-urllib3@1.0:1", type=("build", "run"), when="@0.11.1") + + with default_args(type=("build", "run")): + depends_on("py-certifi") + + depends_on("py-httpcore@0.11", when="@0.15.2") + depends_on("py-httpcore@0.14.5:0.14", when="@0.22") + depends_on("py-httpcore@0.15:0.16", when="@0.23") + depends_on("py-httpcore@1", when="@0.27:") + + depends_on("py-anyio", when="@0.27:") + depends_on("py-idna", when="@0.27:") + + depends_on("py-sniffio@1", when="@0.11.1") + depends_on("py-sniffio", when="@0.15.2:") + + depends_on("py-h2@3", when="@0.11.1") + depends_on("py-h2@3", when="@0.15.2+http2") + depends_on("py-h2@3:4", when="@0.22.0:+http2") + + # Historical dependencies + depends_on("py-hstspreload", when="@0.11.1") + depends_on("py-chardet@3", when="@0.11.1") + depends_on("py-h11@0.8:0.9", when="@0.11.1") + depends_on("py-idna@2", when="@0.11.1") + depends_on("py-urllib3@1", when="@0.11.1") + depends_on("py-charset-normalizer", when="@0.22") + + depends_on("py-rfc3986@1.3:1", when="@0.11.1") + depends_on("py-rfc3986+idna2008@1.3:1", when="@0.15.2:2.23.3") diff --git a/var/spack/repos/builtin/packages/py-igv-notebook/package.py b/var/spack/repos/builtin/packages/py-igv-notebook/package.py new file mode 100644 index 00000000000000..ffee7c8af84b15 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-igv-notebook/package.py @@ -0,0 +1,24 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + + +from spack.package import * + + +class PyIgvNotebook(PythonPackage): + """Module for embedding igv.js in an IPython notebook""" + + homepage = "https://github.com/igvteam/igv-notebook" + pypi = "igv-notebook/igv-notebook-0.5.2.tar.gz" + + license("MIT license", checked_by="ashim-mahara") + + version("0.5.2", sha256="8b47a1a6c41f11359a07264815401cc4000c99722c77cbb749182bf6b66cf69c") + + depends_on("py-setuptools", type="build") + + depends_on("py-ipykernel", type=("build", "run")) + depends_on("py-ipython", type=("build", "run")) + depends_on("py-requests", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-imageio/package.py b/var/spack/repos/builtin/packages/py-imageio/package.py index c204ef6c61d730..9e2f04478ce876 100644 --- a/var/spack/repos/builtin/packages/py-imageio/package.py +++ b/var/spack/repos/builtin/packages/py-imageio/package.py @@ -19,6 +19,7 @@ class PyImageio(PythonPackage): license("BSD-2-Clause") + version("2.35.1", sha256="4952dfeef3c3947957f6d5dedb1f4ca31c6e509a476891062396834048aeed2a") version("2.34.0", sha256="ae9732e10acf807a22c389aef193f42215718e16bd06eed0c5bb57e1034a4d53") version("2.30.0", sha256="7fc6ad5b5677cb1e58077875a72512aa8c392b6d40885eca0a6ab250efb4b8f4") version("2.22.0", sha256="a332d127ec387b2d3dca967fd065a90f1c1a4ba2343570b03fe2cebb6ed064ea") diff --git a/var/spack/repos/builtin/packages/py-incremental/package.py b/var/spack/repos/builtin/packages/py-incremental/package.py index 8550e3759804bc..5e05689b842f45 100644 --- a/var/spack/repos/builtin/packages/py-incremental/package.py +++ b/var/spack/repos/builtin/packages/py-incremental/package.py @@ -14,6 +14,9 @@ class PyIncremental(PythonPackage): license("MIT") + version("24.7.2", sha256="fb4f1d47ee60efe87d4f6f0ebb5f70b9760db2b2574c59c8e8912be4ebd464c9") version("21.3.0", sha256="02f5de5aff48f6b9f665d99d48bfc7ec03b6e3943210de7cfc88856d755d6f57") depends_on("py-setuptools", type="build") + depends_on("py-setuptools@61.0:", type="build", when="@24.7:") + depends_on("py-tomli", type=("build", "run"), when="@24.7: ^python@:3.10") diff --git a/var/spack/repos/builtin/packages/py-invoke/package.py b/var/spack/repos/builtin/packages/py-invoke/package.py index 53c54538aaacd0..91b01f47cdcbe1 100644 --- a/var/spack/repos/builtin/packages/py-invoke/package.py +++ b/var/spack/repos/builtin/packages/py-invoke/package.py @@ -14,8 +14,10 @@ class PyInvoke(PythonPackage): license("BSD-2-Clause") + version("2.2.0", sha256="ee6cbb101af1a859c7fe84f2a264c059020b0cb7fe3535f9424300ab568f6bd5") version("1.4.1", sha256="de3f23bfe669e3db1085789fd859eb8ca8e0c5d9c20811e2407fa042e8a5e15d") version("1.2.0", sha256="dc492f8f17a0746e92081aec3f86ae0b4750bf41607ea2ad87e5a7b5705121b7") depends_on("python@2.7:2.8,3.4:", type=("build", "run")) + depends_on("python@3.6:", type=("build", "run"), when="@2:") depends_on("py-setuptools", type="build") diff --git a/var/spack/repos/builtin/packages/py-ipython/package.py b/var/spack/repos/builtin/packages/py-ipython/package.py index 9e81bf2ba03550..25eafc5c6e41e0 100644 --- a/var/spack/repos/builtin/packages/py-ipython/package.py +++ b/var/spack/repos/builtin/packages/py-ipython/package.py @@ -22,6 +22,9 @@ class PyIpython(PythonPackage): license("BSD-3-Clause") + version("8.28.0", sha256="0d0d15ca1e01faeb868ef56bc7ee5a0de5bd66885735682e8a322ae289a13d1a") + version("8.27.0", sha256="0b99a2dc9f15fd68692e898e5568725c6d49c527d36a9fb5960ffbdeaa82ff7e") + version("8.26.0", sha256="1cec0fbba8404af13facebe83d04436a7434c7400e59f47acf467c64abd0956c") version("8.25.0", sha256="c6ed726a140b6e725b911528f80439c534fac915246af3efc39440a6b0f9d716") version("8.24.0", sha256="010db3f8a728a578bb641fdd06c063b9fb8e96a9464c63aec6310fbcb5e80501") version("8.23.0", sha256="7468edaf4f6de3e1b912e57f66c241e6fd3c7099f2ec2136e239e142e800274d") diff --git a/var/spack/repos/builtin/packages/py-jarvis-util/package.py b/var/spack/repos/builtin/packages/py-jarvis-util/package.py index 48bab7567841d9..beb3554e94802a 100644 --- a/var/spack/repos/builtin/packages/py-jarvis-util/package.py +++ b/var/spack/repos/builtin/packages/py-jarvis-util/package.py @@ -17,6 +17,7 @@ class PyJarvisUtil(PythonPackage): url = "https://github.com/scs-lab/jarvis-util/archive/refs/tags/v0.0.1.tar.gz" maintainers("lukemartinlogan", "hyoklee") + version("master", branch="master") version("0.0.1", sha256="1c5fbbfec410f1df8dc28edc87dd4421c3708f5bd22bf7ef010138d5c4a1ff8f") depends_on("py-setuptools", type="build") diff --git a/var/spack/repos/builtin/packages/py-jaxlib/package.py b/var/spack/repos/builtin/packages/py-jaxlib/package.py index ff67dd46048d12..09eb522c56aa5e 100644 --- a/var/spack/repos/builtin/packages/py-jaxlib/package.py +++ b/var/spack/repos/builtin/packages/py-jaxlib/package.py @@ -7,8 +7,25 @@ from spack.package import * - -class PyJaxlib(PythonPackage, CudaPackage): +rocm_dependencies = [ + "hsa-rocr-dev", + "hip", + "rccl", + "rocprim", + "hipcub", + "rocthrust", + "roctracer-dev", + "rocrand", + "hipsparse", + "hipfft", + "rocfft", + "rocblas", + "miopen-hip", + "rocminfo", +] + + +class PyJaxlib(PythonPackage, CudaPackage, ROCmPackage): """XLA library for Jax""" homepage = "https://github.com/google/jax" @@ -62,6 +79,12 @@ class PyJaxlib(PythonPackage, CudaPackage): depends_on("nccl@2.16:", when="@0.4.18:") depends_on("nccl") + with when("+rocm"): + for pkg_dep in rocm_dependencies: + depends_on(f"{pkg_dep}@6:", when="@0.4.28:") + depends_on(pkg_dep) + depends_on("py-nanobind") + with default_args(type="build"): # .bazelversion depends_on("bazel@6.5.0", when="@0.4.28:") @@ -99,6 +122,12 @@ class PyJaxlib(PythonPackage, CudaPackage): depends_on("py-numpy@:1", when="@:0.4.25") depends_on("py-ml-dtypes@0.4:", when="@0.4.29") + patch( + "https://github.com/google/jax/pull/20101.patch?full_index=1", + sha256="4dfb9f32d4eeb0a0fb3a6f4124c4170e3fe49511f1b768cd634c78d489962275", + when="@:0.4.25", + ) + conflicts( "cuda_arch=none", when="+cuda", @@ -149,14 +178,16 @@ def install(self, spec, prefix): args.append("--enable_cuda") args.append("--cuda_path={0}".format(self.spec["cuda"].prefix)) args.append("--cudnn_path={0}".format(self.spec["cudnn"].prefix)) - capabilities = ",".join( - "{0:.1f}".format(float(i) / 10.0) for i in spec.variants["cuda_arch"].value - ) - args.append("--cuda_compute_capabilities={0}".format(capabilities)) + capabilities = CudaPackage.compute_capabilities(spec.variants["cuda_arch"].value) + args.append("--cuda_compute_capabilities={0}".format(",".join(capabilities))) args.append( "--bazel_startup_options=" "--output_user_root={0}".format(self.wrapped_package_object.buildtmp) ) + if "+rocm" in spec: + args.append("--enable_rocm") + args.append("--rocm_path={0}".format(self.spec["hip"].prefix)) + python(*args) with working_dir(self.wrapped_package_object.tmp_path): args = std_pip_args + ["--prefix=" + self.prefix, "."] diff --git a/var/spack/repos/builtin/packages/py-jinja2/package.py b/var/spack/repos/builtin/packages/py-jinja2/package.py index 07ac0c8acf5358..fe6afd07738810 100644 --- a/var/spack/repos/builtin/packages/py-jinja2/package.py +++ b/var/spack/repos/builtin/packages/py-jinja2/package.py @@ -12,11 +12,12 @@ class PyJinja2(PythonPackage): and an optional sandboxed environment.""" homepage = "https://palletsprojects.com/p/jinja/" - pypi = "Jinja2/Jinja2-2.10.3.tar.gz" + pypi = "jinja2/jinja2-3.1.4.tar.gz" git = "https://github.com/pallets/jinja" license("BSD-3-Clause") + version("3.1.4", sha256="4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369") version("3.1.2", sha256="31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852") version("3.0.3", sha256="611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7") version("3.0.1", sha256="703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4") @@ -33,10 +34,12 @@ class PyJinja2(PythonPackage): variant("i18n", default=False, description="Enables I18N support with Babel") + depends_on("python@3.8:", when="@3.1.4:", type=("build", "run")) depends_on("python@3.7:", when="@3.1:", type=("build", "run")) depends_on("python@3.6:", when="@3:", type=("build", "run")) depends_on("python@2.7:2.8,3.5:", type=("build", "run")) - depends_on("py-setuptools", type="build") + depends_on("py-setuptools", when="@:3.1.3", type="build") + depends_on("py-flit-core@:3", when="@3.1.4:", type="build") depends_on("py-markupsafe@2.0:", when="@3:", type=("build", "run")) depends_on("py-markupsafe@0.23:", type=("build", "run")) depends_on("py-babel@2.7:", when="@3:+i18n", type=("build", "run")) @@ -44,3 +47,11 @@ class PyJinja2(PythonPackage): # https://github.com/pallets/jinja/issues/1585 conflicts("^py-markupsafe@2.1:", when="@:2") + + def url_for_version(self, version): + url = "https://files.pythonhosted.org/packages/source/j/jinja2/" + if self.spec.satisfies("@:3.1.3"): + url += "Jinja2-{0}.tar.gz" + else: + url += "jinja2-{0}.tar.gz" + return url.format(version) diff --git a/var/spack/repos/builtin/packages/py-jiter/package.py b/var/spack/repos/builtin/packages/py-jiter/package.py new file mode 100644 index 00000000000000..466dff204c7306 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-jiter/package.py @@ -0,0 +1,21 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyJiter(PythonPackage): + """Fast iterable JSON parser.""" + + homepage = "https://github.com/pydantic/jiter/" + pypi = "jiter/jiter-0.5.0.tar.gz" + + license("MIT", checked_by="qwertos") + + version("0.5.0", sha256="1d916ba875bcab5c5f7d927df998c4cb694d27dceddf3392e58beaf10563368a") + + depends_on("python@3.8:", type=("build", "run")) + depends_on("py-maturin@1", type="build") + depends_on("rust@1.73:", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-jsonschema-specifications/package.py b/var/spack/repos/builtin/packages/py-jsonschema-specifications/package.py new file mode 100644 index 00000000000000..d595550b83aa8c --- /dev/null +++ b/var/spack/repos/builtin/packages/py-jsonschema-specifications/package.py @@ -0,0 +1,25 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyJsonschemaSpecifications(PythonPackage): + """The JSON Schema meta-schemas and vocabularies, exposed as a Registry.""" + + homepage = "https://jsonschema-specifications.readthedocs.io/" + pypi = "jsonschema_specifications/jsonschema_specifications-2023.12.1.tar.gz" + + maintainers("wdconinc") + + license("MIT", checked_by="wdconinc") + + version("2023.12.1", sha256="48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc") + + depends_on("py-hatchling", type="build") + depends_on("py-hatch-vcs", type="build") + + depends_on("py-referencing@0.31.0:", type=("build", "run")) + depends_on("py-importlib-resources@1.4.0:", type=("build", "run"), when="^python@:3.8") diff --git a/var/spack/repos/builtin/packages/py-jsonschema/package.py b/var/spack/repos/builtin/packages/py-jsonschema/package.py index 2ba338975bbe7b..e2c5e3c6fdf409 100644 --- a/var/spack/repos/builtin/packages/py-jsonschema/package.py +++ b/var/spack/repos/builtin/packages/py-jsonschema/package.py @@ -9,11 +9,16 @@ class PyJsonschema(PythonPackage): """Jsonschema: An(other) implementation of JSON Schema for Python.""" - homepage = "https://github.com/Julian/jsonschema" + homepage = "https://github.com/python-jsonschema/jsonschema" pypi = "jsonschema/jsonschema-3.2.0.tar.gz" - license("MIT") + license("MIT", checked_by="wdconinc") + version("4.22.0", sha256="5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7") + version("4.21.1", sha256="85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5") + version("4.20.0", sha256="4f614fd46d8d61258610998997743ec5492a648b33cf478c1ddc23ed4598a5fa") + version("4.19.2", sha256="c9ff4d7447eed9592c23a12ccee508baf0dd0d59650615e847feb6cdca74f392") + version("4.18.6", sha256="ce71d2f8c7983ef75a756e568317bf54bc531dc3ad7e66a128eae0d51623d8a3") version("4.17.3", sha256="0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d") version("4.16.0", sha256="165059f076eff6971bae5b742fc029a7b4ef3f9bcf04c14e4776a7605de14b23") version("4.10.0", sha256="8ff7b44c6a99c6bfd55ca9ac45261c649cefd40aaba1124c29aaef1bcb378d84") @@ -33,14 +38,17 @@ class PyJsonschema(PythonPackage): description="Enable format-nongpl functionality", ) + depends_on("python@3.8:", when="@4.18:", type="build") + depends_on("py-hatchling", when="@4.10:", type="build") depends_on("py-hatch-vcs", when="@4.10:", type="build") depends_on("py-hatch-fancy-pypi-readme", when="@4.11:", type="build") depends_on("py-attrs@17.4:", when="@3:", type=("build", "run")) - depends_on("py-pyrsistent@0.14:", when="@3:", type=("build", "run")) - depends_on("py-importlib-metadata", when="@3.1.1: ^python@:3.7", type=("build", "run")) - depends_on("py-typing-extensions", when="@4.3: ^python@:3.7", type=("build", "run")) + depends_on("py-attrs@22.2:", when="@4.18:", type=("build", "run")) + depends_on("py-jsonschema-specifications@2023.03.6:", when="@4.18:", type=("build", "run")) + depends_on("py-referencing@0.28.4:", when="@4.18:", type=("build", "run")) + depends_on("py-rpds-py@0.7.1:", when="@4.18:", type=("build", "run")) depends_on("py-importlib-resources@1.4:", when="@4.2.1: ^python@:3.8", type=("build", "run")) depends_on("py-importlib-resources", when="@4.2.0 ^python@:3.8", type=("build", "run")) depends_on("py-pkgutil-resolve-name@1.3.10:", when="@4.10.0: ^python@:3.8") @@ -53,6 +61,9 @@ class PyJsonschema(PythonPackage): depends_on("py-setuptools-scm+toml@3.4:", when="@4.4.0", type="build") depends_on("py-setuptools-scm", when="@3", type="build") depends_on("py-six@1.11:", when="@3", type=("build", "run")) + depends_on("py-pyrsistent@0.14:", when="@3:4.17", type=("build", "run")) + depends_on("py-importlib-metadata", when="@3.1.1:4.17 ^python@:3.7", type=("build", "run")) + depends_on("py-typing-extensions", when="@4.3:4.17 ^python@:3.7", type=("build", "run")) conflicts("^py-pyrsistent@0.17.0:0.17.2") diff --git a/var/spack/repos/builtin/packages/py-keras/package.py b/var/spack/repos/builtin/packages/py-keras/package.py index 548e1a01449f82..0864c36993a842 100644 --- a/var/spack/repos/builtin/packages/py-keras/package.py +++ b/var/spack/repos/builtin/packages/py-keras/package.py @@ -22,6 +22,7 @@ class PyKeras(PythonPackage): maintainers("adamjstewart") license("Apache-2.0") + version("3.6.0", sha256="405727525a3522ed8f9ec0b46e0667e4c65fcf714a067322c16a00d902ded41d") version("3.5.0", sha256="53ae4f9472ec9d9c6941c82a3fda86969724ace3b7630a94ba0a1f17ba1065c3") version("3.4.1", sha256="34cd9aeaa008914715149234c215657ca758e1b473bd2aab2e211ac967d1f8fe") version("3.4.0", sha256="c4b05b150b1c4df27b4a17efd137b2d5e20f385f146fd48636791d675e75059d") @@ -101,17 +102,20 @@ class PyKeras(PythonPackage): # requirements-jax-cuda.txt with when("backend=jax"): - depends_on("py-jax@0.4.23", when="@3.0.5:") + depends_on("py-jax@0.4.28", when="@3.6:") + depends_on("py-jax@0.4.23", when="@3.0.5:3.5") depends_on("py-jax", when="@3:") # requirements-torch-cuda.txt with when("backend=torch"): - depends_on("py-torch@2.4.0", when="@3.5:") + depends_on("py-torch@2.4.1", when="@3.6:") + depends_on("py-torch@2.4.0", when="@3.5") depends_on("py-torch@2.2.1", when="@3.1:3.4") depends_on("py-torch@2.1.2", when="@3.0.3:3.0.5") depends_on("py-torch@2.1.1", when="@3.0.1:3.0.2") depends_on("py-torch@2.1.0", when="@3.0.0") - depends_on("py-torchvision@0.19.0", when="@3.5:") + depends_on("py-torchvision@0.19.1", when="@3.6:") + depends_on("py-torchvision@0.19.0", when="@3.5") depends_on("py-torchvision@0.17.1", when="@3.1:3.4") depends_on("py-torchvision@0.16.2", when="@3.0.3:3.0.5") depends_on("py-torchvision@0.16.1", when="@3.0.1:3.0.2") diff --git a/var/spack/repos/builtin/packages/py-kerberos/package.py b/var/spack/repos/builtin/packages/py-kerberos/package.py index 537c969e06f72d..e63f2859419205 100644 --- a/var/spack/repos/builtin/packages/py-kerberos/package.py +++ b/var/spack/repos/builtin/packages/py-kerberos/package.py @@ -18,6 +18,7 @@ class PyKerberos(PythonPackage): homepage = "https://github.com/apple/ccs-pykerberos" pypi = "kerberos/kerberos-1.3.0.tar.gz" + version("1.3.1", sha256="cdd046142a4e0060f96a00eb13d82a5d9ebc0f2d7934393ed559bac773460a2c") version("1.3.0", sha256="f039b7dd4746df56f6102097b3dc250fe0078be75130b9dc4211a85a3b1ec6a4") depends_on("c", type="build") # generated diff --git a/var/spack/repos/builtin/packages/py-krb5/package.py b/var/spack/repos/builtin/packages/py-krb5/package.py new file mode 100644 index 00000000000000..f87a1b7762fae2 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-krb5/package.py @@ -0,0 +1,25 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyKrb5(PythonPackage): + """Kerberos API bindings for Python.""" + + homepage = "https://github.com/jborean93/pykrb5" + pypi = "krb5/krb5-0.6.0.tar.gz" + + maintainers("wdconinc") + + license("MIT", checked_by="wdconinc") + + version("0.7.0", sha256="6a308f2e17d151c395b24e6aec7bdff6a56fe3627a32042fc86d412398a92ddd") + version("0.6.0", sha256="712ba092fbe3a28ec18820bb1b1ed2cc1037b75c5c7033f970c6a8c97bbd1209") + + depends_on("python@3.8:", type=("build", "run"), when="@0.7.0:") + depends_on("py-setuptools@42:", type="build") + depends_on("py-cython@0.29.32:3", type=("build", "run")) + depends_on("krb5", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-langsmith/package.py b/var/spack/repos/builtin/packages/py-langsmith/package.py index c2f759c9a007de..4c08c78aba0310 100644 --- a/var/spack/repos/builtin/packages/py-langsmith/package.py +++ b/var/spack/repos/builtin/packages/py-langsmith/package.py @@ -13,6 +13,7 @@ class PyLangsmith(PythonPackage): license("MIT") + version("0.1.81", sha256="585ef3a2251380bd2843a664c9a28da4a7d28432e3ee8bcebf291ffb8e1f0af0") version( "0.1.1", sha256="09df0c2ca9085105f97a4e4f281b083e312c99d162f3fe2b2d5eefd5c3692e60", @@ -24,5 +25,7 @@ class PyLangsmith(PythonPackage): depends_on("python@3.8.1:3", type=("build", "run")) depends_on("py-poetry-core", type="build") - depends_on("py-pydantic@1", type=("build", "run")) + depends_on("py-pydantic@1", type=("build", "run"), when="@:0.1.1") + depends_on("py-pydantic@1:2", type=("build", "run"), when="@0.1.81:") depends_on("py-requests@2", type=("build", "run")) + depends_on("py-orjson@3.9.14:3", type=("build", "run"), when="@0.1.81:") diff --git a/var/spack/repos/builtin/packages/py-laspy/package.py b/var/spack/repos/builtin/packages/py-laspy/package.py index 1e90f03aaa58cb..f78b90fa3c0f46 100644 --- a/var/spack/repos/builtin/packages/py-laspy/package.py +++ b/var/spack/repos/builtin/packages/py-laspy/package.py @@ -14,6 +14,7 @@ class PyLaspy(PythonPackage): license("BSD-2-Clause") + version("2.5.4", sha256="eebdbf3379afbc0b24e7e4812fac567bff880d1e851f70175d22375aaecdf7e1") version("2.2.0", sha256="69d36f01acecd719cbe3c3cf58353f247f391ccadb1da37731d45bfe919685df") version("2.0.3", sha256="95c6367bc3a7c1e0d8dc118ae4a6b038bf9e8ad3e60741ecb8d59c36d32f822a") diff --git a/var/spack/repos/builtin/packages/py-linkchecker/package.py b/var/spack/repos/builtin/packages/py-linkchecker/package.py new file mode 100644 index 00000000000000..ac0de717a6e993 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-linkchecker/package.py @@ -0,0 +1,27 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyLinkchecker(PythonPackage): + """Check for broken links in web sites.""" + + homepage = "https://linkchecker.github.io/linkchecker/" + pypi = "LinkChecker/LinkChecker-10.5.0.tar.gz" + + maintainers("rbberger") + + license("GPL-2.0") + + version("10.5.0", sha256="978b42b803e58b7a8f6ffae1ff88fa7fd1e87b944403b5dc82380dd59f516bb9") + + depends_on("python@3.9:", type=("build", "run")) + depends_on("py-requests@2.20:", type=("build", "run")) + depends_on("py-dnspython@2:", type=("build", "run")) + depends_on("py-beautifulsoup4@4.8.1:", type=("build", "run")) + depends_on("py-hatchling@1.8.0:", type="build") + depends_on("py-hatch-vcs", type="build") + depends_on("py-setuptools-scm@7.1.0:", type="build") diff --git a/var/spack/repos/builtin/packages/py-lpips/package.py b/var/spack/repos/builtin/packages/py-lpips/package.py new file mode 100644 index 00000000000000..84472f699fc5c1 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-lpips/package.py @@ -0,0 +1,24 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyLpips(PythonPackage): + """LPIPS Similarity metric""" + + homepage = "https://github.com/richzhang/PerceptualSimilarity" + pypi = "lpips/lpips-0.1.4.tar.gz" + + license("BSD-2-Clause", checked_by="qwertos") + + version("0.1.4", sha256="3846331df6c69688aec3d300a5eeef6c529435bc8460bd58201c3d62e56188fa") + + depends_on("py-setuptools", type="build") + depends_on("py-torch@0.4:", type=("build", "run")) + depends_on("py-torchvision@0.2.1:", type=("build", "run")) + depends_on("py-numpy@1.14.3:", type=("build", "run")) + depends_on("py-scipy@1.0.1:", type=("build", "run")) + depends_on("py-tqdm@4.28.1:", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-lxml/package.py b/var/spack/repos/builtin/packages/py-lxml/package.py index 50f136cbe5bbc9..cda0bd25f67bd7 100644 --- a/var/spack/repos/builtin/packages/py-lxml/package.py +++ b/var/spack/repos/builtin/packages/py-lxml/package.py @@ -16,6 +16,7 @@ class PyLxml(PythonPackage): license("BSD-3-Clause") + version("5.3.0", sha256="4e109ca30d1edec1ac60cdbe341905dc3b8f55b16855e03a54aaf59e51ec8c6f") version("5.2.2", sha256="bb2dc4898180bea79863d5487e5f9c7c34297414bad54bcd0f0852aee9cfdb87") version("4.9.2", sha256="2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67") version("4.9.1", sha256="fe749b052bb7233fe5d072fcb549221a8cb1a16725c47c37e42b0b9cb3ff2c3f") @@ -45,6 +46,7 @@ class PyLxml(PythonPackage): depends_on("py-html5lib", when="+html5", type=("build", "run")) depends_on("py-beautifulsoup4", when="+htmlsoup", type=("build", "run")) depends_on("py-cssselect@0.7:", when="+cssselect", type=("build", "run")) + depends_on("py-cython@3.0.11:", type="build", when="@5.3:") depends_on("py-cython@3.0.10:", type="build", when="@5.2:") depends_on("py-cython@3.0.9:", type="build", when="@5.1.1:") depends_on("py-cython@3.0.8:", type="build", when="@5:") diff --git a/var/spack/repos/builtin/packages/py-mechanize/package.py b/var/spack/repos/builtin/packages/py-mechanize/package.py index 87d28468fa9367..e794a7f874056c 100644 --- a/var/spack/repos/builtin/packages/py-mechanize/package.py +++ b/var/spack/repos/builtin/packages/py-mechanize/package.py @@ -12,8 +12,9 @@ class PyMechanize(PythonPackage): homepage = "https://github.com/python-mechanize/mechanize" pypi = "mechanize/mechanize-0.4.3.tar.gz" - license("BSD-3-Clause") + license("BSD-3-Clause", checked_by="wdconinc") + version("0.4.10", sha256="1dea947f9be7ea0ab610f7bbc4a4e36b45d6bfdfceea29ad3d389a88a1957ddf") version("0.4.3", sha256="d7d7068be5e1b3069575c98c870aaa96dd26603fe8c8697b470e2f65259fddbf") version("0.2.5", sha256="2e67b20d107b30c00ad814891a095048c35d9d8cb9541801cebe85684cc84766") diff --git a/var/spack/repos/builtin/packages/py-mgmetis/package.py b/var/spack/repos/builtin/packages/py-mgmetis/package.py new file mode 100644 index 00000000000000..1f38fddeca9c64 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-mgmetis/package.py @@ -0,0 +1,26 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyMgmetis(PythonPackage): + """METIS partitioner for mesh and graphMETIS partitioner for mesh and graph""" + + homepage = "https://github.com/chiao45/mgmetis" + git = "https://github.com/chiao45/mgmetis.git" + maintainers("tech-91") + + license("MIT") + + version("master", branch="master") + + depends_on("python@3.7:", type=("build", "run")) + depends_on("py-setuptools", type="build") + depends_on("py-numpy@1.20.0:1.26.4", type=("build", "run")) + depends_on("py-cython", type=("build")) + depends_on("py-mpi4py@3.0.3:", type=("build", "run")) + depends_on("py-pytest") + depends_on("metis+shared", type="all") diff --git a/var/spack/repos/builtin/packages/py-monai/package.py b/var/spack/repos/builtin/packages/py-monai/package.py new file mode 100644 index 00000000000000..78f8771c75e388 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-monai/package.py @@ -0,0 +1,29 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyMonai(PythonPackage): + """AI Toolkit for Healthcare Imaging""" + + homepage = "https://monai.io/" + url = "https://github.com/Project-MONAI/MONAI/archive/refs/tags/0.8.1.tar.gz" + + license("Apache-2.0", checked_by="qwertos") + + version("1.3.2", sha256="e370e1fcd78854fb22c2414fa7419c15ff5afce67b923ce666d0f12979015136") + version("0.8.1", sha256="e1227e6406cc47c23f6846f617350879ceba353915b948d917bf4308b17ea861") + version("0.8.0", sha256="a63df7d5a680d9641c223ea090ff843a7d6f20bdb62095bd44f3b0480a4706ed") + + depends_on("python@3.6:", type=("build", "run")) + depends_on("python@3.8:", when="@1.2:", type=("build", "run")) + depends_on("py-ninja", type="build") + depends_on("py-wheel", type="build") + depends_on("py-setuptools", type="build") + depends_on("py-torch@1.6:", type=("build", "run")) + depends_on("py-torch@1.9:", when="@1.3.2:", type=("build", "run")) + depends_on("py-numpy@1.17:", type=("build", "run")) + depends_on("py-numpy@1.20:", when="@1.3.2:", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-mpi4py/package.py b/var/spack/repos/builtin/packages/py-mpi4py/package.py index 3045af9f5312e1..9bb50ac679f7a5 100644 --- a/var/spack/repos/builtin/packages/py-mpi4py/package.py +++ b/var/spack/repos/builtin/packages/py-mpi4py/package.py @@ -16,9 +16,11 @@ class PyMpi4py(PythonPackage): pypi = "mpi4py/mpi4py-3.0.3.tar.gz" git = "https://github.com/mpi4py/mpi4py.git" - license("BSD-2-Clause") + license("BSD-3-Clause", when="@4:") + license("BSD-2-Clause", when="@:3") version("master", branch="master") + version("4.0.0", sha256="820d31ae184d69c17d9b5d55b1d524d56be47d2e6cb318ea4f3e7007feff2ccc") version("3.1.6", sha256="c8fa625e0f92b082ef955bfb52f19fa6691d29273d7d71135d295aa143dee6cb") version("3.1.5", sha256="a706e76db9255135c2fb5d1ef54cb4f7b0e4ad9e33cbada7de27626205f2a153") version("3.1.4", sha256="17858f2ebc623220d0120d1fa8d428d033dde749c4bc35b33d81a66ad7f93480") @@ -33,10 +35,9 @@ class PyMpi4py(PythonPackage): version("1.3.1", sha256="e7bd2044aaac5a6ea87a87b2ecc73b310bb6efe5026031e33067ea3c2efc3507") depends_on("c", type="build") # generated - depends_on("cxx", type="build") # generated - depends_on("fortran", type="build") # generated depends_on("py-setuptools@40.9:", type="build") + depends_on("py-cython@3:", when="@4:", type="build") depends_on("py-cython@0.27:2", when="@:3.1.6", type="build") depends_on("py-cython@0.27:3", when="@master", type="build") depends_on("mpi") diff --git a/var/spack/repos/builtin/packages/py-nanobind/package.py b/var/spack/repos/builtin/packages/py-nanobind/package.py index 5ea6ca685eb448..1147671f6f7533 100644 --- a/var/spack/repos/builtin/packages/py-nanobind/package.py +++ b/var/spack/repos/builtin/packages/py-nanobind/package.py @@ -23,6 +23,12 @@ class PyNanobind(PythonPackage): license("BSD-3-Clause") version("master", branch="master", submodules=True) + version( + "2.2.0", tag="v2.2.0", commit="784efa2a0358a4dc5432c74f5685ee026e20f2b6", submodules=True + ) + version( + "2.1.0", tag="v2.1.0", commit="9641bb7151f04120013b812789b3ebdfa7e7324f", submodules=True + ) version( "2.0.0", tag="v2.0.0", commit="8d7f1ee0621c17fa370b704b2100ffa0243d5bfb", submodules=True ) @@ -57,12 +63,15 @@ class PyNanobind(PythonPackage): depends_on("cxx", type="build") # generated depends_on("python@3.8:", type=("build", "run")) - depends_on("py-setuptools@42:", type="build") - depends_on("py-scikit-build", type="build") - depends_on("py-typing-extensions", when="@2:", type="build") - depends_on("cmake@3.17:", type="build") - depends_on("ninja", type="build") + depends_on("py-setuptools@42:", when="@:2.0", type="build") + depends_on("py-scikit-build", when="@:2.0", type="build") + depends_on("py-typing-extensions", when="@2.0", type="build") + depends_on("ninja", when="@2.0", type="build") + depends_on("cmake@3.17:", when="@:2.0", type="build") + + depends_on("py-scikit-build-core+pyproject@0.9:", when="@2.1", type="build") + depends_on("py-scikit-build-core+pyproject@0.10:", when="@2.2:", type="build") @property def cmake_prefix_paths(self): diff --git a/var/spack/repos/builtin/packages/py-nanoplot/package.py b/var/spack/repos/builtin/packages/py-nanoplot/package.py index 080ae62bf0991f..c7a3ddeda73fbd 100644 --- a/var/spack/repos/builtin/packages/py-nanoplot/package.py +++ b/var/spack/repos/builtin/packages/py-nanoplot/package.py @@ -10,10 +10,11 @@ class PyNanoplot(PythonPackage): """Plotting scripts for long read sequencing data""" homepage = "https://github.com/wdecoster/NanoPlot" - pypi = "NanoPlot/NanoPlot-1.42.0.tar.gz" + pypi = "NanoPlot/nanoplot-1.43.0.tar.gz" maintainers("Pandapip1") + version("1.43.0", sha256="0f94096d689b552c32fd7246ad87cb6d5e5e2499dad5acc551091e0ff67f48df") version("1.42.0", sha256="0f8fd2cffd33a346b3306716058c6cb4091c931e8ab502f10b17a28749e8b6d9") depends_on("py-setuptools", type=("build",)) @@ -24,7 +25,7 @@ class PyNanoplot(PythonPackage): depends_on("py-scipy", type=("build", "run")) depends_on("py-python-dateutil", type=("build", "run")) depends_on("py-nanoget@1.19.1:", type=("build", "run")) - depends_on("py-nanomath@1.0.0:", type=("build", "run")) + depends_on("py-nanomath@1.0.0:", type=("build", "run"), when="@:1.42") depends_on("py-plotly@5.4.0:", type=("build", "run")) depends_on("py-pyarrow", type=("build", "run")) depends_on("py-kaleido", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-narwhals/package.py b/var/spack/repos/builtin/packages/py-narwhals/package.py new file mode 100644 index 00000000000000..48899ac9d0e350 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-narwhals/package.py @@ -0,0 +1,18 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyNarwhals(PythonPackage): + """Extremely lightweight compatibility layer between dataframe libraries""" + + homepage = "https://github.com/narwhals-dev/narwhals" + pypi = "narwhals/narwhals-1.8.1.tar.gz" + + version("1.8.1", sha256="97527778e11f39a1e5e2113b8fbb9ead788be41c0337f21852e684e378f583e8") + + depends_on("python@3.8:", type=("build", "run")) + depends_on("py-hatchling", type=("build")) diff --git a/var/spack/repos/builtin/packages/py-netcdf4/package.py b/var/spack/repos/builtin/packages/py-netcdf4/package.py index e36ed870ea0073..d3559439d4024e 100644 --- a/var/spack/repos/builtin/packages/py-netcdf4/package.py +++ b/var/spack/repos/builtin/packages/py-netcdf4/package.py @@ -10,12 +10,15 @@ class PyNetcdf4(PythonPackage): """Python interface to the netCDF Library.""" homepage = "https://github.com/Unidata/netcdf4-python" - pypi = "netCDF4/netCDF4-1.2.7.tar.gz" + pypi = "netCDF4/netcdf4-1.2.7.tar.gz" maintainers("skosukhin") license("MIT") + version( + "1.7.1.post2", sha256="37d557e36654889d7020192bfb56f9d5f93894cb32997eb837ae586c538fd7b6" + ) version("1.6.5", sha256="824881d0aacfde5bd982d6adedd8574259c85553781e7b83e0ce82b890bfa0ef") version("1.6.2", sha256="0382b02ff6a288419f6ffec85dec40f451f41b8755547154c575ddd9f0f4ae53") version("1.5.8", sha256="ca3d468f4812c0999df86e3f428851fb0c17ac34ce0827115c246b0b690e4e84") @@ -30,6 +33,7 @@ class PyNetcdf4(PythonPackage): depends_on("py-setuptools@61:", when="@1.6.5:", type="build") depends_on("py-setuptools@41.2:", when="@1.6.2:", type="build") depends_on("py-setuptools@18:", when="@1.4.2:1.5.8", type="build") + depends_on("py-setuptools-scm@3.4:+toml", when="@1.7:", type="build") depends_on("py-cftime", type=("build", "run")) depends_on("py-certifi", when="@1.6.5:", type=("build", "run")) depends_on("py-numpy", when="@1.6.5:", type=("build", "link", "run")) @@ -57,9 +61,17 @@ class PyNetcdf4(PythonPackage): when="@1.6: %gcc@14:", ) + def url_for_version(self, version): + url = "https://files.pythonhosted.org/packages/source/n/netCDF4/{}-{}.tar.gz" + if version >= Version("1.7"): + name = "netcdf4" + else: + name = "netCDF4" + return url.format(name, version) + def flag_handler(self, name, flags): if name == "cflags": - if self.spec.satisfies("%oneapi"): + if self.spec.satisfies("%oneapi") or self.spec.satisfies("%apple-clang@15:"): flags.append("-Wno-error=int-conversion") return flags, None, None diff --git a/var/spack/repos/builtin/packages/py-nltk/package.py b/var/spack/repos/builtin/packages/py-nltk/package.py index db9cc2c5b85941..35c9bc5cf9fdcd 100644 --- a/var/spack/repos/builtin/packages/py-nltk/package.py +++ b/var/spack/repos/builtin/packages/py-nltk/package.py @@ -16,13 +16,22 @@ class PyNltk(PythonPackage): license("Apache-2.0") + version("3.9.1", sha256="87d127bd3de4bd89a4f81265e5fa59cb1b199b27440175370f7417d2bc7ae868") version("3.8.1", sha256="1834da3d0682cba4f2cede2f9aad6b0fafb6461ba451db0efb6f9c39798d64d3") version("3.5", sha256="845365449cd8c5f9731f7cb9f8bd6fd0767553b9d53af9eb1b3abf7700936b35") + def url_for_version(self, version): + url = "https://pypi.io/packages/source/n/nltk/nltk-{0}.{1}" + extension = "zip" + if version >= Version("3.9.1"): + extension = "tar.gz" + return url.format(version.dotted, extension) + maintainers("meyersbs") variant("data", default=False, description="Download the NLTK data") + depends_on("python@3.8:", when="@3.9.1:", type=("build", "run")) depends_on("python@3.7:", when="@3.8.1:", type=("build", "run")) depends_on("python@3.5:", type=("build", "run")) depends_on("py-setuptools", type="build") @@ -53,12 +62,21 @@ class PyNltk(PythonPackage): resource( name="punkt", url="https://raw.githubusercontent.com/nltk/nltk_data/gh-pages/packages/tokenizers/punkt.zip", - when="+data", + when="+data@:3.8.1", sha256="51c3078994aeaf650bfc8e028be4fb42b4a0d177d41c012b6a983979653660ec", destination="nltk_data/tokenizers", placement="punkt", ) + resource( + name="punkt_tab", + url="https://raw.githubusercontent.com/nltk/nltk_data/gh-pages/packages/tokenizers/punkt_tab.zip", + when="+data@3.8.2:", + sha256="c2b16c23d738effbdc5789d7aa601397c13ba2819bf922fb904687f3f16657ed", + destination="nltk_data/tokenizers", + placement="punkt_tab", + ) + resource( name="rslp", url="https://raw.githubusercontent.com/nltk/nltk_data/gh-pages/packages/stemmers/rslp.zip", diff --git a/var/spack/repos/builtin/packages/py-non-regression-test-tools/package.py b/var/spack/repos/builtin/packages/py-non-regression-test-tools/package.py new file mode 100644 index 00000000000000..dd5ae0d222dacb --- /dev/null +++ b/var/spack/repos/builtin/packages/py-non-regression-test-tools/package.py @@ -0,0 +1,25 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyNonRegressionTestTools(PythonPackage): + """non regression test tools.""" + + homepage = "https://gitlab.com/Te_ch/non-regression-test-tools" + git = "https://gitlab.com/Te_ch/non-regression-test-tools.git" + + maintainers("tech-91") + + license("GPL-2.0-or-later") + + version("develop", branch="develop") + version("main", branch="main") + version("1.0.2", tag="v1.0.2", preferred=True) + + depends_on("py-numpy", type="run") + depends_on("python@3.7:", type="run") + depends_on("py-setuptools", type="build") diff --git a/var/spack/repos/builtin/packages/py-numpy/package.py b/var/spack/repos/builtin/packages/py-numpy/package.py index 41e1008f6e606f..b90e044306961c 100644 --- a/var/spack/repos/builtin/packages/py-numpy/package.py +++ b/var/spack/repos/builtin/packages/py-numpy/package.py @@ -22,6 +22,7 @@ class PyNumpy(PythonPackage): license("BSD-3-Clause") version("main", branch="main") + version("2.1.2", sha256="13532a088217fa624c99b843eeb54640de23b3414b14aa66d023805eb731066c") version("2.1.1", sha256="d0cf7d55b1051387807405b3898efafa862997b4cba8aa5dbe657be794afeafd") version("2.1.0", sha256="7dc90da0081f7e1da49ec4e398ede6a8e9cc4f5ebe5f9e06b443ed889ee9aaa2") version("2.0.2", sha256="883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78") @@ -413,10 +414,7 @@ def set_blas_lapack(self): @when("@1.26:") def setup_build_environment(self, env): - if self.spec.satisfies("%apple-clang@15:"): - # https://github.com/scipy/scipy/issues/19357 - env.append_flags("LDFLAGS", "-Wl,-ld_classic") - elif self.spec.satisfies("%msvc"): + if self.spec.satisfies("%msvc"): # For meson build system, compiler paths must be in quotes # to prevent paths from being split by spaces. env.set("CC", f'"{self.compiler.cc}"') diff --git a/var/spack/repos/builtin/packages/py-nvidia-dali/package.py b/var/spack/repos/builtin/packages/py-nvidia-dali/package.py index d43371b80db941..248d78fc49d64c 100644 --- a/var/spack/repos/builtin/packages/py-nvidia-dali/package.py +++ b/var/spack/repos/builtin/packages/py-nvidia-dali/package.py @@ -23,10 +23,21 @@ class PyNvidiaDali(PythonPackage): system = platform.system().lower() arch = platform.machine() if "linux" in system and arch == "x86_64": + version( + "1.41.0-cuda120", + sha256="240b4135e7c71c5f669d2f2970fa350f7ad1a0a4aab588a3ced578f9b6d7abd9", + url="https://developer.download.nvidia.com/compute/redist/nvidia-dali-cuda120/nvidia_dali_cuda120-1.41.0-17427117-py3-none-manylinux2014_x86_64.whl", + expand=False, + ) + version( + "1.41.0.cuda110", + sha256="6b12993384b694463c651a6c22621e6982b8834946eefcc864ab061b5c6e972e", + url="https://developer.download.nvidia.com/compute/redist/nvidia-dali-cuda110/nvidia_dali_cuda110-1.41.0-17427118-py3-none-manylinux2014_x86_64.whl", + expand=False, + ) version( "1.36.0-cuda120", sha256="9a7754aacb245785462592aec89cbaec72e0a84d84399a061a563546bbf44805", - preferred=True, url="https://developer.download.nvidia.com/compute/redist/nvidia-dali-cuda120/nvidia_dali_cuda120-1.36.0-13435171-py3-none-manylinux2014_x86_64.whl", expand=False, ) @@ -109,10 +120,21 @@ class PyNvidiaDali(PythonPackage): expand=False, ) elif "linux" in system and arch == "aarch64": + version( + "1.41.0-cuda120", + sha256="5b9eddcd6433244a1c5bec44db71c5dccede7d81f929711c634c4d79f6ce5f81", + url="https://developer.download.nvidia.com/compute/redist/nvidia-dali-cuda120/nvidia_dali_cuda120-1.41.0-17427117-py3-none-manylinux2014_aarch64.whl", + expand=False, + ) + version( + "1.41.0-cuda110", + sha256="7ec004a65ea7c1bd1272f27b3a5aea9f0d74e95e5d54523db2fabbf8b6efedc9", + url="https://developer.download.nvidia.com/compute/redist/nvidia-dali-cuda110/nvidia_dali_cuda110-1.41.0-17427118-py3-none-manylinux2014_aarch64.whl", + expand=False, + ) version( "1.36.0-cuda120", sha256="575ae1ff9b7633c847182163e2d339f2bdafe8dd0ca4ca6e3092a02890f803c2", - preferred=True, url="https://developer.download.nvidia.com/compute/redist/nvidia-dali-cuda120/nvidia_dali_cuda120-1.36.0-13435171-py3-none-manylinux2014_aarch64.whl", expand=False, ) @@ -196,6 +218,7 @@ class PyNvidiaDali(PythonPackage): ) cuda120_versions = ( + "@1.41.0-cuda120", "@1.36.0-cuda120", "@1.27.0-cuda120", "@1.26.0-cuda120", @@ -205,6 +228,7 @@ class PyNvidiaDali(PythonPackage): "@1.22.0-cuda120", ) cuda110_versions = ( + "@1.41.0-cuda110", "@1.36.0-cuda110", "@1.27.0-cuda110", "@1.26.0-cuda110", diff --git a/var/spack/repos/builtin/packages/py-onnx/package.py b/var/spack/repos/builtin/packages/py-onnx/package.py index 63f3869b94a305..446f6217fd37fe 100644 --- a/var/spack/repos/builtin/packages/py-onnx/package.py +++ b/var/spack/repos/builtin/packages/py-onnx/package.py @@ -19,8 +19,9 @@ class PyOnnx(PythonPackage): homepage = "https://github.com/onnx/onnx" pypi = "Onnx/onnx-1.6.0.tar.gz" - license("Apache-2.0") + license("Apache-2.0", checked_by="wdconinc") + version("1.16.2", sha256="b33a282b038813c4b69e73ea65c2909768e8dd6cc10619b70632335daf094646") version("1.16.1", sha256="8299193f0f2a3849bfc069641aa8e4f93696602da8d165632af8ee48ec7556b6") version("1.16.0", sha256="237c6987c6c59d9f44b6136f5819af79574f8d96a760a1fa843bede11f3822f7") version("1.15.0", sha256="b18461a7d38f286618ca2a6e78062a2a9c634ce498e631e708a8041b00094825") @@ -44,6 +45,7 @@ class PyOnnx(PythonPackage): # requirements.txt depends_on("py-setuptools@64:", type="build") depends_on("py-setuptools", type="build") + depends_on("protobuf") depends_on("py-protobuf@3.20.2:", type=("build", "run"), when="@1.15:") depends_on("py-protobuf@3.20.2:3", type=("build", "run"), when="@1.13") depends_on("py-protobuf@3.12.2:3.20.1", type=("build", "run"), when="@1.12") @@ -55,10 +57,11 @@ class PyOnnx(PythonPackage): # https://github.com/protocolbuffers/protobuf/pull/8794, fixed in # https://github.com/onnx/onnx/pull/3112 depends_on("py-protobuf@:3.17", type=("build", "run"), when="@:1.8") - depends_on("py-protobuf+cpp", type=("build", "run")) depends_on("py-numpy", type=("build", "run")) depends_on("py-numpy@1.16.6:", type=("build", "run"), when="@1.8.1:1.13") depends_on("py-numpy@1.20:", type=("build", "run"), when="@1.16.0:") + depends_on("py-numpy@1.21:", type=("build", "run"), when="@1.16.2:") + depends_on("py-numpy@:1", type=("build", "run"), when="@:1.16") # Historical dependencies depends_on("py-six", type=("build", "run"), when="@:1.8.1") @@ -67,3 +70,31 @@ class PyOnnx(PythonPackage): # 'python_out' does not recognize dllexport_decl. patch("remove_dllexport_decl.patch", when="@:1.6.0") + + # Switch the CMAKE_CXX_STANDARD to 17 if abseil-cpp has been built with + # either of those. (abseil-cpp is pulled in via protobuf) + patch( + "https://github.com/onnx/onnx/commit/1f6e43cb4d7366b2dffa7f70ae88198306e12c6c.patch?full_index=1", + sha256="be12f589bc4113982e4162efcdbd95835a6c161a9a7e10cd1dde026cadedf8aa", + when="@1.15.0 ^abseil-cpp cxxstd=17", + ) + patch( + "https://github.com/onnx/onnx/commit/1f6e43cb4d7366b2dffa7f70ae88198306e12c6c.patch?full_index=1", + sha256="be12f589bc4113982e4162efcdbd95835a6c161a9a7e10cd1dde026cadedf8aa", + when="@1.15.0 ^abseil-cpp cxxstd=20", + ) + + # By default, ONNX always uses .setuptools-cmake-build/ under the source path, + # so we allow overriding with a build environment variable + def patch(self): + filter_file( + r"^CMAKE_BUILD_DIR = (.*)$", + r"CMAKE_BUILD_DIR = os.getenv('CMAKE_BUILD_DIR', default=\1)", + "setup.py", + ) + + def setup_build_environment(self, env): + # Build in a similar directory as the CMake packages + env.set( + "CMAKE_BUILD_DIR", join_path(self.stage.path, f"spack-build-{self.spec.dag_hash(7)}") + ) diff --git a/var/spack/repos/builtin/packages/py-onnxruntime/0001-Find-ROCm-Packages-Individually.patch b/var/spack/repos/builtin/packages/py-onnxruntime/0001-Find-ROCm-Packages-Individually.patch new file mode 100644 index 00000000000000..a48c1921828c37 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-onnxruntime/0001-Find-ROCm-Packages-Individually.patch @@ -0,0 +1,45 @@ +From c4930c939cc1c8b4c6122b1e9530942ecd517fb2 Mon Sep 17 00:00:00 2001 +From: Afzal Patel +Date: Tue, 17 Sep 2024 19:33:51 +0000 +Subject: [PATCH] Find individual ROCm dependencies + +--- + cmake/onnxruntime_providers_rocm.cmake | 15 ++++++++++++++- + 1 file changed, 14 insertions(+), 1 deletion(-) + +diff --git a/cmake/onnxruntime_providers_rocm.cmake b/cmake/onnxruntime_providers_rocm.cmake +index b662682915..2e9574c04d 100644 +--- a/cmake/onnxruntime_providers_rocm.cmake ++++ b/cmake/onnxruntime_providers_rocm.cmake +@@ -11,6 +11,12 @@ + find_package(rocblas REQUIRED) + find_package(MIOpen REQUIRED) + find_package(hipfft REQUIRED) ++ find_package(rocrand REQUIRED) ++ find_package(hipsparse REQUIRED) ++ find_package(hipcub REQUIRED) ++ find_package(rocprim REQUIRED) ++ find_package(rocthrust REQUIRED) ++ find_package(hipblas REQUIRED) + + # MIOpen version + if(NOT DEFINED ENV{MIOPEN_PATH}) +@@ -147,7 +153,14 @@ + ${eigen_INCLUDE_DIRS} + PUBLIC + ${onnxruntime_ROCM_HOME}/include +- ${onnxruntime_ROCM_HOME}/include/roctracer) ++ ${onnxruntime_ROCM_HOME}/include/roctracer ++ ${HIPRAND_INCLUDE_DIR} ++ ${ROCRAND_INCLUDE_DIR} ++ ${HIPSPARSE_INCLUDE_DIR} ++ ${HIPCUB_INCLUDE_DIR} ++ ${ROCPRIM_INCLUDE_DIR} ++ ${ROCTHRUST_INCLUDE_DIR} ++ ${HIPBLAS_INCLUDE_DIR}) + + set_target_properties(onnxruntime_providers_rocm PROPERTIES LINKER_LANGUAGE CXX) + set_target_properties(onnxruntime_providers_rocm PROPERTIES FOLDER "ONNXRuntime") +-- +2.43.5 + diff --git a/var/spack/repos/builtin/packages/py-onnxruntime/package.py b/var/spack/repos/builtin/packages/py-onnxruntime/package.py index 14d1f54715ddd8..7ea80f69d69406 100644 --- a/var/spack/repos/builtin/packages/py-onnxruntime/package.py +++ b/var/spack/repos/builtin/packages/py-onnxruntime/package.py @@ -6,7 +6,7 @@ from spack.package import * -class PyOnnxruntime(CMakePackage, PythonExtension): +class PyOnnxruntime(CMakePackage, PythonExtension, ROCmPackage): """ONNX Runtime is a performance-focused complete scoring engine for Open Neural Network Exchange (ONNX) models, with an open extensible architecture to continually address the @@ -22,6 +22,9 @@ class PyOnnxruntime(CMakePackage, PythonExtension): license("MIT") + version("1.18.2", tag="v1.18.2", commit="9691af1a2a17b12af04652f4d8d2a18ce9507025") + version("1.18.1", tag="v1.18.1", commit="387127404e6c1d84b3468c387d864877ed1c67fe") + version("1.18.0", tag="v1.18.0", commit="45737400a2f3015c11f005ed7603611eaed306a6") version("1.17.3", tag="v1.17.3", commit="56b660f36940a919295e6f1e18ad3a9a93a10bf7") version("1.17.1", tag="v1.17.1", commit="8f5c79cb63f09ef1302e85081093a3fe4da1bc7d") version("1.10.0", tag="v1.10.0", commit="0d9030e79888d1d5828730b254fedc53c7b640c1") @@ -50,6 +53,8 @@ class PyOnnxruntime(CMakePackage, PythonExtension): depends_on("py-coloredlogs", when="@1.17:", type=("build", "run")) depends_on("py-flatbuffers", type=("build", "run")) depends_on("py-numpy@1.16.6:", type=("build", "run")) + depends_on("py-numpy@1.21.6:", when="@1.18:", type=("build", "run")) + depends_on("py-numpy@:1", when="@:1.18", type=("build", "run")) depends_on("py-packaging", type=("build", "run")) depends_on("py-protobuf", type=("build", "run")) depends_on("py-sympy@1.1:", type=("build", "run")) @@ -60,6 +65,7 @@ class PyOnnxruntime(CMakePackage, PythonExtension): depends_on("py-cerberus", type=("build", "run")) depends_on("py-onnx", type=("build", "run")) depends_on("py-onnx@:1.15.0", type=("build", "run"), when="@:1.17") + depends_on("py-onnx@:1.16", type=("build", "run"), when="@:1.18") depends_on("zlib-api") depends_on("libpng") depends_on("cuda", when="+cuda") @@ -67,6 +73,35 @@ class PyOnnxruntime(CMakePackage, PythonExtension): depends_on("iconv", type=("build", "link", "run")) depends_on("re2+shared") + rocm_dependencies = [ + "hsa-rocr-dev", + "hip", + "hiprand", + "hipsparse", + "hipfft", + "hipcub", + "hipblas", + "llvm-amdgpu", + "miopen-hip", + "migraphx", + "rocblas", + "rccl", + "rocprim", + "rocminfo", + "rocm-core", + "rocm-cmake", + "roctracer-dev", + "rocthrust", + "rocrand", + "rocsparse", + ] + + with when("+rocm"): + for pkg_dep in rocm_dependencies: + depends_on(f"{pkg_dep}@5.7:6.1", when="@1.17") + depends_on(f"{pkg_dep}@6.1:", when="@1.18:") + depends_on(pkg_dep) + # Adopted from CMS experiment's fork of onnxruntime # https://github.com/cms-externals/onnxruntime/compare/5bc92df...d594f80 patch("cms.patch", level=1, when="@1.7.2") @@ -85,6 +120,10 @@ class PyOnnxruntime(CMakePackage, PythonExtension): when="@1.10:1.15", ) + # ORT is assuming all ROCm components are installed in a single path, + # this patch finds the packages individually + patch("0001-Find-ROCm-Packages-Individually.patch", when="@1.17: +rocm") + dynamic_cpu_arch_values = ("NOAVX", "AVX", "AVX2", "AVX512") variant( @@ -99,10 +138,28 @@ class PyOnnxruntime(CMakePackage, PythonExtension): root_cmakelists_dir = "cmake" build_directory = "." + def patch(self): + if self.spec.satisfies("@1.17 +rocm"): + filter_file( + r"${onnxruntime_ROCM_HOME}/.info/version-dev", + "{0}/.info/version".format(self.spec["rocm-core"].prefix), + "cmake/CMakeLists.txt", + string=True, + ) + if self.spec.satisfies("@1.18: +rocm"): + filter_file( + r"${onnxruntime_ROCM_HOME}/.info/version", + "{0}/.info/version".format(self.spec["rocm-core"].prefix), + "cmake/CMakeLists.txt", + string=True, + ) + def setup_build_environment(self, env): value = self.spec.variants["dynamic_cpu_arch"].value value = self.dynamic_cpu_arch_values.index(value) env.set("MLAS_DYNAMIC_CPU_ARCH", str(value)) + if self.spec.satisfies("+rocm"): + env.set("MIOPEN_PATH", self.spec["miopen-hip"].prefix) def setup_run_environment(self, env): value = self.spec.variants["dynamic_cpu_arch"].value @@ -137,6 +194,18 @@ def cmake_args(self): ) ) + if self.spec.satisfies("+rocm"): + args.extend( + ( + define("CMAKE_HIP_COMPILER", f"{self.spec['llvm-amdgpu'].prefix}/bin/clang++"), + define("onnxruntime_USE_MIGRAPHX", "ON"), + define("onnxruntime_MIGRAPHX_HOME", self.spec["migraphx"].prefix), + define("onnxruntime_USE_ROCM", "ON"), + define("onnxruntime_ROCM_HOME", self.spec["hip"].prefix), + define("onnxruntime_ROCM_VERSION", self.spec["hip"].version), + define("onnxruntime_USE_COMPOSABLE_KERNEL", "OFF"), + ) + ) return args @run_after("install") diff --git a/var/spack/repos/builtin/packages/py-owslib/package.py b/var/spack/repos/builtin/packages/py-owslib/package.py index 47a9c79065a1f3..9cd6265bbe2618 100644 --- a/var/spack/repos/builtin/packages/py-owslib/package.py +++ b/var/spack/repos/builtin/packages/py-owslib/package.py @@ -16,6 +16,7 @@ class PyOwslib(PythonPackage): license("BSD-3-Clause") + version("0.31.0", sha256="2ed6540087445cc57d905138a590b6ae58624ec7661b5c1682ed4e3303bcd150") version("0.25.0", sha256="20d79bce0be10277caa36f3134826bd0065325df0301a55b2c8b1c338d8d8f0a") version("0.17.1", sha256="b2e7fd694d3cffcee79317bad492d60c0aa887aea6916517c051c3247b33b5a5") version("0.16.0", sha256="ec95a5e93c145a5d84b0074b9ea27570943486552a669151140debf08a100554") @@ -23,9 +24,10 @@ class PyOwslib(PythonPackage): depends_on("python@3.6:", when="@0.19.2:", type=("build", "run")) depends_on("python@3.5:", when="@0.19.1:", type=("build", "run")) depends_on("py-setuptools", type="build") + depends_on("py-lxml", when="@0.31:", type=("build", "run")) depends_on("py-python-dateutil@1.5:", type=("build", "run")) depends_on("py-pytz", type=("build", "run")) - depends_on("py-requests@1:", type=("build", "run")) - depends_on("py-pyproj", type=("build", "run")) - depends_on("py-pyproj@2:", when="@0.19.2:", type=("build", "run")) depends_on("py-pyyaml", when="@0.19.2:", type=("build", "run")) + depends_on("py-requests@1:", type=("build", "run")) + depends_on("py-pyproj@2:", when="@0.19.2:0.25", type=("build", "run")) + depends_on("py-pyproj", when="@:0.25", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-packaging/package.py b/var/spack/repos/builtin/packages/py-packaging/package.py index 240e8c489497da..ed01a543314fdd 100644 --- a/var/spack/repos/builtin/packages/py-packaging/package.py +++ b/var/spack/repos/builtin/packages/py-packaging/package.py @@ -13,7 +13,8 @@ class PyPackaging(PythonPackage): pypi = "packaging/packaging-19.2.tar.gz" license("BSD-2-Clause") - + version("24.1", sha256="026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002") + version("23.2", sha256="048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5") version("23.1", sha256="a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f") version("23.0", sha256="b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97") version("21.3", sha256="dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb") @@ -29,6 +30,7 @@ class PyPackaging(PythonPackage): # Needed to bootstrap Spack correctly on Python 3.6 (rhel8 platform-python) depends_on("python@3.7:", when="@22:", type=("build", "run")) + depends_on("python@3.8:", when="@24.1", type=("build", "run")) # Historical dependencies depends_on("py-setuptools@40.8.0:", when="@20.8:21", type="build") diff --git a/var/spack/repos/builtin/packages/py-pandas-datareader/package.py b/var/spack/repos/builtin/packages/py-pandas-datareader/package.py new file mode 100644 index 00000000000000..6da8b1d9dc5721 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-pandas-datareader/package.py @@ -0,0 +1,29 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyPandasDatareader(PythonPackage): + """Up-to-date remote data access for pandas. Works for multiple versions of pandas""" + + homepage = "https://pypi.org/project/pandas-datareader" + pypi = "pandas-datareader/pandas-datareader-0.10.0.tar.gz" + git = "https://github.com/pydata/pandas-datareader.git" + + maintainers("climbfuji") + + license("BSD-3-Clause", checked_by="climbfuji") + + version("0.10.0", sha256="9fc3c63d39bc0c10c2683f1c6d503ff625020383e38f6cbe14134826b454d5a6") + + depends_on("python@3.8:", type=("build", "run")) + depends_on("py-setuptools@0.64:", type="build") + depends_on("py-setuptools-scm@8", type="build") + + depends_on("py-lxml", type="run") + depends_on("py-pandas@1.5.3:", type="run") + depends_on("py-statsmodels@0.12:", type="run") + depends_on("py-requests@2.19:", type="run") diff --git a/var/spack/repos/builtin/packages/py-pandas/package.py b/var/spack/repos/builtin/packages/py-pandas/package.py index ae9d8dc1bd1951..63c6597b51c173 100644 --- a/var/spack/repos/builtin/packages/py-pandas/package.py +++ b/var/spack/repos/builtin/packages/py-pandas/package.py @@ -20,6 +20,7 @@ class PyPandas(PythonPackage): license("Apache-2.0") maintainers("adamjstewart", "rgommers") + version("2.2.3", sha256="4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667") version("2.2.2", sha256="9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54") version("2.2.1", sha256="0ab90f87093c13f3e8fa45b48ba9f39181046e8f3317d3aadb2fffbb1b978572") version("2.2.0", sha256="30b83f7c3eb217fb4d1b494a57a2fda5444f17834f5df2de6b2ffff68dc3c8e2") @@ -68,90 +69,94 @@ class PyPandas(PythonPackage): version("0.25.3", sha256="52da74df8a9c9a103af0a72c9d5fdc8e0183a90884278db7f386b5692a2220a4") version("0.25.2", sha256="ca91a19d1f0a280874a24dca44aadce42da7f3a7edb7e9ab7c7baad8febee2be") - depends_on("c", type="build") # generated - variant("performance", default=True, description="Build recommended performance dependencies") variant("excel", when="@1.4:", default=False, description="Build with support for Excel") - # Based on PyPI wheel versions - depends_on("python@3.9:3.12", when="@2.1.1:", type=("build", "run")) - depends_on("python@3.9:3.11", when="@2.1.0", type=("build", "run")) - depends_on("python@3.8:3.11", when="@1.5:2.0", type=("build", "run")) - depends_on("python@3.8:3.10", when="@1.4", type=("build", "run")) - depends_on("python@:3.10", when="@1.3.3:1.3", type=("build", "run")) - depends_on("python@:3.9", when="@1.1.3:1.3.2", type=("build", "run")) - depends_on("python@:3.8", when="@0.25.2:1.1.2", type=("build", "run")) - - depends_on("py-meson-python@0.13.1", when="@2.1:", type="build") - depends_on("meson@1.2.1", when="@2.1.1:", type="build") - depends_on("meson@1.0.1", when="@2.1.0", type="build") - depends_on("py-cython@3.0.5", when="@2.2:", type="build") - depends_on("py-cython@0.29.33:2", when="@2.0:2.1", type="build") - depends_on("py-cython@0.29.32:2", when="@1.4.4:1", type="build") - depends_on("py-cython@0.29.30:2", when="@1.4.3", type="build") - depends_on("py-cython@0.29.24:2", when="@1.3.4:1.4.2", type="build") - depends_on("py-cython@0.29.21:2", when="@1.1.3:1.3.3", type="build") - depends_on("py-cython@0.29.16:2", when="@1.1.0:1.1.2", type="build") - depends_on("py-cython@0.29.13:2", when="@1.0", type="build") - depends_on("py-versioneer+toml", when="@2:", type="build") - - depends_on("py-numpy@1.22.4:", when="@2.1:", type=("build", "run")) - depends_on("py-numpy@1.20.3:", when="@1.5:", type=("build", "run")) - depends_on("py-numpy@1.18.5:", when="@1.4", type=("build", "run")) - depends_on("py-numpy@1.17.3:", when="@1.3", type=("build", "run")) - depends_on("py-numpy@1.16.5:", when="@1.2", type=("build", "run")) - depends_on("py-numpy@1.15.4:", when="@1.1", type=("build", "run")) - depends_on("py-numpy@1.13.3:", when="@1.0", type=("build", "run")) - # 'NUMPY_IMPORT_ARRAY_RETVAL' was removed in numpy@1.19 - depends_on("py-numpy@1.13.3:1.18", when="@0.25", type=("build", "run")) - # https://github.com/pandas-dev/pandas/issues/55519 - depends_on("py-numpy@:1", when="@:2.2.1", type=("build", "run")) - depends_on("py-python-dateutil@2.8.2:", when="@2:", type=("build", "run")) - depends_on("py-python-dateutil@2.8.1:", when="@1.4:", type=("build", "run")) - depends_on("py-python-dateutil@2.7.3:", when="@1.1:", type=("build", "run")) - depends_on("py-python-dateutil@2.6.1:", when="@0.25:", type=("build", "run")) - depends_on("py-python-dateutil", type=("build", "run")) - depends_on("py-pytz@2020.1:", when="@1.4:", type=("build", "run")) - depends_on("py-pytz@2017.3:", when="@1.2:", type=("build", "run")) - depends_on("py-pytz@2017.2:", type=("build", "run")) - depends_on("py-tzdata@2022.1:", when="@2:", type=("build", "run")) - - with when("+performance"): - depends_on("py-bottleneck@1.3.4:", when="@2.1:", type="run") - depends_on("py-bottleneck@1.3.2:", when="@1.5:", type="run") - depends_on("py-bottleneck@1.3.1:", when="@1.4:", type="run") - depends_on("py-bottleneck@1.2.1:", when="@0.25:", type="run") - depends_on("py-numba@0.55.2:", when="@2.1:", type="run") - depends_on("py-numba@0.53.1:", when="@2.0:", type="run") - depends_on("py-numexpr@2.8.0:", when="@2.1:", type="run") - depends_on("py-numexpr@2.7.3:", when="@1.5:", type="run") - depends_on("py-numexpr@2.7.1:", when="@1.4:", type="run") - depends_on("py-numexpr@2.7.0:", when="@1.3:", type="run") - depends_on("py-numexpr@2.6.8:", when="@1.2:", type="run") - depends_on("py-numexpr@2.6.2:", when="@0.25:", type="run") - - with when("+excel"): - # Excel dependencies for 1.4+ (not coded up for earlier versions) - depends_on("py-odfpy@1.4.1:", type="run", when="@2.0:") - depends_on("py-openpyxl@3.1:", type="run", when="@2.2:") - depends_on("py-openpyxl@3.0.10:", type="run", when="@2.1:") - depends_on("py-openpyxl@3.0.7:", type="run", when="@1.5:") - depends_on("py-openpyxl@3.0.3:", type="run", when="@1.4:") - depends_on("py-python-calamine@0.1.7:", type="run", when="@2.2:") - depends_on("py-pyxlsb@1.0.10:", type="run", when="@2.2:") - depends_on("py-pyxlsb@1.0.9:", type="run", when="@2.1:") - depends_on("py-pyxlsb@1.0.8:", type="run", when="@1.5:") - depends_on("py-pyxlsb@1.0.6:", type="run", when="@1.4:") - depends_on("py-xlrd@2.0.1:", type="run", when="@2.2:") - depends_on("py-xlrd@2.0.1:", type="run", when="@1.4:") - depends_on("py-xlwt@1.3.0:", type="run", when="@1.4:1.5") - depends_on("py-xlsxwriter@3.0.5:", type="run", when="@2.2:") - depends_on("py-xlsxwriter@3.0.3:", type="run", when="@2.1:") - depends_on("py-xlsxwriter@1.4.3:", type="run", when="@1.5:") - depends_on("py-xlsxwriter@1.2.2:", type="run", when="@1.4:") - - # Historical dependencies - depends_on("py-setuptools@61:", when="@2.0", type="build") - depends_on("py-setuptools@51:", when="@1.3.2:1", type="build") - depends_on("py-setuptools@38.6:", when="@1.3.0:1.3.1", type="build") - depends_on("py-setuptools@24.2:", when="@:1.2", type="build") + depends_on("c", type="build") + + with default_args(type="build"): + depends_on("py-meson-python@0.13.1:", when="@2.1:") + depends_on("meson@1.2.1:", when="@2.1.1:") + depends_on("meson@1.0.1:", when="@2.1.0") + depends_on("py-cython@3.0.5:", when="@2.2:") + depends_on("py-cython@0.29.33:2", when="@2.0:2.1") + depends_on("py-cython@0.29.32:2", when="@1.4.4:1") + depends_on("py-cython@0.29.30:2", when="@1.4.3") + depends_on("py-cython@0.29.24:2", when="@1.3.4:1.4.2") + depends_on("py-cython@0.29.21:2", when="@1.1.3:1.3.3") + depends_on("py-cython@0.29.16:2", when="@1.1.0:1.1.2") + depends_on("py-cython@0.29.13:2", when="@1.0") + depends_on("py-versioneer+toml", when="@2:") + + # Historical dependencies + depends_on("py-setuptools@61:", when="@2.0") + depends_on("py-setuptools@51:", when="@1.3.2:1") + depends_on("py-setuptools@38.6:", when="@1.3.0:1.3.1") + depends_on("py-setuptools@24.2:", when="@:1.2") + + with default_args(type=("build", "run")): + # Based on PyPI wheel versions + depends_on("python@3.9:3.13", when="@2.2.3:") + depends_on("python@3.9:3.12", when="@2.1.1:") + depends_on("python@3.9:3.11", when="@2.1.0") + depends_on("python@3.8:3.11", when="@1.5:2.0") + depends_on("python@3.8:3.10", when="@1.4") + depends_on("python@:3.10", when="@1.3.3:1.3") + depends_on("python@:3.9", when="@1.1.3:1.3.2") + depends_on("python@:3.8", when="@0.25.2:1.1.2") + + depends_on("py-numpy@1.22.4:", when="@2.1:") + depends_on("py-numpy@1.20.3:", when="@1.5:") + depends_on("py-numpy@1.18.5:", when="@1.4") + depends_on("py-numpy@1.17.3:", when="@1.3") + depends_on("py-numpy@1.16.5:", when="@1.2") + depends_on("py-numpy@1.15.4:", when="@1.1") + depends_on("py-numpy@1.13.3:", when="@1.0") + # 'NUMPY_IMPORT_ARRAY_RETVAL' was removed in numpy@1.19 + depends_on("py-numpy@1.13.3:1.18", when="@0.25") + # https://github.com/pandas-dev/pandas/issues/55519 + depends_on("py-numpy@:1", when="@:2.2.1") + depends_on("py-python-dateutil@2.8.2:", when="@2:") + depends_on("py-python-dateutil@2.8.1:", when="@1.4:") + depends_on("py-python-dateutil@2.7.3:", when="@1.1:") + depends_on("py-python-dateutil@2.6.1:", when="@0.25:") + depends_on("py-python-dateutil") + depends_on("py-pytz@2020.1:", when="@1.4:") + depends_on("py-pytz@2017.3:", when="@1.2:") + depends_on("py-pytz@2017.2:") + depends_on("py-tzdata@2022.1:", when="@2:") + + with default_args(type="run"): + with when("+performance"): + depends_on("py-bottleneck@1.3.4:", when="@2.1:") + depends_on("py-bottleneck@1.3.2:", when="@1.5:") + depends_on("py-bottleneck@1.3.1:", when="@1.4:") + depends_on("py-bottleneck@1.2.1:", when="@0.25:") + depends_on("py-numba@0.55.2:", when="@2.1:") + depends_on("py-numba@0.53.1:", when="@2.0:") + depends_on("py-numexpr@2.8.0:", when="@2.1:") + depends_on("py-numexpr@2.7.3:", when="@1.5:") + depends_on("py-numexpr@2.7.1:", when="@1.4:") + depends_on("py-numexpr@2.7.0:", when="@1.3:") + depends_on("py-numexpr@2.6.8:", when="@1.2:") + depends_on("py-numexpr@2.6.2:", when="@0.25:") + + with when("+excel"): + # Excel dependencies for 1.4+ (not coded up for earlier versions) + depends_on("py-odfpy@1.4.1:", when="@2.0:") + depends_on("py-openpyxl@3.1:", when="@2.2:") + depends_on("py-openpyxl@3.0.10:", when="@2.1:") + depends_on("py-openpyxl@3.0.7:", when="@1.5:") + depends_on("py-openpyxl@3.0.3:", when="@1.4:") + depends_on("py-python-calamine@0.1.7:", when="@2.2:") + depends_on("py-pyxlsb@1.0.10:", when="@2.2:") + depends_on("py-pyxlsb@1.0.9:", when="@2.1:") + depends_on("py-pyxlsb@1.0.8:", when="@1.5:") + depends_on("py-pyxlsb@1.0.6:", when="@1.4:") + depends_on("py-xlrd@2.0.1:", when="@2.2:") + depends_on("py-xlrd@2.0.1:", when="@1.4:") + depends_on("py-xlwt@1.3.0:", when="@1.4:1.5") + depends_on("py-xlsxwriter@3.0.5:", when="@2.2:") + depends_on("py-xlsxwriter@3.0.3:", when="@2.1:") + depends_on("py-xlsxwriter@1.4.3:", when="@1.5:") + depends_on("py-xlsxwriter@1.2.2:", when="@1.4:") diff --git a/var/spack/repos/builtin/packages/py-paramiko/package.py b/var/spack/repos/builtin/packages/py-paramiko/package.py index 2f2675656f60e1..3f586403d0098e 100644 --- a/var/spack/repos/builtin/packages/py-paramiko/package.py +++ b/var/spack/repos/builtin/packages/py-paramiko/package.py @@ -14,6 +14,12 @@ class PyParamiko(PythonPackage): license("LGPL-2.1-or-later") + version("3.4.0", sha256="aac08f26a31dc4dffd92821527d1682d99d52f9ef6851968114a8728f3c274d3") + version("3.3.1", sha256="6a3777a961ac86dbef375c5f5b8d50014a1a96d0fd7f054a43bc880134b0ff77") + version("3.3.0", sha256="ef639f5b97cf7bde57b6e1706e85b7e3f5561f632e180c6c155f53560ff1701b") + version("3.2.0", sha256="93cdce625a8a1dc12204439d45033f3261bdb2c201648cfcdc06f9fd0f94ec29") + version("3.1.0", sha256="6950faca6819acd3219d4ae694a23c7a87ee38d084f70c1724b0c0dbb8b75769") + version("3.0.0", sha256="fedc9b1dd43bc1d45f67f1ceca10bc336605427a46dcdf8dec6bfea3edf57965") version("2.12.0", sha256="376885c05c5d6aa6e1f4608aac2a6b5b0548b1add40274477324605903d9cd49") version("2.9.2", sha256="944a9e5dbdd413ab6c7951ea46b0ab40713235a9c4c5ca81cfe45c6f14fa677b") version("2.7.1", sha256="920492895db8013f6cc0179293147f830b8c7b21fdfc839b6bad760c27459d9f") @@ -23,11 +29,15 @@ class PyParamiko(PythonPackage): depends_on("py-setuptools", type="build") depends_on("py-bcrypt@3.1.3:", when="@2.7:", type=("build", "run")) + depends_on("py-bcrypt@3.2:", when="@3:", type=("build", "run")) depends_on("py-cryptography@1.1:", type=("build", "run")) depends_on("py-cryptography@2.5:", when="@2.7:", type=("build", "run")) + depends_on("py-cryptography@3.3:", when="@3:", type=("build", "run")) depends_on("py-pyasn1@0.1.7:", when="@:2.1", type=("build", "run")) depends_on("py-pynacl@1.0.1:", when="@2.7:", type=("build", "run")) - depends_on("py-six", when="@2.9.3:", type=("build", "run")) + depends_on("py-pynacl@1.5:", when="@3:", type=("build", "run")) + depends_on("py-six", when="@2.9.3:2", type=("build", "run")) depends_on("py-invoke@1.3:", when="+invoke", type=("build", "run")) + depends_on("py-invoke@2:", when="@3: +invoke", type=("build", "run")) conflicts("+invoke", when="@2.1.2") diff --git a/var/spack/repos/builtin/packages/py-pdb-tools/package.py b/var/spack/repos/builtin/packages/py-pdb-tools/package.py new file mode 100644 index 00000000000000..8cf360160bb3e1 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-pdb-tools/package.py @@ -0,0 +1,19 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyPdbTools(PythonPackage): + """A swiss army knife for manipulating and editing PDB files.""" + + homepage = "https://haddocking.github.io/pdb-tools/" + pypi = "pdb-tools/pdb-tools-2.5.0.tar.gz" + + license("Apache 2.0") + + version("2.5.0", sha256="b76c4cd6304a15e545eff2737a76b71db31b881573e5ba3a93dba9a71a79653b") + + depends_on("py-setuptools", type="build") diff --git a/var/spack/repos/builtin/packages/py-petsc4py/package.py b/var/spack/repos/builtin/packages/py-petsc4py/package.py index 9bc1a20049afbf..38a79296de536c 100644 --- a/var/spack/repos/builtin/packages/py-petsc4py/package.py +++ b/var/spack/repos/builtin/packages/py-petsc4py/package.py @@ -20,6 +20,8 @@ class PyPetsc4py(PythonPackage): license("BSD-2-Clause") version("main", branch="main") + version("3.22.0", sha256="b35fc833d41c7969be8a530494fcc81741d77e0dc33fba2f4050cdbd0ad881ae") + version("3.21.6", sha256="d7a6d41e1463b04b9711b53b347d15f590f9354fae37aae14ad69100286129aa") version("3.21.5", sha256="70e6fa795e9abd8014faec0203cd0cc3efd79f4647c97cafc33776421c9ab1e8") version("3.21.4", sha256="4ba702558cc91186912eeacef26b171255f3adaa7ea02bec40c2f4c919eccecd") version("3.21.3", sha256="1c3664d5b527354171077c89c4b1fef3df4a41be7196d12bca74b2759c7e2648") @@ -90,7 +92,19 @@ class PyPetsc4py(PythonPackage): depends_on("petsc+mpi", when="+mpi") depends_on("petsc~mpi", when="~mpi") depends_on("petsc@main", when="@main") - for ver in ["3.21", "3.20", "3.19", "3.18", "3.17", "3.16", "3.15", "3.13", "3.12", "3.11"]: + for ver in [ + "3.22", + "3.21", + "3.20", + "3.19", + "3.18", + "3.17", + "3.16", + "3.15", + "3.13", + "3.12", + "3.11", + ]: depends_on(f"petsc@{ver}", when=f"@{ver}") depends_on("petsc@3.14.2:3.14", when="@3.14.1:3.14") depends_on("petsc@3.14.0:3.14.1", when="@3.14.0") diff --git a/var/spack/repos/builtin/packages/py-pexpect/package.py b/var/spack/repos/builtin/packages/py-pexpect/package.py index 8507059bace6cf..d6b7759fef7100 100644 --- a/var/spack/repos/builtin/packages/py-pexpect/package.py +++ b/var/spack/repos/builtin/packages/py-pexpect/package.py @@ -9,8 +9,14 @@ class PyPexpect(PythonPackage): """Pexpect allows easy control of interactive console applications.""" + homepage = "https://pexpect.readthedocs.io/en/stable/" pypi = "pexpect/pexpect-4.2.1.tar.gz" + maintainers("TomMelt") + + license("ISC", checked_by="tommelt") + + version("4.9.0", sha256="ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f") version("4.8.0", sha256="fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c") version("4.7.0", sha256="9e2c1fd0e6ee3a49b28f95d4b33bc389c89b20af6a1255906e90ff1262ce62eb") version("4.6.0", sha256="2a8e88259839571d1251d278476f3eec5db26deb73a70be5ed5dc5435e418aba") diff --git a/var/spack/repos/builtin/packages/py-picmistandard/package.py b/var/spack/repos/builtin/packages/py-picmistandard/package.py index fd0998176f95d0..b35dc0a4eef19b 100644 --- a/var/spack/repos/builtin/packages/py-picmistandard/package.py +++ b/var/spack/repos/builtin/packages/py-picmistandard/package.py @@ -11,11 +11,12 @@ class PyPicmistandard(PythonPackage): homepage = "https://picmi-standard.github.io" git = "https://github.com/picmi-standard/picmi.git" - pypi = "picmistandard/picmistandard-0.29.0.tar.gz" + pypi = "picmistandard/picmistandard-0.30.0.tar.gz" maintainers("ax3l", "dpgrote", "RemiLehe") version("master", branch="master") + version("0.30.0", sha256="28b892b242e0cc044ad987d6bdc12811fe4a478d5096d6bc5989038ee9d9dab6") version("0.29.0", sha256="dc0bf3ddd3635df9935ac569b3085de387150c4f8e9851897078bb12d123dde8") version("0.28.0", sha256="aa980b0fb49fc3ff9c7e32b5927b3700c4660aefbf96567bac1f8c9c93bb7831") version("0.26.0", sha256="b22689f576d064bf0cd8f435621e912359fc2ee9347350eab845d2d36ebb62eb") @@ -49,14 +50,7 @@ class PyPicmistandard(PythonPackage): deprecated=True, ) - depends_on("python@3.6:", type=("build", "run")) - depends_on("py-numpy@1.15:", type=("build", "run")) - depends_on("py-scipy@1.5:", type=("build", "run")) + depends_on("python@3.8:", type=("build", "run")) + depends_on("py-numpy@1.15:1", type=("build", "run")) + depends_on("py-scipy@1.5:1", type=("build", "run")) depends_on("py-setuptools", type="build") - - @property - def build_directory(self): - if self.spec.satisfies("@develop") or self.spec.satisfies("@0.0.16"): - return "PICMI_Python" - else: - return "./" diff --git a/var/spack/repos/builtin/packages/py-pillow-simd/package.py b/var/spack/repos/builtin/packages/py-pillow-simd/package.py index e3d71e68d65c81..59dd312678a0f5 100644 --- a/var/spack/repos/builtin/packages/py-pillow-simd/package.py +++ b/var/spack/repos/builtin/packages/py-pillow-simd/package.py @@ -16,6 +16,9 @@ class PyPillowSimd(PyPillowBase): homepage = "https://github.com/uploadcare/pillow-simd" pypi = "Pillow-SIMD/Pillow-SIMD-7.0.0.post3.tar.gz" + version( + "9.5.0.post1", sha256="8c89b85c4085532752625f2cc066a28547cebb98529acf932d5d84c1a7ab2abc" + ) version( "9.0.0.post1", sha256="918541cfaa90ba3c0e1bae5da31ba1b1f52b09c0009bd90183b787af4e018263" ) @@ -28,7 +31,7 @@ class PyPillowSimd(PyPillowBase): depends_on("c", type="build") # generated - for ver in ["6.2.2.post1", "7.0.0.post3", "9.0.0.post1"]: + for ver in ["6.2.2.post1", "7.0.0.post3", "9.0.0.post1", "9.5.0.post1"]: provides("pil@" + ver, when="@" + ver) conflicts("target=aarch64:") diff --git a/var/spack/repos/builtin/packages/py-pip/package.py b/var/spack/repos/builtin/packages/py-pip/package.py index 111e50911b87b1..8d7dd6561c5631 100644 --- a/var/spack/repos/builtin/packages/py-pip/package.py +++ b/var/spack/repos/builtin/packages/py-pip/package.py @@ -48,11 +48,20 @@ class PyPip(Package, PythonExtension): name="pip-bootstrap", url="https://bootstrap.pypa.io/pip/zipapp/pip-22.3.1.pyz", checksum="c9363c70ad91d463f9492a8a2c89f60068f86b0239bd2a6aa77367aab5fefb3e", - when="platform=windows", + when="platform=windows ^python@:3.11", placement={"pip-22.3.1.pyz": "pip.pyz"}, expand=False, ) + resource( + name="pip-bootstrap", + url="https://bootstrap.pypa.io/pip/zipapp/pip-23.1.pyz", + checksum="d9f2fe58c472f9107964df35954f8b74e68c307497a12364b00dc28f36f96816", + when="platform=windows ^python@3.12:", + placement={"pip-23.1.pyz": "pip.pyz"}, + expand=False, + ) + def url_for_version(self, version): url = "https://files.pythonhosted.org/packages/{0}/p/pip/pip-{1}-{0}-none-any.whl" if version >= Version("21"): diff --git a/var/spack/repos/builtin/packages/py-plotille/package.py b/var/spack/repos/builtin/packages/py-plotille/package.py new file mode 100644 index 00000000000000..a232da9a56a8eb --- /dev/null +++ b/var/spack/repos/builtin/packages/py-plotille/package.py @@ -0,0 +1,20 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyPlotille(PythonPackage): + """Plot in the terminal using braille dots.""" + + homepage = "https://github.com/tammoippen/plotille" + pypi = "plotille/plotille-5.0.0.tar.gz" + git = "https://github.com/tammoippen/plotille.git" + + version("5.0.0", sha256="99e5ca51a2e4c922ead3a3b0863cc2c6a9a4b3f701944589df10f42ce02ab3dc") + + license("MIT") + depends_on("python@3.7:", type=("build", "run")) + depends_on("py-setuptools", type="build") diff --git a/var/spack/repos/builtin/packages/py-poxy/package.py b/var/spack/repos/builtin/packages/py-poxy/package.py new file mode 100644 index 00000000000000..9a4dcf5d56443d --- /dev/null +++ b/var/spack/repos/builtin/packages/py-poxy/package.py @@ -0,0 +1,35 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyPoxy(PythonPackage): + """Documentation generator for C++""" + + homepage = "https://github.com/marzer/poxy" + pypi = "poxy/poxy-0.18.0.tar.gz" + + license("MIT", checked_by="pranav-sivaraman") + + version("0.18.0", sha256="f5da8ff04ec08859bfd1c8ec6ef61b70e3af630915a4cce6a3e377eec3bcd3d4") + + depends_on("py-setuptools", type="build") + + with default_args(type=("build", "run")): + depends_on("python@3.7:") + depends_on("py-misk@0.8.1:") + depends_on("py-beautifulsoup4") + depends_on("py-jinja2") + depends_on("py-pygments") + depends_on("py-html5lib") + depends_on("py-lxml") + depends_on("py-tomli") + depends_on("py-schema") + depends_on("py-requests") + depends_on("py-trieregex") + depends_on("py-colorama") + + conflicts("py-schema@=0.7.5") diff --git a/var/spack/repos/builtin/packages/py-poyo/package.py b/var/spack/repos/builtin/packages/py-poyo/package.py index d6011ec5cec698..9a3c1fe27d1d96 100644 --- a/var/spack/repos/builtin/packages/py-poyo/package.py +++ b/var/spack/repos/builtin/packages/py-poyo/package.py @@ -14,6 +14,7 @@ class PyPoyo(PythonPackage): license("MIT") + version("0.5.0", sha256="cf75b237ff3efdde8a573512d7356c428033c77a6ccee50a89496b2654cf9420") version("0.4.1", sha256="9f069dc9c8ee359abc8ef9e7304cb1b1c23556d1f4ae64f4247c1e45de43c1f1") depends_on("py-setuptools", type="build") diff --git a/var/spack/repos/builtin/packages/py-protobuf/package.py b/var/spack/repos/builtin/packages/py-protobuf/package.py index d372dc8804157b..dbd674eac1bea6 100644 --- a/var/spack/repos/builtin/packages/py-protobuf/package.py +++ b/var/spack/repos/builtin/packages/py-protobuf/package.py @@ -17,6 +17,8 @@ class PyProtobuf(PythonPackage): homepage = "https://developers.google.com/protocol-buffers/" pypi = "protobuf/protobuf-3.11.0.tar.gz" + version("5.28.2", sha256="59379674ff119717404f7454647913787034f03fe7049cbef1d74a97bb4593f0") + version("5.27.5", sha256="7fa81bc550201144a32f4478659da06e0b2ebe4d5303aacce9a202a1c3d5178d") version("5.26.1", sha256="8ca2a1d97c290ec7b16e4e5dff2e5ae150cc1582f55b5ab300d45cb0dfa90e51") version("4.25.3", sha256="25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c") version("4.24.3", sha256="12e9ad2ec079b833176d2921be2cb24281fa591f0b119b208b788adc48c2561d") @@ -62,38 +64,18 @@ class PyProtobuf(PythonPackage): version("3.3.0", sha256="1cbcee2c45773f57cb6de7ee0eceb97f92b9b69c0178305509b162c0160c1f04") version("3.0.0", sha256="ecc40bc30f1183b418fe0ec0c90bc3b53fa1707c4205ee278c6b90479e5b6ff5") - depends_on("c", type="build") # generated - - variant("cpp", default=False, when="@:4.21", description="Enable the cpp implementation") + depends_on("c", type="build") depends_on("python", type=("build", "link", "run")) depends_on("py-setuptools", type=("build", "run")) - # in newer pip versions --install-option does not exist - depends_on("py-pip@:23.0", when="+cpp", type=("build", "run")) depends_on("py-six@1.9:", when="@3.0:3.17", type=("build", "run")) - # Setup dependencies for protobuf to use the same minor version as py-protobuf - # Handle mapping the 4.x release to the protobuf 3.x releases - depends_on("protobuf@3.21", when="+cpp @4.21") - # Handle the 3.x series releases - for ver in list(range(0, 21)): - depends_on(f"protobuf@3.{ver}", when=f"@3.{ver}+cpp") - - conflicts("+cpp", when="^python@3.11:") - conflicts("%gcc@14", when="@:4.24.3") - - @property - def build_directory(self): - if self.spec.satisfies("@3.1.0"): - return "python" - else: - return "." - - @when("+cpp") - def setup_build_environment(self, env): - protobuf_dir = self.spec["protobuf"].libs.directories[0] - env.prepend_path("LIBRARY_PATH", protobuf_dir) + # Minor version must match protobuf + for ver in range(26, 29): + depends_on(f"protobuf@3.{ver}", when=f"@5.{ver}") + for ver in range(21, 26): + depends_on(f"protobuf@3.{ver}", when=f"@4.{ver}") + for ver in range(0, 21): + depends_on(f"protobuf@3.{ver}", when=f"@3.{ver}") - @when("+cpp") - def install_options(self, spec, prefix): - return ["--cpp_implementation"] + conflicts("%gcc@14:", when="@:4.24.3") diff --git a/var/spack/repos/builtin/packages/py-pybind11/package.py b/var/spack/repos/builtin/packages/py-pybind11/package.py index 887f2b8d311ec6..b14b50a8e64252 100644 --- a/var/spack/repos/builtin/packages/py-pybind11/package.py +++ b/var/spack/repos/builtin/packages/py-pybind11/package.py @@ -27,6 +27,12 @@ class PyPybind11(CMakePackage, PythonExtension): maintainers("ax3l") version("master", branch="master") + version("2.13.5", sha256="b1e209c42b3a9ed74da3e0b25a4f4cd478d89d5efbb48f04b277df427faf6252") + version("2.13.4", sha256="efc901aa0aab439a3fea6efeaf930b5a349fb06394bf845c64ce15a9cf8f0240") + version("2.13.3", sha256="6e7a84ec241544f2f5e30c7a82c09c81f0541dd14e9d9ef61051e07105f9c445") + version("2.13.2", sha256="50eebef369d28f07ce1fe1797f38149e5928817be8e539239f2aadfd95b227f3") + version("2.13.1", sha256="51631e88960a8856f9c497027f55c9f2f9115cafb08c0005439838a05ba17bfc") + version("2.13.0", sha256="8ac2bd138ea3c12683d3496361af6bee0f7754f86bf050e6c61e3966de688215") version("2.12.0", sha256="bf8f242abd1abcd375d516a7067490fb71abd79519a282d22b6e4d19282185a7") version("2.11.1", sha256="d475978da0cdc2d43b73f30910786759d593a9d8ee05b1b6846d1eb16c6d2e0c") version("2.11.0", sha256="7af30a84c6810e721829c4646e31927af9d8861e085aa5dd37c3c8b8169fcda1") @@ -53,7 +59,7 @@ class PyPybind11(CMakePackage, PythonExtension): version("2.1.1", sha256="f2c6874f1ea5b4ad4ffffe352413f7d2cd1a49f9050940805c2a082348621540") version("2.1.0", sha256="2860f2b8d0c9f65f0698289a161385f59d099b7ead1bf64e8993c486f2b93ee0") - depends_on("cxx", type="build") # generated + depends_on("cxx", type="build") depends_on("py-setuptools@42:", type="build") depends_on("py-pytest", type="test") @@ -77,6 +83,9 @@ class PyPybind11(CMakePackage, PythonExtension): conflicts("%msvc@:16") conflicts("%intel@:17") + # https://github.com/pybind/pybind11/pull/5208 + conflicts("%gcc@14:", when="@:2.13.1") + # https://github.com/pybind/pybind11/pull/1995 @when("@:2.4") def patch(self): @@ -91,7 +100,10 @@ def patch(self): class CMakeBuilder(spack.build_systems.cmake.CMakeBuilder): def cmake_args(self): - return [self.define("PYBIND11_TEST", self.pkg.run_tests)] + return [ + self.define("PYBIND11_TEST", self.pkg.run_tests), + self.define("prefix_for_pc_file", self.prefix), + ] def install(self, pkg, spec, prefix): super().install(pkg, spec, prefix) diff --git a/var/spack/repos/builtin/packages/py-pycryptodome/package.py b/var/spack/repos/builtin/packages/py-pycryptodome/package.py index f3b013985a52f2..4ebcb3ae67df46 100644 --- a/var/spack/repos/builtin/packages/py-pycryptodome/package.py +++ b/var/spack/repos/builtin/packages/py-pycryptodome/package.py @@ -13,8 +13,11 @@ class PyPycryptodome(PythonPackage): homepage = "https://www.pycryptodome.org" pypi = "pycryptodome/pycryptodome-3.16.0.tar.gz" + license("Unlicense AND BSD-2-Clause", checked_by="wdconinc") + + version("3.20.0", sha256="09609209ed7de61c2b560cc5c8c4fbf892f8b15b1faf7e4cbffac97db1fffda7") version("3.16.0", sha256="0e45d2d852a66ecfb904f090c3f87dc0dfb89a499570abad8590f10d9cffb350") - depends_on("c", type="build") # generated + depends_on("c", type="build") depends_on("py-setuptools", type="build") diff --git a/var/spack/repos/builtin/packages/py-pydantic-core/package.py b/var/spack/repos/builtin/packages/py-pydantic-core/package.py new file mode 100644 index 00000000000000..ec7dd02dfa9d1e --- /dev/null +++ b/var/spack/repos/builtin/packages/py-pydantic-core/package.py @@ -0,0 +1,22 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + + +from spack.package import * + + +class PyPydanticCore(PythonPackage): + """Core functionality for Pydantic validation and serialization""" + + homepage = "https://github.com/pydantic/pydantic-core" + pypi = "pydantic_core/pydantic_core-2.18.4.tar.gz" + + license("MIT", checked_by="qwertos") + + version("2.18.4", sha256="ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864") + + depends_on("rust@1.76:", type="build") + depends_on("py-maturin@1", type="build") + depends_on("py-typing-extensions@4.6,4.7.1:", type="build") diff --git a/var/spack/repos/builtin/packages/py-pydantic/package.py b/var/spack/repos/builtin/packages/py-pydantic/package.py index 1819998e46486c..bfc6aa639bbc0e 100644 --- a/var/spack/repos/builtin/packages/py-pydantic/package.py +++ b/var/spack/repos/builtin/packages/py-pydantic/package.py @@ -14,6 +14,7 @@ class PyPydantic(PythonPackage): license("MIT") + version("2.7.4", sha256="0c84efd9548d545f63ac0060c1e4d39bb9b14db8b3c0652338aecc07b5adec52") version("1.10.9", sha256="95c70da2cd3b6ddf3b9645ecaa8d98f3d80c606624b6d245558d202cd23ea3be") version("1.10.2", sha256="91b8e218852ef6007c2b98cd861601c6a09f1aa32bbbb74fab5b1c33d4a1e410") version("1.9.2", sha256="8cb0bc509bfb71305d7a59d00163d5f9fc4530f0881ea32c74ff4f74c85f3d3d") @@ -21,9 +22,15 @@ class PyPydantic(PythonPackage): variant("dotenv", default=False, description="Install requirements for pydantic.dotenv") - depends_on("py-setuptools", type="build") + depends_on("py-setuptools", type="build", when="@1") + depends_on("py-hatchling", type="build", when="@2") + depends_on("py-hatch-fancy-pypi-readme@22.5.0:", type="build", when="@2") + depends_on("py-typing-extensions@4.6.1:", when="@2.7.1:", type=("build", "run")) depends_on("py-typing-extensions@4.2:", when="@1.10.9:", type=("build", "run")) depends_on("py-typing-extensions@4.1:", when="@1.10:", type=("build", "run")) depends_on("py-typing-extensions@3.7.4.3:", type=("build", "run")) - depends_on("py-python-dotenv@0.10.4:", when="+dotenv", type=("build", "run")) + depends_on("py-annotated-types@0.4.0:", type=("build", "run"), when="@2.7.4:") + depends_on("py-pydantic-core@2.18.4", type=("build", "run"), when="@2.7.4") + + depends_on("py-python-dotenv@0.10.4:", when="@1 +dotenv", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-pyenchant/package.py b/var/spack/repos/builtin/packages/py-pyenchant/package.py new file mode 100644 index 00000000000000..a97afb66ecb06b --- /dev/null +++ b/var/spack/repos/builtin/packages/py-pyenchant/package.py @@ -0,0 +1,23 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + + +from spack.package import * + + +class PyPyenchant(PythonPackage): + """Sphinx Documentation Generator.""" + + homepage = "https://pyenchant.github.io/pyenchant/" + pypi = "pyenchant/pyenchant-3.2.2.tar.gz" + git = "https://github.com/pyenchant/pyenchant.git" + + license("LGPL-2.1") + + version("3.2.2", sha256="1cf830c6614362a78aab78d50eaf7c6c93831369c52e1bb64ffae1df0341e637") + + depends_on("enchant") + depends_on("python@3.5:") + depends_on("py-setuptools") diff --git a/var/spack/repos/builtin/packages/py-pyfftw/package.py b/var/spack/repos/builtin/packages/py-pyfftw/package.py index 4b8184cafca1e7..56ed3b16cdc923 100644 --- a/var/spack/repos/builtin/packages/py-pyfftw/package.py +++ b/var/spack/repos/builtin/packages/py-pyfftw/package.py @@ -10,29 +10,44 @@ class PyPyfftw(PythonPackage): """A pythonic wrapper around FFTW, the FFT library, presenting a unified interface for all the supported transforms.""" - homepage = "http://hgomersall.github.com/pyFFTW" - pypi = "pyFFTW/pyFFTW-0.10.4.tar.gz" + homepage = "https://pyfftw.readthedocs.io/en/latest/" + pypi = "pyFFTW/pyfftw-0.14.0.tar.gz" + + maintainers("paugier") license("BSD-3-Clause") + version("0.14.0", sha256="a55f94d3da9b5c04de1bc96932a93f922910f3984557931356173a515277b65b") version("0.13.1", sha256="09155e90a0c6d0c1f2d1f3668180a7de95fb9f83fef5137a112fb05978e87320") version("0.13.0", sha256="da85102405c0bd95d57eb19e99b01a0729d8406cb204c3900894b873784253da") version("0.12.0", sha256="60988e823ca75808a26fd79d88dbae1de3699e72a293f812aa4534f8a0a58cb0") version("0.11.1", sha256="05ea28dede4c3aaaf5c66f56eb0f71849d0d50f5bc0f53ca0ffa69534af14926") version("0.10.4", sha256="739b436b7c0aeddf99a48749380260364d2dc027cf1d5f63dafb5f50068ede1a") - depends_on("python@3.8:", type=("build", "run"), when="@0.13.1:") + depends_on("python@3.9:", type=("build", "run"), when="@0.14.0:") + depends_on("python@3.8:3.11", type=("build", "run"), when="@:0.13.1") depends_on("py-setuptools@:59.4.0", type="build") - depends_on("py-cython@0.29.18:0", type="build", when="@0.13:") + + depends_on("py-cython@3.0:3", type="build", when="@0.14.0:") + depends_on("py-cython@0.29.18:0", type="build", when="@0.13.0:0.13") depends_on("py-cython@0.29:0", type="build", when="@:0.13") - depends_on("py-numpy@1.20:1", type=("build", "run"), when="@0.13.1:") + depends_on("py-numpy@2.0:2", type=("build", "run"), when="@0.14.0:") + depends_on("py-numpy@1.20:1", type=("build", "run"), when="@0.13.1") depends_on("py-numpy@1.16:1", type=("build", "run"), when="@0.13.0") depends_on("py-numpy@1.10:1", type=("build", "run"), when="@0.11:0.12") depends_on("py-numpy@1.6:1", type=("build", "run"), when="@:0.10.4") depends_on("fftw@3.3:") + def url_for_version(self, version): + url = "https://files.pythonhosted.org/packages/source/p/pyfftw/{0}-{1}.tar.gz" + if version >= Version("0.14.0"): + name = "pyfftw" + else: + name = "pyFFTW" + return url.format(name, version) + def setup_build_environment(self, env): env.append_flags("LDFLAGS", self.spec["fftw"].libs.search_flags) diff --git a/var/spack/repos/builtin/packages/py-pyogrio/package.py b/var/spack/repos/builtin/packages/py-pyogrio/package.py new file mode 100644 index 00000000000000..2c0a7c8766b091 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-pyogrio/package.py @@ -0,0 +1,31 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyPyogrio(PythonPackage): + """Vectorized spatial vector file format I/O using GDAL/OGR""" + + homepage = "https://pypi.org/project/pyogrio" + pypi = "pyogrio/pyogrio-0.9.0.tar.gz" + git = "https://github.com/geopandas/pyogrio.git" + + maintainers("climbfuji") + + license("MIT", checked_by="climbfuji") + + version("0.9.0", sha256="6a6fa2e8cf95b3d4a7c0fac48bce6e5037579e28d3eb33b53349d6e11f15e5a8") + + depends_on("python@3.8:", type=("build", "run")) + depends_on("gdal@2.4:", type=("build", "link", "run")) + depends_on("py-cython@0.29:", type="build") + depends_on("py-versioneer@0.28 +toml", type="build") + # this is an implicit dependency already listed in py-versioneer, not needed + # depends_on("py-tomli", when="^python@:3.10", type="build") + + depends_on("py-certifi", type=("build", "run")) + depends_on("py-numpy", type=("build", "run")) + depends_on("py-packaging", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-pypdf/package.py b/var/spack/repos/builtin/packages/py-pypdf/package.py new file mode 100644 index 00000000000000..7a9896d17d85b9 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-pypdf/package.py @@ -0,0 +1,21 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyPypdf(PythonPackage): + """A pure-python PDF library capable of splitting, merging, cropping, and + transforming PDF files""" + + homepage = "https://github.com/py-pdf/pypdf" + pypi = "pypdf/pypdf-4.3.1.tar.gz" + + license("BSD-3-Clause", checked_by="qwertos") + + version("4.3.1", sha256="b2f37fe9a3030aa97ca86067a56ba3f9d3565f9a791b305c7355d8392c30d91b") + + depends_on("py-flit-core@3.9:3", type="build") + depends_on("py-typing-extensions@4:", when="^python@:3.10", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-pyprecice/package.py b/var/spack/repos/builtin/packages/py-pyprecice/package.py index dba3a938f79410..7df2a049f330ed 100644 --- a/var/spack/repos/builtin/packages/py-pyprecice/package.py +++ b/var/spack/repos/builtin/packages/py-pyprecice/package.py @@ -14,15 +14,20 @@ class PyPyprecice(PythonPackage): homepage = "https://precice.org" git = "https://github.com/precice/python-bindings.git" - url = "https://github.com/precice/python-bindings/archive/v2.4.0.0.tar.gz" + url = "https://github.com/precice/python-bindings/archive/v3.1.1.tar.gz" maintainers("ajaust", "BenjaminRodenberg", "IshaanDesai") license("LGPL-3.0") # Always prefer final version of release candidate version("develop", branch="develop") + version("3.1.1", sha256="112fccfbb223eb8df341221531f89943a14f75ee1e44dfb3276ebb38f21047de") + version("3.1.0", sha256="8d9bd9e28859001ab503a1e2f90e54b3c000079f04c14dc7c0c04c61c5666641") + version("3.0.0.0", sha256="7e2c4b106a231b0df2a430d86d4a7b295f85adbe3478c425f863d1a4bebee9f7") + version("2.5.0.4", sha256="7f9449573eb52ce48ca3f0ab35529ea0064942487842515ae0a2c9299aa0f0db") + version("2.5.0.3", sha256="b983229b9fdf6bd4605ae8710985eb681025f6fb28ad8d7736cdf92593eef6df") version("2.5.0.2", sha256="6d7b78da830db6c5133b44617196ee90be8c7d6c8e14c8994a4800b3d4856416") - version("2.5.0.1", sha256="e2602f828d4f907ea93e34f7d4adb8db086044a75a446592a4099423d56ed62c") + version("2.5.0.1", sha256="d7c666e6ebff9e007c3703d8e3c3fcdf0f45289e36c2c17223b3aedc3259ab6c") version("2.5.0.0", sha256="9f55a22594bb602cde8a5987217728569f16d9576ea53ed00497e9046a2e1794") version("2.4.0.0", sha256="e80d16417b8ce1fdac80c988cb18ae1e16f785c5eb1035934d8b37ac18945242") version("2.3.0.1", sha256="ed4e48729b662680beaa4ee2a9aff724a79e760534c6c58181be739988da2789") @@ -41,6 +46,8 @@ class PyPyprecice(PythonPackage): for ver in [ "develop", + "3.1", # only consider major.minor from 3.1.0. See https://github.com/precice/python-bindings/pull/199 + "3.0.0", "2.5.0", "2.4.0", "2.3.0", diff --git a/var/spack/repos/builtin/packages/py-pyproj/package.py b/var/spack/repos/builtin/packages/py-pyproj/package.py index 60839d2733481a..706477724930b1 100644 --- a/var/spack/repos/builtin/packages/py-pyproj/package.py +++ b/var/spack/repos/builtin/packages/py-pyproj/package.py @@ -14,10 +14,10 @@ class PyPyproj(PythonPackage): pypi = "pyproj/pyproj-2.2.0.tar.gz" git = "https://github.com/pyproj4/pyproj.git" - maintainers("citibeth", "adamjstewart") - license("MIT") + maintainers("citibeth", "adamjstewart") + version("3.7.0", sha256="bf658f4aaf815d9d03c8121650b6f0b8067265c36e31bc6660b98ef144d81813") version("3.6.1", sha256="44aa7c704c2b7d8fb3d483bbf75af6cb2350d30a63b144279a09b75fead501bf") version("3.6.0", sha256="a5b111865b3f0f8b77b3983f2fbe4dd6248fc09d3730295949977c8dcd988062") version("3.5.0", sha256="9859d1591c1863414d875ae0759e72c2cffc01ab989dc64137fbac572cc81bf6") @@ -36,16 +36,23 @@ class PyPyproj(PythonPackage): version("2.1.3", sha256="99c52788b01a7bb9a88024bf4d40965c0a66a93d654600b5deacf644775f424d") # In pyproject.toml - depends_on("py-setuptools@61:", when="@3.4:", type="build") - depends_on("py-setuptools", type="build") - depends_on("py-cython@3:", when="@3.6.1:", type="build") - depends_on("py-cython@0.28.4:2", when="@2:3.6.0", type="build") - depends_on("python@3.9:", when="@3.6:", type=("build", "link", "run")) - depends_on("python@3.8:", when="@3.3:", type=("build", "link", "run")) - depends_on("py-certifi", when="@3:", type=("build", "run")) + with default_args(type="build"): + depends_on("py-setuptools@61:", when="@3.4:") + depends_on("py-setuptools") + depends_on("py-cython@3:", when="@3.6.1:") + depends_on("py-cython@0.28.4:2", when="@2:3.6.0") + + with default_args(type=("build", "link", "run")): + depends_on("python@3.10:", when="@3.7:") + depends_on("python@3.9:", when="@3.6:") + depends_on("python@3.8:", when="@3.3:") + + with default_args(type=("build", "run")): + depends_on("py-certifi", when="@3:") # In setup.py (PROJ_MIN_VERSION) # https://pyproj4.github.io/pyproj/stable/installation.html#installing-from-source + depends_on("proj@9.2:", when="@3.7:") depends_on("proj@9:", when="@3.5:") depends_on("proj@8.2:", when="@3.4") depends_on("proj@8.0:9.1", when="@3.3") @@ -54,7 +61,6 @@ class PyPyproj(PythonPackage): depends_on("proj@6.2:7", when="@2.4:2.6") depends_on("proj@6.1:7", when="@2.2:2.3") depends_on("proj@6.0:7", when="@2.0:2.1") - depends_on("proj@:5.2", when="@:1.9") depends_on("proj") def setup_build_environment(self, env): diff --git a/var/spack/repos/builtin/packages/py-pyspnego/package.py b/var/spack/repos/builtin/packages/py-pyspnego/package.py new file mode 100644 index 00000000000000..071bd61a902b00 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-pyspnego/package.py @@ -0,0 +1,30 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyPyspnego(PythonPackage): + """Python SPNEGO authentication library.""" + + homepage = "https://github.com/jborean93/pyspnego" + pypi = "pyspnego/pyspnego-0.11.1.tar.gz" + + maintainers("wdconinc") + + license("MIT", checked_by="wdconinc") + + version("0.11.1", sha256="e92ed8b0a62765b9d6abbb86a48cf871228ddb97678598dc01c9c39a626823f6") + + variant("kerberos", default=False, description="Enable Kerberos authentication on Linux") + + depends_on("py-setuptools@61:", type="build") + depends_on("py-cryptography", type=("build", "run")) + depends_on("py-sspilib", type=("build", "run"), when="platform=windows") + + with when("+kerberos"): + depends_on("py-gssapi@1.6.0:", type=("build", "run")) + depends_on("py-krb5@0.3.0:", type=("build", "run")) + conflicts("+kerberos", when="platform=windows", msg="kerberos support unavailable on windows") diff --git a/var/spack/repos/builtin/packages/py-python-magic/package.py b/var/spack/repos/builtin/packages/py-python-magic/package.py index 71a6fb25f238b5..fc34c262e4b1c7 100644 --- a/var/spack/repos/builtin/packages/py-python-magic/package.py +++ b/var/spack/repos/builtin/packages/py-python-magic/package.py @@ -18,6 +18,7 @@ class PyPythonMagic(PythonPackage): license("MIT") + version("0.4.27", sha256="c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b") version("0.4.24", sha256="de800df9fb50f8ec5974761054a708af6e4246b03b4bdaee993f948947b0ebcf") version("0.4.15", sha256="f3765c0f582d2dfc72c15f3b5a82aecfae9498bd29ca840d72f37d7bd38bfcd5") diff --git a/var/spack/repos/builtin/packages/py-python-swiftclient/package.py b/var/spack/repos/builtin/packages/py-python-swiftclient/package.py index f596a79460fa2e..f6e1561a3c1973 100644 --- a/var/spack/repos/builtin/packages/py-python-swiftclient/package.py +++ b/var/spack/repos/builtin/packages/py-python-swiftclient/package.py @@ -14,6 +14,7 @@ class PyPythonSwiftclient(PythonPackage): maintainers("ajkotobi") + version("4.6.0", sha256="d4d18540413893fc16ad87791d740f823f763435e8212e68eb53d60da2638233") version("3.12.0", sha256="313b444a14d0f9b628cbf3e8c52f2c4271658f9e8a33d4222851c2e4f0f7b7a0") version("3.11.1", sha256="06919d59676d3e215f4da4f3f930d71880dda3528289842b25199509df712411") version("3.10.0", sha256="66227eaf29a691c70675fb9982022980b92797c273dd5e6dc7e680425e9a3634") @@ -25,10 +26,13 @@ class PyPythonSwiftclient(PythonPackage): variant("keystone", default=False, description="Enable keystone authentication") depends_on("python@2.7:", type=("build", "run")) + depends_on("python@3.6:", type=("build", "run"), when="@4:") depends_on("py-setuptools", type="build") depends_on("py-pbr", type="build") depends_on("py-requests@1.1.0:", type=("build", "run")) - depends_on("py-six@1.9:", type=("build", "run")) + depends_on("py-requests@2.4.0:", type=("build", "run"), when="@4:") depends_on("py-python-keystoneclient@0.7.0:", when="+keystone", type=("build", "run")) + + depends_on("py-six@1.9:", type=("build", "run"), when="@:3") diff --git a/var/spack/repos/builtin/packages/py-pyvista/package.py b/var/spack/repos/builtin/packages/py-pyvista/package.py index 6ff66b6f69ea05..358e417dffb5d7 100644 --- a/var/spack/repos/builtin/packages/py-pyvista/package.py +++ b/var/spack/repos/builtin/packages/py-pyvista/package.py @@ -19,12 +19,14 @@ class PyPyvista(PythonPackage): license("MIT") + version("0.44.1", sha256="63976f5d57d151b3f7e1616dde40dcf56a66d1f37f6db067087fa9cc9667f512") version("0.42.3", sha256="00159cf0dea05c1ecfd1695c8c6ccfcfff71b0744c9997fc0276e661dc052351") version("0.37.0", sha256="d36a2c6d5f53f473ab6a9241669693acee7a5179394dc97595da14cc1de23141") version("0.32.1", sha256="585ac79524e351924730aff9b7207d6c5ac4175dbb5d33f7a9a2de22ae53dbf9") depends_on("py-setuptools", type="build") depends_on("py-matplotlib@3.0.1:", when="@0.39:", type=("build", "run")) + depends_on("py-numpy@1.21:", when="@0.44:", type=("build", "run")) depends_on("py-numpy", type=("build", "run")) # https://github.com/pyvista/pyvista/releases/tag/v0.44.0 depends_on("py-numpy@:1", when="@:0.43", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-rasterio/package.py b/var/spack/repos/builtin/packages/py-rasterio/package.py index 1441eb5a83a818..606b983401f950 100644 --- a/var/spack/repos/builtin/packages/py-rasterio/package.py +++ b/var/spack/repos/builtin/packages/py-rasterio/package.py @@ -17,11 +17,13 @@ class PyRasterio(PythonPackage): pypi = "rasterio/rasterio-1.1.8.tar.gz" git = "https://github.com/rasterio/rasterio.git" - maintainers("adamjstewart") - license("BSD-3-Clause") + maintainers("adamjstewart") - version("master", branch="master") + version("main", branch="main") + version("master", branch="master", deprecated=True) + version("1.4.1", sha256="d750362bb792d2311f94803ff309baec48486ecba75c9b905ea9b1f5eb06ef9f") + version("1.4.0", sha256="e0d2ff540a4e06016cca2fb46691a10afe71343ea998c50ad8247bb125542133") version("1.3.11", sha256="47aa70b4718ebc80d825bb7db3127577d74e31c53048ce215145c0baf530ece9") version("1.3.10", sha256="ce182c735b4f9e8735d90600607ecab15ef895eb8aa660bf665751529477e326") version("1.3.9", sha256="fc6d0d290492fa1a5068711cfebb21cc936968891b7ed9da0690c8a7388885c5") @@ -48,10 +50,12 @@ class PyRasterio(PythonPackage): # From setup.py with default_args(type=("build", "link", "run")): + depends_on("python@3.9:", when="@1.4:") depends_on("python@3.8:", when="@1.3:") depends_on("python@3.6:3.9", when="@1.2") depends_on("python@2.7:2.8,3.5:3.8", when="@1.1") + depends_on("py-numpy@1.24:", when="@1.4:") depends_on("py-numpy@1.18:", when="@1.3:") depends_on("py-numpy@1.15:", when="@1.2:") depends_on("py-numpy") @@ -66,11 +70,15 @@ class PyRasterio(PythonPackage): depends_on("py-click@4:7", when="@:1.2.3") depends_on("py-cligj@0.5:") depends_on("py-importlib-metadata", when="@1.3.10: ^python@:3.9") - depends_on("py-snuggs@1.4.1:") depends_on("py-click-plugins") - depends_on("py-setuptools") + depends_on("py-pyparsing") + + # Historical dependencies + depends_on("py-setuptools", when="@:1.3.9") + depends_on("py-snuggs@1.4.1:", when="@:1.3") # From README.rst and setup.py + depends_on("gdal@3.5:", when="@1.4:") depends_on("gdal@3.1:", when="@1.3:") depends_on("gdal@2.4:3.3", when="@1.2.7:1.2") depends_on("gdal@2.3:3.2", when="@1.2.0:1.2.6") diff --git a/var/spack/repos/builtin/packages/py-referencing/package.py b/var/spack/repos/builtin/packages/py-referencing/package.py new file mode 100644 index 00000000000000..cdf0fad6592fd8 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-referencing/package.py @@ -0,0 +1,25 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyReferencing(PythonPackage): + """JSON Referencing + Python.""" + + homepage = "https://referencing.readthedocs.io/" + pypi = "referencing/referencing-0.35.1.tar.gz" + + maintainers("wdconinc") + + license("MIT", checked_by="wdconinc") + + version("0.35.1", sha256="25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c") + + depends_on("py-hatchling", type="build") + depends_on("py-hatch-vcs", type="build") + + depends_on("py-attrs@22.2.0:", type=("build", "run")) + depends_on("py-rpds-py@0.7.0:", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-regionmask/package.py b/var/spack/repos/builtin/packages/py-regionmask/package.py new file mode 100644 index 00000000000000..fd91af1214ce20 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-regionmask/package.py @@ -0,0 +1,35 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyRegionmask(PythonPackage): + """Create masks of geospatial regions for arbitrary grids""" + + homepage = "https://pypi.org/project/regionmask" + pypi = "regionmask/regionmask-0.12.1.tar.gz" + git = "https://github.com/regionmask/regionmask.git" + + maintainers("climbfuji") + + license("MIT", checked_by="climbfuji") + + version("0.12.1", sha256="7ef1e70c6ebab7bfc6a80e13f6fe771945b8b6a31b7f8980fc88c8b8505bb854") + + depends_on("py-setuptools@42:", type="build") + depends_on("py-setuptools-scm@7:", type="build") + + depends_on("py-geopandas@0.13:", type=("build", "run")) + depends_on("py-numpy@1.24:", type=("build", "run")) + depends_on("py-packaging@23.1:", type=("build", "run")) + depends_on("py-pooch@1.7:", type=("build", "run")) + depends_on("py-rasterio@1.3:", type=("build", "run")) + depends_on("py-shapely@2.0:", type=("build", "run")) + depends_on("py-xarray@2023.7:", type=("build", "run")) + + # "Optional" dependencies for plotting, but that's what this package is really useful for + depends_on("py-matplotlib@3.7:", type="run") + depends_on("py-cartopy@0.22:", type="run") diff --git a/var/spack/repos/builtin/packages/py-requests-kerberos/package.py b/var/spack/repos/builtin/packages/py-requests-kerberos/package.py new file mode 100644 index 00000000000000..61c9645469c921 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-requests-kerberos/package.py @@ -0,0 +1,24 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyRequestsKerberos(PythonPackage): + """An authentication handler for using Kerberos with Python Requests.""" + + homepage = "https://github.com/requests/requests-kerberos" + pypi = "requests_kerberos/requests_kerberos-0.15.0.tar.gz" + + maintainers("wdconinc") + + license("ISC", checked_by="wdconinc") + + version("0.15.0", sha256="437512e424413d8113181d696e56694ffa4259eb9a5fc4e803926963864eaf4e") + + depends_on("py-setuptools@61:", type="build") + depends_on("py-requests@1.1.0:", type=("build", "run")) + depends_on("py-cryptography@1.3:", type=("build", "run")) + depends_on("py-pyspnego +kerberos", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-requests/package.py b/var/spack/repos/builtin/packages/py-requests/package.py index 6cad175f44b384..1ca04979ce6e78 100644 --- a/var/spack/repos/builtin/packages/py-requests/package.py +++ b/var/spack/repos/builtin/packages/py-requests/package.py @@ -15,6 +15,7 @@ class PyRequests(PythonPackage): license("Apache-2.0") + version("2.32.3", sha256="55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760") version("2.32.2", sha256="dd951ff5ecf3e3b3aa26b40703ba77495dab41da839ae72ef3c8e5d8e2433289") version("2.31.0", sha256="942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1") version("2.28.2", sha256="98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf") diff --git a/var/spack/repos/builtin/packages/py-rpds-py/package.py b/var/spack/repos/builtin/packages/py-rpds-py/package.py new file mode 100644 index 00000000000000..5c948bafbe5f08 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-rpds-py/package.py @@ -0,0 +1,24 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyRpdsPy(PythonPackage): + """Python bindings to the Rust rpds crate for persistent data structures.""" + + homepage = "https://rpds.readthedocs.io/" + pypi = "rpds_py/rpds_py-0.20.0.tar.gz" + + maintainers("wdconinc") + + license("MIT", checked_by="wdconinc") + + version("0.20.0", sha256="d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121") + version("0.18.1", sha256="dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f") + + depends_on("rust@1.76:", when="@0.19:") + depends_on("py-maturin@1.0:1", type="build") + depends_on("py-maturin@1.2:", type="build", when="@0.20:") diff --git a/var/spack/repos/builtin/packages/py-rsatoolbox/package.py b/var/spack/repos/builtin/packages/py-rsatoolbox/package.py index ce3c54c7d0edff..ef0dde2854a4e6 100644 --- a/var/spack/repos/builtin/packages/py-rsatoolbox/package.py +++ b/var/spack/repos/builtin/packages/py-rsatoolbox/package.py @@ -16,6 +16,7 @@ class PyRsatoolbox(PythonPackage): license("MIT") version("main", branch="main") + version("0.2.0", sha256="ecdcb50387c4b6330077ec2a3a221696078071319b8a0c32ed8128cd38da6863") version("0.1.5", sha256="439839fb20e2efa0c7c975ad305df8995a509ed3426ad0384ebfff20663fd58b") version("0.1.2", sha256="2d091cbaa33373bf9da4df5ca8d127f0e427431a3db726076090ab2d54fe1213") version("0.1.0", sha256="245f909d31909ba896b765fa51ea019510dd690c6bb8d04b178a9c76ec36dce9") @@ -35,6 +36,7 @@ class PyRsatoolbox(PythonPackage): depends_on("py-twine@4.0.1:4.0", type="build", when="@0.0.5:0.1.4") depends_on("py-numpy@1.21.2:", type=("build", "run")) + depends_on("py-scipy@1.10.1:", type=("build", "run"), when="@0.2:") depends_on("py-scipy", type=("build", "run")) depends_on("py-scikit-learn", type=("build", "run")) depends_on("py-scikit-image", type=("build", "run")) @@ -44,6 +46,9 @@ class PyRsatoolbox(PythonPackage): depends_on("py-tqdm", type=("build", "run")) depends_on("py-joblib", type=("build", "run")) depends_on("py-importlib-resources@5.12:", type=("build", "run"), when="^python@:3.8") + depends_on("py-networkx@3:", type=("build", "run"), when="@0.2:") + + conflicts("^py-matplotlib@3.9.1") # old dependcies depends_on("py-coverage", type=("build", "run"), when="@:0.1.1") diff --git a/var/spack/repos/builtin/packages/py-ruamel-yaml-clib/package.py b/var/spack/repos/builtin/packages/py-ruamel-yaml-clib/package.py index 0989481157965c..82bbd8db2e99e5 100644 --- a/var/spack/repos/builtin/packages/py-ruamel-yaml-clib/package.py +++ b/var/spack/repos/builtin/packages/py-ruamel-yaml-clib/package.py @@ -28,6 +28,6 @@ class PyRuamelYamlClib(PythonPackage): def flag_handler(self, name, flags): if name == "cflags": - if self.spec.satisfies("%oneapi"): + if self.spec.satisfies("%oneapi") or self.spec.satisfies(" %apple-clang@15:"): flags.append("-Wno-error=incompatible-function-pointer-types") return (flags, None, None) diff --git a/var/spack/repos/builtin/packages/py-rucio-clients/package.py b/var/spack/repos/builtin/packages/py-rucio-clients/package.py new file mode 100644 index 00000000000000..efda0e4bf44efb --- /dev/null +++ b/var/spack/repos/builtin/packages/py-rucio-clients/package.py @@ -0,0 +1,47 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyRucioClients(PythonPackage): + """Rucio Client Lite Package""" + + homepage = "https://rucio.cern.ch/" + pypi = "rucio_clients/rucio_clients-35.4.0.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("35.4.0", sha256="f8771ee39d0d496109586ddbb4000ce006a193fd33cdac8a654661ae0b7346c0") + + variant("ssh", default=False, description="Enable SSH2 protocol library") + variant("kerberos", default=False, description="Enable kerberos authentication") + variant("swift", default=False, description="Enable support for swift service") + variant("argcomplete", default=False, description="Enable bash tab completion for argparse") + variant("dumper", default=False, description="Enable file type identification using libmagic") + + # requirements/requirements.client.txt + depends_on("python@3.9:", type=("build", "run")) + depends_on("py-setuptools", type="build") + depends_on("py-requests@2.32.2:", type=("build", "run")) + depends_on("py-urllib3@1.26.18:", type=("build", "run")) + depends_on("py-dogpile-cache@1.2.2:", type=("build", "run")) + depends_on("py-tabulate@0.9.0:", type=("build", "run")) + depends_on("py-jsonschema@4.20.0:", type=("build", "run")) + + with when("+ssh"): + depends_on("py-paramiko@3.4.0:") + with when("+kerberos"): + depends_on("py-kerberos@1.3.1:") + depends_on("py-pykerberos@1.2.4:") + depends_on("py-requests-kerberos@0.14.0:") + with when("+swift"): + depends_on("py-python-swiftclient@4.4.0:") + with when("+argcomplete"): + depends_on("py-argcomplete@3.1.6:") + with when("+dumper"): + depends_on("py-python-magic@0.4.27:") diff --git a/var/spack/repos/builtin/packages/py-ruff/package.py b/var/spack/repos/builtin/packages/py-ruff/package.py index cb41f2fe90914a..f38b08a4d772a8 100644 --- a/var/spack/repos/builtin/packages/py-ruff/package.py +++ b/var/spack/repos/builtin/packages/py-ruff/package.py @@ -16,6 +16,7 @@ class PyRuff(PythonPackage): license("MIT") maintainers("adamjstewart") + version("0.6.5", sha256="4d32d87fab433c0cf285c3683dd4dae63be05fd7a1d65b3f5bf7cdd05a6b96fb") version("0.5.7", sha256="8dfc0a458797f5d9fb622dd0efc52d796f23f0a1493a9527f4e49a550ae9a7e5") version("0.4.5", sha256="286eabd47e7d4d521d199cab84deca135557e6d1e0f0d01c29e757c3cb151b54") version("0.4.0", sha256="7457308d9ebf00d6a1c9a26aa755e477787a636c90b823f91cd7d4bea9e89260") diff --git a/var/spack/repos/builtin/packages/py-scikit-build-core/package.py b/var/spack/repos/builtin/packages/py-scikit-build-core/package.py index d80b5a92d67c81..f680202bcd6957 100644 --- a/var/spack/repos/builtin/packages/py-scikit-build-core/package.py +++ b/var/spack/repos/builtin/packages/py-scikit-build-core/package.py @@ -19,6 +19,7 @@ class PyScikitBuildCore(PythonPackage): license("Apache-2.0") + version("0.10.7", sha256="04cbb59fe795202a7eeede1849112ee9dcbf3469feebd9b8b36aa541336ac4f8") version("0.9.5", sha256="2a4cb119cc968fe87ae05582979657cc0e7be45655798446eabbe490e61ce072") version("0.8.2", sha256="50ec24b9568c9aa6e27233deeb2978932bc79856212b30575cbfa4049655c436") version("0.7.1", sha256="565f33e15f5aa4514248c508ce3ce40fb6f406f8c3983e891561757b1c9f78ab") diff --git a/var/spack/repos/builtin/packages/py-scikit-learn/package.py b/var/spack/repos/builtin/packages/py-scikit-learn/package.py index fcbcee75e02322..4fb94f843f70a0 100644 --- a/var/spack/repos/builtin/packages/py-scikit-learn/package.py +++ b/var/spack/repos/builtin/packages/py-scikit-learn/package.py @@ -19,6 +19,7 @@ class PyScikitLearn(PythonPackage): version("main", branch="main") version("master", branch="main", deprecated=True) + version("1.5.2", sha256="b4237ed7b3fdd0a4882792e68ef2545d5baa50aca3bb45aa7df468138ad8f94d") version("1.5.1", sha256="0ea5d40c0e3951df445721927448755d3fe1d80833b0b7308ebff5d2a45e6414") version("1.5.0", sha256="789e3db01c750ed6d496fa2db7d50637857b451e57bcae863bff707c1247bef7") version("1.4.2", sha256="daa1c471d95bad080c6e44b4946c9390a4842adc3082572c20e4f8884e39e959") @@ -48,8 +49,8 @@ class PyScikitLearn(PythonPackage): version("0.22.1", sha256="51ee25330fc244107588545c70e2f3570cfc4017cff09eed69d6e1d82a212b7d") version("0.22", sha256="314abf60c073c48a1e95feaae9f3ca47a2139bd77cebb5b877c23a45c9e03012") - depends_on("c", type="build") # generated - depends_on("cxx", type="build") # generated + depends_on("c", type="build") + depends_on("cxx", type="build") # Based on PyPI wheel availability with default_args(type=("build", "link", "run")): diff --git a/var/spack/repos/builtin/packages/py-scipy/package.py b/var/spack/repos/builtin/packages/py-scipy/package.py index e1f64214dbdcac..79bb27a1d6bf19 100644 --- a/var/spack/repos/builtin/packages/py-scipy/package.py +++ b/var/spack/repos/builtin/packages/py-scipy/package.py @@ -136,7 +136,8 @@ class PyScipy(PythonPackage): # meson.build # https://docs.scipy.org/doc/scipy/dev/toolchain.html#compilers - conflicts("%gcc@:7", when="@1.10:", msg="SciPy requires GCC >= 8.0") + conflicts("%gcc@:7", when="@1.10:", msg="SciPy 1.10-1.13 requires GCC >= 8.0") + conflicts("%gcc@:9.0", when="@1.14:", msg="SciPy 1.14: requires GCC >= 9.1") conflicts("%gcc@:4.7", when="@:1.9", msg="SciPy requires GCC >= 4.8") conflicts("%apple-clang@:9", when="@1.10:", msg="SciPy requires Apple Clang >= 10") conflicts( @@ -145,6 +146,8 @@ class PyScipy(PythonPackage): msg="SciPy requires at least vc142 (default with Visual Studio 2019) " "when building with MSVC", ) + # https://github.com/spack/spack/issues/45718 + conflicts("%aocc", msg="SciPy doesn't compile with AOCC yet") # https://github.com/scipy/scipy/issues/19831 conflicts("^openblas@0.3.26:", when="@:1.12") @@ -218,18 +221,21 @@ def setup_build_environment(self, env): if self.spec.satisfies("@:1.8"): self.spec["py-numpy"].package.setup_build_environment(env) - # https://github.com/scipy/scipy/issues/19357 - if self.spec.satisfies("%apple-clang@15:"): - env.append_flags("LDFLAGS", "-Wl,-ld_classic") - @when("@1.9:") def config_settings(self, spec, prefix): blas, lapack = self.spec["py-numpy"].package.blas_lapack_pkg_config() + + if spec.satisfies("%aocc") or spec.satisfies("%clang@18:"): + fortran_std = "none" + else: + fortran_std = "legacy" + return { "builddir": "build", "compile-args": f"-j{make_jobs}", "setup-args": { # http://scipy.github.io/devdocs/building/blas_lapack.html + "-Dfortran_std": fortran_std, "-Dblas": blas, "-Dlapack": lapack, }, diff --git a/var/spack/repos/builtin/packages/py-sequence-models/package.py b/var/spack/repos/builtin/packages/py-sequence-models/package.py new file mode 100644 index 00000000000000..5f863540da0947 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-sequence-models/package.py @@ -0,0 +1,18 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PySequenceModels(PythonPackage): + """Pytorch modules and utilities for modeling biological sequence data.""" + + homepage = "https://github.com/microsoft/protein-sequence-models" + pypi = "sequence-models/sequence-models-1.8.0.tar.gz" + + license("BSD-1-Clause") + + version("1.8.0", sha256="b031e8bc3edce60311000c2cfe237e533929ecffe6cf4364bd57f0178f541beb") + depends_on("py-setuptools", type="build") diff --git a/var/spack/repos/builtin/packages/py-slepc4py/package.py b/var/spack/repos/builtin/packages/py-slepc4py/package.py index 59fd8fc378a727..f02707046b5aed 100644 --- a/var/spack/repos/builtin/packages/py-slepc4py/package.py +++ b/var/spack/repos/builtin/packages/py-slepc4py/package.py @@ -18,6 +18,9 @@ class PySlepc4py(PythonPackage): license("BSD-2-Clause") version("main", branch="main") + version("3.22.0", sha256="53db52a72e126787768732790ca73dbc6ff6e49d4d1152e9c3641ba71b97738e") + version("3.21.2", sha256="f611ff74e4749f21445b2369dbd0edf404cdf639eecafd54187d0a2865d521a0") + version("3.21.1", sha256="bc8e0e270643eef9b63b249080b8fe4433be0b697d55032d9f768ef310bd7b07") version("3.21.0", sha256="bfbd90162633486f67a448d2052e1f7182529d18e8bde87367bc4f4dd58e857f") version("3.20.2", sha256="89ebd1964edd0eb63d4dbfa977d6f35408f4e19a3da290696fd1197901544bd8") version("3.20.1", sha256="7e6d156f7b0891bfa0616b38a502460c62797f16ca146b321e16cce4cf139d07") @@ -45,19 +48,28 @@ class PySlepc4py(PythonPackage): patch("ldshared.patch", when="@:3.18") + depends_on("py-cython@3:", when="@3.20:", type="build") depends_on("py-cython@0.29.32:", when="^python@3.11:", type="build") depends_on("py-cython@0.24:", type="build") depends_on("py-setuptools", type="build") depends_on("py-numpy", type=("build", "run")) - depends_on("py-petsc4py", type=("build", "run")) depends_on("py-petsc4py@main", when="@main", type=("build", "run")) - for ver in ["3.21", "3.20", "3.19", "3.18", "3.17", "3.16", "3.15", "3.13", "3.12", "3.11"]: - depends_on(f"py-petsc4py@{ver}", when=f"@{ver}", type=("build", "run")) - - depends_on("slepc") depends_on("slepc@main", when="@main") - for ver in ["3.21", "3.20", "3.19", "3.18", "3.17", "3.16", "3.15", "3.13", "3.12", "3.11"]: + for ver in [ + "3.22", + "3.21", + "3.20", + "3.19", + "3.18", + "3.17", + "3.16", + "3.15", + "3.13", + "3.12", + "3.11", + ]: + depends_on(f"py-petsc4py@{ver}", when=f"@{ver}", type=("build", "run")) depends_on(f"slepc@{ver}", when=f"@{ver}") @property diff --git a/var/spack/repos/builtin/packages/py-snakemake-executor-plugin-cluster-generic/package.py b/var/spack/repos/builtin/packages/py-snakemake-executor-plugin-cluster-generic/package.py index 54e8d64dee44e4..cd7944bb93e333 100644 --- a/var/spack/repos/builtin/packages/py-snakemake-executor-plugin-cluster-generic/package.py +++ b/var/spack/repos/builtin/packages/py-snakemake-executor-plugin-cluster-generic/package.py @@ -13,15 +13,19 @@ class PySnakemakeExecutorPluginClusterGeneric(PythonPackage): homepage = "https://github.com/snakemake/snakemake-executor-plugin-cluster-generic" pypi = ( "snakemake_executor_plugin_cluster_generic/" - "snakemake_executor_plugin_cluster_generic-1.0.7.tar.gz" + "snakemake_executor_plugin_cluster_generic-1.0.9.tar.gz" ) license("MIT") + version("1.0.9", sha256="ad0dc2d8bde7d4f336364bebe11a3b2209653c481ce8fbb0ae8bec81016a9a14") version("1.0.7", sha256="093808e63cc48294a9d1eb0b620cdff8cc970806294a2f6ba127a49f8a81d473") depends_on("py-snakemake-interface-common@1.13:1", type=("build", "run")) - depends_on("py-snakemake-interface-executor-plugins@8.1:8", type=("build", "run")) + depends_on("py-snakemake-interface-executor-plugins@9", type=("build", "run"), when="@1.0.9:") + depends_on( + "py-snakemake-interface-executor-plugins@8.1:8", type=("build", "run"), when="@:1.0.8" + ) depends_on("python@3.11:3", type=("build", "run")) depends_on("py-poetry-core", type="build") diff --git a/var/spack/repos/builtin/packages/py-snakemake-executor-plugin-cluster-sync/package.py b/var/spack/repos/builtin/packages/py-snakemake-executor-plugin-cluster-sync/package.py index afbf359c6800d8..820568fa6a4f45 100644 --- a/var/spack/repos/builtin/packages/py-snakemake-executor-plugin-cluster-sync/package.py +++ b/var/spack/repos/builtin/packages/py-snakemake-executor-plugin-cluster-sync/package.py @@ -13,15 +13,19 @@ class PySnakemakeExecutorPluginClusterSync(PythonPackage): homepage = "https://github.com/snakemake/snakemake-executor-plugin-cluster-sync" pypi = ( "snakemake_executor_plugin_cluster_sync/" - "snakemake_executor_plugin_cluster_sync-0.1.3.tar.gz" + "snakemake_executor_plugin_cluster_sync-0.1.4.tar.gz" ) license("MIT") + version("0.1.4", sha256="6a6dcb2110d4c2ee74f9a48ea68e0fd7ddd2800672ebef00a01faa4affa835ad") version("0.1.3", sha256="c30fca6ccb98a3f7ca52ca8a95414c71360a3d4a835bd4a097a13445d6fce2ac") depends_on("py-snakemake-interface-common@1.14:1", type=("build", "run")) - depends_on("py-snakemake-interface-executor-plugins@8.1:8", type=("build", "run")) + depends_on("py-snakemake-interface-executor-plugins@9", type=("build", "run"), when="@0.1.4:") + depends_on( + "py-snakemake-interface-executor-plugins@8.1:8", type=("build", "run"), when="@:0.1.3" + ) depends_on("python@3.11:3", type=("build", "run")) depends_on("py-poetry-core", type="build") diff --git a/var/spack/repos/builtin/packages/py-snakemake-executor-plugin-slurm-jobstep/package.py b/var/spack/repos/builtin/packages/py-snakemake-executor-plugin-slurm-jobstep/package.py index 15593ccf5b4c8b..83d1ce32da5b02 100644 --- a/var/spack/repos/builtin/packages/py-snakemake-executor-plugin-slurm-jobstep/package.py +++ b/var/spack/repos/builtin/packages/py-snakemake-executor-plugin-slurm-jobstep/package.py @@ -14,15 +14,21 @@ class PySnakemakeExecutorPluginSlurmJobstep(PythonPackage): homepage = "https://github.com/snakemake/snakemake-executor-plugin-slurm-jobstep" pypi = ( "snakemake_executor_plugin_slurm_jobstep/" - "snakemake_executor_plugin_slurm_jobstep-0.1.9.tar.gz" + "snakemake_executor_plugin_slurm_jobstep-0.2.1.tar.gz" ) + maintainers("w8jcik") license("MIT") + version("0.2.1", sha256="58894d52b5998a34fa6f60ec511ff0bfde4a9ec96714bcaa3cd2f46cf8a33859") + version("0.1.11", sha256="cafdac937796ab0dfc0354c42380167a44a1db00c4edc98ab736a6ace2201a94") version("0.1.10", sha256="321b6bdf7883a8fb40ff4aeeb88633502e4db8394e40b6628db41a430c2eae2b") depends_on("py-snakemake-interface-common@1.13:1", type=("build", "run")) - depends_on("py-snakemake-interface-executor-plugins@8.2:8", type=("build", "run")) + depends_on("py-snakemake-interface-executor-plugins@9", type=("build", "run"), when="@0.1.11:") + depends_on( + "py-snakemake-interface-executor-plugins@8.2:8", type=("build", "run"), when="@:0.1.10" + ) depends_on("python@3.11:3", type=("build", "run")) depends_on("py-poetry-core", type="build") diff --git a/var/spack/repos/builtin/packages/py-snakemake-executor-plugin-slurm/package.py b/var/spack/repos/builtin/packages/py-snakemake-executor-plugin-slurm/package.py index 1b15b631b73c4f..ecfeaec56d4d31 100644 --- a/var/spack/repos/builtin/packages/py-snakemake-executor-plugin-slurm/package.py +++ b/var/spack/repos/builtin/packages/py-snakemake-executor-plugin-slurm/package.py @@ -11,17 +11,36 @@ class PySnakemakeExecutorPluginSlurm(PythonPackage): """A Snakemake executor plugin for submitting jobs to a SLURM cluster.""" homepage = "https://github.com/snakemake/snakemake-executor-plugin-slurm" - pypi = "snakemake_executor_plugin_slurm/snakemake_executor_plugin_slurm-0.3.1.tar.gz" + pypi = "snakemake_executor_plugin_slurm/snakemake_executor_plugin_slurm-0.10.0.tar.gz" + maintainers("w8jcik") license("MIT") + version("0.10.0", sha256="d970bd08e00f1664adbd3c421c956b2ce926359ff10a4d7650c444c1179bec3f") version("0.3.2", sha256="3912f2895eab1270d7a42959a2e221ce53428dfffb847e03ec6bc4eead88e30b") depends_on("py-throttler@1.2.2:1", type=("build", "run")) depends_on("py-snakemake-interface-common@1.13:1", type=("build", "run")) - depends_on("py-snakemake-interface-executor-plugins@8.2:8", type=("build", "run")) - depends_on("py-snakemake-executor-plugin-slurm-jobstep@0.1.10:0.1", type=("build", "run")) + + depends_on( + "py-snakemake-interface-executor-plugins@9.1.1:9", type=("build", "run"), when="@0.4.4:" + ) + depends_on( + "py-snakemake-interface-executor-plugins@9", type=("build", "run"), when="@0.4.2:0.4.3" + ) + depends_on( + "py-snakemake-interface-executor-plugins@8.2:8", type=("build", "run"), when="@:0.4.1" + ) + + depends_on( + "py-snakemake-executor-plugin-slurm-jobstep@0.2", type=("build", "run"), when="@0.4.4:" + ) + depends_on( + "py-snakemake-executor-plugin-slurm-jobstep@0.1.10:0.1", + type=("build", "run"), + when="@:0.4.3", + ) depends_on("python@3.11:3", type=("build", "run")) depends_on("py-poetry-core", type="build") diff --git a/var/spack/repos/builtin/packages/py-snakemake-interface-common/package.py b/var/spack/repos/builtin/packages/py-snakemake-interface-common/package.py index 017b928098bab2..51ec9cf546a0a7 100644 --- a/var/spack/repos/builtin/packages/py-snakemake-interface-common/package.py +++ b/var/spack/repos/builtin/packages/py-snakemake-interface-common/package.py @@ -11,10 +11,12 @@ class PySnakemakeInterfaceCommon(PythonPackage): """Common functions and classes for Snakemake and its plugins.""" homepage = "https://github.com/snakemake/snakemake-interface-common" - pypi = "snakemake_interface_common/snakemake_interface_common-1.17.1.tar.gz" + pypi = "snakemake_interface_common/snakemake_interface_common-1.17.3.tar.gz" + maintainers("w8jcik") license("MIT") + version("1.17.3", sha256="cca6e2c728072a285a8e750f00fdd98d9c50063912184c41f8b89e4cab66c7b0") version("1.17.1", sha256="555c8218d9b68ddc1046f94a517e7d0f22e15bdc839d6ce149608d8ec137b9ae") depends_on("py-argparse-dataclass@2", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-snakemake-interface-executor-plugins/package.py b/var/spack/repos/builtin/packages/py-snakemake-interface-executor-plugins/package.py index e0932eb1a9cec5..7c95062efe8f75 100644 --- a/var/spack/repos/builtin/packages/py-snakemake-interface-executor-plugins/package.py +++ b/var/spack/repos/builtin/packages/py-snakemake-interface-executor-plugins/package.py @@ -12,10 +12,12 @@ class PySnakemakeInterfaceExecutorPlugins(PythonPackage): executor plugins.""" homepage = "https://github.com/snakemake/snakemake-interface-executor-plugins" - pypi = "snakemake_interface_executor_plugins/snakemake_interface_executor_plugins-8.2.0.tar.gz" + pypi = "snakemake_interface_executor_plugins/snakemake_interface_executor_plugins-9.2.0.tar.gz" + maintainers("w8jcik") license("MIT") + version("9.2.0", sha256="67feaf438a0b8b041ec5f1a1dd859f729036c70c07c9fdad895135f5b949e40a") version("8.2.0", sha256="4c74e3e1751bab6b266baf8688e854b8b4c5c5e10f5e34c581f42d69af4ff13b") depends_on("py-argparse-dataclass@2", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-snakemake-interface-storage-plugins/package.py b/var/spack/repos/builtin/packages/py-snakemake-interface-storage-plugins/package.py index e9ba417de471a8..1ff4436daef4e7 100644 --- a/var/spack/repos/builtin/packages/py-snakemake-interface-storage-plugins/package.py +++ b/var/spack/repos/builtin/packages/py-snakemake-interface-storage-plugins/package.py @@ -12,10 +12,12 @@ class PySnakemakeInterfaceStoragePlugins(PythonPackage): plugins.""" homepage = "https://github.com/snakemake/snakemake-interface-storage-plugins" - pypi = "snakemake_interface_storage_plugins/snakemake_interface_storage_plugins-3.1.0.tar.gz" + pypi = "snakemake_interface_storage_plugins/snakemake_interface_storage_plugins-3.3.0.tar.gz" + maintainers("w8jcik") license("MIT") + version("3.3.0", sha256="203d8f794dfb37d568ad01a6c375fa8beac36df8e488c0f9b9f75984769c362a") version("3.1.0", sha256="26e95be235ef2a9716b890ea96c3a9a2e62061c5d72fbb89c2fad2afada87304") depends_on("py-wrapt@1.15:1", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-sphinx-click/package.py b/var/spack/repos/builtin/packages/py-sphinx-click/package.py new file mode 100644 index 00000000000000..d39d10f5de8f84 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-sphinx-click/package.py @@ -0,0 +1,27 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PySphinxClick(PythonPackage): + """Sphinx plugin that allows you to automatically extract documentation + from a Click-based application and include it in your docs""" + + homepage = "https://sphinx-click.readthedocs.io/en/latest" + pypi = "sphinx_click/sphinx_click-6.0.0.tar.gz" + + maintainers("TomMelt") + + license("MIT", checked_by="tommelt") + + version("6.0.0", sha256="f5d664321dc0c6622ff019f1e1c84e58ce0cecfddeb510e004cf60c2a3ab465b") + + depends_on("py-setuptools", type="build") + + depends_on("py-click@8:", type=("build", "run")) + depends_on("py-sphinx@4:", type=("build", "run")) + depends_on("py-docutils", type=("build", "run")) + depends_on("py-pbr", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-sphinx-design/package.py b/var/spack/repos/builtin/packages/py-sphinx-design/package.py index 9c219c41d56ccf..e81ef6efa78f51 100644 --- a/var/spack/repos/builtin/packages/py-sphinx-design/package.py +++ b/var/spack/repos/builtin/packages/py-sphinx-design/package.py @@ -16,17 +16,21 @@ class PySphinxDesign(PythonPackage): license("MIT") + version("0.6.1", sha256="b44eea3719386d04d765c1a8257caca2b3e6f8421d7b3a5e742c0fd45f84e632") + version("0.6.0", sha256="ec8e3c5c59fed4049b3a5a2e209360feab31829346b5f6a0c7c342b894082192") version("0.5.0", sha256="e8e513acea6f92d15c6de3b34e954458f245b8e761b45b63950f65373352ab00") version("0.4.1", sha256="5b6418ba4a2dc3d83592ea0ff61a52a891fe72195a4c3a18b2fa1c7668ce4708") version("0.4.0", sha256="b92948614900967499617d99aadd38ce5975ede924a18c7478cc6b8ec188f76b") version("0.3.0", sha256="7183fa1fae55b37ef01bda5125a21ee841f5bbcbf59a35382be598180c4cefba") - depends_on("python@3.7:", when="@:0.4", type=("build", "run")) - depends_on("python@3.8:", when="@0.5:", type=("build", "run")) + depends_on("python@3.7:", type=("build", "run"), when="@:0.4") + depends_on("python@3.8:", type=("build", "run"), when="@0.5") + depends_on("python@3.9:", type=("build", "run"), when="@0.6:") depends_on("py-flit-core@3.4:3", type=("build")) depends_on("py-sphinx@4:5", when="@0.3", type=("build", "run")) depends_on("py-sphinx@4:6", when="@0.4", type=("build", "run")) - depends_on("py-sphinx@5:7", when="@0.5:", type=("build", "run")) + depends_on("py-sphinx@5:7", when="@0.5:0.6.0", type=("build", "run")) + depends_on("py-sphinx@6:8", when="@0.6.1:", type=("build", "run")) depends_on("py-pytest@7.1:", type="test") depends_on("py-pytest-cov", type="test") depends_on("py-pytest-regressions", type="test") diff --git a/var/spack/repos/builtin/packages/py-sphinx-fortran/package.py b/var/spack/repos/builtin/packages/py-sphinx-fortran/package.py new file mode 100644 index 00000000000000..dc67326bb26268 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-sphinx-fortran/package.py @@ -0,0 +1,26 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PySphinxFortran(PythonPackage): + """Fortran domain and autodoc extensions to Sphinx""" + + homepage = "https://sphinx-fortran.readthedocs.io" + pypi = "sphinx-fortran/sphinx-fortran-1.1.1.tar.gz" + git = "https://github.com/VACUMM/sphinx-fortran.git" + + maintainers("rbberger") + + license("CeCILL-2.1") + + version("master", branch="master") + version("1.1.1", sha256="e912e6b292e80768ad3cf580a560a4752c2c077eda4a1bbfc3a4ca0f11fb8ee1") + + depends_on("py-sphinx@1:") + depends_on("py-numpy@1:") + depends_on("py-six") + depends_on("py-future") diff --git a/var/spack/repos/builtin/packages/py-sphinx-tabs/package.py b/var/spack/repos/builtin/packages/py-sphinx-tabs/package.py index a5ff03ba61049a..c9364e27a99943 100644 --- a/var/spack/repos/builtin/packages/py-sphinx-tabs/package.py +++ b/var/spack/repos/builtin/packages/py-sphinx-tabs/package.py @@ -17,6 +17,7 @@ class PySphinxTabs(PythonPackage): license("MIT") + version("3.4.5", sha256="ba9d0c1e3e37aaadd4b5678449eb08176770e0fc227e769b6ce747df3ceea531") version("3.4.4", sha256="f1b72c4f23d1ba9cdcaf880fd883524bc70689f561b9785719b8b3c3c5ed0aca") version("3.4.1", sha256="d2a09f9e8316e400d57503f6df1c78005fdde220e5af589cc79d493159e1b832") version("3.3.1", sha256="d10dd7fb2700329b8e5948ab9f8e3ef54fff30f79d2e42cfd1b0089ae26e8c5e") diff --git a/var/spack/repos/builtin/packages/py-sphinx/package.py b/var/spack/repos/builtin/packages/py-sphinx/package.py index d1a65ac9dade5b..911040046c9b4a 100644 --- a/var/spack/repos/builtin/packages/py-sphinx/package.py +++ b/var/spack/repos/builtin/packages/py-sphinx/package.py @@ -16,6 +16,7 @@ class PySphinx(PythonPackage): license("BSD-2-Clause") + version("8.1.0", sha256="109454425dbf4c78ecfdd481e56f078376d077edbda29804dba05c5161c8de06") version("8.0.2", sha256="0cce1ddcc4fd3532cf1dd283bc7d886758362c5c1de6598696579ce96d8ffa5b") version("8.0.1", sha256="7f762c18cfc1d4493e42f4a06a204c1ca55806c53f80a059e208e88d0668d661") version("8.0.0", sha256="22551dc8fda6038a422bf1de59d91b31837b66afe45a3f30b2d8cc5aa9337343") @@ -107,15 +108,20 @@ class PySphinx(PythonPackage): depends_on("python@3.10:", when="@8:") depends_on("python@3.9:", when="@7.2:") depends_on("python@3.8:", when="@6:") + depends_on("py-sphinxcontrib-applehelp@1.0.7:", when="@8.1:") depends_on("py-sphinxcontrib-applehelp", when="@2:") + depends_on("py-sphinxcontrib-devhelp@1.0.6:", when="@8.1:") depends_on("py-sphinxcontrib-devhelp", when="@2:") - depends_on("py-sphinxcontrib-jsmath", when="@2:") + depends_on("py-sphinxcontrib-htmlhelp@2.0.6:", when="@8.1:") depends_on("py-sphinxcontrib-htmlhelp@2:", when="@4.1.1:") depends_on("py-sphinxcontrib-htmlhelp", when="@2:") + depends_on("py-sphinxcontrib-jsmath@1.0.1:", when="@8.1:") + depends_on("py-sphinxcontrib-jsmath", when="@2:") + depends_on("py-sphinxcontrib-qthelp@1.0.6:", when="@8.1:") + depends_on("py-sphinxcontrib-qthelp", when="@2:") depends_on("py-sphinxcontrib-serializinghtml@1.1.9:", when="@7.2.3:") depends_on("py-sphinxcontrib-serializinghtml@1.1.5:", when="@4.1.1:") depends_on("py-sphinxcontrib-serializinghtml", when="@2:") - depends_on("py-sphinxcontrib-qthelp", when="@2:") depends_on("py-jinja2@3.1:", when="@7.4:") depends_on("py-jinja2@3:", when="@5.2:") depends_on("py-jinja2@2.3:2", when="@:4.0.1") @@ -140,8 +146,9 @@ class PySphinx(PythonPackage): depends_on("py-babel@2.13:", when="@7.4:") depends_on("py-babel@2.9:", when="@5.2:") depends_on("py-babel@1.3:") - depends_on("py-alabaster@0.7.14:0.7", when="@7.3:") - depends_on("py-alabaster@0.7") + depends_on("py-alabaster@0.7.14:", when="@8:") + depends_on("py-alabaster@0.7.14:0.7", when="@7.3:7.4") + depends_on("py-alabaster@0.7", when="@:7.2") depends_on("py-imagesize@1.3:", when="@5.2:") depends_on("py-imagesize", when="@1.4:") depends_on("py-requests@2.30:", when="@7.4:") diff --git a/var/spack/repos/builtin/packages/py-sphinxcontrib-applehelp/package.py b/var/spack/repos/builtin/packages/py-sphinxcontrib-applehelp/package.py index e84d9762baadb4..b7a5a518c651b9 100644 --- a/var/spack/repos/builtin/packages/py-sphinxcontrib-applehelp/package.py +++ b/var/spack/repos/builtin/packages/py-sphinxcontrib-applehelp/package.py @@ -12,7 +12,7 @@ class PySphinxcontribApplehelp(PythonPackage): help books.""" homepage = "http://sphinx-doc.org/" - pypi = "sphinxcontrib-applehelp/sphinxcontrib-applehelp-1.0.1.tar.gz" + pypi = "sphinxcontrib-applehelp/sphinxcontrib_applehelp-2.0.0.tar.gz" git = "https://github.com/sphinx-doc/sphinxcontrib-applehelp.git" # 'sphinx' requires 'sphinxcontrib-applehelp' at build-time, but @@ -22,10 +22,21 @@ class PySphinxcontribApplehelp(PythonPackage): license("BSD-2-Clause") + version("2.0.0", sha256="2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1") version("1.0.4", sha256="828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e") version("1.0.2", sha256="a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58") version("1.0.1", sha256="edaa0ab2b2bc74403149cb0209d6775c96de797dfd5b5e2a71981309efab3897") - depends_on("python@3.8:", when="@1.0.3:", type=("build", "run")) - depends_on("py-setuptools@64:", when="@1.0.4:", type="build") - depends_on("py-setuptools", type="build") + depends_on("py-flit-core@3.7:", when="@1.0.5:", type="build") + depends_on("py-setuptools@64:", when="@1.0.4", type="build") + depends_on("py-setuptools", when="@:1.0.3", type="build") + + def url_for_version(self, version): + url = ( + "https://files.pythonhosted.org/packages/source/s/sphinxcontrib-applehelp/{}-{}.tar.gz" + ) + if version >= Version("1.0.5"): + name = "sphinxcontrib_applehelp" + else: + name = "sphinxcontrib-applehelp" + return url.format(name, version) diff --git a/var/spack/repos/builtin/packages/py-sphinxcontrib-devhelp/package.py b/var/spack/repos/builtin/packages/py-sphinxcontrib-devhelp/package.py index 5821a4002bb3dc..40586bb8b840f9 100644 --- a/var/spack/repos/builtin/packages/py-sphinxcontrib-devhelp/package.py +++ b/var/spack/repos/builtin/packages/py-sphinxcontrib-devhelp/package.py @@ -12,7 +12,7 @@ class PySphinxcontribDevhelp(PythonPackage): Devhelp document.""" homepage = "http://sphinx-doc.org/" - pypi = "sphinxcontrib-devhelp/sphinxcontrib-devhelp-1.0.1.tar.gz" + pypi = "sphinxcontrib-devhelp/sphinxcontrib_devhelp-2.0.0.tar.gz" git = "https://github.com/sphinx-doc/sphinxcontrib-devhelp.git" # 'sphinx' requires 'sphinxcontrib-devhelp' at build-time, but @@ -22,8 +22,17 @@ class PySphinxcontribDevhelp(PythonPackage): license("BSD-2-Clause") + version("2.0.0", sha256="411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad") version("1.0.2", sha256="ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4") version("1.0.1", sha256="6c64b077937330a9128a4da74586e8c2130262f014689b4b89e2d08ee7294a34") - depends_on("python@3.5:", type=("build", "run")) - depends_on("py-setuptools", type="build") + depends_on("py-flit-core@3.7:", when="@1.0.3:", type="build") + depends_on("py-setuptools", when="@:1.0.2", type="build") + + def url_for_version(self, version): + url = "https://files.pythonhosted.org/packages/source/s/sphinxcontrib-devhelp/{}-{}.tar.gz" + if version >= Version("1.0.3"): + name = "sphinxcontrib_devhelp" + else: + name = "sphinxcontrib-devhelp" + return url.format(name, version) diff --git a/var/spack/repos/builtin/packages/py-sphinxcontrib-htmlhelp/package.py b/var/spack/repos/builtin/packages/py-sphinxcontrib-htmlhelp/package.py index 036c046c8270d9..82942bc32cb639 100644 --- a/var/spack/repos/builtin/packages/py-sphinxcontrib-htmlhelp/package.py +++ b/var/spack/repos/builtin/packages/py-sphinxcontrib-htmlhelp/package.py @@ -12,7 +12,7 @@ class PySphinxcontribHtmlhelp(PythonPackage): document.""" homepage = "http://sphinx-doc.org/" - pypi = "sphinxcontrib-htmlhelp/sphinxcontrib-htmlhelp-1.0.2.tar.gz" + pypi = "sphinxcontrib-htmlhelp/sphinxcontrib_htmlhelp-2.1.0.tar.gz" git = "https://github.com/sphinx-doc/sphinxcontrib-htmlhelp.git" # 'sphinx' requires 'sphinxcontrib-htmlhelp' at build-time, but @@ -22,10 +22,21 @@ class PySphinxcontribHtmlhelp(PythonPackage): license("BSD-2-Clause") + version("2.1.0", sha256="c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9") version("2.0.1", sha256="0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff") version("2.0.0", sha256="f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2") version("1.0.2", sha256="4670f99f8951bd78cd4ad2ab962f798f5618b17675c35c5ac3b2132a14ea8422") - depends_on("python@3.8:", when="@2.0.1:", type=("build", "run")) + depends_on("py-flit-core@3.7:", when="@2.0.2:", type="build") depends_on("py-setuptools@64:", when="@2.0.1", type="build") - depends_on("py-setuptools", type="build") + depends_on("py-setuptools", when="@:2.0.0", type="build") + + def url_for_version(self, version): + url = ( + "https://files.pythonhosted.org/packages/source/s/sphinxcontrib-htmlhelp/{}-{}.tar.gz" + ) + if version >= Version("2.0.2"): + name = "sphinxcontrib_htmlhelp" + else: + name = "sphinxcontrib-htmlhelp" + return url.format(name, version) diff --git a/var/spack/repos/builtin/packages/py-sphinxcontrib-qthelp/package.py b/var/spack/repos/builtin/packages/py-sphinxcontrib-qthelp/package.py index d81e143c07664e..04aba1ae5cf225 100644 --- a/var/spack/repos/builtin/packages/py-sphinxcontrib-qthelp/package.py +++ b/var/spack/repos/builtin/packages/py-sphinxcontrib-qthelp/package.py @@ -12,7 +12,7 @@ class PySphinxcontribQthelp(PythonPackage): document.""" homepage = "http://sphinx-doc.org/" - pypi = "sphinxcontrib-qthelp/sphinxcontrib-qthelp-1.0.2.tar.gz" + pypi = "sphinxcontrib-qthelp/sphinxcontrib_qthelp-2.0.0.tar.gz" git = "https://github.com/sphinx-doc/sphinxcontrib-qthelp.git" # 'sphinx' requires 'sphinxcontrib-qthelp' at build-time, but @@ -22,8 +22,17 @@ class PySphinxcontribQthelp(PythonPackage): license("BSD-2-Clause") + version("2.0.0", sha256="4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab") version("1.0.3", sha256="4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72") version("1.0.2", sha256="79465ce11ae5694ff165becda529a600c754f4bc459778778c7017374d4d406f") - depends_on("python@3.5:", type=("build", "run")) - depends_on("py-setuptools", type="build") + depends_on("py-flit-core@3.7:", when="@1.0.4:", type="build") + depends_on("py-setuptools", when="@:1.0.3", type="build") + + def url_for_version(self, version): + url = "https://files.pythonhosted.org/packages/source/s/sphinxcontrib-qthelp/{}-{}.tar.gz" + if version >= Version("1.0.4"): + name = "sphinxcontrib_qthelp" + else: + name = "sphinxcontrib-qthelp" + return url.format(name, version) diff --git a/var/spack/repos/builtin/packages/py-sqlparse/package.py b/var/spack/repos/builtin/packages/py-sqlparse/package.py index 2d52fdf57a31e8..189600e195684c 100644 --- a/var/spack/repos/builtin/packages/py-sqlparse/package.py +++ b/var/spack/repos/builtin/packages/py-sqlparse/package.py @@ -14,6 +14,7 @@ class PySqlparse(PythonPackage): license("BSD-3-Clause") + version("0.5.1", sha256="a9f1a42ca749a019aa98d996b58e917f4c9e1b9ff164610355f35248733767bb") version("0.4.1", sha256="f75cdec98a4cc8296890279d744e1ae8618bb14dbad77e3d0637f0d7bb5d6535") version("0.3.1", sha256="344b539482b75c244ac69fbb160d0f4d63a288a392475c8418ca692c594561f9") version("0.3.0", sha256="a75fddae009fba1d66786203c9dd3a842aa4415475c466d15484139117108474") @@ -21,4 +22,6 @@ class PySqlparse(PythonPackage): version("0.2.3", sha256="12470ab41df1a7003a2957a79c6da9cd4ded180c8a193aa112fe0899b935ef30") depends_on("py-setuptools", type="build") + depends_on("py-hatchling", when="@0.5.1:", type="build") depends_on("python@2.7:2.8,3.4:", type=("build", "run")) + depends_on("python@3.8:", when="@0.5.1:", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-sspilib/package.py b/var/spack/repos/builtin/packages/py-sspilib/package.py new file mode 100644 index 00000000000000..5a73c74ff83e16 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-sspilib/package.py @@ -0,0 +1,22 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PySspilib(PythonPackage): + """SSPI API bindings for Python.""" + + homepage = "https://github.com/jborean93/sspilibi" + pypi = "sspilib/sspilib-0.1.0.tar.gz" + + maintainers("wdconinc") + + license("MIT", checked_by="wdconinc") + + version("0.1.0", sha256="58b5291553cf6220549c0f855e0e6973f4977375d8236ce47bb581efb3e9b1cf") + + depends_on("py-setuptools@61:", type="build") + depends_on("py-cython@3", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-striprtf/package.py b/var/spack/repos/builtin/packages/py-striprtf/package.py new file mode 100644 index 00000000000000..7e8dea330e226c --- /dev/null +++ b/var/spack/repos/builtin/packages/py-striprtf/package.py @@ -0,0 +1,19 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyStriprtf(PythonPackage): + """A simple library to convert rtf to text""" + + homepage = "https://github.com/joshy/striprtf" + pypi = "striprtf/striprtf-0.0.26.tar.gz" + + license("BSD-3-Clause", checked_by="qwertos") + + version("0.0.26", sha256="fdb2bba7ac440072d1c41eab50d8d74ae88f60a8b6575c6e2c7805dc462093aa") + + depends_on("py-setuptools", type="build") diff --git a/var/spack/repos/builtin/packages/py-tensorflow/package.py b/var/spack/repos/builtin/packages/py-tensorflow/package.py index 5f30ff88212b82..726f68b1c6cd09 100644 --- a/var/spack/repos/builtin/packages/py-tensorflow/package.py +++ b/var/spack/repos/builtin/packages/py-tensorflow/package.py @@ -8,6 +8,7 @@ import sys import tempfile +from spack.build_environment import optimization_flags from spack.package import * rocm_dependencies = [ @@ -386,12 +387,11 @@ class PyTensorflow(Package, CudaPackage, ROCmPackage, PythonExtension): conflicts("+rocm", when="@:2.7.4-a,2.7.4.0:2.11.0-a,2.11.0.0:2.14-a,2.14-z:2.16.1-a,2.16.1-z:") # wheel 0.40 upgrades vendored packaging, trips over tensorflow-io-gcs-filesystem identifier conflicts("^py-wheel@0.40:", when="@2.11:2.13") - # Must be matching versions of py-protobuf and protobuf - conflicts("^py-protobuf~cpp") # https://www.tensorflow.org/install/source#tested_build_configurations # https://github.com/tensorflow/tensorflow/issues/70199 # (-mavx512fp16 exists in gcc@12:) + conflicts("%gcc@13:", when="@:2.14") conflicts("%gcc@:11", when="@2.17:") conflicts("%gcc@:9.3.0", when="@2.9:") conflicts("%gcc@:7.3.0") @@ -459,17 +459,35 @@ class PyTensorflow(Package, CudaPackage, ROCmPackage, PythonExtension): ) # Fix for compiling with clang 18 which produces the following error # See https://github.com/tensorflow/tensorflow/issues/62416 - # ld.lld: error: version script assignment of 'global' to symbol 'init_pywrap_tf2' failed: symbol not defined - # ld.lld: error: version script assignment of 'global' to symbol 'init__pywrap_tf2' failed: symbol not defined + # ld.lld: error: version script assignment of 'global' to symbol 'init_pywrap_tf2' failed: + # symbol not defined + # ld.lld: error: version script assignment of 'global' to symbol 'init__pywrap_tf2' failed: + # symbol not defined # clang: error: linker command failed with exit code 1 (use -v to see invocation) # Target //tensorflow/tools/pip_package:build_pip_package failed to build patch( "https://raw.githubusercontent.com/getsolus/packages/dfc56ba57a8af8233a635e309b499ff5d27992f4/packages/t/tensorflow/files/fix-clang-18.diff", sha256="10d730b59284843d6c9ba92668b068582e51d5cdfc7ccfe8e26791ad0f41d4ac", - when="@2.15.0" + when="@2.15.0", ) phases = ["configure", "build", "install"] + def flag_handler(self, name, flags): + spec = self.spec + # ubuntu gcc has this workaround turned on by default in aarch64 + # and it causes issues with symbol relocation during link + # note, archspec doesn't currently ever report cortex_a53! + if ( + name == "ldflags" + and spec.target.family == "aarch64" + and "ubuntu" in spec.os + and spec.compiler.name == "gcc" + and "cortex_a53" not in spec.target.name + ): + flags.append("-mno-fix-cortex-a53-843419") + + return (flags, None, None) + # https://www.tensorflow.org/install/source def setup_build_environment(self, env): spec = self.spec @@ -650,10 +668,8 @@ def setup_build_environment(self, env): # Please note that each additional compute capability significantly # increases your build time and binary size, and that TensorFlow # only supports compute capabilities >= 3.5 - capabilities = ",".join( - "{0:.1f}".format(float(i) / 10.0) for i in spec.variants["cuda_arch"].value - ) - env.set("TF_CUDA_COMPUTE_CAPABILITIES", capabilities) + capabilities = CudaPackage.compute_capabilities(spec.variants["cuda_arch"].value) + env.set("TF_CUDA_COMPUTE_CAPABILITIES", ",".join(capabilities)) else: env.set("TF_NEED_CUDA", "0") @@ -678,7 +694,7 @@ def setup_build_environment(self, env): # Please specify optimization flags to use during compilation when # bazel option '--config=opt' is specified - env.set("CC_OPT_FLAGS", spec.architecture.target.optimization_flags(spec.compiler)) + env.set("CC_OPT_FLAGS", optimization_flags(self.compiler, spec.target)) # Would you like to interactively configure ./WORKSPACE for # Android builds? diff --git a/var/spack/repos/builtin/packages/py-termgraph/package.py b/var/spack/repos/builtin/packages/py-termgraph/package.py new file mode 100644 index 00000000000000..96d8d50294a65f --- /dev/null +++ b/var/spack/repos/builtin/packages/py-termgraph/package.py @@ -0,0 +1,23 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyTermgraph(PythonPackage): + """Command-line tool that draws basic graphs in the terminal, written in + Python.""" + + homepage = "https://github.com/mkaz/termgraph" + pypi = "termgraph/termgraph-0.5.3.tar.gz" + + maintainers("TomMelt") + + license("MIT", checked_by="tommelt") + + version("0.5.3", sha256="36ff2098e41eeab1e7cdda7366dc3e5b514ea799fa3e77537564492a7edefdd5") + + depends_on("py-setuptools", type="build") + depends_on("py-colorama", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-tifffile/package.py b/var/spack/repos/builtin/packages/py-tifffile/package.py index 7e6a9e6555553d..0d7893262e508d 100644 --- a/var/spack/repos/builtin/packages/py-tifffile/package.py +++ b/var/spack/repos/builtin/packages/py-tifffile/package.py @@ -14,6 +14,7 @@ class PyTifffile(PythonPackage): license("BSD-3-Clause") + version("2024.8.30", sha256="2c9508fe768962e30f87def61819183fb07692c258cb175b3c114828368485a4") version("2023.8.30", sha256="6a8c53b012a286b75d09a1498ab32f202f24cc6270a105b5d5911dc4426f162a") version( "2022.10.10", sha256="50b61ba943b866d191295bc38a00191c9fdab23ece063544c7f1a264e3f6aa8e" diff --git a/var/spack/repos/builtin/packages/py-torch-fidelity/package.py b/var/spack/repos/builtin/packages/py-torch-fidelity/package.py new file mode 100644 index 00000000000000..df20602e79c3f8 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-torch-fidelity/package.py @@ -0,0 +1,33 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +import os + +from spack.package import * + + +class PyTorchFidelity(PythonPackage): + """High-fidelity performance metrics for generative models in PyTorch""" + + homepage = "https://www.github.com/toshas/torch-fidelity" + pypi = "torch_fidelity/torch_fidelity-0.3.0.tar.gz" + + license("Apache-2.0", checked_by="qwertos") + + version("0.3.0", sha256="3d3e33db98919759cc4f3f24cb27e1e74bdc7c905d90a780630e4e1c18492b66") + + depends_on("py-setuptools", type="build") + depends_on("py-numpy", type=("build", "run")) + depends_on("pil", type=("build", "run")) + depends_on("py-scipy", type=("build", "run")) + depends_on("py-torch", type=("build", "run")) + depends_on("py-torchvision", type=("build", "run")) + depends_on("py-tqdm", type=("build", "run")) + + def patch(self): + os.rename( + join_path(self.stage.source_path, "torch_fidelity.egg-info", "requires.txt"), + join_path(self.stage.source_path, "requirements.txt"), + ) diff --git a/var/spack/repos/builtin/packages/py-torch/package.py b/var/spack/repos/builtin/packages/py-torch/package.py index 2b9ed871e2c339..f487eff524b528 100644 --- a/var/spack/repos/builtin/packages/py-torch/package.py +++ b/var/spack/repos/builtin/packages/py-torch/package.py @@ -26,6 +26,7 @@ class PyTorch(PythonPackage, CudaPackage, ROCmPackage): license("BSD-3-Clause") version("main", branch="main") + version("2.4.1", tag="v2.4.1", commit="ee1b6804381c57161c477caa380a840a84167676") version("2.4.0", tag="v2.4.0", commit="d990dada86a8ad94882b5c23e859b88c0c255bda") version("2.3.1", tag="v2.3.1", commit="63d5e9221bedd1546b7d364b5ce4171547db12a9") version("2.3.0", tag="v2.3.0", commit="97ff6cfd9c86c5c09d7ce775ab64ec5c99230f5d") @@ -229,12 +230,12 @@ class PyTorch(PythonPackage, CudaPackage, ROCmPackage): depends_on("pthreadpool@2020-10-05", when="@1.8") depends_on("pthreadpool@2020-06-15", when="@1.6:1.7") with default_args(type=("build", "link", "run")): - depends_on("py-pybind11@2.12.0", when="@2.3:") - depends_on("py-pybind11@2.11.0", when="@2.1:2.2") - depends_on("py-pybind11@2.10.1", when="@2.0") - depends_on("py-pybind11@2.10.0", when="@1.13:1") - depends_on("py-pybind11@2.6.2", when="@1.8:1.12") - depends_on("py-pybind11@2.3.0", when="@:1.7") + depends_on("py-pybind11@2.12.0:", when="@2.3:") + depends_on("py-pybind11@2.11.0:", when="@2.1:2.2") + depends_on("py-pybind11@2.10.1:", when="@2.0") + depends_on("py-pybind11@2.10.0:", when="@1.13:1") + depends_on("py-pybind11@2.6.2:", when="@1.8:1.12") + depends_on("py-pybind11@2.3.0:", when="@:1.7") depends_on("sleef@3.6.0_2024-03-20", when="@2.4:") depends_on("sleef@3.5.1_2020-12-22", when="@1.8:2.3") depends_on("sleef@3.4.0_2019-07-30", when="@1.6:1.7") @@ -486,10 +487,10 @@ def patch(self): def torch_cuda_arch_list(self, env): if "+cuda" in self.spec: - torch_cuda_arch = ";".join( - "{0:.1f}".format(float(i) / 10.0) for i in self.spec.variants["cuda_arch"].value + torch_cuda_arch = CudaPackage.compute_capabilities( + self.spec.variants["cuda_arch"].value ) - env.set("TORCH_CUDA_ARCH_LIST", torch_cuda_arch) + env.set("TORCH_CUDA_ARCH_LIST", ";".join(torch_cuda_arch)) def setup_build_environment(self, env): """Set environment variables used to control the build. @@ -531,6 +532,7 @@ def enable_or_disable(variant, keyword="USE", var=None): enable_or_disable("cuda") if "+cuda" in self.spec: + env.set("CUDA_TOOLKIT_ROOT_DIR", self.spec["cuda"].prefix) # Linux/macOS env.set("CUDA_HOME", self.spec["cuda"].prefix) # Linux/macOS env.set("CUDA_PATH", self.spec["cuda"].prefix) # Windows self.torch_cuda_arch_list(env) @@ -683,10 +685,6 @@ def enable_or_disable(variant, keyword="USE", var=None): else: env.set("BUILD_CUSTOM_PROTOBUF", "OFF") - # https://github.com/pytorch/pytorch/issues/111086 - if self.spec.satisfies("%apple-clang@15:"): - env.append_flags("LDFLAGS", "-Wl,-ld_classic") - def setup_run_environment(self, env): self.torch_cuda_arch_list(env) diff --git a/var/spack/repos/builtin/packages/py-torchaudio/package.py b/var/spack/repos/builtin/packages/py-torchaudio/package.py index 52370110d7bbd7..372cbca9367dea 100644 --- a/var/spack/repos/builtin/packages/py-torchaudio/package.py +++ b/var/spack/repos/builtin/packages/py-torchaudio/package.py @@ -18,6 +18,7 @@ class PyTorchaudio(PythonPackage): maintainers("adamjstewart") version("main", branch="main") + version("2.4.1", tag="v2.4.1", commit="e8cbe17769796ce963fbc71b8990f1474774e6d2") version("2.4.0", tag="v2.4.0", commit="69d40773dc4ed86643820c21a8a880e4d074a46e") version("2.3.1", tag="v2.3.1", commit="3edcf69e78a3c9a3077a11159861422440ec7d4a") version("2.3.0", tag="v2.3.0", commit="952ea7457bcc3ed0669e7741ff23015c426d6322") @@ -61,6 +62,7 @@ class PyTorchaudio(PythonPackage): depends_on("python@:3.8", when="@:0.7.0") depends_on("py-torch@main", when="@main") + depends_on("py-torch@2.4.1", when="@2.4.1") depends_on("py-torch@2.4.0", when="@2.4.0") depends_on("py-torch@2.3.1", when="@2.3.1") depends_on("py-torch@2.3.0", when="@2.3.0") @@ -104,7 +106,12 @@ class PyTorchaudio(PythonPackage): depends_on("sox") # https://github.com/pytorch/audio/pull/3811 - depends_on("cuda@:12.4", when="^py-torch+cuda") + patch( + "https://github.com/pytorch/audio/pull/3811.patch?full_index=1", + sha256="34dce3403abb03f62827e8a1efcdb2bf7742477a01f155ebb9c7fefe9588b132", + when="@2.2:", + ) + conflicts("^cuda@12.5:", when="@:2.1") def setup_build_environment(self, env): # tools/setup_helpers/extension.py diff --git a/var/spack/repos/builtin/packages/py-torchgeo/package.py b/var/spack/repos/builtin/packages/py-torchgeo/package.py index b5bf08f9c49e9f..294c237b33842d 100644 --- a/var/spack/repos/builtin/packages/py-torchgeo/package.py +++ b/var/spack/repos/builtin/packages/py-torchgeo/package.py @@ -17,6 +17,7 @@ class PyTorchgeo(PythonPackage): maintainers("adamjstewart", "calebrob6") version("main", branch="main") + version("0.6.1", sha256="38c930917ea341d05a7a611ff74c017f29482df7455d50e287ea79dec7d0a14b") version("0.6.0", sha256="c5b073b3c9ac06cd68e45620bab3a78fb7637fa3563aae4f75f4781ba57aee5a") version("0.5.2", sha256="b23df51fe53ebe66c8d555484605a5618985f3680b70275f99ce8665e7203560") version("0.5.1", sha256="5f86a34d18fe36eeb9146b057b21e5356252ef8ab6a9db33feebb120a01feff8") @@ -162,7 +163,7 @@ class PyTorchgeo(PythonPackage): depends_on("py-radiant-mlhub@0.2.1:0.4", when="@:0.4.0") depends_on("py-rarfile@4:", when="@0.5") depends_on("py-rarfile@3:", when="@:0.4") - depends_on("py-zipfile-deflate64@0.2:", when="@0.2.1:") + depends_on("py-zipfile-deflate64@0.2:", when="@0.2.1:0.5") with when("+docs"), default_args(type="run"): depends_on("py-ipywidgets@7:") @@ -204,3 +205,5 @@ class PyTorchgeo(PythonPackage): conflicts("py-lightning@2.3", when="@0.4.1:") # https://github.com/microsoft/torchgeo/pull/2151 conflicts("py-numpy@2:", when="@:0.5") + # https://github.com/rasterio/rasterio/issues/3196 + conflicts("py-rasterio@1.4:") diff --git a/var/spack/repos/builtin/packages/py-torchmetrics/package.py b/var/spack/repos/builtin/packages/py-torchmetrics/package.py index 122fb8c485aed9..70bc52fafa24bd 100644 --- a/var/spack/repos/builtin/packages/py-torchmetrics/package.py +++ b/var/spack/repos/builtin/packages/py-torchmetrics/package.py @@ -12,14 +12,19 @@ class PyTorchmetrics(PythonPackage): homepage = "https://github.com/PyTorchLightning/metrics" pypi = "torchmetrics/torchmetrics-0.3.1.tar.gz" - maintainers("adamjstewart") - license("Apache-2.0") + maintainers("adamjstewart") + version("1.4.3", sha256="5554a19167e91f543afe82ff58a01059c8eec854359ad22896449c2c8fb0ad89") + version("1.4.2", sha256="7a40cbec85e5645090812b87601696b4adf158294ec8c407ae58a71710938b87") version("1.4.0", sha256="0b1e5acdcc9beb05bfe369d3d56cfa5b143f060ebfd6079d19ccc59ba46465b3") version("1.3.2", sha256="0a67694a4c4265eeb54cda741eaf5cb1f3a71da74b7e7e6215ad156c9f2379f6") version("1.3.1", sha256="8d371f7597a1a5eb02d5f2ed59642d6fef09093926997ce91e18b1147cc8defa") - version("1.3.0", sha256="e8ac3adcc61e7a847d0504b0a0e0a3b7f57796178b239c6fafb5d20c0c9460ac") + version( + "1.3.0", + sha256="e8ac3adcc61e7a847d0504b0a0e0a3b7f57796178b239c6fafb5d20c0c9460ac", + deprecated=True, + ) # Yanked version("1.2.1", sha256="217387738f84939c39b534b20d4983e737cc448d27aaa5340e0327948d97ca3e") version("1.2.0", sha256="7eb28340bde45e13187a9ad54a4a7010a50417815d8181a5df6131f116ffe1b7") version("1.1.1", sha256="65ea34205c0506eecfd06b98f63f4d2a2c5c0e17367cf324e1747adc854c80a5") @@ -44,6 +49,8 @@ class PyTorchmetrics(PythonPackage): version("0.3.1", sha256="78f4057db53f7c219fdf9ec9eed151adad18dd43488a44e5c780806d218e3f1d") version("0.2.0", sha256="481a28759acd2d77cc088acba6bc7dc4a356c7cb767da2e1495e91e612e2d548") + variant("image", default=False, description="image support", when="@0.11.2:") + # setup.py depends_on("py-setuptools", type="build") @@ -60,7 +67,12 @@ class PyTorchmetrics(PythonPackage): depends_on("py-typing-extensions", when="@0.9: ^python@:3.8") depends_on("py-lightning-utilities@0.8:", when="@1.1:") depends_on("py-lightning-utilities@0.7:", when="@1:") - depends_on("py-pretty-errors@1.2.25", when="@1.4:") + + depends_on("py-scipy@1.0.1:", when="+image") + depends_on("py-torchvision@0.8:", when="+image") + depends_on("py-torch-fidelity", when="+image") + depends_on("py-lpips", when="@:1.2.0+image") # Historical dependencies + depends_on("py-pretty-errors@1.2.25", when="@1.4.0") depends_on("py-pydeprecate@0.3", when="@0.7:0.8") diff --git a/var/spack/repos/builtin/packages/py-torchvision/package.py b/var/spack/repos/builtin/packages/py-torchvision/package.py index 2bfe45fe87b443..1f17b6529d3052 100644 --- a/var/spack/repos/builtin/packages/py-torchvision/package.py +++ b/var/spack/repos/builtin/packages/py-torchvision/package.py @@ -19,6 +19,7 @@ class PyTorchvision(PythonPackage): license("BSD-3-Clause") version("main", branch="main") + version("0.19.1", sha256="083e75c467285595ec3eb3c7aa8493c19e53d7eb42f13046fb56a07c8897e5a8") version("0.19.0", sha256="4c499d0a412b5a21d55ac3c0a37e80ecd7e1f002f2a7b6b3b38a2de2544acbb6") version("0.18.1", sha256="347d472a9ceecc44e0bee1eda140d63cfaffc74a54ec07d4b98da7698ce75516") version("0.18.0", sha256="3e61cbac33986a862a59cd733fd65da8b2c2a6160a66556cfa0e850f62fd43c7") @@ -74,6 +75,7 @@ class PyTorchvision(PythonPackage): # https://github.com/pytorch/vision#installation depends_on("py-torch@main", when="@main") + depends_on("py-torch@2.4.1", when="@0.19.1") depends_on("py-torch@2.4.0", when="@0.19.0") depends_on("py-torch@2.3.1", when="@0.18.1") depends_on("py-torch@2.3.0", when="@0.18.0") @@ -150,6 +152,13 @@ class PyTorchvision(PythonPackage): # Many of the datasets require additional dependencies to use. # These can be installed after the fact. + def flag_handler(self, name, flags): + # https://github.com/pytorch/vision/issues/8653 + if name == "ldflags": + if self.spec.satisfies("%apple-clang@15:"): + flags.append("-Wl,-ld_classic") + return (flags, None, None) + def setup_build_environment(self, env): # The only documentation on building is what is found in setup.py and: # https://github.com/pytorch/vision/blob/main/CONTRIBUTING.md#development-installation diff --git a/var/spack/repos/builtin/packages/py-transformers/package.py b/var/spack/repos/builtin/packages/py-transformers/package.py index 05401c850db24d..fc4a35ae492a00 100644 --- a/var/spack/repos/builtin/packages/py-transformers/package.py +++ b/var/spack/repos/builtin/packages/py-transformers/package.py @@ -39,8 +39,8 @@ class PyTransformers(PythonPackage): depends_on("py-huggingface-hub@0.14.1:0", when="@4.26:") depends_on("py-huggingface-hub@0.10:0", when="@4.24:") depends_on("py-huggingface-hub@0.0.8", when="@4.6.1") - depends_on("py-numpy@1.17:", when="@4.6:") - depends_on("py-numpy") + depends_on("py-numpy@1.17:1", when="@4.6:") + depends_on("py-numpy@:1") depends_on("py-packaging@20:", when="@4.24:") depends_on("py-packaging", when="@4.6.1") depends_on("py-pyyaml@5.1:", when="@4.24:") diff --git a/var/spack/repos/builtin/packages/py-transonic/package.py b/var/spack/repos/builtin/packages/py-transonic/package.py new file mode 100644 index 00000000000000..01772b1c568f85 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-transonic/package.py @@ -0,0 +1,28 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyTransonic(PythonPackage): + """Make your Python code fly at transonic speeds!""" + + pypi = "transonic/transonic-0.7.2.tar.gz" + + maintainers("paugier") + + license("BSD-3-Clause", checked_by="paugier") + + version("0.7.2", sha256="d0c39c13b535df4f121a8a378efc42e3d3bf4e49536d131e6d26e9fe7d5a5bf4") + version("0.7.1", sha256="dcc59f1936d09129c800629cd4e6812571a74afe40dadd8193940b545e6ef03e") + + depends_on("python@3.9:", type=("build", "run")) + depends_on("py-pdm-backend", type="build") + + with default_args(type="run"): + depends_on("py-numpy") + depends_on("py-beniget@0.4") + depends_on("py-gast@0.5") + depends_on("py-autopep8") diff --git a/var/spack/repos/builtin/packages/py-twisted/package.py b/var/spack/repos/builtin/packages/py-twisted/package.py index 905983e2bdd302..c35061d4c6067b 100644 --- a/var/spack/repos/builtin/packages/py-twisted/package.py +++ b/var/spack/repos/builtin/packages/py-twisted/package.py @@ -10,36 +10,58 @@ class PyTwisted(PythonPackage): """An asynchronous networking framework written in Python""" homepage = "https://twistedmatrix.com/" - pypi = "Twisted/Twisted-21.7.0.tar.gz" + pypi = "Twisted/twisted-21.7.0.tar.gz" license("Unlicense") - version("21.7.0", sha256="2cd652542463277378b0d349f47c62f20d9306e57d1247baabd6d1d38a109006") - version("15.4.0", sha256="78862662fa9ae29654bc2b9d349c3f1d887e6b2ed978512c4442d53ea861f05c") - version("15.3.0", sha256="025729751cf898842262375a40f70ae1d246daea88369eab9f6bb96e528bf285") + version("24.7.0", sha256="5a60147f044187a127ec7da96d170d49bcce50c6fd36f594e60f4587eff4d394") + version("22.10.0", sha256="32acbd40a94f5f46e7b42c109bfae2b302250945561783a8b7a059048f2d4d31") + with default_args(deprecated=True): + # https://nvd.nist.gov/vuln/detail/CVE-2022-24801 + version( + "21.7.0", sha256="2cd652542463277378b0d349f47c62f20d9306e57d1247baabd6d1d38a109006" + ) + version( + "15.4.0", sha256="78862662fa9ae29654bc2b9d349c3f1d887e6b2ed978512c4442d53ea861f05c" + ) + version( + "15.3.0", sha256="025729751cf898842262375a40f70ae1d246daea88369eab9f6bb96e528bf285" + ) depends_on("python@3.6.7:", type=("build", "run"), when="@21.7.0:") + depends_on("python@3.7.1:", type=("build", "run"), when="@22.8.0:") - depends_on("py-setuptools", type="build") - depends_on("py-setuptools@35.0.2:", type="build", when="@21.7.0:") + with when("@:22.10"): + depends_on("py-setuptools", type="build") + depends_on("py-setuptools@35.0.2:", type="build", when="@21.7.0:") + with when("@23.8.0:"): + depends_on("py-hatchling@1.10.0:", type="build") + depends_on("py-hatch-fancy-pypi-readme@22.5.0:", type="build") + depends_on("py-incremental@22.10.0:", type="build") depends_on("py-zope-interface@4.0.2:", type=("build", "run")) depends_on("py-zope-interface@4.4.2:", type=("build", "run"), when="@21.7.0:") + depends_on("py-zope-interface@5:", type=("build", "run"), when="@23.8.0:") depends_on("py-incremental@21.3.0:", type=("build", "run"), when="@21.7.0:") + depends_on("py-incremental@22.10.0:", type=("build", "run"), when="@23.8.0:") depends_on("py-constantly@15.1:", type=("build", "run"), when="@21.7.0:") depends_on("py-automat@0.8.0:", type=("build", "run"), when="@21.7.0:") depends_on("py-hyperlink@17.1.1:", type=("build", "run"), when="@21.7.0:") depends_on("py-attrs@19.2.0:", type=("build", "run"), when="@21.7.0:") + depends_on("py-attrs@21.3.0:", type=("build", "run"), when="@23.8.0:") depends_on("py-typing-extensions@3.6.5:", type=("build", "run"), when="@21.7.0:") + depends_on("py-typing-extensions@3.10.0:", type=("build", "run"), when="@23.8.0:") def url_for_version(self, version): url = "https://pypi.io/packages/source/T/Twisted/" if version <= Version("20.3.0"): url += "Twisted-{0}.tar.bz2" - else: + elif version <= Version("22.10.0"): url += "Twisted-{0}.tar.gz" + else: + url += "twisted-{0}.tar.gz" url = url.format(version) return url diff --git a/var/spack/repos/builtin/packages/py-typing-extensions/package.py b/var/spack/repos/builtin/packages/py-typing-extensions/package.py index aef21d66be91a0..b1d8c9134589e9 100644 --- a/var/spack/repos/builtin/packages/py-typing-extensions/package.py +++ b/var/spack/repos/builtin/packages/py-typing-extensions/package.py @@ -17,6 +17,7 @@ class PyTypingExtensions(PythonPackage): license("0BSD") + version("4.12.2", sha256="1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8") version("4.8.0", sha256="df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef") version("4.6.3", sha256="d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5") version("4.5.0", sha256="5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb") diff --git a/var/spack/repos/builtin/packages/py-urllib3/package.py b/var/spack/repos/builtin/packages/py-urllib3/package.py index 543aa218a4b65c..afda2a2c6e4e6e 100644 --- a/var/spack/repos/builtin/packages/py-urllib3/package.py +++ b/var/spack/repos/builtin/packages/py-urllib3/package.py @@ -20,6 +20,7 @@ class PyUrllib3(PythonPackage): version("2.0.7", sha256="c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84") version("2.0.6", sha256="b19e1a85d206b56d7df1d5e683df4a7725252a964e3993648dd0fb5a1c157564") version("2.0.5", sha256="13abf37382ea2ce6fb744d4dad67838eec857c9f4f57009891805e0b5e123594") + version("1.26.20", sha256="40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32") version("1.26.14", sha256="076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72") version("1.26.12", sha256="3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e") version("1.26.6", sha256="f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f") diff --git a/var/spack/repos/builtin/packages/py-userpath/package.py b/var/spack/repos/builtin/packages/py-userpath/package.py index f7d62a92bbbff0..ec56a961db840a 100644 --- a/var/spack/repos/builtin/packages/py-userpath/package.py +++ b/var/spack/repos/builtin/packages/py-userpath/package.py @@ -13,10 +13,12 @@ class PyUserpath(PythonPackage): pypi = "userpath/userpath-1.8.0.tar.gz" license("MIT") - + version("1.9.0", sha256="85e3274543174477c62d5701ed43a3ef1051824a9dd776968adc411e58640dd1") version("1.8.0", sha256="04233d2fcfe5cff911c1e4fb7189755640e1524ff87a4b82ab9d6b875fee5787") + version("1.7.0", sha256="dcd66c5fa9b1a3c12362f309bbb5bc7992bac8af86d17b4e6b1a4b166a11c43f") depends_on("python@3.7:", type=("build", "run")) + depends_on("py-setuptools", type=("build", "run")) depends_on("py-hatchling", type="build") diff --git a/var/spack/repos/builtin/packages/py-uv/package.py b/var/spack/repos/builtin/packages/py-uv/package.py new file mode 100644 index 00000000000000..83d38a0f4771b5 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-uv/package.py @@ -0,0 +1,25 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class PyUv(PythonPackage): + """An extremely fast Python package and project manager, written in Rust.""" + + homepage = "https://github.com/astral-sh/uv" + pypi = "uv/0.4.15.tar.gz" + + license("APACHE 2.0 or MIT") + + version("0.4.17", sha256="01564bd760eff885ad61f44173647a569732934d1a4a558839c8088fbf75e53f") + version("0.4.16", sha256="2144995a87b161d063bd4ef8294b1e948677bd90d01f8394d0e3fca037bb847f") + version("0.4.15", sha256="8e36b8e07595fc6216d01e729c81a0b4ff029a93cc2ef987a73d3b650d6d559c") + + depends_on("rust@1.81:", type=("build", "run")) + depends_on("python@3.8:", type=("build", "run")) + depends_on("py-maturin@1:1", type=("build")) + + executables = ["^uv$"] diff --git a/var/spack/repos/builtin/packages/py-uwsgi/package.py b/var/spack/repos/builtin/packages/py-uwsgi/package.py index 21e987d0bc020f..96ffc84e448911 100644 --- a/var/spack/repos/builtin/packages/py-uwsgi/package.py +++ b/var/spack/repos/builtin/packages/py-uwsgi/package.py @@ -15,6 +15,7 @@ class PyUwsgi(PythonPackage): license("GPL-2.0-only") + version("2.0.27", sha256="3ee5bfb7e6e9c93478c22aa8183eef35b95a2d5b14cca16172e67f135565c458") version("2.0.18", sha256="4972ac538800fb2d421027f49b4a1869b66048839507ccf0aa2fda792d99f583") depends_on("c", type="build") # generated diff --git a/var/spack/repos/builtin/packages/py-validators/package.py b/var/spack/repos/builtin/packages/py-validators/package.py index b2baef6d013cd2..657a8959fd671c 100644 --- a/var/spack/repos/builtin/packages/py-validators/package.py +++ b/var/spack/repos/builtin/packages/py-validators/package.py @@ -14,7 +14,8 @@ class PyValidators(PythonPackage): license("MIT") + version("0.34.0", sha256="647fe407b45af9a74d245b943b18e6a816acf4926974278f6dd617778e1e781f") version("0.20.0", sha256="24148ce4e64100a2d5e267233e23e7afeb55316b47d30faae7eb6e7292bc226a") depends_on("py-setuptools", type="build") - depends_on("py-decorator@3.4:", type=("build", "run")) + depends_on("py-decorator@3.4:", type=("build", "run"), when="@:0.20.7") diff --git a/var/spack/repos/builtin/packages/py-vector/package.py b/var/spack/repos/builtin/packages/py-vector/package.py index de058582e471f0..fb9fe5aa95a045 100644 --- a/var/spack/repos/builtin/packages/py-vector/package.py +++ b/var/spack/repos/builtin/packages/py-vector/package.py @@ -16,8 +16,9 @@ class PyVector(PythonPackage): tags = ["hep"] - license("BSD-3-Clause") + license("BSD-3-Clause", checked_by="wdconinc") + version("1.5.1", sha256="41ec731fb67ea35af2075eb3a4d6c83ef93b580dade63010821cbc00f1b98961") version("1.5.0", sha256="77e48bd40b7e7d30a17bf79bb6ed0f2d6985d915fcb9bf0879836276a619a0a9") version("1.4.2", sha256="3805848eb9e53e9c60aa24dd5be88c842a6cd3d241e22984bfe12629b08536a9") version("1.4.1", sha256="15aef8911560db1ea3ffa9dbd5414d0ec575a504a2c3f23ea45170a18994466e") @@ -43,7 +44,7 @@ class PyVector(PythonPackage): depends_on("py-setuptools@42:", type="build") depends_on("py-setuptools-scm@3.4: +toml", type="build") depends_on("py-wheel", type="build") - depends_on("py-numpy@1.13.3:2.0", type=("build", "run")) + depends_on("py-numpy@1.13.3:", type=("build", "run")) depends_on("py-packaging@19.0:", type=("build", "run")) depends_on("py-importlib-metadata@0.22:", type=("build", "run"), when="@:1.0 ^python@:3.7") depends_on("py-typing-extensions", type=("build", "run"), when="@:1.0 ^python@:3.7") @@ -51,3 +52,6 @@ class PyVector(PythonPackage): with when("+awkward"): depends_on("py-awkward@1.2:", type=("build", "run")) depends_on("py-awkward@2:", type=("build", "run"), when="@1.5:") + + # Historical dependencies + depends_on("py-numpy@:2.0", type=("build", "run"), when="@:1.5.0") diff --git a/var/spack/repos/builtin/packages/py-virtualenv/package.py b/var/spack/repos/builtin/packages/py-virtualenv/package.py index 1c01c5f622856b..fbb2d7734f4a30 100644 --- a/var/spack/repos/builtin/packages/py-virtualenv/package.py +++ b/var/spack/repos/builtin/packages/py-virtualenv/package.py @@ -14,7 +14,16 @@ class PyVirtualenv(PythonPackage): git = "https://github.com/pypa/virtualenv.git" license("MIT") - + version("20.26.5", sha256="ce489cac131aa58f4b25e321d6d186171f78e6cb13fafbf32a840cee67733ff4") + version("20.26.4", sha256="c17f4e0f3e6036e9f26700446f85c76ab11df65ff6d8a9cbfad9f71aabfcf23c") + version("20.26.3", sha256="4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a") + version("20.26.2", sha256="82bf0f4eebbb78d36ddaee0283d43fe5736b53880b8a8cdcd37390a07ac3741c") + version("20.26.1", sha256="604bfdceaeece392802e6ae48e69cec49168b9c5f4a44e483963f9242eb0e78b") + version("20.26.0", sha256="ec25a9671a5102c8d2657f62792a27b48f016664c6873f6beed3800008577210") + version("20.25.3", sha256="7bb554bbdfeaacc3349fa614ea5bff6ac300fc7c335e9facf3a3bcfc703f45be") + version("20.25.2", sha256="fa7edb8428620518010928242ec17aa7132ae435319c29c1651d1cf4c4173aad") + version("20.25.1", sha256="e08e13ecdca7a0bd53798f356d5831434afa5b07b93f0abdf0797b7a06ffe197") + version("20.25.0", sha256="bf51c0d9c7dd63ea8e44086fa1e4fb1093a31e963b86959257378aef020e1f1b") version("20.24.5", sha256="e8361967f6da6fbdf1426483bfe9fca8287c242ac0bc30429905721cefbff752") version("20.22.0", sha256="278753c47aaef1a0f14e6db8a4c5e1e040e90aea654d0fc1dc7e0d8a42616cc3") version("20.17.1", sha256="f8b927684efc6f1cc206c9db297a570ab9ad0e51c16fa9e45487d36d1905c058") diff --git a/var/spack/repos/builtin/packages/py-werkzeug/package.py b/var/spack/repos/builtin/packages/py-werkzeug/package.py index a454e8b6b5c6f4..475db93c4f01e2 100644 --- a/var/spack/repos/builtin/packages/py-werkzeug/package.py +++ b/var/spack/repos/builtin/packages/py-werkzeug/package.py @@ -13,8 +13,9 @@ class PyWerkzeug(PythonPackage): pypi = "werkzeug/werkzeug-3.0.0.tar.gz" git = "https://github.com/pallets/werkzeug.git" - license("BSD-3-Clause") + license("BSD-3-Clause", checked_by="wdconinc") + version("3.0.4", sha256="34f2371506b250df4d4f84bfe7b0921e4762525762bbd936614909fe25cd7306") version("3.0.0", sha256="3ffff4dcc32db52ef3cc94dff3000a3c2846890f3a5a51800a27b909c5e770f0") version("2.3.7", sha256="2b8c0e447b4b9dbcc85dd97b6eeb4dcbaf6c8b6c3be0bd654e25553e0a2157d8") version("2.3.4", sha256="1d5a58e0377d1fe39d061a5de4469e414e78ccb1e1e59c0f5ad6fa1c36c52b76") diff --git a/var/spack/repos/builtin/packages/py-xgboost/add-lib64.patch b/var/spack/repos/builtin/packages/py-xgboost/add-lib64.patch new file mode 100644 index 00000000000000..11adbdc0bc0e47 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-xgboost/add-lib64.patch @@ -0,0 +1,24 @@ +diff --git a/packager/nativelib.py b/packager/nativelib.py +index 1a3df2e..24ba471 100644 +--- a/packager/nativelib.py ++++ b/packager/nativelib.py +@@ -133,6 +133,7 @@ def locate_or_build_libxgboost( + sys_prefix = pathlib.Path(sys.base_prefix) + sys_prefix_candidates = [ + sys_prefix / "lib", ++ sys_prefix / "lib64", + # Paths possibly used on Windows + sys_prefix / "bin", + sys_prefix / "Library", +diff --git a/xgboost/libpath.py b/xgboost/libpath.py +index 92d46a0..2007579 100644 +--- a/xgboost/libpath.py ++++ b/xgboost/libpath.py +@@ -28,6 +28,7 @@ def find_lib_path() -> List[str]: + # use libxgboost from a system prefix, if available. This should be the last + # option. + os.path.join(sys.base_prefix, "lib"), ++ os.path.join(sys.base_prefix, "lib64"), + ] + + if sys.platform == "win32": diff --git a/var/spack/repos/builtin/packages/py-xgboost/package.py b/var/spack/repos/builtin/packages/py-xgboost/package.py index 9b9818dda74e0e..2c14f5bc30bea5 100644 --- a/var/spack/repos/builtin/packages/py-xgboost/package.py +++ b/var/spack/repos/builtin/packages/py-xgboost/package.py @@ -14,68 +14,78 @@ class PyXgboost(PythonPackage): homepage = "https://xgboost.ai/" pypi = "xgboost/xgboost-1.3.3.tar.gz" - - maintainers("adamjstewart") import_modules = ["xgboost"] license("Apache-2.0") + maintainers("adamjstewart") + version("2.1.1", sha256="4b1729837f9f1ba88a32ef1be3f8efb860fee6454a68719b196dc88032c23d97") + version("2.1.0", sha256="7144980923e76ce741c7b03a14d3bd7514db6de5c7cabe96ba95b229d274f5ca") + version("1.7.6", sha256="1c527554a400445e0c38186039ba1a00425dcdb4e40b37eed0e74cb39a159c47") version("1.6.2", sha256="e1f5c91ba88cf8edb409d7fd2ca150dcd80b6f2115587d87365f0c10b2d4f009") version("1.6.1", sha256="24072028656f3428e7b8aabf77340ece057f273e41f7f85d67ccaefb7454bb18") version("1.5.2", sha256="404dc09dca887ef5a9bc0268f882c54b33bfc16ac365a859a11e7b24d49da387") version("1.3.3", sha256="397051647bb837915f3ff24afc7d49f7fca57630ffd00fb5ef66ae2a0881fb43") - depends_on("cxx", type="build") # generated - variant("pandas", default=False, description="Enable Pandas extensions for training.") variant( "scikit-learn", default=False, description="Enable scikit-learn extensions for training." ) variant("dask", default=False, description="Enables Dask extensions for distributed training.") variant("plotting", default=False, description="Enables tree and importance plotting.") + patch("add-lib64.patch", when="@2:") - for ver in ["1.3.3", "1.5.2", "1.6.1", "1.6.2"]: + for ver in ["1.3.3", "1.5.2", "1.6.1", "1.6.2", "1.7.6", "2.1.0", "2.1.1"]: depends_on("xgboost@" + ver, when="@" + ver) - depends_on("python@3.7:", when="@1.6:", type=("build", "run")) - depends_on("python@3.6:", type=("build", "run")) - depends_on("py-setuptools", type=("build")) - # in newer pip versions --install-option does not exist - depends_on("py-pip@:23.0", type="build") + with default_args(type="build"): + depends_on("py-hatchling@1.12.1:", type="build", when="@2:") + # Required to use --config-settings + depends_on("py-pip@22.1:", when="@2:") + + # Historical dependencies + depends_on("py-setuptools", when="@:1") + # in newer pip versions --install-option does not exist + depends_on("py-pip@:23.0", when="@:1") - depends_on("py-numpy", type=("build", "run")) - # https://github.com/dmlc/xgboost/issues/10221 - depends_on("py-numpy@:1", when="@:2.0", type=("build", "run")) - depends_on("py-scipy", type=("build", "run")) + with default_args(type=("build", "run")): + depends_on("py-numpy", type=("build", "run")) + # https://github.com/dmlc/xgboost/issues/10221 + depends_on("py-numpy@:1", when="@:2.0", type=("build", "run")) + depends_on("py-scipy", type=("build", "run")) - depends_on("py-pandas", when="+pandas", type=("build", "run")) + with when("+pandas"): + depends_on("py-pandas@1.2:", when="@2:") + depends_on("py-pandas") - depends_on("py-scikit-learn", when="+scikit-learn", type=("build", "run")) + with when("+scikit-learn"): + depends_on("py-scikit-learn") - depends_on("py-dask", when="+dask", type=("build", "run")) - depends_on("py-pandas", when="+dask", type=("build", "run")) - depends_on("py-distributed", when="+dask", type=("build", "run")) + with when("+dask"): + depends_on("py-dask") + depends_on("py-pandas") + depends_on("py-distributed") - depends_on("py-graphviz", when="+plotting", type=("build", "run")) - depends_on("py-matplotlib", when="+plotting", type=("build", "run")) + with when("+plotting"): + depends_on("py-graphviz") + depends_on("py-matplotlib") def patch(self): + # Hard-coded to search for system libxgboost in the Python installation prefix # https://github.com/dmlc/xgboost/issues/6706 - # 'setup.py' is hard-coded to search in Python installation prefix - filter_file( - "lib_path = os.path.join(sys.prefix, 'lib')", - "lib_path = '{0}'".format(self.spec["xgboost"].libs.directories[0]), - "setup.py", - string=True, - ) - - # Same for run-time search - filter_file( - "os.path.join(curr_path, 'lib'),", - "'{0}',".format(self.spec["xgboost"].libs.directories[0]), - os.path.join("xgboost", "libpath.py"), - string=True, - ) - + files = [os.path.join("xgboost", "libpath.py")] + if self.spec.satisfies("@2:"): + regex = "sys.base_prefix" + files.append(os.path.join("packager", "nativelib.py")) + else: + regex = "sys.prefix" + files.append("setup.py") + filter_file(regex, repr(self.spec["xgboost"].prefix), *files, string=True) + + @when("@2:") + def config_settings(self, spec, prefix): + return {"use_system_libxgboost": True} + + @when("@:1") def install_options(self, spec, prefix): return ["--use-system-libxgboost"] diff --git a/var/spack/repos/builtin/packages/py-your/package.py b/var/spack/repos/builtin/packages/py-your/package.py index a0e90fc7bde592..f226bff0b31f26 100644 --- a/var/spack/repos/builtin/packages/py-your/package.py +++ b/var/spack/repos/builtin/packages/py-your/package.py @@ -10,14 +10,14 @@ class PyYour(PythonPackage): """Python library to read and process pulsar data in several different formats""" homepage = "https://github.com/thepetabyteproject/your" - - # pypi tarball has requirements.txt missing url = "https://github.com/thepetabyteproject/your/archive/refs/tags/0.6.7.tar.gz" + git = "https://github.com/thepetabyteproject/your.git" maintainers("aweaver1fandm") license("GPL-3.0") + version("main", branch="main", preferred=True) version("0.6.7", sha256="f2124a630d413621cce067805feb6b9c21c5c8938f41188bd89684968478d814") depends_on("python@3.8:", type=("build", "run")) @@ -25,7 +25,9 @@ class PyYour(PythonPackage): depends_on("py-astropy@6.1.0:", type=("build", "run")) depends_on("py-matplotlib@3.2.1:", type=("build", "run")) - depends_on("py-numpy@1.18.4:", type=("build", "run")) + + depends_on("py-numpy@1.18.4:1.23.5", when="@0.6.7", type=("build", "run")) + depends_on("py-numpy@1.18.4:", when="@main", type=("build", "run")) depends_on("py-h5py@2.10:", type=("build", "run")) depends_on("py-scikit-image@0.14.2:", type=("build", "run")) depends_on("py-scipy@1.3:", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-zope-event/package.py b/var/spack/repos/builtin/packages/py-zope-event/package.py index deec70d19eb508..db68fb119b406d 100644 --- a/var/spack/repos/builtin/packages/py-zope-event/package.py +++ b/var/spack/repos/builtin/packages/py-zope-event/package.py @@ -12,10 +12,13 @@ class PyZopeEvent(PythonPackage): homepage = "https://github.com/zopefoundation/zope.event" pypi = "zope.event/zope.event-4.3.0.tar.gz" - license("ZPL-2.1") + license("ZPL-2.1", checked_by="wdconinc") + version("5.0", sha256="bac440d8d9891b4068e2b5a2c5e2c9765a9df762944bda6955f96bb9b91e67cd") version("4.6", sha256="81d98813046fc86cc4136e3698fee628a3282f9c320db18658c21749235fce80") + version("4.5.1", sha256="4ab47faac13163ca3c5d6d8a5595212e14770322e95c338d955e3688ba19082a") version("4.5.0", sha256="5e76517f5b9b119acf37ca8819781db6c16ea433f7e2062c4afc2b6fbedb1330") version("4.3.0", sha256="e0ecea24247a837c71c106b0341a7a997e3653da820d21ef6c08b32548f733e7") + depends_on("python@3.7:", type=("build", "run"), when="@5:") depends_on("py-setuptools", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/py-zope-interface/package.py b/var/spack/repos/builtin/packages/py-zope-interface/package.py index 5e7270ba43f1e9..349c1b04421b1e 100644 --- a/var/spack/repos/builtin/packages/py-zope-interface/package.py +++ b/var/spack/repos/builtin/packages/py-zope-interface/package.py @@ -15,16 +15,27 @@ class PyZopeInterface(PythonPackage): homepage = "https://github.com/zopefoundation/zope.interface" pypi = "zope.interface/zope.interface-4.5.0.tar.gz" - license("ZPL-2.1") - + license("ZPL-2.1", checked_by="wdconinc") + + version("7.0.3", sha256="cd2690d4b08ec9eaf47a85914fe513062b20da78d10d6d789a792c0b20307fb1") + version("7.0.2", sha256="f1146bb27a411d0d40cc0e88182a6b0e979d68ab526c8e5ae9e27c06506ed017") + version("7.0.1", sha256="f0f5fda7cbf890371a59ab1d06512da4f2c89a6ea194e595808123c863c38eff") + version("7.0", sha256="a6699621e2e9565fb34e40677fba6eb0974afc400063b3110d8a14d5b0c7a916") + version("6.3", sha256="f83d6b4b22262d9a826c3bd4b2fbfafe1d0000f085ef8e44cd1328eea274ae6a") + version("6.2", sha256="3b6c62813c63c543a06394a636978b22dffa8c5410affc9331ce6cdb5bfa8565") + version("6.1", sha256="2fdc7ccbd6eb6b7df5353012fbed6c3c5d04ceaca0038f75e601060e95345309") + version("6.0", sha256="aab584725afd10c710b8f1e6e208dbee2d0ad009f57d674cb9d1b3964037275d") + version("5.5.2", sha256="bfee1f3ff62143819499e348f5b8a7f3aa0259f9aca5e0ddae7391d059dce671") + version("5.5.1", sha256="6d678475fdeb11394dc9aaa5c564213a1567cc663082e0ee85d52f78d1fbaab2") + version("5.5.0", sha256="700ebf9662cf8df70e2f0cb4988e078c53f65ee3eefd5c9d80cf988c4175c8e3") version("5.4.0", sha256="5dba5f530fec3f0988d83b78cc591b58c0b6eb8431a85edd1569a0539a8a5a0e") version("5.1.0", sha256="40e4c42bd27ed3c11b2c983fecfb03356fae1209de10686d03c02c8696a1d90e") version("4.5.0", sha256="57c38470d9f57e37afb460c399eb254e7193ac7fb8042bd09bdc001981a9c74c") - depends_on("c", type="build") # generated - depends_on("python@2.7:2.8,3.4:", type=("build", "run"), when="@4.5.0") depends_on("python@2.7:2.8,3.5:", type=("build", "run"), when="@5.1.0:") + depends_on("python@3.7:", type=("build", "run"), when="@6:") + depends_on("python@3.8:", type=("build", "run"), when="@7:") depends_on("py-setuptools", type=("build", "run")) depends_on("py-setuptools@:45", type=("build", "run"), when="@4.5.0") diff --git a/var/spack/repos/builtin/packages/python/package.py b/var/spack/repos/builtin/packages/python/package.py index 3cd9a421dfc5cd..0874dfcee71f7a 100644 --- a/var/spack/repos/builtin/packages/python/package.py +++ b/var/spack/repos/builtin/packages/python/package.py @@ -47,7 +47,7 @@ class Python(Package): url = "https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tgz" list_url = "https://www.python.org/ftp/python/" list_depth = 1 - tags = ["windows", "build-tools"] + tags = ["windows"] maintainers("skosukhin", "scheibelp") @@ -59,6 +59,7 @@ class Python(Package): license("0BSD") + version("3.13.0", sha256="12445c7b3db3126c41190bfdc1c8239c39c719404e844babbd015a1bc3fafcd4") version("3.12.5", sha256="38dc4e2c261d49c661196066edbfb70fdb16be4a79cc8220c224dfeb5636d405") version("3.12.4", sha256="01b3c1c082196f3b33168d344a9c85fb07bfe0e7ecfe77fee4443420d1ce2ad9") version("3.12.3", sha256="a6b9459f45a6ebbbc1af44f5762623fa355a0c87208ed417628b379d762dddb0") @@ -857,14 +858,14 @@ def command(self): # * python # # in that order if using python@3.11.0, for example. - version = self.spec.version - for ver in [version.up_to(2), version.up_to(1), ""]: - if sys.platform != "win32": - path = os.path.join(self.prefix.bin, "python{0}".format(ver)) - else: - path = os.path.join(self.prefix, "python{0}.exe".format(ver)) - if os.path.exists(path): - return Executable(path) + suffixes = [self.spec.version.up_to(2), self.spec.version.up_to(1), ""] + file_extension = "" if sys.platform != "win32" else ".exe" + patterns = [f"python{ver}{file_extension}" for ver in suffixes] + root = self.prefix.bin if sys.platform != "win32" else self.prefix + path = find_first(root, files=patterns) + + if path is not None: + return Executable(path) else: # Give a last try at rhel8 platform python @@ -873,8 +874,9 @@ def command(self): if os.path.exists(path): return Executable(path) - msg = "Unable to locate {0} command in {1}" - raise RuntimeError(msg.format(self.name, self.prefix.bin)) + raise RuntimeError( + f"cannot to locate the '{self.name}' command in {root} or its subdirectories" + ) @property def config_vars(self): @@ -1023,8 +1025,13 @@ def find_library(self, library): win_root_dir, ] - # The Python shipped with Xcode command line tools isn't in any of these locations - for subdir in ["lib", "lib64"]: + if self.spec.satisfies("platform=windows"): + lib_dirs = ["libs"] + else: + # The Python shipped with Xcode command line tools isn't in any of these locations + lib_dirs = ["lib", "lib64"] + + for subdir in lib_dirs: directories.append(os.path.join(self.config_vars["base"], subdir)) directories = dedupe(directories) @@ -1067,14 +1074,16 @@ def libs(self): # The +shared variant isn't reliable, as `spack external find` currently can't # detect it. If +shared, prefer the shared libraries, but check for static if # those aren't found. Vice versa for ~shared. - if "+shared" in self.spec: + if self.spec.satisfies("platform=windows"): + # Since we are searching for link libraries, on Windows search only for + # ".Lib" extensions by default as those represent import libraries for implict links. + candidates = static_libs + elif self.spec.satisfies("+shared"): candidates = shared_libs + static_libs else: candidates = static_libs + shared_libs - candidates = dedupe(candidates) - - for candidate in candidates: + for candidate in dedupe(candidates): lib = self.find_library(candidate) if lib: return lib diff --git a/var/spack/repos/builtin/packages/q-e-sirius/package.py b/var/spack/repos/builtin/packages/q-e-sirius/package.py index e376eece0fe40f..93ac1cccceabbd 100644 --- a/var/spack/repos/builtin/packages/q-e-sirius/package.py +++ b/var/spack/repos/builtin/packages/q-e-sirius/package.py @@ -59,8 +59,6 @@ class QESirius(CMakePackage): depends_on("git", type="build") depends_on("pkgconfig", type="build") - conflicts("~scalapack", when="+elpa", msg="ELPA requires SCALAPACK support") - variant("scalapack", default=True, description="Enables scalapack support") with when("+scalapack"): diff --git a/var/spack/repos/builtin/packages/qd/package.py b/var/spack/repos/builtin/packages/qd/package.py index b80efee78edd88..452ca12d1d8ca5 100644 --- a/var/spack/repos/builtin/packages/qd/package.py +++ b/var/spack/repos/builtin/packages/qd/package.py @@ -13,12 +13,15 @@ class Qd(AutotoolsPackage): homepage = "https://bitbucket.org/njet/qd-library/src/master/" git = "https://bitbucket.org/njet/qd-library.git" + url = "https://www.davidhbailey.com/dhbsoftware/qd-2.3.13.tar.gz" tags = ["hep"] license("BSD-3-Clause-LBNL") - - version("2.3.13", commit="a57dde96b3255b80f7f39cd80217c213bf78d949") + version("2.3.24", sha256="a47b6c73f86e6421e86a883568dd08e299b20e36c11a99bdfbe50e01bde60e38") + version("2.3.23", sha256="b3eaf41ce413ec08f348ee73e606bd3ff9203e411c377c3c0467f89acf69ee26") + # The sha256 for 2.3.23 and 2.3.13 are identical as they are the same content + version("2.3.13", sha256="b3eaf41ce413ec08f348ee73e606bd3ff9203e411c377c3c0467f89acf69ee26") depends_on("c", type="build") # generated depends_on("cxx", type="build") # generated diff --git a/var/spack/repos/builtin/packages/qemu/package.py b/var/spack/repos/builtin/packages/qemu/package.py index 5d81b6e9b57ef6..c095b9a6a6bd98 100644 --- a/var/spack/repos/builtin/packages/qemu/package.py +++ b/var/spack/repos/builtin/packages/qemu/package.py @@ -18,6 +18,7 @@ class Qemu(AutotoolsPackage): # Docs say TCG is "under a BSD license" but all the headers for TCG have the MIT license. license("GPL-2.0-only AND LGPL-2.1-only AND MIT", checked_by="tgamblin") + version("9.1.0", sha256="816b7022a8ba7c2ac30e2e0cf973e826f6bcc8505339603212c5ede8e94d7834") version("4.1.1", sha256="ed6fdbbdd272611446ff8036991e9b9f04a2ab2e3ffa9e79f3bab0eb9a95a1d2") version("4.1.0", sha256="656e60218689bdeec69903087fd7582d5d3e72238d02f4481d8dc6d79fd909c6") version("4.0.1", sha256="f2674dd6053ef1d48593aa1f0a50c5ac9039f7a059ecb6f9b8307f3fb2fcedad") @@ -107,6 +108,50 @@ class Qemu(AutotoolsPackage): depends_on("c", type="build") # generated depends_on("cxx", type="build") # generated + depends_on("pkgconfig", type="build") + depends_on("py-tomli", when="@9:", type="build") + depends_on("meson@1.1.0:", when="@9:", type="build") + + depends_on("bison", when="@9:") + depends_on("bzip2", when="@9:") + depends_on("capstone", when="@9:") + depends_on("dtc", when="@9:") + depends_on("flex", when="@9:") depends_on("glib@2.40:") + depends_on("gnutls", when="@9:") + depends_on("libslirp", when="@9:") + depends_on("libssh", when="@9:") + depends_on("libusb", when="@9:") + depends_on("lzo", when="@9:") + depends_on("ncurses", when="@9:") + depends_on("nettle", when="@9:") depends_on("pixman@0.21.8:") - depends_on("pkgconfig", type="build") + depends_on("snappy", when="@9:") + depends_on("vde", when="@9:") + depends_on("zlib", when="@9:") + depends_on("zstd", when="@9:") + + # linux deps not needed on darwin + depends_on("elfutils", when="@9: platform=linux") + depends_on("libcap-ng", when="@9: platform=linux") + + build_directory = "build" + + @when("@9:") + def configure_args(self): + return [ + "--disable-bsd-user", + "--disable-guest-agent", + "--disable-sdl", + "--disable-bsd-user", + "--disable-guest-agent", + "--enable-slirp", + "--enable-capstone", + "--enable-curses", + "--enable-fdt=system", + "--enable-libssh", + "--enable-vde", + "--enable-virtfs", + "--enable-zstd", + "--disable-docs", + ] diff --git a/var/spack/repos/builtin/packages/qpdf/package.py b/var/spack/repos/builtin/packages/qpdf/package.py index 35da1767ef6f7e..2fb7bf314ce7e7 100644 --- a/var/spack/repos/builtin/packages/qpdf/package.py +++ b/var/spack/repos/builtin/packages/qpdf/package.py @@ -20,6 +20,7 @@ class Qpdf(CMakePackage): license("Apache-2.0", checked_by="taliaferro") + version("11.9.1", sha256="2ba4d248f9567a27c146b9772ef5dc93bd9622317978455ffe91b259340d13d1") version("11.9.0", sha256="9f5d6335bb7292cc24a7194d281fc77be2bbf86873e8807b85aeccfbff66082f") depends_on("c", type="build") # generated diff --git a/var/spack/repos/builtin/packages/qscintilla/package.py b/var/spack/repos/builtin/packages/qscintilla/package.py index 53e8e407f67a7f..b61c9d529520b7 100644 --- a/var/spack/repos/builtin/packages/qscintilla/package.py +++ b/var/spack/repos/builtin/packages/qscintilla/package.py @@ -137,11 +137,12 @@ def make_qsci_python(self): make("install", "-C", "build/") def test_python_import(self): - if "+python" in self.spec: - python = self.spec["python"].command - if "^py-pyqt5" in self.spec: - python("-c", "import PyQt5.Qsci") - if "^py-pyqt6" in self.spec: - python("-c", "import PyQt6.Qsci") - else: - print("qscintilla ins't built with python, skipping import test") + """check Qsci import""" + if self.spec.satisfies("~python"): + raise SkipTest("Package must be installed with +python") + + python = self.spec["python"].command + if "^py-pyqt5" in self.spec: + python("-c", "import PyQt5.Qsci") + if "^py-pyqt6" in self.spec: + python("-c", "import PyQt6.Qsci") diff --git a/var/spack/repos/builtin/packages/qt-5compat/package.py b/var/spack/repos/builtin/packages/qt-5compat/package.py index 027468f7c809be..811bfc4551ecba 100644 --- a/var/spack/repos/builtin/packages/qt-5compat/package.py +++ b/var/spack/repos/builtin/packages/qt-5compat/package.py @@ -18,6 +18,7 @@ class Qt5compat(QtPackage): license("LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only") + version("6.7.3", sha256="959634d1a6a53f9a483882e81da87ec182ff44d7747a0cc771c786b0f2cf52e0") version("6.7.2", sha256="331a1e617952217868beeef7964828500388abeeb502ea3436f16eec816426c4") depends_on("cxx", type="build") diff --git a/var/spack/repos/builtin/packages/qt-base/package.py b/var/spack/repos/builtin/packages/qt-base/package.py index 5ba8ab63896be9..ca3acad6543bf7 100644 --- a/var/spack/repos/builtin/packages/qt-base/package.py +++ b/var/spack/repos/builtin/packages/qt-base/package.py @@ -133,6 +133,7 @@ class QtBase(QtPackage): license("BSD-3-Clause") + version("6.7.3", sha256="65771d1618cab08ec5e9bbfdc265b5d2ce2ccf0373143d7d9d139647a7196aec") version("6.7.2", sha256="96b96e4fd0fc306502ed8b94a34cfa0bacc8a25d43c2e958dd6772b28f6b0e42") version("6.7.1", sha256="d6950597ce1fc2e1cf374c3aa70c2d72532bb74150e9853d7127af86a8a6c7b4") version("6.7.0", sha256="e17f016ec987092423e86d732c0f9786124598877fa00970fd806da113c02ca5") diff --git a/var/spack/repos/builtin/packages/qt-declarative/package.py b/var/spack/repos/builtin/packages/qt-declarative/package.py index b7961cf9ce372d..4f70ef7883ef60 100644 --- a/var/spack/repos/builtin/packages/qt-declarative/package.py +++ b/var/spack/repos/builtin/packages/qt-declarative/package.py @@ -16,6 +16,7 @@ class QtDeclarative(QtPackage): license("BSD-3-Clause") + version("6.7.3", sha256="f39fa4e7e3b4011e52fc55fbde5f41e61815bffea432869abc9b90aa4de07613") version("6.7.2", sha256="3b91d1b75f22221f39b93647d73c9fe7fc4b9c8d45ff0cec402626eab15d8dd8") version("6.7.1", sha256="fdf4099cbced3ce56e5151122ae1eb924886492f9fc2eb6a353d60a23e8fde14") version("6.7.0", sha256="dc3fec16cbe0f706b2b6114e5dbb884269543f2d679a0a3a63b4f686156adf73") diff --git a/var/spack/repos/builtin/packages/qt-quick3d/package.py b/var/spack/repos/builtin/packages/qt-quick3d/package.py index a08ad81acbe10a..3af4540ba5d27e 100644 --- a/var/spack/repos/builtin/packages/qt-quick3d/package.py +++ b/var/spack/repos/builtin/packages/qt-quick3d/package.py @@ -16,6 +16,7 @@ class QtQuick3d(QtPackage): license("BSD-3-Clause") + version("6.7.3", sha256="3e68f3a9a330e7b9a92ddf5b8d7a0874a107ea77636c788f598de65e327eb4a0") version("6.7.2", sha256="67021658cb10bfa6d969c4219d599ab2f4775d08fb4ae56da17fbec305088b55") version("6.7.1", sha256="c889b70305da7595df87c3bd062474787b722ab216bc2e6226e33fae3ec3459d") version("6.7.0", sha256="3adb7cc458c21a4642e7138cc0ca12934cd7075633d06c46c689f65718c8ba73") diff --git a/var/spack/repos/builtin/packages/qt-quicktimeline/package.py b/var/spack/repos/builtin/packages/qt-quicktimeline/package.py index 7227ae1b04f3e1..cb60aad12e2f2b 100644 --- a/var/spack/repos/builtin/packages/qt-quicktimeline/package.py +++ b/var/spack/repos/builtin/packages/qt-quicktimeline/package.py @@ -16,6 +16,7 @@ class QtQuicktimeline(QtPackage): license("BSD-3-Clause") + version("6.7.3", sha256="81ce374a22bf00d53d0a9d5293d6495a224137e9427e4d4913d87f2f0adc5a58") version("6.7.2", sha256="ad5370a3b193c5d30a824a1def0608e12fb735c4ff20ae55161a6f6e202e091d") version("6.7.1", sha256="98766368b4650eef583f76d257573e6785938b89c9eb2fc57577f4c199b12a1f") version("6.7.0", sha256="9c8d953d4dfbe2a42dbbd88c26b4b01f6caab4d525ec01eb66edc71e9ee39172") diff --git a/var/spack/repos/builtin/packages/qt-shadertools/package.py b/var/spack/repos/builtin/packages/qt-shadertools/package.py index f1ef9717b78094..43ba9b87171322 100644 --- a/var/spack/repos/builtin/packages/qt-shadertools/package.py +++ b/var/spack/repos/builtin/packages/qt-shadertools/package.py @@ -18,6 +18,7 @@ class QtShadertools(QtPackage): license("BSD-3-Clause") + version("6.7.3", sha256="8ec6a48c41d49b6f9595659169b2c69aecd46e96a88131f19f6a4cda394fa3f4") version("6.7.2", sha256="256ff8199d9f6e97bef57f602c5fa7a32e3c7588bf7efe39e412b810c7ed4ffc") version("6.7.1", sha256="56cfba20c7e8f7a218cac68d237a63ea342ac9a67211ecdf3c7152572632448b") version("6.7.0", sha256="82d9ef04a470db30e90253ddc72fcbc8fea2ecad419a735ecf64bb965560197f") diff --git a/var/spack/repos/builtin/packages/qt-svg/package.py b/var/spack/repos/builtin/packages/qt-svg/package.py index 8f2e78f91492b0..a2f44fc2e63f6c 100644 --- a/var/spack/repos/builtin/packages/qt-svg/package.py +++ b/var/spack/repos/builtin/packages/qt-svg/package.py @@ -18,6 +18,7 @@ class QtSvg(QtPackage): license("BSD-3-Clause") + version("6.7.3", sha256="2852d8f1f52b60f0624ca5edf479125e4b32d579b1177d8b76d8e28fac98a701") version("6.7.2", sha256="c0e140bbba4157cdbbe0e84ddbb4e238b87aa0ca7b870bad283d8cf2a7fa74b6") version("6.7.1", sha256="55134e1242305e554610bf1a77e71d3d15104ee819a3c87def1f8b736d5ecf0e") version("6.7.0", sha256="ea023d11c710145786833649c3dc79dd099110fc3a9756a8a88699eeaac949f1") diff --git a/var/spack/repos/builtin/packages/qt/package.py b/var/spack/repos/builtin/packages/qt/package.py index 24421b4d46d44f..9412b9a3dfb688 100644 --- a/var/spack/repos/builtin/packages/qt/package.py +++ b/var/spack/repos/builtin/packages/qt/package.py @@ -15,6 +15,7 @@ MACOS_VERSION = macos_version() if sys.platform == "darwin" else None LINUX_VERSION = kernel_version() if platform.system() == "Linux" else None +IS_WINDOWS = sys.platform == "win32" class Qt(Package): @@ -32,6 +33,7 @@ class Qt(Package): license("LGPL-3.0-only") + version("5.15.15", sha256="b423c30fe3ace7402e5301afbb464febfb3da33d6282a37a665be1e51502335e") version("5.15.14", sha256="fdd3a4f197d2c800ee0085c721f4bef60951cbda9e9c46e525d1412f74264ed7") version("5.15.13", sha256="9550ec8fc758d3d8d9090e261329700ddcd712e2dda97e5fcfeabfac22bea2ca") version("5.15.12", sha256="93f2c0889ee2e9cdf30c170d353c3f829de5f29ba21c119167dee5995e48ccce") @@ -68,14 +70,22 @@ class Qt(Package): ) variant("gtk", default=False, description="Build with gtkplus.") variant("gui", default=True, description="Build the Qt GUI module and dependencies") - variant("opengl", default=False, description="Build with OpenGL support.") - variant("location", default=False, when="+opengl", description="Build the Qt Location module.") + # Desktop only on Windows + variant("opengl", default=False, description="Build with OpenGL support") + for plat in ["linux", "darwin", "freebsd"]: + with when(f"platform={plat}"): + # webkit support requires qtquick2 which requires a GL implementation beyond what + # windows system gl provides. + # This is unavailable until we get a hardware accelerated option for EGL 2 on Windows + # We can use llvm or angle for this, but those are not hardware accelerated, so are not + # as useful for things like paraview + variant("webkit", default=False, description="Build the Webkit extension") + variant("location", default=False, description="Build the Qt Location module.") variant("phonon", default=False, description="Build with phonon support.") variant("shared", default=True, description="Build shared libraries.") variant("sql", default=True, description="Build with SQL support.") variant("ssl", default=True, description="Build with OpenSSL support.") variant("tools", default=True, description="Build tools, including Qt Designer.") - variant("webkit", default=False, description="Build the Webkit extension") provides("qmake") @@ -127,6 +137,9 @@ class Qt(Package): patch("qt514-isystem.patch", when="@5.14.2") # https://bugreports.qt.io/browse/QTBUG-84037 patch("qt515-quick3d-assimp.patch", when="@5.15:5+opengl") + # https://forum.qt.io/topic/130793/a-problem-with-python-path-when-i-try-to-build-qt-from-source-e-program-is-not-recognized-as-an-internal-or-external-command?_=1722965446110&lang=en-US + patch("qt515_masm_python.patch", when="@5.15 platform=windows") + # https://bugreports.qt.io/browse/QTBUG-90395 patch( "https://src.fedoraproject.org/rpms/qt5-qtbase/raw/6ae41be8260f0f5403367eb01f7cd8319779674a/f/qt5-qtbase-gcc11.patch", @@ -176,35 +189,65 @@ class Qt(Package): conflicts("%apple-clang@13:", when="@:5.13") # Build-only dependencies - depends_on("pkgconfig", type="build") + for plat in ["linux", "darwin", "freebsd"]: + with when(f"platform={plat}"): + depends_on("pkgconfig", type="build") + depends_on("libsm", when="@3") + depends_on("glib", when="@4:") + depends_on("libmng") + depends_on("assimp@5.0.0:5", when="@5.5:+opengl") + depends_on("sqlite+column_metadata", when="+sql", type=("build", "run")) + depends_on("inputproto", when="@:5.8") + for plat in ["linux", "freebsd"]: + with when(f"platform={plat} +gui"): + depends_on("fontconfig") + depends_on("libsm") + depends_on("libx11") + depends_on("libxcb") + depends_on("libxkbcommon") + depends_on("xcb-util-image") + depends_on("xcb-util-keysyms") + depends_on("xcb-util-renderutil") + depends_on("xcb-util-wm") + depends_on("libxext") + depends_on("libxrender") + + conflicts("+framework", msg="QT cannot be built as a framework except on macOS.") + + with when("platform=windows +sql"): + # Windows sqlite has no column_metadata variant unlike all other platforms + depends_on("sqlite", type=("build", "run")) + + with when("platform=darwin"): + conflicts("@:4.8.6", msg="QT 4 for macOS is only patched for 4.8.7") + conflicts( + "target=aarch64:", + when="@:5.15.3", + msg="Apple Silicon requires a very new version of qt", + ) + depends_on("python", when="@5.7.0:", type="build") # Dependencies, then variant- and version-specific dependencies depends_on("icu4c") depends_on("jpeg") - depends_on("libmng") depends_on("libtiff") depends_on("libxml2") depends_on("zlib-api") depends_on("freetype", when="+gui") depends_on("gtkplus", when="+gtk") - depends_on("sqlite+column_metadata", when="+sql", type=("build", "run")) depends_on("libpng@1.2.57", when="@3") - depends_on("libsm", when="@3") depends_on("pcre+multibyte", when="@5.0:5.8") - depends_on("inputproto", when="@:5.8") with when("+ssl"): depends_on("openssl") depends_on("openssl@:1.0", when="@4:5.9") depends_on("openssl@1.1.1:", when="@5.15.0:") - depends_on("glib", when="@4:") depends_on("libpng", when="@4:") depends_on("dbus", when="@4:+dbus") depends_on("gl", when="@4:+opengl") - depends_on("assimp@5.0.0:5", when="@5.5:+opengl") depends_on("harfbuzz", when="@5:") depends_on("double-conversion", when="@5.7:") @@ -260,33 +303,6 @@ class Qt(Package): conflicts("%oneapi", when="@:5.15.13") patch("qt51514-oneapi.patch", when="@5.15.14: %oneapi") - # Non-macOS dependencies and special macOS constraints - if MACOS_VERSION is None: - with when("+gui"): - depends_on("fontconfig") - depends_on("libsm") - depends_on("libx11") - depends_on("xproto") - depends_on("libxcb") - depends_on("libxkbcommon") - depends_on("xcb-util-image") - depends_on("xcb-util-keysyms") - depends_on("xcb-util-renderutil") - depends_on("xcb-util-wm") - depends_on("libxext") - depends_on("libxrender") - - conflicts("+framework", msg="QT cannot be built as a framework except on macOS.") - else: - conflicts( - "platform=darwin", when="@:4.8.6", msg="QT 4 for macOS is only patched for 4.8.7" - ) - conflicts( - "target=aarch64:", - when="@:5.15.3", - msg="Apple Silicon requires a very new version of qt", - ) - # Mapping for compilers/systems in the QT 'mkspecs' compiler_mapping = { "intel": ("icc",), @@ -300,7 +316,7 @@ class Qt(Package): "fj": ("clang",), "gcc": ("g++",), } - platform_mapping = {"darwin": ("macx")} + platform_mapping = {"darwin": ("macx"), "windows": ("win32")} def url_for_version(self, version): # URL keeps getting more complicated with every release @@ -350,7 +366,8 @@ def url_for_version(self, version): return url def setup_build_environment(self, env): - env.set("MAKEFLAGS", "-j{0}".format(make_jobs)) + if not IS_WINDOWS: + env.set("MAKEFLAGS", "-j{0}".format(make_jobs)) if self.version >= Version("5.11"): # QDoc uses LLVM as of 5.11; remove the LLVM_INSTALL_DIR to # disable @@ -360,8 +377,6 @@ def setup_build_environment(self, env): # Prevent possibly incompatible system LLVM from being found llvm_path = "/spack-disable-llvm" env.set("LLVM_INSTALL_DIR", llvm_path) - if self.spec.satisfies("os=scientific7"): - env.set("OPENSSL_LIBS", "-L/usr/lib64/openssl11 -lssl -lcrypto") def setup_run_environment(self, env): env.set("QTDIR", self.prefix) @@ -374,6 +389,10 @@ def setup_dependent_build_environment(self, env, dependent_spec): env.set("QTINC", self.prefix.inc) env.set("QTLIB", self.prefix.lib) env.prepend_path("QT_PLUGIN_PATH", self.prefix.plugins) + if IS_WINDOWS: + # Force Qt to use the desktop provided GL + # on Windows when dependencies are building against Qt + env.set("QT_OPENGL", "desktop") def setup_dependent_package(self, module, dependent_spec): module.qmake = Executable(self.spec.prefix.bin.qmake) @@ -564,18 +583,25 @@ def common_config_args(self): self.prefix, "-v", "-opensource", - "-{0}opengl".format("" if "+opengl" in spec else "no-"), "-{0}".format("debug" if "+debug" in spec else "release"), "-confirm-license", "-optimized-qmake", "-no-pch", ] + # Windows currently only supports the desktop provider for opengl + if "+opengl" in spec: + config_args.append("-opengl") + if IS_WINDOWS: + config_args.append("desktop") + else: + config_args.append("-no-opengl") + use_spack_dep = self._dep_appender_factory(config_args) if "+gui" in spec: use_spack_dep("freetype") - if not MACOS_VERSION: + if spec.satisfies("platform=linux") or spec.satisfies("platform=freebsd"): config_args.append("-fontconfig") else: config_args.append("-no-freetype") @@ -586,9 +612,6 @@ def common_config_args(self): config_args.append("-openssl-linked") config_args.extend(pkg.libs.search_flags.split()) config_args.extend(pkg.headers.include_flags.split()) - if spec.satisfies("os=scientific7"): - config_args.append("-I/usr/include/openssl11") - config_args.append("-L/usr/lib64/openssl11") else: config_args.append("-no-openssl") @@ -721,7 +744,7 @@ def configure(self, spec, prefix): # Errors on bluetooth even when bluetooth is disabled... # at least on apple-clang%12 config_args.extend(["-skip", "connectivity"]) - elif "+gui" in spec: + elif "+gui" in spec and not IS_WINDOWS: # Linux-only QT5 dependencies if version < Version("5.9.9"): config_args.append("-system-xcb") @@ -761,6 +784,9 @@ def configure(self, spec, prefix): if version >= Version("5.15"): config_args.extend(["-skip", "qtlocation"]) + if IS_WINDOWS: + config_args.extend(["-skip", "qtspeech"]) + if "~opengl" in spec: config_args.extend(["-skip", "multimedia"]) config_args.extend(["-skip", "qt3d"]) @@ -778,10 +804,11 @@ def configure(self, spec, prefix): # v5.9: user-selectable internal-vs-external via -assimp # v5.14: additional qtquick3d module uses -assimp # v5.15: qtquick3d switched to the -quick3d-assimp option - if version >= Version("5.9"): - use_spack_dep("assimp") - elif version >= Version("5.15"): - use_spack_dep("assimp", "quick3d-assimp") + if not IS_WINDOWS: + if version >= Version("5.9"): + use_spack_dep("assimp") + elif version >= Version("5.15"): + use_spack_dep("assimp", "quick3d-assimp") if MACOS_VERSION and "+opengl" in spec: # These options are only valid if 'multimedia' is enabled, i.e. @@ -794,13 +821,22 @@ def configure(self, spec, prefix): # Not currently working for qt@5 config_args.extend(["-device-option", "QMAKE_APPLE_DEVICE_ARCHS=arm64"]) + if IS_WINDOWS: + global configure + configure = Executable("configure.bat") configure(*config_args) def build(self, spec, prefix): - make() + if IS_WINDOWS: + nmake() + else: + make() def install(self, spec, prefix): - make("install") + if IS_WINDOWS: + nmake("install") + else: + make("install") # Documentation generation requires the doc tools to be installed. # @when @run_after currently seems to ignore the 'when' restriction. diff --git a/var/spack/repos/builtin/packages/qt/qt515_masm_python.patch b/var/spack/repos/builtin/packages/qt/qt515_masm_python.patch new file mode 100644 index 00000000000000..af599bd1825ee9 --- /dev/null +++ b/var/spack/repos/builtin/packages/qt/qt515_masm_python.patch @@ -0,0 +1,22 @@ +diff --git a/masm.pri b/masm-quote.pri +index b67ee79..b757ee5 100644 +--- a/qtdeclarative/src/3rdparty/masm/masm.pri ++++ b/qtdeclarative/src/3rdparty/masm/masm.pri +@@ -58,7 +58,7 @@ contains(DEFINES, WTF_USE_UDIS86=1) { + udis86.output = udis86_itab.h + udis86.input = ITAB + udis86.CONFIG += no_link +- udis86.commands = $$QMAKE_PYTHON $$PWD/disassembler/udis86/itab.py ${QMAKE_FILE_IN} ++ udis86.commands = "\"$$QMAKE_PYTHON\"" $$PWD/disassembler/udis86/itab.py ${QMAKE_FILE_IN} + QMAKE_EXTRA_COMPILERS += udis86 + + udis86_tab_cfile.target = $$OUT_PWD/udis86_itab.c +@@ -111,7 +111,7 @@ retgen.output = $$GENERATEDDIR/RegExpJitTables.h + retgen.script = $$PWD/yarr/create_regex_tables + retgen.input = retgen.script + retgen.CONFIG += no_link +-retgen.commands = $$QMAKE_PYTHON $$retgen.script > ${QMAKE_FILE_OUT} ++retgen.commands = "\"$$QMAKE_PYTHON\"" $$retgen.script > ${QMAKE_FILE_OUT} + QMAKE_EXTRA_COMPILERS += retgen + + # Taken from WebKit/Tools/qmake/mkspecs/features/unix/default_post.prf diff --git a/var/spack/repos/builtin/packages/quantum-espresso/package.py b/var/spack/repos/builtin/packages/quantum-espresso/package.py index 23509f06c4c915..af1d61855195d3 100644 --- a/var/spack/repos/builtin/packages/quantum-espresso/package.py +++ b/var/spack/repos/builtin/packages/quantum-espresso/package.py @@ -14,7 +14,7 @@ class QuantumEspresso(CMakePackage, Package): pseudopotentials. """ - homepage = "http://quantum-espresso.org" + homepage = "https://quantum-espresso.org" url = "https://gitlab.com/QEF/q-e/-/archive/qe-6.6/q-e-qe-6.6.tar.gz" git = "https://gitlab.com/QEF/q-e.git" @@ -300,6 +300,19 @@ class QuantumEspresso(CMakePackage, Package): conflicts("@6.5:", when="+environ", msg="6.4.x is the latest QE series supported by Environ") + conflicts( + "@:7.3.0", + when="build_system=generic %oneapi", + msg="Support for ifx has been added to configure in release 7.3.1", + ) + # Fixed in https://github.com/libmbd/libmbd/pull/60, which will be part of the next release + conflicts( + "@7.3.1", + when="%oneapi@2024.1:", + msg="ifx added f_c_string in the ISO_C_BINDING module since version 2024.1 which conflicts" + + "with the libmbd provided one.", + ) + # 7.3 - a compile-time problem fixed in 7.3.1 patch_url = "https://gitlab.com/QEF/q-e/-/commit/b98ff7539e5731728d2d49ac01021a57f2594027.diff" patch_checksum = "04c125d249d1f076abe04bc4de39bd3b44a41a78d6233b638a17bd96f91443d5" @@ -333,6 +346,11 @@ class QuantumEspresso(CMakePackage, Package): patch_checksum = "72564c168231dd4a1279a74e76919af701d47cee9a851db6e205753004fe9bb5" patch(patch_url, sha256=patch_checksum, when="@6.7+qmcpack") + # 6.6 + patch_url = "https://gitlab.com/QEF/q-e/-/commit/081409ea90cba0ddc07bea5ac29e3cd422c67d3d.diff" + patch_checksum = "f43b7411e535629d9ef564a2e1695359df2651ecbdbca563f7265412afc2228a" + patch(patch_url, sha256=patch_checksum, when="@6.6:7.3.1") + # 6.4.1 patch_url = "https://raw.githubusercontent.com/QMCPACK/qmcpack/v3.13.0/external_codes/quantum_espresso/add_pw2qmcpack_to_qe-6.4.1.diff" patch_checksum = "57cb1b06ee2653a87c3acc0dd4f09032fcf6ce6b8cbb9677ae9ceeb6a78f85e2" diff --git a/var/spack/repos/builtin/packages/r/package.py b/var/spack/repos/builtin/packages/r/package.py index a2d0f01517b306..478d4c5d8bdd8b 100644 --- a/var/spack/repos/builtin/packages/r/package.py +++ b/var/spack/repos/builtin/packages/r/package.py @@ -297,8 +297,3 @@ def setup_dependent_package(self, module, dependent_spec): # Add variable for library directry module.r_lib_dir = join_path(dependent_spec.prefix, self.r_lib_dir) - - # Make the site packages directory for extensions, if it does not exist - # already. - if dependent_spec.package.is_extension: - mkdirp(module.r_lib_dir) diff --git a/var/spack/repos/builtin/packages/rabbitmq-c/package.py b/var/spack/repos/builtin/packages/rabbitmq-c/package.py index 7a4ca6a064c6dc..1868b90a13e7a5 100644 --- a/var/spack/repos/builtin/packages/rabbitmq-c/package.py +++ b/var/spack/repos/builtin/packages/rabbitmq-c/package.py @@ -16,12 +16,13 @@ class RabbitmqC(CMakePackage): maintainers("lpottier") - license("MIT") + license("MIT", checked_by="wdconinc") + version("0.14.0", sha256="839b28eae20075ac58f45925fe991d16a3138cbde015db0ee11df1acb1c493df") version("0.13.0", sha256="8b224e41bba504fc52b02f918d8df7e4bf5359d493cbbff36c06078655c676e6") version("0.11.0", sha256="437d45e0e35c18cf3e59bcfe5dfe37566547eb121e69fca64b98f5d2c1c2d424") - depends_on("c", type="build") # generated + depends_on("c", type="build") variant("ssl", default=True, description="Required to connect to RabbitMQ using SSL/TLS") variant("shared", default=True, description="Build shared library") @@ -30,6 +31,7 @@ class RabbitmqC(CMakePackage): variant("tools", default=False, description="Build the tools") depends_on("cmake@3.12:", type="build") + depends_on("cmake@3.22:", type="build", when="@0.14:") depends_on("openssl@1.1.1:", when="+ssl", type=("build", "link", "run")) depends_on("doxygen", when="+doc", type="build") depends_on("popt@1.14:", when="+tools", type=("build", "link", "run")) diff --git a/var/spack/repos/builtin/packages/racket/package.py b/var/spack/repos/builtin/packages/racket/package.py index 25188da281c9b0..bd53c4b3b444a5 100644 --- a/var/spack/repos/builtin/packages/racket/package.py +++ b/var/spack/repos/builtin/packages/racket/package.py @@ -22,7 +22,6 @@ class Racket(MakefilePackage): depends_on("libffi", type=("build", "link", "run")) depends_on("patchutils") - depends_on("libtool", type=("build")) variant("cs", default=True, description="Build Racket CS (new ChezScheme VM)") variant("bc", default=False, description="Build Racket BC (old MZScheme VM)") diff --git a/var/spack/repos/builtin/packages/raja-perf/package.py b/var/spack/repos/builtin/packages/raja-perf/package.py new file mode 100644 index 00000000000000..a62cb861c28466 --- /dev/null +++ b/var/spack/repos/builtin/packages/raja-perf/package.py @@ -0,0 +1,344 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +import socket + +from spack.package import * + +from .blt import llnl_link_helpers + + +class RajaPerf(CachedCMakePackage, CudaPackage, ROCmPackage): + """RAJA Performance Suite.""" + + homepage = "https://github.com/LLNL/RAJAPerf" + git = "https://github.com/LLNL/RAJAPerf.git" + tags = ["radiuss"] + + maintainers("davidbeckingsale", "adrienbernede") + + license("BSD-3-Clause") + + version("develop", branch="develop", submodules="True") + version("main", branch="main", submodules="True") + version( + "2024.07.0", + tag="v2024.07.0", + commit="6e81aa58af244a13755a694bfdc7bc301139a244", + submodules="True", + ) + version( + "2023.06.0", + tag="v2023.06.0", + commit="e5b2102f50e4642f53d9c86fb622b398a748974a", + submodules="True", + ) + version( + "2022.10.0", + tag="v2022.10.0", + commit="57ee53e402d2ac0a398df39ad1ca85cf1d2be45b", + submodules="True", + ) + version( + "0.12.0", + tag="v0.12.0", + commit="388c1d7562e1cb364191cb34c1ff62f3cadf54a0", + submodules="True", + ) + version( + "0.11.0", + tag="v0.11.0", + commit="22ac1de533ebd477c781d53962a92478c0a11d43", + submodules="True", + ) + version( + "0.10.0", + tag="v0.10.0", + commit="6bf725af38da41b1ebd1d29c75ffa5b8e57f7cbf", + submodules="True", + ) + version( + "0.9.0", tag="v0.9.0", commit="064dd17dae696c3e440eeb7469fa90341858a636", submodules="True" + ) + version( + "0.8.0", tag="v0.8.0", commit="94c65b2caefec2220f712f34c2a198b682ca7e23", submodules="True" + ) + version( + "0.7.0", tag="v0.7.0", commit="a6ef0279d9d240199947d872d8f28bf121f2192c", submodules="True" + ) + version( + "0.6.0", tag="v0.6.0", commit="21e476f031bc10bbdb8514425c380553bfb23bdc", submodules="True" + ) + version( + "0.5.2", tag="v0.5.2", commit="2da5e27bc648ff5540ffa69bbde67f125e4581d3", submodules="True" + ) + version( + "0.5.1", tag="v0.5.1", commit="a7b6f63e4fef2d0146932eff409788da51ab0cb3", submodules="True" + ) + version( + "0.5.0", tag="v0.5.0", commit="888f5ebe69a9b2ae35058cf8fb8d89d91a379bea", submodules="True" + ) + version( + "0.4.0", tag="v0.4.0", commit="a8f669c1ad01d51132a4e3d9d6aa8b2cabc9eff0", submodules="True" + ) + + depends_on("cxx", type="build") # generated + + variant("mpi", default=False, description="Enable MPI support") + variant("openmp", default=False, description="Build OpenMP backend") + variant("omptarget", default=False, description="Build with OpenMP target support") + variant("sycl", default=False, description="Build sycl backend") + variant("shared", default=False, description="Build Shared Libs") + variant("omptask", default=False, description="Build OpenMP task variants of algorithms") + variant( + "tests", + default="basic", + values=("none", "basic", "benchmarks"), + multi=False, + description="Tests to run", + ) + variant("caliper", default=False, description="Build with support for Caliper based profiling") + + depends_on("blt") + depends_on("blt@0.6.2:", type="build", when="@2024.07.0:") + depends_on("blt@0.5.3", type="build", when="@2023.06") + depends_on("blt@0.5.2:0.5.3", type="build", when="@2022.10") + depends_on("blt@0.5.0:", type="build", when="@0.12.0:") + depends_on("blt@0.4.1:", type="build", when="@0.11.0:") + depends_on("blt@0.4.0:", type="build", when="@0.8.0:") + depends_on("blt@0.3.0:", type="build", when="@:0.7.0") + + depends_on("cmake@3.23:", when="@2024.07.0:", type="build") + depends_on("cmake@3.23:", when="@0.12.0:2023.06.0 +rocm", type="build") + depends_on("cmake@3.20:", when="@0.12.0:2023.06.0", type="build") + depends_on("cmake@3.14:", when="@:0.12.0", type="build") + + depends_on("mpi", when="+mpi") + + depends_on("llvm-openmp", when="+openmp %apple-clang") + + depends_on("rocprim", when="+rocm") + + depends_on("caliper@2.9.0:", when="+caliper") + depends_on("caliper@2.9.0: +cuda", when="+caliper +cuda") + depends_on("caliper@2.9.0: +rocm", when="+caliper +rocm") + + with when("@0.12.0: +rocm +caliper"): + depends_on("caliper +rocm") + for arch in ROCmPackage.amdgpu_targets: + depends_on( + "caliper +rocm amdgpu_target={0}".format(arch), + when="amdgpu_target={0}".format(arch), + ) + conflicts("+openmp", when="@:2022.03") + + with when("@0.12.0: +cuda +caliper"): + depends_on("caliper +cuda") + for sm_ in CudaPackage.cuda_arch_values: + depends_on("caliper +cuda cuda_arch={0}".format(sm_), when="cuda_arch={0}".format(sm_)) + + conflicts("~openmp", when="+omptarget", msg="OpenMP target requires OpenMP") + conflicts("+cuda", when="+omptarget", msg="Cuda may not be activated when omptarget is ON") + conflicts("+omptarget +rocm") + conflicts("+sycl +omptarget") + conflicts("+sycl +rocm") + # Using RAJA version as threshold on purpose (no 2024.02 version of RAJAPerf were released). + conflicts( + "+sycl", + when="@:2024.02.99", + msg="Support for SYCL was introduced in RAJA after 2024.02 release, " + "please use a newer release.", + ) + + def _get_sys_type(self, spec): + sys_type = str(spec.architecture) + if "SYS_TYPE" in env: + sys_type = env["SYS_TYPE"] + return sys_type + + @property + def cache_name(self): + hostname = socket.gethostname() + if "SYS_TYPE" in env: + hostname = hostname.rstrip("1234567890") + return "{0}-{1}-{2}@{3}-{4}.cmake".format( + hostname, + self._get_sys_type(self.spec), + self.spec.compiler.name, + self.spec.compiler.version, + self.spec.dag_hash(8), + ) + + def initconfig_compiler_entries(self): + spec = self.spec + compiler = self.compiler + # Default entries are already defined in CachedCMakePackage, inherit them: + entries = super().initconfig_compiler_entries() + + if spec.satisfies("+rocm"): + entries.insert(0, cmake_cache_path("CMAKE_CXX_COMPILER", spec["hip"].hipcc)) + + # adrienbernede-23-01 + # Maybe we want to share this in the above llnl_link_helpers function. + compilers_using_cxx14 = ["intel-17", "intel-18", "xl"] + if any(compiler in self.compiler.cxx for compiler in compilers_using_cxx14): + entries.append(cmake_cache_string("BLT_CXX_STD", "c++14")) + + llnl_link_helpers(entries, spec, compiler) + + return entries + + def initconfig_hardware_entries(self): + spec = self.spec + compiler = self.compiler + entries = super().initconfig_hardware_entries() + + entries.append("#------------------{0}".format("-" * 30)) + entries.append("# Package custom hardware settings") + entries.append("#------------------{0}\n".format("-" * 30)) + + entries.append(cmake_cache_option("ENABLE_OPENMP", "+openmp" in spec)) + + # T benefit from the shared function "cuda_for_radiuss_projects", + # we do not modify CMAKE_CUDA_FLAGS: it is already appended by the + # shared function. + if "+cuda" in spec: + entries.append(cmake_cache_option("ENABLE_CUDA", True)) + # Shared handling of cuda. + + # Custom options. + # We place everything in CMAKE_CUDA_FLAGS_(RELEASE|RELWITHDEBINFO|DEBUG) + # which are not set by cuda_for_radiuss_projects + if "xl" in compiler.cxx: + all_targets_flags = ( + "-Xcompiler -qstrict -Xcompiler -qxlcompatmacros -Xcompiler -qalias=noansi" + + "-Xcompiler -qsmp=omp -Xcompiler -qhot -Xcompiler -qnoeh" + + "-Xcompiler -qsuppress=1500-029 -Xcompiler -qsuppress=1500-036" + + "-Xcompiler -qsuppress=1500-030" + ) + cuda_release_flags = "-O3 -Xcompiler -O2 " + all_targets_flags + cuda_reldebinf_flags = "-O3 -g -Xcompiler -O2 " + all_targets_flags + cuda_debug_flags = "-O0 -g -Xcompiler -O2 " + all_targets_flags + + elif "gcc" in compiler.cxx: + all_targets_flags = "-Xcompiler -finline-functions -Xcompiler -finline-limit=20000" + + cuda_release_flags = "-O3 -Xcompiler -Ofast " + all_targets_flags + cuda_reldebinf_flags = "-O3 -g -Xcompiler -Ofast " + all_targets_flags + cuda_debug_flags = "-O0 -g -Xcompiler -O0 " + all_targets_flags + + else: + all_targets_flags = "-Xcompiler -finline-functions" + + cuda_release_flags = "-O3 -Xcompiler -Ofast " + all_targets_flags + cuda_reldebinf_flags = "-O3 -g -Xcompiler -Ofast " + all_targets_flags + cuda_debug_flags = "-O0 -g -Xcompiler -O0 " + all_targets_flags + + entries.append(cmake_cache_string("CMAKE_CUDA_FLAGS_RELEASE", cuda_release_flags)) + entries.append( + cmake_cache_string("CMAKE_CUDA_FLAGS_RELWITHDEBINFO", cuda_reldebinf_flags) + ) + entries.append(cmake_cache_string("CMAKE_CUDA_FLAGS_DEBUG", cuda_debug_flags)) + + else: + entries.append(cmake_cache_option("ENABLE_CUDA", False)) + + if "+rocm" in spec: + entries.append(cmake_cache_option("ENABLE_HIP", True)) + else: + entries.append(cmake_cache_option("ENABLE_HIP", False)) + + entries.append(cmake_cache_option("ENABLE_OPENMP_TARGET", "+omptarget" in spec)) + if "+omptarget" in spec: + if "%xl" in spec: + entries.append( + cmake_cache_string( + "BLT_OPENMP_COMPILE_FLAGS", "-qoffload;-qsmp=omp;-qnoeh;-qalias=noansi" + ) + ) + entries.append( + cmake_cache_string( + "BLT_OPENMP_LINK_FLAGS", "-qoffload;-qsmp=omp;-qnoeh;-qalias=noansi" + ) + ) + if "%clang" in spec: + entries.append( + cmake_cache_string( + "BLT_OPENMP_COMPILE_FLAGS", "-fopenmp;-fopenmp-targets=nvptx64-nvidia-cuda" + ) + ) + entries.append( + cmake_cache_string( + "BLT_OPENMP_LINK_FLAGS", "-fopenmp;-fopenmp-targets=nvptx64-nvidia-cuda" + ) + ) + + return entries + + def initconfig_mpi_entries(self): + spec = self.spec + entries = super().initconfig_mpi_entries() + + entries.append(cmake_cache_option("ENABLE_MPI", "+mpi" in spec)) + + return entries + + def initconfig_package_entries(self): + spec = self.spec + entries = [] + + # option_prefix = "RAJA_" if spec.satisfies("@0.14.0:") else "" + + # TPL locations + entries.append("#------------------{0}".format("-" * 60)) + entries.append("# TPLs") + entries.append("#------------------{0}\n".format("-" * 60)) + + entries.append(cmake_cache_path("BLT_SOURCE_DIR", spec["blt"].prefix)) + if "caliper" in self.spec: + entries.append( + cmake_cache_path("caliper_DIR", spec["caliper"].prefix + "/share/cmake/caliper/") + ) + entries.append( + cmake_cache_path("adiak_DIR", spec["adiak"].prefix + "/lib/cmake/adiak/") + ) + + # Build options + entries.append("#------------------{0}".format("-" * 60)) + entries.append("# Build Options") + entries.append("#------------------{0}\n".format("-" * 60)) + + entries.append(cmake_cache_string("CMAKE_BUILD_TYPE", spec.variants["build_type"].value)) + + entries.append(cmake_cache_string("RAJA_RANGE_ALIGN", "4")) + entries.append(cmake_cache_string("RAJA_RANGE_MIN_LENGTH", "32")) + entries.append(cmake_cache_string("RAJA_DATA_ALIGN", "64")) + + entries.append(cmake_cache_option("RAJA_HOST_CONFIG_LOADED", True)) + + entries.append(cmake_cache_option("BUILD_SHARED_LIBS", "+shared" in spec)) + entries.append(cmake_cache_option("ENABLE_OPENMP", "+openmp" in spec)) + entries.append(cmake_cache_option("RAJA_ENABLE_OPENMP_TASK", "+omptask" in spec)) + entries.append(cmake_cache_option("ENABLE_SYCL", spec.satisfies("+sycl"))) + + # C++17 + if spec.satisfies("@2024.07.0:") and spec.satisfies("+sycl"): + entries.append(cmake_cache_string("BLT_CXX_STD", "c++17")) + # C++14 + # Using RAJA version as threshold on purpose (no 0.14 version of RAJAPerf were released). + elif spec.satisfies("@0.14.0:"): + entries.append(cmake_cache_string("BLT_CXX_STD", "c++14")) + + entries.append(cmake_cache_option("ENABLE_BENCHMARKS", "tests=benchmarks" in spec)) + entries.append( + cmake_cache_option("ENABLE_TESTS", "tests=none" not in spec or self.run_tests) + ) + + entries.append(cmake_cache_option("RAJA_PERFSUITE_USE_CALIPER", "+caliper" in spec)) + + return entries + + def cmake_args(self): + return [] diff --git a/var/spack/repos/builtin/packages/raja/package.py b/var/spack/repos/builtin/packages/raja/package.py index 715756c573742b..39f1d108629b0e 100644 --- a/var/spack/repos/builtin/packages/raja/package.py +++ b/var/spack/repos/builtin/packages/raja/package.py @@ -32,6 +32,12 @@ class Raja(CachedCMakePackage, CudaPackage, ROCmPackage): version("develop", branch="develop", submodules=submodules) version("main", branch="main", submodules=submodules) + version( + "2024.07.0", + tag="v2024.07.0", + commit="4d7fcba55ebc7cb972b7cc9f6778b48e43792ea1", + submodules=submodules, + ) version( "2024.02.2", tag="v2024.02.2", @@ -177,6 +183,8 @@ class Raja(CachedCMakePackage, CudaPackage, ROCmPackage): variant( "omptask", default=False, description="Build OpenMP task variants of internal algorithms" ) + variant("omptarget", default=False, description="Build OpenMP on target device support") + variant("sycl", default=False, description="Build sycl backend") variant("plugins", default=False, description="Enable runtime plugins") variant("examples", default=True, description="Build examples.") @@ -196,7 +204,7 @@ class Raja(CachedCMakePackage, CudaPackage, ROCmPackage): depends_on("blt", type="build") depends_on("blt@0.6.2:", type="build", when="@2024.02.1:") - depends_on("blt@0.6.1:", type="build", when="@2024.02.0:") + depends_on("blt@0.6.1", type="build", when="@2024.02.0") depends_on("blt@0.5.3", type="build", when="@2023.06.0:2023.06.1") depends_on("blt@0.5.2:0.5.3", type="build", when="@2022.10.5") depends_on("blt@0.5.0:0.5.3", type="build", when="@0.14.1:2022.10.4") @@ -205,22 +213,25 @@ class Raja(CachedCMakePackage, CudaPackage, ROCmPackage): depends_on("blt@0.3.6:0.4.1", type="build", when="@:0.12.0") conflicts("^blt@:0.3.6", when="+rocm") + depends_on("camp") depends_on("camp+openmp", when="+openmp") - depends_on("camp@main", when="@develop") - depends_on("camp@main", when="@main") - depends_on("camp@2024.02.1:", type="build", when="@2024.02.1:") - depends_on("camp@2024.02.0:", type="build", when="@2024.02.0:") - depends_on("camp@2023.06.0", type="build", when="@2023.06.0:2023.06.1") - depends_on("camp@2022.10.1:2023.06.0", type="build", when="@2022.10.3:2022.10.5") - depends_on("camp@2022.10.0:2023.06.0", type="build", when="@2022.10.0:2022.10.2") - depends_on("camp@2022.03.2", type="build", when="@2022.03.0:2022.03.1") + depends_on("camp+omptarget", when="+omptarget") + depends_on("camp+sycl", when="+sycl") + depends_on("camp@2024.07.0:", when="@2024.02.2:") + depends_on("camp@2024.02.1", when="@2024.02.1") + depends_on("camp@2024.02.0", when="@2024.02.0") + depends_on("camp@2023.06.0", when="@2023.06.0:2023.06.1") + depends_on("camp@2022.10.1:2023.06.0", when="@2022.10.3:2022.10.5") + depends_on("camp@2022.10.0:2023.06.0", when="@2022.10.0:2022.10.2") + depends_on("camp@2022.03.2", when="@2022.03.0:2022.03.1") depends_on("camp@0.2.2:0.2.3", when="@0.14.0") depends_on("camp@0.1.0", when="@0.10.0:0.13.0") - depends_on("cmake@3.23:", when="@2022.10.0:+rocm", type="build") - depends_on("cmake@3.20:", when="@2022.10.0:", type="build") - depends_on("cmake@3.14:", when="@2022.03.0:", type="build") - depends_on("cmake@:3.20", when="@:2022.03+rocm", type="build") + depends_on("cmake@3.23:", when="@2024.07.0:", type="build") + depends_on("cmake@3.23:", when="@2022.10.0:2024.02.2+rocm", type="build") + depends_on("cmake@3.20:", when="@2022.10.0:2024.02.2", type="build") + depends_on("cmake@3.20:", when="@:2022.03+rocm", type="build") + depends_on("cmake@3.14:", when="@:2022.03", type="build") depends_on("llvm-openmp", when="+openmp %apple-clang") @@ -238,6 +249,16 @@ class Raja(CachedCMakePackage, CudaPackage, ROCmPackage): for sm_ in CudaPackage.cuda_arch_values: depends_on("camp +cuda cuda_arch={0}".format(sm_), when="cuda_arch={0}".format(sm_)) + conflicts("+omptarget +rocm") + conflicts("+sycl +omptarget") + conflicts("+sycl +rocm") + conflicts( + "+sycl", + when="@:2024.02.99", + msg="Support for SYCL was introduced in RAJA after 2024.02 release, " + "please use a newer release.", + ) + def _get_sys_type(self, spec): sys_type = spec.architecture if "SYS_TYPE" in env: @@ -268,7 +289,7 @@ def initconfig_compiler_entries(self): # Default entries are already defined in CachedCMakePackage, inherit them: entries = super().initconfig_compiler_entries() - if "+rocm" in spec: + if spec.satisfies("+rocm"): entries.insert(0, cmake_cache_path("CMAKE_CXX_COMPILER", spec["hip"].hipcc)) llnl_link_helpers(entries, spec, compiler) @@ -283,14 +304,14 @@ def initconfig_hardware_entries(self): entries.append("# Package custom hardware settings") entries.append("#------------------{0}\n".format("-" * 30)) - entries.append(cmake_cache_option("ENABLE_OPENMP", "+openmp" in spec)) + entries.append(cmake_cache_option("ENABLE_OPENMP", spec.satisfies("+openmp"))) - if "+cuda" in spec: + if spec.satisfies("+cuda"): entries.append(cmake_cache_option("ENABLE_CUDA", True)) else: entries.append(cmake_cache_option("ENABLE_CUDA", False)) - if "+rocm" in spec: + if spec.satisfies("+rocm"): entries.append(cmake_cache_option("ENABLE_HIP", True)) hipcc_flags = [] if self.spec.satisfies("@0.14.0:"): @@ -322,35 +343,62 @@ def initconfig_package_entries(self): entries.append("#------------------{0}\n".format("-" * 60)) entries.append(cmake_cache_string("CMAKE_BUILD_TYPE", spec.variants["build_type"].value)) - entries.append(cmake_cache_option("BUILD_SHARED_LIBS", "+shared" in spec)) + entries.append(cmake_cache_option("BUILD_SHARED_LIBS", spec.satisfies("+shared"))) - entries.append(cmake_cache_option("RAJA_ENABLE_DESUL_ATOMICS", "+desul" in spec)) + entries.append(cmake_cache_option("RAJA_ENABLE_DESUL_ATOMICS", spec.satisfies("+desul"))) - entries.append(cmake_cache_option("RAJA_ENABLE_VECTORIZATION", "+vectorization" in spec)) + entries.append( + cmake_cache_option("RAJA_ENABLE_VECTORIZATION", spec.satisfies("+vectorization")) + ) + + entries.append(cmake_cache_option("RAJA_ENABLE_OPENMP_TASK", spec.satisfies("+omptask"))) + + entries.append( + cmake_cache_option("RAJA_ENABLE_TARGET_OPENMP", spec.satisfies("+omptarget")) + ) - entries.append(cmake_cache_option("RAJA_ENABLE_OPENMP_TASK", "+omptask" in spec)) + entries.append(cmake_cache_option("RAJA_ENABLE_SYCL", spec.satisfies("+sycl"))) + # C++17 + if spec.satisfies("@2024.07.0:") and spec.satisfies("+sycl"): + entries.append(cmake_cache_string("BLT_CXX_STD", "c++17")) # C++14 - if spec.satisfies("@0.14.0:"): + elif spec.satisfies("@0.14.0:"): entries.append(cmake_cache_string("BLT_CXX_STD", "c++14")) - if "+desul" in spec: - if "+cuda" in spec: + if spec.satisfies("+desul"): + if spec.satisfies("+cuda"): entries.append(cmake_cache_string("CMAKE_CUDA_STANDARD", "14")) - entries.append(cmake_cache_option("RAJA_ENABLE_RUNTIME_PLUGINS", "+plugins" in spec)) + entries.append( + cmake_cache_option("RAJA_ENABLE_RUNTIME_PLUGINS", spec.satisfies("+plugins")) + ) + + if spec.satisfies("+omptarget"): + entries.append( + cmake_cache_string( + "BLT_OPENMP_COMPILE_FLAGS", "-fopenmp;-fopenmp-targets=nvptx64-nvidia-cuda" + ) + ) + entries.append( + cmake_cache_string( + "BLT_OPENMP_LINK_FLAGS", "-fopenmp;-fopenmp-targets=nvptx64-nvidia-cuda" + ) + ) entries.append( - cmake_cache_option("{}ENABLE_EXAMPLES".format(option_prefix), "+examples" in spec) + cmake_cache_option( + "{}ENABLE_EXAMPLES".format(option_prefix), spec.satisfies("+examples") + ) ) if spec.satisfies("@0.14.0:"): entries.append( cmake_cache_option( - "{}ENABLE_EXERCISES".format(option_prefix), "+exercises" in spec + "{}ENABLE_EXERCISES".format(option_prefix), spec.satisfies("+exercises") ) ) else: - entries.append(cmake_cache_option("ENABLE_EXERCISES", "+exercises" in spec)) + entries.append(cmake_cache_option("ENABLE_EXERCISES", spec.satisfies("+exercises"))) # TODO: Treat the workaround when building tests with spack wrapper # For now, removing it to test CI, which builds tests outside of wrapper. @@ -359,12 +407,12 @@ def initconfig_package_entries(self): # removes -Werror from GTest flags # # if self.spec.satisfies("%clang target=ppc64le:") - # or (not self.run_tests and "+tests" not in spec): - if not self.run_tests and "+tests" not in spec: + # or (not self.run_tests and not spec.satisfies("+tests")): + if not self.run_tests and not spec.satisfies("+tests"): entries.append(cmake_cache_option("ENABLE_TESTS", False)) else: entries.append(cmake_cache_option("ENABLE_TESTS", True)) - if "+run-all-tests" not in spec: + if not spec.satisfies("+run-all-tests"): if spec.satisfies("%clang@12.0.0:13.9.999"): entries.append( cmake_cache_string( diff --git a/var/spack/repos/builtin/packages/random123/package.py b/var/spack/repos/builtin/packages/random123/package.py index efcd5e9b87ca4d..e474f882794619 100644 --- a/var/spack/repos/builtin/packages/random123/package.py +++ b/var/spack/repos/builtin/packages/random123/package.py @@ -16,6 +16,8 @@ class Random123(Package): homepage = "https://www.deshawresearch.com/resources_random123.html" url = "https://github.com/DEShawResearch/random123/archive/refs/tags/v1.14.0.tar.gz" + maintainers("KineticTheory") + version("1.14.0", sha256="effafd8656b18030b2a5b995cd3650c51a7c45052e6e1c21e48b9fa7a59d926e") version( "1.13.2", @@ -39,6 +41,7 @@ class Random123(Package): patch("ibmxl.patch", when="@1.09") patch("arm-gcc.patch", when="@1.09") patch("v1132-xl161.patch", when="@1.13.2") + patch("v1140-hip.patch", when="@1.14.0") def install(self, spec, prefix): # Random123 doesn't have a build system. diff --git a/var/spack/repos/builtin/packages/random123/v1140-hip.patch b/var/spack/repos/builtin/packages/random123/v1140-hip.patch new file mode 100644 index 00000000000000..4e3ef56a12514e --- /dev/null +++ b/var/spack/repos/builtin/packages/random123/v1140-hip.patch @@ -0,0 +1,296 @@ +warning: refname 'v1.14.0' is ambiguous. +diff --git a/include/Random123/array.h b/include/Random123/array.h +index 8076f23..06650ec 100644 +--- a/include/Random123/array.h ++++ b/include/Random123/array.h +@@ -81,7 +81,7 @@ inline R123_CUDA_DEVICE value_type assemble_from_u32(uint32_t *p32){ + + /** @endcond */ + +-#ifdef __CUDA_ARCH__ ++#if defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__) + /* CUDA can't handle std::reverse_iterator. We *could* implement it + ourselves, but let's not bother until somebody really feels a need + to reverse-iterate through an r123array */ +@@ -114,8 +114,8 @@ inline R123_CUDA_DEVICE value_type assemble_from_u32(uint32_t *p32){ + enum {static_size = _N}; \ + R123_CUDA_DEVICE reference operator[](size_type i){return v[i];} \ + R123_CUDA_DEVICE const_reference operator[](size_type i) const {return v[i];} \ +- R123_CUDA_DEVICE reference at(size_type i){ if(i >= _N) R123_THROW(std::out_of_range("array index out of range")); return (*this)[i]; } \ +- R123_CUDA_DEVICE const_reference at(size_type i) const { if(i >= _N) R123_THROW(std::out_of_range("array index out of range")); return (*this)[i]; } \ ++ R123_CUDA_DEVICE reference at(size_type i){ if(i >= _N) {R123_THROW(std::out_of_range("array index out of range"));}; return (*this)[i]; } \ ++ R123_CUDA_DEVICE const_reference at(size_type i) const { if(i >= _N) {R123_THROW(std::out_of_range("array index out of range"));}; return (*this)[i]; } \ + R123_CUDA_DEVICE size_type size() const { return _N; } \ + R123_CUDA_DEVICE size_type max_size() const { return _N; } \ + R123_CUDA_DEVICE bool empty() const { return _N==0; }; \ +diff --git a/include/Random123/boxmuller.hpp b/include/Random123/boxmuller.hpp +index 9c91cf8..16d91f9 100644 +--- a/include/Random123/boxmuller.hpp ++++ b/include/Random123/boxmuller.hpp +@@ -49,7 +49,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + // + // r123::float2 r123::boxmuller(uint32_t u0, uint32_t u1); + // r123::double2 r123::boxmuller(uint64_t u0, uint64_t u1); +-// ++// + // float2 and double2 are identical to their synonymous global- + // namespace structures in CUDA. + // +@@ -68,7 +68,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + namespace r123{ + +-#if !defined(__CUDACC__) ++#if !(defined(__CUDACC__) || defined(__HIPCC__)) + typedef struct { float x, y; } float2; + typedef struct { double x, y; } double2; + #else +diff --git a/include/Random123/features/compilerfeatures.h b/include/Random123/features/compilerfeatures.h +index 0606dee..9ad3f82 100644 +--- a/include/Random123/features/compilerfeatures.h ++++ b/include/Random123/features/compilerfeatures.h +@@ -36,7 +36,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + The Random123 library is portable across C, C++, CUDA, OpenCL environments, + and multiple operating systems (Linux, Windows 7, Mac OS X, FreeBSD, Solaris). + This level of portability requires the abstraction of some features +-and idioms that are either not standardized (e.g., asm statments), or for which ++and idioms that are either not standardized (e.g., asm statments), or for which + different vendors have their own standards (e.g., SSE intrinsics) or for + which vendors simply refuse to conform to well-established standards (e.g., ). + +@@ -55,7 +55,7 @@ Most of the symbols are boolean valued. In general, they will + Library users can override any value by defining the pp-symbol with a compiler option, + e.g., + +- cc -DR123_USE_MULHILO64_C99 ++ cc -DR123_USE_MULHILO64_C99 + + will use a strictly c99 version of the full-width 64x64->128-bit multiplication + function, even if it would be disabled by default. +@@ -84,8 +84,8 @@ All boolean-valued pre-processor symbols in Random123/features/compilerfeatures. + CXX11_EXPLICIT_CONVERSIONS + CXX11_LONG_LONG + CXX11_STD_ARRAY +- CXX11 +- ++ CXX11 ++ + X86INTRIN_H + IA32INTRIN_H + XMMINTRIN_H +@@ -102,7 +102,7 @@ All boolean-valued pre-processor symbols in Random123/features/compilerfeatures. + MULHILO64_C99 + + U01_DOUBLE +- ++ + @endverbatim + Most have obvious meanings. Some non-obvious ones: + +@@ -141,11 +141,11 @@ There are also non-boolean valued symbols: +
    +
  • R123_STATIC_INLINE - + According to both C99 and GNU99, the 'static inline' declaration allows +- the compiler to not emit code if the function is not used. ++ the compiler to not emit code if the function is not used. + Note that the semantics of 'inline', 'static' and 'extern' in + gcc have changed over time and are subject to modification by + command line options, e.g., -std=gnu89, -fgnu-inline. +- Nevertheless, it appears that the meaning of 'static inline' ++ Nevertheless, it appears that the meaning of 'static inline' + has not changed over time and (with a little luck) the use of 'static inline' + here will be portable between versions of gcc and to other C99 + compilers. +@@ -157,7 +157,7 @@ There are also non-boolean valued symbols: + embellishments to strongly encourage that the declared function be + inlined. If there is no such compiler-specific magic, it should + expand to decl, unadorned. +- ++ +
  • R123_CUDA_DEVICE - which expands to __device__ (or something else with + sufficiently similar semantics) when CUDA is in use, and expands + to nothing in other cases. +@@ -192,7 +192,7 @@ There are also non-boolean valued symbols: + \cond HIDDEN_FROM_DOXYGEN + */ + +-/* ++/* + N.B. When something is added to the list of features, it should be + added to each of the *features.h files, AND to examples/ut_features.cpp. + */ +@@ -204,6 +204,8 @@ added to each of the *features.h files, AND to examples/ut_features.cpp. + #include "openclfeatures.h" + #elif defined(__CUDACC__) + #include "nvccfeatures.h" ++#elif defined(__HIPCC__) ++#include "hipfeatures.h" + #elif defined(__ICC) + #include "iccfeatures.h" + #elif defined(__xlC__) || defined(__ibmxl__) +@@ -292,7 +294,7 @@ added to each of the *features.h files, AND to examples/ut_features.cpp. + + #ifndef R123_USE_64BIT + #define R123_USE_64BIT 1 +-#endif ++#endif + + #ifndef R123_USE_PHILOX_64BIT + #define R123_USE_PHILOX_64BIT (R123_USE_64BIT && (R123_USE_MULHILO64_ASM || R123_USE_MULHILO64_MSVC_INTRIN || R123_USE_MULHILO64_CUDA_INTRIN || R123_USE_GNU_UINT128 || R123_USE_MULHILO64_C99 || R123_USE_MULHILO64_OPENCL_INTRIN || R123_USE_MULHILO64_MULHI_INTRIN)) +@@ -327,7 +329,7 @@ added to each of the *features.h files, AND to examples/ut_features.cpp. + #ifndef R123_METAL_CONSTANT_ADDRESS_SPACE + #define R123_METAL_CONSTANT_ADDRESS_SPACE + #endif +- ++ + /* + * Windows.h (and perhaps other "well-meaning" code define min and + * max, so there's a high chance that our definition of min, max +diff --git a/include/Random123/features/hipfeatures.h b/include/Random123/features/hipfeatures.h +new file mode 100644 +index 0000000..f3ac0ed +--- /dev/null ++++ b/include/Random123/features/hipfeatures.h +@@ -0,0 +1,129 @@ ++/* ++Copyright 2010-2011, D. E. Shaw Research. ++All rights reserved. ++ ++Redistribution and use in source and binary forms, with or without ++modification, are permitted provided that the following conditions are ++met: ++ ++* Redistributions of source code must retain the above copyright ++ notice, this list of conditions, and the following disclaimer. ++ ++* Redistributions in binary form must reproduce the above copyright ++ notice, this list of conditions, and the following disclaimer in the ++ documentation and/or other materials provided with the distribution. ++ ++* Neither the name of D. E. Shaw Research nor the names of its ++ contributors may be used to endorse or promote products derived from ++ this software without specific prior written permission. ++ ++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++*/ ++#ifndef __r123_hip_features_dot_h__ ++#define __r123_hip_features_dot_h__ ++ ++#if !(defined(CUDART_VERSION) || defined(HIP_INCLUDE_HIP_HIP_RUNTIME_API_H)) ++#error "why are we in hipfeatures.h if neither CUDART_VERSION NOR HIP_PLATFORM?" ++#endif ++ ++#if CUDART_VERSION < 4010 && !defined(HIP_INCLUDE_HIP_HIP_RUNTIME_API_H) ++#error "CUDA versions earlier than 4.1 produce incorrect results for some templated functions in namespaces. Random123 is unsupported. See comments in nvccfeatures.h" ++// This test was added in Random123-1.08 (August, 2013) because we ++// discovered that Ftype(maxTvalue()) with Ftype=double and ++// T=uint64_t in examples/uniform.hpp produces -1 for CUDA4.0 and ++// earlier. We can't be sure this bug doesn't also affect invocations ++// of other templated functions, e.g., essentially all of Random123. ++// Thus, we no longer trust CUDA versions earlier than 4.1 even though ++// we had previously tested and timed Random123 with CUDA 3.x and 4.0. ++// If you feel lucky or desperate, you can change #error to #warning, but ++// please take extra care to be sure that you are getting correct ++// results. ++#endif ++ ++// nvcc falls through to gcc or msvc. So first define ++// a couple of things and then include either gccfeatures.h ++// or msvcfeatures.h ++ ++//#ifdef __CUDA_ARCH__ allows Philox32 and Philox64 to be compiled ++//for both device and host functions in CUDA by setting compiler flags ++//for the device function ++#if defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__) ++#ifndef R123_CUDA_DEVICE ++#define R123_CUDA_DEVICE __host__ __device__ ++#endif ++ ++#ifndef R123_USE_MULHILO64_CUDA_INTRIN ++#define R123_USE_MULHILO64_CUDA_INTRIN 1 ++#endif ++ ++#ifndef R123_THROW ++// No exceptions in CUDA, at least upto 4.0 ++#define R123_THROW(x) R123_ASSERT(0) ++#endif ++ ++#ifndef R123_ASSERT ++# if defined(__CUDA_ARCH__) ++# define R123_ASSERT(x) if((x)); else asm("trap;") ++# elif defined(__HIP_DEVICE_COMPILE__) ++# define R123_ASSERT(x) if((x)); else asm("s_trap 2;") ++# endif ++#endif ++ ++#else // ! ( defined(__CUDA_ARCH__) || defined(__HIP_DEVICE_COMPILE__) ) ++// If we're using nvcc not compiling for the CUDA architecture, ++// then we must be compiling for the host. In that case, ++// tell the philox code to use the mulhilo64 asm because ++// nvcc doesn't grok uint128_t. ++#ifndef R123_USE_MULHILO64_ASM ++#define R123_USE_MULHILO64_ASM 1 ++#endif ++ ++#endif // __CUDA_ARCH__ ++ ++#ifndef R123_BUILTIN_EXPECT ++#define R123_BUILTIN_EXPECT(expr,likely) expr ++#endif ++ ++#ifndef R123_USE_AES_NI ++#define R123_USE_AES_NI 0 ++#endif ++ ++#ifndef R123_USE_SSE4_2 ++#define R123_USE_SSE4_2 0 ++#endif ++ ++#ifndef R123_USE_SSE4_1 ++#define R123_USE_SSE4_1 0 ++#endif ++ ++#ifndef R123_USE_SSE ++#define R123_USE_SSE 0 ++#endif ++ ++#ifndef R123_USE_GNU_UINT128 ++#define R123_USE_GNU_UINT128 0 ++#endif ++ ++#ifndef R123_ULONG_LONG ++// uint64_t, which is what we'd get without this, is ++// not the same as unsigned long long ++#define R123_ULONG_LONG unsigned long long ++#endif ++ ++#if defined(__GNUC__) ++#include "gccfeatures.h" ++#elif defined(_MSC_FULL_VER) ++#include "msvcfeatures.h" ++#endif ++ ++#endif +diff --git a/include/Random123/uniform.hpp b/include/Random123/uniform.hpp +index ee4ddfb..d40d0a4 100644 +--- a/include/Random123/uniform.hpp ++++ b/include/Random123/uniform.hpp +@@ -125,7 +125,7 @@ R123_MK_SIGNED_UNSIGNED(__int128_t, __uint128_t); + #undef R123_MK_SIGNED_UNSIGNED + #endif + +-#if defined(__CUDACC__) || defined(_LIBCPP_HAS_NO_CONSTEXPR) ++#if defined(__CUDACC__) || defined(_LIBCPP_HAS_NO_CONSTEXPR) || defined(__HIPCC__) + // Amazing! cuda thinks numeric_limits::max() is a __host__ function, so + // we can't use it in a device function. + // diff --git a/var/spack/repos/builtin/packages/rccl/package.py b/var/spack/repos/builtin/packages/rccl/package.py index 49b9e4081ede08..c8f973237950d7 100644 --- a/var/spack/repos/builtin/packages/rccl/package.py +++ b/var/spack/repos/builtin/packages/rccl/package.py @@ -21,6 +21,8 @@ class Rccl(CMakePackage): maintainers("srekolam", "renjithravindrankannath") libraries = ["librccl"] + version("6.2.1", sha256="0f5e35c7afbb21c1d49ff201b7d1ddf163d853c27c75c3eaf7b449f4dc1e2188") + version("6.2.0", sha256="a29c94ea3b9c1a0121d7b1450cb01a697f9f9132169632312b9b0bf744d3c0e3") version("6.1.2", sha256="98af99c12d800f5439c7740d797162c35810a25e08e3b11b397d3300d3c0148e") version("6.1.1", sha256="6368275059ba190d554535d5aeaa5c2510d944b56efd85c90a1701d0292a14c5") version("6.1.0", sha256="c6308f6883cbd63dceadbe4ee154cc6fa9e6bdccbd2f0fda295b564b0cf01e9a") @@ -73,6 +75,8 @@ class Rccl(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"rocm-cmake@{ver}:", type="build", when=f"@{ver}") depends_on(f"hip@{ver}", when=f"@{ver}") @@ -91,6 +95,8 @@ class Rccl(CMakePackage): "6.0.2", "6.1.0", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"rocm-core@{ver}", when=f"@{ver}") diff --git a/var/spack/repos/builtin/packages/rclone/package.py b/var/spack/repos/builtin/packages/rclone/package.py index 005e2ebbfb07f0..6e29913e387ea4 100644 --- a/var/spack/repos/builtin/packages/rclone/package.py +++ b/var/spack/repos/builtin/packages/rclone/package.py @@ -6,7 +6,7 @@ from spack.package import * -class Rclone(Package): +class Rclone(GoPackage): """Rclone is a command line program to sync files and directories to and from various cloud storage providers""" @@ -17,6 +17,7 @@ class Rclone(Package): license("MIT") + version("1.68.1", sha256="c5d45b83dd008d08a0903eebf1578a11a40a77152226e22ce5e9287b9db05579") version("1.65.2", sha256="1305c913ac3684d02ce2bade0a23a2115c1ec03c9447d1562bb6cd9fa2573412") version("1.65.1", sha256="904b906cc465dd679a00487497e3891d33fca6b6e25c184400bccfb248344f39") version("1.65.0", sha256="45ec732d50b2517dc2c860317a3bf79867634a8143e4a441a3e399434ad6c141") @@ -39,21 +40,21 @@ class Rclone(Package): version("1.55.1", sha256="25da7fc5c9269b3897f27b0d946919df595c6dda1b127085fda0fe32aa59d29d") version("1.55.0", sha256="75accdaedad3b82edc185dc8824a19a59c30dc6392de7074b6cd98d1dc2c9040") - depends_on("c", type="build") # generated - depends_on("go@1.14:", type="build") - depends_on("go@1.17:", type="build", when="@1.58.0:") - depends_on("go@1.18:", type="build", when="@1.62.0:") - - phases = ["build", "install"] - - def setup_build_environment(self, env): - # Point GOPATH at the top of the staging dir for the build step. - env.prepend_path("GOPATH", self.stage.path) - - def build(self, spec, prefix): - go("build") - - def install(self, spec, prefix): - mkdirp(prefix.bin) - install("rclone", prefix.bin) + depends_on("go@1.17:", type="build", when="@1.58:") + depends_on("go@1.18:", type="build", when="@1.62:") + depends_on("go@1.19:", type="build", when="@1.63:") + depends_on("go@1.20:", type="build", when="@1.66:") + depends_on("go@1.21:", type="build", when="@1.68:") + + @run_after("install") + def install_completions(self): + rclone = Executable(self.prefix.bin.rclone) + + mkdirp(bash_completion_path(self.prefix)) + mkdirp(fish_completion_path(self.prefix)) + mkdirp(zsh_completion_path(self.prefix)) + + rclone("genautocomplete", "bash", str(bash_completion_path(self.prefix) / "rclone")) + rclone("genautocomplete", "fish", str(fish_completion_path(self.prefix) / "rclone.fish")) + rclone("genautocomplete", "zsh", str(zsh_completion_path(self.prefix) / "_rclone")) diff --git a/var/spack/repos/builtin/packages/rdc/package.py b/var/spack/repos/builtin/packages/rdc/package.py index 57deb2529d6135..0d97a02de13297 100644 --- a/var/spack/repos/builtin/packages/rdc/package.py +++ b/var/spack/repos/builtin/packages/rdc/package.py @@ -27,6 +27,8 @@ def url_for_version(self, version): return url.format(version) license("MIT") + version("6.2.1", sha256="63c0cffd772a43d0984505646023485ca2bc8512f5a87ece016f1d381cded075") + version("6.2.0", sha256="dd12428426a4963d6eb3cfdd818acef7a3c4cddf32504df17f4c1004fa902bef") version("6.1.2", sha256="5553b76d4c8b6381d236197613720587377d03d4fd43a5a20bb6a716d49f7dfc") version("6.1.1", sha256="c133ebd20bf42e543d13c5b84ea420a7f7c069c77b1d6dcae9680de924e5f539") version("6.1.0", sha256="a8ad5d880645c9e95c9c90b0c9026627b22467e3e879525fff38ccd924f36c39") @@ -50,7 +52,8 @@ def url_for_version(self, version): depends_on("grpc@1.28.1+shared", type="build", when="@:5.3") depends_on("grpc@1.44.0+shared", when="@5.4.0:5.4") depends_on("grpc@1.55.0+shared", when="@5.5.0:6.0") - depends_on("grpc@1.59.1+shared", when="@6.1:") + depends_on("grpc@1.59.1+shared", when="@6.1") + depends_on("grpc@1.61.2+shared", when="@6.2:") depends_on("protobuf") depends_on("libcap") @@ -70,6 +73,8 @@ def url_for_version(self, version): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"rocm-smi-lib@{ver}", type=("build", "link"), when=f"@{ver}") depends_on(f"hsa-rocr-dev@{ver}", when=f"@{ver}") @@ -86,8 +91,12 @@ def url_for_version(self, version): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"rocm-core@{ver}", when=f"@{ver}") + for ver in ["6.2.0", "6.2.1"]: + depends_on(f"amdsmi@{ver}", when=f"@{ver}") def patch(self): filter_file(r"\${ROCM_DIR}/rocm_smi", "${ROCM_SMI_DIR}", "CMakeLists.txt") diff --git a/var/spack/repos/builtin/packages/re2/package.py b/var/spack/repos/builtin/packages/re2/package.py index 6ddf02a9b86788..f7232c7051891d 100644 --- a/var/spack/repos/builtin/packages/re2/package.py +++ b/var/spack/repos/builtin/packages/re2/package.py @@ -13,8 +13,29 @@ class Re2(CMakePackage): homepage = "https://github.com/google/re2" url = "https://github.com/google/re2/archive/2020-08-01.tar.gz" - license("BSD-3-Clause") + license("BSD-3-Clause", checked_by="wdconinc") + version( + "2024-07-02", sha256="eb2df807c781601c14a260a507a5bb4509be1ee626024cb45acbd57cb9d4032b" + ) + version( + "2024-06-01", sha256="7326c74cddaa90b12090fcfc915fe7b4655723893c960ee3c2c66e85c5504b6c" + ) + version( + "2024-05-01", sha256="fef2f366578401eada34f5603679fb2aebe9b409de8d275a482ce5f2cbac2492" + ) + version( + "2024-04-01", sha256="3f6690c3393a613c3a0b566309cf04dc381d61470079b653afc47c67fb898198" + ) + version( + "2024-03-01", sha256="7b2b3aa8241eac25f674e5b5b2e23d4ac4f0a8891418a2661869f736f03f57f4" + ) + version( + "2024-02-01", sha256="cd191a311b84fcf37310e5cd876845b4bf5aee76fdd755008eef3b6478ce07bb" + ) + version( + "2023-11-01", sha256="4e6593ac3c71de1c0f322735bc8b0492a72f66ffccfad76e259fa21c41d27d8a" + ) version( "2023-09-01", sha256="5bb6875ae1cd1e9fedde98018c346db7260655f86fdb8837e3075103acd3649b" ) @@ -28,20 +49,33 @@ class Re2(CMakePackage): "2020-04-01", sha256="98794bc5416326817498384a9c43cbb5a406bab8da9f84f83c39ecad43ed5cea" ) - depends_on("cxx", type="build") # generated + depends_on("cxx", type="build") + variant( + "icu", + default=False, + description="Build against ICU for full Unicode properties support", + when="@2023-02-01:", + ) variant("shared", default=False, description="Build shared instead of static libraries") variant("pic", default=True, description="Enable position independent code") depends_on("abseil-cpp", when="@2023-09-01:") + depends_on("icu4c", when="+icu") + + depends_on("googletest", type="test") + depends_on("benchmark ~performance_counters", type="test") + # shared libs must have position-independent code conflicts("+shared ~pic") def cmake_args(self): args = [ + self.define_from_variant("RE2_USE_ICU", "icu"), self.define_from_variant("BUILD_SHARED_LIBS", "shared"), self.define_from_variant("CMAKE_POSITION_INDEPENDENT_CODE", "pic"), + self.define("RE2_BUILD_TESTING", self.run_tests), ] abseil = self.spec.dependencies("abseil-cpp") diff --git a/var/spack/repos/builtin/packages/re2c/package.py b/var/spack/repos/builtin/packages/re2c/package.py index 57436bcf494ff2..c9ca466d020dea 100644 --- a/var/spack/repos/builtin/packages/re2c/package.py +++ b/var/spack/repos/builtin/packages/re2c/package.py @@ -2,13 +2,11 @@ # Spack Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) - -import sys - +from spack.build_systems import autotools, cmake from spack.package import * -class Re2c(Package): +class Re2c(AutotoolsPackage, CMakePackage): """re2c: a free and open-source lexer generator for C and C++""" homepage = "https://re2c.org/index.html" @@ -17,38 +15,31 @@ class Re2c(Package): license("Public-Domain") - # Python 3.7 is required for re2c@3.1, but the clingo bootstrap on OpenSUSE Leap uses - # the system Python 3.6 such that the bootstrap fails with an UnsatisfiableVersionSpecError - # version("3.1", sha256="0ac299ad359e3f512b06a99397d025cfff81d3be34464ded0656f8a96676c029") + version("3.1", sha256="0ac299ad359e3f512b06a99397d025cfff81d3be34464ded0656f8a96676c029") version("3.0", sha256="b3babbbb1461e13fe22c630a40c43885efcfbbbb585830c6f4c0d791cf82ba0b") version("2.2", sha256="0fc45e4130a8a555d68e230d1795de0216dfe99096b61b28e67c86dfd7d86bda") version("2.1.1", sha256="036ee264fafd5423141ebd628890775aa9447a4c4068a6307385d7366fe711f8") version("2.1", sha256="8cba0d95c246c670de8f97f57def83a9c0f2113eaa6f7e4867a941f48f633540") - version("2.0.3", sha256="b2bc1eb8aaaa21ff2fcd26507b7e6e72c5e3d887e58aa515c2155fb17d744278") - version("2.0.2", sha256="6cddbb558dbfd697a729cb4fd3f095524480283b89911ca5221835d8a67ae5e0") - version("2.0.1", sha256="aef8b50bb75905b2d55a7236380c0efdc756fa077fe16d808aaacbb10fb53531") - version("2.0", sha256="89a9d7ee14be10e3779ea7b2c8ea4a964afce6e76b8dbcd5479940681db46d20") - version("1.3", sha256="f37f25ff760e90088e7d03d1232002c2c2672646d5844fdf8e0d51a5cd75a503") - version("1.2.1", sha256="1a4cd706b5b966aeffd78e3cf8b24239470ded30551e813610f9cd1a4e01b817") - depends_on("c", type="build") # generated - depends_on("cxx", type="build") # generated + with default_args(deprecated=True): + version("2.0.3", sha256="b2bc1eb8aaaa21ff2fcd26507b7e6e72c5e3d887e58aa515c2155fb17d744278") + version("2.0.2", sha256="6cddbb558dbfd697a729cb4fd3f095524480283b89911ca5221835d8a67ae5e0") + version("2.0.1", sha256="aef8b50bb75905b2d55a7236380c0efdc756fa077fe16d808aaacbb10fb53531") + version("2.0", sha256="89a9d7ee14be10e3779ea7b2c8ea4a964afce6e76b8dbcd5479940681db46d20") + version("1.3", sha256="f37f25ff760e90088e7d03d1232002c2c2672646d5844fdf8e0d51a5cd75a503") + version("1.2.1", sha256="1a4cd706b5b966aeffd78e3cf8b24239470ded30551e813610f9cd1a4e01b817") - phases = ["configure", "build", "install"] + build_system(conditional("cmake", when="@2.2:"), "autotools", default="autotools") - depends_on("cmake", when="platform=windows") - depends_on("gmake", when="platform=linux") - depends_on("gmake", when="platform=darwin") - depends_on("gmake", when="platform=freebsd") - # depends_on("python@3:", when="@3.1:", type="build") + depends_on("c", type="build") + depends_on("cxx", type="build") + depends_on("python@3.7:", when="@3.1", type="build") - @property - def make_tool(self): - if sys.platform == "win32": - return ninja - else: - return make + with when("build_system=cmake"): + depends_on("cmake@3.12:", type="build") + +class AutotoolsBuilder(autotools.AutotoolsBuilder): def configure_args(self): return [ "--disable-benchmarks", @@ -56,24 +47,18 @@ def configure_args(self): "--disable-dependency-tracking", "--disable-docs", "--disable-lexers", # requires existing system re2c - "--disable-libs", # experimental + "--enable-libs", "--enable-golang", ] - def configure(self, spec, prefix): - with working_dir(self.stage.source_path, create=True): - configure("--prefix=" + prefix, *self.configure_args()) - - @when("platform=windows") - def configure(self, spec, prefix): - with working_dir(self.stage.source_path, create=True): - args = ["-G", "Ninja", "-DCMAKE_INSTALL_PREFIX=%s" % prefix] - cmake(*args) - def build(self, spec, prefix): - with working_dir(self.stage.source_path): - self.make_tool() - - def install(self, spec, prefix): - with working_dir(self.stage.source_path): - self.make_tool("install") +class CMakeBuilder(cmake.CMakeBuilder): + def cmake_args(self): + return [ + self.define("RE2C_BUILD_LIBS", True), + self.define("RE2C_REBUILD_DOCS", False), + self.define("RE2C_REBUILD_LEXERS", False), + self.define("RE2C_REBUILD_PARSERS", False), + self.define("RE2C_BUILD_RE2RUST", False), + self.define("RE2C_BUILD_RE2GO", False), + ] diff --git a/var/spack/repos/builtin/packages/redis/package.py b/var/spack/repos/builtin/packages/redis/package.py index f32406ee2e6563..d1e91863caaa7d 100644 --- a/var/spack/repos/builtin/packages/redis/package.py +++ b/var/spack/repos/builtin/packages/redis/package.py @@ -19,8 +19,8 @@ class Redis(MakefilePackage): homepage = "https://redis.io" urls = [ - "https://download.redis.io/releases/redis-7.0.5.tar.gz", - "https://github.com/redis/redis/archive/refs/tags/7.0.5.tar.gz", + "https://download.redis.io/releases/redis-7.4.0.tar.gz", + "https://github.com/redis/redis/archive/refs/tags/7.4.0.tar.gz", ] git = "https://github.com/redis/redis.git" @@ -28,29 +28,41 @@ class Redis(MakefilePackage): license("BSD-3-Clause") - version("7.0.5", sha256="67054cc37b58c125df93bd78000261ec0ef4436a26b40f38262c780e56315cc3") - version("7.0.4", sha256="f0e65fda74c44a3dd4fa9d512d4d4d833dd0939c934e946a5c622a630d057f2f") - version("7.0.3", sha256="2cde7d17214ffe305953da9fff12333e8a72caa57fd4923e4872f6362a208e73") - version("7.0.2", sha256="5e57eafe7d4ac5ecb6a7d64d6b61db775616dbf903293b3fcc660716dbda5eeb") - version("7.0.1", sha256="ca1820d527e4759884620be2917079e61e996fa81da5fbe5c07c4a7b507264dc") - version("7.0.0", sha256="284d8bd1fd85d6a55a05ee4e7c31c31977ad56cbf344ed83790beeb148baa720") - version("6.2.7", sha256="b7a79cc3b46d3c6eb52fa37dde34a4a60824079ebdfb3abfbbfa035947c55319") - version("6.2.6", sha256="5b2b8b7a50111ef395bf1c1d5be11e6e167ac018125055daa8b5c2317ae131ab") - version("6.2.5", sha256="4b9a75709a1b74b3785e20a6c158cab94cf52298aa381eea947a678a60d551ae") - version("6.2.4", sha256="ba32c406a10fc2c09426e2be2787d74ff204eb3a2e496d87cff76a476b6ae16e") - version("6.2.3", sha256="98ed7d532b5e9671f5df0825bb71f0f37483a16546364049384c63db8764512b") - version("6.2.2", sha256="7a260bb74860f1b88c3d5942bf8ba60ca59f121c6dce42d3017bed6add0b9535") - version("6.2.1", sha256="cd222505012cce20b25682fca931ec93bd21ae92cb4abfe742cf7b76aa907520") - version("6.2.0", sha256="67d624c25d962bd68aff8812a135df85bad07556b8825f3bcd5b522a9932dbca") - version("6.0.15", sha256="4bc295264a95bc94423c162a9eee66135a24a51eefe5f53f18fc9bde5c3a9f74") - version("6.0.5", sha256="42cf86a114d2a451b898fcda96acd4d01062a7dbaaad2801d9164a36f898f596") - version("5.0.3", sha256="e290b4ddf817b26254a74d5d564095b11f9cd20d8f165459efa53eb63cd93e02") - version("5.0.2", sha256="937dde6164001c083e87316aa20dad2f8542af089dfcb1cbb64f9c8300cd00ed") - version("5.0.1", sha256="82a67c0eec97f9ad379384c30ec391b269e17a3e4596393c808f02db7595abcb") - version("5.0.0", sha256="70c98b2d0640b2b73c9d8adb4df63bcb62bad34b788fe46d1634b6cf87dc99a4") - version("4.0.13", sha256="17d955227966dcd68590be6139e5fe7f2d19fc4fb7334248a904ea9cdd30c1d4") - version("4.0.12", sha256="6447259d2eed426a949c9c13f8fdb2d91fb66d9dc915dd50db13b87f46d93162") - version("4.0.11", sha256="fc53e73ae7586bcdacb4b63875d1ff04f68c5474c1ddeda78f00e5ae2eed1bbb") + version("7.4.0", sha256="57b47c2c6682636d697dbf5d66d8d495b4e653afc9cd32b7adf9da3e433b8aaf") + with default_args(deprecated=True): + # https://nvd.nist.gov/vuln/detail/CVE-2023-36824 + version("7.0.5", sha256="67054cc37b58c125df93bd78000261ec0ef4436a26b40f38262c780e56315cc3") + version("7.0.4", sha256="f0e65fda74c44a3dd4fa9d512d4d4d833dd0939c934e946a5c622a630d057f2f") + version("7.0.3", sha256="2cde7d17214ffe305953da9fff12333e8a72caa57fd4923e4872f6362a208e73") + version("7.0.2", sha256="5e57eafe7d4ac5ecb6a7d64d6b61db775616dbf903293b3fcc660716dbda5eeb") + version("7.0.1", sha256="ca1820d527e4759884620be2917079e61e996fa81da5fbe5c07c4a7b507264dc") + version("7.0.0", sha256="284d8bd1fd85d6a55a05ee4e7c31c31977ad56cbf344ed83790beeb148baa720") + # https://nvd.nist.gov/vuln/detail/CVE-2022-24834 + version("6.2.7", sha256="b7a79cc3b46d3c6eb52fa37dde34a4a60824079ebdfb3abfbbfa035947c55319") + version("6.2.6", sha256="5b2b8b7a50111ef395bf1c1d5be11e6e167ac018125055daa8b5c2317ae131ab") + version("6.2.5", sha256="4b9a75709a1b74b3785e20a6c158cab94cf52298aa381eea947a678a60d551ae") + version("6.2.4", sha256="ba32c406a10fc2c09426e2be2787d74ff204eb3a2e496d87cff76a476b6ae16e") + version("6.2.3", sha256="98ed7d532b5e9671f5df0825bb71f0f37483a16546364049384c63db8764512b") + version("6.2.2", sha256="7a260bb74860f1b88c3d5942bf8ba60ca59f121c6dce42d3017bed6add0b9535") + version("6.2.1", sha256="cd222505012cce20b25682fca931ec93bd21ae92cb4abfe742cf7b76aa907520") + version("6.2.0", sha256="67d624c25d962bd68aff8812a135df85bad07556b8825f3bcd5b522a9932dbca") + version( + "6.0.15", sha256="4bc295264a95bc94423c162a9eee66135a24a51eefe5f53f18fc9bde5c3a9f74" + ) + version("6.0.5", sha256="42cf86a114d2a451b898fcda96acd4d01062a7dbaaad2801d9164a36f898f596") + version("5.0.3", sha256="e290b4ddf817b26254a74d5d564095b11f9cd20d8f165459efa53eb63cd93e02") + version("5.0.2", sha256="937dde6164001c083e87316aa20dad2f8542af089dfcb1cbb64f9c8300cd00ed") + version("5.0.1", sha256="82a67c0eec97f9ad379384c30ec391b269e17a3e4596393c808f02db7595abcb") + version("5.0.0", sha256="70c98b2d0640b2b73c9d8adb4df63bcb62bad34b788fe46d1634b6cf87dc99a4") + version( + "4.0.13", sha256="17d955227966dcd68590be6139e5fe7f2d19fc4fb7334248a904ea9cdd30c1d4" + ) + version( + "4.0.12", sha256="6447259d2eed426a949c9c13f8fdb2d91fb66d9dc915dd50db13b87f46d93162" + ) + version( + "4.0.11", sha256="fc53e73ae7586bcdacb4b63875d1ff04f68c5474c1ddeda78f00e5ae2eed1bbb" + ) depends_on("c", type="build") # generated depends_on("cxx", type="build") # generated diff --git a/var/spack/repos/builtin/packages/reframe/package.py b/var/spack/repos/builtin/packages/reframe/package.py index 5a142a94a157c1..8717f6fd7d8463 100644 --- a/var/spack/repos/builtin/packages/reframe/package.py +++ b/var/spack/repos/builtin/packages/reframe/package.py @@ -26,6 +26,29 @@ class Reframe(Package): license("BSD-3-Clause") version("develop", branch="develop") + version("4.6.3", sha256="0f335e588d21a26d76beb011bc86baf80ba633d875512ecd564d0aeb320fcf2c") + version("4.6.2", sha256="d3343815ee3d2c330b91a1cdb924ba184119ed7d9fc88a4a754b939a4259df82") + version("4.6.1", sha256="058b05c430af26d2958851af0da32bac0f4bff1af7d78ce6a132c32bbe40ec5c") + version("4.6.0", sha256="fcd29a419eebcb990b3e9be94b44e4ea59ce0de76f271e38f10cf5a6545ed29d") + version("4.5.2", sha256="3f8750d0cd53261c763f9403723d87fc87361a7b0f9ba38e237d6c570fdc50df") + version("4.5.1", sha256="8629c0adef897ccea971d6513f64acadf14e2532a543bc055213f2f5719436b5") + version("4.5.0", sha256="5d1773d0bc76c9cd74de8688aa508a14ac7dfcdcea65d7f9473821905c60dacb") + version("4.4.2", sha256="d773ce7f48fb177331f92920117d90cba3b9fea6b78f96f2bb83ad7239a55c3c") + version("4.4.1", sha256="0fc8c711ccf53be8a5c687572317040e55a4edd3d935421b5957b2d9f218a0fe") + version("4.4.0", sha256="3a5de3eab90a1b9ac5d1b272721602b1460eea6fbbda9ba691c38995f2ed3d2b") + version("4.3.4", sha256="6a38279dd58da63316143c6f58b92798c1fd9523d50876bc2df19769f1562d3b") + version("4.3.3", sha256="3d1a1a6d2c8e3b362dadc47f642f23f7574fb81b03be31055040afe9738829c2") + version("4.3.2", sha256="b4e42915cf3d6c7c0f975f12eecd609ae5f165b764989f4ee066a209ff0150ae") + version("4.3.1", sha256="63e149b516048d522c36d29c9961cba4d4e7fde9cfcdf9f599d7a1ca0358b9e0") + version("4.3.0", sha256="89a73695a6c963eb1a2e6807b019fbad25793261829e3a7032f0b61ac3db66c8") + version("4.2.2", sha256="c210999d506f7b0582f58f390c4e35bc89a38ca277915532f9fd68ff562e8ca9") + version("4.2.1", sha256="c33c5406227b3fa34ee489769cb178f9dd04ead353062c21a837f31c23205bbe") + version("4.2.0", sha256="f1d38133023b37d01fdee46b2bf472f8fd36bf410d1c909db043b9f9d7df6122") + version("4.1.3", sha256="33e56bdabbc80cb80ac519ad9c341b296788b0954492059410674eba86044740") + version("4.1.2", sha256="b33f44f977ed1942af5fcca0bac291daefb3353e05321832310a0c8d99d09bf6") + version("4.1.1", sha256="68f82248dc424197e5254ca5f364565de40ed392ec02b14e8e10cab3eaf5e563") + version("4.1.0", sha256="2f6f6793e53fd03cdc8e457b7ed4f9b2105213c26e9d5308c8f3824ea89c936c") + version("4.0.5", sha256="4902258e5a201cb72ef9dc175a0970dcfc5869f3270a198dcd8bc47cc1a3cabd") version("4.0.4", sha256="a9fb10bf2dc01f721142453297e348084683acfc0b8caa38ad1daa1b5c66456e") version("4.0.3", sha256="ae216b0ccfda9f5f5c09f0be46cf8ab04183a0c30edf581917767dc3bb8de010") version("4.0.2", sha256="48ec55645256d8686e077c7a9d4d2aa7d327eec27ff2ae2c78dd1db818b76ec7") diff --git a/var/spack/repos/builtin/packages/relion/package.py b/var/spack/repos/builtin/packages/relion/package.py index b2b93dbd1596dd..b4278807424617 100644 --- a/var/spack/repos/builtin/packages/relion/package.py +++ b/var/spack/repos/builtin/packages/relion/package.py @@ -12,7 +12,7 @@ class Relion(CMakePackage, CudaPackage): refinement of (multiple) 3D reconstructions or 2D class averages in electron cryo-microscopy (cryo-EM).""" - homepage = "http://www2.mrc-lmb.cam.ac.uk/relion" + homepage = "https://www2.mrc-lmb.cam.ac.uk/relion" git = "https://github.com/3dem/relion.git" url = "https://github.com/3dem/relion/archive/4.0.0.zip" maintainers("dacolombo") diff --git a/var/spack/repos/builtin/packages/resolve/package.py b/var/spack/repos/builtin/packages/resolve/package.py index d70c9ccf8ff1d8..e032a18cf6a1ae 100644 --- a/var/spack/repos/builtin/packages/resolve/package.py +++ b/var/spack/repos/builtin/packages/resolve/package.py @@ -26,6 +26,12 @@ class Resolve(CMakePackage, CudaPackage, ROCmPackage): depends_on("cxx", type="build") # generated variant("klu", default=True, description="Use KLU, AMD and COLAMD Libraries from SuiteSparse") + variant( + "lusol", + default=True, + when="@develop:", + description="Build the LUSOL Library. Requires fortran", + ) depends_on("suite-sparse", when="+klu") @@ -46,7 +52,11 @@ def cmake_args(self): spec = self.spec args.extend( - [self.define("RESOLVE_USE_KLU", "klu"), self.define("RESOLVE_TEST_WITH_BSUB", False)] + [ + self.define_from_variant("RESOLVE_USE_KLU", "klu"), + self.define_from_variant("RESOLVE_USE_LUSOL", "lusol"), + self.define("RESOLVE_TEST_WITH_BSUB", False), + ] ) if "+cuda" in spec: diff --git a/var/spack/repos/builtin/packages/restic/package.py b/var/spack/repos/builtin/packages/restic/package.py index eca1662df3fa82..e6144806699c50 100644 --- a/var/spack/repos/builtin/packages/restic/package.py +++ b/var/spack/repos/builtin/packages/restic/package.py @@ -6,7 +6,7 @@ from spack.package import * -class Restic(Package): +class Restic(GoPackage): """Fast, secure, efficient backup program.""" homepage = "https://restic.net" @@ -16,6 +16,7 @@ class Restic(Package): license("BSD-2-Clause") + version("0.17.1", sha256="cba3a5759690d11dae4b5620c44f56be17a5688e32c9856776db8a9a93d6d59a") version("0.16.4", sha256="d736a57972bb7ee3398cf6b45f30e5455d51266f5305987534b45a4ef505f965") version("0.16.3", sha256="a94d6c1feb0034fcff3e8b4f2d65c0678f906fc21a1cf2d435341f69e7e7af52") version("0.16.2", sha256="88165b5b89b6064df37a9964d660f40ac62db51d6536e459db9aaea6f2b2fc11") @@ -26,20 +27,24 @@ class Restic(Package): version("0.14.0", sha256="78cdd8994908ebe7923188395734bb3cdc9101477e4163c67e7cc3b8fd3b4bd6") version("0.12.1", sha256="a9c88d5288ce04a6cc78afcda7590d3124966dab3daa9908de9b3e492e2925fb") - depends_on("go", type="build") depends_on("go@1.15:", type="build", when="@0.14.0:") depends_on("go@1.18:", type="build", when="@0.15.0:") depends_on("go@1.19:", type="build", when="@1.16.1:") - phases = ["build", "install"] + build_directory = "cmd/restic" - def setup_build_environment(self, env): - # Point GOPATH at the top of the staging dir for the build step. - env.prepend_path("GOPATH", self.stage.path) + @run_after("install") + def install_completions(self): + restic = Executable(self.prefix.bin.restic) - def build(self, spec, prefix): - go("run", "build.go") + mkdirp(bash_completion_path(self.prefix)) + mkdirp(fish_completion_path(self.prefix)) + mkdirp(zsh_completion_path(self.prefix)) - def install(self, spec, prefix): - mkdirp(prefix.bin) - install("restic", prefix.bin) + restic("generate", "--bash-completion", "restic.bash") + restic("generate", "--fish-completion", "restic.fish") + restic("generate", "--zsh-completion", "_restic") + + install("restic.bash", bash_completion_path(self.prefix)) + install("restic.fish", fish_completion_path(self.prefix)) + install("_restic", zsh_completion_path(self.prefix)) diff --git a/var/spack/repos/builtin/packages/ripgrep/package.py b/var/spack/repos/builtin/packages/ripgrep/package.py index f8c0649e7f82aa..ee30a1420dc181 100644 --- a/var/spack/repos/builtin/packages/ripgrep/package.py +++ b/var/spack/repos/builtin/packages/ripgrep/package.py @@ -19,7 +19,26 @@ class Ripgrep(CargoPackage): license("MIT OR Unlicense") + version("14.1.1", sha256="4dad02a2f9c8c3c8d89434e47337aa654cb0e2aa50e806589132f186bf5c2b66") version("14.1.0", sha256="33c6169596a6bbfdc81415910008f26e0809422fda2d849562637996553b2ab6") version("14.0.3", sha256="f5794364ddfda1e0411ab6cad6dd63abe3a6b421d658d9fee017540ea4c31a0e") version("13.0.0", sha256="0fb17aaf285b3eee8ddab17b833af1e190d73de317ff9648751ab0660d763ed2") version("11.0.2", sha256="0983861279936ada8bc7a6d5d663d590ad34eb44a44c75c2d6ccd0ab33490055") + + depends_on("rust@1.72:", type="build", when="@14:") + + @run_after("install") + def install_completions(self): + rg = Executable(self.prefix.bin.rg) + + mkdirp(bash_completion_path(self.prefix)) + with open(bash_completion_path(self.prefix) / "rg", "w") as file: + rg("--generate", "complete-bash", output=file) + + mkdirp(fish_completion_path(self.prefix)) + with open(fish_completion_path(self.prefix) / "rg.fish", "w") as file: + rg("--generate", "complete-fish", output=file) + + mkdirp(zsh_completion_path(self.prefix)) + with open(zsh_completion_path(self.prefix) / "_rg", "w") as file: + rg("--generate", "complete-zsh", output=file) diff --git a/var/spack/repos/builtin/packages/rkcommon/package.py b/var/spack/repos/builtin/packages/rkcommon/package.py index b50dc13510722b..cbc80a037539ee 100644 --- a/var/spack/repos/builtin/packages/rkcommon/package.py +++ b/var/spack/repos/builtin/packages/rkcommon/package.py @@ -10,12 +10,14 @@ class Rkcommon(CMakePackage): """This project represents a common set of C++ infrastructure and CMake utilities used by various components of Intel® oneAPI Rendering Toolkit.""" - homepage = "https://github.com/ospray/rkcommon" - url = "https://github.com/ospray/rkcommon/archive/v1.4.1.tar.gz" - git = "https://github.com/ospray/rkcommon.git" + homepage = "https://github.com/RenderKit/rkcommon" + url = "https://github.com/RenderKit/rkcommon/archive/v1.4.1.tar.gz" + git = "https://github.com/RenderKit/rkcommon.git" license("Apache-2.0") + version("1.14.2", sha256="79334ef3dadddb03ec0483fbf49bf690fb8902d5c2732d977b2c116651484cc6") + version("1.14.0", sha256="5aef75afc8d4fccf9e70df4cbdf29a1b28b39ee51b5588b94b83a14c6a166d83") version("1.13.0", sha256="8ae9f911420085ceeca36e1f16d1316a77befbf6bf6de2a186d65440ac66ff1f") version("1.12.0", sha256="6abb901073811cdbcbe336772e1fcb458d78cab5ad8d5d61de2b57ab83581e80") version("1.11.0", sha256="9cfeedaccdefbdcf23c465cb1e6c02057100c4a1a573672dc6cfea5348cedfdd") diff --git a/var/spack/repos/builtin/packages/rocal/package.py b/var/spack/repos/builtin/packages/rocal/package.py new file mode 100644 index 00000000000000..84e45834935154 --- /dev/null +++ b/var/spack/repos/builtin/packages/rocal/package.py @@ -0,0 +1,47 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class Rocal(CMakePackage): + """The AMD rocAL is designed to efficiently decode and process images and videos from a variety + of storage formats and modify them through a processing graph programmable by the user.""" + + homepage = "https://github.com/ROCm/rocAL" + url = "https://github.com/ROCm/rocAL/archive/refs/tags/rocm-6.2.0.tar.gz" + + maintainers("afzpatel", "srekolam", "renjithravindrankannath") + + license("MIT") + + version("6.2.1", sha256="77d3e63e02afaee6f1ee1d877d88b48c6ea66a0afca96a1313d0f1c4f8e86b2a") + version("6.2.0", sha256="c7c265375a40d4478a628258378726c252caac424f974456d488fce43890e157") + + depends_on("libjpeg-turbo@2.0.6+partial_decoder") + depends_on("rapidjson") + depends_on("ffmpeg@4.4:") + + for ver in ["6.2.0", "6.2.1"]: + depends_on(f"mivisionx@{ver}", when=f"@{ver}") + depends_on(f"llvm-amdgpu@{ver}", when=f"@{ver}") + depends_on(f"rpp@{ver}", when=f"@{ver}") + + def patch(self): + filter_file( + r"${ROCM_PATH}/llvm/bin/clang++", + "{0}/bin/clang++".format(self.spec["llvm-amdgpu"].prefix), + "rocAL/rocAL_hip/CMakeLists.txt", + string=True, + ) + + def cmake_args(self): + args = [ + self.define("AMDRPP_PATH", self.spec["rpp"].prefix), + self.define("TURBO_JPEG_PATH", self.spec["libjpeg-turbo"].prefix), + self.define("MIVisionX_PATH", self.spec["mivisionx"].prefix), + self.define("CMAKE_INSTALL_PREFIX_PYTHON", self.spec.prefix), + ] + return args diff --git a/var/spack/repos/builtin/packages/rocalution/package.py b/var/spack/repos/builtin/packages/rocalution/package.py index 02f11b33a883c5..229cc402c1d49c 100644 --- a/var/spack/repos/builtin/packages/rocalution/package.py +++ b/var/spack/repos/builtin/packages/rocalution/package.py @@ -26,7 +26,8 @@ class Rocalution(CMakePackage): libraries = ["librocalution_hip"] license("MIT") - + version("6.2.1", sha256="94f15add5316c81529ce84ae8bf2701e9a4df57d08eda04a2f70147d31b12632") + version("6.2.0", sha256="fd9ad0aae5524d3995343d4d7c1948e7b21f0bdf5b1203d1de58548a814a9c39") version("6.1.2", sha256="5f9fb302ab1951a1caf54ed31b41d6f41a353dd4b5ee32bc3de2e9f9244dd4ef") version("6.1.1", sha256="1f80b33813291c2e81e5b1efc325d3f5bb6592c8670c016930d01e73e74ab46b") version("6.1.0", sha256="699a9b73844fcd4e30d0607b4042dc779f9bcdc27ad732e7a038968ff555af2b") @@ -78,6 +79,8 @@ class Rocalution(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"hip@{ver}", when=f"@{ver}") depends_on(f"rocprim@{ver}", when=f"@{ver}") diff --git a/var/spack/repos/builtin/packages/rocblas/package.py b/var/spack/repos/builtin/packages/rocblas/package.py index 5df351eb629bac..066230a5fe7eeb 100644 --- a/var/spack/repos/builtin/packages/rocblas/package.py +++ b/var/spack/repos/builtin/packages/rocblas/package.py @@ -23,6 +23,8 @@ class Rocblas(CMakePackage): version("develop", branch="develop") version("master", branch="master") + version("6.2.1", sha256="cf3bd7b47694f95f387803191615e2ff5c1106175473be7a5b2e8eb6fb99179f") + version("6.2.0", sha256="184e9b39dcbed57c25f351b047d44c613f8a2bbab3314a20c335f024a12ad4e5") version("6.1.2", sha256="1e83918bd7b28ec9ee292c6fb7eb0fc5f4db2d5d831a9a3db541f14a90c20a1a") version("6.1.1", sha256="c920742fb8f45512c360cdb40e37d0ac767f042e52f1981264853dab5ec2c876") version("6.1.0", sha256="af00357909da60d82618038aa9a3cc1f9d4ce1bdfb54db20ec746b592d478edf") @@ -69,9 +71,24 @@ class Rocblas(CMakePackage): depends_on("googletest@1.10.0:", type="test") depends_on("amdblis", type="test") - for ver in ["5.6.0", "5.6.1", "5.7.0", "5.7.1", "6.0.0", "6.0.2", "6.1.0", "6.1.1", "6.1.2"]: + for ver in [ + "5.6.0", + "5.6.1", + "5.7.0", + "5.7.1", + "6.0.0", + "6.0.2", + "6.1.0", + "6.1.1", + "6.1.2", + "6.2.0", + "6.2.1", + ]: depends_on(f"rocm-openmp-extras@{ver}", type="test", when=f"@{ver}") + for ver in ["6.2.0", "6.2.1"]: + depends_on(f"rocm-smi-lib@{ver}", type="test", when=f"@{ver}") + depends_on("rocm-cmake@master", type="build", when="@master:") for ver in [ @@ -90,6 +107,8 @@ class Rocblas(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"hip@{ver}", when=f"@{ver}") depends_on(f"llvm-amdgpu@{ver}", type="build", when=f"@{ver}") @@ -126,6 +145,8 @@ class Rocblas(CMakePackage): ("@6.1.0", "2b55ccf58712f67b3df0ca53b0445f094fcb96b2"), ("@6.1.1", "2b55ccf58712f67b3df0ca53b0445f094fcb96b2"), ("@6.1.2", "2b55ccf58712f67b3df0ca53b0445f094fcb96b2"), + ("@6.2.0", "dbc2062dced66e4cbee8e0591d76e0a1588a4c70"), + ("@6.2.1", "dbc2062dced66e4cbee8e0591d76e0a1588a4c70"), ]: resource( name="Tensile", diff --git a/var/spack/repos/builtin/packages/rocdecode/package.py b/var/spack/repos/builtin/packages/rocdecode/package.py new file mode 100644 index 00000000000000..1f284de531949f --- /dev/null +++ b/var/spack/repos/builtin/packages/rocdecode/package.py @@ -0,0 +1,51 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class Rocdecode(CMakePackage): + """rocDecode is a high performance video decode SDK for AMD hardware""" + + homepage = "https://github.com/ROCm/rocDecode" + git = "https://github.com/ROCm/rocDecode.git" + url = "https://github.com/ROCm/rocDecode/archive/refs/tags/rocm-6.2.0.tar.gz" + + tags = ["rocm"] + + maintainers("afzpatel", "srekolam", "renjithravindrankannath") + + license("MIT") + version("6.2.1", sha256="d4a636415d61fef94f97197cb9ebbff59e3a18dc4850612ee142e3e14a35e6d4") + version("6.2.0", sha256="fe0d7c19a4e65b93405566511880b94f25ef68c830d0088f9458da9baea1d4f9") + version("6.1.2", sha256="67a13aeaa495e06683124de5908e61cf2be3beff79b13d858897344aa809775e") + version("6.1.1", sha256="5914c91e433ec7e8511b8a9017d165a0589c1aff9f5527b413d0b3a32a3cc318") + version("6.1.0", sha256="8316dbde87f1fea782af6216c8d013e866542329a673fb24a668335c6169ef8f") + + amdgpu_targets = ROCmPackage.amdgpu_targets + + variant( + "amdgpu_target", + description="AMD GPU architecture", + values=auto_or_any_combination_of(*amdgpu_targets), + sticky=True, + ) + + for ver in ["6.1.0", "6.1.1", "6.1.2", "6.2.0", "6.2.1"]: + depends_on(f"hip@{ver}", when=f"@{ver}") + + def patch(self): + filter_file( + r"${ROCM_PATH}/llvm/bin/clang++", + "{0}/bin/clang++".format(self.spec["llvm-amdgpu"].prefix), + "CMakeLists.txt", + string=True, + ) + + def cmake_args(self): + args = [] + if "auto" not in self.spec.variants["amdgpu_target"]: + args.append(self.define_from_variant("AMDGPU_TARGETS", "amdgpu_target")) + return args diff --git a/var/spack/repos/builtin/packages/rocfft/package.py b/var/spack/repos/builtin/packages/rocfft/package.py index 39c6f295dba621..d0a23b1094a18b 100644 --- a/var/spack/repos/builtin/packages/rocfft/package.py +++ b/var/spack/repos/builtin/packages/rocfft/package.py @@ -20,6 +20,9 @@ class Rocfft(CMakePackage): libraries = ["librocfft"] license("MIT") + version("master", branch="master") + version("6.2.1", sha256="662d56cbc4c40a82e2f320bfc8e48a571a448e19c04a9ce30d3419b47fcf3574") + version("6.2.0", sha256="c9886ec2c713c502dcde4f5fed3d6e1a7dd019023fb07e82d3b622e66c6f2c36") version("6.1.2", sha256="6f54609b0ecb8ceae8b7acd4c8692514c2c2dbaf0f8b199fe990fd4711428193") version("6.1.1", sha256="d517a931d49a1e59df4e494ab2b68e301fe7ebf39723863985567467f111111c") version("6.1.0", sha256="9e6643174a2b0f376127f43454e78d4feba6fac695d4cda9796da50005ecac66") @@ -86,6 +89,9 @@ class Rocfft(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", + "master", ]: depends_on(f"hip@{ver}", when=f"@{ver}") depends_on(f"rocm-cmake@{ver}:", type="build", when=f"@{ver}") diff --git a/var/spack/repos/builtin/packages/rocm-bandwidth-test/package.py b/var/spack/repos/builtin/packages/rocm-bandwidth-test/package.py index c1e290b669d6fe..6f5a845b0a7145 100644 --- a/var/spack/repos/builtin/packages/rocm-bandwidth-test/package.py +++ b/var/spack/repos/builtin/packages/rocm-bandwidth-test/package.py @@ -18,6 +18,8 @@ class RocmBandwidthTest(CMakePackage): maintainers("srekolam", "renjithravindrankannath") version("master", branch="master") + version("6.2.1", sha256="042cfe3adc0f0ad0b8620e361b2846eb57c7b54837ed7a8c3a773e6fdc4e1af4") + version("6.2.0", sha256="ca4caa4470c7ad0f1a4963072c1a25b0fd243844a72b26c83fcbca1e82091a41") version("6.1.2", sha256="4259d53350d6731613d36c03593750547f84f084569f8017783947486b8189da") version("6.1.1", sha256="01da756228f2bfb5e25ddb74b75a5939693b1b4f4559f37cfc85729e36a98450") version("6.1.0", sha256="b06522efbd1a55247412c8f535321058e2463eab4abd25505c37e8c67941ae26") @@ -55,6 +57,8 @@ class RocmBandwidthTest(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", "master", ]: depends_on(f"hsa-rocr-dev@{ver}", when=f"@{ver}") @@ -72,6 +76,8 @@ class RocmBandwidthTest(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"rocm-core@{ver}", when=f"@{ver}") diff --git a/var/spack/repos/builtin/packages/rocm-cmake/package.py b/var/spack/repos/builtin/packages/rocm-cmake/package.py index 3be1f426ba1398..a540d2c7265797 100644 --- a/var/spack/repos/builtin/packages/rocm-cmake/package.py +++ b/var/spack/repos/builtin/packages/rocm-cmake/package.py @@ -21,6 +21,8 @@ class RocmCmake(CMakePackage): license("MIT") version("master", branch="master") + version("6.2.1", sha256="5ea05ad58186ac9bac40ab083c1e769a36ecaed950f82e88863169a25bc6ac8f") + version("6.2.0", sha256="7b6aaa1bb616669636aa2cd5dbc7fdb7cd05642a8dcc61138e0efb7d0dc7e1a3") version("6.1.2", sha256="0757bb90f25d6f1e6bc93bdd1e238f76bbaddf154d66f94f37e40c425dc6d259") version("6.1.1", sha256="0eb81245f7573a3cadf9e91a854d9a0a014ce93610e4e7ea4d8309867a470bf6") version("6.1.0", sha256="8b37d458e801b486521f12d18ca2103125173dd0f1130d37c8c36e795d34772b") @@ -54,6 +56,8 @@ class RocmCmake(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"rocm-core@{ver}", when=f"@{ver}") diff --git a/var/spack/repos/builtin/packages/rocm-core/package.py b/var/spack/repos/builtin/packages/rocm-core/package.py index fd6f96fe23e6ea..a05f5f8bc12626 100644 --- a/var/spack/repos/builtin/packages/rocm-core/package.py +++ b/var/spack/repos/builtin/packages/rocm-core/package.py @@ -20,6 +20,8 @@ class RocmCore(CMakePackage): libraries = ["librocm-core"] license("MIT") + version("6.2.1", sha256="35cb5f6dfb1847469930bf0fa0913499b6c3f59b2b573a9f598b0956104ba5e2") + version("6.2.0", sha256="9bafaf801721e98b398624c8d2fa78618d297d6800f96113e26c275889205526") version("6.1.2", sha256="ce9cbe12977f2058564ecb4cdcef4fd0d7880f6eff8591630f542441092f4fa3") version("6.1.1", sha256="a27bebdd1ba9d387f33b82a67f64c55cb565b482fe5017d5b5726d68da1ab839") version("6.1.0", sha256="9dfe542d1647c42993b06f594c316dad63ba6d6fb2a7398bd72c5768fd1d7b5b") @@ -40,7 +42,7 @@ class RocmCore(CMakePackage): depends_on("cxx", type="build") # generated - for ver in ["6.1.0", "6.1.1", "6.1.2"]: + for ver in ["6.1.0", "6.1.1", "6.1.2", "6.2.0", "6.2.1"]: depends_on("llvm-amdgpu", when=f"@{ver}+asan") def setup_build_environment(self, env): diff --git a/var/spack/repos/builtin/packages/rocm-dbgapi/package.py b/var/spack/repos/builtin/packages/rocm-dbgapi/package.py index fa5c8503e14fd8..a1b1dfa21bc21d 100644 --- a/var/spack/repos/builtin/packages/rocm-dbgapi/package.py +++ b/var/spack/repos/builtin/packages/rocm-dbgapi/package.py @@ -25,6 +25,8 @@ class RocmDbgapi(CMakePackage): license("MIT") version("master", branch="amd-master") + version("6.2.1", sha256="40064ca031e41ff3c87bfa31406b7192fa65709ab36734eddad87e0ecc01bb80") + version("6.2.0", sha256="311811ce0970ee83206791c21d539f351ddeac56ce3ff7efbefc830038748c0c") version("6.1.2", sha256="6e55839e3d95c2cfe3ff89e3e31da77aeecc74012a17f5308589e8808df78026") version("6.1.1", sha256="425a6cf6a3942c2854c1f5e7717bed906cf6c3753b46c44476f54bfef6188dac") version("6.1.0", sha256="0985405b6fd44667a7ce8914aa39a7e651613e037e649fbdbfa2adcf744a2d50") @@ -68,6 +70,8 @@ class RocmDbgapi(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", "master", ]: depends_on(f"hsa-rocr-dev@{ver}", type="build", when=f"@{ver}") @@ -85,6 +89,8 @@ class RocmDbgapi(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"rocm-core@{ver}", when=f"@{ver}") diff --git a/var/spack/repos/builtin/packages/rocm-debug-agent/package.py b/var/spack/repos/builtin/packages/rocm-debug-agent/package.py index 2cbc7d7f68af5c..9eb080920a8402 100644 --- a/var/spack/repos/builtin/packages/rocm-debug-agent/package.py +++ b/var/spack/repos/builtin/packages/rocm-debug-agent/package.py @@ -18,6 +18,8 @@ class RocmDebugAgent(CMakePackage): maintainers("srekolam", "renjithravindrankannath") libraries = ["librocm-debug-agent"] + version("6.2.1", sha256="933223ff6e0aefb54917f4102ac6679dcd67e25ade4bce5e49f5212f45e3bae5") + version("6.2.0", sha256="a4b839c47b8a1cd8d00c3577eeeea04d3661210eb8124e221d88bcbedc742363") version("6.1.2", sha256="c7cb779915a3d61e39d92cef172997bcf5eae720308f6d9c363a2cbc71b5621c") version("6.1.1", sha256="c631281b346bab9ec3607c59404f548f7cba084a05e9c9ceb3c3579c48361ad1") version("6.1.0", sha256="f52700563e490d662b505693d485272d73521aabff306107586dd1149fb4a70e") @@ -62,6 +64,8 @@ class RocmDebugAgent(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"hsa-rocr-dev@{ver}", when=f"@{ver}") depends_on(f"hsakmt-roct@{ver}", when=f"@{ver}") @@ -79,6 +83,8 @@ class RocmDebugAgent(CMakePackage): "6.0.2", "6.1.0", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"rocm-core@{ver}", when=f"@{ver}") diff --git a/var/spack/repos/builtin/packages/rocm-device-libs/package.py b/var/spack/repos/builtin/packages/rocm-device-libs/package.py index 9e7774d39f4fd1..50923445e6b515 100644 --- a/var/spack/repos/builtin/packages/rocm-device-libs/package.py +++ b/var/spack/repos/builtin/packages/rocm-device-libs/package.py @@ -25,6 +25,8 @@ def url_for_version(self, version): maintainers("srekolam", "renjithravindrankannath", "haampie") version("master", branch="amd-stg-open") + version("6.2.1", sha256="4840f109d8f267c28597e936c869c358de56b8ad6c3ed4881387cf531846e5a7") + version("6.2.0", sha256="12ce17dc920ec6dac0c5484159b3eec00276e4a5b301ab1250488db3b2852200") version("6.1.2", sha256="300e9d6a137dcd91b18d5809a316fddb615e0e7f982dc7ef1bb56876dff6e097") version("6.1.1", sha256="f1a67efb49f76a9b262e9735d3f75ad21e3bd6a05338c9b15c01e6c625c4460d") version("6.1.0", sha256="6bd9912441de6caf6b26d1323e1c899ecd14ff2431874a2f5883d3bc5212db34") @@ -73,6 +75,8 @@ def url_for_version(self, version): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", "master", ]: depends_on(f"llvm-amdgpu@{ver}", when=f"@{ver}") @@ -89,6 +93,8 @@ def url_for_version(self, version): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"rocm-core@{ver}", when=f"@{ver}") diff --git a/var/spack/repos/builtin/packages/rocm-gdb/package.py b/var/spack/repos/builtin/packages/rocm-gdb/package.py index 210b1301032b94..c9ef9eb0ed4699 100644 --- a/var/spack/repos/builtin/packages/rocm-gdb/package.py +++ b/var/spack/repos/builtin/packages/rocm-gdb/package.py @@ -18,6 +18,8 @@ class RocmGdb(AutotoolsPackage): license("LGPL-2.0-or-later") maintainers("srekolam", "renjithravindrankannath") + version("6.2.1", sha256="bed312c3fbb9982166538036bb9fd4a75053117c65ba80e34dbdae629a8fe6e4") + version("6.2.0", sha256="753fd4f34d49fb0297b01dca2dd7cdf12cd039caa622a5f2d153362d27a8659c") version("6.1.2", sha256="19208de18d503e1da79dc0c9085221072a68e299f110dc836204364fa1b532cc") version("6.1.1", sha256="3d982abc130a286d227948aca5783f2e4507ef4275be21dad0914e37217ba19e") version("6.1.0", sha256="e90d855ca4c1478acf143d45ff0811e7ecd068711db155de6d5f3593cdef6230") @@ -67,6 +69,8 @@ class RocmGdb(AutotoolsPackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"rocm-dbgapi@{ver}", type="link", when=f"@{ver}") depends_on(f"comgr@{ver}", type="link", when=f"@{ver}") @@ -83,6 +87,8 @@ class RocmGdb(AutotoolsPackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"rocm-core@{ver}", when=f"@{ver}") diff --git a/var/spack/repos/builtin/packages/rocm-opencl/package.py b/var/spack/repos/builtin/packages/rocm-opencl/package.py index 92d3373effd9b3..44e96863f47797 100644 --- a/var/spack/repos/builtin/packages/rocm-opencl/package.py +++ b/var/spack/repos/builtin/packages/rocm-opencl/package.py @@ -36,6 +36,8 @@ def url_for_version(self, version): license("MIT") version("master", branch="main") + version("6.2.1", sha256="e9cff3a8663defdbda833d49c9e7160171eca14dc285ffe4061378607d6c890d") + version("6.2.0", sha256="620e4c6a7f05651cc7a170bc4700fef8cae002420307a667c638b981d00b25e8") version("6.1.2", sha256="1a1e21640035d957991559723cd093f0c7e202874423667d2ba0c7662b01fea4") version("6.1.1", sha256="2db02f335c9d6fa69befcf7c56278e5cecfe3db0b457eaaa41206c2585ef8256") version("6.1.0", sha256="49b23eef621f4e8e528bb4de8478a17436f42053a2f7fde21ff221aa683205c7") @@ -67,6 +69,7 @@ def url_for_version(self, version): depends_on("numactl", type="link") depends_on("libx11", when="+asan") depends_on("xproto", when="+asan") + depends_on("opencl-icd-loader@2024.05.08", when="@6.2") for d_version, d_shasum in [ ("5.6.1", "cc9a99c7e4de3d9360c0a471b27d626e84a39c9e60e0aff1e8e1500d82391819"), @@ -119,12 +122,14 @@ def url_for_version(self, version): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", "master", ]: depends_on(f"comgr@{ver}", type="build", when=f"@{ver}") depends_on(f"hsa-rocr-dev@{ver}", type="link", when=f"@{ver}") - for ver in ["6.0.0", "6.0.2", "6.1.0", "6.1.1", "6.1.2"]: + for ver in ["6.0.0", "6.0.2", "6.1.0", "6.1.1", "6.1.2", "6.2.0", "6.2.1"]: depends_on(f"aqlprofile@{ver}", type="link", when=f"@{ver}") for ver in [ @@ -139,8 +144,9 @@ def url_for_version(self, version): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: - depends_on(f"rocm-core@{ver}", when=f"@{ver}") @classmethod @@ -169,6 +175,9 @@ def cmake_args(self): f"-I{self.spec['xproto'].prefix.include}", ) ) + if self.spec.satisfies("@6.2:"): + args.append(self.define("BUILD_ICD", False)) + args.append(self.define("AMD_ICD_LIBRARY_DIR", self.spec["opencl-icd-loader"].prefix)) return args diff --git a/var/spack/repos/builtin/packages/rocm-openmp-extras/0001-Avoid-duplicate-registration-on-cuda-env-6.2.patch b/var/spack/repos/builtin/packages/rocm-openmp-extras/0001-Avoid-duplicate-registration-on-cuda-env-6.2.patch new file mode 100644 index 00000000000000..6f7471fd320f99 --- /dev/null +++ b/var/spack/repos/builtin/packages/rocm-openmp-extras/0001-Avoid-duplicate-registration-on-cuda-env-6.2.patch @@ -0,0 +1,13 @@ +diff --git a/rocm-openmp-extras/llvm-project/openmp/libomptarget/plugins-nextgen/cuda/CMakeLists.txt b/rocm-openmp-extras/llvm-project/openmp/libomptarget/plugins-nextgen/cuda/CMakeLists.txt +index f97bba7..86e4155 100644 +--- a/rocm-openmp-extras/llvm-project/openmp/libomptarget/plugins-nextgen/cuda/CMakeLists.txt ++++ b/rocm-openmp-extras/llvm-project/openmp/libomptarget/plugins-nextgen/cuda/CMakeLists.txt +@@ -68,8 +68,6 @@ target_include_directories(omptarget.rtl.cuda PRIVATE ${LIBOMPTARGET_INCLUDE_DIR + option(LIBOMPTARGET_FORCE_NVIDIA_TESTS "Build NVIDIA libomptarget tests" OFF) + if (LIBOMPTARGET_FOUND_NVIDIA_GPU OR LIBOMPTARGET_FORCE_NVIDIA_TESTS) + libomptarget_say("Enable tests using CUDA plugin") +- set(LIBOMPTARGET_SYSTEM_TARGETS +- "${LIBOMPTARGET_SYSTEM_TARGETS} nvptx64-nvidia-cuda nvptx64-nvidia-cuda-LTO" PARENT_SCOPE) + list(APPEND LIBOMPTARGET_TESTED_PLUGINS "omptarget.rtl.cuda") + set(LIBOMPTARGET_TESTED_PLUGINS "${LIBOMPTARGET_TESTED_PLUGINS}" PARENT_SCOPE) + else() diff --git a/var/spack/repos/builtin/packages/rocm-openmp-extras/package.py b/var/spack/repos/builtin/packages/rocm-openmp-extras/package.py index 506a43ec5fe4ea..3586bef851b6e8 100644 --- a/var/spack/repos/builtin/packages/rocm-openmp-extras/package.py +++ b/var/spack/repos/builtin/packages/rocm-openmp-extras/package.py @@ -6,6 +6,7 @@ import os import re +from spack.build_systems.cmake import CMakeBuilder from spack.package import * tools_url = "https://github.com/ROCm" @@ -30,6 +31,8 @@ "832b7c48149a730619b577a2863b8d1bf1b2551eda5b815e1865a044929ab9fa", "62a5036a2299ed2e3053ee00b7ea1800469cd545fea486fa17266a8b3acfaf5d", "3de1c7a31a88c3f05a6a66ba6854ac8fdad1ce44462e561cb1e6ad59629029ce", + "5f54d7c7c798bcf1cd47d3a7f17ceaf79991bf166cc5e47e5372a68e7cf7d520", + "ac82e8da0c210ee14b911c833ae09a029a41541689930759737c135db52464a3", ] devlib = [ @@ -48,6 +51,8 @@ "6bd9912441de6caf6b26d1323e1c899ecd14ff2431874a2f5883d3bc5212db34", "f1a67efb49f76a9b262e9735d3f75ad21e3bd6a05338c9b15c01e6c625c4460d", "300e9d6a137dcd91b18d5809a316fddb615e0e7f982dc7ef1bb56876dff6e097", + "12ce17dc920ec6dac0c5484159b3eec00276e4a5b301ab1250488db3b2852200", + "4840f109d8f267c28597e936c869c358de56b8ad6c3ed4881387cf531846e5a7", ] llvm = [ @@ -66,6 +71,8 @@ "6bd9912441de6caf6b26d1323e1c899ecd14ff2431874a2f5883d3bc5212db34", "f1a67efb49f76a9b262e9735d3f75ad21e3bd6a05338c9b15c01e6c625c4460d", "300e9d6a137dcd91b18d5809a316fddb615e0e7f982dc7ef1bb56876dff6e097", + "12ce17dc920ec6dac0c5484159b3eec00276e4a5b301ab1250488db3b2852200", + "4840f109d8f267c28597e936c869c358de56b8ad6c3ed4881387cf531846e5a7", ] flang = [ @@ -84,6 +91,8 @@ "51ecd2c154568c971f5b46ff0e1e1b57063afe28d128fc88c503de88f7240267", "1bcaa73e73a688cb092f01987cf3ec9ace4aa1fcaab2b812888c610722c4501d", "12418ea61cca58811b7e75fd9df48be568b406f84a489a41ba5a1fd70c47f7ba", + "6af7785b1776aeb9229ce4e5083dcfd451e8450f6e5ebe34214560b13f679d96", + "409ee98bf15e51ac68b7ed351f4582930dfa0288de042006e17eea6b64df5ad6", ] extras = [ @@ -102,6 +111,8 @@ "57d6d9d26c0cb6ea7f8373996c41165f463ae7936d32e5793822cfae03900f8f", "3dc837fbfcac64e000e1b5518e4f8a6b260eaf1a3e74152d8b8c22f128f575b7", "2b9351fdb1cba229669233919464ae906ca8f70910c6fa508a2812b7c3bed123", + "7cef51c980f29d8b46d8d4b110e4f2f75d93544cf7d63c5e5d158cf531aeec7d", + "4b0d250b5ebd997ed6d5d057689c3f67dfb4d82f09f582ebb439ca9134fae48d", ] versions = [ @@ -120,6 +131,8 @@ "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ] versions_dict = dict() # type: Dict[str,Dict[str,str]] components = ["aomp", "devlib", "llvm", "flang", "extras"] @@ -143,6 +156,8 @@ class RocmOpenmpExtras(Package): license("Apache-2.0") maintainers("srekolam", "renjithravindrankannath", "estewart08") + version("6.2.1", sha256=versions_dict["6.2.1"]["aomp"]) + version("6.2.0", sha256=versions_dict["6.2.0"]["aomp"]) version("6.1.2", sha256=versions_dict["6.1.2"]["aomp"]) version("6.1.1", sha256=versions_dict["6.1.1"]["aomp"]) version("6.1.0", sha256=versions_dict["6.1.0"]["aomp"]) @@ -187,6 +202,8 @@ class RocmOpenmpExtras(Package): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"rocm-core@{ver}", when=f"@{ver}") @@ -247,7 +264,7 @@ class RocmOpenmpExtras(Package): placement="llvm-project", when=f"@{ver}", ) - for ver in ["6.1.0", "6.1.1", "6.1.2"]: + for ver in ["6.1.0", "6.1.1", "6.1.2", "6.2.0", "6.2.1"]: depends_on(f"hsakmt-roct@{ver}", when=f"@{ver}") depends_on(f"comgr@{ver}", when=f"@{ver}") depends_on(f"hsa-rocr-dev@{ver}", when=f"@{ver}") @@ -288,7 +305,8 @@ class RocmOpenmpExtras(Package): working_dir="rocm-openmp-extras/llvm-project/openmp/libomptarget", when="@6.1", ) - patch("0001-Avoid-duplicate-registration-on-cuda-env.patch", when="@6.1:") + patch("0001-Avoid-duplicate-registration-on-cuda-env.patch", when="@6.1") + patch("0001-Avoid-duplicate-registration-on-cuda-env-6.2.patch", when="@6.2") def setup_run_environment(self, env): devlibs_prefix = self.spec["llvm-amdgpu"].prefix @@ -364,75 +382,71 @@ def patch(self): "", libomptarget.format(src) + "/cmake/Modules/LibomptargetGetDependencies.cmake", ) + if self.spec.satisfies("@:6.1"): + filter_file( + r"{OPENMP_INSTALL_LIBDIR}", + "{OPENMP_INSTALL_LIBDIR}/libdevice", + libomptarget.format(src) + "/deviceRTLs/amdgcn/CMakeLists.txt", + ) + filter_file( + "-nogpulib", + "-nogpulib -nogpuinc", + libomptarget.format(src) + "/deviceRTLs/amdgcn/CMakeLists.txt", + ) + filter_file( + "-x hip", + "-x hip -nogpulib -nogpuinc", + libomptarget.format(src) + "/deviceRTLs/amdgcn/CMakeLists.txt", + ) + filter_file( + "-c ", + "-c -nogpulib -nogpuinc -I{LIMIT}", + libomptarget.format(src) + "/hostrpc/CMakeLists.txt", + ) + filter_file( + r"${ROCM_DIR}/hsa/include ${ROCM_DIR}/hsa/include/hsa", + "${HSA_INCLUDE}/hsa/include ${HSA_INCLUDE}/hsa/include/hsa", + libomptarget.format(src) + plugin, + string=True, + ) - filter_file( - r"{OPENMP_INSTALL_LIBDIR}", - "{OPENMP_INSTALL_LIBDIR}/libdevice", - libomptarget.format(src) + "/deviceRTLs/amdgcn/CMakeLists.txt", - ) - - filter_file( - "-nogpulib", - "-nogpulib -nogpuinc", - libomptarget.format(src) + "/deviceRTLs/amdgcn/CMakeLists.txt", - ) - - filter_file( - "-x hip", - "-x hip -nogpulib -nogpuinc", - libomptarget.format(src) + "/deviceRTLs/amdgcn/CMakeLists.txt", - ) - - filter_file( - "-c ", - "-c -nogpulib -nogpuinc -I{LIMIT}", - libomptarget.format(src) + "/hostrpc/CMakeLists.txt", - ) - - filter_file( - r"${ROCM_DIR}/hsa/include ${ROCM_DIR}/hsa/include/hsa", - "${HSA_INCLUDE}/hsa/include ${HSA_INCLUDE}/hsa/include/hsa", - libomptarget.format(src) + plugin, - string=True, - ) - - filter_file("{ROCM_DIR}/hsa/lib", "{HSA_LIB}", libomptarget.format(src) + plugin) + filter_file("{ROCM_DIR}/hsa/lib", "{HSA_LIB}", libomptarget.format(src) + plugin) - filter_file( - r"{ROCM_DIR}/lib\)", - "{HSAKMT_LIB})\nset(HSAKMT_LIB64 ${HSAKMT_LIB64})", - libomptarget.format(src) + plugin, - ) + filter_file( + r"{ROCM_DIR}/lib\)", + "{HSAKMT_LIB})\nset(HSAKMT_LIB64 ${HSAKMT_LIB64})", + libomptarget.format(src) + plugin, + ) - filter_file( - r"-L${LIBOMPTARGET_DEP_LIBHSAKMT_LIBRARIES_DIRS}", - "-L${LIBOMPTARGET_DEP_LIBHSAKMT_LIBRARIES_DIRS} -L${HSAKMT_LIB64}", - libomptarget.format(src) + plugin, - string=True, - ) + filter_file( + r"-L${LIBOMPTARGET_DEP_LIBHSAKMT_LIBRARIES_DIRS}", + "-L${LIBOMPTARGET_DEP_LIBHSAKMT_LIBRARIES_DIRS} -L${HSAKMT_LIB64}", + libomptarget.format(src) + plugin, + string=True, + ) - filter_file( - r"-rpath,${LIBOMPTARGET_DEP_LIBHSAKMT_LIBRARIES_DIRS}", - "-rpath,${LIBOMPTARGET_DEP_LIBHSAKMT_LIBRARIES_DIRS}" + ",-rpath,${HSAKMT_LIB64}", - libomptarget.format(src) + plugin, - string=True, - ) + filter_file( + r"-rpath,${LIBOMPTARGET_DEP_LIBHSAKMT_LIBRARIES_DIRS}", + "-rpath,${LIBOMPTARGET_DEP_LIBHSAKMT_LIBRARIES_DIRS}" + ",-rpath,${HSAKMT_LIB64}", + libomptarget.format(src) + plugin, + string=True, + ) - filter_file("{ROCM_DIR}/include", "{COMGR_INCLUDE}", libomptarget.format(src) + plugin) + filter_file("{ROCM_DIR}/include", "{COMGR_INCLUDE}", libomptarget.format(src) + plugin) - filter_file( - r"-L${LLVM_LIBDIR}${OPENMP_LIBDIR_SUFFIX}", - "-L${LLVM_LIBDIR}${OPENMP_LIBDIR_SUFFIX} -L${COMGR_LIB}", - libomptarget.format(src) + plugin, - string=True, - ) + filter_file( + r"-L${LLVM_LIBDIR}${OPENMP_LIBDIR_SUFFIX}", + "-L${LLVM_LIBDIR}${OPENMP_LIBDIR_SUFFIX} -L${COMGR_LIB}", + libomptarget.format(src) + plugin, + string=True, + ) - filter_file( - r"rpath,${LLVM_LIBDIR}${OPENMP_LIBDIR_SUFFIX}", - "rpath,${LLVM_LIBDIR}${OPENMP_LIBDIR_SUFFIX}" + "-Wl,-rpath,${COMGR_LIB}", - libomptarget.format(src) + plugin, - string=True, - ) + filter_file( + r"rpath,${LLVM_LIBDIR}${OPENMP_LIBDIR_SUFFIX}", + "rpath,${LLVM_LIBDIR}${OPENMP_LIBDIR_SUFFIX}" + "-Wl,-rpath,${COMGR_LIB}", + libomptarget.format(src) + plugin, + string=True, + ) filter_file( "ADDITIONAL_VERSIONS 2.7", @@ -473,6 +487,8 @@ def install(self, spec, prefix): libpgmath = "/rocm-openmp-extras/flang/runtime/libpgmath/lib/common" elfutils_inc = spec["elfutils"].prefix.include ffi_inc = spec["libffi"].prefix.include + if self.spec.satisfies("@6.2:"): + ncurses_lib_dir = self.spec["ncurses"].prefix.lib # flang1 and flang2 symlink needed for build of flang-runtime # libdevice symlink to rocm-openmp-extras for runtime @@ -481,6 +497,9 @@ def install(self, spec, prefix): os.unlink(os.path.join(bin_dir, "flang1")) if os.path.islink((os.path.join(bin_dir, "flang2"))): os.unlink(os.path.join(bin_dir, "flang2")) + if self.spec.version >= Version("6.1.0"): + if os.path.islink((os.path.join(bin_dir, "flang-legacy"))): + os.unlink(os.path.join(bin_dir, "flang-legacy")) if os.path.islink((os.path.join(lib_dir, "libdevice"))): os.unlink(os.path.join(lib_dir, "libdevice")) if os.path.islink((os.path.join(llvm_prefix, "lib-debug"))): @@ -488,6 +507,11 @@ def install(self, spec, prefix): os.symlink(os.path.join(omp_bin_dir, "flang1"), os.path.join(bin_dir, "flang1")) os.symlink(os.path.join(omp_bin_dir, "flang2"), os.path.join(bin_dir, "flang2")) + + if self.spec.version >= Version("6.1.0"): + os.symlink( + os.path.join(omp_bin_dir, "flang-legacy"), os.path.join(bin_dir, "flang-legacy") + ) os.symlink(os.path.join(omp_lib_dir, "libdevice"), os.path.join(lib_dir, "libdevice")) os.symlink( os.path.join(openmp_extras_prefix, "lib-debug"), os.path.join(llvm_prefix, "lib-debug") @@ -579,6 +603,48 @@ def install(self, spec, prefix): components["pgmath"] += flang_common_args + flang_legacy_version = "17.0-4" + + components["flang-legacy-llvm"] = [ + "-DLLVM_ENABLE_PROJECTS=clang", + "-DCMAKE_BUILD_TYPE=Release", + "-DLLVM_ENABLE_ASSERTIONS=ON", + "-DLLVM_TARGETS_TO_BUILD=AMDGPU;X86", + "-DCLANG_DEFAULT_LINKER=lld", + "-DLLVM_INCLUDE_BENCHMARKS=0", + "-DLLVM_INCLUDE_RUNTIMES=0", + "-DLLVM_INCLUDE_EXAMPLES=0", + "-DLLVM_INCLUDE_TESTS=0", + "-DLLVM_INCLUDE_DOCS=0", + "-DLLVM_INCLUDE_UTILS=0", + "-DCLANG_DEFAULT_PIE_ON_LINUX=0", + "../../rocm-openmp-extras/flang/flang-legacy/{0}/llvm-legacy/llvm".format( + flang_legacy_version + ), + ] + + components["flang-legacy"] = [ + "-DCMAKE_C_COMPILER={0}/clang".format(bin_dir), + "-DCMAKE_CXX_COMPILER={0}/clang++".format(bin_dir), + "../rocm-openmp-extras/flang/flang-legacy/{0}".format(flang_legacy_version), + ] + + flang_legacy_flags = [] + if ( + self.compiler.name == "gcc" + and self.compiler.version >= Version("7.0.0") + and self.compiler.version < Version("9.0.0") + ): + flang_legacy_flags.append("-D_GLIBCXX_USE_CXX11_ABI=0") + if self.spec.satisfies("@6.2:"): + flang_legacy_flags.append("-L{0}".format(ncurses_lib_dir)) + components["flang-legacy-llvm"] += [ + "-DCMAKE_CXX_FLAGS={0}".format(",".join(flang_legacy_flags)) + ] + components["flang-legacy"] += [ + "-DCMAKE_CXX_FLAGS={0}".format(",".join(flang_legacy_flags)) + ] + components["flang"] = [ "../rocm-openmp-extras/flang", "-DFLANG_OPENMP_GPU_AMD=ON", @@ -595,22 +661,39 @@ def install(self, spec, prefix): ] components["flang-runtime"] += flang_common_args - build_order = ["aomp-extras", "openmp", "openmp-debug", "pgmath", "flang", "flang-runtime"] + build_order = ["aomp-extras", "openmp"] + if self.spec.version >= Version("6.1.0"): + build_order += ["flang-legacy-llvm", "flang-legacy"] + build_order += ["pgmath", "flang", "flang-runtime"] # Override standard CMAKE_BUILD_TYPE + std_cmake_args = CMakeBuilder.std_args(self, generator="Unix Makefiles") for arg in std_cmake_args: found = re.search("CMAKE_BUILD_TYPE", arg) if found: std_cmake_args.remove(arg) for component in build_order: - with working_dir("spack-build-{0}".format(component), create=True): - cmake_args = components[component] - cmake_args.extend(std_cmake_args) - # OpenMP build needs to be run twice(Release, Debug) - if component == "openmp-debug": - cmake_args.append("-DCMAKE_BUILD_TYPE=Debug") - else: + cmake_args = components[component] + cmake_args.extend(std_cmake_args) + if component == "flang-legacy-llvm": + with working_dir("spack-build-{0}/llvm-legacy".format(component), create=True): + cmake_args.append("-DCMAKE_BUILD_TYPE=Release") + cmake(*cmake_args) + make() + elif component == "flang-legacy": + with working_dir("spack-build-flang-legacy-llvm"): cmake_args.append("-DCMAKE_BUILD_TYPE=Release") - cmake(*cmake_args) - make() - make("install") + cmake(*cmake_args) + make() + make("install") + os.symlink(os.path.join(bin_dir, "clang"), os.path.join(omp_bin_dir, "clang")) + else: + with working_dir("spack-build-{0}".format(component), create=True): + # OpenMP build needs to be run twice(Release, Debug) + if component == "openmp-debug": + cmake_args.append("-DCMAKE_BUILD_TYPE=Debug") + else: + cmake_args.append("-DCMAKE_BUILD_TYPE=Release") + cmake(*cmake_args) + make() + make("install") diff --git a/var/spack/repos/builtin/packages/rocm-smi-lib/package.py b/var/spack/repos/builtin/packages/rocm-smi-lib/package.py index 0675f774b58f1f..9521ab6c5139f2 100644 --- a/var/spack/repos/builtin/packages/rocm-smi-lib/package.py +++ b/var/spack/repos/builtin/packages/rocm-smi-lib/package.py @@ -24,6 +24,8 @@ class RocmSmiLib(CMakePackage): libraries = ["librocm_smi64"] version("master", branch="master") + version("6.2.1", sha256="28543d099fa44b4b79644533644aba4b67fa48d477628dd5802c3b50cc78583a") + version("6.2.0", sha256="95010dfc9de9c608b9ce159107585ff4adce82a52a38daab2a37870aca2428bf") version("6.1.2", sha256="01f46fb1cb8c7a16a4c4db61871ee710ed37c0f8bd3a2dbe3415d3de2dffb4ef") version("6.1.1", sha256="7fd2234b05eb6b9397c5508bb37e81fb16ce2cadc2c97298b2124b46c3687880") version("6.1.0", sha256="d1a1b372489b27cb7eb8c91d74a71370ad9668dd5aaf89c0267172534e417e41") @@ -62,6 +64,8 @@ class RocmSmiLib(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"rocm-core@{ver}", when=f"@{ver}") diff --git a/var/spack/repos/builtin/packages/rocm-tensile/package.py b/var/spack/repos/builtin/packages/rocm-tensile/package.py index 9894d524b3fa62..de9da28b89764f 100644 --- a/var/spack/repos/builtin/packages/rocm-tensile/package.py +++ b/var/spack/repos/builtin/packages/rocm-tensile/package.py @@ -19,6 +19,7 @@ class RocmTensile(CMakePackage): license("MIT") maintainers("srekolam", "renjithravindrankannath", "haampie") + version("6.2.0", sha256="6f7d679bfffd1f723f2788b00fdcb1b4673b597f9f85c2cdaab3c2aa17afb33d") version("6.1.2", sha256="6a08190f6d9c8cc76764a68e2dd3e7af4759d4146ddc1c4b3370c7762a6f6d83") version("6.1.1", sha256="04fd76e6a0e9b7528e61df0721b03c0e977c145a2a1ea331d515c9167d7ac35f") version("6.1.0", sha256="69bfdc711d3a86e6651b1dcfb2c461c7d3ae574e6d884833d4e07d3e7ad06491") @@ -78,6 +79,7 @@ class RocmTensile(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", ]: depends_on(f"rocm-cmake@{ver}", type="build", when=f"@{ver}") depends_on(f"hip@{ver}", when=f"@{ver}") diff --git a/var/spack/repos/builtin/packages/rocm-validation-suite/package.py b/var/spack/repos/builtin/packages/rocm-validation-suite/package.py index b686e1b3bc3d6a..f3b06fefcd19b8 100644 --- a/var/spack/repos/builtin/packages/rocm-validation-suite/package.py +++ b/var/spack/repos/builtin/packages/rocm-validation-suite/package.py @@ -22,6 +22,8 @@ class RocmValidationSuite(CMakePackage): license("MIT") maintainers("srekolam", "renjithravindrankannath") + version("6.2.1", sha256="7e1f4f391a5b31087585b250136f3a8c1fdf4c609880499575291c61b3ebbc15") + version("6.2.0", sha256="03913a1aae426b9fbb7a4870f408a3af1b8b7d32766515eaccb43107673fe631") version("6.1.2", sha256="8ff0c4ec538841d6b8d008d3849a99173cc5a02df5cf4a11dc1d52f630e079c5") version("6.1.1", sha256="72d1a40bce5b68f7d5959e10c07576234640b9c9fcb24d6301a76336629d9962") version("6.1.0", sha256="712f49bfe3a62c9f9cc6f9dc1c593b57e0b45158bb270d685d1141c9a9e90387") @@ -83,11 +85,15 @@ def setup_build_environment(self, build_env): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"hip@{ver}", when=f"@{ver}") depends_on(f"rocminfo@{ver}", when=f"@{ver}") depends_on(f"rocblas@{ver}", when=f"@{ver}") depends_on(f"rocm-smi-lib@{ver}", when=f"@{ver}") + depends_on(f"hsa-rocr-dev@{ver}", when=f"@{ver}") + depends_on(f"hsakmt-roct@{ver}", when=f"@{ver}") def patch(self): if self.spec.satisfies("@5.2:5.4"): @@ -125,4 +131,20 @@ def cmake_args(self): if not os.path.isdir(libloc): libloc = self.spec["yaml-cpp"].prefix.lib args.append(self.define("YAML_CPP_LIB_PATH", libloc)) + if self.spec.satisfies("@6.2:"): + args.append( + self.define( + "CMAKE_CXX_FLAGS", + f"-I{self.spec['rocm-smi-lib'].prefix.include} " + f"-I{self.spec['rocblas'].prefix.include} " + f"-I{self.spec['yaml-cpp'].prefix.include} " + f"-L{self.spec['hip'].prefix.lib} " + f"-L{self.spec['hsa-rocr-dev'].prefix.lib} " + f"-L{self.spec['hsakmt-roct'].prefix.lib} " + f"-L{self.spec['rocm-smi-lib'].prefix.lib} " + f"-L{self.spec['rocblas'].prefix.lib} " + f"{libloc}/libyaml-cpp.a ", + ) + ) + args.append(self.define("CPACK_PACKAGING_INSTALL_PREFIX", self.spec.prefix)) return args diff --git a/var/spack/repos/builtin/packages/rocminfo/package.py b/var/spack/repos/builtin/packages/rocminfo/package.py index f8fcc531707f48..e8d09f88121d1c 100644 --- a/var/spack/repos/builtin/packages/rocminfo/package.py +++ b/var/spack/repos/builtin/packages/rocminfo/package.py @@ -18,6 +18,8 @@ class Rocminfo(CMakePackage): maintainers("srekolam", "renjithravindrankannath", "haampie") version("master", branch="master") + version("6.2.1", sha256="ae6e08962535e76a81ed872cbd6bf6860c46fa6e4e4bc8f7849c8781359798d8") + version("6.2.0", sha256="4d9a9051bda3355f8d2050e981435cd02528a04264a7f61162d685e7e1629f73") version("6.1.2", sha256="882ebe3db60b6290a81a98e0bac9b8923fbf83966f1706fd24484700b8213bcc") version("6.1.1", sha256="ef5e33ad3d0bae462d01e1528ffa9c83c587ccbf7ef5947e096e550480d83819") version("6.1.0", sha256="973352210fdc65932f0125e2db68729383727eaf4ebb7f52c88a948c14bbbb73") @@ -55,6 +57,8 @@ class Rocminfo(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", "master", ]: depends_on(f"hsakmt-roct@{ver}", when=f"@{ver}") @@ -72,6 +76,8 @@ class Rocminfo(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"rocm-core@{ver}", when=f"@{ver}") diff --git a/var/spack/repos/builtin/packages/rocmlir/package.py b/var/spack/repos/builtin/packages/rocmlir/package.py index 67f40176bb47cc..9167e316c88422 100644 --- a/var/spack/repos/builtin/packages/rocmlir/package.py +++ b/var/spack/repos/builtin/packages/rocmlir/package.py @@ -14,10 +14,12 @@ class Rocmlir(CMakePackage): homepage = "https://github.com/ROCm/rocMLIR" git = "https://github.com/ROCm/rocMLIR.git" - url = "https://github.com/ROCm/rocMLIR/archive/refs/tags/rocm-6.1.2.tar.gz" + url = "https://github.com/ROCm/rocMLIR/archive/refs/tags/rocm-6.2.1.tar.gz" maintainers("srekolam", "afzpatel", "renjithravindrankannath") + version("6.2.1", sha256="eff594c6b6b97ac21bf268da49fcd016584cfe28c8ff64b0a20b8a9144dca683") + version("6.2.0", sha256="889e021edab19657947716e0056176ca0298602a21c4b77e7e7b00467fdaa175") version("6.1.2", sha256="9bde02b898896301a30e7007e384b9de9cf8feac04f44c91a3b625e74788fda6") version("6.1.1", sha256="0847fd2325fb287538442cf09daf7fa76e7926a40eafd27049e0b5320371c1b5") version("6.1.0", sha256="dd800783f1ce66ce7c560d5193d053ddf3797abae5ec9375c9842243f5a8ca0b") @@ -69,8 +71,9 @@ def patch(self): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: - depends_on(f"hip@{ver}", when=f"@{ver}") depends_on(f"llvm-amdgpu@{ver}", when=f"@{ver}") depends_on(f"hsa-rocr-dev@{ver}", when=f"@{ver}") diff --git a/var/spack/repos/builtin/packages/rocprim/package.py b/var/spack/repos/builtin/packages/rocprim/package.py index dd4f2d9cd7e431..50241aac483848 100644 --- a/var/spack/repos/builtin/packages/rocprim/package.py +++ b/var/spack/repos/builtin/packages/rocprim/package.py @@ -17,6 +17,8 @@ class Rocprim(CMakePackage): license("MIT") maintainers("cgmb", "srekolam", "renjithravindrankannath") + version("6.2.1", sha256="55cfa8a4224bcd2dcf2298e7938c983a8bb0c1c072fc8295c198e53785b521ac") + version("6.2.0", sha256="cd9be3a030830c96c940dc69e4a00f2701539a7e10b62ab1181ab83eeef31e57") version("6.1.2", sha256="560b65fffb103c11bee710e4eb871fd47dd84dfe99f5762a19c5650e490fd85d") version("6.1.1", sha256="94b265b6b4ed366b0ba008ef77ab6623b7b880b45874f202c887f01b67905922") version("6.1.0", sha256="9f02e5f8be90baa679a28f83927495ddf0e17d684536e1f820021e8c3e8e6c84") @@ -70,6 +72,8 @@ class Rocprim(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"hip@{ver}", when=f"@{ver}") depends_on(f"comgr@{ver}", when=f"@{ver}") diff --git a/var/spack/repos/builtin/packages/rocprofiler-dev/package.py b/var/spack/repos/builtin/packages/rocprofiler-dev/package.py index 35702f97be9625..590c34adf64fc2 100644 --- a/var/spack/repos/builtin/packages/rocprofiler-dev/package.py +++ b/var/spack/repos/builtin/packages/rocprofiler-dev/package.py @@ -19,6 +19,8 @@ class RocprofilerDev(CMakePackage): maintainers("srekolam", "renjithravindrankannath") libraries = ["librocprofiler64"] license("MIT") + version("6.2.1", sha256="6eb36dad67e3b294f210e21987c52aec666652cffa87b8af1f8077d5b7812245") + version("6.2.0", sha256="79b4f29d051e62639b4bf2ca288035514d32e055fc759ff4a82d377bf7ca97ea") version("6.1.2", sha256="e6e8771b8c933c16a99192cc215fe964a95e1718ad286520c8272150e184bc06") version("6.1.1", sha256="b4b01a02de5328c7383c2318a998da86a6a9372e1728fc88a21b52bc1cbe9d9d") version("6.1.0", sha256="14ac0a451428465133583e83d9177ed34b3d4679515018a12ee74f5e0288c956") @@ -57,13 +59,15 @@ class RocprofilerDev(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"hsakmt-roct@{ver}", when=f"@{ver}") depends_on(f"hsa-rocr-dev@{ver}", when=f"@{ver}") depends_on(f"rocminfo@{ver}", when=f"@{ver}") depends_on(f"roctracer-dev-api@{ver}", when=f"@{ver}") - for ver in ["5.7.0", "5.7.1", "6.0.0", "6.0.2", "6.1.0", "6.1.1", "6.1.2"]: + for ver in ["5.7.0", "5.7.1", "6.0.0", "6.0.2", "6.1.0", "6.1.1", "6.1.2", "6.2.0", "6.2.1"]: depends_on(f"hip@{ver}", when=f"@{ver}") depends_on(f"rocm-smi-lib@{ver}", when=f"@{ver}") @@ -79,6 +83,8 @@ class RocprofilerDev(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"aqlprofile@{ver}", when=f"@{ver}") depends_on(f"comgr@{ver}", when=f"@{ver}") @@ -122,13 +128,16 @@ def determine_version(cls, lib): return None def cmake_args(self): - return [ + args = [ self.define( "PROF_API_HEADER_PATH", self.spec["roctracer-dev-api"].prefix.roctracer.include.ext ), self.define("ROCM_ROOT_DIR", self.spec["hsakmt-roct"].prefix.include), self.define("CMAKE_INSTALL_LIBDIR", "lib"), ] + if self.spec.satisfies("@6.2:"): + args.append(self.define("ROCPROFILER_BUILD_PLUGIN_PERFETTO", "OFF")) + return args @run_after("install") def post_install(self): diff --git a/var/spack/repos/builtin/packages/rocprofiler-register/001-add-cpack-fmt-glog.patch b/var/spack/repos/builtin/packages/rocprofiler-register/001-add-cpack-fmt-glog.patch new file mode 100644 index 00000000000000..d7b758c3e82f07 --- /dev/null +++ b/var/spack/repos/builtin/packages/rocprofiler-register/001-add-cpack-fmt-glog.patch @@ -0,0 +1,38 @@ +From 6eb75bd029d17dbe53a6470ca357b2721ba9d87e Mon Sep 17 00:00:00 2001 +From: Afzal Patel +Date: Mon, 12 Aug 2024 20:43:05 +0000 +Subject: [PATCH] add CPack include and find glog and fmt + +--- + cmake/rocprofiler_register_config_packaging.cmake | 1 + + source/lib/rocprofiler-register/CMakeLists.txt | 3 ++- + 2 files changed, 3 insertions(+), 1 deletion(-) + +diff --git a/cmake/rocprofiler_register_config_packaging.cmake b/cmake/rocprofiler_register_config_packaging.cmake +index 5e98f3e..88c4155 100644 +--- a/cmake/rocprofiler_register_config_packaging.cmake ++++ b/cmake/rocprofiler_register_config_packaging.cmake +@@ -81,6 +81,7 @@ foreach(COMPONENT_GROUP ${ROCPROFILER_REGISTER_COMPONENT_GROUPS}) + set(_NAME "${COMPONENT_NAME_${COMPONENT_GROUP}}") + set(_DESC "${COMPONENT_DESC_${COMPONENT_GROUP}}") + ++ include(CPack) + cpack_add_component_group( + ${COMPONENT_GROUP} + DISPLAY_NAME "${_NAME}" +diff --git a/source/lib/rocprofiler-register/CMakeLists.txt b/source/lib/rocprofiler-register/CMakeLists.txt +index 840fbed..4e30a3f 100644 +--- a/source/lib/rocprofiler-register/CMakeLists.txt ++++ b/source/lib/rocprofiler-register/CMakeLists.txt +@@ -16,7 +16,8 @@ endif() + target_include_directories( + rocprofiler-register PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}/source + ${PROJECT_BINARY_DIR}/source) +- ++find_package(fmt CONFIG REQUIRED) ++find_package(glog CONFIG REQUIRED) + target_link_libraries( + rocprofiler-register + PUBLIC rocprofiler-register::headers +-- +2.43.5 diff --git a/var/spack/repos/builtin/packages/rocprofiler-register/package.py b/var/spack/repos/builtin/packages/rocprofiler-register/package.py new file mode 100644 index 00000000000000..38471a1605f515 --- /dev/null +++ b/var/spack/repos/builtin/packages/rocprofiler-register/package.py @@ -0,0 +1,38 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class RocprofilerRegister(CMakePackage): + """The rocprofiler-register library is a helper library that coordinates + the modification of the intercept API table(s) of the HSA/HIP/ROCTx runtime + libraries by the ROCprofiler (v2) library""" + + homepage = "https://github.com/ROCm/rocprofiler-register" + git = "https://github.com/ROCm/rocprofiler-register.git" + url = "https://github.com/ROCm/rocprofiler-register/archive/refs/tags/rocm-6.2.0.tar.gz" + + tags = ["rocm"] + + maintainers("afzpatel", "srekolam", "renjithravindrankannath") + + license("MIT") + version("6.2.1", sha256="161d3502863147df4daeadc538d0eb156c314c94634f8c34ee5994f046f8753f") + version("6.2.0", sha256="5cdfdfc621da9ef5a6b828d1a3a342db222b648c91359f71651b9404bf7ba62c") + version("6.1.2", sha256="aa57b234cc1db5ae32c7494f4a9120b95a1845b95469dad447f470a6aa5e3cc9") + version("6.1.1", sha256="38242443d9147a04d61374de4cecee686578a3140fed17e88480f564a1f67cc7") + version("6.1.0", sha256="c6e60447ea2ccca8d6acd8758ac00037347892b16b450e1f99ddd04cc4b6cac1") + + depends_on("cxx", type="build") + depends_on("fmt") + depends_on("glog") + + patch("001-add-cpack-fmt-glog.patch") + + def cmake_args(self): + args = ["-DROCPROFILER_REGISTER_BUILD_FMT=OFF", "-DROCPROFILER_REGISTER_BUILD_GLOG=OFF"] + args.append(self.define("ROCPROFILER_REGISTER_BUILD_TESTS", self.run_tests)) + return args diff --git a/var/spack/repos/builtin/packages/rocpydecode/package.py b/var/spack/repos/builtin/packages/rocpydecode/package.py new file mode 100644 index 00000000000000..c8bff2f24d4f7f --- /dev/null +++ b/var/spack/repos/builtin/packages/rocpydecode/package.py @@ -0,0 +1,49 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class Rocpydecode(CMakePackage): + """rocPyDecode is a set of Python bindings to rocDecode C++ library which provides + full HW acceleration for video decoding on AMD GPUs.""" + + homepage = "https://github.com/ROCm/rocPyDecode" + url = "https://github.com/ROCm/rocPyDecode/archive/refs/tags/rocm-6.2.0.tar.gz" + + maintainers("afzpatel", "srekolam", "renjithravindrankannath") + + version("6.2.1", sha256="34c595cfe40ad74fcec2f52e7cc7be3ad8c8334030b0e98eb36305b6f63edc0d") + version("6.2.0", sha256="e465254cd3e96bbb59208e90293d7c6b7744b0fbcd928ef278ec568c83e63ff3") + + depends_on("py-pybind11") + depends_on("ffmpeg@4.4:5") + depends_on("dlpack") + + for ver in ["6.2.0", "6.2.1"]: + depends_on(f"rocdecode@{ver}", when=f"@{ver}") + + def patch(self): + filter_file( + r"${ROCM_PATH}/llvm/bin/clang++", + "{0}/bin/clang++".format(self.spec["llvm-amdgpu"].prefix), + "CMakeLists.txt", + string=True, + ) + filter_file( + r"${ROCM_PATH}/share/rocdecode/utils", + "{0}/share/rocdecode/utils".format(self.spec["rocdecode"].prefix), + "CMakeLists.txt", + string=True, + ) + + def cmake_args(self): + args = [ + self.define("rocDecode_PATH", self.spec["rocdecode"].prefix), + self.define("FFMPEG_INCLUDE_DIR", self.spec["ffmpeg"].prefix.include), + self.define("CMAKE_INSTALL_PREFIX_PYTHON", self.spec.prefix), + self.define("CMAKE_CXX_FLAGS", "-I{0}".format(self.spec["dlpack"].prefix.include)), + ] + return args diff --git a/var/spack/repos/builtin/packages/rocrand/package.py b/var/spack/repos/builtin/packages/rocrand/package.py index 482d922d1233ed..7f99844408e122 100644 --- a/var/spack/repos/builtin/packages/rocrand/package.py +++ b/var/spack/repos/builtin/packages/rocrand/package.py @@ -25,6 +25,8 @@ class Rocrand(CMakePackage): version("develop", branch="develop") version("master", branch="master") + version("6.2.1", sha256="ed07f638b5e30199251ddda6dd9ee53ee0ec49bcf37cc571a3de85c3a9833248") + version("6.2.0", sha256="7f5318e9c9eb36fb3660392e97520268920c59af3a51af19633aabe5046ef1af") version("6.1.2", sha256="ac3c858c0f76188ac50574591aa6b41b27bda2af5925314451a44242319f28c8") version("6.1.1", sha256="d6302d014045694be85385cdc683ea75476e23fd92ae170079c261c0b041764b") version("6.1.0", sha256="ea80c5d657fa48b1122a47986239a04118977195ee4826d2b14b8bfe0fabce6e") @@ -120,6 +122,8 @@ class Rocrand(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"hip@{ver}", when=f"@{ver}") depends_on(f"rocm-cmake@{ver}:", type="build", when=f"@{ver}") diff --git a/var/spack/repos/builtin/packages/rocsolver/package.py b/var/spack/repos/builtin/packages/rocsolver/package.py index 404adac95dcb23..f2043b98dbe39e 100644 --- a/var/spack/repos/builtin/packages/rocsolver/package.py +++ b/var/spack/repos/builtin/packages/rocsolver/package.py @@ -46,6 +46,8 @@ class Rocsolver(CMakePackage): version("develop", branch="develop") version("master", branch="master") + version("6.2.1", sha256="e1c19cd25f7119c116d1c63e2384e9c47a4ff7ae14bb42dfcef766a4d3a011d5") + version("6.2.0", sha256="74cb799dcddfcbd6ee05398003416dbccd3d06d7f4b23e4324baac3f15440162") version("6.1.2", sha256="8cb45b6a4ed819b8e952c0bfdd8bf7dd941478ac656bea42a6d6751f459e66ea") version("6.1.1", sha256="3bbba30fa7f187676caf858f66c2345e4dcc81b9546eca4a726c0b159dad22bd") version("6.1.0", sha256="f1d7a4edf14ed0b2e2f74aa5cbc9db0c3b0dd31e50bbada1586cb353a28fe015") @@ -102,6 +104,8 @@ class Rocsolver(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"hip@{ver}", when=f"@{ver}") depends_on(f"rocblas@{ver}", when=f"@{ver}") diff --git a/var/spack/repos/builtin/packages/rocsparse/package.py b/var/spack/repos/builtin/packages/rocsparse/package.py index d5af36e08c21e2..5e9b1c86dc15fc 100644 --- a/var/spack/repos/builtin/packages/rocsparse/package.py +++ b/var/spack/repos/builtin/packages/rocsparse/package.py @@ -39,6 +39,8 @@ class Rocsparse(CMakePackage): conflicts("+asan", when="os=centos8") license("MIT") + version("6.2.1", sha256="4691d689db0a03fc950dbc9d88471752f6d17f5382a4bd2f7e23dfb43fc7074c") + version("6.2.0", sha256="d07357d180423cedbabc849983a2d4d79b0e9f4c9b5e07d4993043e646fe6df9") version("6.1.2", sha256="e8989c28085275e7c044b19fd2bc86d8493ce6a1b8545126f787722c535fe6eb") version("6.1.1", sha256="9ac2bf84962cfdf24e4fa68e6f1d91ffdad5d5a5287ecdaddf331e6073ba57b3") version("6.1.0", sha256="d69d9b0079159abb2d7514f8f45a41bb2cbcaf8b52e600e794aca3facf274b5e") @@ -78,6 +80,8 @@ class Rocsparse(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"hip@{ver}", when=f"@{ver}") depends_on(f"rocprim@{ver}", when=f"@{ver}") diff --git a/var/spack/repos/builtin/packages/rocthrust/package.py b/var/spack/repos/builtin/packages/rocthrust/package.py index c7222ece39ecc8..93b017243fcd17 100644 --- a/var/spack/repos/builtin/packages/rocthrust/package.py +++ b/var/spack/repos/builtin/packages/rocthrust/package.py @@ -18,6 +18,8 @@ class Rocthrust(CMakePackage): tags = ["rocm"] maintainers("cgmb", "srekolam", "renjithravindrankannath") + version("6.2.1", sha256="de6121e354e4d2d5f90243acc1071e9afb2a335e17570d293b590b85f3f58fa2") + version("6.2.0", sha256="8037aadf7ec3d548aa17944e0a47465d608dc6eb7347173a6d76cbf5342e4ab6") version("6.1.2", sha256="149ca325fb8a8527781ec2853282a73bf66f60366652c19e8583afc3f1a9c4b6") version("6.1.1", sha256="03420d8af687107775a1fbd3db5e8c9872c7c738747de77a5e8c0b3466a3321a") version("6.1.0", sha256="8c36fb7b34758579601365a450700899133da5802e5c8370654051b190bd6e1c") @@ -67,6 +69,8 @@ class Rocthrust(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"hip@{ver}", when=f"@{ver}") depends_on(f"rocprim@{ver}", when=f"@{ver}") diff --git a/var/spack/repos/builtin/packages/roctracer-dev-api/package.py b/var/spack/repos/builtin/packages/roctracer-dev-api/package.py index d86e278afed71c..5491e5d8fcd115 100644 --- a/var/spack/repos/builtin/packages/roctracer-dev-api/package.py +++ b/var/spack/repos/builtin/packages/roctracer-dev-api/package.py @@ -19,6 +19,8 @@ class RoctracerDevApi(Package): license("MIT") maintainers("srekolam", "renjithravindrankannath") + version("6.2.1", sha256="9e69c90b9dc650e0d8642ec675082c9566e576285a725c3a5d07a37cebb18810") + version("6.2.0", sha256="2fc39f47161f41cc041cd5ee4b1bb0e9832508650e832434056423fec3739735") version("6.1.2", sha256="073e67e728d5eda16d7944f3abd96348b3f278e9f36cab3ac22773ebaad0d2d6") version("6.1.1", sha256="9cb77fd700a0d615056f0db1e9500b73bd0352214f33bdac520e25b9125a926a") version("6.1.0", sha256="3f8e296c4d04123a7177d815ca166e978b085ad7c816ac298e6bb47a299fa187") diff --git a/var/spack/repos/builtin/packages/roctracer-dev/0002-use-clang-18.patch b/var/spack/repos/builtin/packages/roctracer-dev/0002-use-clang-18.patch new file mode 100644 index 00000000000000..26cc1e21ea4b9f --- /dev/null +++ b/var/spack/repos/builtin/packages/roctracer-dev/0002-use-clang-18.patch @@ -0,0 +1,26 @@ + +m 70c457c9d087f83e5587c0d2f65a284a5cbafa1e Mon Sep 17 00:00:00 2001 +From: Afzal Patel +Date: Wed, 14 Aug 2024 16:58:27 +0000 +Subject: [PATCH] Use clang version 18 + +--- + test/CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt +index 95563d5..c9a50b9 100644 +--- a/test/CMakeLists.txt ++++ b/test/CMakeLists.txt +@@ -34,7 +34,7 @@ if(DEFINED ROCM_PATH) + endif() + find_package(HIP REQUIRED MODULE) + +-find_package(Clang REQUIRED CONFIG ++find_package(Clang 18 REQUIRED CONFIG + PATHS "${ROCM_PATH}" + PATH_SUFFIXES "llvm/lib/cmake/clang") + +-- +2.43.5 + diff --git a/var/spack/repos/builtin/packages/roctracer-dev/package.py b/var/spack/repos/builtin/packages/roctracer-dev/package.py index a2b145a8ce0bbe..6b5f472f8699eb 100644 --- a/var/spack/repos/builtin/packages/roctracer-dev/package.py +++ b/var/spack/repos/builtin/packages/roctracer-dev/package.py @@ -22,6 +22,8 @@ class RoctracerDev(CMakePackage, ROCmPackage): libraries = ["libroctracer64"] license("MIT") + version("6.2.1", sha256="9e69c90b9dc650e0d8642ec675082c9566e576285a725c3a5d07a37cebb18810") + version("6.2.0", sha256="2fc39f47161f41cc041cd5ee4b1bb0e9832508650e832434056423fec3739735") version("6.1.2", sha256="073e67e728d5eda16d7944f3abd96348b3f278e9f36cab3ac22773ebaad0d2d6") version("6.1.1", sha256="9cb77fd700a0d615056f0db1e9500b73bd0352214f33bdac520e25b9125a926a") version("6.1.0", sha256="3f8e296c4d04123a7177d815ca166e978b085ad7c816ac298e6bb47a299fa187") @@ -63,11 +65,14 @@ class RoctracerDev(CMakePackage, ROCmPackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"hsakmt-roct@{ver}", when=f"@{ver}") depends_on(f"hsa-rocr-dev@{ver}", when=f"@{ver}") depends_on(f"rocminfo@{ver}", when=f"@{ver}") depends_on(f"hip@{ver}", when=f"@{ver}") + for ver in ["5.3.0", "5.3.3", "5.4.0", "5.4.3"]: depends_on(f"rocprofiler-dev@{ver}", when=f"@{ver}") @@ -83,10 +88,13 @@ class RoctracerDev(CMakePackage, ROCmPackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on(f"rocm-core@{ver}", when=f"@{ver}") patch("0001-include-rocprofiler-dev-path.patch", when="@5.3:5.4") + patch("0002-use-clang-18.patch", when="@6.2") @classmethod def determine_version(cls, lib): diff --git a/var/spack/repos/builtin/packages/rocwmma/package.py b/var/spack/repos/builtin/packages/rocwmma/package.py index b7275d02c54613..5fa810eb353b09 100644 --- a/var/spack/repos/builtin/packages/rocwmma/package.py +++ b/var/spack/repos/builtin/packages/rocwmma/package.py @@ -27,6 +27,8 @@ class Rocwmma(CMakePackage): license("MIT") maintainers("srekolam", "renjithravindrankannath") + version("6.2.1", sha256="f05fcb3612827502d2a15b30f0e46228625027145013652b8f591ad403fa9ddc") + version("6.2.0", sha256="08c5d19f0417ee9ba0e37055152b22f64ed0eab1d9ab9a7d13d46bf8d3b255dc") version("6.1.2", sha256="7f6171bea5c8b7cdaf5c64dbfb76eecf606f2d34e8409153a74b56027c5e92a7") version("6.1.1", sha256="6e0c15c78feb8fb475ed028ed9b0337feeb45bfce1e206fe5f236a55e33f6135") version("6.1.0", sha256="ca29f33cfe6894909159ad68d786eacd469febab33883886a202f13ae061f691") @@ -85,6 +87,8 @@ class Rocwmma(CMakePackage): "6.1.0", "6.1.1", "6.1.2", + "6.2.0", + "6.2.1", ]: depends_on("rocm-cmake@%s:" % ver, type="build", when="@" + ver) depends_on("llvm-amdgpu@" + ver, type="build", when="@" + ver) @@ -92,7 +96,19 @@ class Rocwmma(CMakePackage): depends_on("rocblas@" + ver, type="build", when="@" + ver) depends_on("rocm-openmp-extras@" + ver, type="build", when="@" + ver) - for ver in ["5.6.0", "5.6.1", "5.7.0", "5.7.1", "6.0.0", "6.0.2", "6.1.0", "6.1.1", "6.1.2"]: + for ver in [ + "5.6.0", + "5.6.1", + "5.7.0", + "5.7.1", + "6.0.0", + "6.0.2", + "6.1.0", + "6.1.1", + "6.1.2", + "6.2.0", + "6.2.1", + ]: depends_on("rocm-smi-lib@" + ver, when="@" + ver) for tgt in itertools.chain(["auto"], amdgpu_targets): diff --git a/var/spack/repos/builtin/packages/root/package.py b/var/spack/repos/builtin/packages/root/package.py index 693c0347d02f8a..8ad46328de1adb 100644 --- a/var/spack/repos/builtin/packages/root/package.py +++ b/var/spack/repos/builtin/packages/root/package.py @@ -42,6 +42,7 @@ class Root(CMakePackage): ) # Production version + version("6.32.06", sha256="3fc032d93fe848dea5adb1b47d8f0a86279523293fee0aa2b3cd52a1ffab7247") version("6.32.04", sha256="132f126aae7d30efbccd7dcd991b7ada1890ae57980ef300c16421f9d4d07ea8") version("6.32.02", sha256="3d0f76bf05857e1807ccfb2c9e014f525bcb625f94a2370b455f4b164961602d") version("6.32.00", sha256="12f203681a59041c474ce9523761e6f0e8861b3bee78df5f799a8db55189e5d2") @@ -465,6 +466,10 @@ class Root(CMakePackage): if sys.platform == "darwin" and macos_version() >= Version("13"): conflicts("@:6.26.09", msg="macOS 13 support was added in root 6.26.10") + # See https://github.com/root-project/root/issues/16219 + if sys.platform == "darwin" and macos_version() >= Version("15"): + conflicts("@:6.32.05", msg="macOS 15 support was added in root 6.32.06") + # ROOT <6.14 is incompatible with Python >=3.7, which is the minimum supported by spack conflicts("+python", when="@:6.13", msg="Spack wants python >=3.7, too new for ROOT <6.14") diff --git a/var/spack/repos/builtin/packages/routinator/package.py b/var/spack/repos/builtin/packages/routinator/package.py index e6845beec6ba0d..35d1058d05d5ad 100644 --- a/var/spack/repos/builtin/packages/routinator/package.py +++ b/var/spack/repos/builtin/packages/routinator/package.py @@ -16,6 +16,7 @@ class Routinator(Package): license("BSD-3-Clause") + version("0.14.0", sha256="861e90f395344be19880485185df47e8fd258cc583b82be702af660b466955cb") version("0.12.1", sha256="8150fe544f89205bb2d65bca46388f055cf13971d3163fe17508bf231f9ab8bc") version( "0.11.2", @@ -25,6 +26,7 @@ class Routinator(Package): depends_on("rust@1.56:", when="@0.11.2") depends_on("rust@1.63:", when="@0.12.1") + depends_on("rust@1.70:", when="@0.13.0:") def install(self, spec, prefix): cargo = which("cargo") diff --git a/var/spack/repos/builtin/packages/rpm/package.py b/var/spack/repos/builtin/packages/rpm/package.py index bf1953a27b58ba..18d373f299e9ec 100644 --- a/var/spack/repos/builtin/packages/rpm/package.py +++ b/var/spack/repos/builtin/packages/rpm/package.py @@ -24,6 +24,7 @@ class Rpm(AutotoolsPackage): maintainers("haampie") version("master", branch="master") + version("4.18.2", sha256="8be0a812b2e707c72ae486b54db18ae211dd4158ad35e32b308d662c59a75e85") version("4.16.1.2", sha256="3d2807807a8ccaa92a8ced74e09b5bf5b2417a5bbf9bee4abc7c6aa497547bf3") version("4.16.0", sha256="a62b744e3404b107e8467e1a36ff0f2bf9e5c1b748dbfeb36db54bbb859446ea") @@ -94,13 +95,16 @@ class Rpm(AutotoolsPackage): depends_on("gzip") depends_on("xz") depends_on("lzma") - depends_on("zstd", when="+zstd") + with when("+zstd"): + depends_on("zstd") + depends_on("zstd@1.3.8:", when="@4.17:") # java jar dependency analysis (already requirement for lua) depends_on("unzip", type="run") # Build dependencies depends_on("doxygen", type="build") + depends_on("pandoc", type="build", when="@4.17:") depends_on("pkgconfig", type="build") depends_on("autoconf", type="build") depends_on("automake", type="build") diff --git a/var/spack/repos/builtin/packages/rpp/package.py b/var/spack/repos/builtin/packages/rpp/package.py index 9bafc3826dfb03..c5547f80e0fd2a 100644 --- a/var/spack/repos/builtin/packages/rpp/package.py +++ b/var/spack/repos/builtin/packages/rpp/package.py @@ -28,6 +28,8 @@ def url_for_version(self, version): maintainers("srekolam", "afzpatel") license("MIT") + version("6.2.1", sha256="5ae9d0c6733ba0e00be1cda13003e98acebd3f86de59e6f1969e297d673f124e") + version("6.2.0", sha256="69fbebf50b734e055258ea3c5b0399a51babab8f66074166d2b0fc4f1904c09c") version("6.1.2", sha256="3a529bdd17b448a9e05a6aac1b5e173a077f4a4a1fd2ed759bcea331acd2829f") version("6.1.1", sha256="9ca385c6f208a0bbf2be60ad15697d35371992d49ed30077b69e22090cef657c") version("6.1.0", sha256="026c5ac7a92e14e35b9e7630a2ebfff3f4b3544b988eb9aa8af9991d4beea242") @@ -135,7 +137,7 @@ def patch(self): depends_on("cmake@3.5:", type="build") depends_on("pkgconfig", type="build") depends_on(Boost.with_default_variants) - depends_on("boost@1.72.0:1.80.0") + depends_on("boost@1.72.0:1.85.0") depends_on("bzip2") depends_on("half") depends_on("hwloc") @@ -152,7 +154,17 @@ def patch(self): with when("+hip"): with when("@5.7:"): - for ver in ["5.7.0", "5.7.1", "6.0.0", "6.0.2", "6.1.0", "6.1.1", "6.1.2"]: + for ver in [ + "5.7.0", + "5.7.1", + "6.0.0", + "6.0.2", + "6.1.0", + "6.1.1", + "6.1.2", + "6.2.0", + "6.2.1", + ]: depends_on("hip@" + ver, when="@" + ver) with when("@:1.2"): depends_on("hip@5:") diff --git a/var/spack/repos/builtin/packages/ruby/package.py b/var/spack/repos/builtin/packages/ruby/package.py index 298c7e2882f2aa..87efcab54267f1 100644 --- a/var/spack/repos/builtin/packages/ruby/package.py +++ b/var/spack/repos/builtin/packages/ruby/package.py @@ -24,6 +24,7 @@ class Ruby(AutotoolsPackage, NMakePackage): license("Ruby AND BSD-2-Clause AND MIT", checked_by="tgamblin") + version("3.3.5", sha256="3781a3504222c2f26cb4b9eb9c1a12dbf4944d366ce24a9ff8cf99ecbce75196") version("3.3.4", sha256="fe6a30f97d54e029768f2ddf4923699c416cdbc3a6e96db3e2d5716c7db96a34") version("3.3.2", sha256="3be1d100ebf2a0ce60c2cd8d22cd9db4d64b3e04a1943be2c4ff7b520f2bcb5b") version("3.3.0", sha256="96518814d9832bece92a85415a819d4893b307db5921ae1f0f751a9a89a56b7d") @@ -46,6 +47,7 @@ class Ruby(AutotoolsPackage, NMakePackage): with when(_platform_condition): variant("openssl", default=True, description="Enable OpenSSL support") variant("readline", default=False, description="Enable Readline support") + variant("yjit", default=False, description="Enable Rust JIT", when="@3.2:") depends_on("pkgconfig", type="build") depends_on("libffi") depends_on("libx11", when="@:2.3") @@ -57,6 +59,8 @@ class Ruby(AutotoolsPackage, NMakePackage): with when("+openssl"): depends_on("openssl@:1") depends_on("openssl@:1.0", when="@:2.3") + with when("+yjit"): + depends_on("rust@1.58:") extendable = True @@ -132,6 +136,7 @@ def configure_args(self): args.append("--with-tk=%s" % self.spec["tk"].prefix) if self.spec.satisfies("%fj"): args.append("--disable-dtrace") + args.extend(self.enable_or_disable("yjit")) return args @run_after("install") diff --git a/var/spack/repos/builtin/packages/rust-bindgen/package.py b/var/spack/repos/builtin/packages/rust-bindgen/package.py index 7d20ad4e749ea6..3ea40bfb5c41a0 100644 --- a/var/spack/repos/builtin/packages/rust-bindgen/package.py +++ b/var/spack/repos/builtin/packages/rust-bindgen/package.py @@ -2,28 +2,30 @@ # Spack Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) - -import os - from spack.package import * -class RustBindgen(Package): +class RustBindgen(CargoPackage): """The rust programming language toolchain""" - homepage = "https://www.rust-lang.org" - url = "https://github.com/servo/rust-bindgen/archive/v0.20.5.tar.gz" + homepage = "https://rust-lang.github.io/rust-bindgen/" + url = "https://github.com/rust-lang/rust-bindgen/archive/v0.20.5.tar.gz" license("BSD-3-Clause") + version("0.69.4", sha256="c02ce18b95c4e5021b95b8b461e5dbe6178edffc52a5f555cbca35b910559b5e") + version("0.69.3", sha256="5cdaa156403841e7b286ccbb7b31398c8b49b99f89ebf329457101819aa5eaf0") + version("0.69.2", sha256="78fbb8bd100e145d1effc982eaab21b555ccc3fc1cbe6e734f17cdfe5c33af32") + version("0.69.1", sha256="c10e2806786fb75f05ef32f3f03f4cb7e37bb8e06be5a4a0e95f974fdc567d87") + version("0.69.0", sha256="10790bb9863bff6a6f877b89d9d7cff7eac2ff0f45c1482f5edc9d9d0a82488d") + version("0.68.1", sha256="6a577026184a6f7a99b48f46f2074c83d272d3aadf91c7b94a4c6c34e6acd445") + version("0.66.1", sha256="adedec96f2a00ce835a7c31656e09d6aae6ef55df9ca3d8d65d995f8f2542388") + version("0.66.0", sha256="d2c8e8c1c9fbabecaa1146a02cc3bbbf968931136e7dc94614af06880d291685") version("0.20.5", sha256="4f5236e7979d262c43267afba365612b1008b91b8f81d1efc6a8a2199d52bb37") depends_on("cxx", type="build") # generated - extends("rust") - depends_on("llvm") - - def install(self, spec, prefix): - env = dict(os.environ) - env["LIBCLANG_PATH"] = os.path.join(spec["llvm"].prefix, "lib") - cargo("install", "--root", prefix, env=env) + def build(self, spec, prefix): + # The carogopackage installer doesn't allow for an option to install from a subdir + # see: https://github.com/rust-lang/cargo/issues/7599 + cargo("install", "--root", "out", "bindgen-cli") diff --git a/var/spack/repos/builtin/packages/rust-bootstrap/package.py b/var/spack/repos/builtin/packages/rust-bootstrap/package.py index 6a83358fbf0fcb..73d6de12235159 100644 --- a/var/spack/repos/builtin/packages/rust-bootstrap/package.py +++ b/var/spack/repos/builtin/packages/rust-bootstrap/package.py @@ -23,6 +23,17 @@ class RustBootstrap(Package): # should update these binary releases as bootstrapping requirements are # modified by new releases of Rust. rust_releases = { + "1.81.0": { + "darwin": { + "x86_64": "f74d8ad24cc3cbfb825da98a08d98319565e4d18ec2c3e9503bf0a33c81ba767", + "aarch64": "60a41dea4ae0f4006325745a6400e6fdc3e08ad3f924fac06f04c238cf23f4ec", + }, + "linux": { + "x86_64": "4ca7c24e573dae2f382d8d266babfddc307155e1a0a4025f3bc11db58a6cab3e", + "aarch64": "ef4da9c1ecd56bbbb36f42793524cce3062e6a823ae22cb679a945c075c7755b", + "powerpc64le": "bf98b27de08a2fd5a2202a2b621b02bfde2a6fde397df2a735d018aeffcdc5e2", + }, + }, "1.78.0": { "darwin": { "x86_64": "6c91ed3bd90253961fcb4a2991b8b22e042e2aaa9aba9f389f1e17008171d898", diff --git a/var/spack/repos/builtin/packages/rust-clap/package.py b/var/spack/repos/builtin/packages/rust-clap/package.py new file mode 100644 index 00000000000000..47d0f472219741 --- /dev/null +++ b/var/spack/repos/builtin/packages/rust-clap/package.py @@ -0,0 +1,25 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +from spack.package import * + + +class RustClap(CargoPackage): + """A full featured, fast Command Line Argument Parser for Rust""" + + homepage = "http://docs.rs/clap" + url = "https://github.com/clap-rs/clap/archive/refs/tags/v4.5.10.tar.gz" + + license("APACHE-2.0 OR MIT", checked_by="teaguesterling") + + version("4.5.10", sha256="854c345f8e1af7067edd4777b5862843f1018b3037658d890619f89678cbc033") + version("4.5.9", sha256="8e0de093cd01b8a5be700ea807e937b36c54598a1902004ed64e0635a84c8f69") + version("4.5.8", sha256="9a00964ac907c1d5c0a87ab950ea9b4eec0fec0f5a73d2f5491570d5a9607823") + version("4.5.7", sha256="206001eda043fd7ba4167874ccd069387cfb98f7935cef44e77219c31e8e9ad6") + version("4.5.6", sha256="88763b098a791af71534ccf8e92bcf0b8c591bb0d2f36adabbad272906e79aca") + version("4.5.4", sha256="7023c210ff45a773b588448a803d05bf543cce6e28696967b7f16c0490faaec4") + version("4.5.3", sha256="01b966f804aba86acfd06ecd3f248c6e523227a157a790f6649a20338b0f2109") + version("4.5.2", sha256="10962660f531b5a1bbd4c7c8e96fdf4aef0ecbc8ad64ca3d9995b6e59ced765f") + version("4.5.1", sha256="f3cc654960dc16bf3212d7964e1033c1e4339acbd3ddb1b153ae731b7a9609e7") + version("4.5.0", sha256="c501afbe05a20d86c62206a66cc3c5e0d39e11bc10b000436a2166fc99a56e65") diff --git a/var/spack/repos/builtin/packages/rust/package.py b/var/spack/repos/builtin/packages/rust/package.py index 0d9bea65e915df..d6c6a1497564a2 100644 --- a/var/spack/repos/builtin/packages/rust/package.py +++ b/var/spack/repos/builtin/packages/rust/package.py @@ -36,6 +36,7 @@ class Rust(Package): version("nightly") # Stable versions. + version("1.81.0", sha256="872448febdff32e50c3c90a7e15f9bb2db131d13c588fe9071b0ed88837ccfa7") version("1.78.0", sha256="ff544823a5cb27f2738128577f1e7e00ee8f4c83f2a348781ae4fc355e91d5a9") version("1.76.0", sha256="9e5cff033a7f0d2266818982ad90e4d3e4ef8f8ee1715776c6e25073a136c021") version("1.75.0", sha256="5b739f45bc9d341e2d1c570d65d2375591e22c2d23ef5b8a37711a0386abc088") @@ -91,11 +92,14 @@ class Rust(Package): depends_on("rust-bootstrap@1.73:1.74", type="build", when="@1.74") depends_on("rust-bootstrap@1.74:1.75", type="build", when="@1.75") depends_on("rust-bootstrap@1.77:1.78", type="build", when="@1.78") + depends_on("rust-bootstrap@1.80:1.81", type="build", when="@1.81") # src/llvm-project/llvm/cmake/modules/CheckCompilerVersion.cmake conflicts("%gcc@:7.3", when="@1.73:", msg="Host GCC version must be at least 7.4") # https://github.com/rust-lang/llvm-project/commit/4d039a7a71899038b3bc6ed6fe5a8a48d915caa0 conflicts("%gcc@13:", when="@:1.63", msg="Rust<1.64 not compatible with GCC>=13") + conflicts("%intel", msg="Rust not compatible with Intel Classic compilers") + conflicts("%oneapi", msg="Rust not compatible with Intel oneAPI compilers") extendable = True executables = ["^rustc$", "^cargo$"] diff --git a/var/spack/repos/builtin/packages/sbcl-bootstrap/package.py b/var/spack/repos/builtin/packages/sbcl-bootstrap/package.py new file mode 100644 index 00000000000000..3631f2d4000646 --- /dev/null +++ b/var/spack/repos/builtin/packages/sbcl-bootstrap/package.py @@ -0,0 +1,115 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +import platform + +from spack.package import * +from spack.util.environment import set_env + + +class SbclBootstrap(Package): + """Steel Bank Common Lisp (SBCL) is a high performance Common Lisp compiler. + It is open source / free software, with a permissive license. In addition + to the compiler and runtime system for ANSI Common Lisp, it provides an + interactive environment including a debugger, a statistical profiler, a + code coverage tool, and many other extensions. + """ + + homepage = "https://www.sbcl.org/" + + maintainers("ashermancinelli") + + # sbcl-bootstrap is not available on Windows, but is depended on by sbcl: + skip_version_audit = ["platform=windows"] + + # NOTE: The sbcl homepage lists + # while the sourceforge repo lists "Public Domain, MIT License", the + # COPYING file distributed with the source code contains this message: + # + # Thus, there are no known obstacles to copying, using, and modifying + # SBCL freely, as long as copyright notices of MIT, Symbolics, Xerox and + # Gerd Moellmann are retained. + # + # MIT seems the most appropriate, but if we can add more context to this + # license message, then we should. + license("MIT", checked_by="ashermancinelli") + + # By checking objdump -T of the sbcl binary in each prebuilt tarball, I + # found the latest reference to glibc for each version. + sbcl_releases = { + "2.4.0": { + "darwin": {"arm64": "1d01fac2d9748f769c9246a0a11a2c011d7843337f8f06ca144f5a500e10c117"} + }, + "2.3.11": { + "linux": { + "x86_64": "98784b04f68882b887984242eef73dbb092ec5c778dd536b2c60846715e03f3c", + "min_glibc": "2.34", + } + }, + # TODO(ashermancinelli): I don't have a machine to test this on, but the binaries are + # available. + # "2.2.9": { + # "darwin": { + # "x86_64": "0000000000000000000000000000000000000000000000000000000000000000" + # } + # }, + "2.0.11": { + "linux": { + "x86_64": "b7e61bc6b8d238f8878e660bc0635e99c2ea1255bfd6153d702fe9a00f8138fd", + "min_glibc": "2.28", + } + }, + "1.4.16": { + "linux": { + "x86_64": "df3d905d37656a7eeeba72d703577afc94a21d756a4dde0949310200f82ce575", + "min_glibc": "2.14", + } + }, + "1.4.2": { + "linux": { + "aarch64": "ddac6499f36c18ecbce9822a53ef3914c0def5276a457446a456c62999b16d36", + "min_glibc": "2.17", + } + }, + "1.3.21": { + "linux": { + "x86_64": "c1c3e17e1857fb1c22af575941be5cd1d5444b462397b1b3c9f3877aee2e814b", + "min_glibc": "2.3", + } + }, + } + + os = platform.system().lower() + target = platform.machine().lower() + + for ver in sbcl_releases: + if os in sbcl_releases[ver]: + if target in sbcl_releases[ver][os]: + version(ver, sha256=sbcl_releases[ver][os][target]) + if "min_glibc" in sbcl_releases[ver][os]: + conflicts( + "glibc@:{0}".format(sbcl_releases[ver][os]["min_glibc"]), + when="@{0}".format(ver), + ) + + supported_sysinfo_msg = ( + "Not a supported platform. See https://www.sbcl.org/platform-table.html" + ) + for sysinfo in ["platform=windows", "target=ppc64le"]: + conflicts(sysinfo, msg=supported_sysinfo_msg) + + def url_for_version(self, version): + target = platform.machine().lower() + os = platform.system().lower() + sbcl_targets = {"arm64": "arm64", "aarch64": "arm64", "x86_64": "x86-64"} + if target not in sbcl_targets: + return None + sbcl_url = "https://sourceforge.net/projects/sbcl/files/sbcl/{version}/sbcl-{version}-{target}-{os}-binary.tar.bz2" + return sbcl_url.format(version=version, target=sbcl_targets[target], os=os) + + def install(self, spec, prefix): + sh = which("sh") + with set_env(INSTALL_ROOT=self.spec.prefix): + sh("install.sh") diff --git a/var/spack/repos/builtin/packages/sbcl/package.py b/var/spack/repos/builtin/packages/sbcl/package.py new file mode 100644 index 00000000000000..1c7f98e3b72957 --- /dev/null +++ b/var/spack/repos/builtin/packages/sbcl/package.py @@ -0,0 +1,82 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * +from spack.util.environment import set_env + + +class Sbcl(MakefilePackage): + """Steel Bank Common Lisp (SBCL) is a high performance Common Lisp compiler. + It is open source / free software, with a permissive license. In addition + to the compiler and runtime system for ANSI Common Lisp, it provides an + interactive environment including a debugger, a statistical profiler, a + code coverage tool, and many other extensions. + """ + + homepage = "https://www.sbcl.org/" + url = "https://sourceforge.net/projects/sbcl/files/sbcl/2.4.8/sbcl-2.4.8-source.tar.bz2" + git = "git://git.code.sf.net/p/sbcl/sbcl" + + maintainers("ashermancinelli") + + # NOTE: The sbcl homepage lists + # while the sourceforge repo lists "Public Domain, MIT License", the + # COPYING file distributed with the source code contains this message: + # + # > Thus, there are no known obstacles to copying, using, and modifying + # > SBCL freely, as long as copyright notices of MIT, Symbolics, Xerox and + # > Gerd Moellmann are retained. + # + # MIT seems the most appropriate, but if we can add more context to this + # license message, then we should. + license("MIT", checked_by="ashermancinelli") + + version("master", branch="master") + version("2.4.8", sha256="fc6ecdcc538e80a14a998d530ccc384a41790f4f4fc6cd7ffe8cb126a677694c") + + depends_on("c", type="build") + depends_on("sbcl-bootstrap", type="build") + depends_on("zstd", when="platform=darwin") + + variant( + "fancy", default=True, description="Enable extra features like compression and threading." + ) + + # TODO(ashermancinelli): there's nothing on the platform support page that + # makes me think this shouldn't build, but I can't + # get the sbcl binary to link with gcc on darwin. + conflicts( + "+fancy%gcc", + when="platform=darwin", + msg="Cannot build with gcc on darwin because pthreads will fail to link", + ) + + phases = ["build", "install"] + + def build(self, spec, prefix): + sh = which("sh") + + version_str = str(spec.version) + + # NOTE: add any other git versions here. + # When installing from git, the build system expects a dummy version + # to be provided as a lisp expression. + if version_str in ("master",): + with open("version.lisp-expr", "w") as f: + f.write(f'"{version_str}"') + + build_args = [] + build_args.append("--prefix={0}".format(prefix)) + + if "+fancy" in self.spec: + build_args.append("--fancy") + + sbcl_bootstrap_prefix = self.spec["sbcl-bootstrap"].prefix.lib.sbcl + with set_env(SBCL_HOME=sbcl_bootstrap_prefix): + sh("make.sh", *build_args) + + def install(self, spec, prefix): + sh = which("sh") + sh("install.sh") diff --git a/var/spack/repos/builtin/packages/scc/package.py b/var/spack/repos/builtin/packages/scc/package.py index 8c2c1aa3bcbcf7..5d0b00e406eabb 100644 --- a/var/spack/repos/builtin/packages/scc/package.py +++ b/var/spack/repos/builtin/packages/scc/package.py @@ -19,8 +19,9 @@ class Scc(GoPackage): license("MIT") + version("3.4.0", sha256="bdedb6f32d1c3d73ac7e55780021c742bc8ed32f6fb878ee3e419f9acc76bdaa") version("3.3.2", sha256="2bbfed4cf34bbe50760217b479331cf256285335556a0597645b7250fb603388") version("3.1.0", sha256="bffea99c7f178bc48bfba3c64397d53a20a751dfc78221d347aabdce3422fd20") - depends_on("c", type="build") # generated - depends_on("cxx", type="build") # generated + depends_on("go@1.20:", type="build", when="@3.2.0:") + depends_on("go@1.22:", type="build", when="@3.4.0:") diff --git a/var/spack/repos/builtin/packages/scnlib/package.py b/var/spack/repos/builtin/packages/scnlib/package.py new file mode 100644 index 00000000000000..24135986e55333 --- /dev/null +++ b/var/spack/repos/builtin/packages/scnlib/package.py @@ -0,0 +1,61 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class Scnlib(CMakePackage): + """scanf for modern C++""" + + homepage = "https://scnlib.dev" + url = "https://github.com/eliaskosunen/scnlib/archive/refs/tags/v3.0.1.tar.gz" + + maintainers("pranav-sivaraman") + + license("Apache-2.0", checked_by="pranav-sivaraman") + + version("3.0.1", sha256="bc8a668873601d00cce6841c2d0f2c93f836f63f0fbc77997834dea12e951eb1") + + variant("shared", default=True, description="Build shared libs") + variant( + "regex-backend", + default="std", + description="Regex backend to use", + multi=False, + values=("std", "Boost"), + ) + variant( + "icu", + default=False, + description="Use the ICU when using the Boost regex backend", + when="regex-backend=Boost", + ) + + depends_on("cxx", type="build") + depends_on("cmake@3.16:", type="build") + + depends_on("fast-float@5:") + + depends_on("boost +regex cxxstd=17", when="regex-backend=Boost") + depends_on("boost +icu", when="+icu") + + depends_on("googletest cxxstd=17", type="test") + depends_on("python@3:", type="test") + + def cmake_args(self): + args = [ + self.define("SCN_TESTS", self.run_tests), + self.define("SCN_BENCHMARKS", False), + self.define("SCN_EXAMPLES", False), + self.define("SCN_DOCS", False), + self.define("SCN_USE_EXTERNAL_FAST_FLOAT", True), + self.define("SCN_USE_EXTERNAL_GTEST", True), + self.define("SCN_USE_EXTERNAL_BENCHMARK", True), + self.define("SCN_USE_EXTERNAL_REGEX_BACKEND", True), + self.define_from_variant("BUILD_SHARED_LIBS", "shared"), + self.define_from_variant("SCN_REGEX_BACKEND", "regex-backend"), + ] + + return args diff --git a/var/spack/repos/builtin/packages/scrot/package.py b/var/spack/repos/builtin/packages/scrot/package.py index 23709f59a20144..c28f40fb7f888c 100644 --- a/var/spack/repos/builtin/packages/scrot/package.py +++ b/var/spack/repos/builtin/packages/scrot/package.py @@ -20,10 +20,9 @@ class Scrot(AutotoolsPackage): version("1.6", sha256="42f64d38f04ec530c8b4ebdae04cce8b6893b2f8d30627391d390edcba917090") version("1.5", sha256="42fcf1c97940f4b4e34ca69990a0fc9b98991357bd6a4b67f30ebe0ccc10f093") - depends_on("c", type="build") # generated + depends_on("c", type="build") depends_on("giblib", when="@:1.5") depends_on("imlib2") - depends_on("libtool") depends_on("libxcomposite") depends_on("libxfixes") diff --git a/var/spack/repos/builtin/packages/seacas/package.py b/var/spack/repos/builtin/packages/seacas/package.py index 7bcdc2173661ed..a222024541934b 100644 --- a/var/spack/repos/builtin/packages/seacas/package.py +++ b/var/spack/repos/builtin/packages/seacas/package.py @@ -196,6 +196,11 @@ class Seacas(CMakePackage): default=False, description="Enable Faodel. See https://github.com/sandialabs/faodel", ) + variant( + "libcatalyst", + default=False, + description="Enable libcatalyst tpl (catalyst api 2); Kitware insitu library", + ) variant( "matio", default=True, @@ -262,6 +267,10 @@ class Seacas(CMakePackage): depends_on("catch2@3:", when="@2024-03-11:+tests") depends_on("matio", when="+matio") + + depends_on("libcatalyst+mpi~python", when="+libcatalyst+mpi") + depends_on("libcatalyst~mpi~python", when="+libcatalyst~mpi") + depends_on("libx11", when="+x11") with when("+cgns"): @@ -481,6 +490,9 @@ def cmake_args(self): if "+adios2" in spec: options.append(define("ADIOS2_ROOT", spec["adios2"].prefix)) + if "+libcatalyst" in spec: + options.append(define("TPL_ENABLE_Catalyst2", "ON")) + # ################# RPath Handling ###################### if sys.platform == "darwin" and macos_version() >= Version("10.12"): # use @rpath on Sierra due to limit of dynamic loader diff --git a/var/spack/repos/builtin/packages/sed/package.py b/var/spack/repos/builtin/packages/sed/package.py index 0c556310799ebf..5a6b21b4b95760 100644 --- a/var/spack/repos/builtin/packages/sed/package.py +++ b/var/spack/repos/builtin/packages/sed/package.py @@ -44,8 +44,7 @@ def determine_version(cls, exe): return match.group(1) if match else None def flag_handler(self, name, flags): - iflags = [] if name == "cflags": if self.spec.satisfies("%oneapi@2023.0.0:"): - iflags.append("-Wno-error=incompatible-function-pointer-types") - return (iflags, None, None) + flags.append("-Wno-error=incompatible-function-pointer-types") + return (flags, None, None) diff --git a/var/spack/repos/builtin/packages/sensei/package.py b/var/spack/repos/builtin/packages/sensei/package.py index 95374e63b5f27f..a00e944ea8fc38 100644 --- a/var/spack/repos/builtin/packages/sensei/package.py +++ b/var/spack/repos/builtin/packages/sensei/package.py @@ -91,7 +91,7 @@ class Sensei(CMakePackage): depends_on("python@3:", when="+python", type=("build", "run")) extends("python", when="+python") depends_on("py-numpy", when="+python", type=("build", "run")) - depends_on("py-mpi4py", when="+python", type=("build", "run")) + depends_on("py-mpi4py@:3", when="+python", type=("build", "run")) depends_on("swig", when="+python", type="build") depends_on("cmake@3.6:", when="@3:", type="build") depends_on("pugixml") diff --git a/var/spack/repos/builtin/packages/shadow/package.py b/var/spack/repos/builtin/packages/shadow/package.py index aaed47308ae094..95825c365625c1 100644 --- a/var/spack/repos/builtin/packages/shadow/package.py +++ b/var/spack/repos/builtin/packages/shadow/package.py @@ -16,10 +16,15 @@ class Shadow(AutotoolsPackage): license("BSD-3-Clause") + version("4.16.0", sha256="1744f339e07a2b41056347ddd612839762ff565d7e9494fb049428002fa2e7e0") version("4.15.1", sha256="b34686b89b279887ffbf1f33128902ccc0fa1a998a3add44213bb12d7385b218") version("4.13", sha256="813057047499c7fe81108adcf0cffa3ad4ec75e19a80151f9cbaa458ff2e86cd") version("4.8.1", sha256="3ee3081fbbcbcfea5c8916419e46bc724807bab271072104f23e7a29e9668f3a") version("4.7", sha256="5135b0ca2a361a218fab59e63d9c1720d2a8fc1faa520c819a654b638017286f") version("4.6", sha256="4668f99bd087399c4a586084dc3b046b75f560720d83e92fd23bf7a89dda4d31") - depends_on("c", type="build") # generated + depends_on("c", type="build") + + def configure_args(self): + # Fix build when libbsd is not installed on the host: + return ["--without-libbsd"] diff --git a/var/spack/repos/builtin/packages/shc/package.py b/var/spack/repos/builtin/packages/shc/package.py index 5ff617eebc655e..4338930e42120b 100644 --- a/var/spack/repos/builtin/packages/shc/package.py +++ b/var/spack/repos/builtin/packages/shc/package.py @@ -13,7 +13,7 @@ class Shc(AutotoolsPackage): and linked to produce a stripped binary executable.""" homepage = "https://neurobin.org/projects/softwares/unix/shc/" - url = "https://github.com/neurobin/shc/archive/4.0.3.tar.gz" + url = "https://github.com/neurobin/shc/archive/refs/tags/4.0.3.tar.gz" license("GPL-3.0-or-later") diff --git a/var/spack/repos/builtin/packages/singularityce/package.py b/var/spack/repos/builtin/packages/singularityce/package.py index 4969b1e3c27fbb..08630bf7512a83 100644 --- a/var/spack/repos/builtin/packages/singularityce/package.py +++ b/var/spack/repos/builtin/packages/singularityce/package.py @@ -113,6 +113,11 @@ def fix_mksquashfs_path(self): "mksquashfs path = {0}".format(squash_path), join_path(prefix.etc, self.singularity_name, self.singularity_name + ".conf"), ) + filter_file( + r"^shared loop devices = no", + "shared loop devices = yes", + join_path(prefix.etc, self.singularity_name, self.singularity_name + ".conf"), + ) # # Assemble a script that fixes the ownership and permissions of several @@ -219,4 +224,4 @@ class Singularityce(SingularityBase): version("3.9.1", sha256="1ba3bb1719a420f48e9b0a6afdb5011f6c786d0f107ef272528c632fff9fd153") version("3.8.0", sha256="5fa2c0e7ef2b814d8aa170826b833f91e5031a85d85cd1292a234e6c55da1be1") - depends_on("c", type="build") # generated + depends_on("c", type="build") diff --git a/var/spack/repos/builtin/packages/sirius/package.py b/var/spack/repos/builtin/packages/sirius/package.py index 5d33a42fba69b9..02f547a0821860 100644 --- a/var/spack/repos/builtin/packages/sirius/package.py +++ b/var/spack/repos/builtin/packages/sirius/package.py @@ -23,6 +23,7 @@ class Sirius(CMakePackage, CudaPackage, ROCmPackage): version("develop", branch="develop") version("master", branch="master") + version("7.6.1", sha256="16a114dc17e28697750585820e69718a96e6929f88406d266c75cf9a7cdbdaaa") version("7.6.0", sha256="e424206fecb35bb2082b5c87f0865a9536040e984b88b041e6f7d531f8a65b20") version("7.5.2", sha256="9ae01935578532c84f1d0d673dbbcdd490e26be22efa6c4acf7129f9dc1a0c60") version("7.5.1", sha256="aadfa7976e90a109aeb1677042454388a8d1a50d75834d59c86c8aef06bc12e4") diff --git a/var/spack/repos/builtin/packages/sleef/package.py b/var/spack/repos/builtin/packages/sleef/package.py index 9a37d7369edfca..ccbce0473aafc9 100644 --- a/var/spack/repos/builtin/packages/sleef/package.py +++ b/var/spack/repos/builtin/packages/sleef/package.py @@ -10,7 +10,7 @@ class Sleef(CMakePackage): """SIMD Library for Evaluating Elementary Functions, vectorized libm and DFT.""" homepage = "https://sleef.org" - url = "https://github.com/shibatch/sleef/archive/3.6.1.tar.gz" + url = "https://github.com/shibatch/sleef/archive/3.7.tar.gz" git = "https://github.com/shibatch/sleef.git" maintainers("blapie") @@ -18,7 +18,8 @@ class Sleef(CMakePackage): license("BSL-1.0") version("master", branch="master") - version("3.6.1", commit="6ee14bcae5fe92c2ff8b000d5a01102dab08d774", preferred=True) + version("3.7.0", commit="c5494730bf601599a55f4e77f357b51ba590585e", preferred=True) + version("3.6.1", commit="6ee14bcae5fe92c2ff8b000d5a01102dab08d774") version("3.6.0_2024-03-20", commit="60e76d2bce17d278b439d9da17177c8f957a9e9b") # py-torch@2.4: version("3.6.0", commit="a99491afee2bae0b11e9ffbf3211349f43a5fd10") version( @@ -70,12 +71,9 @@ def sleef_define(self, cmake_var, value): return self.define(cmake_var, value) def cmake_args(self): - # https://salsa.debian.org/science-team/sleef/-/blob/master/debian/rules args = [ - self.sleef_define("BUILD_DFT", False), - self.sleef_define("BUILD_SHARED_LIBS", True), self.sleef_define("BUILD_TESTS", self.run_tests), - self.sleef_define("TEST_ALL_IUT", True), + self.define("CMAKE_POSITION_INDEPENDENT_CODE", True), ] # https://github.com/shibatch/sleef/issues/474 diff --git a/var/spack/repos/builtin/packages/slepc/package.py b/var/spack/repos/builtin/packages/slepc/package.py index 41c5c6d17bb907..92f7c93da8b2a9 100644 --- a/var/spack/repos/builtin/packages/slepc/package.py +++ b/var/spack/repos/builtin/packages/slepc/package.py @@ -22,6 +22,9 @@ class Slepc(Package, CudaPackage, ROCmPackage): test_requires_compiler = True version("main", branch="main") + version("3.22.0", sha256="45eb4d085875b50108c91fd9168ed17bc9158cc3b1e530ac843b26d9981c3db0") + version("3.21.2", sha256="306fa649750509b3957b9f9311bff5dc1d20be5c5d494dd6472584c439b931f6") + version("3.21.1", sha256="beb33f0a15c3ce81744b15ad09ddf84dae70dbf3475c5ef032b8549ab87d6d8a") version("3.21.0", sha256="782833f0caa6585509a837ccd470265c62a1bb56ba64e54c38bde6c63d92629e") version("3.20.2", sha256="125258c87360e326675238eaeb21ce2fbb3f27f4eeb1c72062043931aea05493") version("3.20.1", sha256="5a36b664895881d3858d0644f56bf7bb922bdab70d732fa11cbf6442fec11806") @@ -72,6 +75,7 @@ class Slepc(Package, CudaPackage, ROCmPackage): # Cannot mix release and development versions of SLEPc and PETSc: depends_on("petsc@main", when="@main") for ver in [ + "3.22", "3.21", "3.20", "3.19", diff --git a/var/spack/repos/builtin/packages/smee-client/package.py b/var/spack/repos/builtin/packages/smee-client/package.py index 649aa609aa4058..e8bf872248afe8 100644 --- a/var/spack/repos/builtin/packages/smee-client/package.py +++ b/var/spack/repos/builtin/packages/smee-client/package.py @@ -20,6 +20,7 @@ class SmeeClient(Package): license("ISC") + version("2.0.3", sha256="98ca658cf3214c5116651f2a788c793bc2fe76543f24ada20e8751fcf1de8e1a") version("1.2.3", sha256="b9afff843fc7a3c2b5d6659acf45357b5db7a739243b99f6d18a9b110981a328") depends_on("node-js", type=("build", "link", "run")) @@ -31,6 +32,9 @@ class SmeeClient(Package): def build(self, spec, prefix): npm = which("npm", required=True) + # Install node-js dependencies of smee-client + npm("install") + # Allow tsc to fail with typing "errors" which don't affect results output = npm("run", "build", output=str, error=str, fail_on_error=False) if npm.returncode not in (0, 2): diff --git a/var/spack/repos/builtin/packages/snakemake/package.py b/var/spack/repos/builtin/packages/snakemake/package.py index 754affb32d49b6..501c0076b638f3 100644 --- a/var/spack/repos/builtin/packages/snakemake/package.py +++ b/var/spack/repos/builtin/packages/snakemake/package.py @@ -10,11 +10,12 @@ class Snakemake(PythonPackage): """Workflow management system to create reproducible and scalable data analyses.""" homepage = "https://snakemake.readthedocs.io/en" - pypi = "snakemake/snakemake-8.4.12.tar.gz" - maintainers("marcusboden") + pypi = "snakemake/snakemake-8.18.2.tar.gz" + maintainers("marcusboden", "w8jcik") license("MIT") + version("8.18.2", sha256="7dc8cdc3c836444c2bc3d67a4a7f4d703557c1bf96a90da18f312f4df9daefc4") version("8.5.2", sha256="cc94876263182277e4a429e5d371c867400eeddc791c114dfd090d1bb3158975") version("7.32.4", sha256="fdc3f15dd7b06fabb7da30d460e0a3b1fba08e4ea91f9c32c47a83705cdc7b6e") version("7.31.1", sha256="6fadcc9a051737aa187dccf437879b3b83ddc917fff9bd7d400e056cf17a1788") @@ -59,20 +60,42 @@ class Snakemake(PythonPackage): depends_on("py-pulp@2.3.1:2.8", type=("build", "run"), when="@8.1.2:") depends_on("py-pulp@2:", type=("build", "run"), when="@:8.1.1") depends_on("py-pyyaml", type=("build", "run")) + depends_on("py-requests@2.8.1:2", type=("build", "run"), when="@8.4.12") depends_on("py-requests", type=("build", "run")) + depends_on("py-reretry", type=("build", "run"), when="@7:") - depends_on("py-smart-open@3:6", type=("build", "run"), when="@8.4.12:") + + depends_on("py-smart-open@4:7", type=("build", "run"), when="@8.11:") + depends_on("py-smart-open@3:7", type=("build", "run"), when="@8.8:8.10") + depends_on("py-smart-open@3:6", type=("build", "run"), when="@8.4.12:8.7") depends_on("py-smart-open@3:", type=("build", "run")) + + depends_on( + "py-snakemake-interface-executor-plugins@9.2:9", type=("build", "run"), when="@8.15.0:" + ) + depends_on( + "py-snakemake-interface-executor-plugins@9.1:9", type=("build", "run"), when="@8.10.1:" + ) depends_on( - "py-snakemake-interface-executor-plugins@8.1.3:8", type=("build", "run"), when="@8:" + "py-snakemake-interface-executor-plugins@9.0.2:9", type=("build", "run"), when="@8.10:" ) + depends_on("py-snakemake-interface-executor-plugins@9", type=("build", "run"), when="@8.6:") + depends_on( + "py-snakemake-interface-executor-plugins@8.1.3:8", type=("build", "run"), when="@8:8.5" + ) + depends_on("py-snakemake-interface-common@1.17:1", type=("build", "run"), when="@8.4.10:") depends_on("py-snakemake-interface-common@1.15:1", type=("build", "run"), when="@8:") + + depends_on( + "py-snakemake-interface-storage-plugins@3.2.3:3", type=("build", "run"), when="@8.15.1:" + ) depends_on( "py-snakemake-interface-storage-plugins@3.1:3", type=("build", "run"), when="@8.4.10:" ) depends_on("py-snakemake-interface-storage-plugins@3", type=("build", "run"), when="@8:") + depends_on("py-snakemake-interface-report-plugins@1", type=("build", "run"), when="@8.5:") depends_on("py-stopit", type=("build", "run")) depends_on("py-tabulate", type=("build", "run")) diff --git a/var/spack/repos/builtin/packages/snappy/package.py b/var/spack/repos/builtin/packages/snappy/package.py index cae3472c411f0e..be67125417f2e6 100644 --- a/var/spack/repos/builtin/packages/snappy/package.py +++ b/var/spack/repos/builtin/packages/snappy/package.py @@ -14,6 +14,7 @@ class Snappy(CMakePackage): license("BSD-3-Clause") + version("1.2.1", sha256="736aeb64d86566d2236ddffa2865ee5d7a82d26c9016b36218fcc27ea4f09f86") version("1.1.10", sha256="49d831bffcc5f3d01482340fe5af59852ca2fe76c3e05df0e67203ebbe0f1d90") version("1.1.9", sha256="75c1fbb3d618dd3a0483bff0e26d0a92b495bbe5059c8b4f1c962b478b6e06e7") version("1.1.8", sha256="16b677f07832a612b0836178db7f374e414f94657c138e6993cbfc5dcc58651f") diff --git a/var/spack/repos/builtin/packages/sopt/package.py b/var/spack/repos/builtin/packages/sopt/package.py new file mode 100644 index 00000000000000..a71731212f430f --- /dev/null +++ b/var/spack/repos/builtin/packages/sopt/package.py @@ -0,0 +1,78 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class Sopt(CMakePackage): + """SOPT is an open-source C++ package available under the license below. It performs + Sparse OPTimisation using state-of-the-art convex optimisation algorithms. It solves a + variety of sparse regularisation problems, including the Sparsity Averaging Reweighted + Analysis (SARA) algorithm. + """ + + homepage = "https://astro-informatics.github.io/sopt/" + url = "https://github.com/astro-informatics/sopt/archive/refs/tags/v4.2.0.tar.gz" + git = "https://github.com/astro-informatics/sopt" + + maintainers("tkoskela", "mmcleod89", "20DM") + license("GPL-2.0") + + version("4.2.0", sha256="25e579722f8e049d37c9155affa57ec2f38a2f8414c9cf430da2b7bafc86907b") + + variant("tests", default=False, description="Build tests") + variant("examples", default=False, description="Build examples") + variant("benchmarks", default=False, description="Build benchmarks") + variant("openmp", default=False, description="Enable multithreading with OpenMP") + variant("mpi", default=False, description="Enable parallelisation with MPI") + variant("docs", default=False, description="Enable multithreading with OpenMP") + variant("coverage", default=False, description="Enable code coverage") + variant("onnxrt", default=False, description="Build with Tensorflow support using onnx") + + depends_on("cmake@3") + depends_on("eigen@3.4") + depends_on("libtiff@4") + depends_on("mpi", when="+mpi") + depends_on("catch2@3.4:3", when="+tests") + depends_on("benchmark@1.8~performance_counters", when="+benchmarks") + depends_on("onnx@1.16:", when="+onnxrt") + depends_on("doxygen@1.8:1.12+graphviz", when="+docs") + + patch( + "https://github.com/astro-informatics/sopt/commit/836171f32d39a3fbc1147d6c302a08a61f842fee.patch?full_index=1", + sha256="00729db4695712c3fb38aeb9e23a17107a7c8504c3a8249d9d4ddd2782d29661", + when="@4.2.0", + ) + + def cmake_args(self): + args = [ + self.define_from_variant("tests", "tests"), + self.define_from_variant("examples", "examples"), + self.define_from_variant("benchmarks", "benchmarks"), + self.define_from_variant("openmp", "openmp"), + self.define_from_variant("dompi", "mpi"), + self.define_from_variant("docs", "docs"), + self.define_from_variant("coverage", "coverage"), + self.define_from_variant("onnxrt", "onnxrt"), + ] + return args + + def setup_run_environment(self, env): + if "+tests" in self.spec: + env.prepend_path("PATH", self.spec.prefix.tests) + if "+examples" in self.spec: + env.prepend_path("PATH", join_path(self.spec.prefix, "examples")) + if "+benchmarks" in self.spec: + env.prepend_path("PATH", join_path(self.spec.prefix, "benchmarks")) + + def install(self, spec, prefix): + with working_dir(self.build_directory): + make("install") + if "+tests" in spec: + install_tree("cpp/tests", spec.prefix.tests) + if "+examples" in spec: + install_tree("cpp/examples", join_path(spec.prefix, "examples")) + if "+benchmarks" in spec: + install_tree("cpp/benchmarks", join_path(spec.prefix, "benchmarks")) diff --git a/var/spack/repos/builtin/packages/spectre/package.py b/var/spack/repos/builtin/packages/spectre/package.py index c6bc7f76595886..40282f7d5a4308 100644 --- a/var/spack/repos/builtin/packages/spectre/package.py +++ b/var/spack/repos/builtin/packages/spectre/package.py @@ -31,6 +31,12 @@ class Spectre(CMakePackage): license("MIT") version("develop", branch="develop") + version( + "2024.09.29", sha256="b5e84b4564ad7cd2e069a24c6c472aab342753fe8393242eceba378b52226acb" + ) + version( + "2024.09.16", sha256="2524d4e3cbe9206c0d8830fd6969dcf4cf53aefb26c882c6a743638611763171" + ) version( "2024.08.03", sha256="18582b625b121c16cd9a1ec421c4ac6cb77bb252622a205b038306e75a466138" ) diff --git a/var/spack/repos/builtin/packages/spherepack/package.py b/var/spack/repos/builtin/packages/spherepack/package.py index c2931c51e51328..82d40378ec7a38 100644 --- a/var/spack/repos/builtin/packages/spherepack/package.py +++ b/var/spack/repos/builtin/packages/spherepack/package.py @@ -10,14 +10,16 @@ class Spherepack(Package): """SPHEREPACK - A Package for Modeling Geophysical Processes""" - homepage = "https://www2.cisl.ucar.edu/resources/legacy/spherepack" - url = "https://www2.cisl.ucar.edu/sites/default/files/spherepack3.2.tar" + homepage = "https://github.com/NCAR/NCAR-Classic-Libraries-for-Geophysics" + url = "https://github.com/NCAR/NCAR-Classic-Libraries-for-Geophysics/raw/refs/heads/main/SpherePack/spherepack3.2.tar.gz" - version("3.2", sha256="d58ef8cbc45cf2ad24f73a9f73f5f9d4fbe03cd9e2e7722e526fffb68be581ba") + version("3.2", sha256="7f5497e77101a4423cee887294f873048f6ff6bc8d0e908c8a89ece677ee19ea") + + depends_on("fortran", type="build") def install(self, spec, prefix): if self.compiler.fc is None: raise InstallError("SPHEREPACK requires a Fortran 90 compiler") - make("MAKE=make", "F90=f90 -O2", "AR=ar", "libspherepack") - make("MAKE=make", "F90=f90 -O2", "AR=ar", "testspherepack") + make("MAKE=make", "F90=f90 -O2 -fallow-argument-mismatch", "AR=ar", "libspherepack") + make("MAKE=make", "F90=f90 -O2 -fallow-argument-mismatch", "AR=ar", "testspherepack") install_tree("lib", prefix.lib) diff --git a/var/spack/repos/builtin/packages/sqlite/package.py b/var/spack/repos/builtin/packages/sqlite/package.py index 4b3b3734898ca7..57f1272801ca1f 100644 --- a/var/spack/repos/builtin/packages/sqlite/package.py +++ b/var/spack/repos/builtin/packages/sqlite/package.py @@ -218,7 +218,8 @@ def url_for_version(self, version): @property def libs(self): - return find_libraries("libsqlite3", root=self.prefix.lib) + prefix = "lib" if sys.platform != "win32" else "" + return find_libraries(f"{prefix}sqlite3", root=self.prefix.lib, runtime=False) def test_example(self): """check example table dump""" diff --git a/var/spack/repos/builtin/packages/srm-ifce/package.py b/var/spack/repos/builtin/packages/srm-ifce/package.py new file mode 100644 index 00000000000000..64be41841dd278 --- /dev/null +++ b/var/spack/repos/builtin/packages/srm-ifce/package.py @@ -0,0 +1,39 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class SrmIfce(CMakePackage): + """Client side implementation of the SRMv2 specification.""" + + homepage = "https://dmc-docs.web.cern.ch/dmc-docs/srm-ifce.html" + url = "https://github.com/cern-fts/srm-ifce/archive/refs/tags/v1.24.4.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("1.24.4", sha256="1a4b937e4ecf04e34106eb4652e18beb3e6fc81ba9c815f6d9b21e07a8a12b1e") + + depends_on("c", type="build") + + depends_on("glib") + depends_on("gsoap") + depends_on("cgsi-gsoap") + depends_on("globus-common") + depends_on("globus-gsi-cert-utils") + depends_on("globus-gsi-credential") + depends_on("globus-gss-assist") + depends_on("globus-gssapi-gsi") + depends_on("globus-openssl-module") + depends_on("openssl") + + def cmake_args(self): + args = [ + self.define("UNIT_TESTS", self.run_tests), + self.define("CGSI_GSOAP_LOCATION", self.spec["cgsi-gsoap"].prefix.lib64), + ] + return args diff --git a/var/spack/repos/builtin/packages/static-analysis-suite/package.py b/var/spack/repos/builtin/packages/static-analysis-suite/package.py deleted file mode 100644 index f2e75c06b232e0..00000000000000 --- a/var/spack/repos/builtin/packages/static-analysis-suite/package.py +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other -# Spack Project Developers. See the top-level COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -from spack.package import * - - -class StaticAnalysisSuite(CMakePackage): - """SAS (Static Analysis Suite) is a powerful tool for running static - analysis on C++ code.""" - - homepage = "https://github.com/dpiparo/SAS" - url = "https://github.com/dpiparo/SAS/archive/0.1.3.tar.gz" - - version( - "0.2.0", - sha256="a369e56f8edc61dbf59ae09dbb11d98bc05fd337c5e47e13af9c913bf7bfc538", - deprecated=True, - ) - version( - "0.1.4", - sha256="9b2a3436efe3c8060ee4882f3ed37d848ee79a63d6055a71a23fad6409559f40", - deprecated=True, - ) - version( - "0.1.3", - sha256="93c3194bb7d518c215e79436bfb43304683832b3cc66bfc838f6195ce4574943", - deprecated=True, - ) - - depends_on("python@2.7:") - depends_on("llvm@3.5:") - depends_on("cmake@2.8:", type="build") - - def cmake_args(self): - args = ["-DLLVM_DEV_DIR=%s" % self.spec["llvm"].prefix] - return args diff --git a/var/spack/repos/builtin/packages/stdexec/package.py b/var/spack/repos/builtin/packages/stdexec/package.py index 95b6707b1c51eb..464dfa911782d9 100644 --- a/var/spack/repos/builtin/packages/stdexec/package.py +++ b/var/spack/repos/builtin/packages/stdexec/package.py @@ -16,6 +16,7 @@ class Stdexec(CMakePackage): license("Apache-2.0") + version("24.09", sha256="d2d811c852dc6c53527a244a54ae343d6b65a50c23ea49f93723e3082435fff4") version("23.03", sha256="2c9dfb6e56a190543049d2300ccccd1b626f4bb82af5b607869c626886fadd15") version("main", branch="main") diff --git a/var/spack/repos/builtin/packages/strace/package.py b/var/spack/repos/builtin/packages/strace/package.py index 6fd298cfff9b40..8a615b2bdb5848 100644 --- a/var/spack/repos/builtin/packages/strace/package.py +++ b/var/spack/repos/builtin/packages/strace/package.py @@ -13,12 +13,13 @@ class Strace(AutotoolsPackage): signal deliveries, and changes of process state.""" homepage = "https://strace.io" - url = "https://github.com/strace/strace/releases/download/v5.2/strace-5.2.tar.xz" + url = "https://github.com/strace/strace/releases/download/v6.11/strace-6.11.tar.xz" maintainers("michaelkuhn") license("BSD-3-Clause") + version("6.11", sha256="83262583a3529f02c3501aa8b8ac772b4cbc03dc934e98bab6e4883626e283a5") version("5.19", sha256="aa3dc1c8e60e4f6ff3d396514aa247f3c7bf719d8a8dc4dd4fa793be786beca3") version("5.17", sha256="5fb298dbd1331fd1e1bc94c5c32395860d376101b87c6cd3d1ba9f9aa15c161f") version("5.12", sha256="29171edf9d252f89c988a4c340dfdec662f458cb8c63d85431d64bab5911e7c4") @@ -36,14 +37,18 @@ class Strace(AutotoolsPackage): version("5.0", sha256="3b7ad77eb2b81dc6078046a9cc56eed5242b67b63748e7fc28f7c2daf4e647da") version("4.21", sha256="5c7688db44073e94c59a5627744e5699454419824cc8166e8bcfd7ec58375c37") - depends_on("c", type="build") # generated + variant("mpers", default=False, description="Enable multiple personalities support") - conflicts("platform=darwin", msg="strace runs only on Linux.") + depends_on("c", type="build") + depends_on("gawk", when="+mpers", type="build") + + conflicts("platform=darwin", msg="strace runs only on Linux") + conflicts("platform=windows", msg="strace runs only on Linux") def configure_args(self): args = [] - if self.spec.target.family == "aarch64": - args.append("--enable-mpers=no") - else: + if self.spec.satisfies("+mpers"): args.append("--enable-mpers=yes") + else: + args.append("--enable-mpers=no") return args diff --git a/var/spack/repos/builtin/packages/su2/package.py b/var/spack/repos/builtin/packages/su2/package.py index 5ec32895a40db6..4b0d056ae75cf3 100644 --- a/var/spack/repos/builtin/packages/su2/package.py +++ b/var/spack/repos/builtin/packages/su2/package.py @@ -38,6 +38,9 @@ class Su2(MesonPackage): version("7.0.0", sha256="6207dcca15eaebc11ce12b2866c937b4ad9b93274edf6f23d0487948ac3963b8") version("6.2.0", sha256="ffc953326e8432a1a6534556a5f6cf086046d3149cfcec6b4e7390eebe30ce2e") + # @:7 is missing few includes, causing a few files to fail with %gcc@13: + conflicts("%gcc@13:", when="@:7") + depends_on("c", type="build") # generated depends_on("cxx", type="build") # generated depends_on("fortran", type="build") # generated @@ -60,6 +63,8 @@ class Su2(MesonPackage): depends_on("meson@0.61.1:", type=("build")) depends_on("python@3:", type=("build", "run")) + depends_on("py-numpy", type="run") + depends_on("py-scipy", type="run") depends_on("zlib-api") depends_on("pkgconfig") depends_on("mpi", when="+mpi") @@ -69,14 +74,12 @@ class Su2(MesonPackage): depends_on("openblas", when="+openblas ~mkl") depends_on("cmake", type="build", when="+mpp") - depends_on("codipack@:1.9.3", when="+autodiff") - depends_on("codipack@:1.9.3", when="+directdiff") - depends_on("medipack", when="+autodiff +mpi") - depends_on("medipack", when="+directdiff +mpi") + for diff_type in ("+autodiff", "+directdiff"): + with when(diff_type): + depends_on("codipack@1.9.3", when="@:7.5.1") + depends_on("codipack@2.2.0:", when="@8.0.0:") + depends_on("medipack", when="+mpi") depends_on("opdilib", when="+autodiff +openmp") - depends_on("opdilib", when="+directdiff +openmp") - depends_on("codipack@openmp", when="+autodiff +openmp") - depends_on("codipack@openmp", when="+directdiff +openmp") # Remove the part that fixes the meson version to 0.61.1. # This fix is considered meaningless and will be removed in the next version(@7.6:) of SU2. @@ -93,17 +96,13 @@ def patch(self): "meson.build", ) - if ( - self.spec.satisfies("+autodiff") or self.spec.satisfies("+directdiff") - ) and self.spec.satisfiles("+mpi"): - filter_file( - "externals/medi/include", self.spec["medipack"].prefix.include, "meson.build" - ) - filter_file("externals/medi/src", self.spec["medipack"].prefix.src, "meson.build") + if self.spec.satisfies("+mpi"): + filter_file( + "externals/medi/include", self.spec["medipack"].prefix.include, "meson.build" + ) + filter_file("externals/medi/src", self.spec["medipack"].prefix.src, "meson.build") - if ( - self.spec.satisfies("+autodiff") or self.spec.satisfies("+directdiff") - ) and self.spec.satisfies("+openmp"): + if self.spec.satisfies("+autodiff") and self.spec.satisfies("+openmp"): filter_file( "externals/opdi/include", self.spec["opdilib"].prefix.include, "meson.build" ) @@ -113,6 +112,13 @@ def patch(self): "meson.build", ) + if self.spec.satisfies("+mpp") and self.spec.satisfies("@8.0:"): + filter_file( + r"join_paths\(meson\.project_source_root\(\), 'ninja'\)", + f"join_paths('{self.spec['ninja'].prefix.bin}', 'ninja')", + "meson.build", + ) + def meson_args(self): args = [ "-Dwith-omp={}".format("+openmp" in self.spec), @@ -123,16 +129,39 @@ def meson_args(self): "-Denable-pywrapper={}".format("+pywrapper" in self.spec), "-Denable-mkl={}".format("+mkl" in self.spec), "-Denable-openblas={}".format("+openblas" in self.spec), - "-Denable-mpp={}".format("+mpp" in self.spec), "-Denable-mixedprec={}".format("+midexprec" in self.spec), ] + if self.spec.version >= Version("7.1.0"): + args.append("-Denable-mpp={}".format("+mpp" in self.spec)) if "+mkl" in self.spec: args.append("-Dmkl_root=" + self.spec["intel-oneapi-mkl"].prefix) if "+mpi" in self.spec: - args.append("-Dwith-mpi=enabled") + args.append("-Dwith-mpi=auto") else: args.append("-Dwith-mpi=disabled") return args + + @run_after("install") + def install_mpp(self): + if "+mpp" in self.spec: + mkdirp(join_path(self.prefix, "mpp-data")) + mkdirp(join_path(self.prefix, "lib")) + install_tree( + join_path(self.stage.source_path, "subprojects", "Mutationpp", "data"), + join_path(self.prefix, "mpp-data"), + ) + install_tree( + join_path(self.build_directory, "subprojects", "Mutationpp"), self.prefix.lib + ) + + def setup_run_environment(self, env): + env.set("su2_run", self.prefix.bin) + env.set("su2_home", self.prefix) + env.prepend_path("path", self.prefix.bin) + env.prepend_path("pythonpath", self.prefix.bin) + if "+mpp" in self.spec: + env.set("mpp_data_directory", join_path(self.prefix, "mpp-data")) + env.prepend_path("ld_library_path", self.prefix.lib) diff --git a/var/spack/repos/builtin/packages/suite-sparse/package.py b/var/spack/repos/builtin/packages/suite-sparse/package.py index dfdb8ae91023be..8b72df6f2dbeb3 100644 --- a/var/spack/repos/builtin/packages/suite-sparse/package.py +++ b/var/spack/repos/builtin/packages/suite-sparse/package.py @@ -127,32 +127,44 @@ def symbol_suffix_blas(self, spec, args): return symbols = ( - "dtrsv_", - "dgemv_", - "dtrsm_", + "cgemm_", + "cgemv_", + "cherk_", + "cpotrf_", + "ctrsm_", + "ctrsv_", "dgemm_", - "dsyrk_", + "dgemv_", "dger_", - "dscal_", - "dpotrf_", - "ztrsv_", - "zgemv_", - "ztrsm_", - "zgemm_", - "zherk_", - "zgeru_", - "zscal_", - "zpotrf_", - "dnrm2_", "dlarf_", + "dlarfb_", "dlarfg_", "dlarft_", - "dlarfb_", + "dnrm2_", + "dpotrf_", + "dscal_", + "dsyrk_", + "dtrsm_", + "dtrsv_", "dznrm2_", + "sgemm_", + "sgemv_", + "spotrf_", + "ssyrk_", + "strsm_", + "strsv_", + "zgemm_", + "zgemv_", + "zgeru_", + "zherk_", "zlarf_", + "zlarfb_", "zlarfg_", "zlarft_", - "zlarfb_", + "zpotrf_", + "zscal_", + "ztrsm_", + "ztrsv_", ) for symbol in symbols: diff --git a/var/spack/repos/builtin/packages/sundials/package.py b/var/spack/repos/builtin/packages/sundials/package.py index 13b6c6200ac30e..5be35b6bb04bb6 100644 --- a/var/spack/repos/builtin/packages/sundials/package.py +++ b/var/spack/repos/builtin/packages/sundials/package.py @@ -201,7 +201,6 @@ class Sundials(CMakePackage, CudaPackage, ROCmPackage): # External libraries incompatible with 64-bit indices conflicts("+lapack", when="@3.0.0: +int64") - conflicts("+hypre", when="+hypre@:2.6.1a +int64") # External libraries incompatible with single precision conflicts("+klu", when="precision=single") diff --git a/var/spack/repos/builtin/packages/sys-sage/package.py b/var/spack/repos/builtin/packages/sys-sage/package.py index cc5c1895b38e7d..6318c11868e07e 100644 --- a/var/spack/repos/builtin/packages/sys-sage/package.py +++ b/var/spack/repos/builtin/packages/sys-sage/package.py @@ -17,6 +17,7 @@ class SysSage(CMakePackage): license("Apache-2.0") + version("0.5.0", sha256="044e53bf0f3873325fa4dedb510849d58b23b5a2c654d41b1389a318b2cb7ee1") version("0.4.3", sha256="e24313c4274576c1511a62e1b27c86a78cea7e4c123b8a53303cfc70de978faa") version("master", branch="master") version("develop", branch="develop") diff --git a/var/spack/repos/builtin/packages/sysstat/package.py b/var/spack/repos/builtin/packages/sysstat/package.py index c70c052a5a3b6f..16940d34121c61 100644 --- a/var/spack/repos/builtin/packages/sysstat/package.py +++ b/var/spack/repos/builtin/packages/sysstat/package.py @@ -17,8 +17,16 @@ class Sysstat(AutotoolsPackage): license("GPL-2.0-or-later") - version("12.4.5", sha256="4e35abdd9eaf766ecdab55786f459093f3e1c350db23e57a15561afda417ff0d") - version("12.2.0", sha256="614ab9fe8e7937a3edb7b2b6760792a3764ea3a7310ac540292dd0e3dfac86a6") + version("12.7.6", sha256="dc77a08871f8e8813448ea31048833d4acbab7276dd9a456cd2526c008bd5301") + with default_args(deprecated=True): + # https://nvd.nist.gov/vuln/detail/CVE-2023-33204 + # https://nvd.nist.gov/vuln/detail/CVE-2022-39377 + version( + "12.4.5", sha256="4e35abdd9eaf766ecdab55786f459093f3e1c350db23e57a15561afda417ff0d" + ) + version( + "12.2.0", sha256="614ab9fe8e7937a3edb7b2b6760792a3764ea3a7310ac540292dd0e3dfac86a6" + ) depends_on("c", type="build") # generated diff --git a/var/spack/repos/builtin/packages/systemd/package.py b/var/spack/repos/builtin/packages/systemd/package.py index da78562d9537d4..16f07dca8314c6 100644 --- a/var/spack/repos/builtin/packages/systemd/package.py +++ b/var/spack/repos/builtin/packages/systemd/package.py @@ -17,6 +17,7 @@ class Systemd(MesonPackage): url = "https://github.com/systemd/systemd/archive/refs/tags/v255.tar.gz" license("GPL-2.0-only") + version("256.7", sha256="896d76ff65c88f5fd9e42f90d152b0579049158a163431dd77cdc57748b1d7b0") version("255", sha256="28854ffb2cb5f9e07fcbdbaf1e03a80b3462a12edeef84893ca2f37b22e4491e") depends_on("c", type="build") # generated diff --git a/var/spack/repos/builtin/packages/sz3/package.py b/var/spack/repos/builtin/packages/sz3/package.py index 5722cced398384..9a1e3a0d0fbb22 100644 --- a/var/spack/repos/builtin/packages/sz3/package.py +++ b/var/spack/repos/builtin/packages/sz3/package.py @@ -12,10 +12,11 @@ class Sz3(CMakePackage): homepage = "https://github.com/szcompressor/SZ3" git = "https://github.com/szcompressor/SZ3" - maintainers("disheng222") + maintainers("disheng222", "robertu94") tags = ["e4s"] version("master") + version("3.2.0", commit="b3dab4018425803a55d8073dc55dade7fa46b7b4") version("3.1.8", commit="e308ebf8528c233286874b920c72c0a6c0218fb2") version("3.1.7", commit="c49fd17f2d908835c41000c1286c510046c0480e") version("3.1.5.4", commit="4c6ddf628f27d36b28d1bbda02174359cd05573d") diff --git a/var/spack/repos/builtin/packages/tandem/package.py b/var/spack/repos/builtin/packages/tandem/package.py index 3211f5724f4f99..04bb2b915bf031 100644 --- a/var/spack/repos/builtin/packages/tandem/package.py +++ b/var/spack/repos/builtin/packages/tandem/package.py @@ -45,6 +45,7 @@ class Tandem(CMakePackage, CudaPackage, ROCmPackage): description="Minimum order of quadrature rule, 0 = automatic", ) variant("libxsmm", default=False, description="Install libxsmm-generator") + variant("python", default=False, description="installs python and numpy") depends_on("mpi") @@ -61,14 +62,35 @@ class Tandem(CMakePackage, CudaPackage, ROCmPackage): depends_on("eigen@3.4.0") depends_on("zlib-api") - depends_on("petsc@3.14.6:3.18.5 +int64 +mumps +scalapack memalign=32") - depends_on("petsc@3.14.6:3.18.5 +int64 +mumps +scalapack +knl", when="target=skylake:") - depends_on("petsc@3.14.6:3.18.5 +int64 +mumps +scalapack memalign=32 +cuda", when="+cuda") - depends_on("petsc@3.14.6:3.18.5 +int64 +mumps +scalapack memalign=32 +rocm", when="+rocm") + depends_on("petsc@3.16: +int64 +mumps +scalapack memalign=32") + depends_on("petsc +knl", when="target=skylake:") + + with when("+cuda"): + for tgt in CudaPackage.cuda_arch_values: + depends_on(f"petsc +cuda cuda_arch={tgt}", when=f"+cuda cuda_arch={tgt}") + with when("+rocm"): + for tgt in ROCmPackage.amdgpu_targets: + depends_on(f"petsc +rocm amdgpu_target={tgt}", when=f"+rocm amdgpu_target={tgt}") + + depends_on("python@3", type="build", when="+python") + depends_on("py-numpy", type="build", when="+python") # see https://github.com/TEAR-ERC/tandem/issues/45 conflicts("%intel") + # GPU architecture requirements + conflicts( + "cuda_arch=none", + when="+cuda", + msg="A value for cuda_arch must be specified. Add cuda_arch=XX", + ) + + conflicts( + "amdgpu_target=none", + when="+rocm", + msg="A value for amdgpu_arch must be specified. Add amdgpu_arch=XX", + ) + def cmake_args(self): args = [ self.define_from_variant("DOMAIN_DIMENSION", "domain_dimension"), diff --git a/var/spack/repos/builtin/packages/tau/package.py b/var/spack/repos/builtin/packages/tau/package.py index fd499910dd1ad6..94d939c03fd6f5 100644 --- a/var/spack/repos/builtin/packages/tau/package.py +++ b/var/spack/repos/builtin/packages/tau/package.py @@ -79,23 +79,39 @@ class Tau(Package): variant("pdt", default=True, description="Use PDT for source code instrumentation") variant("comm", default=False, description=" Generate profiles with MPI communicator info") variant("python", default=False, description="Activates Python support") - variant("likwid", default=False, description="Activates LIKWID support") + variant("likwid", default=False, description="Activates LIKWID support", when="@2.27") variant("ompt", default=False, description="Activates OMPT instrumentation") variant("opari", default=False, description="Activates Opari2 instrumentation") variant("shmem", default=False, description="Activates SHMEM support") variant("gasnet", default=False, description="Activates GASNET support") variant("cuda", default=False, description="Activates CUDA support") - variant("rocm", default=False, description="Activates ROCm support") - variant("level_zero", default=False, description="Activates Intel OneAPI Level Zero support") - variant("rocprofiler", default=False, description="Activates ROCm rocprofiler support") - variant("roctracer", default=False, description="Activates ROCm roctracer support") - variant("rocprofv2", default=False, description="Activates ROCm rocprofiler support") + variant("rocm", default=False, description="Activates ROCm support", when="@2.28:") + variant( + "level_zero", + default=False, + description="Activates Intel OneAPI Level Zero support", + when="@2.30:", + ) + variant( + "rocprofiler", + default=False, + description="Activates ROCm rocprofiler support", + when="@2.29.1:", + ) + variant( + "roctracer", default=False, description="Activates ROCm roctracer support", when="@2.28.1:" + ) + variant( + "rocprofv2", default=False, description="Activates ROCm rocprofiler support", when="@2.34:" + ) variant("opencl", default=False, description="Activates OpenCL support") variant("fortran", default=darwin_default, description="Activates Fortran support") variant("io", default=True, description="Activates POSIX I/O support") - variant("adios2", default=False, description="Activates ADIOS2 output support") + variant( + "adios2", default=False, description="Activates ADIOS2 output support", when="@2.26.3:" + ) variant("sqlite", default=False, description="Activates SQLite3 output support") - variant("syscall", default=False, description="Activates syscall wrapper") + variant("syscall", default=False, description="Activates syscall wrapper", when="@2.33:") variant( "profileparam", default=False, diff --git a/var/spack/repos/builtin/packages/tecplot/package.py b/var/spack/repos/builtin/packages/tecplot/package.py index c11d28d9a1be44..ba5e2745bcdc9b 100644 --- a/var/spack/repos/builtin/packages/tecplot/package.py +++ b/var/spack/repos/builtin/packages/tecplot/package.py @@ -19,6 +19,11 @@ class Tecplot(Package): maintainers("LRWeber") + version( + "2024r1", + sha256="709022a5d5532d46a47cfa3bf0698a4ea8428c7a0dea2feb708a5add8091a8f0", + expand=False, + ) version( "2023r1", sha256="58e7f4de875e65047f4edd684013d0ff538df6246f00c059458989f281be4c93", diff --git a/var/spack/repos/builtin/packages/tempo/package.py b/var/spack/repos/builtin/packages/tempo/package.py index 8f71bd661cd745..9b89bc8b06e4b7 100644 --- a/var/spack/repos/builtin/packages/tempo/package.py +++ b/var/spack/repos/builtin/packages/tempo/package.py @@ -9,9 +9,19 @@ class Tempo(AutotoolsPackage): """Tempo is a program for pulsar timing data analysis.""" - homepage = "https://tempo.sourceforge.net/" - git = "git://git.code.sf.net/p/tempo/tempo.git" + # Warning: Tempo references reads files that it's shipped with. + # It's written in Fortran and the fortran code declares strings of a certain length + # for those files. If you haven't modified some of the Spack configurations + # in terms of where the install go, hash length, etc. then it is likely + # that running tempo will fail with an error similar to + # + # more: cannot open /...../gcc-11.3.0/tempo-master-lnizs: No such file or directory + # + homepage = "http://tempo.sourceforge.net/" + git = "https://git.code.sf.net/p/tempo/tempo.git" + + version("master", branch="master", preferred=True) version("develop") version("LWA-10-17-2020", commit="6bab1083350eca24745eafed79a55156bdd1e7d5") @@ -22,5 +32,40 @@ class Tempo(AutotoolsPackage): depends_on("automake", type="build") depends_on("libtool", type="build") - def setup_dependent_run_environment(self, spack_env, dependent_spec): - spack_env.set("TEMPO_DIR", self.prefix) + @run_before("configure") + def edit(self): + # By default tempo.cfg.in uses abs_top_srcdir (i.e., the staging/build directory) + # In spack this directory gets deleted by default so make the file use the + # Install prefix directory instead but only for the master version + # So we don't possibly break anything for the LWA version + if "master" in str(self.version): + tempocfg = FileFilter("tempo.cfg.in") + tempocfg.filter(r"(.*)(abs_top_srcdir)(.*)", r"\1prefix\3") + + @run_after("install") + def post_install_packages(self): + + # Copy some files over needed by TEMPO, again only for the master version + if "master" in str(self.version): + cd(self.stage.source_path) + cp = which("cp") + + cp("obsys.dat", join_path(self.prefix, "obsys.dat")) + cp("tempo.hlp", join_path(self.prefix, "tempo.hlp")) + cp("tempo.cfg", join_path(self.prefix, "tempo.cfg")) + + cp("-r", "clock", join_path(self.prefix, "clock")) + cp("-r", "ephem", join_path(self.prefix, "ephem")) + cp("-r", "tzpar", join_path(self.prefix, "tzpar")) + + def setup_dependent_build_environment(self, env, dependent_spec): + env.set("TEMPO", self.prefix) + + def setup_dependent_run_environment(self, env, dependent_spec): + env.set("TEMPO", self.prefix) + + # For LWA-10-17-2020 version + env.set("TEMPO_DIR", self.prefix) + + def setup_run_environment(self, env): + env.set("TEMPO", self.prefix) diff --git a/var/spack/repos/builtin/packages/testdfsio/package.py b/var/spack/repos/builtin/packages/testdfsio/package.py index f002893c21c431..cbe7e75fc39bfd 100644 --- a/var/spack/repos/builtin/packages/testdfsio/package.py +++ b/var/spack/repos/builtin/packages/testdfsio/package.py @@ -10,9 +10,13 @@ class Testdfsio(MavenPackage): """A corrected and enhanced version of Apache Hadoop TestDFSIO""" - homepage = "https://github.com/tthx/testdfsio" - url = "https://github.com/tthx/testdfsio/archive/0.0.1.tar.gz" + homepage = "https://github.com/asotirov0/testdfsio" + url = "https://github.com/asotirov0/testdfsio/archive/0.0.1.tar.gz" - version("0.0.1", sha256="fe8cc47260ffb3e3ac90e0796ebfe73eb4dac64964ab77671e5d32435339dd09") + version( + "0.0.1", + sha256="fe8cc47260ffb3e3ac90e0796ebfe73eb4dac64964ab77671e5d32435339dd09", + deprecated=True, + ) depends_on("hadoop@3.2.1:", type="run") diff --git a/var/spack/repos/builtin/packages/texlive/package.py b/var/spack/repos/builtin/packages/texlive/package.py index 27e580cf4c3145..7accb43e8e5aa9 100644 --- a/var/spack/repos/builtin/packages/texlive/package.py +++ b/var/spack/repos/builtin/packages/texlive/package.py @@ -19,14 +19,26 @@ class Texlive(AutotoolsPackage): homepage = "https://www.tug.org/texlive" url = "https://ftp.math.utah.edu/pub/tex/historic/systems/texlive/2020/texlive-20200406-source.tar.xz" - base_url = "http://ftp.math.utah.edu/pub/tex/historic/systems/texlive/{year}/texlive-{version}-{dist}.tar.xz" - list_url = "http://ftp.math.utah.edu/pub/tex/historic/systems/texlive" + base_url = "https://ftp.math.utah.edu/pub/tex/historic/systems/texlive/{year}/texlive-{version}-{dist}.tar.xz" + list_url = "https://ftp.math.utah.edu/pub/tex/historic/systems/texlive" list_depth = 1 license("GPL-2.0-or-later AND GPL-3.0-or-later", checked_by="tgamblin") # Add information for new versions below. releases = [ + { + "version": "20240312", + "year": "2024", + "sha256_source": "7b6d87cf01661670fac45c93126bed97b9843139ed510f975d047ea938b6fe96", + "sha256_texmf": "c8eae2deaaf51e86d93baa6bbcc4e94c12aa06a0d92893df474cc7d2a012c7a7", + }, + { + "version": "20230313", + "year": "2023", + "sha256_source": "3878aa0e1ed0301c053b0e2ee4e9ad999c441345f4882e79bdd1c8f4ce9e79b9", + "sha256_texmf": "4c4dc77a025acaad90fb6140db2802cdb7ca7a9a2332b5e3d66aa77c43a81253", + }, { "version": "20220321", "year": "2022", @@ -92,6 +104,7 @@ class Texlive(AutotoolsPackage): depends_on("teckit") depends_on("zlib-api") depends_on("zziplib") + depends_on("lua-lpeg", when="@20240312:") build_directory = "spack-build" @@ -140,9 +153,17 @@ def setup_texlive(self): # Create and run setup utilities fmtutil_sys = Executable(join_path(self.prefix.bin, self.tex_arch(), "fmtutil-sys")) mktexlsr = Executable(join_path(self.prefix.bin, self.tex_arch(), "mktexlsr")) - mtxrun = Executable(join_path(self.prefix.bin, self.tex_arch(), "mtxrun")) mktexlsr() fmtutil_sys("--all") + if self.spec.satisfies("@:2023"): + mtxrun = Executable(join_path(self.prefix.bin, self.tex_arch(), "mtxrun")) + else: + mtxrun_lua = join_path( + self.prefix, "texmf-dist", "scripts", "context", "lua", "mtxrun.lua" + ) + chmod = which("chmod") + chmod("+x", mtxrun_lua) + mtxrun = Executable(mtxrun_lua) mtxrun("--generate") def setup_build_environment(self, env): diff --git a/var/spack/repos/builtin/packages/tinker/package.py b/var/spack/repos/builtin/packages/tinker/package.py index 1d26543d8d547e..8d3bcb7f3b2a9f 100644 --- a/var/spack/repos/builtin/packages/tinker/package.py +++ b/var/spack/repos/builtin/packages/tinker/package.py @@ -16,7 +16,13 @@ class Tinker(CMakePackage): homepage = "https://dasher.wustl.edu/tinker/" url = "https://dasher.wustl.edu/tinker/downloads/tinker-8.7.1.tar.gz" - version("8.7.1", sha256="0d6eff8bbc9be0b37d62b6fd3da35bb5499958eafe67aa9c014c4648c8b46d0f") + version("8.7.2", sha256="f9e94ae0684d527cd2772a4a7a05c41864ce6246f1194f6c1c402a94598151c2") + version( + "8.7.1", + sha256="0d6eff8bbc9be0b37d62b6fd3da35bb5499958eafe67aa9c014c4648c8b46d0f", + deprecated=True, + ) + patch("tinker-8.7.1-cmake.patch") depends_on("fftw") diff --git a/var/spack/repos/builtin/packages/tl-expected/package.py b/var/spack/repos/builtin/packages/tl-expected/package.py index 0bd6107cfc9c93..bffc895b9e2615 100644 --- a/var/spack/repos/builtin/packages/tl-expected/package.py +++ b/var/spack/repos/builtin/packages/tl-expected/package.py @@ -10,18 +10,20 @@ class TlExpected(CMakePackage): """C++11/14/17 std::expected with functional-style extensions.""" homepage = "https://tl.tartanllama.xyz/en/latest/" - url = "https://github.com/TartanLlama/expected/archive/1.0.0.tar.gz" + url = "https://github.com/TartanLlama/expected/archive/refs/tags/v1.0.0.tar.gz" git = "https://github.com/TartanLlama/expected.git" maintainers("charmoniumQ") - license("CC0-1.0") + license("CC0-1.0", checked_by="wdconinc") - # Note that the 1.0.0 has this issue: - # https://github.com/TartanLlama/expected/issues/114 - # But no new patch version has been released, - # so I will use the latest commit at the time of writing: - version("2022-11-24", commit="b74fecd4448a1a5549402d17ddc51e39faa5020c") + version("1.1.0", sha256="1db357f46dd2b24447156aaf970c4c40a793ef12a8a9c2ad9e096d9801368df6") + with default_args(deprecated=True): + # Note that the 1.0.0 has this issue: + # https://github.com/TartanLlama/expected/issues/114 + # But no new patch version has been released, + # so I will use the latest commit at the time of writing: + version("2022-11-24", commit="b74fecd4448a1a5549402d17ddc51e39faa5020c") version("1.0.0", sha256="8f5124085a124113e75e3890b4e923e3a4de5b26a973b891b3deb40e19c03cee") - depends_on("cxx", type="build") # generated + depends_on("cxx", type="build") diff --git a/var/spack/repos/builtin/packages/tmux/package.py b/var/spack/repos/builtin/packages/tmux/package.py index 11c1f7fa5045ee..0fa3d96bc4fef3 100644 --- a/var/spack/repos/builtin/packages/tmux/package.py +++ b/var/spack/repos/builtin/packages/tmux/package.py @@ -64,6 +64,12 @@ class Tmux(AutotoolsPackage): conflicts("+static", when="platform=darwin", msg="Static build not supported on MacOS") + patch( + "https://github.com/tmux/tmux/commit/775789fbd5c4f3aa93061480cd64e61daf7fb689.patch?full_index=1", + sha256="c1b61a1244f758480578888d3f89cac470271c376ea0879996b81e10b397cad0", + when="@2.4:", + ) + @run_before("autoreconf") def autogen(self): if self.spec.satisfies("@master"): diff --git a/var/spack/repos/builtin/packages/tomcat/package.py b/var/spack/repos/builtin/packages/tomcat/package.py index b3f69890ede536..0b11a910c69028 100644 --- a/var/spack/repos/builtin/packages/tomcat/package.py +++ b/var/spack/repos/builtin/packages/tomcat/package.py @@ -14,19 +14,44 @@ class Tomcat(Package): """ homepage = "https://tomcat.apache.org/" - url = "https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.30/bin/apache-tomcat-9.0.30.tar.gz" + url = ( + "https://archive.apache.org/dist/tomcat/tomcat-11/v11.0.0/bin/apache-tomcat-11.0.0.tar.gz" + ) license("Apache-2.0") - version("9.0.30", sha256="43a9b268671bbd3aace427637fbf577e742b521901e111342321ae901478100b") - version("9.0.29", sha256="1bf634413326ec96972fc1c3ac6666e8e4cab49ad3fc9f5e3228b85208d9c4b0") - version("9.0.27", sha256="6616a150e1593ef1a622298aaef9b889db70c8ee5122d35ad52adfcda1084d10") - version("9.0.26", sha256="b5430890d3b986d6b7ec6a6ef611f9451cbfa933b0a1a3dd48e2cd1f46a63381") - version("9.0.24", sha256="22064138e25f7ab899802804775259a156c06770535b8ce93856beba13dfcf6d") + version("11.0.0", sha256="d0ca319af349838f59009a9c5ed3709f02344201059dbc26dce4313ee969cd20") + version("10.1.31", sha256="06f6e2e11ef5afb435a4b27e1e264ebcdbafd95389f5ee37e425dc135ed325d4") + version( + "9.0.96", + sha256="bf4ad04955457ad663157876461015437a7479546aec9a38840d736b3d70151f", + preferred=True, + ) + with default_args(deprecated=True): + # https://nvd.nist.gov/vuln/detail/CVE-2023-46589 + version( + "9.0.30", sha256="43a9b268671bbd3aace427637fbf577e742b521901e111342321ae901478100b" + ) + version( + "9.0.29", sha256="1bf634413326ec96972fc1c3ac6666e8e4cab49ad3fc9f5e3228b85208d9c4b0" + ) + version( + "9.0.27", sha256="6616a150e1593ef1a622298aaef9b889db70c8ee5122d35ad52adfcda1084d10" + ) + version( + "9.0.26", sha256="b5430890d3b986d6b7ec6a6ef611f9451cbfa933b0a1a3dd48e2cd1f46a63381" + ) + version( + "9.0.24", sha256="22064138e25f7ab899802804775259a156c06770535b8ce93856beba13dfcf6d" + ) + + # https://tomcat.apache.org/whichversion.html + depends_on("java@8:", type="run", when="@9:") + depends_on("java@11:", type="run", when="@10:") + depends_on("java@17:", type="run", when="@11:") def url_for_version(self, version): - url = "https://archive.apache.org/dist/tomcat/tomcat-9/v{0}/bin/apache-tomcat-{0}.tar.gz" - return url.format(version) + return f"https://archive.apache.org/dist/tomcat/tomcat-{version.up_to(1)}/v{version}/bin/apache-tomcat-{version}.tar.gz" def install(self, spec, prefix): install_tree(".", prefix) diff --git a/var/spack/repos/builtin/packages/totalview/package.py b/var/spack/repos/builtin/packages/totalview/package.py index ea1c84b9e6685a..fa209ce916be34 100644 --- a/var/spack/repos/builtin/packages/totalview/package.py +++ b/var/spack/repos/builtin/packages/totalview/package.py @@ -3,184 +3,61 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) -import os - from spack.package import * class Totalview(Package): """Totalview parallel debugger. - Source must be made available to Spack - externally, either by having the tarballs in the current working directory - or having the tarballs in a Spack mirror. - - The documentation tarball will - be used as the primary source and the architecture appropriate tarball will - be downloaded as a resource.""" + Select the version associated with your machine architecture' + '.""" homepage = "https://totalview.io" - maintainers("dshrader", "petertea") - manual_download = True + maintainers("dshrader", "petertea", "suzannepaterno", "elliebinkley") license_required = True license_comment = "#" - license_files = ["licenses/license.dat", "licenses/tv_license_file"] - license_vars = ["LM_LICENSE_FILE", "TV_LICENSE_FILE"] + license_files = ["tv_license/license.lic"] + license_vars = ["RLM_LICENSE"] # As the install of Totalview is via multiple tarballs, the base install # will be the documentation. The architecture-specific tarballs are added # as resources dependent on the specific architecture used. - version("2022.3.6", sha256="3f60714b8c885c562433e30c8bcde7e6383b3517664f37f25da7bf7f9110f308") - version("2022.2.13", sha256="4bf625c760454e532fe66666f2f5479d38f36f569f104bbe3341c0f48cbc8766") - version("2022.1.11", sha256="0042afdbb024b99350c395decf2606b6913479ab0117bfd7bd4252d91843ef69") - version("2021.4.10", sha256="c476288ebe1964e0803c7316975c71a957e52f45187b135bc1dc3b65491bb61d") - version("2021.3.9", sha256="fd947ce755e76a6a06747755aa61bedd0c1428999a46e920db9498ac930ddc29") - - # Distributed with Totalview - variant("memoryscape", default=True, description="Install memoryscape") - - # Because the actual source tarball is architecture dependent, the main - # download is the documentation tarball and the source is downloaded as a - # resource once the target architecture is known. - - # Version 2022.3.6 - resource( - name="x86-64", - url="file://totalview.2022.3.6-linux-x86-64.tar", - destination=".", - sha256="a2639c52bfd4c7484b728d6a0158239074ff0e0c52208a5452b12b878016a519", - when="@2022.3.6 platform=linux target=x86_64:", - ) - resource( - name="ppcle", - url="file://totalview_2022.3.6_linux_powerle.tar", - destination=".", - sha256="93771a6ce99cff6d11e8172ff57da16aed76ab8ad1804e1d18186fba6de945f7", - when="@2022.3.6 platform=linux target=ppc64le:", - ) - resource( - name="aarch64", - url="file://totalview_2022.3.6_linux_arm64.tar", - destination=".", - sha256="5c18a9a187196980f9bd0fbbb77bb8e5c1d51442188ca44d58a9c49329c98783", - when="@2022.3.6 platform=linux target=aarch64:", - ) - resource( - name="darwinx86", - url="file://totalview.2022.3.6-darwin-x86.tar", - destination=".", - sha256="f558877f7debbeeef200f587edf4cbba41b6bc8db5a0166757445cc652de8a33", - when="@2022.3.6 platform=darwin target=x86_64:", - ) - # Version 2022.2.13 - resource( - name="x86-64", - url="file://totalview.2022.2.13-linux-x86-64.tar", - destination=".", - sha256="aebd11b837ce18b8200859ea762caa56e2cea346daa114f2841aa0f05a422309", - when="@2022.2.13 platform=linux target=x86_64:", - ) - resource( - name="ppcle", - url="file://totalview_2022.2.13_linux_powerle.tar", - destination=".", - sha256="0136be160576b51b03e6409b06d6cc22b5535380894e0fdc6569e2238e12120e", - when="@2022.2.13 platform=linux target=ppc64le:", - ) - resource( - name="aarch64", - url="file://totalview_2022.2.13_linux_arm64.tar", - destination=".", - sha256="d82154222e1ae5fce0bb7abd19b6782494ecb1f76a9a5f38a19e9dcd40bd42aa", - when="@2022.2.13 platform=linux target=aarch64:", - ) - resource( - name="darwinx86", - url="file://totalview.2022.2.13-darwin-x86.tar", - destination=".", - sha256="abcad08e80967959f556cb9f2a7d6dfa7f38e33213fe56f7f3198ff94cd9f3fe", - when="@2022.2.13 platform=darwin target=x86_64:", + version( + "2024.2-x86-64", + sha256="b6d9cfd804ff1f6641fbd92f9730b34f62062ead9b1324eaf44f34ea78c69ef1", + url="https://dslwuu69twiif.cloudfront.net/totalview/2024.2/totalview_2024.2.11_linux_x86-64.tar", ) - # Version 2022.1.11 - resource( - name="x86-64", - url="file://totalview.2022.1.11-linux-x86-64.tar", - destination=".", - sha256="3ec9a7d702572dbbafa41726a036c94b549f9a5911ed6fd6aa55f7b377554bac", - when="@2022.1.11 platform=linux target=x86_64:", - ) - resource( - name="ppcle", - url="file://totalview_2022.1.11_linux_powerle.tar", - destination=".", - sha256="4c49546508f7e0b1a91bea3ea8d71f6f9dc76989c69a4fd78012a4ae8fa44aa6", - when="@2022.1.11 platform=linux target=ppc64le:", - ) - resource( - name="aarch64", - url="file://totalview_2022.1.11_linux_arm64.tar", - destination=".", - sha256="89407c043679d161b6e204fc4ad5686b7ac18742081a045f19388c7294e5ddbe", - when="@2022.1.11 platform=linux target=aarch64:", - ) - resource( - name="darwinx86", - url="file://totalview.2022.1.11-darwin-x86.tar", - destination=".", - sha256="3a99eda8b7be225e0b7596b3c52032809378c86ea736c88e915c0a0e8efedbe4", - when="@2022.1.11 platform=darwin target=x86_64:", + version( + "2024.2-powerle", + sha256="2bc1ef377e95f6f09d1f221a1dcc2f79415bad9e1e8403c647f38e2d383524d6", + url="https://dslwuu69twiif.cloudfront.net/totalview/2024.2/totalview_2024.2.11_linux_powerle.tar", ) - # Version 2021.4.10 - resource( - name="x86-64", - url="file://totalview.2021.4.10-linux-x86-64.tar", - destination=".", - sha256="7e5509b2cfb219100b0032304bdad7d422657c0736c386ba64bdb1bf11d10a1d", - when="@2021.4.10 platform=linux target=x86_64:", - ) - resource( - name="ppcle", - url="file://totalview_2021.4.10_linux_powerle.tar", - destination=".", - sha256="79e812d1cd600172c5ea29c4aa6fb660d293300683419af36dd0e52cd7e15d56", - when="@2021.4.10 platform=linux target=ppc64le:", - ) - resource( - name="aarch64", - url="file://totalview_2021.4.10_linux_arm64.tar", - destination=".", - sha256="46faaae1f33b4f4a20de345611092fbc65cd5759511c1fcf86ca71a0811c76fd", - when="@2021.4.10 platform=linux target=aarch64:", - ) - resource( - name="darwinx86", - url="file://totalview.2021.4.10-darwin-x86.tar", - destination=".", - sha256="adbf95f86763e3cc5ec51fd504f3172bdcbb42a7f1f4e73b17cacca002729ad2", - when="@2021.4.10 platform=darwin target=x86_64:", + version( + "2024.2-linux-arm64", + sha256="63f737e61c2fb7f4816bcfc1d00e9e7c39817455531abdd09500f953be4ac75d", + url="https://dslwuu69twiif.cloudfront.net/totalview/2024.2/totalview_2024.2.11_linux_arm64.tar", ) - # Version 2021.3 - resource( - name="x86_64", - url="file://totalview_2021.3.9_linux_x86-64.tar", - destination=".", - sha256="6315ca855e1bee14678c640c3c9c8207b4f66c91714dcedd4aed592354112b48", - when="@2021.3.9 platform=linux target=x86_64:", + version( + "2024.1-x86-64", + sha256="964b73e70cb9046ce320bb0f95891b05c96a59117e5243fdc269855831c7059b", + url="https://dslwuu69twiif.cloudfront.net/totalview/2024.1/totalview_2024.1.21_linux_x86-64.tar", ) - resource( - name="ppcle", - url="file://totalview_2021.3.9_linux_powerle.tar", - destination=".", - sha256="a7657b61895805024f5d4e7550796a485f98ce297a585583cdd20fe0b9b30bbb", - when="@2021.3.9 platform=linux target=ppc64le:", + + version( + "2024.1-powerle", + sha256="c4dd8a3099d4f6ed23a6646b1d091129e0bf0b10c7a0d7ec73bd767818bab39b", + url="https://dslwuu69twiif.cloudfront.net/totalview/2024.1/totalview_2024.1.21_linux_powerle.tar", ) - def url_for_version(self, version): - return "file://{0}/totalview.{1}-doc.tar".format(os.getcwd(), version) + version( + "2024.1-linux-arm64", + sha256="769527478dceb30855413970621f09a9dc54ef863ddaf75bb5a40142a54af346", + url="https://dslwuu69twiif.cloudfront.net/totalview/2024.1/totalview_2024.1.21_linux_arm64.tar", + ) def setup_run_environment(self, env): env.prepend_path( @@ -200,38 +77,23 @@ def install(self, spec, prefix): # Platform specification. if spec.target.family == "x86_64" and spec.platform == "linux": arg_list.extend(["-platform", "linux-x86-64"]) - elif spec.target.family == "x86_64" and spec.platform == "darwin": - arg_list.extend(["-platform", "darwin-x86"]) - elif spec.target.family == "x86": - arg_list.extend(["-platform", "linux-x86"]) elif spec.target.family == "aarch64": arg_list.extend(["-platform", "linux-arm64"]) elif spec.target.family == "ppc64le": arg_list.extend(["-platform", "linux-powerle"]) - elif spec.target.family == "ppc64": - arg_list.extend(["-platform", "linux-power"]) else: raise InstallError("Architecture {0} not permitted!".format(spec.target.family)) - # Docs are the "base" install used with every architecture. install_cmd.exe.extend(arg_list) - install_cmd("-install", "doc-pdf") # Run install script for totalview (which automatically installs memoryscape) - with working_dir("./totalview.{0}".format(self.version)): - install_cmd = which("./Install") - arg_list.extend(["-install", "totalview"]) - # TotalView automatically installs Memoryscape, so no need to add - - install_cmd.exe.extend(arg_list) - install_cmd() + install_cmd = which("./Install") + arg_list.extend(["-install", "totalview"]) + install_cmd.exe.extend(arg_list) + install_cmd() - # If a license file was created, link to FNE_license or FNP_license - symlink( - join_path(self.prefix, "licenses", "tv_license_file"), - join_path(self.prefix, "toolworks", "FNE_license", "tv_license_file"), - ) + # If a license file was created symlink( - join_path(self.prefix, "licenses", "license.dat"), - join_path(self.prefix, "toolworks", "FNP_license", "license.dat"), + join_path(self.prefix, "tv_license", "license.lic"), + join_path(self.prefix, "toolworks", "tv_license", "license.lic"), ) diff --git a/var/spack/repos/builtin/packages/trilinos/cstdint_gcc13.patch b/var/spack/repos/builtin/packages/trilinos/cstdint_gcc13.patch new file mode 100644 index 00000000000000..671720903a2eea --- /dev/null +++ b/var/spack/repos/builtin/packages/trilinos/cstdint_gcc13.patch @@ -0,0 +1,33 @@ +diff -Naur spack-src.orig/packages/kokkos/core/src/impl/Kokkos_MemoryPool.cpp spack-src/packages/kokkos/core/src/impl/Kokkos_MemoryPool.cpp +--- spack-src.orig/packages/kokkos/core/src/impl/Kokkos_MemoryPool.cpp 2024-09-02 10:53:10.022724683 +0200 ++++ spack-src/packages/kokkos/core/src/impl/Kokkos_MemoryPool.cpp 2024-09-02 10:57:03.312228742 +0200 +@@ -44,6 +44,7 @@ + + #include + ++#include + #include + #include + +diff -Naur spack-src.orig/packages/teuchos/core/src/Teuchos_BigUIntDecl.hpp spack-src/packages/teuchos/core/src/Teuchos_BigUIntDecl.hpp +--- spack-src.orig/packages/teuchos/core/src/Teuchos_BigUIntDecl.hpp 2024-09-02 10:53:50.098010896 +0200 ++++ spack-src/packages/teuchos/core/src/Teuchos_BigUIntDecl.hpp 2024-09-02 10:51:17.777157344 +0200 +@@ -42,6 +42,7 @@ + #ifndef TEUCHOS_BIG_UINT_DECL_HPP + #define TEUCHOS_BIG_UINT_DECL_HPP + ++#include + #include + + /*! \file Teuchos_BigUIntDecl.hpp +diff -Naur spack-src.orig/packages/teuchos/core/src/Teuchos_PrintDouble.cpp spack-src/packages/teuchos/core/src/Teuchos_PrintDouble.cpp +--- spack-src.orig/packages/teuchos/core/src/Teuchos_PrintDouble.cpp 2024-09-02 10:54:02.240401775 +0200 ++++ spack-src/packages/teuchos/core/src/Teuchos_PrintDouble.cpp 2024-09-02 10:51:34.110672927 +0200 +@@ -42,6 +42,7 @@ + #include "Teuchos_PrintDouble.hpp" + #include "Teuchos_BigUInt.hpp" + ++#include + #include + + namespace Teuchos { diff --git a/var/spack/repos/builtin/packages/trilinos/package.py b/var/spack/repos/builtin/packages/trilinos/package.py index 89ed6a184e4cf4..b186834b8af17d 100644 --- a/var/spack/repos/builtin/packages/trilinos/package.py +++ b/var/spack/repos/builtin/packages/trilinos/package.py @@ -80,6 +80,11 @@ class Trilinos(CMakePackage, CudaPackage, ROCmPackage): # Build options variant("complex", default=False, description="Enable complex numbers in Trilinos") + variant( + "cuda_constexpr", + default=False, + description="Enable relaxed constexpr functions for CUDA build", + ) variant("cuda_rdc", default=False, description="Turn on RDC for CUDA build") variant("rocm_rdc", default=False, description="Turn on RDC for ROCm build") variant( @@ -383,9 +388,6 @@ class Trilinos(CMakePackage, CudaPackage, ROCmPackage): # Fix: https://github.com/xiaoyeli/superlu_dist/commit/09cb1430f7be288fd4d75b8ed461aa0b7e68fefe # is not tagged yet. See discussion here https://github.com/trilinos/Trilinos/issues/11839 conflicts("+cuda +stokhos +superlu-dist") - # Cuda UVM must be enabled prior to 13.2 - # See https://github.com/spack/spack/issues/28869 - conflicts("~uvm", when="@:13.1 +cuda") # stokhos fails on xl/xl_r conflicts("+stokhos", when="%xl") @@ -406,7 +408,7 @@ class Trilinos(CMakePackage, CudaPackage, ROCmPackage): # ###################### Dependencies ########################## # External Kokkos - depends_on("kokkos@4.4.00", when="@master: +kokkos") + depends_on("kokkos@4.4.01", when="@master: +kokkos") depends_on("kokkos@4.3.01", when="@16.0.0 +kokkos") depends_on("kokkos@4.2.01", when="@15.1.0:15.1.1 +kokkos") depends_on("kokkos@4.1.00", when="@14.4.0:15.0.0 +kokkos") @@ -514,6 +516,7 @@ class Trilinos(CMakePackage, CudaPackage, ROCmPackage): "0001-use-the-gcnArchName-inplace-of-gcnArch-as-gcnArch-is.patch", when="@15.0.0 ^hip@6.0 +rocm", ) + patch("cstdint_gcc13.patch", when="@13.4.0:13.4.1 %gcc@13.0.0:") # Allow building with +teko gotype=long patch( @@ -1009,6 +1012,7 @@ def define_tpl(trilinos_name, spack_name, have_dep): [ define_kok_enable("CUDA_UVM", use_uvm), define_kok_enable("CUDA_LAMBDA", True), + define_kok_enable("CUDA_CONSTEXPR", "cuda_constexpr"), define_kok_enable("CUDA_RELOCATABLE_DEVICE_CODE", "cuda_rdc"), ] ) diff --git a/var/spack/repos/builtin/packages/umoci/package.py b/var/spack/repos/builtin/packages/umoci/package.py index 544c7dbefef9a8..6695b7d31ddd41 100644 --- a/var/spack/repos/builtin/packages/umoci/package.py +++ b/var/spack/repos/builtin/packages/umoci/package.py @@ -12,24 +12,23 @@ class Umoci(MakefilePackage): complete manipulation tool for OCI images.""" homepage = "https://umo.ci/" - url = "https://github.com/openSUSE/umoci/archive/v0.4.4.tar.gz" + url = "https://github.com/opencontainers/umoci/archive/v0.4.4.tar.gz" - license("Apache-2.0") + license("Apache-2.0", checked_by="wdconinc") + version("0.4.7", sha256="c01b36de6fdc513eb65add57bc882d72f94fc3b4b65a8f9ef59826fb754af93e") version("0.4.4", sha256="bc5c53812e0076d026aa275b197b878857cf7ba7a4f048fd13433de6107b9aed") version("0.4.3", sha256="b7d537fec84d4327b1bbfe27118f69df5591143a74a7a1b66cc9904d85c30226") version("0.4.2", sha256="fbc397dd39bda2570155dc3b1be0835809a36fccc342e2545b3edb9f0f9dc6f5") version("0.4.1", sha256="0d83e01167383f529d726e9fd455660d4837371d5f0d82fad405f3ae6ae52486") version("0.4.0", sha256="66997e270dee8abc9796385b162a1e8e32dd2ee2359e5200af4e6671cc1e76a0") - depends_on("c", type="build") # generated - depends_on("go") depends_on("go-md2man", type="build") def build(self, spec, prefix): provider = "github.com" - project = "openSUSE" + project = "opencontainers" repo = "umoci" mkdirp(join_path(self.stage.source_path, "src", provider, project)) diff --git a/var/spack/repos/builtin/packages/umpire/package.py b/var/spack/repos/builtin/packages/umpire/package.py index 6348d943d3c934..bf04b347b92809 100644 --- a/var/spack/repos/builtin/packages/umpire/package.py +++ b/var/spack/repos/builtin/packages/umpire/package.py @@ -24,6 +24,12 @@ class Umpire(CachedCMakePackage, CudaPackage, ROCmPackage): license("MIT") version("develop", branch="develop", submodules=False) + version( + "2024.07.0", + tag="v2024.07.0", + commit="abd729f40064175e999a83d11d6b073dac4c01d2", + submodules=False, + ) version( "2024.02.1", tag="v2024.02.1", @@ -196,7 +202,7 @@ class Umpire(CachedCMakePackage, CudaPackage, ROCmPackage): variant("numa", default=False, description="Enable NUMA support") variant("shared", default=True, description="Enable Shared libs") variant("openmp", default=False, description="Build with OpenMP support") - variant("openmp_target", default=False, description="Build with OpenMP 4.5 support") + variant("omptarget", default=False, description="Build with OpenMP 4.5 support") variant("deviceconst", default=False, description="Enables support for constant device memory") variant("examples", default=False, description="Build Umpire Examples") variant( @@ -213,16 +219,19 @@ class Umpire(CachedCMakePackage, CudaPackage, ROCmPackage): variant("werror", default=False, description="Enable warnings as errors") variant("asan", default=False, description="Enable ASAN") variant("sanitizer_tests", default=False, description="Enable address sanitizer tests") + variant("fmt_header_only", default=True, description="Link to header-only fmt target") + depends_on("cmake@3.23:", when="@2024.07.0:", type="build") depends_on("cmake@3.23:", when="@2022.10.0: +rocm", type="build") - depends_on("cmake@3.20:", when="@2022.10.0:", type="build") + depends_on("cmake@3.20:", when="@2022.10.0:2024.02.1", type="build") depends_on("cmake@:3.20", when="@2022.03.0:2022.03 +rocm", type="build") depends_on("cmake@3.14:", when="@2022.03.0:", type="build") depends_on("cmake@3.9:", when="+cuda", type="build") depends_on("cmake@3.8:", type="build") depends_on("blt", type="build") - depends_on("blt@0.6.1:", type="build", when="@2024.02.0:") + depends_on("blt@0.6.2:", type="build", when="@2024.02.1:") + depends_on("blt@0.6.1", type="build", when="@2024.02.0") depends_on("blt@0.5.3", type="build", when="@2023.06.0") depends_on("blt@0.5.2:0.5.3", type="build", when="@2022.10.0") depends_on("blt@0.5.0:0.5.3", type="build", when="@2022.03.0:2022.03.1") @@ -234,8 +243,11 @@ class Umpire(CachedCMakePackage, CudaPackage, ROCmPackage): depends_on("camp") depends_on("camp+openmp", when="+openmp") depends_on("camp~cuda", when="~cuda") + depends_on("camp~rocm", when="~rocm") depends_on("camp@main", when="@develop") - depends_on("camp@2024.02.0:", when="@2024.02.0:") + depends_on("camp@2024.07.0:", when="@2024.07.0:") + depends_on("camp@2024.02.1", when="@2024.02.1") + depends_on("camp@2024.02.0", when="@2024.02.0") depends_on("camp@2023.06.0", when="@2023.06.0") depends_on("camp@2022.10.0:2023.06.0", when="@2022.10.0") depends_on("camp@2022.03.2:2023.06.0", when="@2022.03.0:2022.03.1") @@ -273,13 +285,11 @@ class Umpire(CachedCMakePackage, CudaPackage, ROCmPackage): conflicts("+device_alloc", when="~rocm~cuda") conflicts("+deviceconst", when="~rocm~cuda") - conflicts("~openmp", when="+openmp_target", msg="OpenMP target requires OpenMP") + conflicts("~openmp", when="+omptarget", msg="OpenMP target requires OpenMP") conflicts("+cuda", when="+rocm") conflicts("+tools", when="+rocm") conflicts( - "+rocm", - when="+openmp_target", - msg="Cant support both rocm and openmp device backends at once", + "+rocm", when="+omptarget", msg="Cant support both rocm and openmp device backends at once" ) conflicts("+ipc_shmem", when="@:5.0.1") @@ -320,12 +330,14 @@ def initconfig_compiler_entries(self): option_prefix = "UMPIRE_" if spec.satisfies("@2022.03.0:") else "" - if "+fortran" in spec and compiler.fc is not None: + if spec.satisfies("+fortran") and compiler.fc is not None: entries.append(cmake_cache_option("ENABLE_FORTRAN", True)) else: entries.append(cmake_cache_option("ENABLE_FORTRAN", False)) - entries.append(cmake_cache_option("{}ENABLE_C".format(option_prefix), "+c" in spec)) + entries.append( + cmake_cache_option("{}ENABLE_C".format(option_prefix), spec.satisfies("+c")) + ) llnl_link_helpers(entries, spec, compiler) @@ -341,31 +353,31 @@ def initconfig_hardware_entries(self): option_prefix = "UMPIRE_" if spec.satisfies("@2022.03.0:") else "" - if "+cuda" in spec: + if spec.satisfies("+cuda"): entries.append(cmake_cache_option("ENABLE_CUDA", True)) # Umpire used to pick only the first architecture in the list. The shared logic in # CachedCMakePackage keeps the list of architectures. else: entries.append(cmake_cache_option("ENABLE_CUDA", False)) - if "+rocm" in spec: + if spec.satisfies("+rocm"): entries.append(cmake_cache_option("ENABLE_HIP", True)) else: entries.append(cmake_cache_option("ENABLE_HIP", False)) entries.append( cmake_cache_option( - "{}ENABLE_DEVICE_CONST".format(option_prefix), "+deviceconst" in spec + "{}ENABLE_DEVICE_CONST".format(option_prefix), spec.satisfies("+deviceconst") ) ) entries.append( cmake_cache_option( - "{}ENABLE_OPENMP_TARGET".format(option_prefix), "+openmp_target" in spec + "{}ENABLE_OPENMP_TARGET".format(option_prefix), spec.satisfies("+omptarget") ) ) - if "+openmp_target" in spec and "%xl" in spec: + if spec.satisfies("+omptarget") and spec.satisfies("%xl"): entries.append(cmake_cache_string("OpenMP_CXX_FLAGS", "-qsmp;-qoffload")) return entries @@ -373,8 +385,8 @@ def initconfig_hardware_entries(self): def initconfig_mpi_entries(self): spec = self.spec - entries = super(Umpire, self).initconfig_mpi_entries() - entries.append(cmake_cache_option("ENABLE_MPI", "+mpi" in spec)) + entries = super().initconfig_mpi_entries() + entries.append(cmake_cache_option("ENABLE_MPI", spec.satisfies("+mpi"))) return entries @@ -402,58 +414,73 @@ def initconfig_package_entries(self): entries.append("#------------------{0}\n".format("-" * 60)) entries.append(cmake_cache_string("CMAKE_BUILD_TYPE", spec.variants["build_type"].value)) - entries.append(cmake_cache_option("BUILD_SHARED_LIBS", "+shared" in spec)) - entries.append(cmake_cache_option("ENABLE_WARNINGS_AS_ERRORS", "+werror" in spec)) + entries.append(cmake_cache_option("BUILD_SHARED_LIBS", spec.satisfies("+shared"))) + entries.append(cmake_cache_option("ENABLE_WARNINGS_AS_ERRORS", spec.satisfies("+werror"))) # Generic options that have a prefixed equivalent in Umpire CMake - entries.append(cmake_cache_option("ENABLE_OPENMP", "+openmp" in spec)) - entries.append(cmake_cache_option("ENABLE_EXAMPLES", "+examples" in spec)) + entries.append(cmake_cache_option("ENABLE_OPENMP", spec.satisfies("+openmp"))) + entries.append(cmake_cache_option("ENABLE_EXAMPLES", spec.satisfies("+examples"))) entries.append(cmake_cache_option("ENABLE_DOCS", False)) - if "tests=benchmarks" in spec or "+dev_benchmarks" in spec: + if spec.satisfies("tests=benchmarks") or spec.satisfies("+dev_benchmarks"): # BLT requires ENABLE_TESTS=True to enable benchmarks entries.append(cmake_cache_option("ENABLE_BENCHMARKS", True)) entries.append(cmake_cache_option("ENABLE_TESTS", True)) else: entries.append(cmake_cache_option("ENABLE_BENCHMARKS", False)) - entries.append(cmake_cache_option("ENABLE_TESTS", "tests=none" not in spec)) + entries.append(cmake_cache_option("ENABLE_TESTS", not spec.satisfies("tests=none"))) # Prefixed options that used to be name without one - entries.append(cmake_cache_option("{}ENABLE_NUMA".format(option_prefix), "+numa" in spec)) + entries.append( + cmake_cache_option("{}ENABLE_NUMA".format(option_prefix), spec.satisfies("+numa")) + ) entries.append( cmake_cache_option( - "{}ENABLE_DEVELOPER_BENCHMARKS".format(option_prefix), "+dev_benchmarks" in spec + "{}ENABLE_DEVELOPER_BENCHMARKS".format(option_prefix), + spec.satisfies("+dev_benchmarks"), ) ) entries.append( - cmake_cache_option("{}ENABLE_TOOLS".format(option_prefix), "+tools" in spec) + cmake_cache_option("{}ENABLE_TOOLS".format(option_prefix), spec.satisfies("+tools")) ) entries.append( - cmake_cache_option("{}ENABLE_BACKTRACE".format(option_prefix), "+backtrace" in spec) + cmake_cache_option( + "{}ENABLE_BACKTRACE".format(option_prefix), spec.satisfies("+backtrace") + ) + ) + entries.append( + cmake_cache_option("{}ENABLE_ASAN".format(option_prefix), spec.satisfies("+asan")) ) - entries.append(cmake_cache_option("{}ENABLE_ASAN".format(option_prefix), "+asan" in spec)) entries.append( cmake_cache_option( - "{}ENABLE_SANITIZER_TESTS".format(option_prefix), "+sanitizer_tests" in spec + "{}ENABLE_SANITIZER_TESTS".format(option_prefix), + spec.satisfies("+sanitizer_tests"), ) ) # Recent options, were never name without prefix entries.append( - cmake_cache_option("UMPIRE_ENABLE_DEVICE_ALLOCATOR", "+device_alloc" in spec) + cmake_cache_option("UMPIRE_ENABLE_DEVICE_ALLOCATOR", spec.satisfies("+device_alloc")) ) entries.append( - cmake_cache_option("UMPIRE_ENABLE_SQLITE_EXPERIMENTAL", "+sqlite_experimental" in spec) + cmake_cache_option( + "UMPIRE_ENABLE_SQLITE_EXPERIMENTAL", spec.satisfies("+sqlite_experimental") + ) ) - if "+sqlite_experimental" in spec: + if spec.satisfies("+sqlite_experimental"): entries.append(cmake_cache_path("SQLite3_ROOT", spec["sqlite"].prefix)) # This option was renamed later than the others if spec.satisfies("@2022.10.0:"): entries.append( - cmake_cache_option("UMPIRE_ENABLE_IPC_SHARED_MEMORY", "+ipc_shmem" in spec) + cmake_cache_option("UMPIRE_ENABLE_IPC_SHARED_MEMORY", spec.satisfies("+ipc_shmem")) ) else: - entries.append(cmake_cache_option("ENABLE_IPC_SHARED_MEMORY", "+ipc_shmem" in spec)) + entries.append( + cmake_cache_option("ENABLE_IPC_SHARED_MEMORY", spec.satisfies("+ipc_shmem")) + ) + + if spec.satisfies("~fmt_header_only"): + entries.append(cmake_cache_string("UMPIRE_FMT_TARGET", "fmt::fmt")) return entries diff --git a/var/spack/repos/builtin/packages/unixodbc/package.py b/var/spack/repos/builtin/packages/unixodbc/package.py index a972c9f02c4586..289a763cb4d0ab 100644 --- a/var/spack/repos/builtin/packages/unixodbc/package.py +++ b/var/spack/repos/builtin/packages/unixodbc/package.py @@ -16,12 +16,12 @@ class Unixodbc(AutotoolsPackage): license("LGPL-2.0-or-later") + version("2.3.12", sha256="f210501445ce21bf607ba51ef8c125e10e22dffdffec377646462df5f01915ec") version("2.3.4", sha256="2e1509a96bb18d248bf08ead0d74804957304ff7c6f8b2e5965309c632421e39") - depends_on("c", type="build") # generated + depends_on("c", type="build") depends_on("iconv") - depends_on("libtool") @property def libs(self): diff --git a/var/spack/repos/builtin/packages/vde/package.py b/var/spack/repos/builtin/packages/vde/package.py new file mode 100644 index 00000000000000..04dc384fc5b59e --- /dev/null +++ b/var/spack/repos/builtin/packages/vde/package.py @@ -0,0 +1,28 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class Vde(AutotoolsPackage): + """Ethernet compliant virtual network""" + + homepage = "https://github.com/virtualsquare/vde-2" + url = "https://github.com/virtualsquare/vde-2/archive/refs/tags/v2.3.3.tar.gz" + + license("GPL-2.0-or-later AND LGPL-2.1-or-later", checked_by="trws") + + version("2.3.3", sha256="a7d2cc4c3d0c0ffe6aff7eb0029212f2b098313029126dcd12dc542723972379") + + depends_on("c", type="build") + depends_on("cxx", type="build") + + depends_on("autoconf", type="build") + depends_on("automake", type="build") + depends_on("libtool", type="build") + depends_on("m4", type="build") + + def autoreconf(self, spec, prefix): + autoreconf("--install", "--verbose") diff --git a/var/spack/repos/builtin/packages/vecmem/package.py b/var/spack/repos/builtin/packages/vecmem/package.py index 5eddb8b61a779d..3372b8e2692410 100644 --- a/var/spack/repos/builtin/packages/vecmem/package.py +++ b/var/spack/repos/builtin/packages/vecmem/package.py @@ -17,6 +17,10 @@ class Vecmem(CMakePackage, CudaPackage): license("MPL-2.0-no-copyleft-exception") + version("1.10.0", sha256="1fbdc599a65ad7b2cd1176844c7578da38911bc747fbe51a71e00d20e6105330") + version("1.9.0", sha256="c1ddc43ff0d742306cbee71afd80efd348b6b0b1ba9e4210ca7f8b607f03bd70") + version("1.8.0", sha256="d04f1bfcd08837f85c794a69da9f248e163985214a302c22381037feb5b3a7a9") + version("1.7.0", sha256="ff4bf8ea86a5edcb4a1e3d8dd0c42c73c60e998c6fb6512a40182c1f4620a73d") version("1.6.0", sha256="797b016ac0b79bb39abad059ffa9f4817e519218429c9ab4c115f989616bd5d4") version("1.5.0", sha256="5d7a2d2dd8eb961af12a1ed9e4e427b89881e843064ffa96ad0cf0934ba9b7ae") version("1.4.0", sha256="545dfb4de4f9f3d773eef6a0e3297ebf981bb81950930d0991ad739e31ab16af") diff --git a/var/spack/repos/builtin/packages/vep/package.py b/var/spack/repos/builtin/packages/vep/package.py new file mode 100644 index 00000000000000..5f60345277cea3 --- /dev/null +++ b/var/spack/repos/builtin/packages/vep/package.py @@ -0,0 +1,131 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class Vep(Package): + """ + Ensembl Variant Effect Predictor (VEP) determines the effect of your variants + (SNPs, insertions, deletions, CNVs or structural variants) on genes, transcripts, + and protein sequence, as well as regulatory regions. + (Requires addtional data available via the `vep-cache` package) + """ + + homepage = "https://useast.ensembl.org/info/docs/tools/vep/index.html" + url = "https://github.com/Ensembl/ensembl-vep/archive/release/111.zip" + + maintainers("teaguesterling") + + license("APACHE-2.0", checked_by="teaguesterling") + + version("112.0", sha256="46dd08838fd94ecbfaa931266c78570748a3cb39668b6e43c3608e6cd0aff93f") + version("111.0", sha256="9cb326a1fa0054ce1a417f8fd4f2325ba605c40ec10eefbf87f461c264a89407") + version("110.0", sha256="391a1fe50139064c1044c09e013bb21437933d677537b5d3336807f3b131fb51") + + variant("vep_installer", default=False, description="Install dependencies with VEP installer") + variant("utility_scripts", default=True, description="Install utility scripts") + + # Optional dependencies + variant("json", default=True, description="Include requirements for JSON support") + variant("nearest", default=True, description="Include requirements for 'nearest'") + variant("gzip", default=True, description="Include requirements for gzip support") + + # Bundled versions + variant("bundled_bioperl", default=False, description="Build with bundled BioPerl") + variant("bundled_htslib", default=False, description="Build with bundled HTSLib") + + extends("perl") + + with default_args(type="build"): + depends_on("gcc", when="+vep_installer") + depends_on("gmake") + + with default_args(type=("build", "run")): + depends_on("perl@5.10:") + depends_on("perl-archive-zip") + depends_on("perl-dbd-mysql") + depends_on("perl-dbi") + depends_on("perl-bio-db-hts") + depends_on("perl-json", when="+json") + depends_on("perl-set-intervaltree", when="+nearest") + depends_on("perl-perlio-gzip", when="+gzip") + depends_on("perl-bioperl@1.6:", when="~bundled_bioperl") + depends_on("htslib@1.9:", when="~bundled_htslib") + + # This is a workaround for the VEP installer which downloads + # and manually installs dependent packages + with default_args(type=("build", "run"), when="~vep_installer"): + for ver in ["110", "111", "112"]: + depends_on(f"perl-bio-ensembl@{ver}", when=f"@{ver}") + depends_on(f"perl-bio-ensembl-variation@{ver}", when=f"@{ver}") + depends_on(f"perl-bio-ensembl-funcgen@{ver}", when=f"@{ver}") + depends_on(f"perl-bio-ensembl-io@{ver}", when=f"@{ver}") + + # These should probably move futher up the dependency stack + conflicts("zlib-ng", when="+gzip") + conflicts("zlib-ng", when="+bundled_htslib") + + @property + def vep_lib_path(self): + return self.prefix.lib.perl5 + + @property + def vep_share_path(self): + return self.prefix.share.vep + + @property + def vep_scripts_path(self): + return self.vep_share_path.scripts + + @property + def vep_installer_path(self): + return f"{self.vep_scripts_path.INSTALL}.pl" + + def setup_run_environment(self, env): + env.set("VEP_HOME", self.home) + if self.spec.satisfies("+bundled_htslib"): + env.prepend_path("PATH", self.vep_lib_path.htslib) + + def installer_args(self): + auto = "a" + args = ["--DESTDIR", f"{self.vep_lib_path}", "--NO_UPDATE", "--NO_TEST"] + if self.spec.satisfies("~bundled_htslib"): + args += ["--NO_HTSLIB"] + if self.spec.satisfies("~bundled_bioperl"): + args += ["--NO_BIOPERL"] + args += ["--AUTO", auto] + return args + + def install(self, spec, prefix): + mkdirp(self.prefix.bin) + mkdirp(self.vep_lib_path) + mkdirp(self.vep_share_path) + mkdirp(self.vep_scripts_path) + + # Add the VEP perl modules and executable + install_tree("modules", self.vep_lib_path) + install("vep", prefix.bin.vep) + + # We save this so it can be used later to update caches + # and use to do the rest of the install, if requested + install("INSTALL.pl", self.vep_installer_path) + + # This is required for any cache updating via the installer + install("convert_cache.pl", self.vep_scripts_path) + + # Resolve dependencies via VEP installer if desired + if spec.satisfies("+vep_installer"): + # If we don't do this a bunch of perl libs will be missing + # Run the customer VEP installer/downloader, which downloads + # copies a bunch of additional perl modules + installer = which(self.vep_installer_path) + installer(*self.installer_args()) + + # Manually install auxilary scripts if requested + if self.spec.satisfies("+utility_scripts"): + install("filter_vep", prefix.bin.filter_vep) + install("haplo", prefix.bin.haplo) + install("variant_recoder", prefix.bin.variant_recoder) diff --git a/var/spack/repos/builtin/packages/voms/package.py b/var/spack/repos/builtin/packages/voms/package.py new file mode 100644 index 00000000000000..bfbf92b572059d --- /dev/null +++ b/var/spack/repos/builtin/packages/voms/package.py @@ -0,0 +1,54 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack.package import * + + +class Voms(AutotoolsPackage): + """The VOMS native service and APIs.""" + + homepage = "https://github.com/italiangrid/voms" + url = "https://github.com/italiangrid/voms/archive/refs/tags/v2.1.0.tar.gz" + + maintainers("wdconinc") + + license("Apache-2.0", checked_by="wdconinc") + + version("2.1.0", sha256="2fd2468620af531c02e9ac495aaaf2a8d5b8cfbe24d4904f2e8fa7f64cdeeeec") + + depends_on("c", type="build") + depends_on("cxx", type="build") + + depends_on("autoconf", type="build") + depends_on("automake", type="build") + depends_on("libtool", type="build") + depends_on("m4", type="build") + depends_on("pkgconfig", type="build") + + depends_on("openssl") + depends_on("gsoap@2.7:") + depends_on("expat") + depends_on("zlib-api") + + force_autoreconf = True + + def patch(self): + filter_file( + r"/usr/bin/soapcpp2", f"{self.spec['gsoap'].prefix.bin.soapcpp2}", "m4/wsdl2h.m4" + ) + + def setup_build_environment(self, env): + # https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=voms + pkgconfig = Executable(join_path(self.spec["pkgconfig"].prefix.bin, "pkg-config")) + env.set("GSOAP_SSL_PP_CFLAGS", pkgconfig("--cflags", "gsoapssl++", "zlib", output=str)) + env.set("GSOAP_SSL_PP_LIBS", pkgconfig("--libs", "gsoapssl++", "zlib", output=str)) + + def autoreconf(self, spec, prefix): + autogen = Executable("./autogen.sh") + autogen() + + def configure_args(self): + args = [f"--with-gsoap-wsdl2h={self.spec['gsoap'].prefix.bin.wsdl2h}"] + return args diff --git a/var/spack/repos/builtin/packages/votca/package.py b/var/spack/repos/builtin/packages/votca/package.py index c6788fbc60fea2..b5edbe36124ff7 100644 --- a/var/spack/repos/builtin/packages/votca/package.py +++ b/var/spack/repos/builtin/packages/votca/package.py @@ -20,6 +20,7 @@ class Votca(CMakePackage): maintainers("junghans") version("master", branch="master") + version("2024.2", sha256="aa9ea3ad54dae31d3f68685d12f3bad4910ef3034a7f51c9ddd573b3856f4bc8") version("2024.1", sha256="68669a7d09020f780d2633eb865c6c53e5fb38d155f80c9670ebf9d10d10bee6") version("2024", sha256="7f342e857f4a6ba6d25937f63830afa3c32cbd906255c8d78aa6c500cfd418c8") version("2023", sha256="6150a38c77379d05592a56ae4392a00c4636d02198bb06108a3dc739a45115f8") diff --git a/var/spack/repos/builtin/packages/w3emc/package.py b/var/spack/repos/builtin/packages/w3emc/package.py index 9388a7da7e200d..82dbf7bf8c6b92 100644 --- a/var/spack/repos/builtin/packages/w3emc/package.py +++ b/var/spack/repos/builtin/packages/w3emc/package.py @@ -56,7 +56,6 @@ class W3emc(CMakePackage): ) conflicts("+shared +extradeps", msg="Shared library cannot be built with unknown dependencies") - conflicts("+shared ~pic", msg="Shared library requires PIC") depends_on("bufr", when="@2.10: +bufr") depends_on("bacio", when="@2.9.2:") diff --git a/var/spack/repos/builtin/packages/w3m/package.py b/var/spack/repos/builtin/packages/w3m/package.py index b84381db121004..5478c2348159e9 100644 --- a/var/spack/repos/builtin/packages/w3m/package.py +++ b/var/spack/repos/builtin/packages/w3m/package.py @@ -22,11 +22,17 @@ class W3m(AutotoolsPackage): # Currently, Arch and Ubuntu (and Debian derivatives) use Debian's branch. # Also, Gentoo, Fedora and openSUSE switched to Debian's branch. homepage = "https://w3m.sourceforge.net/index.en.html" - url = "https://downloads.sourceforge.net/project/w3m/w3m/w3m-0.5.3/w3m-0.5.3.tar.gz" + url = "https://salsa.debian.org/debian/w3m/-/archive/upstream/0.5.3+git20230121/w3m-upstream-0.5.3+git20230121.tar.gz" + git = "https://salsa.debian.org/debian/w3m.git" + maintainers("ronin_gw") license("MIT") + version( + "0.5.3.git20230121", + sha256="8f0592e1cf7cf1de053e22c114cd79b85ebdb8dab925be7d343a130343b97c25", + ) version("0.5.3", sha256="e994d263f2fd2c22febfbe45103526e00145a7674a0fda79c822b97c2770a9e3") depends_on("c", type="build") # generated @@ -66,8 +72,15 @@ class W3m(AutotoolsPackage): depends_on("imlib2@1.0.5:", when="imagelib=imlib2 +image") # fix for modern libraries - patch("fix_redef.patch") - patch("fix_gc.patch") + patch("fix_redef.patch", when="@=0.5.3") + patch("fix_gc.patch", when="@=0.5.3") + + def url_for_version(self, version): + if ".git" in version.string: + v = version.string.replace(".git", "+git") + return f"https://salsa.debian.org/debian/w3m/-/archive/upstream/{v}/w3m-upstream-{v}.tar.gz" + else: + return f"https://downloads.sourceforge.net/project/w3m/w3m/w3m-{version}/w3m-{version}.tar.gz" def patch(self): # w3m is not developed since 2012, everybody is doing this: diff --git a/var/spack/repos/builtin/packages/warpx/package.py b/var/spack/repos/builtin/packages/warpx/package.py index 5b13827d25a84e..82a8610c4f420d 100644 --- a/var/spack/repos/builtin/packages/warpx/package.py +++ b/var/spack/repos/builtin/packages/warpx/package.py @@ -16,7 +16,7 @@ class Warpx(CMakePackage, PythonExtension): """ homepage = "https://ecp-warpx.github.io" - url = "https://github.com/ECP-WarpX/WarpX/archive/refs/tags/24.08.tar.gz" + url = "https://github.com/ECP-WarpX/WarpX/archive/refs/tags/24.10.tar.gz" git = "https://github.com/ECP-WarpX/WarpX.git" maintainers("ax3l", "dpgrote", "EZoni", "RemiLehe") @@ -26,7 +26,12 @@ class Warpx(CMakePackage, PythonExtension): # NOTE: if you update the versions here, also see py-warpx version("develop", branch="development") - version("24.08", sha256="8da1f2967f613a65a295260260aa4f081ac1d1b7c1d6987d294e02b86099df08") + version("24.10", sha256="1fe3a86bf820a2ecef853cdcd9427fba4e0cb1efb05326da7dc9dbf94551202f") + version( + "24.08", + sha256="8da1f2967f613a65a295260260aa4f081ac1d1b7c1d6987d294e02b86099df08", + deprecated=True, + ) version( "23.08", sha256="67695ff04b83d1823ea621c19488e54ebaf268532b0e5eb4ea8ad293d7ab3ddc", @@ -177,6 +182,12 @@ class Warpx(CMakePackage, PythonExtension): variant("app", default=True, description="Build the WarpX executable application") variant("ascent", default=False, description="Enable Ascent in situ visualization") + variant( + "catalyst", + default=False, + description="Enable Catalyst2 in situ visualization", + when="@24.09:", + ) variant("sensei", default=False, description="Enable SENSEI in situ visualization") variant( "compute", @@ -201,7 +212,8 @@ class Warpx(CMakePackage, PythonExtension): description="Number of spatial dimensions", when="@23.06:", ) - variant("eb", default=False, description="Embedded boundary support (in development)") + variant("eb", default=True, description="Embedded boundary support", when="@24.10:") + variant("eb", default=False, description="Embedded boundary support", when="@:24.09") # Spack defaults to False but pybind11 defaults to True (and IPO is highly # encouraged to be used) variant( @@ -233,7 +245,7 @@ class Warpx(CMakePackage, PythonExtension): depends_on("cxx", type="build") - for v in ["24.08", "develop"]: + for v in ["24.10", "24.08", "develop"]: depends_on( f"amrex@{v} build_system=cmake +linear_solvers +pic +particles +shared +tiny_profile", when=f"@{v}", @@ -241,13 +253,20 @@ class Warpx(CMakePackage, PythonExtension): ) depends_on("py-amrex@{0}".format(v), when="@{0} +python".format(v), type=("build", "run")) - depends_on("ascent", when="+ascent") - depends_on("ascent +cuda", when="+ascent compute=cuda") - depends_on("ascent +mpi", when="+ascent +mpi") depends_on("boost@1.66.0: +math", when="+qedtablegen") depends_on("cmake@3.15.0:", type="build") depends_on("cmake@3.18.0:", type="build", when="@22.01:") depends_on("cmake@3.20.0:", type="build", when="@22.08:") + depends_on("cmake@3.24.0:", type="build", when="@24.09:") + with when("+ascent"): + depends_on("ascent", when="+ascent") + depends_on("ascent +cuda", when="+ascent compute=cuda") + depends_on("ascent +mpi", when="+ascent +mpi") + depends_on("amrex +ascent +conduit") + with when("+catalyst"): + depends_on("libcatalyst@2.0: +conduit") + depends_on("libcatalyst +mpi", when="+mpi") + depends_on("amrex +catalyst +conduit") with when("dims=1"): depends_on("amrex dimensions=1") with when("dims=2"): @@ -314,7 +333,8 @@ class Warpx(CMakePackage, PythonExtension): depends_on("py-mpi4py@2.1.0:", type=("build", "run"), when="+mpi") depends_on("py-periodictable@1.5:1", type=("build", "run")) depends_on("py-picmistandard@0.28.0", type=("build", "run"), when="@23.11:24.07") - depends_on("py-picmistandard@0.29.0", type=("build", "run"), when="@24.08:") + depends_on("py-picmistandard@0.29.0", type=("build", "run"), when="@24.08") + depends_on("py-picmistandard@0.30.0", type=("build", "run"), when="@24.09:") depends_on("py-pip@23:", type="build") depends_on("py-setuptools@42:", type="build") depends_on("py-pybind11@2.12.0:", type=("build", "link")) @@ -373,6 +393,7 @@ def cmake_args(self): # variants self.define_from_variant("WarpX_APP", "app"), self.define_from_variant("WarpX_ASCENT", "ascent"), + self.define_from_variant("WarpX_CATALYST", "catalyst"), self.define_from_variant("WarpX_SENSEI", "sensei"), "-DWarpX_COMPUTE={0}".format(spec.variants["compute"].value.upper()), "-DWarpX_DIMS={0}".format(";".join(spec.variants["dims"].value).upper()), @@ -466,9 +487,17 @@ def _get_input_options(self, dim, post_install): install_test_root(self) if post_install else self.stage.source_path, self.examples_src_dir, ) - inputs_nD = {"1": "inputs_1d", "2": "inputs_2d", "3": "inputs_3d", "rz": "inputs_rz"} - if spec.satisfies("@:21.12"): - inputs_nD["rz"] = "inputs_2d_rz" + if spec.satisfies("@:24.09"): + inputs_nD = {"1": "inputs_1d", "2": "inputs_2d", "3": "inputs_3d", "rz": "inputs_rz"} + if spec.satisfies("@:21.12"): + inputs_nD["rz"] = "inputs_2d_rz" + else: + inputs_nD = { + "1": "inputs_test_1d_laser_acceleration", + "2": "inputs_base_2d", + "3": "inputs_base_3d", + "rz": "inputs_base_rz", + } inputs = join_path(examples_dir, inputs_nD[dim]) cli_args = [inputs, "max_step=50", "diag1.intervals=10"] diff --git a/var/spack/repos/builtin/packages/wayland-protocols/package.py b/var/spack/repos/builtin/packages/wayland-protocols/package.py index 9f346187dade9c..20b113de243152 100644 --- a/var/spack/repos/builtin/packages/wayland-protocols/package.py +++ b/var/spack/repos/builtin/packages/wayland-protocols/package.py @@ -28,6 +28,7 @@ class WaylandProtocols(MesonPackage, AutotoolsPackage): license("MIT") + version("1.37", sha256="c3b215084eb4cf318415533554c2c2714e58ed75847d7c3a8e50923215ffbbf3") version("1.36", sha256="c839dd4325565fd59a93d6cde17335357328f66983c2e1fb03c33e92d6918b17") version("1.35", sha256="6e62dfa92ce82487d107b76064cfe2d7ca107c87c239ea9036a763d79c09105a") version("1.34", sha256="cd3cc9dedb838e6fc8f55bbeb688e8569ffac7df53bc59dbfac8acbb39267f05") diff --git a/var/spack/repos/builtin/packages/wget/package.py b/var/spack/repos/builtin/packages/wget/package.py index 41dcdf41939891..582a68f151f146 100644 --- a/var/spack/repos/builtin/packages/wget/package.py +++ b/var/spack/repos/builtin/packages/wget/package.py @@ -40,6 +40,8 @@ class Wget(AutotoolsPackage, GNUMirrorPackage): depends_on("gnutls", when="ssl=gnutls") depends_on("openssl", when="ssl=openssl") + # OpenSSL 3.0 is not supported by wget, openssl@3.1: works: + conflicts("openssl@3.0", when="ssl=openssl") depends_on("gettext", type="build") depends_on("python@3:", type="build", when="+python") diff --git a/var/spack/repos/builtin/packages/wgl/package.py b/var/spack/repos/builtin/packages/wgl/package.py index b420cdcf644d80..9d02f3c1394881 100644 --- a/var/spack/repos/builtin/packages/wgl/package.py +++ b/var/spack/repos/builtin/packages/wgl/package.py @@ -83,7 +83,7 @@ def determine_variants(cls, libs, ver_str): return variants def _spec_arch_to_sdk_arch(self): - spec_arch = str(self.spec.architecture.target.microarchitecture.family).lower() + spec_arch = str(self.spec.architecture.target.family).lower() _64bit = "64" in spec_arch arm = "arm" in spec_arch if arm: diff --git a/var/spack/repos/builtin/packages/win-file/package.py b/var/spack/repos/builtin/packages/win-file/package.py new file mode 100644 index 00000000000000..2196be842d5f85 --- /dev/null +++ b/var/spack/repos/builtin/packages/win-file/package.py @@ -0,0 +1,35 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +import os +import re +import shutil + +from spack.package import * + + +class WinFile(Package): + """File "file type guesser" system utility cross compiled for x86_64 Windows + systems via the Mingw-w64 cross compiler and a custom Spack repository + """ + + homepage = "https://spack.github.io/windows-bootstrap-resources" + url = ( + "https://spack.github.io/windows-bootstrap-resources/resources/file/5.45/file_5.45.tar.gz" + ) + + executables = ["^file$"] + + version("5.45", sha256="11b8f3abf647c711bc50ef8451c8d6e955f11c4afd8b0a98f2ac65e9b6e10d5e") + + @classmethod + def determine_version(cls, exe): + output = Executable(exe)("--version", output=str, error=str) + match = re.search(r"file-(\S+)", output) + return match.group(1) if match else None + + def install(self, spec, prefix): + mkdirp(prefix) + for subdir in os.listdir(self.stage.source_path): + shutil.move(subdir, prefix) diff --git a/var/spack/repos/builtin/packages/win-gpg/package.py b/var/spack/repos/builtin/packages/win-gpg/package.py new file mode 100644 index 00000000000000..f2fef7ff6dddf7 --- /dev/null +++ b/var/spack/repos/builtin/packages/win-gpg/package.py @@ -0,0 +1,36 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +import os +import re +import shutil + +from spack.package import * + + +class WinGpg(Package): + """GnuPG is a complete and free implementation of the OpenPGP + standard as defined by RFC4880 (also known as PGP). + + This utility was cross compiled for x86_64 Windows + systems via the Mingw-w64 cross compiler and a custom Spack repository + """ + + homepage = "https://spack.github.io/windows-bootstrap-resources/" + url = "https://spack.github.io/windows-bootstrap-resources/resources/gpg/2.4.5/gpg4win_2.4.5.tar.gz" + + executables = ["^gpg$"] + + version("2.4.5", sha256="249ab87bd06abea3140054089bad44d9a5d1531413590576da609142db2673ec") + + @classmethod + def determine_version(cls, exe): + output = Executable(exe)("--version", output=str, error=str) + match = re.search(r"gpg (\S+)", output) + return match.group(1) if match else None + + def install(self, spec, prefix): + mkdirp(prefix) + for subdir in os.listdir(self.stage.source_path): + shutil.move(subdir, prefix) diff --git a/var/spack/repos/builtin/packages/xbae/package.py b/var/spack/repos/builtin/packages/xbae/package.py index 38b74d64af9f99..f17282d21c2179 100644 --- a/var/spack/repos/builtin/packages/xbae/package.py +++ b/var/spack/repos/builtin/packages/xbae/package.py @@ -17,9 +17,8 @@ class Xbae(AutotoolsPackage): version("4.60.4", sha256="eb72702ed0a36d043f2075a9d5a4545556da1b8dab4d67d85fca92f37aeb04a8") - depends_on("c", type="build") # generated + depends_on("c", type="build") - depends_on("libtool", type="build") depends_on("libxext") depends_on("libxmu") depends_on("libxpm") diff --git a/var/spack/repos/builtin/packages/xgboost/package.py b/var/spack/repos/builtin/packages/xgboost/package.py index 3451f7af696b74..ea48be3d6ad6cb 100644 --- a/var/spack/repos/builtin/packages/xgboost/package.py +++ b/var/spack/repos/builtin/packages/xgboost/package.py @@ -18,33 +18,22 @@ class Xgboost(CMakePackage, CudaPackage): homepage = "https://xgboost.ai/" git = "https://github.com/dmlc/xgboost.git" - - maintainers("adamjstewart") + submodules = True license("Apache-2.0") + maintainers("adamjstewart") - version("master", branch="master", submodules=True) - version( - "2.1.0", tag="v2.1.0", commit="213ebf7796b757448dfa2cfba532074696fa1524", submodules=True - ) - version( - "1.7.6", tag="v1.7.6", commit="36eb41c960483c8b52b44082663c99e6a0de440a", submodules=True - ) - version( - "1.6.2", tag="v1.6.2", commit="b9934246faa9a25e10a12339685dfbe56d56f70b", submodules=True - ) - version( - "1.6.1", tag="v1.6.1", commit="5d92a7d936fc3fad4c7ecb6031c3c1c7da882a14", submodules=True - ) - version( - "1.5.2", tag="v1.5.2", commit="742c19f3ecf2135b4e008a4f4a10b59add8b1045", submodules=True - ) - version( - "1.3.3", tag="v1.3.3", commit="000292ce6d99ed658f6f9aebabc6e9b330696e7e", submodules=True - ) + version("master", branch="master") + version("2.1.1", tag="v2.1.1", commit="9c9db1259240bffe9040ed7ca6e3fb2c1bda80e4") + version("2.1.0", tag="v2.1.0", commit="213ebf7796b757448dfa2cfba532074696fa1524") + version("1.7.6", tag="v1.7.6", commit="36eb41c960483c8b52b44082663c99e6a0de440a") + version("1.6.2", tag="v1.6.2", commit="b9934246faa9a25e10a12339685dfbe56d56f70b") + version("1.6.1", tag="v1.6.1", commit="5d92a7d936fc3fad4c7ecb6031c3c1c7da882a14") + version("1.5.2", tag="v1.5.2", commit="742c19f3ecf2135b4e008a4f4a10b59add8b1045") + version("1.3.3", tag="v1.3.3", commit="000292ce6d99ed658f6f9aebabc6e9b330696e7e") - depends_on("c", type="build") # generated - depends_on("cxx", type="build") # generated + depends_on("c", type="build") + depends_on("cxx", type="build") variant("nccl", default=False, description="Build with NCCL to enable distributed GPU support") variant("openmp", default=True, description="Build with OpenMP support") @@ -64,7 +53,7 @@ class Xgboost(CMakePackage, CudaPackage): # thrust 2.3.1 tuple issues depends_on("cuda@:12.3", when="@:1.7") # https://github.com/dmlc/xgboost/issues/10555 - depends_on("cuda@:12.4", when="@:2.1.0") # assuming fix is backported + depends_on("cuda@:12.4", when="@:2.1") depends_on("nccl", when="+nccl") depends_on("llvm-openmp", when="%apple-clang +openmp") diff --git a/var/spack/repos/builtin/packages/xrootd/package.py b/var/spack/repos/builtin/packages/xrootd/package.py index 3e08c5ace86807..d5c54d42011033 100644 --- a/var/spack/repos/builtin/packages/xrootd/package.py +++ b/var/spack/repos/builtin/packages/xrootd/package.py @@ -23,6 +23,7 @@ class Xrootd(CMakePackage): license("LGPL-3.0-only") + version("5.7.1", sha256="c28c9dc0a2f5d0134e803981be8b1e8b1c9a6ec13b49f5fa3040889b439f4041") version("5.7.0", sha256="214599bba98bc69875b82ac74f2d4b9ac8a554a1024119d8a9802b3d8b9986f8") version("5.6.9", sha256="44196167fbcf030d113e3749dfdecab934c43ec15e38e77481e29aac191ca3a8") version("5.6.8", sha256="19268fd9f0307d936da3598a5eb8471328e059c58f60d91d1ce7305ca0d57528") diff --git a/var/spack/repos/builtin/packages/xsdk/package.py b/var/spack/repos/builtin/packages/xsdk/package.py index 14967eb6e64ac8..85bf27ae2b092b 100644 --- a/var/spack/repos/builtin/packages/xsdk/package.py +++ b/var/spack/repos/builtin/packages/xsdk/package.py @@ -90,6 +90,7 @@ class Xsdk(BundlePackage, CudaPackage, ROCmPackage): variant("sycl", default=False, sticky=True, description="Enable sycl variant of xsdk packages") variant("trilinos", default=True, sticky=True, description="Enable trilinos package build") variant("datatransferkit", default=True, description="Enable datatransferkit package build") + variant("amrex", default=True, description="Enable amrex package build") variant("omega-h", default=True, description="Enable omega-h package build") variant("strumpack", default=True, description="Enable strumpack package build") variant("dealii", default=True, description="Enable dealii package build") @@ -207,12 +208,8 @@ class Xsdk(BundlePackage, CudaPackage, ROCmPackage): xsdk_depends_on("magma@2.7.0", when="@0.8.0", cuda_var="?cuda", rocm_var="?rocm") xsdk_depends_on("amrex +sycl", when="@1.0.0: +sycl") - xsdk_depends_on("amrex@23.08+sundials", when="@1.0.0 %intel", cuda_var="cuda", rocm_var="rocm") - xsdk_depends_on("amrex@23.08+sundials", when="@1.0.0 %gcc", cuda_var="cuda", rocm_var="rocm") - xsdk_depends_on("amrex@23.08+sundials", when="@1.0.0 %cce", cuda_var="cuda", rocm_var="rocm") - xsdk_depends_on("amrex@22.09+sundials", when="@0.8.0 %intel", cuda_var="cuda", rocm_var="rocm") - xsdk_depends_on("amrex@22.09+sundials", when="@0.8.0 %gcc", cuda_var="cuda", rocm_var="rocm") - xsdk_depends_on("amrex@22.09+sundials", when="@0.8.0 %cce", cuda_var="cuda", rocm_var="rocm") + xsdk_depends_on("amrex@23.08+sundials", when="@1.0.0 +amrex", cuda_var="cuda", rocm_var="rocm") + xsdk_depends_on("amrex@22.09+sundials", when="@0.8.0 +amrex", cuda_var="cuda", rocm_var="rocm") xsdk_depends_on("slepc@3.20.0", when="@1.0.0", cuda_var="cuda", rocm_var="rocm") xsdk_depends_on("slepc@3.18.1", when="@0.8.0", cuda_var="cuda", rocm_var="rocm") diff --git a/var/spack/repos/builtin/packages/yajl/package.py b/var/spack/repos/builtin/packages/yajl/package.py index 686714cadbd358..24572d06f74cd3 100644 --- a/var/spack/repos/builtin/packages/yajl/package.py +++ b/var/spack/repos/builtin/packages/yajl/package.py @@ -10,7 +10,7 @@ class Yajl(CMakePackage): """Yet Another JSON Library (YAJL)""" homepage = "https://lloyd.github.io/yajl/" - url = "https://github.com/lloyd/yajl/archive/2.1.0.zip" + url = "https://github.com/lloyd/yajl/archive/refs/tags/2.1.0.zip" git = "https://github.com/lloyd/yajl.git" license("MIT") diff --git a/var/spack/repos/builtin/packages/yaml-cpp/package.py b/var/spack/repos/builtin/packages/yaml-cpp/package.py index 4107b769dc7b7e..f44cce75d8b07b 100644 --- a/var/spack/repos/builtin/packages/yaml-cpp/package.py +++ b/var/spack/repos/builtin/packages/yaml-cpp/package.py @@ -14,13 +14,14 @@ class YamlCpp(CMakePackage): """A YAML parser and emitter in C++""" homepage = "https://github.com/jbeder/yaml-cpp" - url = "https://github.com/jbeder/yaml-cpp/archive/yaml-cpp-0.5.3.tar.gz" + url = "https://github.com/jbeder/yaml-cpp/archive/0.8.0.tar.gz" git = "https://github.com/jbeder/yaml-cpp.git" maintainers("eschnett") license("MIT") version("develop", branch="master") + version("0.8.0", sha256="fbe74bbdcee21d656715688706da3c8becfd946d92cd44705cc6098bb23b3a16") version("0.7.0", sha256="43e6a9fcb146ad871515f0d0873947e5d497a1c9c60c58cb102a97b47208b7c3") version("0.6.3", sha256="77ea1b90b3718aa0c324207cb29418f5bced2354c2e483a9523d98c3460af1ed") version("0.6.2", sha256="e4d8560e163c3d875fd5d9e5542b5fd5bec810febdcba61481fe5fc4e6b1fd05") @@ -86,8 +87,10 @@ def cmake_args(self): return options def url_for_version(self, version): - url = "https://github.com/jbeder/yaml-cpp/archive/{0}-{1}.tar.gz" + url = "https://github.com/jbeder/yaml-cpp/archive/{0}.tar.gz" if version < Version("0.5.3"): - return url.format("release", version) + return url.format(f"release-{version}") + elif version < Version("0.8.0"): + return url.format(f"yaml-cpp-{version}") else: - return url.format("yaml-cpp", version) + return url.format(version) diff --git a/var/spack/repos/builtin/packages/yq/package.py b/var/spack/repos/builtin/packages/yq/package.py index e3f74037b0aa20..9c94f459fe3404 100644 --- a/var/spack/repos/builtin/packages/yq/package.py +++ b/var/spack/repos/builtin/packages/yq/package.py @@ -17,7 +17,12 @@ class Yq(GoPackage): license("MIT", checked_by="teaguesterling") + version("4.44.3", sha256="ea950f5622480fc0ff3708c52589426a737cd4ec887a52922a74efa1be8f2fbf") version("4.43.1", sha256="e5581d28bae2bcdf70501dfd251233c592eb3e39a210956ee74965b784435d63") version("4.41.1", sha256="25d61e72887f57510f88d1a30d515c7e2d79e7c6dce5c96aea7c069fcbc089e7") version("4.40.7", sha256="c38024d40ee37d26caba1824965d9ea1d65468f48b2bacd45647ff4f547fa59f") version("4.35.2", sha256="8b17d710c56f764e9beff06d7a7b1c77d87c4ba4219ce4ce67e7ee29670f4f13") + + # from go.mod + depends_on("go@1.21:", type="build", when="@4.40:") + depends_on("go@1.20:", type="build", when="@4.31:") diff --git a/var/spack/repos/builtin/packages/zlib-ng/package.py b/var/spack/repos/builtin/packages/zlib-ng/package.py index 45e7282e2f73a2..2daba38d7a9bf9 100644 --- a/var/spack/repos/builtin/packages/zlib-ng/package.py +++ b/var/spack/repos/builtin/packages/zlib-ng/package.py @@ -3,6 +3,8 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) +import sys + from spack.build_systems import autotools, cmake from spack.package import * @@ -55,9 +57,15 @@ class ZlibNg(AutotoolsPackage, CMakePackage): @property def libs(self): - name = "libz" if self.spec.satisfies("+compat") else "libz-ng" + compat_name = "zlib" if sys.platform == "win32" else "libz" + non_compat_name = "zlib-ng" if sys.platform == "win32" else "libz-ng" + name = compat_name if self.spec.satisfies("+compat") else non_compat_name return find_libraries( - name, root=self.prefix, recursive=True, shared=self.spec.satisfies("+shared") + name, + root=self.prefix, + recursive=True, + shared=self.spec.satisfies("+shared"), + runtime=False, ) def flag_handler(self, name, flags): diff --git a/var/spack/repos/builtin/packages/zookeeper/package.py b/var/spack/repos/builtin/packages/zookeeper/package.py index 12d4e37eb90575..3e57b856e69667 100644 --- a/var/spack/repos/builtin/packages/zookeeper/package.py +++ b/var/spack/repos/builtin/packages/zookeeper/package.py @@ -13,14 +13,27 @@ class Zookeeper(Package): """ homepage = "https://archive.apache.org" - url = "https://archive.apache.org/dist/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz" + urls = [ + "https://archive.apache.org/dist/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz", + "https://archive.apache.org/dist/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz", + ] license("Apache-2.0") - version("3.4.11", sha256="f6bd68a1c8f7c13ea4c2c99f13082d0d71ac464ffaf3bf7a365879ab6ad10e84") + version("3.8.4", sha256="284cb4675adb64794c63d95bf202d265cebddc0cda86ac86fb0ede8049de9187") + with default_args(deprecated=True): + # 3.6 is EoL since 30th of December, 2022 + # 3.5 is EoL since 1st of June, 2022 + version( + "3.4.11", sha256="f6bd68a1c8f7c13ea4c2c99f13082d0d71ac464ffaf3bf7a365879ab6ad10e84" + ) - depends_on("c", type="build") # generated - depends_on("cxx", type="build") # generated + depends_on("java") def install(self, spec, prefix): install_tree(".", prefix) + + def setup_run_environment(self, env): + env.set("ZOOBINDIR", self.prefix.bin) + env.set("ZOOCFGDIR", ".") + env.set("ZOO_LOG_DIR", ".") diff --git a/var/spack/repos/builtin/packages/zoxide/package.py b/var/spack/repos/builtin/packages/zoxide/package.py index d352495c5a407b..7c25679b34bad4 100644 --- a/var/spack/repos/builtin/packages/zoxide/package.py +++ b/var/spack/repos/builtin/packages/zoxide/package.py @@ -19,4 +19,6 @@ class Zoxide(CargoPackage): license("MIT") + version("0.9.6", sha256="e1811511a4a9caafa18b7d1505147d4328b39f6ec88b88097fe0dad59919f19c") + version("0.9.5", sha256="1278660e671d96c5421f0910fa7d79b9e0bb0bfacf7611ff63bf383f721d7a4f") version("0.9.4", sha256="ec002bdca37917130ae34e733eb29d4baa03b130c4b11456d630a01a938e0187") diff --git a/var/spack/repos/builtin/packages/zziplib/package.py b/var/spack/repos/builtin/packages/zziplib/package.py index fbccabdc7de1f4..d91c0cf2ce07b2 100644 --- a/var/spack/repos/builtin/packages/zziplib/package.py +++ b/var/spack/repos/builtin/packages/zziplib/package.py @@ -17,6 +17,7 @@ class Zziplib(AutotoolsPackage, CMakePackage): homepage = "https://github.com/gdraheim/zziplib" url = "https://github.com/gdraheim/zziplib/archive/v0.13.69.tar.gz" + version("0.13.78", sha256="feaeee7c34f18aa27bd3da643cc6a47d04d2c41753a59369d09102d79b9b0a31") version("0.13.72", sha256="93ef44bf1f1ea24fc66080426a469df82fa631d13ca3b2e4abaeab89538518dc") version("0.13.69", sha256="846246d7cdeee405d8d21e2922c6e97f55f24ecbe3b6dcf5778073a88f120544") diff --git a/var/spack/repos/flags.test/packages/t/package.py b/var/spack/repos/flags.test/packages/t/package.py new file mode 100644 index 00000000000000..359f8f4f0345e8 --- /dev/null +++ b/var/spack/repos/flags.test/packages/t/package.py @@ -0,0 +1,15 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +from spack.package import * + + +class T(Package): + version("5.0") + + depends_on("u") + depends_on("x+activatemultiflag") + depends_on("y cflags='-c1 -c2'") + + depends_on("c", type="build") diff --git a/var/spack/repos/flags.test/packages/u/package.py b/var/spack/repos/flags.test/packages/u/package.py new file mode 100644 index 00000000000000..7839ab8191af5d --- /dev/null +++ b/var/spack/repos/flags.test/packages/u/package.py @@ -0,0 +1,13 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +from spack.package import * + + +class U(Package): + version("6.0") + + depends_on("y cflags='-e1 -e2'") + + depends_on("c", type="build") diff --git a/var/spack/repos/flags.test/packages/v/package.py b/var/spack/repos/flags.test/packages/v/package.py new file mode 100644 index 00000000000000..afc8c5117c8d10 --- /dev/null +++ b/var/spack/repos/flags.test/packages/v/package.py @@ -0,0 +1,14 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +from spack.package import * + + +class V(Package): + version("4.1") + version("4.0") + + depends_on("y") + + depends_on("c", type="build") diff --git a/var/spack/repos/flags.test/packages/w/package.py b/var/spack/repos/flags.test/packages/w/package.py new file mode 100644 index 00000000000000..dbfadf6851a9c0 --- /dev/null +++ b/var/spack/repos/flags.test/packages/w/package.py @@ -0,0 +1,18 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +from spack.package import * + + +class W(Package): + version("3.1") + version("3.0") + + variant("moveflaglater", default=False) + + depends_on("x +activatemultiflag") + depends_on('y cflags="-d0"', when="~moveflaglater") + depends_on('y cflags="-d3"', when="+moveflaglater") + + depends_on("c", type="build") diff --git a/var/spack/repos/flags.test/packages/x/package.py b/var/spack/repos/flags.test/packages/x/package.py new file mode 100644 index 00000000000000..d7c1c076306dc9 --- /dev/null +++ b/var/spack/repos/flags.test/packages/x/package.py @@ -0,0 +1,16 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +from spack.package import * + + +class X(Package): + version("1.1") + version("1.0") + + variant("activatemultiflag", default=False) + depends_on('y cflags="-d1"', when="~activatemultiflag") + depends_on('y cflags="-d1 -d2"', when="+activatemultiflag") + + depends_on("c", type="build") diff --git a/var/spack/repos/flags.test/packages/y/package.py b/var/spack/repos/flags.test/packages/y/package.py new file mode 100644 index 00000000000000..ea736afb8a7933 --- /dev/null +++ b/var/spack/repos/flags.test/packages/y/package.py @@ -0,0 +1,12 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +from spack.package import * + + +class Y(Package): + version("2.1") + version("2.0") + + depends_on("c", type="build") diff --git a/var/spack/repos/flags.test/repo.yaml b/var/spack/repos/flags.test/repo.yaml new file mode 100644 index 00000000000000..a87dc9ca963093 --- /dev/null +++ b/var/spack/repos/flags.test/repo.yaml @@ -0,0 +1,2 @@ +repo: + namespace: flags.test diff --git a/var/spack/repos/requirements.test/packages/t/package.py b/var/spack/repos/requirements.test/packages/t/package.py new file mode 100644 index 00000000000000..f0ca8563dac874 --- /dev/null +++ b/var/spack/repos/requirements.test/packages/t/package.py @@ -0,0 +1,14 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +from spack.package import * + + +class T(Package): + version("2.1") + version("2.0") + + depends_on("u", when="@2.1:") + + depends_on("c", type="build") diff --git a/var/spack/repos/requirements.test/packages/u/package.py b/var/spack/repos/requirements.test/packages/u/package.py new file mode 100644 index 00000000000000..b2203459089fa1 --- /dev/null +++ b/var/spack/repos/requirements.test/packages/u/package.py @@ -0,0 +1,12 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +from spack.package import * + + +class U(Package): + version("1.1") + version("1.0") + + depends_on("c", type="build") diff --git a/var/spack/repos/requirements.test/packages/v/package.py b/var/spack/repos/requirements.test/packages/v/package.py new file mode 100644 index 00000000000000..426edbfb80bf0b --- /dev/null +++ b/var/spack/repos/requirements.test/packages/v/package.py @@ -0,0 +1,12 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +from spack.package import * + + +class V(Package): + version("2.1") + version("2.0") + + depends_on("c", type="build") diff --git a/var/spack/repos/requirements.test/packages/x/package.py b/var/spack/repos/requirements.test/packages/x/package.py new file mode 100644 index 00000000000000..93771c3311c991 --- /dev/null +++ b/var/spack/repos/requirements.test/packages/x/package.py @@ -0,0 +1,16 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +from spack.package import * + + +class X(Package): + version("1.1") + version("1.0") + version("0.9") + + variant("shared", default=True, description="Build shared libraries") + + depends_on("y") + depends_on("c", type="build") diff --git a/var/spack/repos/requirements.test/packages/y/package.py b/var/spack/repos/requirements.test/packages/y/package.py new file mode 100644 index 00000000000000..0ba70acf0603be --- /dev/null +++ b/var/spack/repos/requirements.test/packages/y/package.py @@ -0,0 +1,15 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +from spack.package import * + + +class Y(Package): + version("2.5") + version("2.4") + version("2.3", deprecated=True) + + variant("shared", default=True, description="Build shared libraries") + + depends_on("c", type="build") diff --git a/var/spack/repos/requirements.test/repo.yaml b/var/spack/repos/requirements.test/repo.yaml new file mode 100644 index 00000000000000..7be2a780ea7223 --- /dev/null +++ b/var/spack/repos/requirements.test/repo.yaml @@ -0,0 +1,2 @@ +repo: + namespace: requirements.test