From 5b3942a48935ee4aeef724b4a28c9666a75821c4 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Wed, 26 Mar 2025 05:32:49 +0100 Subject: [PATCH] Turn compilers into nodes (#45189) ## Summary Compilers stop being a *node attribute*, and become a *build-only* dependency. Packages may declare a dependency on the `c`, `cxx`, or `fortran` languages, which are now treated as virtuals, and compilers would be *providers* for one or more of those languages. Compilers can also inject runtime dependency, on the node being compiled. An example graph for something as simple as `zlib-ng` is the following:

zlib-ng DAG

Here `gcc` is used for both the `c`, and `cxx` languages. Edges are annotated with the virtuals they satisfy (`c`, `cxx`, `libc`). `gcc` injects `gcc-runtime` on the nodes being compiled. `glibc` is also injected for packages that require `c`. The `compiler-wrapper` is explicitly represented as a node in the DAG, and is included in the hash. This change in the model has implications on the semantics of the `%` sigil, as discussed in #44379, and requires a version bump for our `Specfile`, `Database`, and `Lockfile` formats. ## Breaking changes Breaking changes below may impact users of this branch. ### 1. Custom, non-numeric version of compilers are not supported Currently, users can assign to compilers any custom version they want, and Spack will try to recover the "real version" whenever the custom version fails some operation. To deduce the "real version" Spack must run the compiler, which can add needless overhead to common operations. Since any information that a version like `gcc@foo` might give to the user, can also be suffixed while retaining the correct numeric version, e.g. `gcc@10.5.0-foo`, Spack will **not try** anymore to deduce real versions for compilers. Said otherwise, users should have no expectation that `gcc@foo` behaves as `gcc@X.Y.Z` internally. ### 2. The `%` sigil in the spec syntax means "direct build dependency" The `%` sigil in the spec syntax means *"direct build dependency"*, and is not a node attribute anymore. This means that: ```python node.satisfies("%gcc") ``` is true only if `gcc` is a direct build dependency of the node. *Nodes without a compiler dependency are allowed.* ### `parent["child"]`, and `node in spec`, will now only inspect the link/run sub-DAG and direct build dependencies The subscript notation for `Spec`: ```python parent["child"] ``` will look for a `child` node only in the link/run transitive graph of `parent`, and in its direct build dependencies. This means that to reach a transitive build dependency, we must first pass through the node it is associated with. Assuming `parent` does not depend on `cmake`, but depends on a `CMakePackage`, e.g. `hdf5`, then we have the following situation: ```python # This one raises an Exception, since "parent" does not depend on cmake parent["cmake"] # This one is ok cmake = parent["hdf5"]["cmake"] ``` ### 3. Externals differing by just the compiler attribute Externals are nodes where dependencies are trimmed, and that _is not planned to change_ in this branch. Currently, on `develop` it is ok to write: ```yaml packages: hdf5: externals: - spec: hdf5@1.12 %gcc prefix: /prefix/gcc - spec: hdf5@1.12 %clang prefix: /prefix/clang ``` and Spack will account for the compiler node attribute when computing the optimal spec. In this branch, using externals with a compiler specified is allowed only if any compiler in the dag matches the constraints specified on the external. _The external will be still represented as a single node without dependencies_. ### 4. Spec matrices enforcing a compiler Currently we can have matrices of the form: ```yaml matrix: - [x, y, z] - [%gcc, %clang] ``` to get the cross-product of specs and compilers. We can disregard the nature of the packages in the first row, since the compiler is a node attribute required on each node. In this branch, instead, we require a spec to depend on `c`, `cxx`, or `fortran` for the `%` to have any meaning. If any of the specs in the first row doesn't depend on these languages, there will be a concretization error. ## Deprecations * The entire `compilers` section in the configuration (i.e., `compilers.yaml`) has been deprecated, and current entries will be removed in v1.2.0. For the time being, if Spack finds any `compilers` configuration, it will try to convert it automatically to a set of external packages. * The `packages:compiler` soft-preference has been deprecated. It will be removed in v1.1.0. ## Other notable changes * The tokens `{compiler}`, `{compiler.version}`, and `{compiler.name}` in `Spec.format` expand to `"none"` if a Spec does not depend on C, C++, or Fortran. * The default install tree layout is now `"{architecture.platform}-{architecture.target}/{name}-{version}-{hash}"` ## Known limitations The major known limitations of this branch that we intend to fix before v1.0 is that compilers cannot be bootstrapped directly. In this branch we can build a new compiler using an existing external compiler, for instance: ``` $ spack install gcc@14 %gcc@10.5.0 ``` where `gcc@10.5.0` is external, and `gcc@14` is to be built. What we can't do at the moment is use a yet to be built compiler, and expect it will be bootstrapped, e.g. : ``` spack install hdf5 %gcc@14 ``` We plan to tackle this issue in a following PR. --------- Signed-off-by: Massimiliano Culpo Signed-off-by: Todd Gamblin Signed-off-by: Harmen Stoppels Co-authored-by: Harmen Stoppels Co-authored-by: Todd Gamblin --- etc/spack/defaults/config.yaml | 2 +- etc/spack/defaults/darwin/packages.yaml | 16 +- etc/spack/defaults/packages.yaml | 7 +- etc/spack/defaults/windows/packages.yaml | 4 +- lib/spack/docs/pipelines.rst | 2 +- lib/spack/env/aocc/clang | 1 - lib/spack/env/aocc/clang++ | 1 - lib/spack/env/aocc/flang | 1 - lib/spack/env/arm/armclang | 1 - lib/spack/env/arm/armclang++ | 1 - lib/spack/env/arm/armflang | 1 - lib/spack/env/c++ | 1 - lib/spack/env/c89 | 1 - lib/spack/env/c99 | 1 - lib/spack/env/case-insensitive/CC | 1 - lib/spack/env/cce/case-insensitive/CC | 1 - lib/spack/env/cce/case-insensitive/crayCC | 1 - lib/spack/env/cce/cc | 1 - lib/spack/env/cce/craycc | 1 - lib/spack/env/cce/crayftn | 1 - lib/spack/env/cce/ftn | 1 - lib/spack/env/clang/clang | 1 - lib/spack/env/clang/clang++ | 1 - lib/spack/env/clang/flang | 1 - lib/spack/env/clang/gfortran | 1 - lib/spack/env/cpp | 1 - lib/spack/env/f77 | 1 - lib/spack/env/f90 | 1 - lib/spack/env/f95 | 1 - lib/spack/env/fc | 1 - lib/spack/env/fj/case-insensitive/FCC | 1 - lib/spack/env/fj/fcc | 1 - lib/spack/env/fj/frt | 1 - lib/spack/env/ftn | 1 - lib/spack/env/gcc/g++ | 1 - lib/spack/env/gcc/gcc | 1 - lib/spack/env/gcc/gfortran | 1 - lib/spack/env/intel/icc | 1 - lib/spack/env/intel/icpc | 1 - lib/spack/env/intel/ifort | 1 - lib/spack/env/ld | 1 - lib/spack/env/ld.gold | 1 - lib/spack/env/ld.lld | 1 - lib/spack/env/nag/nagfor | 1 - lib/spack/env/nvhpc/nvc | 1 - lib/spack/env/nvhpc/nvc++ | 1 - lib/spack/env/nvhpc/nvfortran | 1 - lib/spack/env/oneapi/dpcpp | 1 - lib/spack/env/oneapi/icpx | 1 - lib/spack/env/oneapi/icx | 1 - lib/spack/env/oneapi/ifx | 1 - lib/spack/env/pgi/pgc++ | 1 - lib/spack/env/pgi/pgcc | 1 - lib/spack/env/pgi/pgfortran | 1 - lib/spack/env/rocmcc/amdclang | 1 - lib/spack/env/rocmcc/amdclang++ | 1 - lib/spack/env/rocmcc/amdflang | 1 - lib/spack/env/xl/xlc | 1 - lib/spack/env/xl/xlc++ | 1 - lib/spack/env/xl/xlf | 1 - lib/spack/env/xl/xlf90 | 1 - lib/spack/env/xl_r/xlc++_r | 1 - lib/spack/env/xl_r/xlc_r | 1 - lib/spack/env/xl_r/xlf90_r | 1 - lib/spack/env/xl_r/xlf_r | 1 - lib/spack/llnl/util/lang.py | 9 +- lib/spack/spack/aliases.py | 20 + lib/spack/spack/binary_distribution.py | 9 +- lib/spack/spack/bootstrap/_common.py | 8 - lib/spack/spack/bootstrap/clingo.py | 48 +- lib/spack/spack/bootstrap/config.py | 6 +- .../prototypes/clingo-darwin-aarch64.json | 2 +- .../prototypes/clingo-darwin-x86_64.json | 2 +- .../prototypes/clingo-freebsd-amd64.json | 2 +- .../prototypes/clingo-linux-aarch64.json | 2 +- .../prototypes/clingo-linux-ppc64le.json | 2 +- .../prototypes/clingo-linux-x86_64.json | 2 +- .../prototypes/clingo-windows-x86_64.json | 2 +- lib/spack/spack/build_environment.py | 224 +---- lib/spack/spack/build_systems/autotools.py | 38 +- lib/spack/spack/build_systems/cached_cmake.py | 16 +- lib/spack/spack/build_systems/compiler.py | 123 ++- lib/spack/spack/build_systems/msbuild.py | 2 +- lib/spack/spack/build_systems/python.py | 4 - lib/spack/spack/ci/__init__.py | 8 +- lib/spack/spack/ci/common.py | 6 +- lib/spack/spack/cmd/__init__.py | 14 +- lib/spack/spack/cmd/compiler.py | 121 ++- lib/spack/spack/cmd/config.py | 6 - lib/spack/spack/cmd/find.py | 4 +- lib/spack/spack/cmd/license.py | 1 - lib/spack/spack/cmd/mirror.py | 17 +- lib/spack/spack/cmd/reindex.py | 12 + lib/spack/spack/compiler.py | 856 ---------------- lib/spack/spack/compilers/__init__.py | 833 ---------------- lib/spack/spack/compilers/adaptor.py | 209 ++++ lib/spack/spack/compilers/aocc.py | 119 --- lib/spack/spack/compilers/apple_clang.py | 115 --- lib/spack/spack/compilers/arm.py | 79 -- lib/spack/spack/compilers/cce.py | 127 --- lib/spack/spack/compilers/clang.py | 191 ---- lib/spack/spack/compilers/config.py | 370 +++++++ lib/spack/spack/compilers/error.py | 18 + lib/spack/spack/compilers/fj.py | 78 -- lib/spack/spack/compilers/flags.py | 25 + lib/spack/spack/compilers/gcc.py | 190 ---- lib/spack/spack/compilers/intel.py | 130 --- lib/spack/spack/compilers/libraries.py | 431 ++++++++ lib/spack/spack/compilers/msvc.py | 393 -------- lib/spack/spack/compilers/nag.py | 111 --- lib/spack/spack/compilers/nvhpc.py | 78 -- lib/spack/spack/compilers/oneapi.py | 171 ---- lib/spack/spack/compilers/rocmcc.py | 53 - lib/spack/spack/compilers/xl.py | 92 -- lib/spack/spack/compilers/xl_r.py | 17 - lib/spack/spack/concretize.py | 23 +- lib/spack/spack/cray_manifest.py | 128 ++- lib/spack/spack/database.py | 99 +- lib/spack/spack/detection/common.py | 1 + lib/spack/spack/directives.py | 24 +- lib/spack/spack/directory_layout.py | 2 +- lib/spack/spack/environment/__init__.py | 89 +- lib/spack/spack/environment/depfile.py | 4 +- lib/spack/spack/environment/environment.py | 3 +- lib/spack/spack/mixins.py | 22 +- lib/spack/spack/modules/lmod.py | 83 +- lib/spack/spack/package_base.py | 32 +- lib/spack/spack/paths.py | 1 - lib/spack/spack/provider_index.py | 4 +- lib/spack/spack/repo.py | 4 +- lib/spack/spack/report.py | 1 - lib/spack/spack/schema/packages.py | 9 + lib/spack/spack/solver/asp.py | 649 ++++++------ lib/spack/spack/solver/concretize.lp | 530 +++++----- lib/spack/spack/solver/heuristic.lp | 27 +- lib/spack/spack/solver/input_analysis.py | 10 +- lib/spack/spack/solver/libc_compatibility.lp | 36 +- lib/spack/spack/solver/requirements.py | 43 +- lib/spack/spack/spec.py | 485 +++++---- lib/spack/spack/spec_parser.py | 50 +- lib/spack/spack/test/abi_splicing.py | 10 +- lib/spack/spack/test/architecture.py | 4 +- lib/spack/spack/test/bindist.py | 29 +- lib/spack/spack/test/bootstrap.py | 32 +- lib/spack/spack/test/build_environment.py | 234 ++--- lib/spack/spack/test/cc.py | 421 ++++---- lib/spack/spack/test/ci.py | 61 +- lib/spack/spack/test/cmd/ci.py | 4 +- lib/spack/spack/test/cmd/compiler.py | 122 +-- lib/spack/spack/test/cmd/dependencies.py | 30 +- lib/spack/spack/test/cmd/diff.py | 4 +- lib/spack/spack/test/cmd/env.py | 2 +- lib/spack/spack/test/cmd/find.py | 41 +- lib/spack/spack/test/cmd/gc.py | 5 +- lib/spack/spack/test/cmd/install.py | 90 +- lib/spack/spack/test/cmd/load.py | 16 +- lib/spack/spack/test/cmd/location.py | 4 +- lib/spack/spack/test/cmd/logs.py | 12 +- lib/spack/spack/test/cmd/maintainers.py | 12 +- lib/spack/spack/test/cmd/mark.py | 8 +- lib/spack/spack/test/cmd/mirror.py | 2 +- lib/spack/spack/test/cmd/reindex.py | 19 +- lib/spack/spack/test/cmd/stage.py | 9 +- lib/spack/spack/test/cmd/test.py | 2 +- lib/spack/spack/test/cmd/uninstall.py | 11 +- lib/spack/spack/test/cmd/verify.py | 5 +- lib/spack/spack/test/cmd/view.py | 82 +- lib/spack/spack/test/compilers/__init__.py | 3 - lib/spack/spack/test/compilers/basics.py | 940 ------------------ lib/spack/spack/test/compilers/conversion.py | 85 ++ lib/spack/spack/test/compilers/libraries.py | 124 +++ .../test/concretization/compiler_runtimes.py | 38 +- lib/spack/spack/test/concretization/core.py | 775 ++++++++------- lib/spack/spack/test/concretization/errors.py | 2 +- .../spack/test/concretization/flag_mixing.py | 73 +- .../spack/test/concretization/preferences.py | 16 +- .../spack/test/concretization/requirements.py | 57 +- lib/spack/spack/test/config.py | 15 +- lib/spack/spack/test/conftest.py | 112 +-- lib/spack/spack/test/cray_manifest.py | 269 ++--- .../spack/test/data/config/compilers.yaml | 41 - .../spack/test/data/config/packages.yaml | 52 +- lib/spack/spack/test/database.py | 28 +- lib/spack/spack/test/directory_layout.py | 8 +- lib/spack/spack/test/env.py | 28 + lib/spack/spack/test/graph.py | 92 +- lib/spack/spack/test/installer.py | 40 +- lib/spack/spack/test/link_paths.py | 7 +- lib/spack/spack/test/llnl/util/lang.py | 8 - lib/spack/spack/test/modules/lmod.py | 14 +- lib/spack/spack/test/modules/tcl.py | 20 +- lib/spack/spack/test/multimethod.py | 11 +- lib/spack/spack/test/oci/integration_test.py | 15 +- lib/spack/spack/test/package_class.py | 44 +- lib/spack/spack/test/packages.py | 2 +- lib/spack/spack/test/solver/intermediate.py | 49 - lib/spack/spack/test/spec_dag.py | 411 +++++--- lib/spack/spack/test/spec_semantics.py | 118 ++- lib/spack/spack/test/spec_syntax.py | 55 +- lib/spack/spack/test/spec_yaml.py | 12 + lib/spack/spack/test/tag.py | 2 +- .../spack/test/util/remote_file_cache.py | 11 +- pytest.ini | 2 - .../gitlab/cloud_pipelines/.gitlab-ci.yml | 2 + .../cloud_pipelines/configs/config.yaml | 3 +- .../configs/cray-rhel/compilers.yaml | 27 - .../configs/cray-rhel/config.yaml | 4 - .../configs/cray-rhel/x86_64_v3/packages.yaml | 5 + .../cloud_pipelines/configs/linux/ci.yaml | 2 +- .../aws-pcluster-neoverse_v1/spack.yaml | 31 +- .../stacks/aws-pcluster-x86_64_v4/spack.yaml | 61 +- .../stacks/build_systems/spack.yaml | 3 + .../spack.yaml | 3 +- .../spack.yaml | 5 +- .../stacks/e4s-cray-rhel/spack.yaml | 3 + .../stacks/e4s-oneapi/spack.yaml | 15 +- .../cloud_pipelines/stacks/e4s/spack.yaml | 6 + share/spack/qa/setup.sh | 1 - share/spack/spack-completion.fish | 10 +- .../builtin.mock/packages/bowtie/package.py | 5 +- .../builtin.mock/packages/callpath/package.py | 2 + .../packages/cmake-client/package.py | 2 + .../builtin.mock/packages/cmake/package.py | 3 + .../builtin.mock/packages/compiler-wrapper | 1 + .../packages/conflict-parent/package.py | 1 + .../builtin.mock/packages/conflict/package.py | 2 + .../packages/dt-diamond-bottom/package.py | 2 + .../packages/dt-diamond-left/package.py | 1 + .../packages/dt-diamond-right/package.py | 1 + .../packages/dt-diamond/package.py | 2 + .../builtin.mock/packages/dyninst/package.py | 2 + .../builtin.mock/packages/fftw/package.py | 2 + .../repos/builtin.mock/packages/gcc-runtime | 1 + .../builtin.mock/packages/gcc/package.py | 86 +- .../intel-oneapi-compilers/package.py | 2 + .../builtin.mock/packages/libdwarf/package.py | 3 + .../builtin.mock/packages/libelf/package.py | 2 + .../builtin.mock/packages/llvm/package.py | 20 + .../builtin.mock/packages/mpich/package.py | 4 + .../builtin.mock/packages/mpich2/package.py | 2 + .../builtin.mock/packages/mpileaks/package.py | 2 + .../packages/multimethod/package.py | 3 +- .../packages/multivalue-variant/package.py | 2 + .../packages/openblas-with-lapack/package.py | 1 + .../builtin.mock/packages/openblas/package.py | 2 + .../builtin.mock/packages/pkg-a/package.py | 2 + .../builtin.mock/packages/pkg-b/package.py | 1 + .../builtin.mock/packages/pkg-c/package.py | 12 + .../packages/requires_clang/package.py | 2 + .../packages/requires_clang_or_gcc/package.py | 2 + .../packages/simple-inheritance/package.py | 2 + .../sticky-variant-dependent/package.py | 2 + .../packages/sticky-variant/package.py | 2 + .../packages/with-constraint-met/package.py | 2 + .../builtin.mock/packages/zmpi/package.py | 2 + .../repos/builtin/packages/acfl/package.py | 47 +- .../repos/builtin/packages/aocc/package.py | 33 +- .../builtin/packages/apple-clang/package.py | 38 + .../builtin/packages/armpl-gcc/package.py | 7 +- .../repos/builtin/packages/ascent/package.py | 5 +- .../repos/builtin/packages/blt/package.py | 4 +- .../repos/builtin/packages/bzip2/package.py | 3 + .../repos/builtin/packages/cce/package.py | 44 +- .../repos/builtin/packages/claw/package.py | 29 - .../repos/builtin/packages/clingo/package.py | 8 +- .../repos/builtin/packages/cmake/package.py | 10 - .../builtin/packages/compiler-wrapper/cc.sh | 34 +- .../packages/compiler-wrapper/package.py | 274 +++++ .../repos/builtin/packages/conduit/package.py | 7 +- .../builtin/packages/cray-libsci/package.py | 7 +- .../builtin/packages/cray-mpich/package.py | 13 +- .../builtin/packages/cray-mvapich2/package.py | 13 +- .../repos/builtin/packages/cuda/package.py | 3 +- .../repos/builtin/packages/cxx/package.py | 19 +- .../repos/builtin/packages/dealii/package.py | 8 +- .../repos/builtin/packages/esmf/package.py | 28 +- .../repos/builtin/packages/fj/package.py | 31 + .../builtin/packages/gcc-runtime/package.py | 33 +- .../repos/builtin/packages/gcc/package.py | 108 +- .../repos/builtin/packages/glibc/package.py | 2 + .../repos/builtin/packages/go/package.py | 7 +- .../repos/builtin/packages/gromacs/package.py | 2 +- .../intel-oneapi-compilers-classic/package.py | 39 + .../intel-oneapi-compilers/package.py | 124 ++- .../packages/intel-oneapi-mpi/package.py | 14 +- .../packages/intel-oneapi-runtime/package.py | 6 +- .../repos/builtin/packages/intel/package.py | 8 +- .../builtin/packages/libtheora/package.py | 2 +- .../repos/builtin/packages/libxml2/package.py | 2 +- .../builtin/packages/llvm-amdgpu/package.py | 33 +- .../repos/builtin/packages/llvm/package.py | 104 +- .../repos/builtin/packages/lvarray/package.py | 9 +- .../repos/builtin/packages/mapl/package.py | 30 +- .../repos/builtin/packages/mpich/package.py | 29 +- .../repos/builtin/packages/msvc/package.py | 263 ++++- .../repos/builtin/packages/musl/package.py | 2 + .../builtin/packages/mvapich2/package.py | 4 +- .../repos/builtin/packages/nag/package.py | 50 +- .../repos/builtin/packages/ncurses/package.py | 6 +- .../repos/builtin/packages/nvhpc/package.py | 37 +- .../builtin/packages/openfoam/package.py | 7 +- .../repos/builtin/packages/openmpi/package.py | 18 +- .../repos/builtin/packages/openssl/package.py | 2 +- .../repos/builtin/packages/perl/package.py | 11 +- .../builtin/packages/py-maturin/package.py | 1 + .../packages/py-petsc4py/ldshared.patch | 2 +- .../packages/py-petsc4py/ldshared_319.patch | 12 + .../builtin/packages/py-petsc4py/package.py | 3 + .../packages/py-safetensors/package.py | 2 + .../builtin/packages/py-tokenizers/package.py | 3 + .../repos/builtin/packages/python/package.py | 30 +- .../builtin/packages/rpcsvc-proto/package.py | 3 +- .../builtin/packages/spectrum-mpi/package.py | 4 +- .../builtin/packages/taskflow/package.py | 2 +- .../repos/builtin/packages/vasp/package.py | 2 +- .../repos/builtin/packages/vtk-h/package.py | 5 +- .../builtin/packages/win-file/package.py | 2 + .../repos/builtin/packages/win-gpg/package.py | 2 + .../repos/builtin/packages/xl/package.py | 68 +- .../repos/builtin/packages/yafyaml/package.py | 29 - .../repos/builtin/packages/yoda/package.py | 1 + .../repos/builtin/packages/zlib-ng/package.py | 2 +- .../packages/compiler-wrapper | 1 + .../repos/compiler_runtime.test/packages/gcc | 1 + .../packages/gcc-runtime | 1 + .../packages/gcc-runtime/package.py | 12 - .../packages/gcc/package.py | 34 - .../compiler_runtime.test/packages/glibc | 1 + .../compiler_runtime.test/packages/gmake | 1 + .../compiler_runtime.test/packages/gnuconfig | 1 + .../packages/pkg-a/package.py | 3 + .../packages/pkg-b/package.py | 3 + var/spack/repos/duplicates.test/packages/gcc | 1 + .../duplicates.test/packages/gcc-runtime | 1 + .../repos/duplicates.test/packages/glibc | 1 + .../repos/duplicates.test/packages/gnuconfig | 1 + var/spack/repos/duplicates.test/packages/llvm | 1 + var/spack/repos/edges.test/packages/gcc | 1 + .../repos/edges.test/packages/gcc-runtime | 1 + var/spack/repos/edges.test/packages/glibc | 1 + var/spack/repos/edges.test/packages/gmake | 1 + var/spack/repos/edges.test/packages/gnuconfig | 1 + var/spack/repos/edges.test/packages/llvm | 1 + .../flags.test/packages/compiler-wrapper | 1 + var/spack/repos/flags.test/packages/gcc | 1 + .../repos/flags.test/packages/gcc-runtime | 1 + var/spack/repos/flags.test/packages/glibc | 1 + var/spack/repos/flags.test/packages/gmake | 1 + var/spack/repos/flags.test/packages/gnuconfig | 1 + .../packages/compiler-wrapper | 1 + .../repos/requirements.test/packages/gcc | 1 + .../requirements.test/packages/gcc-runtime | 1 + .../repos/requirements.test/packages/glibc | 1 + .../repos/requirements.test/packages/gmake | 1 + .../requirements.test/packages/gnuconfig | 1 + .../repos/requirements.test/packages/llvm | 1 + 356 files changed, 6522 insertions(+), 8412 deletions(-) delete mode 120000 lib/spack/env/aocc/clang delete mode 120000 lib/spack/env/aocc/clang++ delete mode 120000 lib/spack/env/aocc/flang delete mode 120000 lib/spack/env/arm/armclang delete mode 120000 lib/spack/env/arm/armclang++ delete mode 120000 lib/spack/env/arm/armflang delete mode 120000 lib/spack/env/c++ delete mode 120000 lib/spack/env/c89 delete mode 120000 lib/spack/env/c99 delete mode 120000 lib/spack/env/case-insensitive/CC delete mode 120000 lib/spack/env/cce/case-insensitive/CC delete mode 120000 lib/spack/env/cce/case-insensitive/crayCC delete mode 120000 lib/spack/env/cce/cc delete mode 120000 lib/spack/env/cce/craycc delete mode 120000 lib/spack/env/cce/crayftn delete mode 120000 lib/spack/env/cce/ftn delete mode 120000 lib/spack/env/clang/clang delete mode 120000 lib/spack/env/clang/clang++ delete mode 120000 lib/spack/env/clang/flang delete mode 120000 lib/spack/env/clang/gfortran delete mode 120000 lib/spack/env/cpp delete mode 120000 lib/spack/env/f77 delete mode 120000 lib/spack/env/f90 delete mode 120000 lib/spack/env/f95 delete mode 120000 lib/spack/env/fc delete mode 120000 lib/spack/env/fj/case-insensitive/FCC delete mode 120000 lib/spack/env/fj/fcc delete mode 120000 lib/spack/env/fj/frt delete mode 120000 lib/spack/env/ftn delete mode 120000 lib/spack/env/gcc/g++ delete mode 120000 lib/spack/env/gcc/gcc delete mode 120000 lib/spack/env/gcc/gfortran delete mode 120000 lib/spack/env/intel/icc delete mode 120000 lib/spack/env/intel/icpc delete mode 120000 lib/spack/env/intel/ifort delete mode 120000 lib/spack/env/ld delete mode 120000 lib/spack/env/ld.gold delete mode 120000 lib/spack/env/ld.lld delete mode 120000 lib/spack/env/nag/nagfor delete mode 120000 lib/spack/env/nvhpc/nvc delete mode 120000 lib/spack/env/nvhpc/nvc++ delete mode 120000 lib/spack/env/nvhpc/nvfortran delete mode 120000 lib/spack/env/oneapi/dpcpp delete mode 120000 lib/spack/env/oneapi/icpx delete mode 120000 lib/spack/env/oneapi/icx delete mode 120000 lib/spack/env/oneapi/ifx delete mode 120000 lib/spack/env/pgi/pgc++ delete mode 120000 lib/spack/env/pgi/pgcc delete mode 120000 lib/spack/env/pgi/pgfortran delete mode 120000 lib/spack/env/rocmcc/amdclang delete mode 120000 lib/spack/env/rocmcc/amdclang++ delete mode 120000 lib/spack/env/rocmcc/amdflang delete mode 120000 lib/spack/env/xl/xlc delete mode 120000 lib/spack/env/xl/xlc++ delete mode 120000 lib/spack/env/xl/xlf delete mode 120000 lib/spack/env/xl/xlf90 delete mode 120000 lib/spack/env/xl_r/xlc++_r delete mode 120000 lib/spack/env/xl_r/xlc_r delete mode 120000 lib/spack/env/xl_r/xlf90_r delete mode 120000 lib/spack/env/xl_r/xlf_r create mode 100644 lib/spack/spack/aliases.py delete mode 100644 lib/spack/spack/compiler.py create mode 100644 lib/spack/spack/compilers/adaptor.py delete mode 100644 lib/spack/spack/compilers/aocc.py delete mode 100644 lib/spack/spack/compilers/apple_clang.py delete mode 100644 lib/spack/spack/compilers/arm.py delete mode 100644 lib/spack/spack/compilers/cce.py delete mode 100644 lib/spack/spack/compilers/clang.py create mode 100644 lib/spack/spack/compilers/config.py create mode 100644 lib/spack/spack/compilers/error.py delete mode 100644 lib/spack/spack/compilers/fj.py create mode 100644 lib/spack/spack/compilers/flags.py delete mode 100644 lib/spack/spack/compilers/gcc.py delete mode 100644 lib/spack/spack/compilers/intel.py create mode 100644 lib/spack/spack/compilers/libraries.py delete mode 100644 lib/spack/spack/compilers/msvc.py delete mode 100644 lib/spack/spack/compilers/nag.py delete mode 100644 lib/spack/spack/compilers/nvhpc.py delete mode 100644 lib/spack/spack/compilers/oneapi.py delete mode 100644 lib/spack/spack/compilers/rocmcc.py delete mode 100644 lib/spack/spack/compilers/xl.py delete mode 100644 lib/spack/spack/compilers/xl_r.py delete mode 100644 lib/spack/spack/test/compilers/__init__.py delete mode 100644 lib/spack/spack/test/compilers/basics.py create mode 100644 lib/spack/spack/test/compilers/conversion.py create mode 100644 lib/spack/spack/test/compilers/libraries.py delete mode 100644 lib/spack/spack/test/data/config/compilers.yaml delete mode 100644 lib/spack/spack/test/solver/intermediate.py delete mode 100644 share/spack/gitlab/cloud_pipelines/configs/cray-rhel/compilers.yaml create mode 100644 share/spack/gitlab/cloud_pipelines/configs/cray-rhel/x86_64_v3/packages.yaml create mode 120000 var/spack/repos/builtin.mock/packages/compiler-wrapper create mode 120000 var/spack/repos/builtin.mock/packages/gcc-runtime rename lib/spack/env/cc => var/spack/repos/builtin/packages/compiler-wrapper/cc.sh (97%) create mode 100644 var/spack/repos/builtin/packages/compiler-wrapper/package.py create mode 100644 var/spack/repos/builtin/packages/py-petsc4py/ldshared_319.patch create mode 120000 var/spack/repos/compiler_runtime.test/packages/compiler-wrapper create mode 120000 var/spack/repos/compiler_runtime.test/packages/gcc create mode 120000 var/spack/repos/compiler_runtime.test/packages/gcc-runtime delete mode 100644 var/spack/repos/compiler_runtime.test/packages/gcc-runtime/package.py delete mode 100644 var/spack/repos/compiler_runtime.test/packages/gcc/package.py create mode 120000 var/spack/repos/compiler_runtime.test/packages/glibc create mode 120000 var/spack/repos/compiler_runtime.test/packages/gmake create mode 120000 var/spack/repos/compiler_runtime.test/packages/gnuconfig create mode 120000 var/spack/repos/duplicates.test/packages/gcc create mode 120000 var/spack/repos/duplicates.test/packages/gcc-runtime create mode 120000 var/spack/repos/duplicates.test/packages/glibc create mode 120000 var/spack/repos/duplicates.test/packages/gnuconfig create mode 120000 var/spack/repos/duplicates.test/packages/llvm create mode 120000 var/spack/repos/edges.test/packages/gcc create mode 120000 var/spack/repos/edges.test/packages/gcc-runtime create mode 120000 var/spack/repos/edges.test/packages/glibc create mode 120000 var/spack/repos/edges.test/packages/gmake create mode 120000 var/spack/repos/edges.test/packages/gnuconfig create mode 120000 var/spack/repos/edges.test/packages/llvm create mode 120000 var/spack/repos/flags.test/packages/compiler-wrapper create mode 120000 var/spack/repos/flags.test/packages/gcc create mode 120000 var/spack/repos/flags.test/packages/gcc-runtime create mode 120000 var/spack/repos/flags.test/packages/glibc create mode 120000 var/spack/repos/flags.test/packages/gmake create mode 120000 var/spack/repos/flags.test/packages/gnuconfig create mode 120000 var/spack/repos/requirements.test/packages/compiler-wrapper create mode 120000 var/spack/repos/requirements.test/packages/gcc create mode 120000 var/spack/repos/requirements.test/packages/gcc-runtime create mode 120000 var/spack/repos/requirements.test/packages/glibc create mode 120000 var/spack/repos/requirements.test/packages/gmake create mode 120000 var/spack/repos/requirements.test/packages/gnuconfig create mode 120000 var/spack/repos/requirements.test/packages/llvm diff --git a/etc/spack/defaults/config.yaml b/etc/spack/defaults/config.yaml index 14560372e62..9cca52fd353 100644 --- a/etc/spack/defaults/config.yaml +++ b/etc/spack/defaults/config.yaml @@ -19,7 +19,7 @@ config: install_tree: root: $spack/opt/spack projections: - all: "{architecture}/{compiler.name}-{compiler.version}/{name}-{version}-{hash}" + all: "{architecture.platform}-{architecture.target}/{name}-{version}-{hash}" # install_tree can include an optional padded length (int or boolean) # default is False (do not pad) # if padded_length is True, Spack will pad as close to the system max path diff --git a/etc/spack/defaults/darwin/packages.yaml b/etc/spack/defaults/darwin/packages.yaml index 6aba11f2738..4b0607bb3b3 100644 --- a/etc/spack/defaults/darwin/packages.yaml +++ b/etc/spack/defaults/darwin/packages.yaml @@ -15,12 +15,11 @@ # ------------------------------------------------------------------------- packages: all: - compiler: - - apple-clang - - clang - - gcc providers: + c: [apple-clang, llvm, gcc] + cxx: [apple-clang, llvm, gcc] elf: [libelf] + fortran: [gcc] fuse: [macfuse] gl: [apple-gl] glu: [apple-glu] @@ -50,3 +49,12 @@ packages: # although the version number used here isn't critical - spec: apple-libuuid@1353.100.2 prefix: /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk + c: + prefer: + - apple-clang + cxx: + prefer: + - apple-clang + fortran: + prefer: + - gcc diff --git a/etc/spack/defaults/packages.yaml b/etc/spack/defaults/packages.yaml index 0fcb8f08d7f..f23d55ffb9f 100644 --- a/etc/spack/defaults/packages.yaml +++ b/etc/spack/defaults/packages.yaml @@ -15,19 +15,18 @@ # ------------------------------------------------------------------------- packages: all: - compiler: [gcc, clang, oneapi, xl, nag, fj, aocc] providers: awk: [gawk] armci: [armcimpi] blas: [openblas, amdblis] - c: [gcc] - cxx: [gcc] + c: [gcc, llvm, intel-oneapi-compilers] + cxx: [gcc, llvm, intel-oneapi-compilers] D: [ldc] daal: [intel-oneapi-daal] elf: [elfutils] fftw-api: [fftw, amdfftw] flame: [libflame, amdlibflame] - fortran: [gcc] + fortran: [gcc, llvm, intel-oneapi-compilers] fortran-rt: [gcc-runtime, intel-oneapi-runtime] fuse: [libfuse] gl: [glx, osmesa] diff --git a/etc/spack/defaults/windows/packages.yaml b/etc/spack/defaults/windows/packages.yaml index c72ba8c0330..9d97fd5b6f8 100644 --- a/etc/spack/defaults/windows/packages.yaml +++ b/etc/spack/defaults/windows/packages.yaml @@ -15,8 +15,8 @@ # ------------------------------------------------------------------------- packages: all: - compiler: - - msvc providers: + c : [msvc] + cxx: [msvc] mpi: [msmpi] gl: [wgl] diff --git a/lib/spack/docs/pipelines.rst b/lib/spack/docs/pipelines.rst index 2dd2f2cd80f..bbb4ffad723 100644 --- a/lib/spack/docs/pipelines.rst +++ b/lib/spack/docs/pipelines.rst @@ -330,7 +330,7 @@ that ``--tests`` is passed to ``spack ci rebuild`` as part of the - spack --version - cd ${SPACK_CONCRETE_ENV_DIR} - spack env activate --without-view . - - spack config add "config:install_tree:projections:${SPACK_JOB_SPEC_PKG_NAME}:'morepadding/{architecture}/{compiler.name}-{compiler.version}/{name}-{version}-{hash}'" + - spack config add "config:install_tree:projections:${SPACK_JOB_SPEC_PKG_NAME}:'morepadding/{architecture.platform}-{architecture.target}/{name}-{version}-{hash}'" - mkdir -p ${SPACK_ARTIFACTS_ROOT}/user_data - if [[ -r /mnt/key/intermediate_ci_signing_key.gpg ]]; then spack gpg trust /mnt/key/intermediate_ci_signing_key.gpg; fi - if [[ -r /mnt/key/spack_public_key.gpg ]]; then spack gpg trust /mnt/key/spack_public_key.gpg; fi diff --git a/lib/spack/env/aocc/clang b/lib/spack/env/aocc/clang deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/aocc/clang +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/aocc/clang++ b/lib/spack/env/aocc/clang++ deleted file mode 120000 index abf4cd45c7c..00000000000 --- a/lib/spack/env/aocc/clang++ +++ /dev/null @@ -1 +0,0 @@ -../cpp \ No newline at end of file diff --git a/lib/spack/env/aocc/flang b/lib/spack/env/aocc/flang deleted file mode 120000 index b6c64233b03..00000000000 --- a/lib/spack/env/aocc/flang +++ /dev/null @@ -1 +0,0 @@ -../fc \ No newline at end of file diff --git a/lib/spack/env/arm/armclang b/lib/spack/env/arm/armclang deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/arm/armclang +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/arm/armclang++ b/lib/spack/env/arm/armclang++ deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/arm/armclang++ +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/arm/armflang b/lib/spack/env/arm/armflang deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/arm/armflang +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/c++ b/lib/spack/env/c++ deleted file mode 120000 index 2652f5f42c0..00000000000 --- a/lib/spack/env/c++ +++ /dev/null @@ -1 +0,0 @@ -cc \ No newline at end of file diff --git a/lib/spack/env/c89 b/lib/spack/env/c89 deleted file mode 120000 index 2652f5f42c0..00000000000 --- a/lib/spack/env/c89 +++ /dev/null @@ -1 +0,0 @@ -cc \ No newline at end of file diff --git a/lib/spack/env/c99 b/lib/spack/env/c99 deleted file mode 120000 index 2652f5f42c0..00000000000 --- a/lib/spack/env/c99 +++ /dev/null @@ -1 +0,0 @@ -cc \ No newline at end of file diff --git a/lib/spack/env/case-insensitive/CC b/lib/spack/env/case-insensitive/CC deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/case-insensitive/CC +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/cce/case-insensitive/CC b/lib/spack/env/cce/case-insensitive/CC deleted file mode 120000 index e2deb67f3b6..00000000000 --- a/lib/spack/env/cce/case-insensitive/CC +++ /dev/null @@ -1 +0,0 @@ -../../cc \ No newline at end of file diff --git a/lib/spack/env/cce/case-insensitive/crayCC b/lib/spack/env/cce/case-insensitive/crayCC deleted file mode 120000 index e2deb67f3b6..00000000000 --- a/lib/spack/env/cce/case-insensitive/crayCC +++ /dev/null @@ -1 +0,0 @@ -../../cc \ No newline at end of file diff --git a/lib/spack/env/cce/cc b/lib/spack/env/cce/cc deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/cce/cc +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/cce/craycc b/lib/spack/env/cce/craycc deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/cce/craycc +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/cce/crayftn b/lib/spack/env/cce/crayftn deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/cce/crayftn +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/cce/ftn b/lib/spack/env/cce/ftn deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/cce/ftn +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/clang/clang b/lib/spack/env/clang/clang deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/clang/clang +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/clang/clang++ b/lib/spack/env/clang/clang++ deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/clang/clang++ +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/clang/flang b/lib/spack/env/clang/flang deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/clang/flang +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/clang/gfortran b/lib/spack/env/clang/gfortran deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/clang/gfortran +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/cpp b/lib/spack/env/cpp deleted file mode 120000 index 2652f5f42c0..00000000000 --- a/lib/spack/env/cpp +++ /dev/null @@ -1 +0,0 @@ -cc \ No newline at end of file diff --git a/lib/spack/env/f77 b/lib/spack/env/f77 deleted file mode 120000 index 2652f5f42c0..00000000000 --- a/lib/spack/env/f77 +++ /dev/null @@ -1 +0,0 @@ -cc \ No newline at end of file diff --git a/lib/spack/env/f90 b/lib/spack/env/f90 deleted file mode 120000 index 2652f5f42c0..00000000000 --- a/lib/spack/env/f90 +++ /dev/null @@ -1 +0,0 @@ -cc \ No newline at end of file diff --git a/lib/spack/env/f95 b/lib/spack/env/f95 deleted file mode 120000 index 2652f5f42c0..00000000000 --- a/lib/spack/env/f95 +++ /dev/null @@ -1 +0,0 @@ -cc \ No newline at end of file diff --git a/lib/spack/env/fc b/lib/spack/env/fc deleted file mode 120000 index 2652f5f42c0..00000000000 --- a/lib/spack/env/fc +++ /dev/null @@ -1 +0,0 @@ -cc \ No newline at end of file diff --git a/lib/spack/env/fj/case-insensitive/FCC b/lib/spack/env/fj/case-insensitive/FCC deleted file mode 120000 index e2deb67f3b6..00000000000 --- a/lib/spack/env/fj/case-insensitive/FCC +++ /dev/null @@ -1 +0,0 @@ -../../cc \ No newline at end of file diff --git a/lib/spack/env/fj/fcc b/lib/spack/env/fj/fcc deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/fj/fcc +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/fj/frt b/lib/spack/env/fj/frt deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/fj/frt +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/ftn b/lib/spack/env/ftn deleted file mode 120000 index 2652f5f42c0..00000000000 --- a/lib/spack/env/ftn +++ /dev/null @@ -1 +0,0 @@ -cc \ No newline at end of file diff --git a/lib/spack/env/gcc/g++ b/lib/spack/env/gcc/g++ deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/gcc/g++ +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/gcc/gcc b/lib/spack/env/gcc/gcc deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/gcc/gcc +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/gcc/gfortran b/lib/spack/env/gcc/gfortran deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/gcc/gfortran +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/intel/icc b/lib/spack/env/intel/icc deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/intel/icc +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/intel/icpc b/lib/spack/env/intel/icpc deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/intel/icpc +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/intel/ifort b/lib/spack/env/intel/ifort deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/intel/ifort +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/ld b/lib/spack/env/ld deleted file mode 120000 index 2652f5f42c0..00000000000 --- a/lib/spack/env/ld +++ /dev/null @@ -1 +0,0 @@ -cc \ No newline at end of file diff --git a/lib/spack/env/ld.gold b/lib/spack/env/ld.gold deleted file mode 120000 index 2652f5f42c0..00000000000 --- a/lib/spack/env/ld.gold +++ /dev/null @@ -1 +0,0 @@ -cc \ No newline at end of file diff --git a/lib/spack/env/ld.lld b/lib/spack/env/ld.lld deleted file mode 120000 index 2652f5f42c0..00000000000 --- a/lib/spack/env/ld.lld +++ /dev/null @@ -1 +0,0 @@ -cc \ No newline at end of file diff --git a/lib/spack/env/nag/nagfor b/lib/spack/env/nag/nagfor deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/nag/nagfor +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/nvhpc/nvc b/lib/spack/env/nvhpc/nvc deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/nvhpc/nvc +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/nvhpc/nvc++ b/lib/spack/env/nvhpc/nvc++ deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/nvhpc/nvc++ +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/nvhpc/nvfortran b/lib/spack/env/nvhpc/nvfortran deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/nvhpc/nvfortran +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/oneapi/dpcpp b/lib/spack/env/oneapi/dpcpp deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/oneapi/dpcpp +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/oneapi/icpx b/lib/spack/env/oneapi/icpx deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/oneapi/icpx +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/oneapi/icx b/lib/spack/env/oneapi/icx deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/oneapi/icx +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/oneapi/ifx b/lib/spack/env/oneapi/ifx deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/oneapi/ifx +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/pgi/pgc++ b/lib/spack/env/pgi/pgc++ deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/pgi/pgc++ +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/pgi/pgcc b/lib/spack/env/pgi/pgcc deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/pgi/pgcc +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/pgi/pgfortran b/lib/spack/env/pgi/pgfortran deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/pgi/pgfortran +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/rocmcc/amdclang b/lib/spack/env/rocmcc/amdclang deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/rocmcc/amdclang +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/rocmcc/amdclang++ b/lib/spack/env/rocmcc/amdclang++ deleted file mode 120000 index abf4cd45c7c..00000000000 --- a/lib/spack/env/rocmcc/amdclang++ +++ /dev/null @@ -1 +0,0 @@ -../cpp \ No newline at end of file diff --git a/lib/spack/env/rocmcc/amdflang b/lib/spack/env/rocmcc/amdflang deleted file mode 120000 index b6c64233b03..00000000000 --- a/lib/spack/env/rocmcc/amdflang +++ /dev/null @@ -1 +0,0 @@ -../fc \ No newline at end of file diff --git a/lib/spack/env/xl/xlc b/lib/spack/env/xl/xlc deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/xl/xlc +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/xl/xlc++ b/lib/spack/env/xl/xlc++ deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/xl/xlc++ +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/xl/xlf b/lib/spack/env/xl/xlf deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/xl/xlf +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/xl/xlf90 b/lib/spack/env/xl/xlf90 deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/xl/xlf90 +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/xl_r/xlc++_r b/lib/spack/env/xl_r/xlc++_r deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/xl_r/xlc++_r +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/xl_r/xlc_r b/lib/spack/env/xl_r/xlc_r deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/xl_r/xlc_r +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/xl_r/xlf90_r b/lib/spack/env/xl_r/xlf90_r deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/xl_r/xlf90_r +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/env/xl_r/xlf_r b/lib/spack/env/xl_r/xlf_r deleted file mode 120000 index 82c2b8e90a3..00000000000 --- a/lib/spack/env/xl_r/xlf_r +++ /dev/null @@ -1 +0,0 @@ -../cc \ No newline at end of file diff --git a/lib/spack/llnl/util/lang.py b/lib/spack/llnl/util/lang.py index b82c46e9e43..05100e087be 100644 --- a/lib/spack/llnl/util/lang.py +++ b/lib/spack/llnl/util/lang.py @@ -73,7 +73,7 @@ def index_by(objects, *funcs): if isinstance(f, str): f = lambda x: getattr(x, funcs[0]) elif isinstance(f, tuple): - f = lambda x: tuple(getattr(x, p) for p in funcs[0]) + f = lambda x: tuple(getattr(x, p, None) for p in funcs[0]) result = {} for o in objects: @@ -1016,11 +1016,8 @@ def _receive_forwarded(self, context: str, exc: Exception, tb: List[str]): def grouped_message(self, with_tracebacks: bool = True) -> str: """Print out an error message coalescing all the forwarded errors.""" each_exception_message = [ - "{0} raised {1}: {2}{3}".format( - context, - exc.__class__.__name__, - exc, - "\n{0}".format("".join(tb)) if with_tracebacks else "", + "\n\t{0} raised {1}: {2}\n{3}".format( + context, exc.__class__.__name__, exc, f"\n{''.join(tb)}" if with_tracebacks else "" ) for context, exc, tb in self.exceptions ] diff --git a/lib/spack/spack/aliases.py b/lib/spack/spack/aliases.py new file mode 100644 index 00000000000..c1bb644b303 --- /dev/null +++ b/lib/spack/spack/aliases.py @@ -0,0 +1,20 @@ +# Copyright Spack Project Developers. See COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +"""Alias names to convert legacy compilers to builtin packages and vice-versa""" + +BUILTIN_TO_LEGACY_COMPILER = { + "llvm": "clang", + "intel-oneapi-compilers": "oneapi", + "llvm-amdgpu": "rocmcc", + "intel-oneapi-compiler-classic": "intel", + "acfl": "arm", +} + +LEGACY_COMPILER_TO_BUILTIN = { + "clang": "llvm", + "oneapi": "intel-oneapi-compilers", + "rocmcc": "llvm-amdgpu", + "intel": "intel-oneapi-compiler-classic", + "arm": "acfl", +} diff --git a/lib/spack/spack/binary_distribution.py b/lib/spack/spack/binary_distribution.py index 53aaa764e6b..167e2129a97 100644 --- a/lib/spack/spack/binary_distribution.py +++ b/lib/spack/spack/binary_distribution.py @@ -110,6 +110,13 @@ def __init__(self, root): self._write_transaction_impl = llnl.util.lang.nullcontext self._read_transaction_impl = llnl.util.lang.nullcontext + def _handle_old_db_versions_read(self, check, db, *, reindex: bool): + if not self.is_readable(): + raise spack_db.DatabaseNotReadableError( + f"cannot read buildcache v{self.db_version} at {self.root}" + ) + return self._handle_current_version_read(check, db) + class FetchCacheError(Exception): """Error thrown when fetching the cache failed, usually a composite error list.""" @@ -242,7 +249,7 @@ def _associate_built_specs_with_mirror(self, cache_key, mirror_url): self._index_file_cache.init_entry(cache_key) cache_path = self._index_file_cache.cache_path(cache_key) with self._index_file_cache.read_transaction(cache_key): - db._read_from_file(cache_path) + db._read_from_file(pathlib.Path(cache_path)) except spack_db.InvalidDatabaseVersionError as e: tty.warn( f"you need a newer Spack version to read the buildcache index for the " diff --git a/lib/spack/spack/bootstrap/_common.py b/lib/spack/spack/bootstrap/_common.py index 2002f51339e..ade85ff5457 100644 --- a/lib/spack/spack/bootstrap/_common.py +++ b/lib/spack/spack/bootstrap/_common.py @@ -234,14 +234,6 @@ def _root_spec(spec_str: str) -> str: # Add a compiler and platform requirement to the root spec. platform = str(spack.platforms.host()) - if platform == "darwin": - spec_str += " %apple-clang" - elif platform == "windows": - spec_str += " %msvc" - elif platform == "linux": - spec_str += " %gcc" - elif platform == "freebsd": - spec_str += " %clang" spec_str += f" platform={platform}" target = archspec.cpu.host().family spec_str += f" target={target}" diff --git a/lib/spack/spack/bootstrap/clingo.py b/lib/spack/spack/bootstrap/clingo.py index 17a86baf39d..0267ad2e2cf 100644 --- a/lib/spack/spack/bootstrap/clingo.py +++ b/lib/spack/spack/bootstrap/clingo.py @@ -15,11 +15,13 @@ import archspec.cpu -import spack.compiler -import spack.compilers +import spack.compilers.config +import spack.compilers.libraries +import spack.config import spack.platforms import spack.spec import spack.traverse +import spack.version from .config import spec_for_current_python @@ -38,7 +40,7 @@ def __init__(self, configuration): self.external_cmake, self.external_bison = self._externals_from_yaml(configuration) - def _valid_compiler_or_raise(self) -> "spack.compiler.Compiler": + def _valid_compiler_or_raise(self): if str(self.host_platform) == "linux": compiler_name = "gcc" elif str(self.host_platform) == "darwin": @@ -46,17 +48,30 @@ def _valid_compiler_or_raise(self) -> "spack.compiler.Compiler": elif str(self.host_platform) == "windows": compiler_name = "msvc" elif str(self.host_platform) == "freebsd": - compiler_name = "clang" + compiler_name = "llvm" else: raise RuntimeError(f"Cannot bootstrap clingo from sources on {self.host_platform}") - candidates = spack.compilers.compilers_for_spec( - compiler_name, arch_spec=self.host_architecture - ) + + candidates = [ + x + for x in spack.compilers.config.CompilerFactory.from_packages_yaml(spack.config.CONFIG) + if x.name == compiler_name + ] if not candidates: raise RuntimeError( f"Cannot find any version of {compiler_name} to bootstrap clingo from sources" ) - candidates.sort(key=lambda x: x.spec.version, reverse=True) + candidates.sort(key=lambda x: x.version, reverse=True) + best = candidates[0] + # Get compilers for bootstrapping from the 'builtin' repository + best.namespace = "builtin" + # If the compiler does not support C++ 14, fail with a legible error message + try: + _ = best.package.standard_flag(language="cxx", standard="14") + except RuntimeError as e: + raise RuntimeError( + "cannot find a compiler supporting C++ 14 [needed to bootstrap clingo]" + ) from e return candidates[0] def _externals_from_yaml( @@ -75,9 +90,6 @@ def _externals_from_yaml( if not s.satisfies(requirements[pkg_name]): continue - if not s.intersects(f"%{self.host_compiler.spec}"): - continue - if not s.intersects(f"arch={self.host_architecture}"): continue @@ -110,11 +122,14 @@ def concretize(self) -> "spack.spec.Spec": # Tweak it to conform to the host architecture for node in s.traverse(): node.architecture.os = str(self.host_os) - node.compiler = self.host_compiler.spec node.architecture = self.host_architecture if node.name == "gcc-runtime": - node.versions = self.host_compiler.spec.versions + node.versions = self.host_compiler.versions + + # Can't use re2c@3.1 with Python 3.6 + if self.host_python.satisfies("@3.6"): + s["re2c"].versions.versions = [spack.version.from_string("=2.2")] for edge in spack.traverse.traverse_edges([s], cover="edges"): if edge.spec.name == "python": @@ -126,6 +141,9 @@ def concretize(self) -> "spack.spec.Spec": if edge.spec.name == "cmake" and self.external_cmake: edge.spec = self.external_cmake + if edge.spec.name == self.host_compiler.name: + edge.spec = self.host_compiler + if "libc" in edge.virtuals: edge.spec = self.host_libc @@ -141,12 +159,12 @@ def python_external_spec(self) -> "spack.spec.Spec": return self._external_spec(result) def libc_external_spec(self) -> "spack.spec.Spec": - result = self.host_compiler.default_libc + detector = spack.compilers.libraries.CompilerPropertyDetector(self.host_compiler) + result = detector.default_libc() return self._external_spec(result) def _external_spec(self, initial_spec) -> "spack.spec.Spec": initial_spec.namespace = "builtin" - initial_spec.compiler = self.host_compiler.spec initial_spec.architecture = self.host_architecture for flag_type in spack.spec.FlagMap.valid_compiler_flags(): initial_spec.compiler_flags[flag_type] = [] diff --git a/lib/spack/spack/bootstrap/config.py b/lib/spack/spack/bootstrap/config.py index 4c0ff117664..2e8f9d7ff7f 100644 --- a/lib/spack/spack/bootstrap/config.py +++ b/lib/spack/spack/bootstrap/config.py @@ -10,7 +10,7 @@ from llnl.util import tty -import spack.compilers +import spack.compilers.config import spack.config import spack.environment import spack.modules @@ -142,8 +142,8 @@ def _bootstrap_config_scopes() -> Sequence["spack.config.ConfigScope"]: def _add_compilers_if_missing() -> None: arch = spack.spec.ArchSpec.default_arch() - if not spack.compilers.compilers_for_arch(arch): - spack.compilers.find_compilers() + if not spack.compilers.config.compilers_for_arch(arch): + spack.compilers.config.find_compilers() @contextlib.contextmanager diff --git a/lib/spack/spack/bootstrap/prototypes/clingo-darwin-aarch64.json b/lib/spack/spack/bootstrap/prototypes/clingo-darwin-aarch64.json index f313e4544fa..c6737e1dea7 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":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kuhq5ne7cdx2pca57zwnn57fezjovywffswkkryt4usm4zekw3yq====","dependencies":[{"name":"gmake","hash":"62ylhtcnqoldfzoub3pdhhhiyhgrotdc","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"5dtluxfskylswcrd7se47q6vowlb4t2r"}]}} +{"spec":{"_meta":{"version":5},"nodes":[{"name":"clingo-bootstrap","version":"spack","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"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":"ozkztarkrp3oet7x2oapc7ehdfyvweap45zb3g44mj6qpblv4l3a====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"bison","hash":"mtmvlzy7mfjfrcecjxk6wgjwxlqtmzpj","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"cmake","hash":"zlqbht6siyfbw65vi7eg3g2kkjbgeb3s","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"python","hash":"ubenpqhxb6v4lsnefcot2naoyufhtvlq","parameters":{"deptypes":["build","link","run"],"virtuals":[]}},{"name":"python-venv","hash":"4duigy4ujnstkq5c542w4okhszygw72h","parameters":{"deptypes":["build","run"],"virtuals":[]}},{"name":"re2c","hash":"uhkg474hzahckbth32ydtp24etgavq76","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"lssvl522otfuhyr7zw6rr65fpyd5eicp"},{"name":"apple-clang","version":"16.0.0","arch":{"platform":"darwin","platform_os":"sonoma","target":{"name":"m1","vendor":"Apple","features":["aes","asimd","asimddp","asimdfhm","asimdhp","asimdrdm","atomics","cpuid","crc32","dcpodp","dcpop","dit","evtstrm","fcma","flagm","flagm2","fp","fphp","frint","ilrcpc","jscvt","lrcpc","paca","pacg","pmull","sb","sha1","sha2","sha3","sha512","ssbs","uscat"],"generation":0,"parents":["armv8.4a"],"cpupart":"0x022"}},"namespace":"builtin","parameters":{"build_system":"bundle","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"external":{"path":"/usr","module":null,"extra_attributes":{"compilers":{"c":"/usr/bin/clang","cxx":"/usr/bin/clang++"}}},"package_hash":"7iabceub7ckyfs2h5g75jxtolk253q6nm3r5hyqbztckky25gnpa====","annotations":{"original_specfile_version":5},"hash":"nea2oy52arwgstum7vyornhbnk3poj32"},{"name":"bison","version":"3.8.2","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","color":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"d4j62fwvuxqbiez32ltjnhu47ac425wjebsy6fhoptv6saxazcxq====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"diffutils","hash":"4p2v6lqdlosuxav6qtrmemodqnp7p7ql","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"rzeea2himrnudsunposb2rlyw6mjhmr7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"m4","hash":"4u7ml457pqh6mzvundcjcv4xzvcjwhw3","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"mtmvlzy7mfjfrcecjxk6wgjwxlqtmzpj"},{"name":"compiler-wrapper","version":"1.0","arch":{"platform":"darwin","platform_os":"sonoma","target":{"name":"m1","vendor":"Apple","features":["aes","asimd","asimddp","asimdfhm","asimdhp","asimdrdm","atomics","cpuid","crc32","dcpodp","dcpop","dit","evtstrm","fcma","flagm","flagm2","fp","fphp","frint","ilrcpc","jscvt","lrcpc","paca","pacg","pmull","sb","sha1","sha2","sha3","sha512","ssbs","uscat"],"generation":0,"parents":["armv8.4a"],"cpupart":"0x022"}},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"gogqnfdkxjvnjgj3lndnoncjtdc7ydoc7klkjstywag4oqrvod7a====","annotations":{"original_specfile_version":5},"hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4"},{"name":"diffutils","version":"3.10","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kbmzdy7mgklc24qx55cvx7kq7hceby2yav4fnf64gfdo7epdghwa====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"rzeea2himrnudsunposb2rlyw6mjhmr7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"hvarrkkr7z5tujmt45xhns2kljvnunof","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}}],"annotations":{"original_specfile_version":5},"hash":"4p2v6lqdlosuxav6qtrmemodqnp7p7ql"},{"name":"gmake","version":"4.4.1","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"generic","guile":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"rpzjfobv7qh3wevti34nlbd2emtw5mnyszqmkyiq5jiq33xm7qzq====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk"},{"name":"gnuconfig","version":"2024-07-27","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"aar2tabf35425kgzryprq775xycug7xlbt4rkwvm4aj76dhlychq====","annotations":{"original_specfile_version":5},"hash":"rzeea2himrnudsunposb2rlyw6mjhmr7"},{"name":"libiconv","version":"1.17","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ujsqmcknrabka5mhwwpbaf5rwxgopwoyxkskuwyqlcbynowgdvfa====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"rzeea2himrnudsunposb2rlyw6mjhmr7","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"hvarrkkr7z5tujmt45xhns2kljvnunof"},{"name":"m4","version":"1.4.19","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"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":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"diffutils","hash":"4p2v6lqdlosuxav6qtrmemodqnp7p7ql","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"rzeea2himrnudsunposb2rlyw6mjhmr7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libsigsegv","hash":"j36atbspivp2gr7gnthqzakoitzzkstp","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"4u7ml457pqh6mzvundcjcv4xzvcjwhw3"},{"name":"libsigsegv","version":"2.14","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"3s645t5rbjrziao47mhgob5xgymot6tf4kalagflbal2jdamdo2a====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"rzeea2himrnudsunposb2rlyw6mjhmr7","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"j36atbspivp2gr7gnthqzakoitzzkstp"},{"name":"cmake","version":"3.31.2","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"generic","build_type":"Release","doc":false,"ncurses":true,"ownlibs":true,"qtgui":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"7vk6yhuq2fklcj5kk7bhreqojudugggezq7vntmcsc32cw2avmya====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"curl","hash":"jkilt3drjtni4pwxwvujwpasnef4xzqx","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"7xdoqvmiu5hzgndg26zn3ne4trd6aq3t","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"7ikuk745stdvecdqbcrmrczgozpfwopt","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"zlqbht6siyfbw65vi7eg3g2kkjbgeb3s"},{"name":"curl","version":"8.10.1","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"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":"ccka5yawqcn2rjbqn3bkhkdjoajlngm5uab7jbyrsl5yqn42ofza====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"rzeea2himrnudsunposb2rlyw6mjhmr7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"nghttp2","hash":"7ypebulcls2zoubgisasufif4lbsvfyv","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"pkgconf","hash":"ub6rqfbiqdmmttgtgywljfealg3xnjmh","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"zlib-ng","hash":"7ikuk745stdvecdqbcrmrczgozpfwopt","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"jkilt3drjtni4pwxwvujwpasnef4xzqx"},{"name":"nghttp2","version":"1.64.0","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"nkykfkj4rxzmysrmoh5mhxrl5ysaemlqh652m3he7pkbgvjhjgba====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"diffutils","hash":"4p2v6lqdlosuxav6qtrmemodqnp7p7ql","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"rzeea2himrnudsunposb2rlyw6mjhmr7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"ub6rqfbiqdmmttgtgywljfealg3xnjmh","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"annotations":{"original_specfile_version":5},"hash":"7ypebulcls2zoubgisasufif4lbsvfyv"},{"name":"pkgconf","version":"2.2.0","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"gl6tpyarjlclzsal6wa4dtc7cdzprq36nbibalai4a6wgzblrseq====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"rzeea2himrnudsunposb2rlyw6mjhmr7","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"ub6rqfbiqdmmttgtgywljfealg3xnjmh"},{"name":"zlib-ng","version":"2.2.1","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"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":"mdxo2xewbdavckgsqlcjywyfssdchgwbzonui22gxww7hqtozurq====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"rzeea2himrnudsunposb2rlyw6mjhmr7","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"7ikuk745stdvecdqbcrmrczgozpfwopt"},{"name":"ncurses","version":"6.5","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"namespace":"builtin","parameters":{"abi":"none","build_system":"autotools","patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"symlinks":false,"termlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"package_hash":"cfh76rniab2gnv4jqr77yzz5za4ucfmva2upihvxukn52dybhsvq====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"rzeea2himrnudsunposb2rlyw6mjhmr7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"ub6rqfbiqdmmttgtgywljfealg3xnjmh","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"annotations":{"original_specfile_version":5},"hash":"7xdoqvmiu5hzgndg26zn3ne4trd6aq3t"},{"name":"python","version":"3.13.0","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"generic","bz2":true,"ctypes":true,"dbm":true,"debug":false,"libxml2":true,"lzma":true,"optimizations":false,"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":[]},"package_hash":"n6v6rt6deysntdggu2gi4zkhqriyba6bgaghxyhluou4ssqf7xfq====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"apple-libuuid","hash":"c6v7lfkcgosqqnc2zkzqulybqqg4e22s","parameters":{"deptypes":["build","link"],"virtuals":["uuid"]}},{"name":"bzip2","hash":"zv7lxkvykfbn2zaq4lm4bzdso4vjlrnr","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"expat","hash":"22rzbasmo5pkkhqri5vplsxujq3fkyzd","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gdbm","hash":"pa6dzar6nbm3muyi5wm7wdqcyjom3rrt","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gettext","hash":"bah7ymgn6hajzicktrj3d26sltksrdyf","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libffi","hash":"z533r2ia3xmkjsr2raqwtgnnwqdjhrxf","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"7xdoqvmiu5hzgndg26zn3ne4trd6aq3t","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"7etpau7yq3ctzzymjvlqo64yxykumskl","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"pkgconf","hash":"ub6rqfbiqdmmttgtgywljfealg3xnjmh","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"readline","hash":"vuu3chywd42dhwbavg2bqogsaqb5u2vw","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"sqlite","hash":"4g3wvdt4hvdmqqrckn5aqzhebx6cf7t3","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"xz","hash":"4aws4yus4ottcqw63gx2ppktuev2z2qw","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"7ikuk745stdvecdqbcrmrczgozpfwopt","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"ubenpqhxb6v4lsnefcot2naoyufhtvlq"},{"name":"apple-libuuid","version":"1353.100.2","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"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====","annotations":{"original_specfile_version":5},"hash":"c6v7lfkcgosqqnc2zkzqulybqqg4e22s"},{"name":"bzip2","version":"1.0.8","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"generic","debug":false,"pic":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"jb7yvhkifmvfl3ykmdulsjxkkulker6gqb5tadollyjt2ijg3zsa====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"diffutils","hash":"4p2v6lqdlosuxav6qtrmemodqnp7p7ql","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"zv7lxkvykfbn2zaq4lm4bzdso4vjlrnr"},{"name":"expat","version":"2.6.4","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","libbsd":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ei6qyjakl7sgtodwxxbg5brgkp23robfximtpbedkrnpyyyvr3ya====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"rzeea2himrnudsunposb2rlyw6mjhmr7","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"22rzbasmo5pkkhqri5vplsxujq3fkyzd"},{"name":"gdbm","version":"1.23","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"liepxl6phlcxbgfmibxafhewtihlgaa4x3hko37ckqlafhxkrgdq====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"rzeea2himrnudsunposb2rlyw6mjhmr7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"vuu3chywd42dhwbavg2bqogsaqb5u2vw","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"pa6dzar6nbm3muyi5wm7wdqcyjom3rrt"},{"name":"readline","version":"8.2","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"package_hash":"oww6dmr7xqgg6j7iiluonxbcl4irqnnrip4vfkjdwujncwnuhwuq====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"rzeea2himrnudsunposb2rlyw6mjhmr7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"ncurses","hash":"7xdoqvmiu5hzgndg26zn3ne4trd6aq3t","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"vuu3chywd42dhwbavg2bqogsaqb5u2vw"},{"name":"gettext","version":"0.22.5","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"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":"d4zxhmw6rownaaokzcolsszrq2cmx44m7qmzopucymoyrhbdfgvq====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"bzip2","hash":"zv7lxkvykfbn2zaq4lm4bzdso4vjlrnr","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"rzeea2himrnudsunposb2rlyw6mjhmr7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"hvarrkkr7z5tujmt45xhns2kljvnunof","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"libxml2","hash":"zh4o2buvhkcq2ayeoww6bw6p7lpc53lr","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"7xdoqvmiu5hzgndg26zn3ne4trd6aq3t","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"tar","hash":"4hde5fjjlzaxmazsaeen6cdlejigf4ts","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"4aws4yus4ottcqw63gx2ppktuev2z2qw","parameters":{"deptypes":["build","link","run"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"bah7ymgn6hajzicktrj3d26sltksrdyf"},{"name":"libxml2","version":"2.13.4","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","pic":true,"python":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"j6yob2wgvc2wjzvbs6xdvgyfa3zp3wrm3uxncxzxqfzw6xazzoba====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"rzeea2himrnudsunposb2rlyw6mjhmr7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"hvarrkkr7z5tujmt45xhns2kljvnunof","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pkgconf","hash":"ub6rqfbiqdmmttgtgywljfealg3xnjmh","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"xz","hash":"4aws4yus4ottcqw63gx2ppktuev2z2qw","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"7ikuk745stdvecdqbcrmrczgozpfwopt","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"zh4o2buvhkcq2ayeoww6bw6p7lpc53lr"},{"name":"xz","version":"5.4.6","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"pic":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zt5vu2vph2v2qjwgdbe7btgcz7axpyalorcsqiuxhrg5grwgrrvq====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"rzeea2himrnudsunposb2rlyw6mjhmr7","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"4aws4yus4ottcqw63gx2ppktuev2z2qw"},{"name":"tar","version":"1.35","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","zip":"pigz","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"v6a6jvks2setklucxyk622uauxzqlgmsdkrvdijbi3m5jwftmzla====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"bzip2","hash":"zv7lxkvykfbn2zaq4lm4bzdso4vjlrnr","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"rzeea2himrnudsunposb2rlyw6mjhmr7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"hvarrkkr7z5tujmt45xhns2kljvnunof","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pigz","hash":"l3lu3os3j4yjdpdvtooaxc74ece64qy6","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"4aws4yus4ottcqw63gx2ppktuev2z2qw","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"zstd","hash":"eantpzna3rm5ccxgz3z6p4kdaqcm22lr","parameters":{"deptypes":["run"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"4hde5fjjlzaxmazsaeen6cdlejigf4ts"},{"name":"pigz","version":"2.8","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"makefile","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"4w67lflje4giekjg4ie2vpyuiunjcumo6geofykvon3hodllp42q====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"7ikuk745stdvecdqbcrmrczgozpfwopt","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"l3lu3os3j4yjdpdvtooaxc74ece64qy6"},{"name":"zstd","version":"1.5.6","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"makefile","compression":["none"],"libs":["shared","static"],"programs":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"uvmrov4c6unft6o4yd3jk3uqvweua3uhwdli4sw7h5wvklaf5t3q====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"eantpzna3rm5ccxgz3z6p4kdaqcm22lr"},{"name":"libffi","version":"3.4.6","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"umhsnvoj5ooa3glffnkk2hp3txmrsjvqbpfq2hbk4mhcvhza7gaa====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"rzeea2himrnudsunposb2rlyw6mjhmr7","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"z533r2ia3xmkjsr2raqwtgnnwqdjhrxf"},{"name":"openssl","version":"3.4.0","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"generic","certs":"mozilla","docs":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5y33vxwjtlrlsyedasvmhukjkk5yfwcri27oceh36iw73xehumfa====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"ca-certificates-mozilla","hash":"v5ocihzb43rasxqelwzx4o3htu4xavgu","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"wc57ocdnd6w5f5apre2ywlaca3mcvgks","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"7ikuk745stdvecdqbcrmrczgozpfwopt","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"7etpau7yq3ctzzymjvlqo64yxykumskl"},{"name":"ca-certificates-mozilla","version":"2023-05-30","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"63npvwqwo2x7i6emvnklh4mhcn45gx2qzveorybh5h2inwr55sea====","annotations":{"original_specfile_version":5},"hash":"v5ocihzb43rasxqelwzx4o3htu4xavgu"},{"name":"perl","version":"5.40.0","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"generic","cpanm":true,"opcode":true,"open":true,"shared":true,"threads":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"f233ue76vwtkle2r4jwsfe5x27ujx6ea4vdyp6baonfmkgqf5vpa====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"berkeley-db","hash":"cwabnmpcy7hllcma4zyjhwi2mhxcrfti","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"bzip2","hash":"zv7lxkvykfbn2zaq4lm4bzdso4vjlrnr","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gdbm","hash":"pa6dzar6nbm3muyi5wm7wdqcyjom3rrt","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"7ikuk745stdvecdqbcrmrczgozpfwopt","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"wc57ocdnd6w5f5apre2ywlaca3mcvgks"},{"name":"berkeley-db","version":"18.1.40","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"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":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"rzeea2himrnudsunposb2rlyw6mjhmr7","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"cwabnmpcy7hllcma4zyjhwi2mhxcrfti"},{"name":"sqlite","version":"3.46.0","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"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":"wm3irnrjil5n275nw2m4x3mpvyg35h7isbmsnuae6vtxbamsrv4q====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"rzeea2himrnudsunposb2rlyw6mjhmr7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"vuu3chywd42dhwbavg2bqogsaqb5u2vw","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"7ikuk745stdvecdqbcrmrczgozpfwopt","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"4g3wvdt4hvdmqqrckn5aqzhebx6cf7t3"},{"name":"python-venv","version":"1.0","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"j3dgyzp5nei24fbpw22l3gedsk37asrdrjafbnaiwiux3lxasi3a====","dependencies":[{"name":"python","hash":"ubenpqhxb6v4lsnefcot2naoyufhtvlq","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"4duigy4ujnstkq5c542w4okhszygw72h"},{"name":"re2c","version":"3.1","arch":{"platform":"darwin","platform_os":"sonoma","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ebw3m3xkgw2wijfijtzrxt4ldu4tz4haiz6juumq6wn4mjzsuxra====","dependencies":[{"name":"apple-clang","hash":"nea2oy52arwgstum7vyornhbnk3poj32","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"compiler-wrapper","hash":"b3urggrazcghz2ngfudq7ndzyhkjstj4","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"3b47stocf6w7bbkc3yqakyrjv72ywszk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"rzeea2himrnudsunposb2rlyw6mjhmr7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"python","hash":"ubenpqhxb6v4lsnefcot2naoyufhtvlq","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"uhkg474hzahckbth32ydtp24etgavq76"}]}} 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 7251eef5160..2ab118f6fdb 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":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kuhq5ne7cdx2pca57zwnn57fezjovywffswkkryt4usm4zekw3yq====","dependencies":[{"name":"gmake","hash":"hmuuzsiltoh7g7kw4fjojz7ogxglkbwz","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"tpv4lkit3ekpahcziwmpeawdnioucyut"}]}} +{"spec":{"_meta":{"version":5},"nodes":[{"name":"clingo-bootstrap","version":"spack","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"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":"ozkztarkrp3oet7x2oapc7ehdfyvweap45zb3g44mj6qpblv4l3a====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"bison","hash":"e575uqnqgn6zxpyrfphfw35vihuc3af3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"cmake","hash":"ev3zcv2blhxx2checfszy6736ya2ve45","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"python","hash":"3tktfceps6thsraftda3svkdlypt47vx","parameters":{"deptypes":["build","link","run"],"virtuals":[]}},{"name":"python-venv","hash":"mg6k4cfdhg6dore5avimwxdc7jn6onzs","parameters":{"deptypes":["build","run"],"virtuals":[]}},{"name":"re2c","hash":"4ym4yrdx4hfbj5rcevsdidy6zdc77om4","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"qrttp2eu44r35mtyem2njmtdo2tr5xvf"},{"name":"apple-clang","version":"16.0.0","arch":{"platform":"darwin","platform_os":"sequoia","target":{"name":"cannonlake","vendor":"GenuineIntel","features":["adx","aes","avx","avx2","avx512bw","avx512cd","avx512dq","avx512f","avx512ifma","avx512vbmi","avx512vl","bmi1","bmi2","clflushopt","f16c","fma","mmx","movbe","pclmulqdq","popcnt","rdrand","rdseed","sha","sse","sse2","sse4_1","sse4_2","ssse3","xsavec","xsaveopt"],"generation":0,"parents":["skylake"],"cpupart":""}},"namespace":"builtin","parameters":{"build_system":"bundle","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"external":{"path":"/usr","module":null,"extra_attributes":{"compilers":{"c":"/usr/bin/clang","cxx":"/usr/bin/clang++"}}},"package_hash":"7iabceub7ckyfs2h5g75jxtolk253q6nm3r5hyqbztckky25gnpa====","annotations":{"original_specfile_version":5},"hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv"},{"name":"bison","version":"3.8.2","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","color":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"d4j62fwvuxqbiez32ltjnhu47ac425wjebsy6fhoptv6saxazcxq====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"diffutils","hash":"acwjalgeefeymuhyv4umstcnz465ar6e","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"m4","hash":"d36fz4p3yx77w6b272r5yr74owsvwvfm","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"e575uqnqgn6zxpyrfphfw35vihuc3af3"},{"name":"compiler-wrapper","version":"1.0","arch":{"platform":"darwin","platform_os":"sequoia","target":{"name":"cannonlake","vendor":"GenuineIntel","features":["adx","aes","avx","avx2","avx512bw","avx512cd","avx512dq","avx512f","avx512ifma","avx512vbmi","avx512vl","bmi1","bmi2","clflushopt","f16c","fma","mmx","movbe","pclmulqdq","popcnt","rdrand","rdseed","sha","sse","sse2","sse4_1","sse4_2","ssse3","xsavec","xsaveopt"],"generation":0,"parents":["skylake"],"cpupart":""}},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"gogqnfdkxjvnjgj3lndnoncjtdc7ydoc7klkjstywag4oqrvod7a====","annotations":{"original_specfile_version":5},"hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge"},{"name":"diffutils","version":"3.10","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kbmzdy7mgklc24qx55cvx7kq7hceby2yav4fnf64gfdo7epdghwa====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"2hwokn4ijijiclnl3pyvn3b4a7gbn5ct","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}}],"annotations":{"original_specfile_version":5},"hash":"acwjalgeefeymuhyv4umstcnz465ar6e"},{"name":"gmake","version":"4.4.1","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"generic","guile":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"rpzjfobv7qh3wevti34nlbd2emtw5mnyszqmkyiq5jiq33xm7qzq====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"fszz4zptmmipakokiufglsphlmdgb6x3"},{"name":"libiconv","version":"1.17","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ujsqmcknrabka5mhwwpbaf5rwxgopwoyxkskuwyqlcbynowgdvfa====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"2hwokn4ijijiclnl3pyvn3b4a7gbn5ct"},{"name":"m4","version":"1.4.19","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"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":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"diffutils","hash":"acwjalgeefeymuhyv4umstcnz465ar6e","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libsigsegv","hash":"mtowncjrriz2jjl6onql3wyacciix4ne","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"d36fz4p3yx77w6b272r5yr74owsvwvfm"},{"name":"libsigsegv","version":"2.14","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"3s645t5rbjrziao47mhgob5xgymot6tf4kalagflbal2jdamdo2a====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"mtowncjrriz2jjl6onql3wyacciix4ne"},{"name":"cmake","version":"3.31.2","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"generic","build_type":"Release","doc":false,"ncurses":true,"ownlibs":true,"qtgui":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"7vk6yhuq2fklcj5kk7bhreqojudugggezq7vntmcsc32cw2avmya====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"curl","hash":"uugvk6k3zupw4xzto2hwjfe647pqsyyf","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"nykye5s3jvzc2zwtpx4xljlos6xnorsw","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"l2fyfx2t7sesnitglbumuds2wqflfir6","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"ev3zcv2blhxx2checfszy6736ya2ve45"},{"name":"curl","version":"8.10.1","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"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":"ccka5yawqcn2rjbqn3bkhkdjoajlngm5uab7jbyrsl5yqn42ofza====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"nghttp2","hash":"bm2f7poacyin2wyvgq2axmbynhaslhgb","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"pkgconf","hash":"e65fgchge7g22kbiqdpyxu4fmvqehlqb","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"zlib-ng","hash":"l2fyfx2t7sesnitglbumuds2wqflfir6","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"uugvk6k3zupw4xzto2hwjfe647pqsyyf"},{"name":"nghttp2","version":"1.64.0","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"nkykfkj4rxzmysrmoh5mhxrl5ysaemlqh652m3he7pkbgvjhjgba====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"diffutils","hash":"acwjalgeefeymuhyv4umstcnz465ar6e","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"e65fgchge7g22kbiqdpyxu4fmvqehlqb","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"annotations":{"original_specfile_version":5},"hash":"bm2f7poacyin2wyvgq2axmbynhaslhgb"},{"name":"pkgconf","version":"2.2.0","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"gl6tpyarjlclzsal6wa4dtc7cdzprq36nbibalai4a6wgzblrseq====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"e65fgchge7g22kbiqdpyxu4fmvqehlqb"},{"name":"zlib-ng","version":"2.2.1","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"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":"mdxo2xewbdavckgsqlcjywyfssdchgwbzonui22gxww7hqtozurq====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"l2fyfx2t7sesnitglbumuds2wqflfir6"},{"name":"ncurses","version":"6.5","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"namespace":"builtin","parameters":{"abi":"none","build_system":"autotools","patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"symlinks":false,"termlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"package_hash":"cfh76rniab2gnv4jqr77yzz5za4ucfmva2upihvxukn52dybhsvq====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"e65fgchge7g22kbiqdpyxu4fmvqehlqb","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"annotations":{"original_specfile_version":5},"hash":"nykye5s3jvzc2zwtpx4xljlos6xnorsw"},{"name":"python","version":"3.13.0","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"generic","bz2":true,"ctypes":true,"dbm":true,"debug":false,"libxml2":true,"lzma":true,"optimizations":false,"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":[]},"package_hash":"n6v6rt6deysntdggu2gi4zkhqriyba6bgaghxyhluou4ssqf7xfq====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"apple-libuuid","hash":"m5z7kt64hlhnwisipfs5nqqorpi6u6vm","parameters":{"deptypes":["build","link"],"virtuals":["uuid"]}},{"name":"bzip2","hash":"h4bmmb7myvboscsbvlgq46twwacgahk3","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"expat","hash":"bqc34odirjhz2jaue7n3dk7sux6hmojn","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gdbm","hash":"h4qbc6g2v5yotoalpyvddbcmqyric4v7","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gettext","hash":"m5uhx7get2eeuftgoadtv7r2vfh7u5ds","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libffi","hash":"ofcuigaaxlvvv6tgzetfjwfhabzlkbo7","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"nykye5s3jvzc2zwtpx4xljlos6xnorsw","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"bwnlb7yiy67eabhgaei64susdxgas3to","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"pkgconf","hash":"e65fgchge7g22kbiqdpyxu4fmvqehlqb","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"readline","hash":"5wymz4fw6majnuwaoopp3m7dmjqbbvrx","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"sqlite","hash":"qtxu5k6vkkyr2oii62lz7r4ubs7sz3xq","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"xz","hash":"oxzkcdzjdywney64q6tnmmjib33u6ms7","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"l2fyfx2t7sesnitglbumuds2wqflfir6","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"3tktfceps6thsraftda3svkdlypt47vx"},{"name":"apple-libuuid","version":"1353.100.2","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"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====","annotations":{"original_specfile_version":5},"hash":"m5z7kt64hlhnwisipfs5nqqorpi6u6vm"},{"name":"bzip2","version":"1.0.8","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"generic","debug":false,"pic":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"jb7yvhkifmvfl3ykmdulsjxkkulker6gqb5tadollyjt2ijg3zsa====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"diffutils","hash":"acwjalgeefeymuhyv4umstcnz465ar6e","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"h4bmmb7myvboscsbvlgq46twwacgahk3"},{"name":"expat","version":"2.6.4","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","libbsd":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ei6qyjakl7sgtodwxxbg5brgkp23robfximtpbedkrnpyyyvr3ya====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"bqc34odirjhz2jaue7n3dk7sux6hmojn"},{"name":"gdbm","version":"1.23","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"liepxl6phlcxbgfmibxafhewtihlgaa4x3hko37ckqlafhxkrgdq====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"5wymz4fw6majnuwaoopp3m7dmjqbbvrx","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"h4qbc6g2v5yotoalpyvddbcmqyric4v7"},{"name":"readline","version":"8.2","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"package_hash":"oww6dmr7xqgg6j7iiluonxbcl4irqnnrip4vfkjdwujncwnuhwuq====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"ncurses","hash":"nykye5s3jvzc2zwtpx4xljlos6xnorsw","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"5wymz4fw6majnuwaoopp3m7dmjqbbvrx"},{"name":"gettext","version":"0.22.5","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"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":"d4zxhmw6rownaaokzcolsszrq2cmx44m7qmzopucymoyrhbdfgvq====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"bzip2","hash":"h4bmmb7myvboscsbvlgq46twwacgahk3","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"2hwokn4ijijiclnl3pyvn3b4a7gbn5ct","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"libxml2","hash":"patsnnun4o2w3vupeontcjecxeoyh2js","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"nykye5s3jvzc2zwtpx4xljlos6xnorsw","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"tar","hash":"tegwze36okijyiui4nbbnkn2ngkqmxlm","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"oxzkcdzjdywney64q6tnmmjib33u6ms7","parameters":{"deptypes":["build","link","run"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"m5uhx7get2eeuftgoadtv7r2vfh7u5ds"},{"name":"libxml2","version":"2.13.4","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","pic":true,"python":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"j6yob2wgvc2wjzvbs6xdvgyfa3zp3wrm3uxncxzxqfzw6xazzoba====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"2hwokn4ijijiclnl3pyvn3b4a7gbn5ct","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pkgconf","hash":"e65fgchge7g22kbiqdpyxu4fmvqehlqb","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"xz","hash":"oxzkcdzjdywney64q6tnmmjib33u6ms7","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"l2fyfx2t7sesnitglbumuds2wqflfir6","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"patsnnun4o2w3vupeontcjecxeoyh2js"},{"name":"xz","version":"5.4.6","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"pic":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zt5vu2vph2v2qjwgdbe7btgcz7axpyalorcsqiuxhrg5grwgrrvq====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"oxzkcdzjdywney64q6tnmmjib33u6ms7"},{"name":"tar","version":"1.35","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","zip":"pigz","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"v6a6jvks2setklucxyk622uauxzqlgmsdkrvdijbi3m5jwftmzla====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"bzip2","hash":"h4bmmb7myvboscsbvlgq46twwacgahk3","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"2hwokn4ijijiclnl3pyvn3b4a7gbn5ct","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pigz","hash":"rv3drbcskvc7snlhqex2byavaddd6xfy","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"oxzkcdzjdywney64q6tnmmjib33u6ms7","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"zstd","hash":"isadyc5phrez7pmz4spx4zly5wu5pslt","parameters":{"deptypes":["run"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"tegwze36okijyiui4nbbnkn2ngkqmxlm"},{"name":"pigz","version":"2.8","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"makefile","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"4w67lflje4giekjg4ie2vpyuiunjcumo6geofykvon3hodllp42q====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"l2fyfx2t7sesnitglbumuds2wqflfir6","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"rv3drbcskvc7snlhqex2byavaddd6xfy"},{"name":"zstd","version":"1.5.6","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"makefile","compression":["none"],"libs":["shared","static"],"programs":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"uvmrov4c6unft6o4yd3jk3uqvweua3uhwdli4sw7h5wvklaf5t3q====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"isadyc5phrez7pmz4spx4zly5wu5pslt"},{"name":"libffi","version":"3.4.6","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"umhsnvoj5ooa3glffnkk2hp3txmrsjvqbpfq2hbk4mhcvhza7gaa====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"ofcuigaaxlvvv6tgzetfjwfhabzlkbo7"},{"name":"openssl","version":"3.4.0","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"generic","certs":"mozilla","docs":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5y33vxwjtlrlsyedasvmhukjkk5yfwcri27oceh36iw73xehumfa====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"ca-certificates-mozilla","hash":"xinl4agw3xhagk74cw2pclmlbqoq223j","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"wxl5qpzezncbick5ygjx3fnqwpd3ousb","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"l2fyfx2t7sesnitglbumuds2wqflfir6","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"bwnlb7yiy67eabhgaei64susdxgas3to"},{"name":"ca-certificates-mozilla","version":"2023-05-30","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"63npvwqwo2x7i6emvnklh4mhcn45gx2qzveorybh5h2inwr55sea====","annotations":{"original_specfile_version":5},"hash":"xinl4agw3xhagk74cw2pclmlbqoq223j"},{"name":"perl","version":"5.40.0","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"generic","cpanm":true,"opcode":true,"open":true,"shared":true,"threads":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"f233ue76vwtkle2r4jwsfe5x27ujx6ea4vdyp6baonfmkgqf5vpa====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"berkeley-db","hash":"wamcmlsv3jtpzy7qvmfful4fabex5q7y","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"bzip2","hash":"h4bmmb7myvboscsbvlgq46twwacgahk3","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gdbm","hash":"h4qbc6g2v5yotoalpyvddbcmqyric4v7","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"l2fyfx2t7sesnitglbumuds2wqflfir6","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"wxl5qpzezncbick5ygjx3fnqwpd3ousb"},{"name":"berkeley-db","version":"18.1.40","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"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":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"wamcmlsv3jtpzy7qvmfful4fabex5q7y"},{"name":"sqlite","version":"3.46.0","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"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":"wm3irnrjil5n275nw2m4x3mpvyg35h7isbmsnuae6vtxbamsrv4q====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"5wymz4fw6majnuwaoopp3m7dmjqbbvrx","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"l2fyfx2t7sesnitglbumuds2wqflfir6","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"qtxu5k6vkkyr2oii62lz7r4ubs7sz3xq"},{"name":"python-venv","version":"1.0","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"j3dgyzp5nei24fbpw22l3gedsk37asrdrjafbnaiwiux3lxasi3a====","dependencies":[{"name":"python","hash":"3tktfceps6thsraftda3svkdlypt47vx","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"mg6k4cfdhg6dore5avimwxdc7jn6onzs"},{"name":"re2c","version":"3.1","arch":{"platform":"darwin","platform_os":"sequoia","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ebw3m3xkgw2wijfijtzrxt4ldu4tz4haiz6juumq6wn4mjzsuxra====","dependencies":[{"name":"apple-clang","hash":"qj3zadkktznahfizazbfvmqvkhzd4bqv","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"compiler-wrapper","hash":"2uitb26t2s6nfpj244fbsh7gntsiwvge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"fszz4zptmmipakokiufglsphlmdgb6x3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"python","hash":"3tktfceps6thsraftda3svkdlypt47vx","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"4ym4yrdx4hfbj5rcevsdidy6zdc77om4"}]}} diff --git a/lib/spack/spack/bootstrap/prototypes/clingo-freebsd-amd64.json b/lib/spack/spack/bootstrap/prototypes/clingo-freebsd-amd64.json index ba661aa4f85..ffd58714635 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":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kuhq5ne7cdx2pca57zwnn57fezjovywffswkkryt4usm4zekw3yq====","dependencies":[{"name":"gmake","hash":"wydxawduinvosugi5pwkm7dbsxqltryg","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"hash":"g6rvrl5tghnxmldvsrjpye46y7nfa2it"}]}} +{"spec":{"_meta":{"version":5},"nodes":[{"name":"clingo-bootstrap","version":"spack","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"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":"ozkztarkrp3oet7x2oapc7ehdfyvweap45zb3g44mj6qpblv4l3a====","dependencies":[{"name":"bison","hash":"l4llzdyliqbeor66ht54qkezfdofmwj6","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"cmake","hash":"okz75726c4grndc4kadvpivfbr6546ud","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"python","hash":"syeuozebaclogvjl7izswkitiduyniob","parameters":{"deptypes":["build","link","run"],"virtuals":[]}},{"name":"python-venv","hash":"nw53taerhuinrvwfc6gcg4hztg77dkq5","parameters":{"deptypes":["build","run"],"virtuals":[]}},{"name":"re2c","hash":"prd7dmeald2bitrpbt6cqdcslfap5aay","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"je2szed32t2zoajsczveb4bokeitrcan"},{"name":"bison","version":"3.8.2","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"autotools","color":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"d4j62fwvuxqbiez32ltjnhu47ac425wjebsy6fhoptv6saxazcxq====","dependencies":[{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"diffutils","hash":"nk5z5kralivpxqazpvgmxvqdm73mimpx","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"m4","hash":"hoq7tejwrsetrepd4kjww3yvxfraycsa","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"l4llzdyliqbeor66ht54qkezfdofmwj6"},{"name":"compiler-wrapper","version":"1.0","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"gogqnfdkxjvnjgj3lndnoncjtdc7ydoc7klkjstywag4oqrvod7a====","annotations":{"original_specfile_version":5},"hash":"6o4jkave5ri3ooytknfil4p55ifcwxju"},{"name":"diffutils","version":"3.10","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kbmzdy7mgklc24qx55cvx7kq7hceby2yav4fnf64gfdo7epdghwa====","dependencies":[{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"nnr7brz74vmypk3gfhyykql5rvshhxiu","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c"]}}],"annotations":{"original_specfile_version":5},"hash":"nk5z5kralivpxqazpvgmxvqdm73mimpx"},{"name":"gmake","version":"4.4.1","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"generic","guile":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"rpzjfobv7qh3wevti34nlbd2emtw5mnyszqmkyiq5jiq33xm7qzq====","dependencies":[{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c"]}}],"annotations":{"original_specfile_version":5},"hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3"},{"name":"llvm","version":"18.1.5","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"cmake","build_type":"Release","clang":true,"compiler-rt":"runtime","cuda":false,"flang":false,"generator":"ninja","gold":true,"libcxx":"runtime","libomptarget":true,"libomptarget_debug":false,"libunwind":"runtime","link_llvm_dylib":false,"lld":false,"lldb":true,"llvm_dylib":true,"lua":true,"mlir":false,"openmp":"runtime","polly":true,"python":false,"shlib_symbol_version":"none","split_dwarf":false,"targets":["all"],"version_suffix":"none","z3":false,"zstd":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"external":{"path":"/usr","module":null,"extra_attributes":{"compilers":{"c":"/usr/bin/clang","cxx":"/usr/bin/clang++"}}},"package_hash":"7iourbijxpsp23e2wj3fel2fmmk23jzyzidcpqdgeux7g7ff2wxq====","annotations":{"original_specfile_version":5},"hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg"},{"name":"libiconv","version":"1.17","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ujsqmcknrabka5mhwwpbaf5rwxgopwoyxkskuwyqlcbynowgdvfa====","dependencies":[{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c"]}}],"annotations":{"original_specfile_version":5},"hash":"nnr7brz74vmypk3gfhyykql5rvshhxiu"},{"name":"m4","version":"1.4.19","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"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":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"diffutils","hash":"nk5z5kralivpxqazpvgmxvqdm73mimpx","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libsigsegv","hash":"guzz5zr4juvhrq4pqxnibvoma5z3djfi","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}}],"annotations":{"original_specfile_version":5},"hash":"hoq7tejwrsetrepd4kjww3yvxfraycsa"},{"name":"libsigsegv","version":"2.14","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"3s645t5rbjrziao47mhgob5xgymot6tf4kalagflbal2jdamdo2a====","dependencies":[{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c"]}}],"annotations":{"original_specfile_version":5},"hash":"guzz5zr4juvhrq4pqxnibvoma5z3djfi"},{"name":"cmake","version":"3.31.2","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"generic","build_type":"Release","doc":false,"ncurses":true,"ownlibs":true,"qtgui":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"7vk6yhuq2fklcj5kk7bhreqojudugggezq7vntmcsc32cw2avmya====","dependencies":[{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"curl","hash":"rkyymoo7xqnswutyvauf3iv5dddmaygt","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"ncurses","hash":"p2m3nzytg5lh6474vclnqtklvk6jpqos","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"c2jgry3yzjofxxjuqjckluoqbcm5exix","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"okz75726c4grndc4kadvpivfbr6546ud"},{"name":"curl","version":"8.10.1","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"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":"ccka5yawqcn2rjbqn3bkhkdjoajlngm5uab7jbyrsl5yqn42ofza====","dependencies":[{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"nghttp2","hash":"uuslnsztro7in3mxykjmrolg2wfdoyat","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"c6ojqefenrbxkupgaqznti6q2x3g22qf","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"pkgconf","hash":"yc2rz24ll3ulloccgxroltp5243csskb","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"zlib-ng","hash":"c2jgry3yzjofxxjuqjckluoqbcm5exix","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"rkyymoo7xqnswutyvauf3iv5dddmaygt"},{"name":"nghttp2","version":"1.64.0","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"nkykfkj4rxzmysrmoh5mhxrl5ysaemlqh652m3he7pkbgvjhjgba====","dependencies":[{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"diffutils","hash":"nk5z5kralivpxqazpvgmxvqdm73mimpx","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"pkgconf","hash":"yc2rz24ll3ulloccgxroltp5243csskb","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"annotations":{"original_specfile_version":5},"hash":"uuslnsztro7in3mxykjmrolg2wfdoyat"},{"name":"pkgconf","version":"2.2.0","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"gl6tpyarjlclzsal6wa4dtc7cdzprq36nbibalai4a6wgzblrseq====","dependencies":[{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c"]}}],"annotations":{"original_specfile_version":5},"hash":"yc2rz24ll3ulloccgxroltp5243csskb"},{"name":"openssl","version":"3.4.0","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"generic","certs":"mozilla","docs":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5y33vxwjtlrlsyedasvmhukjkk5yfwcri27oceh36iw73xehumfa====","dependencies":[{"name":"ca-certificates-mozilla","hash":"hm3nrr2yydcptn7fvphwvg6bwyo75bwf","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"perl","hash":"sadirf62yvikut4yghjhph6o5tztfwao","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"c2jgry3yzjofxxjuqjckluoqbcm5exix","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"c6ojqefenrbxkupgaqznti6q2x3g22qf"},{"name":"ca-certificates-mozilla","version":"2023-05-30","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"63npvwqwo2x7i6emvnklh4mhcn45gx2qzveorybh5h2inwr55sea====","annotations":{"original_specfile_version":5},"hash":"hm3nrr2yydcptn7fvphwvg6bwyo75bwf"},{"name":"perl","version":"5.40.0","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"generic","cpanm":true,"opcode":true,"open":true,"shared":true,"threads":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"f233ue76vwtkle2r4jwsfe5x27ujx6ea4vdyp6baonfmkgqf5vpa====","dependencies":[{"name":"berkeley-db","hash":"vncqfho5tjvizrhfpr4vft5nfyawkhw2","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"bzip2","hash":"utn5hm325756qkbf3ve5na2qtac7zxc5","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gdbm","hash":"ktpz7bar56pafbw2ab5rerdejfwnngjd","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"zlib-ng","hash":"c2jgry3yzjofxxjuqjckluoqbcm5exix","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"sadirf62yvikut4yghjhph6o5tztfwao"},{"name":"berkeley-db","version":"18.1.40","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"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":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}}],"annotations":{"original_specfile_version":5},"hash":"vncqfho5tjvizrhfpr4vft5nfyawkhw2"},{"name":"bzip2","version":"1.0.8","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"generic","debug":false,"pic":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"jb7yvhkifmvfl3ykmdulsjxkkulker6gqb5tadollyjt2ijg3zsa====","dependencies":[{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"diffutils","hash":"nk5z5kralivpxqazpvgmxvqdm73mimpx","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c"]}}],"annotations":{"original_specfile_version":5},"hash":"utn5hm325756qkbf3ve5na2qtac7zxc5"},{"name":"gdbm","version":"1.23","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"liepxl6phlcxbgfmibxafhewtihlgaa4x3hko37ckqlafhxkrgdq====","dependencies":[{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"readline","hash":"nixpi6ugx6vmxbxln5ceyqxnu2sypnlx","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"ktpz7bar56pafbw2ab5rerdejfwnngjd"},{"name":"readline","version":"8.2","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"package_hash":"oww6dmr7xqgg6j7iiluonxbcl4irqnnrip4vfkjdwujncwnuhwuq====","dependencies":[{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"ncurses","hash":"p2m3nzytg5lh6474vclnqtklvk6jpqos","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"nixpi6ugx6vmxbxln5ceyqxnu2sypnlx"},{"name":"ncurses","version":"6.5","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"abi":"none","build_system":"autotools","patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"symlinks":false,"termlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"package_hash":"cfh76rniab2gnv4jqr77yzz5za4ucfmva2upihvxukn52dybhsvq====","dependencies":[{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"pkgconf","hash":"yc2rz24ll3ulloccgxroltp5243csskb","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"annotations":{"original_specfile_version":5},"hash":"p2m3nzytg5lh6474vclnqtklvk6jpqos"},{"name":"zlib-ng","version":"2.2.1","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"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":"mdxo2xewbdavckgsqlcjywyfssdchgwbzonui22gxww7hqtozurq====","dependencies":[{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}}],"annotations":{"original_specfile_version":5},"hash":"c2jgry3yzjofxxjuqjckluoqbcm5exix"},{"name":"python","version":"3.13.0","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"generic","bz2":true,"ctypes":true,"dbm":true,"debug":false,"libxml2":true,"lzma":true,"optimizations":false,"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":[]},"package_hash":"n6v6rt6deysntdggu2gi4zkhqriyba6bgaghxyhluou4ssqf7xfq====","dependencies":[{"name":"bzip2","hash":"utn5hm325756qkbf3ve5na2qtac7zxc5","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"expat","hash":"djhfx5nxzsatwcklt743hizybmgvq75l","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gdbm","hash":"ktpz7bar56pafbw2ab5rerdejfwnngjd","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gettext","hash":"nfyjnvifb6n3v55esjgk7rinnq6e7av2","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libffi","hash":"657brzxsad4zh6ajeiriuatlxaco5beg","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"ncurses","hash":"p2m3nzytg5lh6474vclnqtklvk6jpqos","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"c6ojqefenrbxkupgaqznti6q2x3g22qf","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"pkgconf","hash":"yc2rz24ll3ulloccgxroltp5243csskb","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"readline","hash":"nixpi6ugx6vmxbxln5ceyqxnu2sypnlx","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"sqlite","hash":"dcqokkasxhtuu7g7htoi2v5btc2b63qf","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"util-linux-uuid","hash":"5u5klk6jrayvbilllhrlbszendi5liip","parameters":{"deptypes":["build","link"],"virtuals":["uuid"]}},{"name":"xz","hash":"6cqtdj22u47rdbvycoylphh7d6jbrvq4","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"c2jgry3yzjofxxjuqjckluoqbcm5exix","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"syeuozebaclogvjl7izswkitiduyniob"},{"name":"expat","version":"2.6.4","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"autotools","libbsd":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ei6qyjakl7sgtodwxxbg5brgkp23robfximtpbedkrnpyyyvr3ya====","dependencies":[{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}}],"annotations":{"original_specfile_version":5},"hash":"djhfx5nxzsatwcklt743hizybmgvq75l"},{"name":"gettext","version":"0.22.5","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"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":"d4zxhmw6rownaaokzcolsszrq2cmx44m7qmzopucymoyrhbdfgvq====","dependencies":[{"name":"bzip2","hash":"utn5hm325756qkbf3ve5na2qtac7zxc5","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"nnr7brz74vmypk3gfhyykql5rvshhxiu","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"libxml2","hash":"gkoikjiianqwi3r7ynsrj5kczj36mufp","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"ncurses","hash":"p2m3nzytg5lh6474vclnqtklvk6jpqos","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"tar","hash":"pygs7gph2cxutw2jktsvex3vxb2nl7hl","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"6cqtdj22u47rdbvycoylphh7d6jbrvq4","parameters":{"deptypes":["build","link","run"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"nfyjnvifb6n3v55esjgk7rinnq6e7av2"},{"name":"libxml2","version":"2.13.4","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"autotools","pic":true,"python":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"j6yob2wgvc2wjzvbs6xdvgyfa3zp3wrm3uxncxzxqfzw6xazzoba====","dependencies":[{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"nnr7brz74vmypk3gfhyykql5rvshhxiu","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"pkgconf","hash":"yc2rz24ll3ulloccgxroltp5243csskb","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"xz","hash":"6cqtdj22u47rdbvycoylphh7d6jbrvq4","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"c2jgry3yzjofxxjuqjckluoqbcm5exix","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"gkoikjiianqwi3r7ynsrj5kczj36mufp"},{"name":"xz","version":"5.4.6","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"pic":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zt5vu2vph2v2qjwgdbe7btgcz7axpyalorcsqiuxhrg5grwgrrvq====","dependencies":[{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c"]}}],"annotations":{"original_specfile_version":5},"hash":"6cqtdj22u47rdbvycoylphh7d6jbrvq4"},{"name":"tar","version":"1.35","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"autotools","zip":"pigz","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"v6a6jvks2setklucxyk622uauxzqlgmsdkrvdijbi3m5jwftmzla====","dependencies":[{"name":"bzip2","hash":"utn5hm325756qkbf3ve5na2qtac7zxc5","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"nnr7brz74vmypk3gfhyykql5rvshhxiu","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"pigz","hash":"f5jym2egytrgpubdtunmqolh7ioaaudm","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"6cqtdj22u47rdbvycoylphh7d6jbrvq4","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"zstd","hash":"7niz2hlqarxclxncsbbzl7zx5uo3btrq","parameters":{"deptypes":["run"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"pygs7gph2cxutw2jktsvex3vxb2nl7hl"},{"name":"pigz","version":"2.8","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"makefile","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"4w67lflje4giekjg4ie2vpyuiunjcumo6geofykvon3hodllp42q====","dependencies":[{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"zlib-ng","hash":"c2jgry3yzjofxxjuqjckluoqbcm5exix","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"f5jym2egytrgpubdtunmqolh7ioaaudm"},{"name":"zstd","version":"1.5.6","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"makefile","compression":["none"],"libs":["shared","static"],"programs":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"uvmrov4c6unft6o4yd3jk3uqvweua3uhwdli4sw7h5wvklaf5t3q====","dependencies":[{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}}],"annotations":{"original_specfile_version":5},"hash":"7niz2hlqarxclxncsbbzl7zx5uo3btrq"},{"name":"libffi","version":"3.4.6","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"umhsnvoj5ooa3glffnkk2hp3txmrsjvqbpfq2hbk4mhcvhza7gaa====","dependencies":[{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}}],"annotations":{"original_specfile_version":5},"hash":"657brzxsad4zh6ajeiriuatlxaco5beg"},{"name":"sqlite","version":"3.46.0","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"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":"wm3irnrjil5n275nw2m4x3mpvyg35h7isbmsnuae6vtxbamsrv4q====","dependencies":[{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"readline","hash":"nixpi6ugx6vmxbxln5ceyqxnu2sypnlx","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"c2jgry3yzjofxxjuqjckluoqbcm5exix","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"dcqokkasxhtuu7g7htoi2v5btc2b63qf"},{"name":"util-linux-uuid","version":"2.40.2","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"eo6au7zhsz344imzoomhuskbl3cmrqq6ja6mcmrc3li3fnppqs6q====","dependencies":[{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"pkgconf","hash":"yc2rz24ll3ulloccgxroltp5243csskb","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"annotations":{"original_specfile_version":5},"hash":"5u5klk6jrayvbilllhrlbszendi5liip"},{"name":"python-venv","version":"1.0","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"j3dgyzp5nei24fbpw22l3gedsk37asrdrjafbnaiwiux3lxasi3a====","dependencies":[{"name":"python","hash":"syeuozebaclogvjl7izswkitiduyniob","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"nw53taerhuinrvwfc6gcg4hztg77dkq5"},{"name":"re2c","version":"3.1","arch":{"platform":"freebsd","platform_os":"freebsd14.1","target":"amd64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ebw3m3xkgw2wijfijtzrxt4ldu4tz4haiz6juumq6wn4mjzsuxra====","dependencies":[{"name":"compiler-wrapper","hash":"6o4jkave5ri3ooytknfil4p55ifcwxju","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gmake","hash":"clafylgtxlepfvfrhjfqgfg2fc52vho3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"llvm","hash":"ujjiokwbw55sm7o6zoajb3xtcs65utxg","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"python","hash":"syeuozebaclogvjl7izswkitiduyniob","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"prd7dmeald2bitrpbt6cqdcslfap5aay"}]}} diff --git a/lib/spack/spack/bootstrap/prototypes/clingo-linux-aarch64.json b/lib/spack/spack/bootstrap/prototypes/clingo-linux-aarch64.json index d0692a81963..173566a8c7b 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":"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"}]}} +{"spec":{"_meta":{"version":5},"nodes":[{"name":"clingo-bootstrap","version":"spack","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"cmake","build_type":"Release","docs":false,"generator":"make","ipo":false,"optimized":false,"python":true,"static_libstdcpp":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ozkztarkrp3oet7x2oapc7ehdfyvweap45zb3g44mj6qpblv4l3a====","dependencies":[{"name":"bison","hash":"smnn2cumnp72tnrnnr6igudxyvtriqdk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"cmake","hash":"ltrb7aes3hwdnz27nzndzsmbv2vnw6wy","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"python","hash":"gygxuzpdf33jg2ya6imlbn4bd5zghbcd","parameters":{"deptypes":["build","link","run"],"virtuals":[]}},{"name":"python-venv","hash":"hf5bgjk6fsdycb4zovjap4t4g6tjfcvx","parameters":{"deptypes":["build","run"],"virtuals":[]}},{"name":"re2c","hash":"eavspn7qgilrfiby4v6in34pmjg5le6b","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"fxkanrgnzq7yhegi7z5de6ax7i5dablo"},{"name":"bison","version":"3.8.2","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","color":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"d4j62fwvuxqbiez32ltjnhu47ac425wjebsy6fhoptv6saxazcxq====","dependencies":[{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"diffutils","hash":"kntg5epaheq5s2cpiqskcfu3do6nikge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"z2hnkln52bnc5tbjkhtjv7n2av52a5eh","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"m4","hash":"jjtr2n3inumkcqn26fnznvt3ek5ddknd","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"smnn2cumnp72tnrnnr6igudxyvtriqdk"},{"name":"compiler-wrapper","version":"1.0","arch":{"platform":"linux","platform_os":"rhel9","target":{"name":"neoverse_v2","vendor":"ARM","features":["aes","asimd","asimddp","asimdfhm","asimdhp","asimdrdm","atomics","bf16","cpuid","crc32","dcpodp","dcpop","evtstrm","fcma","flagm","flagm2","fp","fphp","frint","i8mm","ilrcpc","jscvt","lrcpc","pmull","sb","sha1","sha2","sha3","sha512","sve","sve2","svebf16","svei8mm","uscat"],"generation":0,"parents":["neoverse_n1","armv9.0a"],"cpupart":"0xd4f"}},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"gogqnfdkxjvnjgj3lndnoncjtdc7ydoc7klkjstywag4oqrvod7a====","annotations":{"original_specfile_version":5},"hash":"rximc5jq3c544fhhnloem4mbccot26tv"},{"name":"diffutils","version":"3.10","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kbmzdy7mgklc24qx55cvx7kq7hceby2yav4fnf64gfdo7epdghwa====","dependencies":[{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"z2hnkln52bnc5tbjkhtjv7n2av52a5eh","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"bqcb2qmnv3vsz5u7b3whbrortoieu6bx","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}}],"annotations":{"original_specfile_version":5},"hash":"kntg5epaheq5s2cpiqskcfu3do6nikge"},{"name":"gcc","version":"8.5.0","arch":{"platform":"linux","platform_os":"rhel9","target":{"name":"neoverse_v2","vendor":"ARM","features":["aes","asimd","asimddp","asimdfhm","asimdhp","asimdrdm","atomics","bf16","cpuid","crc32","dcpodp","dcpop","evtstrm","fcma","flagm","flagm2","fp","fphp","frint","i8mm","ilrcpc","jscvt","lrcpc","pmull","sb","sha1","sha2","sha3","sha512","sve","sve2","svebf16","svei8mm","uscat"],"generation":0,"parents":["neoverse_n1","armv9.0a"],"cpupart":"0xd4f"}},"namespace":"builtin","parameters":{"binutils":false,"bootstrap":true,"build_system":"autotools","build_type":"RelWithDebInfo","graphite":false,"languages":["c","c++","fortran"],"nvptx":false,"patches":["98a9c96f66ff0264a49bd5e76fd2ba177ceca7c7236f486058a8469c2bcd1b76","d4919d68d5460049d370e79ff78bbc320cfe66a7fdf6dfc92cf7e133152b2d56"],"piclibs":false,"strip":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"external":{"path":"/usr","module":null,"extra_attributes":{"compilers":{"c":"/usr/bin/gcc","cxx":"/usr/bin/g++"}}},"patches":["98a9c96f66ff0264a49bd5e76fd2ba177ceca7c7236f486058a8469c2bcd1b76","d4919d68d5460049d370e79ff78bbc320cfe66a7fdf6dfc92cf7e133152b2d56"],"package_hash":"hnbtowhwympdfoqukgir3chmkqzzasrgcwxbot7im4bncvqtxvxq====","annotations":{"original_specfile_version":5},"hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol"},{"name":"gcc-runtime","version":"8.5.0","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"aud4d72goxupc5p3p6mdkwgtshpygn7uuj2ewx3zm6wudcgw4fzq====","dependencies":[{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"annotations":{"original_specfile_version":5},"hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj"},{"name":"glibc","version":"2.34","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"external":{"path":"/usr","module":null,"extra_attributes":{}},"package_hash":"4z35ntbdhytzlhaviffrorrqxvspd6k6jf3pqj7gbday4c2hld5q====","annotations":{"original_specfile_version":5},"hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh"},{"name":"gmake","version":"4.4.1","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"generic","guile":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"rpzjfobv7qh3wevti34nlbd2emtw5mnyszqmkyiq5jiq33xm7qzq====","dependencies":[{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"annotations":{"original_specfile_version":5},"hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld"},{"name":"gnuconfig","version":"2024-07-27","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"aar2tabf35425kgzryprq775xycug7xlbt4rkwvm4aj76dhlychq====","annotations":{"original_specfile_version":5},"hash":"z2hnkln52bnc5tbjkhtjv7n2av52a5eh"},{"name":"libiconv","version":"1.17","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ujsqmcknrabka5mhwwpbaf5rwxgopwoyxkskuwyqlcbynowgdvfa====","dependencies":[{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"z2hnkln52bnc5tbjkhtjv7n2av52a5eh","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"bqcb2qmnv3vsz5u7b3whbrortoieu6bx"},{"name":"m4","version":"1.4.19","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"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":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"diffutils","hash":"kntg5epaheq5s2cpiqskcfu3do6nikge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"z2hnkln52bnc5tbjkhtjv7n2av52a5eh","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libsigsegv","hash":"fkqxgj3yfnk4vl3iczancsoq5yc2bgye","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"jjtr2n3inumkcqn26fnznvt3ek5ddknd"},{"name":"libsigsegv","version":"2.14","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"3s645t5rbjrziao47mhgob5xgymot6tf4kalagflbal2jdamdo2a====","dependencies":[{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"z2hnkln52bnc5tbjkhtjv7n2av52a5eh","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"fkqxgj3yfnk4vl3iczancsoq5yc2bgye"},{"name":"cmake","version":"3.31.2","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"generic","build_type":"Release","doc":false,"ncurses":true,"ownlibs":true,"qtgui":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"7vk6yhuq2fklcj5kk7bhreqojudugggezq7vntmcsc32cw2avmya====","dependencies":[{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"curl","hash":"ntpxjnhrnsjzadlmrkier3pqoxqpng3t","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"d7rkispaw64fota6iabiom2hbawedpgj","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"hvwclyptyu46ird3xmb6gx4ii33rqd53","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"ltrb7aes3hwdnz27nzndzsmbv2vnw6wy"},{"name":"curl","version":"8.10.1","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"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":"ccka5yawqcn2rjbqn3bkhkdjoajlngm5uab7jbyrsl5yqn42ofza====","dependencies":[{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"z2hnkln52bnc5tbjkhtjv7n2av52a5eh","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"nghttp2","hash":"cznkg4nmmy62b3zdogggospnuuy3g5pc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"h4j2u76c7rhqompivzi4whe4hjw3cze7","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"pkgconf","hash":"mxoabqjj7kluh3md2xo4qyof524orfwl","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"zlib-ng","hash":"hvwclyptyu46ird3xmb6gx4ii33rqd53","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"ntpxjnhrnsjzadlmrkier3pqoxqpng3t"},{"name":"nghttp2","version":"1.64.0","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"nkykfkj4rxzmysrmoh5mhxrl5ysaemlqh652m3he7pkbgvjhjgba====","dependencies":[{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"diffutils","hash":"kntg5epaheq5s2cpiqskcfu3do6nikge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"z2hnkln52bnc5tbjkhtjv7n2av52a5eh","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"mxoabqjj7kluh3md2xo4qyof524orfwl","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"annotations":{"original_specfile_version":5},"hash":"cznkg4nmmy62b3zdogggospnuuy3g5pc"},{"name":"pkgconf","version":"2.2.0","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"gl6tpyarjlclzsal6wa4dtc7cdzprq36nbibalai4a6wgzblrseq====","dependencies":[{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"z2hnkln52bnc5tbjkhtjv7n2av52a5eh","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"mxoabqjj7kluh3md2xo4qyof524orfwl"},{"name":"openssl","version":"3.4.0","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"generic","certs":"mozilla","docs":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5y33vxwjtlrlsyedasvmhukjkk5yfwcri27oceh36iw73xehumfa====","dependencies":[{"name":"ca-certificates-mozilla","hash":"qeszxs4rv5nw7zezjc3524ztgkoz33ig","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"4tn6es2ac3gd2dsnvskwle4etlpk6qv3","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"hvwclyptyu46ird3xmb6gx4ii33rqd53","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"h4j2u76c7rhqompivzi4whe4hjw3cze7"},{"name":"ca-certificates-mozilla","version":"2023-05-30","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"63npvwqwo2x7i6emvnklh4mhcn45gx2qzveorybh5h2inwr55sea====","annotations":{"original_specfile_version":5},"hash":"qeszxs4rv5nw7zezjc3524ztgkoz33ig"},{"name":"perl","version":"5.40.0","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"generic","cpanm":true,"opcode":true,"open":true,"shared":true,"threads":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"f233ue76vwtkle2r4jwsfe5x27ujx6ea4vdyp6baonfmkgqf5vpa====","dependencies":[{"name":"berkeley-db","hash":"tmpewsx4vcxbciz63y3sjwqld577hzom","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"bzip2","hash":"gefii4i45qgge6oeyibc4a6neierycc5","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"gdbm","hash":"3tpau5775md4363pqnphjbr2ufir6rno","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"hvwclyptyu46ird3xmb6gx4ii33rqd53","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"4tn6es2ac3gd2dsnvskwle4etlpk6qv3"},{"name":"berkeley-db","version":"18.1.40","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"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":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"z2hnkln52bnc5tbjkhtjv7n2av52a5eh","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"tmpewsx4vcxbciz63y3sjwqld577hzom"},{"name":"bzip2","version":"1.0.8","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"generic","debug":false,"pic":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"jb7yvhkifmvfl3ykmdulsjxkkulker6gqb5tadollyjt2ijg3zsa====","dependencies":[{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"diffutils","hash":"kntg5epaheq5s2cpiqskcfu3do6nikge","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"gefii4i45qgge6oeyibc4a6neierycc5"},{"name":"gdbm","version":"1.23","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"liepxl6phlcxbgfmibxafhewtihlgaa4x3hko37ckqlafhxkrgdq====","dependencies":[{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"z2hnkln52bnc5tbjkhtjv7n2av52a5eh","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"6z2sfif7stzpfvb54eoqiiki5edutguc","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"3tpau5775md4363pqnphjbr2ufir6rno"},{"name":"readline","version":"8.2","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"package_hash":"oww6dmr7xqgg6j7iiluonxbcl4irqnnrip4vfkjdwujncwnuhwuq====","dependencies":[{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"z2hnkln52bnc5tbjkhtjv7n2av52a5eh","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"ncurses","hash":"d7rkispaw64fota6iabiom2hbawedpgj","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"6z2sfif7stzpfvb54eoqiiki5edutguc"},{"name":"ncurses","version":"6.5","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"abi":"none","build_system":"autotools","patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"symlinks":false,"termlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"package_hash":"cfh76rniab2gnv4jqr77yzz5za4ucfmva2upihvxukn52dybhsvq====","dependencies":[{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"z2hnkln52bnc5tbjkhtjv7n2av52a5eh","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"mxoabqjj7kluh3md2xo4qyof524orfwl","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"annotations":{"original_specfile_version":5},"hash":"d7rkispaw64fota6iabiom2hbawedpgj"},{"name":"zlib-ng","version":"2.2.1","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"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":"mdxo2xewbdavckgsqlcjywyfssdchgwbzonui22gxww7hqtozurq====","dependencies":[{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"z2hnkln52bnc5tbjkhtjv7n2av52a5eh","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"hvwclyptyu46ird3xmb6gx4ii33rqd53"},{"name":"python","version":"3.13.0","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"generic","bz2":true,"ctypes":true,"dbm":true,"debug":false,"libxml2":true,"lzma":true,"optimizations":false,"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":[]},"package_hash":"n6v6rt6deysntdggu2gi4zkhqriyba6bgaghxyhluou4ssqf7xfq====","dependencies":[{"name":"bzip2","hash":"gefii4i45qgge6oeyibc4a6neierycc5","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"expat","hash":"hjwfi4iuk7mecmsuh75z74wycjlw7lzi","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"gdbm","hash":"3tpau5775md4363pqnphjbr2ufir6rno","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gettext","hash":"hheyf7ak3sjcfohvfgegvdded4wppbvr","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libffi","hash":"qegr7o5zly6cqypzzsm7s6hxcwqsgtqj","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"d7rkispaw64fota6iabiom2hbawedpgj","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"h4j2u76c7rhqompivzi4whe4hjw3cze7","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"pkgconf","hash":"mxoabqjj7kluh3md2xo4qyof524orfwl","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"readline","hash":"6z2sfif7stzpfvb54eoqiiki5edutguc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"sqlite","hash":"kz4n2vtbxcj72s2teh2g6k6eefy6zxpe","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"util-linux-uuid","hash":"rmy7tbekh4lfetlh55swl74gqwlvrm3y","parameters":{"deptypes":["build","link"],"virtuals":["uuid"]}},{"name":"xz","hash":"vqzih6qodsu52uopsr42t7h5esj4jd2v","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"hvwclyptyu46ird3xmb6gx4ii33rqd53","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"gygxuzpdf33jg2ya6imlbn4bd5zghbcd"},{"name":"expat","version":"2.6.4","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","libbsd":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ei6qyjakl7sgtodwxxbg5brgkp23robfximtpbedkrnpyyyvr3ya====","dependencies":[{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"z2hnkln52bnc5tbjkhtjv7n2av52a5eh","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libbsd","hash":"ukmaajw26pw7xfaklkrklqha4rrrsgra","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"hjwfi4iuk7mecmsuh75z74wycjlw7lzi"},{"name":"libbsd","version":"0.12.2","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"debyg3en7sgggswkdhcyd6lbp7arawzmyujthyyuaiad5jqd5msa====","dependencies":[{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"z2hnkln52bnc5tbjkhtjv7n2av52a5eh","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libmd","hash":"il5ykbrdnhlzimhloyrwyymx3aicprt3","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"ukmaajw26pw7xfaklkrklqha4rrrsgra"},{"name":"libmd","version":"1.0.4","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zs2e7fqr4dzthpj5fascqvfn7xcahf7dtc5bzdwfv6vqkzi7oncq====","dependencies":[{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"z2hnkln52bnc5tbjkhtjv7n2av52a5eh","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"il5ykbrdnhlzimhloyrwyymx3aicprt3"},{"name":"gettext","version":"0.22.5","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"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":"d4zxhmw6rownaaokzcolsszrq2cmx44m7qmzopucymoyrhbdfgvq====","dependencies":[{"name":"bzip2","hash":"gefii4i45qgge6oeyibc4a6neierycc5","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"z2hnkln52bnc5tbjkhtjv7n2av52a5eh","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"bqcb2qmnv3vsz5u7b3whbrortoieu6bx","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"libxml2","hash":"6r76q5qnwa6ydovyzag7dghcfxsm6rlk","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"d7rkispaw64fota6iabiom2hbawedpgj","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"tar","hash":"peh5t7ttvsvzqas4gor63twpxwj7ei6i","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"vqzih6qodsu52uopsr42t7h5esj4jd2v","parameters":{"deptypes":["build","link","run"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"hheyf7ak3sjcfohvfgegvdded4wppbvr"},{"name":"libxml2","version":"2.13.4","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","pic":true,"python":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"j6yob2wgvc2wjzvbs6xdvgyfa3zp3wrm3uxncxzxqfzw6xazzoba====","dependencies":[{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"z2hnkln52bnc5tbjkhtjv7n2av52a5eh","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"bqcb2qmnv3vsz5u7b3whbrortoieu6bx","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pkgconf","hash":"mxoabqjj7kluh3md2xo4qyof524orfwl","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"xz","hash":"vqzih6qodsu52uopsr42t7h5esj4jd2v","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"hvwclyptyu46ird3xmb6gx4ii33rqd53","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"6r76q5qnwa6ydovyzag7dghcfxsm6rlk"},{"name":"xz","version":"5.4.6","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"pic":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zt5vu2vph2v2qjwgdbe7btgcz7axpyalorcsqiuxhrg5grwgrrvq====","dependencies":[{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"z2hnkln52bnc5tbjkhtjv7n2av52a5eh","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"vqzih6qodsu52uopsr42t7h5esj4jd2v"},{"name":"tar","version":"1.35","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","zip":"pigz","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"v6a6jvks2setklucxyk622uauxzqlgmsdkrvdijbi3m5jwftmzla====","dependencies":[{"name":"bzip2","hash":"gefii4i45qgge6oeyibc4a6neierycc5","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"z2hnkln52bnc5tbjkhtjv7n2av52a5eh","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"bqcb2qmnv3vsz5u7b3whbrortoieu6bx","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pigz","hash":"h5quuhwtol6qrxznml2ffjex2nfndg3e","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"vqzih6qodsu52uopsr42t7h5esj4jd2v","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"zstd","hash":"u5inbr2rrtinstce7l5krqqpnsal4vxo","parameters":{"deptypes":["run"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"peh5t7ttvsvzqas4gor63twpxwj7ei6i"},{"name":"pigz","version":"2.8","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"makefile","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"4w67lflje4giekjg4ie2vpyuiunjcumo6geofykvon3hodllp42q====","dependencies":[{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"hvwclyptyu46ird3xmb6gx4ii33rqd53","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"h5quuhwtol6qrxznml2ffjex2nfndg3e"},{"name":"zstd","version":"1.5.6","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"makefile","compression":["none"],"libs":["shared","static"],"programs":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"uvmrov4c6unft6o4yd3jk3uqvweua3uhwdli4sw7h5wvklaf5t3q====","dependencies":[{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"u5inbr2rrtinstce7l5krqqpnsal4vxo"},{"name":"libffi","version":"3.4.6","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"umhsnvoj5ooa3glffnkk2hp3txmrsjvqbpfq2hbk4mhcvhza7gaa====","dependencies":[{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"z2hnkln52bnc5tbjkhtjv7n2av52a5eh","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"qegr7o5zly6cqypzzsm7s6hxcwqsgtqj"},{"name":"sqlite","version":"3.46.0","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"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":"wm3irnrjil5n275nw2m4x3mpvyg35h7isbmsnuae6vtxbamsrv4q====","dependencies":[{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"z2hnkln52bnc5tbjkhtjv7n2av52a5eh","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"6z2sfif7stzpfvb54eoqiiki5edutguc","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"hvwclyptyu46ird3xmb6gx4ii33rqd53","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"kz4n2vtbxcj72s2teh2g6k6eefy6zxpe"},{"name":"util-linux-uuid","version":"2.40.2","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"eo6au7zhsz344imzoomhuskbl3cmrqq6ja6mcmrc3li3fnppqs6q====","dependencies":[{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"z2hnkln52bnc5tbjkhtjv7n2av52a5eh","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"mxoabqjj7kluh3md2xo4qyof524orfwl","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"annotations":{"original_specfile_version":5},"hash":"rmy7tbekh4lfetlh55swl74gqwlvrm3y"},{"name":"python-venv","version":"1.0","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"j3dgyzp5nei24fbpw22l3gedsk37asrdrjafbnaiwiux3lxasi3a====","dependencies":[{"name":"python","hash":"gygxuzpdf33jg2ya6imlbn4bd5zghbcd","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"hf5bgjk6fsdycb4zovjap4t4g6tjfcvx"},{"name":"re2c","version":"3.1","arch":{"platform":"linux","platform_os":"rhel9","target":"aarch64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ebw3m3xkgw2wijfijtzrxt4ldu4tz4haiz6juumq6wn4mjzsuxra====","dependencies":[{"name":"compiler-wrapper","hash":"rximc5jq3c544fhhnloem4mbccot26tv","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"vojoispd6oa5kvdlyebgdgddrmhfpkol","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"23zkc4xomaptugrl5ueoh3tv3oyaqjnj","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"2mq2filwjgkrv6j6cxvispjqvtirsssh","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"gjaj5hopp3pqqbupult3vmvokhzzfhld","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"z2hnkln52bnc5tbjkhtjv7n2av52a5eh","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"python","hash":"gygxuzpdf33jg2ya6imlbn4bd5zghbcd","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"eavspn7qgilrfiby4v6in34pmjg5le6b"}]}} diff --git a/lib/spack/spack/bootstrap/prototypes/clingo-linux-ppc64le.json b/lib/spack/spack/bootstrap/prototypes/clingo-linux-ppc64le.json index 9e170a92bb3..e3448808e4e 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":"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"}]}} +{"spec":{"_meta":{"version":5},"nodes":[{"name":"clingo-bootstrap","version":"spack","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"cmake","build_type":"Release","docs":false,"generator":"make","ipo":false,"optimized":false,"python":true,"static_libstdcpp":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ozkztarkrp3oet7x2oapc7ehdfyvweap45zb3g44mj6qpblv4l3a====","dependencies":[{"name":"bison","hash":"lgghcjqpoodrawadw7vibeiul7wrnqog","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"cmake","hash":"p4cntzqqcfg5a6ymiyjpk6ykqcwwirym","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"python","hash":"lk4r47znptvkiszmntnetz6kgen7tgm3","parameters":{"deptypes":["build","link","run"],"virtuals":[]}},{"name":"python-venv","hash":"dlduozijjwp5o7vnrdghszehqh5j4rim","parameters":{"deptypes":["build","run"],"virtuals":[]}},{"name":"re2c","hash":"xfl6wrih72mane3eeobwpkyjwtfn2y76","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"7bxhwjxs6euecw5nkz4pi2hoi6lqz6ee"},{"name":"bison","version":"3.8.2","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"autotools","color":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"d4j62fwvuxqbiez32ltjnhu47ac425wjebsy6fhoptv6saxazcxq====","dependencies":[{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"diffutils","hash":"wly2a7jdclwp6kcz3x3nzhyuqqrhgbjt","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"klycihpzvu77okocxw42le5dbhwduu2z","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"m4","hash":"twjk5wpmcqes4w4biqdwwrillznv5qaq","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"lgghcjqpoodrawadw7vibeiul7wrnqog"},{"name":"compiler-wrapper","version":"1.0","arch":{"platform":"linux","platform_os":"rhel8","target":{"name":"power9le","vendor":"IBM","features":[],"generation":9,"parents":["power8le"],"cpupart":""}},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"gogqnfdkxjvnjgj3lndnoncjtdc7ydoc7klkjstywag4oqrvod7a====","annotations":{"original_specfile_version":5},"hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai"},{"name":"diffutils","version":"3.10","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kbmzdy7mgklc24qx55cvx7kq7hceby2yav4fnf64gfdo7epdghwa====","dependencies":[{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"klycihpzvu77okocxw42le5dbhwduu2z","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"jjemqnzesqbyw5tdlrk3nnuuajptekss","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}}],"annotations":{"original_specfile_version":5},"hash":"wly2a7jdclwp6kcz3x3nzhyuqqrhgbjt"},{"name":"gcc","version":"8.5.0","arch":{"platform":"linux","platform_os":"rhel8","target":{"name":"power9le","vendor":"IBM","features":[],"generation":9,"parents":["power8le"],"cpupart":""}},"namespace":"builtin","parameters":{"binutils":false,"bootstrap":true,"build_system":"autotools","build_type":"RelWithDebInfo","graphite":false,"languages":["c","c++","fortran"],"nvptx":false,"patches":["98a9c96f66ff0264a49bd5e76fd2ba177ceca7c7236f486058a8469c2bcd1b76","d4919d68d5460049d370e79ff78bbc320cfe66a7fdf6dfc92cf7e133152b2d56"],"piclibs":false,"strip":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"external":{"path":"/usr","module":null,"extra_attributes":{"compilers":{"c":"/usr/bin/gcc","cxx":"/usr/bin/g++"}}},"patches":["98a9c96f66ff0264a49bd5e76fd2ba177ceca7c7236f486058a8469c2bcd1b76","d4919d68d5460049d370e79ff78bbc320cfe66a7fdf6dfc92cf7e133152b2d56"],"package_hash":"fnrebjvblgu5vg2gnwreotucmf67pkyu6dzgo5afxngtphp66biq====","annotations":{"original_specfile_version":5},"hash":"ezexv4wrroazd3i26siktomcoagxii3l"},{"name":"gcc-runtime","version":"8.5.0","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"aud4d72goxupc5p3p6mdkwgtshpygn7uuj2ewx3zm6wudcgw4fzq====","dependencies":[{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"annotations":{"original_specfile_version":5},"hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp"},{"name":"glibc","version":"2.28","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"external":{"path":"/usr","module":null,"extra_attributes":{}},"package_hash":"riktbfk2yybad7tgbvdkntk5c5msjcm5pk3x7naszgbvfm57h4rq====","annotations":{"original_specfile_version":5},"hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac"},{"name":"gmake","version":"4.4.1","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"generic","guile":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"rpzjfobv7qh3wevti34nlbd2emtw5mnyszqmkyiq5jiq33xm7qzq====","dependencies":[{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"annotations":{"original_specfile_version":5},"hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk"},{"name":"gnuconfig","version":"2024-07-27","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"aar2tabf35425kgzryprq775xycug7xlbt4rkwvm4aj76dhlychq====","annotations":{"original_specfile_version":5},"hash":"klycihpzvu77okocxw42le5dbhwduu2z"},{"name":"libiconv","version":"1.17","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ujsqmcknrabka5mhwwpbaf5rwxgopwoyxkskuwyqlcbynowgdvfa====","dependencies":[{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"klycihpzvu77okocxw42le5dbhwduu2z","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"jjemqnzesqbyw5tdlrk3nnuuajptekss"},{"name":"m4","version":"1.4.19","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"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":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"diffutils","hash":"wly2a7jdclwp6kcz3x3nzhyuqqrhgbjt","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"klycihpzvu77okocxw42le5dbhwduu2z","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libsigsegv","hash":"mgnur44dzhyu7j6gqkqqfaa6odgp4ox2","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"twjk5wpmcqes4w4biqdwwrillznv5qaq"},{"name":"libsigsegv","version":"2.14","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"3s645t5rbjrziao47mhgob5xgymot6tf4kalagflbal2jdamdo2a====","dependencies":[{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"klycihpzvu77okocxw42le5dbhwduu2z","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"mgnur44dzhyu7j6gqkqqfaa6odgp4ox2"},{"name":"cmake","version":"3.31.2","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"generic","build_type":"Release","doc":false,"ncurses":true,"ownlibs":true,"qtgui":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"7vk6yhuq2fklcj5kk7bhreqojudugggezq7vntmcsc32cw2avmya====","dependencies":[{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"curl","hash":"7cw4rfec7mv444ok2avp3qpq62upmims","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"s3oz4dsdxhvwkoekfjly6x3q4netali4","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"2q57rihnetmc5erpl6vw3nusqw7ycjqs","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"p4cntzqqcfg5a6ymiyjpk6ykqcwwirym"},{"name":"curl","version":"8.10.1","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"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":"ccka5yawqcn2rjbqn3bkhkdjoajlngm5uab7jbyrsl5yqn42ofza====","dependencies":[{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"klycihpzvu77okocxw42le5dbhwduu2z","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"nghttp2","hash":"bkgwuueh4jnhdcu6gvtyxldelsp3nrf2","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"j7xymvpa4nhwhjxb2hhahjcyjvvezyho","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"pkgconf","hash":"dylr2p25oj5nqbtq3zhtfkktbocbe4jm","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"zlib-ng","hash":"2q57rihnetmc5erpl6vw3nusqw7ycjqs","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"7cw4rfec7mv444ok2avp3qpq62upmims"},{"name":"nghttp2","version":"1.64.0","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"nkykfkj4rxzmysrmoh5mhxrl5ysaemlqh652m3he7pkbgvjhjgba====","dependencies":[{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"diffutils","hash":"wly2a7jdclwp6kcz3x3nzhyuqqrhgbjt","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"klycihpzvu77okocxw42le5dbhwduu2z","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"dylr2p25oj5nqbtq3zhtfkktbocbe4jm","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"annotations":{"original_specfile_version":5},"hash":"bkgwuueh4jnhdcu6gvtyxldelsp3nrf2"},{"name":"pkgconf","version":"2.2.0","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"gl6tpyarjlclzsal6wa4dtc7cdzprq36nbibalai4a6wgzblrseq====","dependencies":[{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"klycihpzvu77okocxw42le5dbhwduu2z","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"dylr2p25oj5nqbtq3zhtfkktbocbe4jm"},{"name":"openssl","version":"3.4.0","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"generic","certs":"mozilla","docs":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5y33vxwjtlrlsyedasvmhukjkk5yfwcri27oceh36iw73xehumfa====","dependencies":[{"name":"ca-certificates-mozilla","hash":"6aunhqikyb5jmxkapuhzc43lapta4gaa","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"ly3b5hxhkeavnar35daa3xolmbb7guv2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"2q57rihnetmc5erpl6vw3nusqw7ycjqs","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"j7xymvpa4nhwhjxb2hhahjcyjvvezyho"},{"name":"ca-certificates-mozilla","version":"2023-05-30","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"63npvwqwo2x7i6emvnklh4mhcn45gx2qzveorybh5h2inwr55sea====","annotations":{"original_specfile_version":5},"hash":"6aunhqikyb5jmxkapuhzc43lapta4gaa"},{"name":"perl","version":"5.40.0","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"generic","cpanm":true,"opcode":true,"open":true,"shared":true,"threads":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"f233ue76vwtkle2r4jwsfe5x27ujx6ea4vdyp6baonfmkgqf5vpa====","dependencies":[{"name":"berkeley-db","hash":"n3eeghdelxrza3mezn7guy6qsqhjcon4","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"bzip2","hash":"5myohalomy2tb2s3oxd5zninc6u7v4pr","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"gdbm","hash":"bhsabxvim2eymbj3w3chcjwv4boripys","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"2q57rihnetmc5erpl6vw3nusqw7ycjqs","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"ly3b5hxhkeavnar35daa3xolmbb7guv2"},{"name":"berkeley-db","version":"18.1.40","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"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":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"klycihpzvu77okocxw42le5dbhwduu2z","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"n3eeghdelxrza3mezn7guy6qsqhjcon4"},{"name":"bzip2","version":"1.0.8","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"generic","debug":false,"pic":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"jb7yvhkifmvfl3ykmdulsjxkkulker6gqb5tadollyjt2ijg3zsa====","dependencies":[{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"diffutils","hash":"wly2a7jdclwp6kcz3x3nzhyuqqrhgbjt","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"5myohalomy2tb2s3oxd5zninc6u7v4pr"},{"name":"gdbm","version":"1.23","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"liepxl6phlcxbgfmibxafhewtihlgaa4x3hko37ckqlafhxkrgdq====","dependencies":[{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"klycihpzvu77okocxw42le5dbhwduu2z","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"jxqfcixv66kiwdfxcnbxadbrxmnhpiqf","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"bhsabxvim2eymbj3w3chcjwv4boripys"},{"name":"readline","version":"8.2","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"package_hash":"oww6dmr7xqgg6j7iiluonxbcl4irqnnrip4vfkjdwujncwnuhwuq====","dependencies":[{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"klycihpzvu77okocxw42le5dbhwduu2z","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"ncurses","hash":"s3oz4dsdxhvwkoekfjly6x3q4netali4","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"jxqfcixv66kiwdfxcnbxadbrxmnhpiqf"},{"name":"ncurses","version":"6.5","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"abi":"none","build_system":"autotools","patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"symlinks":false,"termlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"package_hash":"cfh76rniab2gnv4jqr77yzz5za4ucfmva2upihvxukn52dybhsvq====","dependencies":[{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"klycihpzvu77okocxw42le5dbhwduu2z","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"dylr2p25oj5nqbtq3zhtfkktbocbe4jm","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"annotations":{"original_specfile_version":5},"hash":"s3oz4dsdxhvwkoekfjly6x3q4netali4"},{"name":"zlib-ng","version":"2.2.1","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"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":"mdxo2xewbdavckgsqlcjywyfssdchgwbzonui22gxww7hqtozurq====","dependencies":[{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"klycihpzvu77okocxw42le5dbhwduu2z","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"2q57rihnetmc5erpl6vw3nusqw7ycjqs"},{"name":"python","version":"3.13.0","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"generic","bz2":true,"ctypes":true,"dbm":true,"debug":false,"libxml2":true,"lzma":true,"optimizations":false,"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":[]},"package_hash":"n6v6rt6deysntdggu2gi4zkhqriyba6bgaghxyhluou4ssqf7xfq====","dependencies":[{"name":"bzip2","hash":"5myohalomy2tb2s3oxd5zninc6u7v4pr","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"expat","hash":"vvi4w4c2ibhcbc653rqnvf2cgkp6lhxm","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"gdbm","hash":"bhsabxvim2eymbj3w3chcjwv4boripys","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gettext","hash":"7o3dt5k4qbnr632i3gyiaaexuc3utv4w","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libffi","hash":"ibk3s5narlwxsakc4bsawr3npleftvjs","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"s3oz4dsdxhvwkoekfjly6x3q4netali4","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"j7xymvpa4nhwhjxb2hhahjcyjvvezyho","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"pkgconf","hash":"dylr2p25oj5nqbtq3zhtfkktbocbe4jm","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"readline","hash":"jxqfcixv66kiwdfxcnbxadbrxmnhpiqf","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"sqlite","hash":"4q6cdje3u6oxg3eww63oxmoy2dlks3ml","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"util-linux-uuid","hash":"dzc4fsrtt5bt5rn3hrq6mguskici66i7","parameters":{"deptypes":["build","link"],"virtuals":["uuid"]}},{"name":"xz","hash":"4bw3ito7ggkxzqxl6jryedkokkjdbgjv","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"2q57rihnetmc5erpl6vw3nusqw7ycjqs","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"lk4r47znptvkiszmntnetz6kgen7tgm3"},{"name":"expat","version":"2.6.4","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"autotools","libbsd":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ei6qyjakl7sgtodwxxbg5brgkp23robfximtpbedkrnpyyyvr3ya====","dependencies":[{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"klycihpzvu77okocxw42le5dbhwduu2z","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libbsd","hash":"swmg4rlaebhq37ufiskqf3hz5vq76ybj","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"vvi4w4c2ibhcbc653rqnvf2cgkp6lhxm"},{"name":"libbsd","version":"0.12.2","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"debyg3en7sgggswkdhcyd6lbp7arawzmyujthyyuaiad5jqd5msa====","dependencies":[{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"klycihpzvu77okocxw42le5dbhwduu2z","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libmd","hash":"lhb5nmg7qo67plifgcchtgqnjuxa633a","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"swmg4rlaebhq37ufiskqf3hz5vq76ybj"},{"name":"libmd","version":"1.0.4","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zs2e7fqr4dzthpj5fascqvfn7xcahf7dtc5bzdwfv6vqkzi7oncq====","dependencies":[{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"klycihpzvu77okocxw42le5dbhwduu2z","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"lhb5nmg7qo67plifgcchtgqnjuxa633a"},{"name":"gettext","version":"0.22.5","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"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":"d4zxhmw6rownaaokzcolsszrq2cmx44m7qmzopucymoyrhbdfgvq====","dependencies":[{"name":"bzip2","hash":"5myohalomy2tb2s3oxd5zninc6u7v4pr","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"klycihpzvu77okocxw42le5dbhwduu2z","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"jjemqnzesqbyw5tdlrk3nnuuajptekss","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"libxml2","hash":"2hjspbs3neipsef47zhcjtswkg4x6wzo","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"s3oz4dsdxhvwkoekfjly6x3q4netali4","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"tar","hash":"p52zhlsdvvqcwgswuev2qkv4lhfk3zpr","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"4bw3ito7ggkxzqxl6jryedkokkjdbgjv","parameters":{"deptypes":["build","link","run"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"7o3dt5k4qbnr632i3gyiaaexuc3utv4w"},{"name":"libxml2","version":"2.13.4","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"autotools","pic":true,"python":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"j6yob2wgvc2wjzvbs6xdvgyfa3zp3wrm3uxncxzxqfzw6xazzoba====","dependencies":[{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"klycihpzvu77okocxw42le5dbhwduu2z","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"jjemqnzesqbyw5tdlrk3nnuuajptekss","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pkgconf","hash":"dylr2p25oj5nqbtq3zhtfkktbocbe4jm","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"xz","hash":"4bw3ito7ggkxzqxl6jryedkokkjdbgjv","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"2q57rihnetmc5erpl6vw3nusqw7ycjqs","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"2hjspbs3neipsef47zhcjtswkg4x6wzo"},{"name":"xz","version":"5.4.6","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"pic":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zt5vu2vph2v2qjwgdbe7btgcz7axpyalorcsqiuxhrg5grwgrrvq====","dependencies":[{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"klycihpzvu77okocxw42le5dbhwduu2z","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"4bw3ito7ggkxzqxl6jryedkokkjdbgjv"},{"name":"tar","version":"1.35","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"autotools","zip":"pigz","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"v6a6jvks2setklucxyk622uauxzqlgmsdkrvdijbi3m5jwftmzla====","dependencies":[{"name":"bzip2","hash":"5myohalomy2tb2s3oxd5zninc6u7v4pr","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"klycihpzvu77okocxw42le5dbhwduu2z","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"jjemqnzesqbyw5tdlrk3nnuuajptekss","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pigz","hash":"7otxklss5g77i5xarpyasp4thet2fqis","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"4bw3ito7ggkxzqxl6jryedkokkjdbgjv","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"zstd","hash":"dkk3fhqzamznskkzgijs3dn5p4yqosv3","parameters":{"deptypes":["run"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"p52zhlsdvvqcwgswuev2qkv4lhfk3zpr"},{"name":"pigz","version":"2.8","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"makefile","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"4w67lflje4giekjg4ie2vpyuiunjcumo6geofykvon3hodllp42q====","dependencies":[{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"2q57rihnetmc5erpl6vw3nusqw7ycjqs","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"7otxklss5g77i5xarpyasp4thet2fqis"},{"name":"zstd","version":"1.5.6","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"makefile","compression":["none"],"libs":["shared","static"],"programs":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"uvmrov4c6unft6o4yd3jk3uqvweua3uhwdli4sw7h5wvklaf5t3q====","dependencies":[{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"dkk3fhqzamznskkzgijs3dn5p4yqosv3"},{"name":"libffi","version":"3.4.6","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"umhsnvoj5ooa3glffnkk2hp3txmrsjvqbpfq2hbk4mhcvhza7gaa====","dependencies":[{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"klycihpzvu77okocxw42le5dbhwduu2z","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"ibk3s5narlwxsakc4bsawr3npleftvjs"},{"name":"sqlite","version":"3.46.0","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"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":"wm3irnrjil5n275nw2m4x3mpvyg35h7isbmsnuae6vtxbamsrv4q====","dependencies":[{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"klycihpzvu77okocxw42le5dbhwduu2z","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"jxqfcixv66kiwdfxcnbxadbrxmnhpiqf","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"2q57rihnetmc5erpl6vw3nusqw7ycjqs","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"4q6cdje3u6oxg3eww63oxmoy2dlks3ml"},{"name":"util-linux-uuid","version":"2.40.2","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"eo6au7zhsz344imzoomhuskbl3cmrqq6ja6mcmrc3li3fnppqs6q====","dependencies":[{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"klycihpzvu77okocxw42le5dbhwduu2z","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"dylr2p25oj5nqbtq3zhtfkktbocbe4jm","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"annotations":{"original_specfile_version":5},"hash":"dzc4fsrtt5bt5rn3hrq6mguskici66i7"},{"name":"python-venv","version":"1.0","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"j3dgyzp5nei24fbpw22l3gedsk37asrdrjafbnaiwiux3lxasi3a====","dependencies":[{"name":"python","hash":"lk4r47znptvkiszmntnetz6kgen7tgm3","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"dlduozijjwp5o7vnrdghszehqh5j4rim"},{"name":"re2c","version":"3.1","arch":{"platform":"linux","platform_os":"rhel8","target":"ppc64le"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ebw3m3xkgw2wijfijtzrxt4ldu4tz4haiz6juumq6wn4mjzsuxra====","dependencies":[{"name":"compiler-wrapper","hash":"ktcmkdaifi35awtk4wu3logfsi4nvtai","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"ezexv4wrroazd3i26siktomcoagxii3l","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"gfkhbpchfu2fk7m5yz4dax52d7yt5etp","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"mhe3tozpzp7hwolo3dxeh3zzqh45rlac","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"vjbibbd23up7c3c4cxpgawbz63krxjpk","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gnuconfig","hash":"klycihpzvu77okocxw42le5dbhwduu2z","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"python","hash":"lk4r47znptvkiszmntnetz6kgen7tgm3","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"xfl6wrih72mane3eeobwpkyjwtfn2y76"}]}} 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 a1c94c3b93b..caad7bb8fe8 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":"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"}]}} +{"spec":{"_meta":{"version":5},"nodes":[{"name":"clingo-bootstrap","version":"spack","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"cmake","build_type":"Release","docs":false,"generator":"make","ipo":false,"optimized":false,"python":true,"static_libstdcpp":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ozkztarkrp3oet7x2oapc7ehdfyvweap45zb3g44mj6qpblv4l3a====","dependencies":[{"name":"bison","hash":"ipu4y2n34za3lzhgwsqxha3pag2v2dn7","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"cmake","hash":"2i4zyafripteq6cssiyrmo67n6tmypfs","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"python","hash":"7f76ydmj6f4epvepmak2y5qfllqow5db","parameters":{"deptypes":["build","link","run"],"virtuals":[]}},{"name":"python-venv","hash":"mvybzkpm37r4xrt3eip5nn2padrhnlrm","parameters":{"deptypes":["build","run"],"virtuals":[]}},{"name":"re2c","hash":"ketxaszk5wezamuffgkdpie66tkd7rbl","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"5mxtdduhp3wsqlifimjzb53eswxqgd5b"},{"name":"bison","version":"3.8.2","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","color":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"d4j62fwvuxqbiez32ltjnhu47ac425wjebsy6fhoptv6saxazcxq====","dependencies":[{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"diffutils","hash":"eso2orwqs33nyzewrf6ccckvkfoxdzn2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"m4","hash":"gb5idois57zldhovt7rx44bd2ou4yiwr","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"ipu4y2n34za3lzhgwsqxha3pag2v2dn7"},{"name":"compiler-wrapper","version":"1.0","arch":{"platform":"linux","platform_os":"rhel8","target":{"name":"skylake_avx512","vendor":"GenuineIntel","features":["adx","aes","avx","avx2","avx512bw","avx512cd","avx512dq","avx512f","avx512vl","bmi1","bmi2","clflushopt","clwb","f16c","fma","mmx","movbe","pclmulqdq","popcnt","rdrand","rdseed","sse","sse2","sse4_1","sse4_2","ssse3","xsavec","xsaveopt"],"generation":0,"parents":["skylake","x86_64_v4"],"cpupart":""}},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"gogqnfdkxjvnjgj3lndnoncjtdc7ydoc7klkjstywag4oqrvod7a====","annotations":{"original_specfile_version":5},"hash":"3wjlvksj4tr3qckfozocbeziogwilggn"},{"name":"diffutils","version":"3.10","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"kbmzdy7mgklc24qx55cvx7kq7hceby2yav4fnf64gfdo7epdghwa====","dependencies":[{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"3mozqilguvrkepcixf5v5czrvz64sn7a","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}}],"annotations":{"original_specfile_version":5},"hash":"eso2orwqs33nyzewrf6ccckvkfoxdzn2"},{"name":"gcc","version":"8.5.0","arch":{"platform":"linux","platform_os":"rhel8","target":{"name":"skylake_avx512","vendor":"GenuineIntel","features":["adx","aes","avx","avx2","avx512bw","avx512cd","avx512dq","avx512f","avx512vl","bmi1","bmi2","clflushopt","clwb","f16c","fma","mmx","movbe","pclmulqdq","popcnt","rdrand","rdseed","sse","sse2","sse4_1","sse4_2","ssse3","xsavec","xsaveopt"],"generation":0,"parents":["skylake","x86_64_v4"],"cpupart":""}},"namespace":"builtin","parameters":{"binutils":false,"bootstrap":true,"build_system":"autotools","build_type":"RelWithDebInfo","graphite":false,"languages":["c","c++","fortran"],"nvptx":false,"patches":["98a9c96f66ff0264a49bd5e76fd2ba177ceca7c7236f486058a8469c2bcd1b76","d4919d68d5460049d370e79ff78bbc320cfe66a7fdf6dfc92cf7e133152b2d56"],"piclibs":false,"strip":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"external":{"path":"/usr","module":null,"extra_attributes":{"compilers":{"c":"/usr/bin/gcc","cxx":"/usr/bin/g++"}}},"patches":["98a9c96f66ff0264a49bd5e76fd2ba177ceca7c7236f486058a8469c2bcd1b76","d4919d68d5460049d370e79ff78bbc320cfe66a7fdf6dfc92cf7e133152b2d56"],"package_hash":"fnrebjvblgu5vg2gnwreotucmf67pkyu6dzgo5afxngtphp66biq====","annotations":{"original_specfile_version":5},"hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr"},{"name":"gcc-runtime","version":"8.5.0","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"aud4d72goxupc5p3p6mdkwgtshpygn7uuj2ewx3zm6wudcgw4fzq====","dependencies":[{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"annotations":{"original_specfile_version":5},"hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu"},{"name":"glibc","version":"2.28","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"external":{"path":"/usr","module":null,"extra_attributes":{}},"package_hash":"riktbfk2yybad7tgbvdkntk5c5msjcm5pk3x7naszgbvfm57h4rq====","annotations":{"original_specfile_version":5},"hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s"},{"name":"gmake","version":"4.4.1","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"generic","guile":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"rpzjfobv7qh3wevti34nlbd2emtw5mnyszqmkyiq5jiq33xm7qzq====","dependencies":[{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}}],"annotations":{"original_specfile_version":5},"hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe"},{"name":"libiconv","version":"1.17","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ujsqmcknrabka5mhwwpbaf5rwxgopwoyxkskuwyqlcbynowgdvfa====","dependencies":[{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"3mozqilguvrkepcixf5v5czrvz64sn7a"},{"name":"m4","version":"1.4.19","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"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":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"diffutils","hash":"eso2orwqs33nyzewrf6ccckvkfoxdzn2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libsigsegv","hash":"4joh2v5wzpcg5cd5m4fnpwebagp47lai","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"gb5idois57zldhovt7rx44bd2ou4yiwr"},{"name":"libsigsegv","version":"2.14","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"3s645t5rbjrziao47mhgob5xgymot6tf4kalagflbal2jdamdo2a====","dependencies":[{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"4joh2v5wzpcg5cd5m4fnpwebagp47lai"},{"name":"cmake","version":"3.31.2","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"generic","build_type":"Release","doc":false,"ncurses":true,"ownlibs":true,"qtgui":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"7vk6yhuq2fklcj5kk7bhreqojudugggezq7vntmcsc32cw2avmya====","dependencies":[{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"curl","hash":"dp2opcfk3d74hz2nokrdthwa4xc7ghmb","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"dm74bntb4otcekmwea6jmevqvhnono72","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"wrvzbh5ldwur22ypf3aa3srtdj77ufe7","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"2i4zyafripteq6cssiyrmo67n6tmypfs"},{"name":"curl","version":"8.10.1","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"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":"ccka5yawqcn2rjbqn3bkhkdjoajlngm5uab7jbyrsl5yqn42ofza====","dependencies":[{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"nghttp2","hash":"ztbzbssc6u4bylezsl6fc4hou2p3syju","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"tdkectn77qw2zzxkgwduylz57p7zgi66","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"pkgconf","hash":"6lfz6rvu2t7em2fovlh3xfsr6vynzxi2","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"zlib-ng","hash":"wrvzbh5ldwur22ypf3aa3srtdj77ufe7","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"dp2opcfk3d74hz2nokrdthwa4xc7ghmb"},{"name":"nghttp2","version":"1.64.0","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"nkykfkj4rxzmysrmoh5mhxrl5ysaemlqh652m3he7pkbgvjhjgba====","dependencies":[{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"diffutils","hash":"eso2orwqs33nyzewrf6ccckvkfoxdzn2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"6lfz6rvu2t7em2fovlh3xfsr6vynzxi2","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"annotations":{"original_specfile_version":5},"hash":"ztbzbssc6u4bylezsl6fc4hou2p3syju"},{"name":"pkgconf","version":"2.2.0","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"gl6tpyarjlclzsal6wa4dtc7cdzprq36nbibalai4a6wgzblrseq====","dependencies":[{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"6lfz6rvu2t7em2fovlh3xfsr6vynzxi2"},{"name":"openssl","version":"3.4.0","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"generic","certs":"mozilla","docs":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"5y33vxwjtlrlsyedasvmhukjkk5yfwcri27oceh36iw73xehumfa====","dependencies":[{"name":"ca-certificates-mozilla","hash":"oe3ftgfbeukmc6dzcmqjfgda7cccgx77","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"perl","hash":"zjvu7ocv2zwrg4krarhjh3vvi2u3ha2h","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"wrvzbh5ldwur22ypf3aa3srtdj77ufe7","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"tdkectn77qw2zzxkgwduylz57p7zgi66"},{"name":"ca-certificates-mozilla","version":"2023-05-30","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"63npvwqwo2x7i6emvnklh4mhcn45gx2qzveorybh5h2inwr55sea====","annotations":{"original_specfile_version":5},"hash":"oe3ftgfbeukmc6dzcmqjfgda7cccgx77"},{"name":"perl","version":"5.40.0","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"generic","cpanm":true,"opcode":true,"open":true,"shared":true,"threads":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"f233ue76vwtkle2r4jwsfe5x27ujx6ea4vdyp6baonfmkgqf5vpa====","dependencies":[{"name":"berkeley-db","hash":"lfuzet6lgtupoudoympe7rzjb4yndv2d","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"bzip2","hash":"mhpnc4vabp2r5fxmq6aakyvofvnnmldt","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"gdbm","hash":"5dd4vl5on3dfg6dd6yxy5t5vrpfwaii5","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"wrvzbh5ldwur22ypf3aa3srtdj77ufe7","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"zjvu7ocv2zwrg4krarhjh3vvi2u3ha2h"},{"name":"berkeley-db","version":"18.1.40","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"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":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"lfuzet6lgtupoudoympe7rzjb4yndv2d"},{"name":"bzip2","version":"1.0.8","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"generic","debug":false,"pic":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"jb7yvhkifmvfl3ykmdulsjxkkulker6gqb5tadollyjt2ijg3zsa====","dependencies":[{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"diffutils","hash":"eso2orwqs33nyzewrf6ccckvkfoxdzn2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"mhpnc4vabp2r5fxmq6aakyvofvnnmldt"},{"name":"gdbm","version":"1.23","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"liepxl6phlcxbgfmibxafhewtihlgaa4x3hko37ckqlafhxkrgdq====","dependencies":[{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"23lcaxfxq4fy5hchfratqxywajwjgspx","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"5dd4vl5on3dfg6dd6yxy5t5vrpfwaii5"},{"name":"readline","version":"8.2","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["bbf97f1ec40a929edab5aa81998c1e2ef435436c597754916e6a5868f273aff7"],"package_hash":"oww6dmr7xqgg6j7iiluonxbcl4irqnnrip4vfkjdwujncwnuhwuq====","dependencies":[{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"ncurses","hash":"dm74bntb4otcekmwea6jmevqvhnono72","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"23lcaxfxq4fy5hchfratqxywajwjgspx"},{"name":"ncurses","version":"6.5","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"abi":"none","build_system":"autotools","patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"symlinks":false,"termlib":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["7a351bc4953a4ab70dabdbea31c8db0c03d40ce505335f3b6687180dde24c535"],"package_hash":"cfh76rniab2gnv4jqr77yzz5za4ucfmva2upihvxukn52dybhsvq====","dependencies":[{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"6lfz6rvu2t7em2fovlh3xfsr6vynzxi2","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"annotations":{"original_specfile_version":5},"hash":"dm74bntb4otcekmwea6jmevqvhnono72"},{"name":"zlib-ng","version":"2.2.1","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"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":"mdxo2xewbdavckgsqlcjywyfssdchgwbzonui22gxww7hqtozurq====","dependencies":[{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"wrvzbh5ldwur22ypf3aa3srtdj77ufe7"},{"name":"python","version":"3.13.0","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"generic","bz2":true,"ctypes":true,"dbm":true,"debug":false,"libxml2":true,"lzma":true,"optimizations":false,"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":[]},"package_hash":"n6v6rt6deysntdggu2gi4zkhqriyba6bgaghxyhluou4ssqf7xfq====","dependencies":[{"name":"bzip2","hash":"mhpnc4vabp2r5fxmq6aakyvofvnnmldt","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"expat","hash":"cnsgli2fxpinhfywuenoz2t4dhc47hqw","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"gdbm","hash":"5dd4vl5on3dfg6dd6yxy5t5vrpfwaii5","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"gettext","hash":"fdsw6uskzn4ddgrmdqcseatiziy2pdtx","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libffi","hash":"yht6xjipvotkpf3t56t4qhzzng4gbluj","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"dm74bntb4otcekmwea6jmevqvhnono72","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"openssl","hash":"tdkectn77qw2zzxkgwduylz57p7zgi66","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"pkgconf","hash":"6lfz6rvu2t7em2fovlh3xfsr6vynzxi2","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"readline","hash":"23lcaxfxq4fy5hchfratqxywajwjgspx","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"sqlite","hash":"ypawguzvgqolvimqyrun5r3rfbdphfsg","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"util-linux-uuid","hash":"l7pvs6vnv6exgs4uci6ulfrcqb7codqp","parameters":{"deptypes":["build","link"],"virtuals":["uuid"]}},{"name":"xz","hash":"ojolxif3gv5pmuc3zveqie7zcbtpgjfd","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"wrvzbh5ldwur22ypf3aa3srtdj77ufe7","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"7f76ydmj6f4epvepmak2y5qfllqow5db"},{"name":"expat","version":"2.6.4","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","libbsd":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ei6qyjakl7sgtodwxxbg5brgkp23robfximtpbedkrnpyyyvr3ya====","dependencies":[{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libbsd","hash":"xlv3vxthk3ra5fsoe7e55pcroy6njci2","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"cnsgli2fxpinhfywuenoz2t4dhc47hqw"},{"name":"libbsd","version":"0.12.2","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"debyg3en7sgggswkdhcyd6lbp7arawzmyujthyyuaiad5jqd5msa====","dependencies":[{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libmd","hash":"w5jj3yfzzxvwjoptrwnna3rbooo44i3b","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"xlv3vxthk3ra5fsoe7e55pcroy6njci2"},{"name":"libmd","version":"1.0.4","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zs2e7fqr4dzthpj5fascqvfn7xcahf7dtc5bzdwfv6vqkzi7oncq====","dependencies":[{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"w5jj3yfzzxvwjoptrwnna3rbooo44i3b"},{"name":"gettext","version":"0.22.5","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"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":"d4zxhmw6rownaaokzcolsszrq2cmx44m7qmzopucymoyrhbdfgvq====","dependencies":[{"name":"bzip2","hash":"mhpnc4vabp2r5fxmq6aakyvofvnnmldt","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"3mozqilguvrkepcixf5v5czrvz64sn7a","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"libxml2","hash":"xv3omnzedrjqkpn4sda6suxsfeauzkvz","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"ncurses","hash":"dm74bntb4otcekmwea6jmevqvhnono72","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"tar","hash":"y5e5unbos2j4egc75khytcwtvfmznsxx","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"ojolxif3gv5pmuc3zveqie7zcbtpgjfd","parameters":{"deptypes":["build","link","run"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"fdsw6uskzn4ddgrmdqcseatiziy2pdtx"},{"name":"libxml2","version":"2.13.4","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","pic":true,"python":false,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"j6yob2wgvc2wjzvbs6xdvgyfa3zp3wrm3uxncxzxqfzw6xazzoba====","dependencies":[{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"3mozqilguvrkepcixf5v5czrvz64sn7a","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pkgconf","hash":"6lfz6rvu2t7em2fovlh3xfsr6vynzxi2","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}},{"name":"xz","hash":"ojolxif3gv5pmuc3zveqie7zcbtpgjfd","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"wrvzbh5ldwur22ypf3aa3srtdj77ufe7","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"xv3omnzedrjqkpn4sda6suxsfeauzkvz"},{"name":"xz","version":"5.4.6","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","libs":["shared","static"],"pic":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"zt5vu2vph2v2qjwgdbe7btgcz7axpyalorcsqiuxhrg5grwgrrvq====","dependencies":[{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"ojolxif3gv5pmuc3zveqie7zcbtpgjfd"},{"name":"tar","version":"1.35","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","zip":"pigz","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"v6a6jvks2setklucxyk622uauxzqlgmsdkrvdijbi3m5jwftmzla====","dependencies":[{"name":"bzip2","hash":"mhpnc4vabp2r5fxmq6aakyvofvnnmldt","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"libiconv","hash":"3mozqilguvrkepcixf5v5czrvz64sn7a","parameters":{"deptypes":["build","link"],"virtuals":["iconv"]}},{"name":"pigz","hash":"6gltt7sf6leoizgacsyxcvkfjhfajubf","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"xz","hash":"ojolxif3gv5pmuc3zveqie7zcbtpgjfd","parameters":{"deptypes":["run"],"virtuals":[]}},{"name":"zstd","hash":"7hd6zzagnpahpiu46rg2i4ht32mdndmj","parameters":{"deptypes":["run"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"y5e5unbos2j4egc75khytcwtvfmznsxx"},{"name":"pigz","version":"2.8","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"makefile","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"4w67lflje4giekjg4ie2vpyuiunjcumo6geofykvon3hodllp42q====","dependencies":[{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"zlib-ng","hash":"wrvzbh5ldwur22ypf3aa3srtdj77ufe7","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"6gltt7sf6leoizgacsyxcvkfjhfajubf"},{"name":"zstd","version":"1.5.6","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"makefile","compression":["none"],"libs":["shared","static"],"programs":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"uvmrov4c6unft6o4yd3jk3uqvweua3uhwdli4sw7h5wvklaf5t3q====","dependencies":[{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"7hd6zzagnpahpiu46rg2i4ht32mdndmj"},{"name":"libffi","version":"3.4.6","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"umhsnvoj5ooa3glffnkk2hp3txmrsjvqbpfq2hbk4mhcvhza7gaa====","dependencies":[{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"yht6xjipvotkpf3t56t4qhzzng4gbluj"},{"name":"sqlite","version":"3.46.0","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"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":"wm3irnrjil5n275nw2m4x3mpvyg35h7isbmsnuae6vtxbamsrv4q====","dependencies":[{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"readline","hash":"23lcaxfxq4fy5hchfratqxywajwjgspx","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib-ng","hash":"wrvzbh5ldwur22ypf3aa3srtdj77ufe7","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"ypawguzvgqolvimqyrun5r3rfbdphfsg"},{"name":"util-linux-uuid","version":"2.40.2","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"eo6au7zhsz344imzoomhuskbl3cmrqq6ja6mcmrc3li3fnppqs6q====","dependencies":[{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"pkgconf","hash":"6lfz6rvu2t7em2fovlh3xfsr6vynzxi2","parameters":{"deptypes":["build"],"virtuals":["pkgconfig"]}}],"annotations":{"original_specfile_version":5},"hash":"l7pvs6vnv6exgs4uci6ulfrcqb7codqp"},{"name":"python-venv","version":"1.0","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"j3dgyzp5nei24fbpw22l3gedsk37asrdrjafbnaiwiux3lxasi3a====","dependencies":[{"name":"python","hash":"7f76ydmj6f4epvepmak2y5qfllqow5db","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"mvybzkpm37r4xrt3eip5nn2padrhnlrm"},{"name":"re2c","version":"3.1","arch":{"platform":"linux","platform_os":"rhel8","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"autotools","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ebw3m3xkgw2wijfijtzrxt4ldu4tz4haiz6juumq6wn4mjzsuxra====","dependencies":[{"name":"compiler-wrapper","hash":"3wjlvksj4tr3qckfozocbeziogwilggn","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"gcc","hash":"xfrx6wio34o7fhpwtv6kjypvxlurblwr","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"gcc-runtime","hash":"hfi7ird7tq2ektlpntoru7znszd7lkbu","parameters":{"deptypes":["link"],"virtuals":[]}},{"name":"glibc","hash":"z3v4q7z2ksjom7krlru22p27j4mdyw2s","parameters":{"deptypes":["link"],"virtuals":["libc"]}},{"name":"gmake","hash":"l65jstphe3wyvixgkd3lv4dp5boxxjhe","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"python","hash":"7f76ydmj6f4epvepmak2y5qfllqow5db","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"ketxaszk5wezamuffgkdpie66tkd7rbl"}]}} 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 f95ffefd1ce..659e68909e0 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":"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"}]}} +{"spec":{"_meta":{"version":5},"nodes":[{"name":"clingo-bootstrap","version":"spack","arch":{"platform":"windows","platform_os":"windows10.0.19045","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"cmake","build_type":"Release","docs":false,"generator":"ninja","ipo":false,"optimized":false,"patches":["311bd2ae3f2f5274d1d36a2d65f887dfdf4c309a3c6bb29a53bbafb82b42ba7a","4ccfd173d439ed1e23eff42d5a01a8fbb21341c632d86b5691242dc270dbf065","c5c4db292a920ded6eecfbb6749d88ce9c4f179500aee6aee3a417b93c7c5c7a"],"python":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"patches":["4ccfd173d439ed1e23eff42d5a01a8fbb21341c632d86b5691242dc270dbf065","311bd2ae3f2f5274d1d36a2d65f887dfdf4c309a3c6bb29a53bbafb82b42ba7a","c5c4db292a920ded6eecfbb6749d88ce9c4f179500aee6aee3a417b93c7c5c7a"],"package_hash":"4c42opkd2w53rbrvk73mrxvy2ynkvq5wj2lang7ov2ptpimldsxa====","dependencies":[{"name":"cmake","hash":"zumu22rfkjg3krutmigxxkx2me42efes","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"rzlyyiuxoojqqm6w2eo5ddyq4psu4ni2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"msvc","hash":"skajkv74f2oyno7p5xp25no66w2mrtrk","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"ninja","hash":"bqypodje25rvy7ozbsyhzve42m6mcpsx","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"python","hash":"j4qa7xsbagk4dex5qo3777lv4jdgbpwn","parameters":{"deptypes":["build","link","run"],"virtuals":[]}},{"name":"python-venv","hash":"po2f6c4cf4nfwd57jshovkkp6zhsxpuc","parameters":{"deptypes":["build","run"],"virtuals":[]}},{"name":"re2c","hash":"mf2atm3mtzukanuqcuk6vxmtcnvrjfm6","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"winbison","hash":"sjrbf3m2ypcbf2quglw26qfn3kksigyu","parameters":{"deptypes":["build","link"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"wzcmsgouevrl3jpzwoh2gh7upehzxta3"},{"name":"cmake","version":"3.31.2","arch":{"platform":"windows","platform_os":"windows10.0.19045","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"generic","build_type":"Release","doc":false,"ncurses":false,"ownlibs":true,"qtgui":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"7vk6yhuq2fklcj5kk7bhreqojudugggezq7vntmcsc32cw2avmya====","dependencies":[{"name":"compiler-wrapper","hash":"rzlyyiuxoojqqm6w2eo5ddyq4psu4ni2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"curl","hash":"etpxh45rduqsnd6fap5uj5qzhijabs4g","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"msvc","hash":"skajkv74f2oyno7p5xp25no66w2mrtrk","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"ninja","hash":"bqypodje25rvy7ozbsyhzve42m6mcpsx","parameters":{"deptypes":["build","link"],"virtuals":[]}},{"name":"zlib","hash":"sweajh5242hgibn2nsvapphwztahxzpo","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"zumu22rfkjg3krutmigxxkx2me42efes"},{"name":"compiler-wrapper","version":"1.0","arch":{"platform":"windows","platform_os":"windows10.0.19045","target":{"name":"broadwell","vendor":"GenuineIntel","features":["adx","aes","avx","avx2","bmi1","bmi2","f16c","fma","mmx","movbe","pclmulqdq","popcnt","rdrand","rdseed","sse","sse2","sse4_1","sse4_2","ssse3"],"generation":0,"parents":["haswell"],"cpupart":""}},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"f2cvl7ifstxe4onighf2lrijbckr3wwlzjaqt3yaxtxmepeldkwq====","annotations":{"original_specfile_version":5},"hash":"rzlyyiuxoojqqm6w2eo5ddyq4psu4ni2"},{"name":"curl","version":"8.10.1","arch":{"platform":"windows","platform_os":"windows10.0.19045","target":"x86_64"},"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":"ccka5yawqcn2rjbqn3bkhkdjoajlngm5uab7jbyrsl5yqn42ofza====","dependencies":[{"name":"compiler-wrapper","hash":"rzlyyiuxoojqqm6w2eo5ddyq4psu4ni2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"msvc","hash":"skajkv74f2oyno7p5xp25no66w2mrtrk","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"zlib","hash":"sweajh5242hgibn2nsvapphwztahxzpo","parameters":{"deptypes":["build","link"],"virtuals":["zlib-api"]}}],"annotations":{"original_specfile_version":5},"hash":"etpxh45rduqsnd6fap5uj5qzhijabs4g"},{"name":"msvc","version":"19.41.34120","arch":{"platform":"windows","platform_os":"windows10.0.19045","target":{"name":"broadwell","vendor":"GenuineIntel","features":["adx","aes","avx","avx2","bmi1","bmi2","f16c","fma","mmx","movbe","pclmulqdq","popcnt","rdrand","rdseed","sse","sse2","sse4_1","sse4_2","ssse3"],"generation":0,"parents":["haswell"],"cpupart":""}},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"external":{"path":"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.41.34120","module":null,"extra_attributes":{"compilers":{"c":"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.41.34120\\bin\\Hostx64\\x64\\cl.exe","cxx":"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.41.34120\\bin\\Hostx64\\x64\\cl.exe"}}},"package_hash":"xywxjwuwneitqkaxzvyewhvhhr4zzuxhewmj6vmvf3cq7nf24k2a====","annotations":{"original_specfile_version":5},"hash":"skajkv74f2oyno7p5xp25no66w2mrtrk"},{"name":"zlib","version":"1.3.1","arch":{"platform":"windows","platform_os":"windows10.0.19045","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"generic","optimize":true,"pic":true,"shared":true,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"7m5x6iihfcayy4fhcdurbffk4krn7ykq2vo6wxbr2ue2pgtetf4a====","dependencies":[{"name":"compiler-wrapper","hash":"rzlyyiuxoojqqm6w2eo5ddyq4psu4ni2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"msvc","hash":"skajkv74f2oyno7p5xp25no66w2mrtrk","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}}],"annotations":{"original_specfile_version":5},"hash":"sweajh5242hgibn2nsvapphwztahxzpo"},{"name":"ninja","version":"1.12.1","arch":{"platform":"windows","platform_os":"windows10.0.19045","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"generic","re2c":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"eanqnmavyldorxcgxf6z3j76hehc37sw55hhjbnnjy4gsvrtji3a====","dependencies":[{"name":"compiler-wrapper","hash":"rzlyyiuxoojqqm6w2eo5ddyq4psu4ni2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"msvc","hash":"skajkv74f2oyno7p5xp25no66w2mrtrk","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"python","hash":"j4qa7xsbagk4dex5qo3777lv4jdgbpwn","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"bqypodje25rvy7ozbsyhzve42m6mcpsx"},{"name":"python","version":"3.13.0","arch":{"platform":"windows","platform_os":"windows10.0.19045","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"generic","bz2":true,"ctypes":true,"dbm":true,"debug":false,"libxml2":true,"lzma":true,"optimizations":false,"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":[]},"package_hash":"n6v6rt6deysntdggu2gi4zkhqriyba6bgaghxyhluou4ssqf7xfq====","dependencies":[{"name":"compiler-wrapper","hash":"rzlyyiuxoojqqm6w2eo5ddyq4psu4ni2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"msvc","hash":"skajkv74f2oyno7p5xp25no66w2mrtrk","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}}],"annotations":{"original_specfile_version":5},"hash":"j4qa7xsbagk4dex5qo3777lv4jdgbpwn"},{"name":"python-venv","version":"1.0","arch":{"platform":"windows","platform_os":"windows10.0.19045","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"generic","cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"j3dgyzp5nei24fbpw22l3gedsk37asrdrjafbnaiwiux3lxasi3a====","dependencies":[{"name":"python","hash":"j4qa7xsbagk4dex5qo3777lv4jdgbpwn","parameters":{"deptypes":["build","run"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"po2f6c4cf4nfwd57jshovkkp6zhsxpuc"},{"name":"re2c","version":"3.1","arch":{"platform":"windows","platform_os":"windows10.0.19045","target":"x86_64"},"namespace":"builtin","parameters":{"build_system":"cmake","build_type":"Release","generator":"ninja","ipo":false,"cflags":[],"cppflags":[],"cxxflags":[],"fflags":[],"ldflags":[],"ldlibs":[]},"package_hash":"ebw3m3xkgw2wijfijtzrxt4ldu4tz4haiz6juumq6wn4mjzsuxra====","dependencies":[{"name":"cmake","hash":"zumu22rfkjg3krutmigxxkx2me42efes","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"rzlyyiuxoojqqm6w2eo5ddyq4psu4ni2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"msvc","hash":"skajkv74f2oyno7p5xp25no66w2mrtrk","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"ninja","hash":"bqypodje25rvy7ozbsyhzve42m6mcpsx","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"python","hash":"j4qa7xsbagk4dex5qo3777lv4jdgbpwn","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"mf2atm3mtzukanuqcuk6vxmtcnvrjfm6"},{"name":"winbison","version":"2.5.25","arch":{"platform":"windows","platform_os":"windows10.0.19045","target":"x86_64"},"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":"zumu22rfkjg3krutmigxxkx2me42efes","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"compiler-wrapper","hash":"rzlyyiuxoojqqm6w2eo5ddyq4psu4ni2","parameters":{"deptypes":["build"],"virtuals":[]}},{"name":"msvc","hash":"skajkv74f2oyno7p5xp25no66w2mrtrk","parameters":{"deptypes":["build"],"virtuals":["c","cxx"]}},{"name":"ninja","hash":"bqypodje25rvy7ozbsyhzve42m6mcpsx","parameters":{"deptypes":["build"],"virtuals":[]}}],"annotations":{"original_specfile_version":5},"hash":"sjrbf3m2ypcbf2quglw26qfn3kksigyu"}]}} diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index 73a9aff184b..fe142a213dc 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -36,7 +36,6 @@ import multiprocessing import os import re -import stat import sys import traceback import types @@ -71,7 +70,7 @@ import spack.build_systems.meson import spack.build_systems.python import spack.builder -import spack.compilers +import spack.compilers.libraries import spack.config import spack.deptypes as dt import spack.error @@ -85,7 +84,6 @@ import spack.store import spack.subprocess_context import spack.util.executable -import spack.util.libc from spack import traverse from spack.context import Context from spack.error import InstallError, NoHeadersError, NoLibrariesError @@ -93,6 +91,8 @@ from spack.util.environment import ( SYSTEM_DIR_CASE_ENTRY, EnvironmentModifications, + ModificationList, + PrependPath, env_flag, filter_system_paths, get_path, @@ -113,7 +113,7 @@ # set_wrapper_variables and used to pass parameters to # Spack's compiler wrappers. # -SPACK_ENV_PATH = "SPACK_ENV_PATH" +SPACK_COMPILER_WRAPPER_PATH = "SPACK_COMPILER_WRAPPER_PATH" SPACK_MANAGED_DIRS = "SPACK_MANAGED_DIRS" SPACK_INCLUDE_DIRS = "SPACK_INCLUDE_DIRS" SPACK_LINK_DIRS = "SPACK_LINK_DIRS" @@ -390,62 +390,10 @@ def _add_werror_handling(keep_werror, env): env.set("SPACK_COMPILER_FLAGS_REPLACE", " ".join(["|".join(item) for item in replace_flags])) -def set_compiler_environment_variables(pkg, env): +def set_wrapper_environment_variables_for_flags(pkg, env): assert pkg.spec.concrete - compiler = pkg.compiler spec = pkg.spec - # Make sure the executables for this compiler exist - compiler.verify_executables() - - # Set compiler variables used by CMake and autotools - assert all(key in compiler.link_paths for key in ("cc", "cxx", "f77", "fc")) - - # Populate an object with the list of environment modifications - # and return it - # TODO : add additional kwargs for better diagnostics, like requestor, - # ttyout, ttyerr, etc. - link_dir = spack.paths.build_env_path - - # Set SPACK compiler variables so that our wrapper knows what to - # call. If there is no compiler configured then use a default - # wrapper which will emit an error if it is used. - if compiler.cc: - env.set("SPACK_CC", compiler.cc) - env.set("CC", os.path.join(link_dir, compiler.link_paths["cc"])) - else: - env.set("CC", os.path.join(link_dir, "cc")) - if compiler.cxx: - env.set("SPACK_CXX", compiler.cxx) - env.set("CXX", os.path.join(link_dir, compiler.link_paths["cxx"])) - else: - env.set("CC", os.path.join(link_dir, "c++")) - if compiler.f77: - env.set("SPACK_F77", compiler.f77) - env.set("F77", os.path.join(link_dir, compiler.link_paths["f77"])) - else: - env.set("F77", os.path.join(link_dir, "f77")) - if compiler.fc: - env.set("SPACK_FC", compiler.fc) - env.set("FC", os.path.join(link_dir, compiler.link_paths["fc"])) - else: - env.set("FC", os.path.join(link_dir, "fc")) - - # Set SPACK compiler rpath flags so that our wrapper knows what to use - env.set("SPACK_CC_RPATH_ARG", compiler.cc_rpath_arg) - env.set("SPACK_CXX_RPATH_ARG", compiler.cxx_rpath_arg) - env.set("SPACK_F77_RPATH_ARG", compiler.f77_rpath_arg) - env.set("SPACK_FC_RPATH_ARG", compiler.fc_rpath_arg) - env.set("SPACK_LINKER_ARG", compiler.linker_arg) - - # Check whether we want to force RPATH or RUNPATH - if spack.config.get("config:shared_linking:type") == "rpath": - env.set("SPACK_DTAGS_TO_STRIP", compiler.enable_new_dtags) - env.set("SPACK_DTAGS_TO_ADD", compiler.disable_new_dtags) - else: - env.set("SPACK_DTAGS_TO_STRIP", compiler.disable_new_dtags) - env.set("SPACK_DTAGS_TO_ADD", compiler.enable_new_dtags) - if pkg.keep_werror is not None: keep_werror = pkg.keep_werror else: @@ -453,10 +401,6 @@ def set_compiler_environment_variables(pkg, env): _add_werror_handling(keep_werror, env) - # Set the target parameters that the compiler will add - isa_arg = optimization_flags(compiler, spec.target) - env.set("SPACK_TARGET_ARGS", isa_arg) - # Trap spack-tracked compiler flags as appropriate. # env_flags are easy to accidentally override. inject_flags = {} @@ -489,75 +433,23 @@ def set_compiler_environment_variables(pkg, env): # implicit variables env.set(flag.upper(), " ".join(f for f in env_flags[flag])) pkg.flags_to_build_system_args(build_system_flags) - - env.set("SPACK_COMPILER_SPEC", str(spec.compiler)) - env.set("SPACK_SYSTEM_DIRS", SYSTEM_DIR_CASE_ENTRY) - - compiler.setup_custom_environment(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)) - + version_number, _ = archspec.cpu.version_components(compiler.version.dotted_numeric_string) try: - result = target.optimization_flags(compiler.name, compiler_version.dotted_numeric_string) + result = target.optimization_flags(compiler.name, version_number) 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. @@ -566,39 +458,8 @@ def set_wrapper_variables(pkg, env): this function computes these options in a manner that is intended to match the DAG traversal order in `SetupContext`. TODO: this is not the case yet, we're using post order, SetupContext is using topo order.""" - # Set environment variables if specified for - # the given compiler - compiler = pkg.compiler - env.extend(spack.schema.environment.parse(compiler.environment)) - - if compiler.extra_rpaths: - extra_rpaths = ":".join(compiler.extra_rpaths) - env.set("SPACK_COMPILER_EXTRA_RPATHS", extra_rpaths) - - # Add spack build environment path with compiler wrappers first in - # the path. We add the compiler wrapper path, which includes default - # wrappers (cc, c++, f77, f90), AND a subdirectory containing - # compiler-specific symlinks. The latter ensures that builds that - # are sensitive to the *name* of the compiler see the right name when - # we're building with the wrappers. - # - # Conflicts on case-insensitive systems (like "CC" and "cc") are - # handled by putting one in the /case-insensitive - # directory. Add that to the path too. - env_paths = [] - compiler_specific = os.path.join( - spack.paths.build_env_path, os.path.dirname(pkg.compiler.link_paths["cc"]) - ) - for item in [spack.paths.build_env_path, compiler_specific]: - env_paths.append(item) - ci = os.path.join(item, "case-insensitive") - if os.path.isdir(ci): - env_paths.append(ci) - - tty.debug("Adding compiler bin/ paths: " + " ".join(env_paths)) - for item in env_paths: - env.prepend_path("PATH", item) - env.set_path(SPACK_ENV_PATH, env_paths) + # Set compiler flags injected from the spec + set_wrapper_environment_variables_for_flags(pkg, env) # Working directory for the spack command itself, for debug logs. if spack.config.get("config:debug"): @@ -664,22 +525,15 @@ def set_wrapper_variables(pkg, env): 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)) + default_dynamic_linker_filter = spack.compilers.libraries.dynamic_linker_filter_for(pkg.spec) + if default_dynamic_linker_filter: + rpath_dirs = default_dynamic_linker_filter(rpath_dirs) # 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). @@ -731,26 +585,6 @@ def set_package_py_globals(pkg, context: Context = Context.BUILD): # Don't use which for this; we want to find it in the current dir. module.configure = Executable("./configure") - # Put spack compiler paths in module scope. (Some packages use it - # in setup_run_environment etc, so don't put it context == build) - link_dir = spack.paths.build_env_path - pkg_compiler = None - try: - pkg_compiler = pkg.compiler - except spack.compilers.NoCompilerForSpecError as e: - tty.debug(f"cannot set 'spack_cc': {str(e)}") - - if pkg_compiler is not None: - module.spack_cc = os.path.join(link_dir, pkg_compiler.link_paths["cc"]) - module.spack_cxx = os.path.join(link_dir, pkg_compiler.link_paths["cxx"]) - module.spack_f77 = os.path.join(link_dir, pkg_compiler.link_paths["f77"]) - module.spack_fc = os.path.join(link_dir, pkg_compiler.link_paths["fc"]) - else: - module.spack_cc = None - module.spack_cxx = None - module.spack_f77 = None - module.spack_fc = None - # Useful directories within the prefix are encapsulated in # a Prefix object. module.prefix = pkg.prefix @@ -901,7 +735,6 @@ def setup_package(pkg, dirty, context: Context = Context.BUILD): context == Context.TEST and pkg.test_requires_compiler ) if need_compiler: - set_compiler_environment_variables(pkg, env_mods) set_wrapper_variables(pkg, env_mods) # Platform specific setup goes before package specific setup. This is for setting @@ -913,6 +746,26 @@ def setup_package(pkg, dirty, context: Context = Context.BUILD): env_mods.extend(setup_context.get_env_modifications()) tty.debug("setup_package: collected all modifications from dependencies") + tty.debug("setup_package: adding compiler wrappers paths") + env_by_name = env_mods.group_by_name() + for x in env_by_name["SPACK_COMPILER_WRAPPER_PATH"]: + assert isinstance( + x, PrependPath + ), "unexpected setting used for SPACK_COMPILER_WRAPPER_PATH" + env_mods.prepend_path("PATH", x.value) + + # Check whether we want to force RPATH or RUNPATH + enable_var_name, disable_var_name = "SPACK_ENABLE_NEW_DTAGS", "SPACK_DISABLE_NEW_DTAGS" + if enable_var_name in env_by_name and disable_var_name in env_by_name: + enable_new_dtags = _extract_dtags_arg(env_by_name, var_name=enable_var_name) + disable_new_dtags = _extract_dtags_arg(env_by_name, var_name=disable_var_name) + if spack.config.CONFIG.get("config:shared_linking:type") == "rpath": + env_mods.set("SPACK_DTAGS_TO_STRIP", enable_new_dtags) + env_mods.set("SPACK_DTAGS_TO_ADD", disable_new_dtags) + else: + env_mods.set("SPACK_DTAGS_TO_STRIP", disable_new_dtags) + env_mods.set("SPACK_DTAGS_TO_ADD", enable_new_dtags) + if context == Context.TEST: env_mods.prepend_path("PATH", ".") elif context == Context.BUILD and not dirty and not env_mods.is_unset("CPATH"): @@ -926,11 +779,6 @@ def setup_package(pkg, dirty, context: Context = Context.BUILD): # Load modules on an already clean environment, just before applying Spack's # own environment modifications. This ensures Spack controls CC/CXX/... variables. - if need_compiler: - tty.debug("setup_package: loading compiler modules") - for mod in pkg.compiler.modules: - load_module(mod) - load_external_modules(setup_context) # Make sure nothing's strange about the Spack environment. @@ -942,6 +790,14 @@ def setup_package(pkg, dirty, context: Context = Context.BUILD): return env_base +def _extract_dtags_arg(env_by_name: Dict[str, ModificationList], *, var_name: str) -> str: + try: + enable_new_dtags = env_by_name[var_name][0].value # type: ignore[union-attr] + except (KeyError, IndexError, AttributeError): + enable_new_dtags = "" + return enable_new_dtags + + class EnvironmentVisitor: def __init__(self, *roots: spack.spec.Spec, context: Context): # For the roots (well, marked specs) we follow different edges diff --git a/lib/spack/spack/build_systems/autotools.py b/lib/spack/spack/build_systems/autotools.py index 75b7a2f984d..ebac028d93d 100644 --- a/lib/spack/spack/build_systems/autotools.py +++ b/lib/spack/spack/build_systems/autotools.py @@ -11,6 +11,7 @@ import spack.build_environment import spack.builder +import spack.compilers.libraries import spack.error import spack.package_base import spack.phase_callbacks @@ -398,33 +399,44 @@ def _do_patch_libtool(self) -> None: markers[tag] = "LIBTOOL TAG CONFIG: {0}".format(tag.upper()) # Replace empty linker flag prefixes: - if self.pkg.compiler.name == "nag": + if self.spec.satisfies("%nag"): # Nag is mixed with gcc and g++, which are recognized correctly. # Therefore, we change only Fortran values: + nag_pkg = self.spec["fortran"].package for tag in ["fc", "f77"]: marker = markers[tag] x.filter( regex='^wl=""$', - repl='wl="{0}"'.format(self.pkg.compiler.linker_arg), - start_at="# ### BEGIN {0}".format(marker), - stop_at="# ### END {0}".format(marker), + repl=f'wl="{nag_pkg.linker_arg}"', + start_at=f"# ### BEGIN {marker}", + stop_at=f"# ### END {marker}", ) else: - x.filter(regex='^wl=""$', repl='wl="{0}"'.format(self.pkg.compiler.linker_arg)) + compiler_spec = spack.compilers.libraries.compiler_spec(self.spec) + if compiler_spec: + x.filter(regex='^wl=""$', repl='wl="{0}"'.format(compiler_spec.package.linker_arg)) # Replace empty PIC flag values: - for cc, marker in markers.items(): + for compiler, marker in markers.items(): + if compiler == "cc": + language = "c" + elif compiler == "cxx": + language = "cxx" + else: + language = "fortran" + + if language not in self.spec: + continue + x.filter( regex='^pic_flag=""$', - repl='pic_flag="{0}"'.format( - getattr(self.pkg.compiler, "{0}_pic_flag".format(cc)) - ), - start_at="# ### BEGIN {0}".format(marker), - stop_at="# ### END {0}".format(marker), + repl=f'pic_flag="{self.spec[language].package.pic_flag}"', + start_at=f"# ### BEGIN {marker}", + stop_at=f"# ### END {marker}", ) # Other compiler-specific patches: - if self.pkg.compiler.name == "fj": + if self.spec.satisfies("%fj"): x.filter(regex="-nostdlib", repl="", string=True) rehead = r"/\S*/" for o in [ @@ -437,7 +449,7 @@ def _do_patch_libtool(self) -> None: r"crtendS\.o", ]: x.filter(regex=(rehead + o), repl="") - elif self.pkg.compiler.name == "nag": + elif self.spec.satisfies("%nag"): for tag in ["fc", "f77"]: marker = markers[tag] start_at = "# ### BEGIN {0}".format(marker) diff --git a/lib/spack/spack/build_systems/cached_cmake.py b/lib/spack/spack/build_systems/cached_cmake.py index c9965bbc144..63bc2f36194 100644 --- a/lib/spack/spack/build_systems/cached_cmake.py +++ b/lib/spack/spack/build_systems/cached_cmake.py @@ -70,12 +70,8 @@ class CachedCMakeBuilder(CMakeBuilder): @property def cache_name(self): - return "{0}-{1}-{2}@{3}.cmake".format( - self.pkg.name, - self.pkg.spec.architecture, - self.pkg.spec.compiler.name, - self.pkg.spec.compiler.version, - ) + compiler_str = f"{self.spec['c'].name}-{self.spec['c'].version}" + return f"{self.pkg.name}-{self.spec.architecture.platform}-{compiler_str}.cmake" @property def cache_path(self): @@ -118,7 +114,9 @@ def initconfig_compiler_entries(self): # Fortran compiler is optional if "FC" in os.environ: spack_fc_entry = cmake_cache_path("CMAKE_Fortran_COMPILER", os.environ["FC"]) - system_fc_entry = cmake_cache_path("CMAKE_Fortran_COMPILER", self.pkg.compiler.fc) + system_fc_entry = cmake_cache_path( + "CMAKE_Fortran_COMPILER", self.spec["fortran"].package.fortran + ) else: spack_fc_entry = "# No Fortran compiler defined in spec" system_fc_entry = "# No Fortran compiler defined in spec" @@ -134,8 +132,8 @@ def initconfig_compiler_entries(self): " " + cmake_cache_path("CMAKE_CXX_COMPILER", os.environ["CXX"]), " " + spack_fc_entry, "else()\n", - " " + cmake_cache_path("CMAKE_C_COMPILER", self.pkg.compiler.cc), - " " + cmake_cache_path("CMAKE_CXX_COMPILER", self.pkg.compiler.cxx), + " " + cmake_cache_path("CMAKE_C_COMPILER", self.spec["c"].package.cc), + " " + cmake_cache_path("CMAKE_CXX_COMPILER", self.spec["cxx"].package.cxx), " " + system_fc_entry, "endif()\n", ] diff --git a/lib/spack/spack/build_systems/compiler.py b/lib/spack/spack/build_systems/compiler.py index 0e769c7dde0..783027c8f2f 100644 --- a/lib/spack/spack/build_systems/compiler.py +++ b/lib/spack/spack/build_systems/compiler.py @@ -6,12 +6,13 @@ import pathlib import re import sys -from typing import Dict, List, Sequence, Tuple, Union +from typing import Dict, List, Optional, Sequence, Tuple, Union import llnl.util.tty as tty -from llnl.util.lang import classproperty +from llnl.util.lang import classproperty, memoized -import spack.compiler +import spack +import spack.compilers.error import spack.package_base import spack.util.executable @@ -43,6 +44,9 @@ class CompilerPackage(spack.package_base.PackageBase): #: Static definition of languages supported by this class compiler_languages: Sequence[str] = ["c", "cxx", "fortran"] + #: Relative path to compiler wrappers + compiler_wrapper_link_paths: Dict[str, str] = {} + def __init__(self, spec: "spack.spec.Spec"): super().__init__(spec) msg = f"Supported languages for {spec} are not a subset of possible supported languages" @@ -77,14 +81,14 @@ def executables(cls) -> Sequence[str]: ] @classmethod - def determine_version(cls, exe: Path): + def determine_version(cls, exe: Path) -> str: version_argument = cls.compiler_version_argument if isinstance(version_argument, str): version_argument = (version_argument,) for va in version_argument: try: - output = spack.compiler.get_compiler_version_output(exe, va) + output = compiler_output(exe, version_argument=va) match = re.search(cls.compiler_version_regex, output) if match: return ".".join(match.groups()) @@ -95,10 +99,11 @@ def determine_version(cls, exe: Path): f"[{__file__}] Cannot detect a valid version for the executable " f"{str(exe)}, for package '{cls.name}': {e}" ) + return "" @classmethod def compiler_bindir(cls, prefix: Path) -> Path: - """Overridable method for the location of the compiler bindir within the preifx""" + """Overridable method for the location of the compiler bindir within the prefix""" return os.path.join(prefix, "bin") @classmethod @@ -142,3 +147,109 @@ def determine_compiler_paths(cls, exes: Sequence[Path]) -> Dict[str, Path]: def determine_variants(cls, exes: Sequence[Path], version_str: str) -> Tuple: # path determination is separated so it can be reused in subclasses return "", {"compilers": cls.determine_compiler_paths(exes=exes)} + + #: Returns the argument needed to set the RPATH, or None if it does not exist + rpath_arg: Optional[str] = "-Wl,-rpath," + #: Flag that needs to be used to pass an argument to the linker + linker_arg: str = "-Wl," + #: Flag used to produce Position Independent Code + pic_flag: str = "-fPIC" + #: Flag used to get verbose output + verbose_flags: str = "-v" + #: Flag to activate OpenMP support + openmp_flag: str = "-fopenmp" + + implicit_rpath_libs: List[str] = [] + + def standard_flag(self, *, language: str, standard: str) -> str: + """Returns the flag used to enforce a given standard for a language""" + if language not in self.supported_languages: + raise spack.compilers.error.UnsupportedCompilerFlag( + f"{self.spec} does not provide the '{language}' language" + ) + try: + return self._standard_flag(language=language, standard=standard) + except (KeyError, RuntimeError) as e: + raise spack.compilers.error.UnsupportedCompilerFlag( + f"{self.spec} does not provide the '{language}' standard {standard}" + ) from e + + def _standard_flag(self, *, language: str, standard: str) -> str: + raise NotImplementedError("Must be implemented by derived classes") + + def archspec_name(self) -> str: + """Name that archspec uses to refer to this compiler""" + return self.spec.name + + @property + def cc(self) -> Optional[str]: + assert self.spec.concrete, "cannot retrieve C compiler, spec is not concrete" + if self.spec.external: + return self.spec.extra_attributes["compilers"].get("c", None) + return self._cc_path() + + def _cc_path(self) -> Optional[str]: + """Returns the path to the C compiler, if the package was installed by Spack""" + return None + + @property + def cxx(self) -> Optional[str]: + assert self.spec.concrete, "cannot retrieve C++ compiler, spec is not concrete" + if self.spec.external: + return self.spec.extra_attributes["compilers"].get("cxx", None) + return self._cxx_path() + + def _cxx_path(self) -> Optional[str]: + """Returns the path to the C++ compiler, if the package was installed by Spack""" + return None + + @property + def fortran(self): + assert self.spec.concrete, "cannot retrieve Fortran compiler, spec is not concrete" + if self.spec.external: + return self.spec.extra_attributes["compilers"].get("fortran", None) + return self._fortran_path() + + def _fortran_path(self) -> Optional[str]: + """Returns the path to the Fortran compiler, if the package was installed by Spack""" + return None + + +@memoized +def _compiler_output( + compiler_path: Path, *, version_argument: str, ignore_errors: Tuple[int, ...] = () +) -> str: + """Returns the output from the compiler invoked with the given version argument. + + Args: + compiler_path: path of the compiler to be invoked + version_argument: the argument used to extract version information + """ + compiler = spack.util.executable.Executable(compiler_path) + if not version_argument: + return compiler( + output=str, error=str, ignore_errors=ignore_errors, timeout=120, fail_on_error=True + ) + return compiler( + version_argument, + output=str, + error=str, + ignore_errors=ignore_errors, + timeout=120, + fail_on_error=True, + ) + + +def compiler_output( + compiler_path: Path, *, version_argument: str, ignore_errors: Tuple[int, ...] = () +) -> str: + """Wrapper for _get_compiler_version_output().""" + # This ensures that we memoize compiler output by *absolute path*, + # not just executable name. If we don't do this, and the path changes + # (e.g., during testing), we can get incorrect results. + if not os.path.isabs(compiler_path): + compiler_path = spack.util.executable.which_string(str(compiler_path), required=True) + + return _compiler_output( + compiler_path, version_argument=version_argument, ignore_errors=ignore_errors + ) diff --git a/lib/spack/spack/build_systems/msbuild.py b/lib/spack/spack/build_systems/msbuild.py index f83057c39c4..2081e688a6d 100644 --- a/lib/spack/spack/build_systems/msbuild.py +++ b/lib/spack/spack/build_systems/msbuild.py @@ -76,7 +76,7 @@ def toolchain_version(self): Override this method to select a specific version of the toolchain or change selection heuristics. Default is whatever version of msvc has been selected by concretization""" - return "v" + self.pkg.compiler.platform_toolset_ver + return "v" + self.spec["msvc"].package.platform_toolset_ver @property def std_msbuild_args(self): diff --git a/lib/spack/spack/build_systems/python.py b/lib/spack/spack/build_systems/python.py index 557fca15d4b..eff00b6e8a6 100644 --- a/lib/spack/spack/build_systems/python.py +++ b/lib/spack/spack/build_systems/python.py @@ -278,10 +278,6 @@ def update_external_dependencies(self, extendee_spec=None): if not python.architecture.target: python.architecture.target = archspec.cpu.host().family.name - # Ensure compiler information is present - if not python.compiler: - python.compiler = self.spec.compiler - python.external_path = self.spec.external_path python._mark_concrete() self.spec.add_dependency_edge(python, depflag=dt.BUILD | dt.LINK | dt.RUN, virtuals=()) diff --git a/lib/spack/spack/ci/__init__.py b/lib/spack/spack/ci/__init__.py index 055df22882a..244b3a527f5 100644 --- a/lib/spack/spack/ci/__init__.py +++ b/lib/spack/spack/ci/__init__.py @@ -24,7 +24,6 @@ import spack import spack.binary_distribution as bindist -import spack.concretize import spack.config as cfg import spack.environment as ev import spack.error @@ -421,10 +420,9 @@ def generate_pipeline(env: ev.Environment, args) -> None: args: (spack.main.SpackArgumentParser): Parsed arguments from the command line. """ - with spack.concretize.disable_compiler_existence_check(): - with env.write_transaction(): - env.concretize() - env.write() + with env.write_transaction(): + env.concretize() + env.write() options = collect_pipeline_options(env, args) diff --git a/lib/spack/spack/ci/common.py b/lib/spack/spack/ci/common.py index 43481679c66..68e0d91c17e 100644 --- a/lib/spack/spack/ci/common.py +++ b/lib/spack/spack/ci/common.py @@ -209,10 +209,8 @@ def build_name(self, spec: Optional[spack.spec.Spec] = None) -> Optional[str]: Returns: (str) given spec's CDash build name.""" if spec: - build_name = ( - f"{spec.name}@{spec.version}%{spec.compiler} " - f"hash={spec.dag_hash()} arch={spec.architecture} ({self.build_group})" - ) + spec_str = spec.format("{name}{@version}{%compiler} hash={hash} arch={architecture}") + build_name = f"{spec_str} ({self.build_group})" tty.debug(f"Generated CDash build name ({build_name}) from the {spec.name}") return build_name diff --git a/lib/spack/spack/cmd/__init__.py b/lib/spack/spack/cmd/__init__.py index ff0c55e00d9..0ceee94ea46 100644 --- a/lib/spack/spack/cmd/__init__.py +++ b/lib/spack/spack/cmd/__init__.py @@ -375,8 +375,13 @@ def iter_groups(specs, indent, all_headers): index = index_by(specs, ("architecture", "compiler")) ispace = indent * " " + def _key(item): + if item is None: + return "" + return str(item) + # Traverse the index and print out each package - for i, (architecture, compiler) in enumerate(sorted(index)): + for i, (architecture, compiler) in enumerate(sorted(index, key=_key)): if i > 0: print() @@ -448,7 +453,6 @@ def get_arg(name, default=None): hashes = get_arg("long", False) namespaces = get_arg("namespaces", False) flags = get_arg("show_flags", False) - full_compiler = get_arg("show_full_compiler", False) variants = get_arg("variants", False) groups = get_arg("groups", True) all_headers = get_arg("all_headers", False) @@ -470,10 +474,8 @@ def get_arg(name, default=None): if format_string is None: nfmt = "{fullname}" if namespaces else "{name}" ffmt = "" - if full_compiler or flags: - ffmt += "{compiler_flags} {%compiler.name}" - if full_compiler: - ffmt += "{@compiler.version}" + if flags: + ffmt += " {compiler_flags}" vfmt = "{variants}" if variants else "" format_string = nfmt + "{@version}" + vfmt + ffmt diff --git a/lib/spack/spack/cmd/compiler.py b/lib/spack/spack/cmd/compiler.py index 8b83542f74e..b6e3096db81 100644 --- a/lib/spack/spack/cmd/compiler.py +++ b/lib/spack/spack/cmd/compiler.py @@ -4,13 +4,14 @@ import argparse import sys +import warnings import llnl.util.tty as tty from llnl.util.lang import index_by from llnl.util.tty.colify import colify from llnl.util.tty.color import colorize -import spack.compilers +import spack.compilers.config import spack.config import spack.spec from spack.cmd.common import arguments @@ -33,20 +34,20 @@ def setup_parser(subparser): mixed_toolchain_group.add_argument( "--mixed-toolchain", action="store_true", - default=sys.platform == "darwin", - help="Allow mixed toolchains (for example: clang, clang++, gfortran)", + default=False, + help="(DEPRECATED) Allow mixed toolchains (for example: clang, clang++, gfortran)", ) mixed_toolchain_group.add_argument( "--no-mixed-toolchain", action="store_false", dest="mixed_toolchain", - help="Do not allow mixed toolchains (for example: clang, clang++, gfortran)", + help="(DEPRECATED) Do not allow mixed toolchains (for example: clang, clang++, gfortran)", ) find_parser.add_argument("add_paths", nargs=argparse.REMAINDER) find_parser.add_argument( "--scope", action=arguments.ConfigScope, - default=lambda: spack.config.default_modify_scope("compilers"), + default=lambda: spack.config.default_modify_scope("packages"), help="configuration scope to modify", ) arguments.add_common_arguments(find_parser, ["jobs"]) @@ -79,77 +80,97 @@ def compiler_find(args): """Search either $PATH or a list of paths OR MODULES for compilers and add them to Spack's configuration. """ + if args.mixed_toolchain: + warnings.warn( + "The '--mixed-toolchain' option has been deprecated in Spack v0.23, and currently " + "has no effect. The option will be removed in Spack v1.1" + ) + paths = args.add_paths or None - new_compilers = spack.compilers.find_compilers( - path_hints=paths, - scope=args.scope, - mixed_toolchain=args.mixed_toolchain, - max_workers=args.jobs, + new_compilers = spack.compilers.config.find_compilers( + path_hints=paths, scope=args.scope, max_workers=args.jobs ) if new_compilers: n = len(new_compilers) s = "s" if n > 1 else "" - filename = spack.config.CONFIG.get_config_filename(args.scope, "compilers") + filename = spack.config.CONFIG.get_config_filename(args.scope, "packages") tty.msg(f"Added {n:d} new compiler{s} to {filename}") - compiler_strs = sorted(f"{c.spec.name}@{c.spec.version}" for c in new_compilers) + compiler_strs = sorted(f"{spec.name}@{spec.versions}" for spec in new_compilers) colify(reversed(compiler_strs), indent=4) else: tty.msg("Found no new compilers") tty.msg("Compilers are defined in the following files:") - colify(spack.compilers.compiler_config_files(), indent=4) + colify(spack.compilers.config.compiler_config_files(), indent=4) def compiler_remove(args): - compiler_spec = spack.spec.CompilerSpec(args.compiler_spec) - candidate_compilers = spack.compilers.compilers_for_spec(compiler_spec, scope=args.scope) + remover = spack.compilers.config.CompilerRemover(spack.config.CONFIG) + candidates = remover.mark_compilers(match=args.compiler_spec, scope=args.scope) + if not candidates: + tty.die(f"No compiler matches '{args.compiler_spec}'") - if not candidate_compilers: - tty.die("No compilers match spec %s" % compiler_spec) + compiler_strs = reversed(sorted(f"{spec.name}@{spec.versions}" for spec in candidates)) - if not args.all and len(candidate_compilers) > 1: - tty.error(f"Multiple compilers match spec {compiler_spec}. Choose one:") - colify(reversed(sorted([c.spec.display_str for c in candidate_compilers])), indent=4) - tty.msg("Or, use `spack compiler remove -a` to remove all of them.") + if not args.all and len(candidates) > 1: + tty.error(f"multiple compilers match the spec '{args.compiler_spec}':") + print() + colify(compiler_strs, indent=4) + print() + print( + "Either use a stricter spec to select only one, or use `spack compiler remove -a`" + " to remove all of them." + ) sys.exit(1) - for current_compiler in candidate_compilers: - spack.compilers.remove_compiler_from_config(current_compiler.spec, scope=args.scope) - tty.msg(f"{current_compiler.spec.display_str} has been removed") + remover.flush() + tty.msg("The following compilers have been removed:") + print() + colify(compiler_strs, indent=4) + print() def compiler_info(args): """Print info about all compilers matching a spec.""" - cspec = spack.spec.CompilerSpec(args.compiler_spec) - compilers = spack.compilers.compilers_for_spec(cspec, scope=args.scope) + query = spack.spec.Spec(args.compiler_spec) + all_compilers = spack.compilers.config.all_compilers(scope=args.scope, init_config=False) + + compilers = [x for x in all_compilers if x.satisfies(query)] if not compilers: - tty.die("No compilers match spec %s" % cspec) + tty.die(f"No compilers match spec {query.cformat()}") else: for c in compilers: - print(c.spec.display_str + ":") - print("\tpaths:") - for cpath in ["cc", "cxx", "f77", "fc"]: - print("\t\t%s = %s" % (cpath, getattr(c, cpath, None))) - if c.flags: - print("\tflags:") - for flag, flag_value in c.flags.items(): - print("\t\t%s = %s" % (flag, flag_value)) - if len(c.environment) != 0: - if len(c.environment.get("set", {})) != 0: + print(f"{c.cformat()}:") + print(f" prefix: {c.external_path}") + extra_attributes = getattr(c, "extra_attributes", {}) + if "compilers" in extra_attributes: + print(" compilers:") + for language, exe in extra_attributes.get("compilers", {}).items(): + print(f" {language}: {exe}") + if "flags" in extra_attributes: + print(" flags:") + for flag, flag_value in extra_attributes["flags"].items(): + print(f" {flag} = {flag_value}") + if "environment" in extra_attributes: + environment = extra_attributes["environment"] + if len(environment.get("set", {})) != 0: print("\tenvironment:") print("\t set:") - for key, value in c.environment["set"].items(): - print("\t %s = %s" % (key, value)) - if c.extra_rpaths: - print("\tExtra rpaths:") - for extra_rpath in c.extra_rpaths: - print("\t\t%s" % extra_rpath) - print("\tmodules = %s" % c.modules) - print("\toperating system = %s" % c.operating_system) + for key, value in environment["set"].items(): + print(f"\t {key} = {value}") + if "extra_rpaths" in extra_attributes: + print(" extra rpaths:") + for extra_rpath in extra_attributes["extra_rpaths"]: + print(f" {extra_rpath}") + if getattr(c, "external_modules", []): + print(" modules: ") + for module in c.external_modules: + print(f" {module}") + print() def compiler_list(args): - compilers = spack.compilers.all_compilers(scope=args.scope, init_config=False) + compilers = spack.compilers.config.all_compilers(scope=args.scope, init_config=False) # If there are no compilers in any scope, and we're outputting to a tty, give a # hint to the user. @@ -162,7 +183,7 @@ def compiler_list(args): tty.msg(msg) return - index = index_by(compilers, lambda c: (c.spec.name, c.operating_system, c.target)) + index = index_by(compilers, spack.compilers.config.name_os_target) tty.msg("Available compilers") @@ -181,10 +202,10 @@ def compiler_list(args): name, os, target = key os_str = os if target: - os_str += "-%s" % target - cname = "%s{%s} %s" % (spack.spec.COMPILER_COLOR, name, os_str) + os_str += f"-{target}" + cname = f"{spack.spec.COMPILER_COLOR}{{{name}}} {os_str}" tty.hline(colorize(cname), char="-") - colify(reversed(sorted(c.spec.display_str for c in compilers))) + colify(reversed(sorted(c.format("{name}@{version}") for c in compilers))) def compiler(parser, args): diff --git a/lib/spack/spack/cmd/config.py b/lib/spack/spack/cmd/config.py index a3ba9b6a9dc..d13e5bafb68 100644 --- a/lib/spack/spack/cmd/config.py +++ b/lib/spack/spack/cmd/config.py @@ -521,8 +521,6 @@ def config_prefer_upstream(args): for spec in pref_specs: # Collect all the upstream compilers and versions for this package. pkg = pkgs.get(spec.name, {"version": []}) - all = pkgs.get("all", {"compiler": []}) - pkgs["all"] = all pkgs[spec.name] = pkg # We have no existing variant if this is our first added version. @@ -532,10 +530,6 @@ def config_prefer_upstream(args): if version not in pkg["version"]: pkg["version"].append(version) - compiler = str(spec.compiler) - if compiler not in all["compiler"]: - all["compiler"].append(compiler) - # Get and list all the variants that differ from the default. variants = [] for var_name, variant in spec.variants.items(): diff --git a/lib/spack/spack/cmd/find.py b/lib/spack/spack/cmd/find.py index 207d472de3a..e17b6c5fe60 100644 --- a/lib/spack/spack/cmd/find.py +++ b/lib/spack/spack/cmd/find.py @@ -98,7 +98,7 @@ def setup_parser(subparser): "--show-full-compiler", action="store_true", dest="show_full_compiler", - help="show full compiler specs", + help="(DEPRECATED) show full compiler specs. Currently it's a no-op", ) implicit_explicit = subparser.add_mutually_exclusive_group() implicit_explicit.add_argument( @@ -278,7 +278,6 @@ def root_decorator(spec, string): # these enforce details in the root specs to show what the user asked for namespaces=True, show_flags=True, - show_full_compiler=True, decorator=root_decorator, variants=True, ) @@ -301,7 +300,6 @@ def root_decorator(spec, string): decorator=lambda s, f: color.colorize("@*{%s}" % f), namespace=True, show_flags=True, - show_full_compiler=True, variants=True, ) print() diff --git a/lib/spack/spack/cmd/license.py b/lib/spack/spack/cmd/license.py index 11bde5b189c..9e86ea3c88e 100644 --- a/lib/spack/spack/cmd/license.py +++ b/lib/spack/spack/cmd/license.py @@ -38,7 +38,6 @@ r"^lib/spack/spack/.*\.sh$", r"^lib/spack/spack/.*\.lp$", r"^lib/spack/llnl/.*\.py$", - r"^lib/spack/env/cc$", # special case some test data files that have license headers r"^lib/spack/spack/test/data/style/broken.dummy", r"^lib/spack/spack/test/data/unparse/.*\.txt", diff --git a/lib/spack/spack/cmd/mirror.py b/lib/spack/spack/cmd/mirror.py index b13a9ee8b52..512931e11b4 100644 --- a/lib/spack/spack/cmd/mirror.py +++ b/lib/spack/spack/cmd/mirror.py @@ -515,16 +515,15 @@ def extend_with_dependencies(specs): def concrete_specs_from_cli_or_file(args): tty.msg("Concretizing input specs") - with spack.concretize.disable_compiler_existence_check(): - if args.specs: - specs = spack.cmd.parse_specs(args.specs, concretize=True) - if not specs: - raise SpackError("unable to parse specs from command line") + if args.specs: + specs = spack.cmd.parse_specs(args.specs, concretize=True) + if not specs: + raise SpackError("unable to parse specs from command line") - if args.file: - specs = specs_from_text_file(args.file, concretize=True) - if not specs: - raise SpackError("unable to parse specs from file '{}'".format(args.file)) + if args.file: + specs = specs_from_text_file(args.file, concretize=True) + if not specs: + raise SpackError("unable to parse specs from file '{}'".format(args.file)) return specs diff --git a/lib/spack/spack/cmd/reindex.py b/lib/spack/spack/cmd/reindex.py index 6501f3b4cfd..5ebda07cef8 100644 --- a/lib/spack/spack/cmd/reindex.py +++ b/lib/spack/spack/cmd/reindex.py @@ -1,7 +1,12 @@ # Copyright Spack Project Developers. See COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) +import os +import shutil +from llnl.util import tty + +import spack.database import spack.store description = "rebuild Spack's package database" @@ -10,4 +15,11 @@ def reindex(parser, args): + current_index = spack.store.STORE.db._index_path + if os.path.isfile(current_index): + backup = f"{current_index}.bkp" + shutil.copy(current_index, backup) + tty.msg(f"Created a back-up copy of the DB at {backup}") + spack.store.STORE.reindex() + tty.msg(f"The DB at {current_index} has been reindex to v{spack.database._DB_VERSION}") diff --git a/lib/spack/spack/compiler.py b/lib/spack/spack/compiler.py deleted file mode 100644 index af04f3b5e55..00000000000 --- a/lib/spack/spack/compiler.py +++ /dev/null @@ -1,856 +0,0 @@ -# Copyright Spack Project Developers. See COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -import contextlib -import hashlib -import itertools -import json -import os -import platform -import re -import shutil -import sys -import tempfile -from typing import Dict, List, Optional, Sequence - -import llnl.path -import llnl.util.lang -import llnl.util.tty as tty -from llnl.util.filesystem import path_contains_subdirectory, paths_containing_libs - -import spack.caches -import spack.error -import spack.schema.environment -import spack.spec -import spack.util.executable -import spack.util.libc -import spack.util.module_cmd -import spack.version -from spack.util.environment import filter_system_paths -from spack.util.file_cache import FileCache - -__all__ = ["Compiler"] - -PATH_INSTANCE_VARS = ["cc", "cxx", "f77", "fc"] -FLAG_INSTANCE_VARS = ["cflags", "cppflags", "cxxflags", "fflags"] - - -@llnl.util.lang.memoized -def _get_compiler_version_output(compiler_path, version_arg, ignore_errors=()) -> str: - """Invokes the compiler at a given path passing a single - version argument and returns the output. - - Args: - compiler_path (path): path of the compiler to be invoked - version_arg (str): the argument used to extract version information - """ - compiler = spack.util.executable.Executable(compiler_path) - compiler_invocation_args = { - "output": str, - "error": str, - "ignore_errors": ignore_errors, - "timeout": 120, - "fail_on_error": True, - } - if version_arg: - output = compiler(version_arg, **compiler_invocation_args) - else: - output = compiler(**compiler_invocation_args) - return output - - -def get_compiler_version_output(compiler_path, *args, **kwargs) -> str: - """Wrapper for _get_compiler_version_output().""" - # This ensures that we memoize compiler output by *absolute path*, - # not just executable name. If we don't do this, and the path changes - # (e.g., during testing), we can get incorrect results. - if not os.path.isabs(compiler_path): - compiler_path = spack.util.executable.which_string(compiler_path, required=True) - - return _get_compiler_version_output(compiler_path, *args, **kwargs) - - -def tokenize_flags(flags_values, propagate=False): - """Given a compiler flag specification as a string, this returns a list - where the entries are the flags. For compiler options which set values - using the syntax "-flag value", this function groups flags and their - values together. Any token not preceded by a "-" is considered the - value of a prior flag.""" - tokens = flags_values.split() - if not tokens: - return [] - flag = tokens[0] - flags_with_propagation = [] - for token in tokens[1:]: - if not token.startswith("-"): - flag += " " + token - else: - flags_with_propagation.append((flag, propagate)) - flag = token - flags_with_propagation.append((flag, propagate)) - return flags_with_propagation - - -#: regex for parsing linker lines -_LINKER_LINE = re.compile(r"^( *|.*[/\\])" r"(link|ld|([^/\\]+-)?ld|collect2)" r"[^/\\]*( |$)") - -#: components of linker lines to ignore -_LINKER_LINE_IGNORE = re.compile(r"(collect2 version|^[A-Za-z0-9_]+=|/ldfe )") - -#: regex to match linker search paths -_LINK_DIR_ARG = re.compile(r"^-L(.:)?(?P[/\\].*)") - -#: regex to match linker library path arguments -_LIBPATH_ARG = re.compile(r"^[-/](LIBPATH|libpath):(?P.*)") - - -def _parse_link_paths(string): - """Parse implicit link paths from compiler debug output. - - This gives the compiler runtime library paths that we need to add to - the RPATH of generated binaries and libraries. It allows us to - ensure, e.g., that codes load the right libstdc++ for their compiler. - """ - lib_search_paths = False - raw_link_dirs = [] - for line in string.splitlines(): - if lib_search_paths: - if line.startswith("\t"): - raw_link_dirs.append(line[1:]) - continue - else: - lib_search_paths = False - elif line.startswith("Library search paths:"): - lib_search_paths = True - - if not _LINKER_LINE.match(line): - continue - if _LINKER_LINE_IGNORE.match(line): - continue - tty.debug(f"implicit link dirs: link line: {line}") - - next_arg = False - for arg in line.split(): - if arg in ("-L", "-Y"): - next_arg = True - continue - - if next_arg: - raw_link_dirs.append(arg) - next_arg = False - continue - - link_dir_arg = _LINK_DIR_ARG.match(arg) - if link_dir_arg: - link_dir = link_dir_arg.group("dir") - raw_link_dirs.append(link_dir) - - link_dir_arg = _LIBPATH_ARG.match(arg) - if link_dir_arg: - link_dir = link_dir_arg.group("dir") - raw_link_dirs.append(link_dir) - - implicit_link_dirs = list() - visited = set() - for link_dir in raw_link_dirs: - normalized_path = os.path.abspath(link_dir) - if normalized_path not in visited: - implicit_link_dirs.append(normalized_path) - visited.add(normalized_path) - - tty.debug(f"implicit link dirs: result: {', '.join(implicit_link_dirs)}") - return implicit_link_dirs - - -@llnl.path.system_path_filter -def _parse_non_system_link_dirs(string: str) -> List[str]: - """Parses link paths out of compiler debug output. - - Args: - string: compiler debug output as a string - - Returns: - Implicit link paths parsed from the compiler output - """ - link_dirs = _parse_link_paths(string) - - # Remove directories that do not exist. Some versions of the Cray compiler - # report nonexistent directories - link_dirs = [d for d in link_dirs if os.path.isdir(d)] - - # Return set of directories containing needed compiler libs, minus - # system paths. Note that 'filter_system_paths' only checks for an - # exact match, while 'in_system_subdirectory' checks if a path contains - # a system directory as a subdirectory - link_dirs = filter_system_paths(link_dirs) - return list(p for p in link_dirs if not in_system_subdirectory(p)) - - -def in_system_subdirectory(path): - system_dirs = [ - "/lib/", - "/lib64/", - "/usr/lib/", - "/usr/lib64/", - "/usr/local/lib/", - "/usr/local/lib64/", - ] - return any(path_contains_subdirectory(path, x) for x in system_dirs) - - -class Compiler: - """This class encapsulates a Spack "compiler", which includes C, - C++, and Fortran compilers. Subclasses should implement - support for specific compilers, their possible names, arguments, - and how to identify the particular type of compiler.""" - - # Optional prefix regexes for searching for this type of compiler. - # Prefixes are sometimes used for toolchains - prefixes: List[str] = [] - - # Optional suffix regexes for searching for this type of compiler. - # Suffixes are used by some frameworks, e.g. macports uses an '-mp-X.Y' - # version suffix for gcc. - suffixes = [r"-.*"] - - #: Compiler argument that produces version information - version_argument = "-dumpversion" - - #: Return values to ignore when invoking the compiler to get its version - ignore_version_errors: Sequence[int] = () - - #: Regex used to extract version from compiler's output - version_regex = "(.*)" - - # These libraries are anticipated to be required by all executables built - # by any compiler - _all_compiler_rpath_libraries = ["libc", "libc++", "libstdc++"] - - #: Platform matcher for Platform objects supported by compiler - is_supported_on_platform = lambda x: True - - # Default flags used by a compiler to set an rpath - @property - def cc_rpath_arg(self): - return "-Wl,-rpath," - - @property - def cxx_rpath_arg(self): - return "-Wl,-rpath," - - @property - def f77_rpath_arg(self): - return "-Wl,-rpath," - - @property - def fc_rpath_arg(self): - return "-Wl,-rpath," - - @property - def linker_arg(self): - """Flag that need to be used to pass an argument to the linker.""" - return "-Wl," - - @property - def disable_new_dtags(self): - if platform.system() == "Darwin": - return "" - return "--disable-new-dtags" - - @property - def enable_new_dtags(self): - if platform.system() == "Darwin": - return "" - return "--enable-new-dtags" - - @property - def debug_flags(self): - return ["-g"] - - @property - def opt_flags(self): - return ["-O", "-O0", "-O1", "-O2", "-O3"] - - def __init__( - self, - cspec, - operating_system, - target, - paths, - modules: Optional[List[str]] = None, - alias=None, - environment=None, - extra_rpaths=None, - enable_implicit_rpaths=None, - **kwargs, - ): - self.spec = cspec - self.operating_system = str(operating_system) - self.target = target - self.modules = modules or [] - self.alias = alias - self.environment = environment or {} - self.extra_rpaths = extra_rpaths or [] - self.enable_implicit_rpaths = enable_implicit_rpaths - self.cache = COMPILER_CACHE - - self.cc = paths[0] - self.cxx = paths[1] - self.f77 = None - self.fc = None - if len(paths) > 2: - self.f77 = paths[2] - if len(paths) == 3: - self.fc = self.f77 - else: - self.fc = paths[3] - - # Unfortunately have to make sure these params are accepted - # in the same order they are returned by sorted(flags) - # in compilers/__init__.py - self.flags = spack.spec.FlagMap(self.spec) - for flag in self.flags.valid_compiler_flags(): - value = kwargs.get(flag, None) - if value is not None: - values_with_propagation = tokenize_flags(value, False) - for value, propagation in values_with_propagation: - self.flags.add_flag(flag, value, propagation) - - # caching value for compiler reported version - # used for version checks for API, e.g. C++11 flag - self._real_version = None - - def __eq__(self, other): - return ( - self.cc == other.cc - and self.cxx == other.cxx - and self.fc == other.fc - and self.f77 == other.f77 - and self.spec == other.spec - and self.operating_system == other.operating_system - and self.target == other.target - and self.flags == other.flags - and self.modules == other.modules - and self.environment == other.environment - and self.extra_rpaths == other.extra_rpaths - and self.enable_implicit_rpaths == other.enable_implicit_rpaths - ) - - def __hash__(self): - return hash( - ( - self.cc, - self.cxx, - self.fc, - self.f77, - self.spec, - self.operating_system, - self.target, - str(self.flags), - str(self.modules), - str(self.environment), - str(self.extra_rpaths), - self.enable_implicit_rpaths, - ) - ) - - def verify_executables(self): - """Raise an error if any of the compiler executables is not valid. - - This method confirms that for all of the compilers (cc, cxx, f77, fc) - that have paths, those paths exist and are executable by the current - user. - Raises a CompilerAccessError if any of the non-null paths for the - compiler are not accessible. - """ - - def accessible_exe(exe): - # compilers may contain executable names (on Cray or user edited) - if not os.path.isabs(exe): - exe = spack.util.executable.which_string(exe) - if not exe: - return False - return os.path.isfile(exe) and os.access(exe, os.X_OK) - - # setup environment before verifying in case we have executable names - # instead of absolute paths - with self.compiler_environment(): - missing = [ - cmp - for cmp in (self.cc, self.cxx, self.f77, self.fc) - if cmp and not accessible_exe(cmp) - ] - if missing: - raise CompilerAccessError(self, missing) - - @property - def version(self): - return self.spec.version - - @property - def real_version(self): - """Executable reported compiler version used for API-determinations - - E.g. C++11 flag checks. - """ - real_version_str = self.cache.get(self).real_version - if not real_version_str or real_version_str == "unknown": - return self.version - - return spack.version.StandardVersion.from_string(real_version_str) - - def implicit_rpaths(self) -> List[str]: - if self.enable_implicit_rpaths is False: - return [] - - output = self.compiler_verbose_output - - if not output: - return [] - - link_dirs = _parse_non_system_link_dirs(output) - - all_required_libs = list(self.required_libs) + Compiler._all_compiler_rpath_libraries - return list(paths_containing_libs(link_dirs, all_required_libs)) - - @property - 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 - - 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""" - # technically this should be testing the target platform of the compiler, but we don't have - # that, so stick to host platform for now. - if sys.platform in ("darwin", "win32"): - return None - - dynamic_linker = self.default_dynamic_linker - - if not dynamic_linker: - return None - - return spack.util.libc.libc_from_dynamic_linker(dynamic_linker) - - @property - def required_libs(self): - """For executables created with this compiler, the compiler libraries - that would be generally required to run it. - """ - # By default every compiler returns the empty list - return [] - - @property - def compiler_verbose_output(self) -> Optional[str]: - """Verbose output from compiling a dummy C source file. Output is cached.""" - return self.cache.get(self).c_compiler_output - - def _compile_dummy_c_source(self) -> Optional[str]: - if self.cc: - cc = self.cc - ext = "c" - else: - cc = self.cxx - ext = "cc" - - if not cc or not self.verbose_flag: - return None - - try: - tmpdir = tempfile.mkdtemp(prefix="spack-implicit-link-info") - fout = os.path.join(tmpdir, "output") - fin = os.path.join(tmpdir, f"main.{ext}") - - with open(fin, "w", encoding="utf-8") as csource: - csource.write( - "int main(int argc, char* argv[]) { (void)argc; (void)argv; return 0; }\n" - ) - cc_exe = spack.util.executable.Executable(cc) - for flag_type in ["cflags" if cc == self.cc else "cxxflags", "cppflags", "ldflags"]: - cc_exe.add_default_arg(*self.flags.get(flag_type, [])) - - with self.compiler_environment(): - return cc_exe(self.verbose_flag, fin, "-o", fout, output=str, error=str) - except spack.util.executable.ProcessError as pe: - tty.debug("ProcessError: Command exited with non-zero status: " + pe.long_message) - return None - finally: - shutil.rmtree(tmpdir, ignore_errors=True) - - @property - def verbose_flag(self) -> Optional[str]: - """ - This property should be overridden in the compiler subclass if a - verbose flag is available. - - If it is not overridden, it is assumed to not be supported. - """ - - # This property should be overridden in the compiler subclass if - # OpenMP is supported by that compiler - @property - def openmp_flag(self): - # If it is not overridden, assume it is not supported and warn the user - raise UnsupportedCompilerFlag(self, "OpenMP", "openmp_flag") - - # This property should be overridden in the compiler subclass if - # C++98 is not the default standard for that compiler - @property - def cxx98_flag(self): - return "" - - # This property should be overridden in the compiler subclass if - # C++11 is supported by that compiler - @property - def cxx11_flag(self): - # If it is not overridden, assume it is not supported and warn the user - raise UnsupportedCompilerFlag(self, "the C++11 standard", "cxx11_flag") - - # This property should be overridden in the compiler subclass if - # C++14 is supported by that compiler - @property - def cxx14_flag(self): - # If it is not overridden, assume it is not supported and warn the user - raise UnsupportedCompilerFlag(self, "the C++14 standard", "cxx14_flag") - - # This property should be overridden in the compiler subclass if - # C++17 is supported by that compiler - @property - def cxx17_flag(self): - # If it is not overridden, assume it is not supported and warn the user - raise UnsupportedCompilerFlag(self, "the C++17 standard", "cxx17_flag") - - # This property should be overridden in the compiler subclass if - # C99 is supported by that compiler - @property - def c99_flag(self): - # If it is not overridden, assume it is not supported and warn the user - raise UnsupportedCompilerFlag(self, "the C99 standard", "c99_flag") - - # This property should be overridden in the compiler subclass if - # C11 is supported by that compiler - @property - def c11_flag(self): - # If it is not overridden, assume it is not supported and warn the user - raise UnsupportedCompilerFlag(self, "the C11 standard", "c11_flag") - - @property - def cc_pic_flag(self): - """Returns the flag used by the C compiler to produce - Position Independent Code (PIC).""" - return "-fPIC" - - @property - def cxx_pic_flag(self): - """Returns the flag used by the C++ compiler to produce - Position Independent Code (PIC).""" - return "-fPIC" - - @property - def f77_pic_flag(self): - """Returns the flag used by the F77 compiler to produce - Position Independent Code (PIC).""" - return "-fPIC" - - @property - def fc_pic_flag(self): - """Returns the flag used by the FC compiler to produce - Position Independent Code (PIC).""" - return "-fPIC" - - # Note: This is not a class method. The class methods are used to detect - # compilers on PATH based systems, and do not set up the run environment of - # the compiler. This method can be called on `module` based systems as well - def get_real_version(self) -> str: - """Query the compiler for its version. - - This is the "real" compiler version, regardless of what is in the - compilers.yaml file, which the user can change to name their compiler. - - Use the runtime environment of the compiler (modules and environment - modifications) to enable the compiler to run properly on any platform. - """ - cc = spack.util.executable.Executable(self.cc) - try: - with self.compiler_environment(): - output = cc( - self.version_argument, - output=str, - error=str, - ignore_errors=tuple(self.ignore_version_errors), - ) - return self.extract_version_from_output(output) - except spack.util.executable.ProcessError: - return "unknown" - - @property - def prefix(self): - """Query the compiler for its install prefix. This is the install - path as reported by the compiler. Note that paths for cc, cxx, etc - are not enough to find the install prefix of the compiler, since - the can be symlinks, wrappers, or filenames instead of absolute paths.""" - raise NotImplementedError("prefix is not implemented for this compiler") - - # - # Compiler classes have methods for querying the version of - # specific compiler executables. This is used when discovering compilers. - # - # Compiler *instances* are just data objects, and can only be - # constructed from an actual set of executables. - # - @classmethod - def default_version(cls, cc): - """Override just this to override all compiler version functions.""" - output = get_compiler_version_output( - cc, cls.version_argument, tuple(cls.ignore_version_errors) - ) - return cls.extract_version_from_output(output) - - @classmethod - @llnl.util.lang.memoized - def extract_version_from_output(cls, output: str) -> str: - """Extracts the version from compiler's output.""" - match = re.search(cls.version_regex, output) - return match.group(1) if match else "unknown" - - @classmethod - def cc_version(cls, cc): - return cls.default_version(cc) - - @classmethod - def search_regexps(cls, language): - # Compile all the regular expressions used for files beforehand. - # This searches for any combination of - # defined for the compiler - compiler_names = getattr(cls, "{0}_names".format(language)) - prefixes = [""] + cls.prefixes - suffixes = [""] - if sys.platform == "win32": - ext = r"\.(?:exe|bat)" - cls_suf = [suf + ext for suf in cls.suffixes] - ext_suf = [ext] - suffixes = suffixes + cls.suffixes + cls_suf + ext_suf - else: - suffixes = suffixes + cls.suffixes - regexp_fmt = r"^({0}){1}({2})$" - return [ - re.compile(regexp_fmt.format(prefix, re.escape(name), suffix)) - for prefix, name, suffix in itertools.product(prefixes, compiler_names, suffixes) - ] - - def setup_custom_environment(self, pkg, env): - """Set any environment variables necessary to use the compiler.""" - pass - - def __repr__(self): - """Return a string representation of the compiler toolchain.""" - return self.__str__() - - def __str__(self): - """Return a string representation of the compiler toolchain.""" - return "%s(%s)" % ( - self.name, - "\n ".join( - ( - str(s) - for s in ( - self.cc, - self.cxx, - self.f77, - self.fc, - self.modules, - str(self.operating_system), - ) - ) - ), - ) - - @contextlib.contextmanager - def compiler_environment(self): - # Avoid modifying os.environ if possible. - if not self.modules and not self.environment: - yield - return - - # store environment to replace later - backup_env = os.environ.copy() - - try: - # load modules and set env variables - for module in self.modules: - spack.util.module_cmd.load_module(module) - - # apply other compiler environment changes - spack.schema.environment.parse(self.environment).apply_modifications() - - yield - finally: - # Restore environment regardless of whether inner code succeeded - os.environ.clear() - os.environ.update(backup_env) - - def to_dict(self): - flags_dict = {fname: " ".join(fvals) for fname, fvals in self.flags.items()} - flags_dict.update( - {attr: getattr(self, attr, None) for attr in FLAG_INSTANCE_VARS if hasattr(self, attr)} - ) - result = { - "spec": str(self.spec), - "paths": {attr: getattr(self, attr, None) for attr in PATH_INSTANCE_VARS}, - "flags": flags_dict, - "operating_system": str(self.operating_system), - "target": str(self.target), - "modules": self.modules or [], - "environment": self.environment or {}, - "extra_rpaths": self.extra_rpaths or [], - } - - if self.enable_implicit_rpaths is not None: - result["implicit_rpaths"] = self.enable_implicit_rpaths - - if self.alias: - result["alias"] = self.alias - - return result - - -class CompilerAccessError(spack.error.SpackError): - def __init__(self, compiler, paths): - msg = "Compiler '%s' has executables that are missing" % compiler.spec - msg += " or are not executable: %s" % paths - super().__init__(msg) - - -class InvalidCompilerError(spack.error.SpackError): - def __init__(self): - super().__init__("Compiler has no executables.") - - -class UnsupportedCompilerFlag(spack.error.SpackError): - def __init__(self, compiler, feature, flag_name, ver_string=None): - super().__init__( - "{0} ({1}) does not support {2} (as compiler.{3}).".format( - compiler.name, ver_string if ver_string else compiler.version, feature, flag_name - ), - "If you think it should, please edit the compiler.{0} subclass to".format( - compiler.name - ) - + " implement the {0} property and submit a pull request or issue.".format(flag_name), - ) - - -class CompilerCacheEntry: - """Deserialized cache entry for a compiler""" - - __slots__ = ("c_compiler_output", "real_version") - - def __init__(self, c_compiler_output: Optional[str], real_version: str): - self.c_compiler_output = c_compiler_output - self.real_version = real_version - - @property - def empty(self) -> bool: - """Sometimes the compiler is temporarily broken, preventing us from getting output. The - call site determines if that is a problem.""" - return self.c_compiler_output is None - - @classmethod - def from_dict(cls, data: Dict[str, Optional[str]]): - if not isinstance(data, dict): - raise ValueError(f"Invalid {cls.__name__} data") - c_compiler_output = data.get("c_compiler_output") - real_version = data.get("real_version") - if not isinstance(real_version, str) or not isinstance( - c_compiler_output, (str, type(None)) - ): - raise ValueError(f"Invalid {cls.__name__} data") - return cls(c_compiler_output, real_version) - - -class CompilerCache: - """Base class for compiler output cache. Default implementation does not cache anything.""" - - def value(self, compiler: Compiler) -> Dict[str, Optional[str]]: - return { - "c_compiler_output": compiler._compile_dummy_c_source(), - "real_version": compiler.get_real_version(), - } - - def get(self, compiler: Compiler) -> CompilerCacheEntry: - return CompilerCacheEntry.from_dict(self.value(compiler)) - - -class FileCompilerCache(CompilerCache): - """Cache for compiler output, which is used to determine implicit link paths, the default libc - version, and the compiler version.""" - - name = os.path.join("compilers", "compilers.json") - - def __init__(self, cache: "FileCache") -> None: - self.cache = cache - self.cache.init_entry(self.name) - self._data: Dict[str, Dict[str, Optional[str]]] = {} - - def _get_entry(self, key: str, *, allow_empty: bool) -> Optional[CompilerCacheEntry]: - try: - entry = CompilerCacheEntry.from_dict(self._data[key]) - return entry if allow_empty or not entry.empty else None - except ValueError: - del self._data[key] - except KeyError: - pass - return None - - def get(self, compiler: Compiler) -> CompilerCacheEntry: - # Cache hit - try: - with self.cache.read_transaction(self.name) as f: - assert f is not None - self._data = json.loads(f.read()) - assert isinstance(self._data, dict) - except (json.JSONDecodeError, AssertionError): - self._data = {} - - key = self._key(compiler) - value = self._get_entry(key, allow_empty=False) - if value is not None: - return value - - # Cache miss - with self.cache.write_transaction(self.name) as (old, new): - try: - assert old is not None - self._data = json.loads(old.read()) - assert isinstance(self._data, dict) - except (json.JSONDecodeError, AssertionError): - self._data = {} - - # Use cache entry that may have been created by another process in the meantime. - entry = self._get_entry(key, allow_empty=True) - - # Finally compute the cache entry - if entry is None: - self._data[key] = self.value(compiler) - entry = CompilerCacheEntry.from_dict(self._data[key]) - - new.write(json.dumps(self._data, separators=(",", ":"))) - - return entry - - def _key(self, compiler: Compiler) -> str: - as_bytes = json.dumps(compiler.to_dict(), separators=(",", ":")).encode("utf-8") - return hashlib.sha256(as_bytes).hexdigest() - - -def _make_compiler_cache(): - return FileCompilerCache(spack.caches.MISC_CACHE) - - -COMPILER_CACHE: CompilerCache = llnl.util.lang.Singleton(_make_compiler_cache) # type: ignore diff --git a/lib/spack/spack/compilers/__init__.py b/lib/spack/spack/compilers/__init__.py index 4ca2aa3bb08..c4ecc87fb8a 100644 --- a/lib/spack/spack/compilers/__init__.py +++ b/lib/spack/spack/compilers/__init__.py @@ -1,836 +1,3 @@ # Copyright Spack Project Developers. See COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) - -"""This module contains functions related to finding compilers on the -system and configuring Spack to use multiple compilers. -""" -import importlib -import os -import re -import sys -import warnings -from typing import Dict, List, Optional - -import archspec.cpu - -import llnl.util.filesystem as fs -import llnl.util.lang -import llnl.util.tty as tty - -import spack.compiler -import spack.config -import spack.error -import spack.paths -import spack.platforms -import spack.repo -import spack.spec -from spack.operating_systems import windows_os -from spack.util.environment import get_path -from spack.util.naming import mod_to_class - -_other_instance_vars = [ - "modules", - "operating_system", - "environment", - "implicit_rpaths", - "extra_rpaths", -] - -# TODO: Caches at module level make it difficult to mock configurations in -# TODO: unit tests. It might be worth reworking their implementation. -#: cache of compilers constructed from config data, keyed by config entry id. -_compiler_cache: Dict[str, "spack.compiler.Compiler"] = {} - -_compiler_to_pkg = { - "clang": "llvm+clang", - "oneapi": "intel-oneapi-compilers", - "rocmcc": "llvm-amdgpu", - "intel@2020:": "intel-oneapi-compilers-classic", - "arm": "acfl", -} - -# TODO: generating this from the previous dict causes docs errors -package_name_to_compiler_name = { - "llvm": "clang", - "intel-oneapi-compilers": "oneapi", - "llvm-amdgpu": "rocmcc", - "intel-oneapi-compilers-classic": "intel", - "acfl": "arm", -} - - -#: Tag used to identify packages providing a compiler -COMPILER_TAG = "compiler" - - -def pkg_spec_for_compiler(cspec): - """Return the spec of the package that provides the compiler.""" - for spec, package in _compiler_to_pkg.items(): - if cspec.satisfies(spec): - spec_str = "%s@%s" % (package, cspec.versions) - break - else: - spec_str = str(cspec) - return spack.spec.parse_with_version_concrete(spec_str) - - -def _auto_compiler_spec(function): - def converter(cspec_like, *args, **kwargs): - if not isinstance(cspec_like, spack.spec.CompilerSpec): - cspec_like = spack.spec.CompilerSpec(cspec_like) - return function(cspec_like, *args, **kwargs) - - return converter - - -def _to_dict(compiler): - """Return a dict version of compiler suitable to insert in YAML.""" - return {"compiler": compiler.to_dict()} - - -def get_compiler_config( - configuration: "spack.config.Configuration", - *, - scope: Optional[str] = None, - init_config: bool = False, -) -> List[Dict]: - """Return the compiler configuration for the specified architecture.""" - config = configuration.get("compilers", scope=scope) or [] - if config or not init_config: - return config - - merged_config = configuration.get("compilers") - if merged_config: - # Config is empty for this scope - # Do not init config because there is a non-empty scope - return config - - find_compilers(scope=scope) - config = configuration.get("compilers", scope=scope) - return config - - -def get_compiler_config_from_packages( - configuration: "spack.config.Configuration", *, scope: Optional[str] = None -) -> List[Dict]: - """Return the compiler configuration from packages.yaml""" - packages_yaml = configuration.get("packages", scope=scope) - return CompilerConfigFactory.from_packages_yaml(packages_yaml) - - -def compiler_config_files(): - config_files = list() - config = spack.config.CONFIG - for scope in config.writable_scopes: - name = scope.name - compiler_config = config.get("compilers", scope=name) - if compiler_config: - config_files.append(config.get_config_filename(name, "compilers")) - compiler_config_from_packages = get_compiler_config_from_packages(config, scope=name) - if compiler_config_from_packages: - config_files.append(config.get_config_filename(name, "packages")) - return config_files - - -def add_compilers_to_config(compilers, scope=None): - """Add compilers to the config for the specified architecture. - - Arguments: - compilers: a list of Compiler objects. - scope: configuration scope to modify. - """ - compiler_config = get_compiler_config(configuration=spack.config.CONFIG, scope=scope) - for compiler in compilers: - if not compiler.cc: - tty.debug(f"{compiler.spec} does not have a C compiler") - if not compiler.cxx: - tty.debug(f"{compiler.spec} does not have a C++ compiler") - if not compiler.f77: - tty.debug(f"{compiler.spec} does not have a Fortran77 compiler") - if not compiler.fc: - tty.debug(f"{compiler.spec} does not have a Fortran compiler") - compiler_config.append(_to_dict(compiler)) - spack.config.set("compilers", compiler_config, scope=scope) - - -@_auto_compiler_spec -def remove_compiler_from_config(compiler_spec, scope=None): - """Remove compilers from configuration by spec. - - If scope is None, all the scopes are searched for removal. - - Arguments: - compiler_spec: compiler to be removed - scope: configuration scope to modify - """ - candidate_scopes = [scope] - if scope is None: - candidate_scopes = spack.config.CONFIG.scopes.keys() - - removal_happened = False - for current_scope in candidate_scopes: - removal_happened |= _remove_compiler_from_scope(compiler_spec, scope=current_scope) - - msg = "`spack compiler remove` will not remove compilers defined in packages.yaml" - msg += "\nTo remove these compilers, either edit the config or use `spack external remove`" - tty.debug(msg) - return removal_happened - - -def _remove_compiler_from_scope(compiler_spec, scope): - """Removes a compiler from a specific configuration scope. - - Args: - compiler_spec: compiler to be removed - scope: configuration scope under consideration - - Returns: - True if one or more compiler entries were actually removed, False otherwise - """ - assert scope is not None, "a specific scope is needed when calling this function" - compiler_config = get_compiler_config(configuration=spack.config.CONFIG, scope=scope) - filtered_compiler_config = [ - compiler_entry - for compiler_entry in compiler_config - if not spack.spec.parse_with_version_concrete( - compiler_entry["compiler"]["spec"], compiler=True - ).satisfies(compiler_spec) - ] - - if len(filtered_compiler_config) == len(compiler_config): - return False - - # We need to preserve the YAML type for comments, hence we are copying the - # items in the list that has just been retrieved - compiler_config[:] = filtered_compiler_config - spack.config.CONFIG.set("compilers", compiler_config, scope=scope) - return True - - -def all_compilers_config( - configuration: "spack.config.Configuration", - *, - scope: Optional[str] = None, - init_config: bool = True, -) -> List["spack.compiler.Compiler"]: - """Return a set of specs for all the compiler versions currently - available to build with. These are instances of CompilerSpec. - """ - from_packages_yaml = get_compiler_config_from_packages(configuration, scope=scope) - if from_packages_yaml: - init_config = False - from_compilers_yaml = get_compiler_config(configuration, scope=scope, init_config=init_config) - - result = from_compilers_yaml + from_packages_yaml - # Dedupe entries by the compiler they represent - # If the entry is invalid, treat it as unique for deduplication - key = lambda c: _compiler_from_config_entry(c["compiler"] or id(c)) - return list(llnl.util.lang.dedupe(result, key=key)) - - -def all_compiler_specs(scope=None, init_config=True): - # Return compiler specs from the merged config. - return [ - spack.spec.parse_with_version_concrete(s["compiler"]["spec"], compiler=True) - for s in all_compilers_config(spack.config.CONFIG, scope=scope, init_config=init_config) - ] - - -def find_compilers( - path_hints: Optional[List[str]] = None, - *, - scope: Optional[str] = None, - mixed_toolchain: bool = False, - max_workers: Optional[int] = None, -) -> List["spack.compiler.Compiler"]: - """Searches for compiler in the paths given as argument. If any new compiler is found, the - configuration is updated, and the list of new compiler objects is returned. - - Args: - path_hints: list of path hints where to look for. A sensible default based on the ``PATH`` - environment variable will be used if the value is None - scope: configuration scope to modify - mixed_toolchain: allow mixing compilers from different toolchains if otherwise missing for - a certain language - max_workers: number of processes used to search for compilers - """ - import spack.detection - - known_compilers = set(all_compilers(init_config=False)) - - if path_hints is None: - path_hints = get_path("PATH") - default_paths = fs.search_paths_for_executables(*path_hints) - if sys.platform == "win32": - default_paths.extend(windows_os.WindowsOs().compiler_search_paths) - compiler_pkgs = spack.repo.PATH.packages_with_tags(COMPILER_TAG, full=True) - - detected_packages = spack.detection.by_path( - compiler_pkgs, path_hints=default_paths, max_workers=max_workers - ) - - valid_compilers = {} - for name, detected in detected_packages.items(): - compilers = [x for x in detected if CompilerConfigFactory.from_external_spec(x)] - if not compilers: - continue - valid_compilers[name] = compilers - - def _has_fortran_compilers(x): - if "compilers" not in x.extra_attributes: - return False - - return "fortran" in x.extra_attributes["compilers"] - - if mixed_toolchain: - gccs = [x for x in valid_compilers.get("gcc", []) if _has_fortran_compilers(x)] - if gccs: - best_gcc = sorted( - gccs, key=lambda x: spack.spec.parse_with_version_concrete(x).version - )[-1] - gfortran = best_gcc.extra_attributes["compilers"]["fortran"] - for name in ("llvm", "apple-clang"): - if name not in valid_compilers: - continue - candidates = valid_compilers[name] - for candidate in candidates: - if _has_fortran_compilers(candidate): - continue - candidate.extra_attributes["compilers"]["fortran"] = gfortran - - new_compilers = [] - for name, detected in valid_compilers.items(): - for config in CompilerConfigFactory.from_specs(detected): - c = _compiler_from_config_entry(config["compiler"]) - if c in known_compilers: - continue - new_compilers.append(c) - - add_compilers_to_config(new_compilers, scope=scope) - return new_compilers - - -def select_new_compilers(compilers, scope=None): - """Given a list of compilers, remove those that are already defined in - the configuration. - """ - compilers_not_in_config = [] - for c in compilers: - arch_spec = spack.spec.ArchSpec((None, c.operating_system, c.target)) - same_specs = compilers_for_spec( - c.spec, arch_spec=arch_spec, scope=scope, init_config=False - ) - if not same_specs: - compilers_not_in_config.append(c) - - return compilers_not_in_config - - -def supported_compilers() -> List[str]: - """Return a set of names of compilers supported by Spack. - - See available_compilers() to get a list of all the available - versions of supported compilers. - """ - # Hack to be able to call the compiler `apple-clang` while still - # using a valid python name for the module - return sorted(all_compiler_names()) - - -def supported_compilers_for_host_platform() -> List[str]: - """Return a set of compiler class objects supported by Spack - that are also supported by the current host platform - """ - host_plat = spack.platforms.real_host() - return supported_compilers_for_platform(host_plat) - - -def supported_compilers_for_platform(platform: "spack.platforms.Platform") -> List[str]: - """Return a set of compiler class objects supported by Spack - that are also supported by the provided platform - - Args: - platform (str): string representation of platform - for which compiler compatability should be determined - """ - return [ - name - for name in supported_compilers() - if class_for_compiler_name(name).is_supported_on_platform(platform) - ] - - -def all_compiler_names() -> List[str]: - def replace_apple_clang(name): - return name if name != "apple_clang" else "apple-clang" - - return [replace_apple_clang(name) for name in all_compiler_module_names()] - - -@llnl.util.lang.memoized -def all_compiler_module_names() -> List[str]: - return list(llnl.util.lang.list_modules(spack.paths.compilers_path)) - - -@_auto_compiler_spec -def supported(compiler_spec): - """Test if a particular compiler is supported.""" - return compiler_spec.name in supported_compilers() - - -@_auto_compiler_spec -def find(compiler_spec, scope=None, init_config=True): - """Return specs of available compilers that match the supplied - compiler spec. Return an empty list if nothing found.""" - return [c for c in all_compiler_specs(scope, init_config) if c.satisfies(compiler_spec)] - - -@_auto_compiler_spec -def find_specs_by_arch(compiler_spec, arch_spec, scope=None, init_config=True): - """Return specs of available compilers that match the supplied - compiler spec. Return an empty list if nothing found.""" - return [ - c.spec - for c in compilers_for_spec( - compiler_spec, arch_spec=arch_spec, scope=scope, init_config=init_config - ) - ] - - -def all_compilers(scope=None, init_config=True): - return all_compilers_from( - configuration=spack.config.CONFIG, scope=scope, init_config=init_config - ) - - -def all_compilers_from(configuration, scope=None, init_config=True): - compilers = [] - for items in all_compilers_config( - configuration=configuration, scope=scope, init_config=init_config - ): - items = items["compiler"] - compiler = _compiler_from_config_entry(items) # can be None in error case - if compiler: - compilers.append(compiler) - return compilers - - -@_auto_compiler_spec -def compilers_for_spec(compiler_spec, *, arch_spec=None, scope=None, init_config=True): - """This gets all compilers that satisfy the supplied CompilerSpec. - Returns an empty list if none are found. - """ - config = all_compilers_config(spack.config.CONFIG, scope=scope, init_config=init_config) - matches = set(find(compiler_spec, scope, init_config)) - compilers = [] - for cspec in matches: - compilers.extend(get_compilers(config, cspec, arch_spec)) - return compilers - - -def compilers_for_arch(arch_spec, scope=None): - config = all_compilers_config(spack.config.CONFIG, scope=scope, init_config=False) - return list(get_compilers(config, arch_spec=arch_spec)) - - -def compiler_specs_for_arch(arch_spec, scope=None): - return [c.spec for c in compilers_for_arch(arch_spec, scope)] - - -class CacheReference: - """This acts as a hashable reference to any object (regardless of whether - the object itself is hashable) and also prevents the object from being - garbage-collected (so if two CacheReference objects are equal, they - will refer to the same object, since it will not have been gc'ed since - the creation of the first CacheReference). - """ - - def __init__(self, val): - self.val = val - self.id = id(val) - - def __hash__(self): - return self.id - - def __eq__(self, other): - return isinstance(other, CacheReference) and self.id == other.id - - -def compiler_from_dict(items): - cspec = spack.spec.parse_with_version_concrete(items["spec"], compiler=True) - os = items.get("operating_system", None) - target = items.get("target", None) - - if not ( - "paths" in items and all(n in items["paths"] for n in spack.compiler.PATH_INSTANCE_VARS) - ): - raise InvalidCompilerConfigurationError(cspec) - - cls = class_for_compiler_name(cspec.name) - - compiler_paths = [] - for c in spack.compiler.PATH_INSTANCE_VARS: - compiler_path = items["paths"][c] - if compiler_path != "None": - compiler_paths.append(compiler_path) - else: - compiler_paths.append(None) - - mods = items.get("modules") - if mods == "None": - mods = [] - - alias = items.get("alias", None) - compiler_flags = items.get("flags", {}) - environment = items.get("environment", {}) - extra_rpaths = items.get("extra_rpaths", []) - implicit_rpaths = items.get("implicit_rpaths", None) - - # Starting with c22a145, 'implicit_rpaths' was a list. Now it is a - # boolean which can be set by the user to disable all automatic - # RPATH insertion of compiler libraries - if implicit_rpaths is not None and not isinstance(implicit_rpaths, bool): - implicit_rpaths = None - - return cls( - cspec, - os, - target, - compiler_paths, - mods, - alias, - environment, - extra_rpaths, - enable_implicit_rpaths=implicit_rpaths, - **compiler_flags, - ) - - -def _compiler_from_config_entry(items): - """Note this is intended for internal use only. To avoid re-parsing - the same config dictionary this keeps track of its location in - memory. If you provide the same dictionary twice it will return - the same Compiler object (regardless of whether the dictionary - entries have changed). - """ - config_id = CacheReference(items) - compiler = _compiler_cache.get(config_id, None) - - if compiler is None: - try: - compiler = compiler_from_dict(items) - except UnknownCompilerError as e: - warnings.warn(e.message) - _compiler_cache[config_id] = compiler - - return compiler - - -def get_compilers(config, cspec=None, arch_spec=None): - compilers = [] - - for items in config: - items = items["compiler"] - - # We might use equality here. - if cspec and not spack.spec.parse_with_version_concrete( - items["spec"], compiler=True - ).satisfies(cspec): - continue - - # If an arch spec is given, confirm that this compiler - # is for the given operating system - os = items.get("operating_system", None) - if arch_spec and os != arch_spec.os: - continue - - # If an arch spec is given, confirm that this compiler - # is for the given target. If the target is 'any', match - # any given arch spec. If the compiler has no assigned - # target this is an old compiler config file, skip this logic. - target = items.get("target", None) - - try: - current_target = archspec.cpu.TARGETS[str(arch_spec.target)] - family = str(current_target.family) - except KeyError: - # TODO: Check if this exception handling makes sense, or if we - # TODO: need to change / refactor tests - family = str(arch_spec.target) - except AttributeError: - assert arch_spec is None - - if arch_spec and target and (target != family and target != "any"): - # If the family of the target is the family we are seeking, - # there's an error in the underlying configuration - if archspec.cpu.TARGETS[target].family == family: - msg = ( - 'the "target" field in compilers.yaml accepts only ' - 'target families [replace "{0}" with "{1}"' - ' in "{2}" specification]' - ) - msg = msg.format(str(target), family, items.get("spec", "??")) - raise ValueError(msg) - continue - - compiler = _compiler_from_config_entry(items) - if compiler: - compilers.append(compiler) - - return compilers - - -@_auto_compiler_spec -def compiler_for_spec(compiler_spec, arch_spec): - """Get the compiler that satisfies compiler_spec. compiler_spec must - be concrete.""" - assert compiler_spec.concrete - assert arch_spec.concrete - - compilers = compilers_for_spec(compiler_spec, arch_spec=arch_spec) - if len(compilers) < 1: - raise NoCompilerForSpecError(compiler_spec, arch_spec.os) - if len(compilers) > 1: - msg = "Multiple definitions of compiler %s " % compiler_spec - msg += "for architecture %s:\n %s" % (arch_spec, compilers) - tty.debug(msg) - return compilers[0] - - -@llnl.util.lang.memoized -def class_for_compiler_name(compiler_name): - """Given a compiler module name, get the corresponding Compiler class.""" - if not supported(compiler_name): - raise UnknownCompilerError(compiler_name) - - # Hack to be able to call the compiler `apple-clang` while still - # using a valid python name for the module - submodule_name = compiler_name - if compiler_name == "apple-clang": - submodule_name = compiler_name.replace("-", "_") - - module_name = ".".join(["spack", "compilers", submodule_name]) - module_obj = importlib.import_module(module_name) - cls = getattr(module_obj, mod_to_class(compiler_name)) - - # make a note of the name in the module so we can get to it easily. - cls.name = compiler_name - - return cls - - -def all_compiler_types(): - return [class_for_compiler_name(c) for c in supported_compilers()] - - -def is_mixed_toolchain(compiler): - """Returns True if the current compiler is a mixed toolchain, - False otherwise. - - Args: - compiler (spack.compiler.Compiler): a valid compiler object - """ - 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() - 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 == {"llvm", "apple-clang", "aocc"} - # Msvc toolchain uses Intel ifx - or toolchains == {"msvc", "intel-oneapi-compilers"} - ): - return False - tty.debug("[TOOLCHAINS] {0}".format(toolchains)) - return True - - return False - - -_EXTRA_ATTRIBUTES_KEY = "extra_attributes" -_COMPILERS_KEY = "compilers" -_C_KEY = "c" -_CXX_KEY, _FORTRAN_KEY = "cxx", "fortran" - - -class CompilerConfigFactory: - """Class aggregating all ways of constructing a list of compiler config entries.""" - - @staticmethod - def from_specs(specs: List["spack.spec.Spec"]) -> List[dict]: - result = [] - compiler_package_names = supported_compilers() + list(package_name_to_compiler_name.keys()) - for s in specs: - if s.name not in compiler_package_names: - continue - - candidate = CompilerConfigFactory.from_external_spec(s) - if candidate is None: - continue - - result.append(candidate) - return result - - @staticmethod - def from_packages_yaml(packages_yaml) -> List[dict]: - compiler_specs = [] - compiler_package_names = supported_compilers() + list(package_name_to_compiler_name.keys()) - for name, entry in packages_yaml.items(): - if name not in compiler_package_names: - continue - - externals_config = entry.get("externals", None) - if not externals_config: - continue - - current_specs = [] - for current_external in externals_config: - compiler = CompilerConfigFactory._spec_from_external_config(current_external) - if compiler: - current_specs.append(compiler) - compiler_specs.extend(current_specs) - - return CompilerConfigFactory.from_specs(compiler_specs) - - @staticmethod - def _spec_from_external_config(config): - # Allow `@x.y.z` instead of `@=x.y.z` - err_header = f"The external spec '{config['spec']}' cannot be used as a compiler" - # If extra_attributes is not there I might not want to use this entry as a compiler, - # therefore just leave a debug message, but don't be loud with a warning. - if _EXTRA_ATTRIBUTES_KEY not in config: - tty.debug(f"[{__file__}] {err_header}: missing the '{_EXTRA_ATTRIBUTES_KEY}' key") - return None - extra_attributes = config[_EXTRA_ATTRIBUTES_KEY] - result = spack.spec.Spec( - str(spack.spec.parse_with_version_concrete(config["spec"])), - external_modules=config.get("modules"), - ) - result.extra_attributes = extra_attributes - return result - - @staticmethod - def from_external_spec(spec: "spack.spec.Spec") -> Optional[dict]: - spec = spack.spec.parse_with_version_concrete(spec) - extra_attributes = getattr(spec, _EXTRA_ATTRIBUTES_KEY, None) - if extra_attributes is None: - return None - - paths = CompilerConfigFactory._extract_compiler_paths(spec) - if paths is None: - return None - - compiler_spec = spack.spec.CompilerSpec( - package_name_to_compiler_name.get(spec.name, spec.name), spec.version - ) - - operating_system, target = CompilerConfigFactory._extract_os_and_target(spec) - - compiler_entry = { - "compiler": { - "spec": str(compiler_spec), - "paths": paths, - "flags": extra_attributes.get("flags", {}), - "operating_system": str(operating_system), - "target": str(target.family), - "modules": getattr(spec, "external_modules", []), - "environment": extra_attributes.get("environment", {}), - "extra_rpaths": extra_attributes.get("extra_rpaths", []), - "implicit_rpaths": extra_attributes.get("implicit_rpaths", None), - } - } - return compiler_entry - - @staticmethod - def _extract_compiler_paths(spec: "spack.spec.Spec") -> Optional[Dict[str, str]]: - err_header = f"The external spec '{spec}' cannot be used as a compiler" - extra_attributes = spec.extra_attributes - # If I have 'extra_attributes' warn if 'compilers' is missing, - # or we don't have a C compiler - if _COMPILERS_KEY not in extra_attributes: - warnings.warn( - f"{err_header}: missing the '{_COMPILERS_KEY}' key under '{_EXTRA_ATTRIBUTES_KEY}'" - ) - return None - attribute_compilers = extra_attributes[_COMPILERS_KEY] - - if _C_KEY not in attribute_compilers: - warnings.warn( - f"{err_header}: missing the C compiler path under " - f"'{_EXTRA_ATTRIBUTES_KEY}:{_COMPILERS_KEY}'" - ) - return None - c_compiler = attribute_compilers[_C_KEY] - - # C++ and Fortran compilers are not mandatory, so let's just leave a debug trace - if _CXX_KEY not in attribute_compilers: - tty.debug(f"[{__file__}] The external spec {spec} does not have a C++ compiler") - - if _FORTRAN_KEY not in attribute_compilers: - tty.debug(f"[{__file__}] The external spec {spec} does not have a Fortran compiler") - - # compilers format has cc/fc/f77, externals format has "c/fortran" - return { - "cc": c_compiler, - "cxx": attribute_compilers.get(_CXX_KEY, None), - "fc": attribute_compilers.get(_FORTRAN_KEY, None), - "f77": attribute_compilers.get(_FORTRAN_KEY, None), - } - - @staticmethod - def _extract_os_and_target(spec: "spack.spec.Spec"): - if not spec.architecture: - host_platform = spack.platforms.host() - operating_system = host_platform.default_operating_system() - target = host_platform.default_target() - else: - target = spec.architecture.target - if not target: - target = spack.platforms.host().default_target() - - operating_system = spec.os - if not operating_system: - host_platform = spack.platforms.host() - operating_system = host_platform.default_operating_system() - return operating_system, target - - -class InvalidCompilerConfigurationError(spack.error.SpackError): - def __init__(self, compiler_spec): - super().__init__( - f'Invalid configuration for [compiler "{compiler_spec}"]: ', - f"Compiler configuration must contain entries for " - f"all compilers: {spack.compiler.PATH_INSTANCE_VARS}", - ) - - -class UnknownCompilerError(spack.error.SpackError): - def __init__(self, compiler_name): - super().__init__("Spack doesn't support the requested compiler: {0}".format(compiler_name)) - - -class NoCompilerForSpecError(spack.error.SpackError): - def __init__(self, compiler_spec, target): - super().__init__( - "No compilers for operating system %s satisfy spec %s" % (target, compiler_spec) - ) diff --git a/lib/spack/spack/compilers/adaptor.py b/lib/spack/spack/compilers/adaptor.py new file mode 100644 index 00000000000..ad9a929d342 --- /dev/null +++ b/lib/spack/spack/compilers/adaptor.py @@ -0,0 +1,209 @@ +# Copyright Spack Project Developers. See COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +import enum +from typing import Dict, List + +from llnl.util import lang + +import spack.spec + +from .libraries import CompilerPropertyDetector + + +class Languages(enum.Enum): + C = "c" + CXX = "cxx" + FORTRAN = "fortran" + + +class CompilerAdaptor: + def __init__( + self, compiled_spec: spack.spec.Spec, compilers: Dict[Languages, spack.spec.Spec] + ) -> None: + if not compilers: + raise AttributeError(f"{compiled_spec} has no 'compiler' attribute") + + self.compilers = compilers + self.compiled_spec = compiled_spec + + def _lang_exists_or_raise(self, name: str, *, lang: Languages) -> None: + if lang not in self.compilers: + raise AttributeError( + f"'{self.compiled_spec}' has no {lang.value} compiler, so the " + f"'{name}' property cannot be retrieved" + ) + + def _maybe_return_attribute(self, name: str, *, lang: Languages) -> str: + self._lang_exists_or_raise(name, lang=lang) + return getattr(self.compilers[lang].package, name) + + @property + def cc_rpath_arg(self) -> str: + self._lang_exists_or_raise("cc_rpath_arg", lang=Languages.C) + return self.compilers[Languages.C].package.rpath_arg + + @property + def cxx_rpath_arg(self) -> str: + self._lang_exists_or_raise("cxx_rpath_arg", lang=Languages.CXX) + return self.compilers[Languages.CXX].package.rpath_arg + + @property + def fc_rpath_arg(self) -> str: + self._lang_exists_or_raise("fc_rpath_arg", lang=Languages.FORTRAN) + return self.compilers[Languages.FORTRAN].package.rpath_arg + + @property + def f77_rpath_arg(self) -> str: + self._lang_exists_or_raise("f77_rpath_arg", lang=Languages.FORTRAN) + return self.compilers[Languages.FORTRAN].package.rpath_arg + + @property + def linker_arg(self) -> str: + return self._maybe_return_attribute("linker_arg", lang=Languages.C) + + @property + def name(self): + return next(iter(self.compilers.values())).name + + @property + def version(self): + return next(iter(self.compilers.values())).version + + def implicit_rpaths(self) -> List[str]: + result, seen = [], set() + for compiler in self.compilers.values(): + if compiler in seen: + continue + seen.add(compiler) + result.extend(CompilerPropertyDetector(compiler).implicit_rpaths()) + return result + + @property + def openmp_flag(self) -> str: + return next(iter(self.compilers.values())).package.openmp_flag + + @property + def cxx98_flag(self) -> str: + return self.compilers[Languages.CXX].package.standard_flag( + language=Languages.CXX.value, standard="98" + ) + + @property + def cxx11_flag(self) -> str: + return self.compilers[Languages.CXX].package.standard_flag( + language=Languages.CXX.value, standard="11" + ) + + @property + def cxx14_flag(self) -> str: + return self.compilers[Languages.CXX].package.standard_flag( + language=Languages.CXX.value, standard="14" + ) + + @property + def cxx17_flag(self) -> str: + return self.compilers[Languages.CXX].package.standard_flag( + language=Languages.CXX.value, standard="17" + ) + + @property + def cxx20_flag(self) -> str: + return self.compilers[Languages.CXX].package.standard_flag( + language=Languages.CXX.value, standard="20" + ) + + @property + def cxx23_flag(self) -> str: + return self.compilers[Languages.CXX].package.standard_flag( + language=Languages.CXX.value, standard="23" + ) + + @property + def c99_flag(self) -> str: + return self.compilers[Languages.C].package.standard_flag( + language=Languages.C.value, standard="99" + ) + + @property + def c11_flag(self) -> str: + return self.compilers[Languages.C].package.standard_flag( + language=Languages.C.value, standard="11" + ) + + @property + def c17_flag(self) -> str: + return self.compilers[Languages.C].package.standard_flag( + language=Languages.C.value, standard="17" + ) + + @property + def c23_flag(self) -> str: + return self.compilers[Languages.C].package.standard_flag( + language=Languages.C.value, standard="17" + ) + + @property + def cc_pic_flag(self) -> str: + self._lang_exists_or_raise("cc_pic_flag", lang=Languages.C) + return self.compilers[Languages.C].package.pic_flag + + @property + def cxx_pic_flag(self) -> str: + self._lang_exists_or_raise("cxx_pic_flag", lang=Languages.CXX) + return self.compilers[Languages.CXX].package.pic_flag + + @property + def fc_pic_flag(self) -> str: + self._lang_exists_or_raise("fc_pic_flag", lang=Languages.FORTRAN) + return self.compilers[Languages.FORTRAN].package.pic_flag + + @property + def f77_pic_flag(self) -> str: + self._lang_exists_or_raise("f77_pic_flag", lang=Languages.FORTRAN) + return self.compilers[Languages.FORTRAN].package.pic_flag + + @property + def prefix(self) -> str: + return next(iter(self.compilers.values())).prefix + + @property + def extra_rpaths(self) -> List[str]: + compiler = next(iter(self.compilers.values())) + return getattr(compiler, "extra_attributes", {}).get("extra_rpaths", []) + + @property + def cc(self): + return self._maybe_return_attribute("cc", lang=Languages.C) + + @property + def cxx(self): + return self._maybe_return_attribute("cxx", lang=Languages.CXX) + + @property + def fc(self): + self._lang_exists_or_raise("fc", lang=Languages.FORTRAN) + return self.compilers[Languages.FORTRAN].package.fortran + + @property + def f77(self): + self._lang_exists_or_raise("f77", lang=Languages.FORTRAN) + return self.compilers[Languages.FORTRAN].package.fortran + + +class DeprecatedCompiler(lang.DeprecatedProperty): + def __init__(self) -> None: + super().__init__(name="compiler") + + def factory(self, instance, owner) -> CompilerAdaptor: + spec = instance.spec + if not spec.concrete: + raise ValueError("Can only get a compiler for a concrete package.") + + compilers = {} + for language in Languages: + deps = spec.dependencies(virtuals=[language.value]) + if deps: + compilers[language] = deps[0] + + return CompilerAdaptor(instance, compilers) diff --git a/lib/spack/spack/compilers/aocc.py b/lib/spack/spack/compilers/aocc.py deleted file mode 100644 index 0d6c908df65..00000000000 --- a/lib/spack/spack/compilers/aocc.py +++ /dev/null @@ -1,119 +0,0 @@ -# Copyright Spack Project Developers. See COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -import os -import re - -import llnl.util.lang - -from spack.compiler import Compiler -from spack.version import ver - - -class Aocc(Compiler): - version_argument = "--version" - - @property - def debug_flags(self): - return [ - "-gcodeview", - "-gdwarf-2", - "-gdwarf-3", - "-gdwarf-4", - "-gdwarf-5", - "-gline-tables-only", - "-gmodules", - "-g", - ] - - @property - def opt_flags(self): - return ["-O0", "-O1", "-O2", "-O3", "-Ofast", "-Os", "-Oz", "-Og", "-O", "-O4"] - - @property - def link_paths(self): - link_paths = { - "cc": os.path.join("aocc", "clang"), - "cxx": os.path.join("aocc", "clang++"), - "f77": os.path.join("aocc", "flang"), - "fc": os.path.join("aocc", "flang"), - } - - return link_paths - - @property - def verbose_flag(self): - return "-v" - - @property - def openmp_flag(self): - return "-fopenmp" - - @property - def cxx11_flag(self): - return "-std=c++11" - - @property - def cxx14_flag(self): - return "-std=c++14" - - @property - def cxx17_flag(self): - return "-std=c++17" - - @property - def c99_flag(self): - return "-std=c99" - - @property - def c11_flag(self): - return "-std=c11" - - @property - def cc_pic_flag(self): - return "-fPIC" - - @property - def cxx_pic_flag(self): - return "-fPIC" - - @property - def f77_pic_flag(self): - return "-fPIC" - - @property - def fc_pic_flag(self): - return "-fPIC" - - required_libs = ["libclang"] - - @classmethod - @llnl.util.lang.memoized - def extract_version_from_output(cls, output): - match = re.search(r"AOCC_(\d+)[._](\d+)[._](\d+)", output) - if match: - return ".".join(match.groups()) - return "unknown" - - @property - def stdcxx_libs(self): - return ("-lstdc++",) - - @property - def cflags(self): - return self._handle_default_flag_addtions() - - @property - def cxxflags(self): - return self._handle_default_flag_addtions() - - @property - def fflags(self): - return self._handle_default_flag_addtions() - - def _handle_default_flag_addtions(self): - # This is a known issue for AOCC 3.0 see: - # https://developer.amd.com/wp-content/resources/AOCC-3.0-Install-Guide.pdf - if self.version.satisfies(ver("3.0.0")): - return "-Wno-unused-command-line-argument " "-mllvm -eliminate-similar-expr=false" diff --git a/lib/spack/spack/compilers/apple_clang.py b/lib/spack/spack/compilers/apple_clang.py deleted file mode 100644 index 7962639b6fd..00000000000 --- a/lib/spack/spack/compilers/apple_clang.py +++ /dev/null @@ -1,115 +0,0 @@ -# Copyright Spack Project Developers. See COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) -import re - -import llnl.util.lang - -import spack.compiler -import spack.compilers.clang -from spack.version import Version - - -class AppleClang(spack.compilers.clang.Clang): - openmp_flag = "-Xpreprocessor -fopenmp" - - @classmethod - @llnl.util.lang.memoized - def extract_version_from_output(cls, output): - ver = "unknown" - match = re.search( - # Apple's LLVM compiler has its own versions, so suffix them. - r"^Apple (?:LLVM|clang) version ([^ )]+)", - output, - # Multi-line, since 'Apple clang' may not be on the first line - # in particular, when run as gcc, it seems to output - # "Configured with: --prefix=..." as the first line - re.M, - ) - if match: - ver = match.group(match.lastindex) - return ver - - # C++ flags based on CMake Modules/Compiler/AppleClang-CXX.cmake - - @property - def cxx11_flag(self): - # Spack's AppleClang detection only valid from Xcode >= 4.6 - if self.real_version < Version("4.0"): - raise spack.compiler.UnsupportedCompilerFlag( - self, "the C++11 standard", "cxx11_flag", "Xcode < 4.0" - ) - return "-std=c++11" - - @property - def cxx14_flag(self): - if self.real_version < Version("5.1"): - raise spack.compiler.UnsupportedCompilerFlag( - self, "the C++14 standard", "cxx14_flag", "Xcode < 5.1" - ) - elif self.real_version < Version("6.1"): - return "-std=c++1y" - - return "-std=c++14" - - @property - def cxx17_flag(self): - if self.real_version < Version("6.1"): - raise spack.compiler.UnsupportedCompilerFlag( - self, "the C++17 standard", "cxx17_flag", "Xcode < 6.1" - ) - elif self.real_version < Version("10.0"): - return "-std=c++1z" - return "-std=c++17" - - @property - def cxx20_flag(self): - if self.real_version < Version("10.0"): - raise spack.compiler.UnsupportedCompilerFlag( - self, "the C++20 standard", "cxx20_flag", "Xcode < 10.0" - ) - elif self.real_version < Version("13.0"): - return "-std=c++2a" - return "-std=c++20" - - @property - def cxx23_flag(self): - if self.real_version < Version("13.0"): - raise spack.compiler.UnsupportedCompilerFlag( - self, "the C++23 standard", "cxx23_flag", "Xcode < 13.0" - ) - return "-std=c++2b" - - # C flags based on CMake Modules/Compiler/AppleClang-C.cmake - - @property - def c99_flag(self): - if self.real_version < Version("4.0"): - raise spack.compiler.UnsupportedCompilerFlag( - self, "the C99 standard", "c99_flag", "< 4.0" - ) - return "-std=c99" - - @property - def c11_flag(self): - if self.real_version < Version("4.0"): - raise spack.compiler.UnsupportedCompilerFlag( - self, "the C11 standard", "c11_flag", "< 4.0" - ) - return "-std=c11" - - @property - def c17_flag(self): - if self.real_version < Version("11.0"): - raise spack.compiler.UnsupportedCompilerFlag( - self, "the C17 standard", "c17_flag", "< 11.0" - ) - return "-std=c17" - - @property - def c23_flag(self): - if self.real_version < Version("11.0.3"): - raise spack.compiler.UnsupportedCompilerFlag( - self, "the C23 standard", "c23_flag", "< 11.0.3" - ) - return "-std=c2x" diff --git a/lib/spack/spack/compilers/arm.py b/lib/spack/spack/compilers/arm.py deleted file mode 100644 index 880c82b321d..00000000000 --- a/lib/spack/spack/compilers/arm.py +++ /dev/null @@ -1,79 +0,0 @@ -# Copyright Spack Project Developers. See COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -import os - -import spack.compiler - - -class Arm(spack.compiler.Compiler): - # Named wrapper links within lib/spack/env - link_paths = { - "cc": os.path.join("arm", "armclang"), - "cxx": os.path.join("arm", "armclang++"), - "f77": os.path.join("arm", "armflang"), - "fc": os.path.join("arm", "armflang"), - } - - # The ``--version`` option seems to be the most consistent one for - # arm compilers. Output looks like this: - # - # $ armlang --version - # Arm C/C++/Fortran Compiler version 19.0 (build number 73) (based on LLVM 7.0.2) - # Target: aarch64--linux-gnu - # Thread model: posix - # InstalledDir: - # /opt/arm/arm-hpc-compiler-19.0_Generic-AArch64_RHEL-7_aarch64-linux/bin - version_argument = "--version" - version_regex = r"Arm C\/C\+\+\/Fortran Compiler version ([\d\.]+) " - - @property - def verbose_flag(self): - return "-v" - - @property - def opt_flags(self): - return ["-O", "-O0", "-O1", "-O2", "-O3", "-Ofast"] - - @property - def openmp_flag(self): - return "-fopenmp" - - @property - def cxx11_flag(self): - return "-std=c++11" - - @property - def cxx14_flag(self): - return "-std=c++14" - - @property - def cxx17_flag(self): - return "-std=c++1z" - - @property - def c99_flag(self): - return "-std=c99" - - @property - def c11_flag(self): - return "-std=c11" - - @property - def cc_pic_flag(self): - return "-fPIC" - - @property - def cxx_pic_flag(self): - return "-fPIC" - - @property - def f77_pic_flag(self): - return "-fPIC" - - @property - def fc_pic_flag(self): - return "-fPIC" - - required_libs = ["libclang", "libflang"] diff --git a/lib/spack/spack/compilers/cce.py b/lib/spack/spack/compilers/cce.py deleted file mode 100644 index a127ec9d4fe..00000000000 --- a/lib/spack/spack/compilers/cce.py +++ /dev/null @@ -1,127 +0,0 @@ -# Copyright Spack Project Developers. See COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) -import os - -from spack.compiler import Compiler, UnsupportedCompilerFlag -from spack.version import Version - - -class Cce(Compiler): - """Cray compiler environment compiler.""" - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - # For old cray compilers on module based systems we replace - # ``version_argument`` with the old value. Cannot be a property - # as the new value is used in classmethods for path-based detection - if not self.is_clang_based: - self.version_argument = "-V" - - # MacPorts builds gcc versions with prefixes and -mp-X.Y suffixes. - suffixes = [r"-mp-\d\.\d"] - - @property - def link_paths(self): - if any("PrgEnv-cray" in m for m in self.modules): - # Old module-based interface to cray compilers - return { - "cc": os.path.join("cce", "cc"), - "cxx": os.path.join("case-insensitive", "CC"), - "f77": os.path.join("cce", "ftn"), - "fc": os.path.join("cce", "ftn"), - } - - return { - "cc": os.path.join("cce", "craycc"), - "cxx": os.path.join("cce", "case-insensitive", "crayCC"), - "f77": os.path.join("cce", "crayftn"), - "fc": os.path.join("cce", "crayftn"), - } - - @property - def is_clang_based(self): - version = self._real_version or self.version - return version >= Version("9.0") and "classic" not in str(version) - - version_argument = "--version" - version_regex = r"[Cc]ray (?:clang|C :|C\+\+ :|Fortran :) [Vv]ersion.*?(\d+(\.\d+)+)" - - @property - def verbose_flag(self): - return "-v" - - @property - def debug_flags(self): - return ["-g", "-G0", "-G1", "-G2", "-Gfast"] - - @property - def openmp_flag(self): - if self.is_clang_based: - return "-fopenmp" - return "-h omp" - - @property - def cxx11_flag(self): - if self.is_clang_based: - return "-std=c++11" - return "-h std=c++11" - - @property - def cxx14_flag(self): - if self.is_clang_based: - return "-std=c++14" - return "-h std=c++14" - - @property - def cxx17_flag(self): - if self.is_clang_based: - return "-std=c++17" - - @property - def c99_flag(self): - if self.is_clang_based: - return "-std=c99" - elif self.real_version >= Version("8.4"): - return "-h std=c99,noconform,gnu" - elif self.real_version >= Version("8.1"): - return "-h c99,noconform,gnu" - raise UnsupportedCompilerFlag(self, "the C99 standard", "c99_flag", "< 8.1") - - @property - def c11_flag(self): - if self.is_clang_based: - return "-std=c11" - elif self.real_version >= Version("8.5"): - return "-h std=c11,noconform,gnu" - raise UnsupportedCompilerFlag(self, "the C11 standard", "c11_flag", "< 8.5") - - @property - def cc_pic_flag(self): - if self.is_clang_based: - return "-fPIC" - return "-h PIC" - - @property - def cxx_pic_flag(self): - if self.is_clang_based: - return "-fPIC" - return "-h PIC" - - @property - def f77_pic_flag(self): - if self.is_clang_based: - return "-fPIC" - return "-h PIC" - - @property - def fc_pic_flag(self): - if self.is_clang_based: - return "-fPIC" - return "-h PIC" - - @property - def stdcxx_libs(self): - # Cray compiler wrappers link to the standard C++ library - # without additional flags. - return () diff --git a/lib/spack/spack/compilers/clang.py b/lib/spack/spack/compilers/clang.py deleted file mode 100644 index 0e0e827de5e..00000000000 --- a/lib/spack/spack/compilers/clang.py +++ /dev/null @@ -1,191 +0,0 @@ -# Copyright Spack Project Developers. See COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -import os -import re - -import llnl.util.lang - -from spack.compiler import Compiler, UnsupportedCompilerFlag -from spack.version import Version - -#: compiler symlink mappings for mixed f77 compilers -f77_mapping = [ - ("gfortran", os.path.join("clang", "gfortran")), - ("xlf_r", os.path.join("xl_r", "xlf_r")), - ("xlf", os.path.join("xl", "xlf")), - ("ifort", os.path.join("intel", "ifort")), -] - -#: compiler symlink mappings for mixed f90/fc compilers -fc_mapping = [ - ("gfortran", os.path.join("clang", "gfortran")), - ("xlf90_r", os.path.join("xl_r", "xlf90_r")), - ("xlf90", os.path.join("xl", "xlf90")), - ("ifort", os.path.join("intel", "ifort")), -] - - -class Clang(Compiler): - version_argument = "--version" - - @property - def debug_flags(self): - return [ - "-gcodeview", - "-gdwarf-2", - "-gdwarf-3", - "-gdwarf-4", - "-gdwarf-5", - "-gline-tables-only", - "-gmodules", - "-g", - ] - - @property - def opt_flags(self): - return ["-O0", "-O1", "-O2", "-O3", "-Ofast", "-Os", "-Oz", "-Og", "-O", "-O4"] - - # Clang has support for using different fortran compilers with the - # clang executable. - @property - def link_paths(self): - # clang links are always the same - link_paths = { - "cc": os.path.join("clang", "clang"), - "cxx": os.path.join("clang", "clang++"), - } - - # fortran links need to look at the actual compiler names from - # compilers.yaml to figure out which named symlink to use - for compiler_name, link_path in f77_mapping: - if self.f77 and compiler_name in self.f77: - link_paths["f77"] = link_path - break - else: - link_paths["f77"] = os.path.join("clang", "flang") - - for compiler_name, link_path in fc_mapping: - if self.fc and compiler_name in self.fc: - link_paths["fc"] = link_path - break - else: - link_paths["fc"] = os.path.join("clang", "flang") - - return link_paths - - @property - def verbose_flag(self): - return "-v" - - openmp_flag = "-fopenmp" - - # C++ flags based on CMake Modules/Compiler/Clang.cmake - - @property - def cxx11_flag(self): - if self.real_version < Version("3.3"): - raise UnsupportedCompilerFlag(self, "the C++11 standard", "cxx11_flag", "< 3.3") - return "-std=c++11" - - @property - def cxx14_flag(self): - if self.real_version < Version("3.4"): - raise UnsupportedCompilerFlag(self, "the C++14 standard", "cxx14_flag", "< 3.5") - elif self.real_version < Version("3.5"): - return "-std=c++1y" - - return "-std=c++14" - - @property - def cxx17_flag(self): - if self.real_version < Version("3.5"): - raise UnsupportedCompilerFlag(self, "the C++17 standard", "cxx17_flag", "< 3.5") - elif self.real_version < Version("5.0"): - return "-std=c++1z" - - return "-std=c++17" - - @property - def cxx20_flag(self): - if self.real_version < Version("5.0"): - raise UnsupportedCompilerFlag(self, "the C++20 standard", "cxx20_flag", "< 5.0") - elif self.real_version < Version("11.0"): - return "-std=c++2a" - else: - return "-std=c++20" - - @property - def cxx23_flag(self): - if self.real_version < Version("12.0"): - raise UnsupportedCompilerFlag(self, "the C++23 standard", "cxx23_flag", "< 12.0") - elif self.real_version < Version("17.0"): - return "-std=c++2b" - else: - return "-std=c++23" - - @property - def c99_flag(self): - return "-std=c99" - - @property - def c11_flag(self): - if self.real_version < Version("3.0"): - raise UnsupportedCompilerFlag(self, "the C11 standard", "c11_flag", "< 3.0") - if self.real_version < Version("3.1"): - return "-std=c1x" - return "-std=c11" - - @property - def c17_flag(self): - if self.real_version < Version("6.0"): - raise UnsupportedCompilerFlag(self, "the C17 standard", "c17_flag", "< 6.0") - return "-std=c17" - - @property - def c23_flag(self): - if self.real_version < Version("9.0"): - raise UnsupportedCompilerFlag(self, "the C23 standard", "c23_flag", "< 9.0") - elif self.real_version < Version("18.0"): - return "-std=c2x" - else: - return "-std=c23" - - @property - def cc_pic_flag(self): - return "-fPIC" - - @property - def cxx_pic_flag(self): - return "-fPIC" - - @property - def f77_pic_flag(self): - return "-fPIC" - - @property - def fc_pic_flag(self): - return "-fPIC" - - required_libs = ["libclang"] - - @classmethod - @llnl.util.lang.memoized - def extract_version_from_output(cls, output): - ver = "unknown" - if ("Apple" in output) or ("AMD" in output): - return ver - - match = re.search( - # Normal clang compiler versions are left as-is - r"(?:clang|flang-new) version ([^ )\n]+)-svn[~.\w\d-]*|" - # Don't include hyphenated patch numbers in the version - # (see https://github.com/spack/spack/pull/14365 for details) - r"(?:clang|flang-new) version ([^ )\n]+?)-[~.\w\d-]*|" - r"(?:clang|flang-new) version ([^ )\n]+)", - output, - ) - if match: - ver = match.group(match.lastindex) - return ver diff --git a/lib/spack/spack/compilers/config.py b/lib/spack/spack/compilers/config.py new file mode 100644 index 00000000000..8214428278b --- /dev/null +++ b/lib/spack/spack/compilers/config.py @@ -0,0 +1,370 @@ +# Copyright Spack Project Developers. See COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +"""This module contains functions related to finding compilers on the system, +and configuring Spack to use multiple compilers. +""" +import os +import re +import sys +from typing import Any, Dict, List, Optional, Tuple + +import archspec.cpu + +import llnl.util.filesystem as fs +import llnl.util.lang +import llnl.util.tty as tty + +import spack.config +import spack.detection +import spack.detection.path +import spack.error +import spack.platforms +import spack.repo +import spack.spec +from spack.operating_systems import windows_os +from spack.util.environment import get_path + +#: Tag used to identify packages providing a compiler +COMPILER_TAG = "compiler" + + +def compiler_config_files(): + config_files = [] + configuration = spack.config.CONFIG + for scope in configuration.writable_scopes: + name = scope.name + + from_packages_yaml = CompilerFactory.from_packages_yaml(configuration, scope=name) + if from_packages_yaml: + config_files.append(configuration.get_config_filename(name, "packages")) + + return config_files + + +def add_compiler_to_config(new_compilers, *, scope=None) -> None: + """Add a Compiler object to the configuration, at the required scope.""" + by_name: Dict[str, List[spack.spec.Spec]] = {} + for x in new_compilers: + by_name.setdefault(x.name, []).append(x) + + spack.detection.update_configuration(by_name, buildable=True, scope=scope) + + +def find_compilers( + path_hints: Optional[List[str]] = None, + *, + scope: Optional[str] = None, + max_workers: Optional[int] = None, +) -> List[spack.spec.Spec]: + """Searches for compiler in the paths given as argument. If any new compiler is found, the + configuration is updated, and the list of new compiler objects is returned. + + Args: + path_hints: list of path hints where to look for. A sensible default based on the ``PATH`` + environment variable will be used if the value is None + scope: configuration scope to modify + max_workers: number of processes used to search for compilers + """ + if path_hints is None: + path_hints = get_path("PATH") + default_paths = fs.search_paths_for_executables(*path_hints) + if sys.platform == "win32": + default_paths.extend(windows_os.WindowsOs().compiler_search_paths) + compiler_pkgs = spack.repo.PATH.packages_with_tags(COMPILER_TAG, full=True) + + detected_packages = spack.detection.by_path( + compiler_pkgs, path_hints=default_paths, max_workers=max_workers + ) + + new_compilers = spack.detection.update_configuration( + detected_packages, buildable=True, scope=scope + ) + return new_compilers + + +def select_new_compilers( + candidates: List[spack.spec.Spec], *, scope: Optional[str] = None +) -> List[spack.spec.Spec]: + """Given a list of compilers, remove those that are already defined in + the configuration. + """ + compilers_in_config = all_compilers_from(configuration=spack.config.CONFIG, scope=scope) + return [c for c in candidates if c not in compilers_in_config] + + +def supported_compilers() -> List[str]: + """Returns all the currently supported compiler packages""" + return sorted(spack.repo.PATH.packages_with_tags(COMPILER_TAG)) + + +def all_compilers(scope: Optional[str] = None, init_config: bool = True) -> List[spack.spec.Spec]: + """Returns all the compilers from the current global configuration. + + Args: + scope: configuration scope from which to extract the compilers. If None, the merged + configuration is used. + init_config: if True, search for compilers if none is found in configuration. + """ + compilers = all_compilers_from(configuration=spack.config.CONFIG, scope=scope) + + if not compilers and init_config: + _init_packages_yaml(spack.config.CONFIG, scope=scope) + compilers = all_compilers_from(configuration=spack.config.CONFIG, scope=scope) + + return compilers + + +def _init_packages_yaml( + configuration: spack.config.Configuration, *, scope: Optional[str] +) -> None: + # Try importing from compilers.yaml + legacy_compilers = CompilerFactory.from_compilers_yaml(configuration, scope=scope) + if legacy_compilers: + by_name: Dict[str, List[spack.spec.Spec]] = {} + for legacy in legacy_compilers: + by_name.setdefault(legacy.name, []).append(legacy) + spack.detection.update_configuration(by_name, buildable=True, scope=scope) + tty.info( + "Compilers have been converted from 'compilers.yaml' and written to " + "'packages.yaml'. Use of 'compilers.yaml' is deprecated, and will be " + "ignored in future versions of Spack" + ) + return + + # Look for compilers in PATH + new_compilers = find_compilers(scope=scope) + if not new_compilers: + raise NoAvailableCompilerError( + "no compiler configured, and Spack cannot find working compilers in PATH" + ) + tty.info("Compilers have been configured automatically from PATH inspection") + + +def all_compilers_from( + configuration: spack.config.Configuration, scope: Optional[str] = None +) -> List[spack.spec.Spec]: + """Returns all the compilers from the current global configuration. + + Args: + configuration: configuration to be queried + scope: configuration scope from which to extract the compilers. If None, the merged + configuration is used. + """ + compilers = CompilerFactory.from_packages_yaml(configuration, scope=scope) + return compilers + + +class CompilerRemover: + """Removes compiler from configuration.""" + + def __init__(self, configuration: spack.config.Configuration) -> None: + self.configuration = configuration + self.marked_packages_yaml: List[Tuple[str, Any]] = [] + + def mark_compilers(self, *, match: str, scope: Optional[str] = None) -> List[spack.spec.Spec]: + """Marks compilers to be removed in configuration, and returns a corresponding list + of specs. + + Args: + match: constraint that the compiler must match to be removed. + scope: scope where to remove the compiler. If None, all writeable scopes are checked. + """ + self.marked_packages_yaml = [] + candidate_scopes = [scope] + if scope is None: + candidate_scopes = [x.name for x in self.configuration.writable_scopes] + + return self._mark_in_packages_yaml(match, candidate_scopes) + + def _mark_in_packages_yaml(self, match, candidate_scopes): + compiler_package_names = supported_compilers() + all_removals = [] + for current_scope in candidate_scopes: + packages_yaml = self.configuration.get("packages", scope=current_scope) + if not packages_yaml: + continue + + removed_from_scope = [] + for name, entry in packages_yaml.items(): + if name not in compiler_package_names: + continue + + externals_config = entry.get("externals", None) + if not externals_config: + continue + + def _partition_match(external_yaml): + s = CompilerFactory.from_external_yaml(external_yaml) + return not s.satisfies(match) + + to_keep, to_remove = llnl.util.lang.stable_partition( + externals_config, _partition_match + ) + if not to_remove: + continue + + removed_from_scope.extend(to_remove) + entry["externals"] = to_keep + + if not removed_from_scope: + continue + + self.marked_packages_yaml.append((current_scope, packages_yaml)) + all_removals.extend( + [CompilerFactory.from_external_yaml(x) for x in removed_from_scope] + ) + return all_removals + + def flush(self): + """Removes from configuration the specs that have been marked by the previous call + of ``remove_compilers``. + """ + for scope, packages_yaml in self.marked_packages_yaml: + self.configuration.set("packages", packages_yaml, scope=scope) + + +def compilers_for_arch( + arch_spec: spack.spec.ArchSpec, *, scope: Optional[str] = None +) -> List[spack.spec.Spec]: + """Returns the compilers that can be used on the input architecture""" + compilers = all_compilers_from(spack.config.CONFIG, scope=scope) + query = f"platform={arch_spec.platform} target=:{arch_spec.target}" + return [x for x in compilers if x.satisfies(query)] + + +_EXTRA_ATTRIBUTES_KEY = "extra_attributes" + + +def name_os_target(spec: spack.spec.Spec) -> Tuple[str, str, str]: + if not spec.architecture: + host_platform = spack.platforms.host() + operating_system = host_platform.operating_system("default_os") + target = host_platform.target("default_target") + else: + target = spec.architecture.target + if not target: + target = spack.platforms.host().target("default_target") + target = target + + operating_system = spec.os + if not operating_system: + host_platform = spack.platforms.host() + operating_system = host_platform.operating_system("default_os") + + return spec.name, str(operating_system), str(target) + + +class CompilerFactory: + """Class aggregating all ways of constructing a list of compiler specs from config entries.""" + + _PACKAGES_YAML_CACHE: Dict[str, Optional[spack.spec.Spec]] = {} + _GENERIC_TARGET = None + + @staticmethod + def from_packages_yaml( + configuration: spack.config.Configuration, *, scope: Optional[str] = None + ) -> List[spack.spec.Spec]: + """Returns the compiler specs defined in the "packages" section of the configuration""" + compilers = [] + compiler_package_names = supported_compilers() + packages_yaml = configuration.get("packages", scope=scope) + for name, entry in packages_yaml.items(): + if name not in compiler_package_names: + continue + + externals_config = entry.get("externals", None) + if not externals_config: + continue + + compiler_specs = [] + for current_external in externals_config: + key = str(current_external) + if key not in CompilerFactory._PACKAGES_YAML_CACHE: + CompilerFactory._PACKAGES_YAML_CACHE[key] = CompilerFactory.from_external_yaml( + current_external + ) + + compiler = CompilerFactory._PACKAGES_YAML_CACHE[key] + if compiler: + compiler_specs.append(compiler) + + compilers.extend(compiler_specs) + return compilers + + @staticmethod + def from_external_yaml(config: Dict[str, Any]) -> Optional[spack.spec.Spec]: + """Returns a compiler spec from an external definition from packages.yaml.""" + # Allow `@x.y.z` instead of `@=x.y.z` + err_header = f"The external spec '{config['spec']}' cannot be used as a compiler" + # If extra_attributes is not there I might not want to use this entry as a compiler, + # therefore just leave a debug message, but don't be loud with a warning. + if _EXTRA_ATTRIBUTES_KEY not in config: + tty.debug(f"[{__file__}] {err_header}: missing the '{_EXTRA_ATTRIBUTES_KEY}' key") + return None + extra_attributes = config[_EXTRA_ATTRIBUTES_KEY] + result = spack.spec.Spec( + str(spack.spec.parse_with_version_concrete(config["spec"])), + external_path=config.get("prefix"), + external_modules=config.get("modules"), + ) + result.extra_attributes = extra_attributes + CompilerFactory._finalize_external_concretization(result) + return result + + @staticmethod + def _finalize_external_concretization(abstract_spec): + if CompilerFactory._GENERIC_TARGET is None: + CompilerFactory._GENERIC_TARGET = archspec.cpu.host().family + + if abstract_spec.architecture: + abstract_spec.architecture.complete_with_defaults() + else: + abstract_spec.constrain(spack.spec.Spec.default_arch()) + abstract_spec.architecture.target = CompilerFactory._GENERIC_TARGET + abstract_spec._finalize_concretization() + + @staticmethod + def from_legacy_yaml(compiler_dict: Dict[str, Any]) -> List[spack.spec.Spec]: + """Returns a list of external specs, corresponding to a compiler entry + from compilers.yaml. + """ + result = [] + candidate_paths = [x for x in compiler_dict["paths"].values() if x is not None] + finder = spack.detection.path.ExecutablesFinder() + + for pkg_name in spack.repo.PATH.packages_with_tags("compiler"): + pkg_cls = spack.repo.PATH.get_pkg_class(pkg_name) + pattern = re.compile(r"|".join(finder.search_patterns(pkg=pkg_cls))) + filtered_paths = [x for x in candidate_paths if pattern.search(os.path.basename(x))] + detected = finder.detect_specs(pkg=pkg_cls, paths=filtered_paths) + for s in detected: + for key in ("flags", "environment", "extra_rpaths"): + if key in compiler_dict: + s.extra_attributes[key] = compiler_dict[key] + + if "modules" in compiler_dict: + s.external_modules = list(compiler_dict["modules"]) + + result.extend(detected) + + return result + + @staticmethod + def from_compilers_yaml( + configuration: spack.config.Configuration, *, scope: Optional[str] = None + ) -> List[spack.spec.Spec]: + """Returns the compiler specs defined in the "compilers" section of the configuration""" + result: List[spack.spec.Spec] = [] + for item in configuration.get("compilers", scope=scope): + result.extend(CompilerFactory.from_legacy_yaml(item["compiler"])) + return result + + +class UnknownCompilerError(spack.error.SpackError): + def __init__(self, compiler_name): + super().__init__(f"Spack doesn't support the requested compiler: {compiler_name}") + + +class NoAvailableCompilerError(spack.error.SpackError): + pass diff --git a/lib/spack/spack/compilers/error.py b/lib/spack/spack/compilers/error.py new file mode 100644 index 00000000000..849208640e9 --- /dev/null +++ b/lib/spack/spack/compilers/error.py @@ -0,0 +1,18 @@ +# Copyright Spack Project Developers. See COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +from ..error import SpackError + + +class CompilerAccessError(SpackError): + def __init__(self, compiler, paths): + super().__init__( + f"Compiler '{compiler.spec}' has executables that are missing" + f" or are not executable: {paths}" + ) + + +class UnsupportedCompilerFlag(SpackError): + """Raised when a compiler does not support a flag type (e.g. a flag to enforce a + language standard). + """ diff --git a/lib/spack/spack/compilers/fj.py b/lib/spack/spack/compilers/fj.py deleted file mode 100644 index 85c94130d49..00000000000 --- a/lib/spack/spack/compilers/fj.py +++ /dev/null @@ -1,78 +0,0 @@ -# Copyright Spack Project Developers. See COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -import os - -import spack.compiler - - -class Fj(spack.compiler.Compiler): - # Named wrapper links within build_env_path - link_paths = { - "cc": os.path.join("fj", "fcc"), - "cxx": os.path.join("fj", "case-insensitive", "FCC"), - "f77": os.path.join("fj", "frt"), - "fc": os.path.join("fj", "frt"), - } - - version_argument = "--version" - version_regex = r"\((?:FCC|FRT)\) ([a-z\d.]+)" - - required_libs = ["libfj90i", "libfj90f", "libfjsrcinfo"] - - @property - def verbose_flag(self): - return "-v" - - @property - def debug_flags(self): - return "-g" - - @property - def opt_flags(self): - return ["-O0", "-O1", "-O2", "-O3", "-Ofast"] - - @property - def openmp_flag(self): - return "-Kopenmp" - - @property - def cxx98_flag(self): - return "-std=c++98" - - @property - def cxx11_flag(self): - return "-std=c++11" - - @property - def cxx14_flag(self): - return "-std=c++14" - - @property - def cxx17_flag(self): - return "-std=c++17" - - @property - def c99_flag(self): - return "-std=c99" - - @property - def c11_flag(self): - return "-std=c11" - - @property - def cc_pic_flag(self): - return "-KPIC" - - @property - def cxx_pic_flag(self): - return "-KPIC" - - @property - def f77_pic_flag(self): - return "-KPIC" - - @property - def fc_pic_flag(self): - return "-KPIC" diff --git a/lib/spack/spack/compilers/flags.py b/lib/spack/spack/compilers/flags.py new file mode 100644 index 00000000000..60e8dcff206 --- /dev/null +++ b/lib/spack/spack/compilers/flags.py @@ -0,0 +1,25 @@ +# Copyright Spack Project Developers. See COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +from typing import List, Tuple + + +def tokenize_flags(flags_values: str, propagate: bool = False) -> List[Tuple[str, bool]]: + """Given a compiler flag specification as a string, this returns a list + where the entries are the flags. For compiler options which set values + using the syntax "-flag value", this function groups flags and their + values together. Any token not preceded by a "-" is considered the + value of a prior flag.""" + tokens = flags_values.split() + if not tokens: + return [] + flag = tokens[0] + flags_with_propagation = [] + for token in tokens[1:]: + if not token.startswith("-"): + flag += " " + token + else: + flags_with_propagation.append((flag, propagate)) + flag = token + flags_with_propagation.append((flag, propagate)) + return flags_with_propagation diff --git a/lib/spack/spack/compilers/gcc.py b/lib/spack/spack/compilers/gcc.py deleted file mode 100644 index db1f9eec26a..00000000000 --- a/lib/spack/spack/compilers/gcc.py +++ /dev/null @@ -1,190 +0,0 @@ -# Copyright Spack Project Developers. See COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -import os - -from llnl.util.filesystem import ancestor - -import spack.compiler -import spack.compilers.apple_clang as apple_clang -import spack.util.executable -from spack.version import Version - - -class Gcc(spack.compiler.Compiler): - # 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. - suffixes = [r"-mp-\d+(?:\.\d+)?", r"-\d+(?:\.\d+)?", r"\d\d"] - - # Named wrapper links within build_env_path - link_paths = { - "cc": os.path.join("gcc", "gcc"), - "cxx": os.path.join("gcc", "g++"), - "f77": os.path.join("gcc", "gfortran"), - "fc": os.path.join("gcc", "gfortran"), - } - - @property - def verbose_flag(self): - return "-v" - - @property - def debug_flags(self): - return ["-g", "-gstabs+", "-gstabs", "-gxcoff+", "-gxcoff", "-gvms"] - - @property - def opt_flags(self): - return ["-O", "-O0", "-O1", "-O2", "-O3", "-Os", "-Ofast", "-Og"] - - @property - def openmp_flag(self): - return "-fopenmp" - - @property - def cxx98_flag(self): - if self.real_version < Version("6.0"): - return "" - else: - return "-std=c++98" - - @property - def cxx11_flag(self): - if self.real_version < Version("4.3"): - raise spack.compiler.UnsupportedCompilerFlag( - self, "the C++11 standard", "cxx11_flag", " < 4.3" - ) - elif self.real_version < Version("4.7"): - return "-std=c++0x" - else: - return "-std=c++11" - - @property - def cxx14_flag(self): - if self.real_version < Version("4.8"): - raise spack.compiler.UnsupportedCompilerFlag( - self, "the C++14 standard", "cxx14_flag", "< 4.8" - ) - elif self.real_version < Version("4.9"): - return "-std=c++1y" - else: - return "-std=c++14" - - @property - def cxx17_flag(self): - if self.real_version < Version("5.0"): - raise spack.compiler.UnsupportedCompilerFlag( - self, "the C++17 standard", "cxx17_flag", "< 5.0" - ) - elif self.real_version < Version("6.0"): - return "-std=c++1z" - else: - return "-std=c++17" - - @property - def cxx20_flag(self): - if self.real_version < Version("8.0"): - raise spack.compiler.UnsupportedCompilerFlag( - self, "the C++20 standard", "cxx20_flag", "< 8.0" - ) - elif self.real_version < Version("11.0"): - return "-std=c++2a" - else: - return "-std=c++20" - - @property - def cxx23_flag(self): - if self.real_version < Version("11.0"): - raise spack.compiler.UnsupportedCompilerFlag( - self, "the C++23 standard", "cxx23_flag", "< 11.0" - ) - elif self.real_version < Version("14.0"): - return "-std=c++2b" - else: - return "-std=c++23" - - @property - def c99_flag(self): - if self.real_version < Version("4.5"): - raise spack.compiler.UnsupportedCompilerFlag( - self, "the C99 standard", "c99_flag", "< 4.5" - ) - return "-std=c99" - - @property - def c11_flag(self): - if self.real_version < Version("4.7"): - raise spack.compiler.UnsupportedCompilerFlag( - self, "the C11 standard", "c11_flag", "< 4.7" - ) - return "-std=c11" - - @property - def cc_pic_flag(self): - return "-fPIC" - - @property - def cxx_pic_flag(self): - return "-fPIC" - - @property - def f77_pic_flag(self): - return "-fPIC" - - @property - def fc_pic_flag(self): - return "-fPIC" - - required_libs = ["libgcc", "libgfortran"] - - @classmethod - def default_version(cls, cc): - """Older versions of gcc use the ``-dumpversion`` option. - Output looks like this:: - - 4.4.7 - - 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 - """ - # Apple's gcc is actually apple clang, so skip it. Returning - # "unknown" ensures this compiler is not detected by default. - # Users can add it manually to compilers.yaml at their own risk. - if apple_clang.AppleClang.default_version(cc) != "unknown": - return "unknown" - - version = super(Gcc, cls).default_version(cc) - if Version(version) >= Version("7"): - output = spack.compiler.get_compiler_version_output(cc, "-dumpfullversion") - version = cls.extract_version_from_output(output) - return version - - @property - def stdcxx_libs(self): - return ("-lstdc++",) - - @property - def prefix(self): - # GCC reports its install prefix when running ``-print-search-dirs`` - # on the first line ``install: ``. - cc = spack.util.executable.Executable(self.cc) - with self.compiler_environment(): - gcc_output = cc("-print-search-dirs", output=str, error=str) - - for line in gcc_output.splitlines(): - if line.startswith("install:"): - gcc_prefix = line.split(":")[1].strip() - # Go from /lib/gcc/// to - return ancestor(gcc_prefix, 4) - - raise RuntimeError( - "could not find install prefix of GCC from output:\n\t{}".format(gcc_output) - ) diff --git a/lib/spack/spack/compilers/intel.py b/lib/spack/spack/compilers/intel.py deleted file mode 100644 index f20e263d051..00000000000 --- a/lib/spack/spack/compilers/intel.py +++ /dev/null @@ -1,130 +0,0 @@ -# Copyright Spack Project Developers. See COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -import os -import sys - -from spack.compiler import Compiler, UnsupportedCompilerFlag -from spack.version import Version - - -class Intel(Compiler): - # Named wrapper links within build_env_path - link_paths = { - "cc": os.path.join("intel", "icc"), - "cxx": os.path.join("intel", "icpc"), - "f77": os.path.join("intel", "ifort"), - "fc": os.path.join("intel", "ifort"), - } - - if sys.platform == "win32": - version_argument = "/QV" - else: - version_argument = "--version" - - if sys.platform == "win32": - version_regex = r"([1-9][0-9]*\.[0-9]*\.[0-9]*)" - else: - version_regex = r"\((?:IFORT|ICC)\) ([^ ]+)" - - @property - def verbose_flag(self): - return "-v" - - required_libs = ["libirc", "libifcore", "libifcoremt", "libirng"] - - @property - def debug_flags(self): - return ["-debug", "-g", "-g0", "-g1", "-g2", "-g3"] - - @property - def opt_flags(self): - return ["-O", "-O0", "-O1", "-O2", "-O3", "-Ofast", "-Os"] - - @property - def openmp_flag(self): - if self.real_version < Version("16.0"): - return "-openmp" - else: - return "-qopenmp" - - @property - def cxx11_flag(self): - if self.real_version < Version("11.1"): - raise UnsupportedCompilerFlag(self, "the C++11 standard", "cxx11_flag", "< 11.1") - - elif self.real_version < Version("13"): - return "-std=c++0x" - else: - return "-std=c++11" - - @property - def cxx14_flag(self): - # Adapted from CMake's Intel-CXX rules. - if self.real_version < Version("15"): - raise UnsupportedCompilerFlag(self, "the C++14 standard", "cxx14_flag", "< 15") - elif self.real_version < Version("15.0.2"): - return "-std=c++1y" - else: - return "-std=c++14" - - @property - def cxx17_flag(self): - # https://www.intel.com/content/www/us/en/developer/articles/news/c17-features-supported-by-c-compiler.html - if self.real_version < Version("19"): - raise UnsupportedCompilerFlag(self, "the C++17 standard", "cxx17_flag", "< 19") - else: - return "-std=c++17" - - @property - def c99_flag(self): - if self.real_version < Version("12"): - raise UnsupportedCompilerFlag(self, "the C99 standard", "c99_flag", "< 12") - else: - return "-std=c99" - - @property - def c11_flag(self): - if self.real_version < Version("16"): - raise UnsupportedCompilerFlag(self, "the C11 standard", "c11_flag", "< 16") - 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" - - @property - def cxx_pic_flag(self): - return "-fPIC" - - @property - def f77_pic_flag(self): - return "-fPIC" - - @property - def fc_pic_flag(self): - return "-fPIC" - - @property - def stdcxx_libs(self): - return ("-cxxlib",) - - def setup_custom_environment(self, pkg, env): - # Edge cases for Intel's oneAPI compilers when using the legacy classic compilers: - # Always pass flags to disable deprecation warnings, since these warnings can - # confuse tools that parse the output of compiler commands (e.g. version checks). - if self.real_version >= Version("2021") and self.real_version < Version("2024"): - env.append_flags("SPACK_ALWAYS_CFLAGS", "-diag-disable=10441") - env.append_flags("SPACK_ALWAYS_CXXFLAGS", "-diag-disable=10441") - if self.real_version >= Version("2021") and self.real_version < Version("2025"): - env.append_flags("SPACK_ALWAYS_FFLAGS", "-diag-disable=10448") diff --git a/lib/spack/spack/compilers/libraries.py b/lib/spack/spack/compilers/libraries.py new file mode 100644 index 00000000000..ca6f739a889 --- /dev/null +++ b/lib/spack/spack/compilers/libraries.py @@ -0,0 +1,431 @@ +# Copyright Spack Project Developers. See COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +import contextlib +import hashlib +import json +import os +import re +import shutil +import stat +import sys +import tempfile +from typing import Dict, List, Optional, Set, Tuple + +import llnl.path +import llnl.util.lang +from llnl.util import tty +from llnl.util.filesystem import path_contains_subdirectory, paths_containing_libs + +import spack.caches +import spack.schema.environment +import spack.spec +import spack.util.executable +import spack.util.libc +import spack.util.module_cmd +from spack.util.environment import filter_system_paths +from spack.util.file_cache import FileCache + +#: regex for parsing linker lines +_LINKER_LINE = re.compile(r"^( *|.*[/\\])" r"(link|ld|([^/\\]+-)?ld|collect2)" r"[^/\\]*( |$)") + +#: components of linker lines to ignore +_LINKER_LINE_IGNORE = re.compile(r"(collect2 version|^[A-Za-z0-9_]+=|/ldfe )") + +#: regex to match linker search paths +_LINK_DIR_ARG = re.compile(r"^-L(.:)?(?P[/\\].*)") + +#: regex to match linker library path arguments +_LIBPATH_ARG = re.compile(r"^[-/](LIBPATH|libpath):(?P.*)") + + +@llnl.path.system_path_filter +def parse_non_system_link_dirs(compiler_debug_output: str) -> List[str]: + """Parses link paths out of compiler debug output. + + Args: + compiler_debug_output: compiler debug output as a string + + Returns: + Implicit link paths parsed from the compiler output + """ + link_dirs = _parse_link_paths(compiler_debug_output) + + # Remove directories that do not exist. Some versions of the Cray compiler + # report nonexistent directories + link_dirs = filter_non_existing_dirs(link_dirs) + + # Return set of directories containing needed compiler libs, minus + # system paths. Note that 'filter_system_paths' only checks for an + # exact match, while 'in_system_subdirectory' checks if a path contains + # a system directory as a subdirectory + link_dirs = filter_system_paths(link_dirs) + return list(p for p in link_dirs if not in_system_subdirectory(p)) + + +def filter_non_existing_dirs(dirs): + return [d for d in dirs if os.path.isdir(d)] + + +def in_system_subdirectory(path): + system_dirs = [ + "/lib/", + "/lib64/", + "/usr/lib/", + "/usr/lib64/", + "/usr/local/lib/", + "/usr/local/lib64/", + ] + return any(path_contains_subdirectory(path, x) for x in system_dirs) + + +def _parse_link_paths(string): + """Parse implicit link paths from compiler debug output. + + This gives the compiler runtime library paths that we need to add to + the RPATH of generated binaries and libraries. It allows us to + ensure, e.g., that codes load the right libstdc++ for their compiler. + """ + lib_search_paths = False + raw_link_dirs = [] + for line in string.splitlines(): + if lib_search_paths: + if line.startswith("\t"): + raw_link_dirs.append(line[1:]) + continue + else: + lib_search_paths = False + elif line.startswith("Library search paths:"): + lib_search_paths = True + + if not _LINKER_LINE.match(line): + continue + if _LINKER_LINE_IGNORE.match(line): + continue + tty.debug(f"implicit link dirs: link line: {line}") + + next_arg = False + for arg in line.split(): + if arg in ("-L", "-Y"): + next_arg = True + continue + + if next_arg: + raw_link_dirs.append(arg) + next_arg = False + continue + + link_dir_arg = _LINK_DIR_ARG.match(arg) + if link_dir_arg: + link_dir = link_dir_arg.group("dir") + raw_link_dirs.append(link_dir) + + link_dir_arg = _LIBPATH_ARG.match(arg) + if link_dir_arg: + link_dir = link_dir_arg.group("dir") + raw_link_dirs.append(link_dir) + + implicit_link_dirs = list() + visited = set() + for link_dir in raw_link_dirs: + normalized_path = os.path.abspath(link_dir) + if normalized_path not in visited: + implicit_link_dirs.append(normalized_path) + visited.add(normalized_path) + + tty.debug(f"implicit link dirs: result: {', '.join(implicit_link_dirs)}") + return implicit_link_dirs + + +class CompilerPropertyDetector: + + def __init__(self, compiler_spec: spack.spec.Spec): + assert compiler_spec.concrete, "only concrete compiler specs are allowed" + self.spec = compiler_spec + self.cache = COMPILER_CACHE + + @contextlib.contextmanager + def compiler_environment(self): + """Sets the environment to run this compiler""" + + # No modifications for Spack managed compilers + if not self.spec.external: + yield + return + + # Avoid modifying os.environ if possible. + environment = self.spec.extra_attributes.get("environment", {}) + modules = self.spec.external_modules or [] + if not self.spec.external_modules and not environment: + yield + return + + # store environment to replace later + backup_env = os.environ.copy() + + try: + # load modules and set env variables + for module in modules: + spack.util.module_cmd.load_module(module) + + # apply other compiler environment changes + spack.schema.environment.parse(environment).apply_modifications() + + yield + finally: + # Restore environment regardless of whether inner code succeeded + os.environ.clear() + os.environ.update(backup_env) + + def _compile_dummy_c_source(self) -> Optional[str]: + compiler_pkg = self.spec.package + if getattr(compiler_pkg, "cc"): + cc = compiler_pkg.cc + ext = "c" + else: + cc = compiler_pkg.cxx + ext = "cc" + + if not cc or not self.spec.package.verbose_flags: + return None + + try: + tmpdir = tempfile.mkdtemp(prefix="spack-implicit-link-info") + fout = os.path.join(tmpdir, "output") + fin = os.path.join(tmpdir, f"main.{ext}") + + with open(fin, "w", encoding="utf-8") as csource: + csource.write( + "int main(int argc, char* argv[]) { (void)argc; (void)argv; return 0; }\n" + ) + cc_exe = spack.util.executable.Executable(cc) + + if self.spec.external: + compiler_flags = self.spec.extra_attributes.get("flags", {}) + for flag_type in [ + "cflags" if cc == compiler_pkg.cc else "cxxflags", + "cppflags", + "ldflags", + ]: + current_flags = compiler_flags.get(flag_type, "").strip() + if current_flags: + cc_exe.add_default_arg(*current_flags.split(" ")) + + with self.compiler_environment(): + return cc_exe("-v", fin, "-o", fout, output=str, error=str) + except spack.util.executable.ProcessError as pe: + tty.debug(f"ProcessError: Command exited with non-zero status: {pe.long_message}") + return None + finally: + shutil.rmtree(tmpdir, ignore_errors=True) + + def compiler_verbose_output(self) -> Optional[str]: + return self.cache.get(self.spec).c_compiler_output + + def default_dynamic_linker(self) -> Optional[str]: + output = self.compiler_verbose_output() + + if not output: + return None + + return spack.util.libc.parse_dynamic_linker(output) + + def default_libc(self) -> Optional[spack.spec.Spec]: + """Determine libc targeted by the compiler from link line""" + # technically this should be testing the target platform of the compiler, but we don't have + # that, so stick to host platform for now. + if sys.platform in ("darwin", "win32"): + return None + + dynamic_linker = self.default_dynamic_linker() + + if dynamic_linker is None: + return None + + return spack.util.libc.libc_from_dynamic_linker(dynamic_linker) + + def implicit_rpaths(self) -> List[str]: + output = self.compiler_verbose_output() + if output is None: + return [] + + link_dirs = parse_non_system_link_dirs(output) + all_required_libs = list(self.spec.package.implicit_rpath_libs) + [ + "libc", + "libc++", + "libstdc++", + ] + dynamic_linker = self.default_dynamic_linker() + result = DefaultDynamicLinkerFilter(dynamic_linker)( + paths_containing_libs(link_dirs, all_required_libs) + ) + return list(result) + + +class DefaultDynamicLinkerFilter: + """Remove rpaths to directories that are default search paths of the dynamic linker.""" + + _CACHE: Dict[Optional[str], Set[Tuple[int, int]]] = {} + + def __init__(self, dynamic_linker: Optional[str]) -> None: + if dynamic_linker not in DefaultDynamicLinkerFilter._CACHE: + # Identify directories by (inode, device) tuple, which handles symlinks too. + default_path_identifiers: Set[Tuple[int, int]] = set() + if not dynamic_linker: + self.default_path_identifiers = None + 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): + default_path_identifiers.add((s.st_ino, s.st_dev)) + except OSError: + continue + + DefaultDynamicLinkerFilter._CACHE[dynamic_linker] = default_path_identifiers + + self.default_path_identifiers = DefaultDynamicLinkerFilter._CACHE[dynamic_linker] + + def is_dynamic_loader_default_path(self, p: str) -> bool: + if self.default_path_identifiers is None: + return False + 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 dynamic_linker_filter_for(node: spack.spec.Spec) -> Optional[DefaultDynamicLinkerFilter]: + compiler = compiler_spec(node) + if compiler is None: + return None + detector = CompilerPropertyDetector(compiler) + dynamic_linker = detector.default_dynamic_linker() + if dynamic_linker is None: + return None + return DefaultDynamicLinkerFilter(dynamic_linker) + + +def compiler_spec(node: spack.spec.Spec) -> Optional[spack.spec.Spec]: + """Returns the compiler spec associated with the node passed as argument. + + The function looks for a "c", "cxx", and "fortran" compiler in that order, + and returns the first found. If none is found, returns None. + """ + for language in ("c", "cxx", "fortran"): + candidates = node.dependencies(virtuals=[language]) + if candidates: + break + else: + return None + + return candidates[0] + + +class CompilerCacheEntry: + """Deserialized cache entry for a compiler""" + + __slots__ = ("c_compiler_output",) + + def __init__(self, c_compiler_output: Optional[str]): + self.c_compiler_output = c_compiler_output + + @property + def empty(self) -> bool: + """Sometimes the compiler is temporarily broken, preventing us from getting output. The + call site determines if that is a problem.""" + return self.c_compiler_output is None + + @classmethod + def from_dict(cls, data: Dict[str, Optional[str]]): + if not isinstance(data, dict): + raise ValueError(f"Invalid {cls.__name__} data") + c_compiler_output = data.get("c_compiler_output") + if not isinstance(c_compiler_output, (str, type(None))): + raise ValueError(f"Invalid {cls.__name__} data") + return cls(c_compiler_output) + + +class CompilerCache: + """Base class for compiler output cache. Default implementation does not cache anything.""" + + def value(self, compiler: spack.spec.Spec) -> Dict[str, Optional[str]]: + return {"c_compiler_output": CompilerPropertyDetector(compiler)._compile_dummy_c_source()} + + def get(self, compiler: spack.spec.Spec) -> CompilerCacheEntry: + return CompilerCacheEntry.from_dict(self.value(compiler)) + + +class FileCompilerCache(CompilerCache): + """Cache for compiler output, which is used to determine implicit link paths, the default libc + version, and the compiler version.""" + + name = os.path.join("compilers", "compilers.json") + + def __init__(self, cache: "FileCache") -> None: + self.cache = cache + self.cache.init_entry(self.name) + self._data: Dict[str, Dict[str, Optional[str]]] = {} + + def _get_entry(self, key: str, *, allow_empty: bool) -> Optional[CompilerCacheEntry]: + try: + entry = CompilerCacheEntry.from_dict(self._data[key]) + return entry if allow_empty or not entry.empty else None + except ValueError: + del self._data[key] + except KeyError: + pass + return None + + def get(self, compiler: spack.spec.Spec) -> CompilerCacheEntry: + # Cache hit + try: + with self.cache.read_transaction(self.name) as f: + assert f is not None + self._data = json.loads(f.read()) + assert isinstance(self._data, dict) + except (json.JSONDecodeError, AssertionError): + self._data = {} + + key = self._key(compiler) + value = self._get_entry(key, allow_empty=False) + if value is not None: + return value + + # Cache miss + with self.cache.write_transaction(self.name) as (old, new): + try: + assert old is not None + self._data = json.loads(old.read()) + assert isinstance(self._data, dict) + except (json.JSONDecodeError, AssertionError): + self._data = {} + + # Use cache entry that may have been created by another process in the meantime. + entry = self._get_entry(key, allow_empty=True) + + # Finally compute the cache entry + if entry is None: + self._data[key] = self.value(compiler) + entry = CompilerCacheEntry.from_dict(self._data[key]) + + new.write(json.dumps(self._data, separators=(",", ":"))) + + return entry + + def _key(self, compiler: spack.spec.Spec) -> str: + as_bytes = json.dumps(compiler.to_dict(), separators=(",", ":")).encode("utf-8") + return hashlib.sha256(as_bytes).hexdigest() + + +def _make_compiler_cache(): + return FileCompilerCache(spack.caches.MISC_CACHE) + + +COMPILER_CACHE: CompilerCache = llnl.util.lang.Singleton(_make_compiler_cache) # type: ignore diff --git a/lib/spack/spack/compilers/msvc.py b/lib/spack/spack/compilers/msvc.py deleted file mode 100644 index 34d95606808..00000000000 --- a/lib/spack/spack/compilers/msvc.py +++ /dev/null @@ -1,393 +0,0 @@ -# Copyright Spack Project Developers. See COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -import os -import re -import subprocess -import sys -import tempfile -from typing import Dict - -import archspec.cpu - -import spack.compiler -import spack.operating_systems.windows_os -import spack.platforms -import spack.util.executable -from spack.compiler import Compiler -from spack.error import SpackError -from spack.version import Version, VersionRange - -FC_PATH: Dict[str, str] = dict() - - -class CmdCall: - """Compose a call to `cmd` for an ordered series of cmd commands/scripts""" - - def __init__(self, *cmds): - if not cmds: - raise RuntimeError( - """Attempting to run commands from CMD without specifying commands. - Please add commands to be run.""" - ) - self._cmds = cmds - - def __call__(self): - out = subprocess.check_output(self.cmd_line, stderr=subprocess.STDOUT) # novermin - return out.decode("utf-16le", errors="replace") # novermin - - @property - def cmd_line(self): - base_call = "cmd /u /c " - commands = " && ".join([x.command_str() for x in self._cmds]) - # If multiple commands are being invoked by a single subshell - # they must be encapsulated by a double quote. Always double - # quote to be sure of proper handling - # cmd will properly resolve nested double quotes as needed - # - # `set`` writes out the active env to the subshell stdout, - # and in this context we are always trying to obtain env - # state so it should always be appended - return base_call + f'"{commands} && set"' - - -class VarsInvocation: - def __init__(self, script): - self._script = script - - def command_str(self): - return f'"{self._script}"' - - @property - def script(self): - return self._script - - -class VCVarsInvocation(VarsInvocation): - def __init__(self, script, arch, msvc_version): - super(VCVarsInvocation, self).__init__(script) - self._arch = arch - self._msvc_version = msvc_version - - @property - def sdk_ver(self): - """Accessor for Windows SDK version property - - Note: This property may not be set by - the calling context and as such this property will - return an empty string - - This property will ONLY be set if the SDK package - is a dependency somewhere in the Spack DAG of the package - for which we are constructing an MSVC compiler env. - Otherwise this property should be unset to allow the VCVARS - script to use its internal heuristics to determine appropriate - SDK version - """ - if getattr(self, "_sdk_ver", None): - return self._sdk_ver + ".0" - return "" - - @sdk_ver.setter - def sdk_ver(self, val): - self._sdk_ver = val - - @property - def arch(self): - return self._arch - - @property - def vcvars_ver(self): - return f"-vcvars_ver={self._msvc_version}" - - def command_str(self): - script = super(VCVarsInvocation, self).command_str() - return f"{script} {self.arch} {self.sdk_ver} {self.vcvars_ver}" - - -def get_valid_fortran_pth(): - """Assign maximum available fortran compiler version""" - # TODO (johnwparent): validate compatibility w/ try compiler - # functionality when added - sort_fn = lambda fc_ver: Version(fc_ver) - sort_fc_ver = sorted(list(FC_PATH.keys()), key=sort_fn) - return FC_PATH[sort_fc_ver[-1]] if sort_fc_ver else None - - -class Msvc(Compiler): - # Named wrapper links within build_env_path - # Due to the challenges of supporting compiler wrappers - # in Windows, we leave these blank, and dynamically compute - # based on proper versions of MSVC from there - # pending acceptance of #28117 for full support using - # compiler wrappers - link_paths = {"cc": "", "cxx": "", "f77": "", "fc": ""} - - #: Compiler argument that produces version information - version_argument = "" - - # For getting ifx's version, call it with version_argument - # and ignore the error code - ignore_version_errors = [1] - - #: Regex used to extract version from compiler's output - version_regex = r"([1-9][0-9]*\.[0-9]*\.[0-9]*)" - # The MSVC compiler class overrides this to prevent instances - # of erroneous matching on executable names that cannot be msvc - # compilers - suffixes = [] - - is_supported_on_platform = lambda x: isinstance(x, spack.platforms.Windows) - - def __init__(self, *args, **kwargs): - # This positional argument "paths" is later parsed and process by the base class - # via the call to `super` later in this method - paths = args[3] - latest_fc = get_valid_fortran_pth() - new_pth = [pth if pth else latest_fc for pth in paths[2:]] - paths[2:] = new_pth - # Initialize, deferring to base class but then adding the vcvarsallfile - # file based on compiler executable path. - super().__init__(*args, **kwargs) - # To use the MSVC compilers, VCVARS must be invoked - # VCVARS is located at a fixed location, referencable - # idiomatically by the following relative path from the - # compiler. - # Spack first finds the compilers via VSWHERE - # and stores their path, but their respective VCVARS - # file must be invoked before useage. - env_cmds = [] - compiler_root = os.path.join(os.path.dirname(self.cc), "../../../../../..") - vcvars_script_path = os.path.join(compiler_root, "Auxiliary", "Build", "vcvars64.bat") - # get current platform architecture and format for vcvars argument - arch = spack.platforms.real_host().default.lower() - arch = arch.replace("-", "_") - if str(archspec.cpu.host().family) == "x86_64": - arch = "amd64" - - self.vcvars_call = VCVarsInvocation(vcvars_script_path, arch, self.msvc_version) - env_cmds.append(self.vcvars_call) - # Below is a check for a valid fortran path - # paths has c, cxx, fc, and f77 paths in that order - # paths[2] refers to the fc path and is a generic check - # for a fortran compiler - if paths[2]: - - def get_oneapi_root(pth: str): - """From within a prefix known to be a oneAPI path - determine the oneAPI root path from arbitrary point - under root - - Args: - pth: path prefixed within oneAPI root - """ - if not pth: - return "" - while os.path.basename(pth) and os.path.basename(pth) != "oneAPI": - pth = os.path.dirname(pth) - return pth - - # If this found, it sets all the vars - oneapi_root = get_oneapi_root(self.fc) - if not oneapi_root: - raise RuntimeError(f"Non-oneAPI Fortran compiler {self.fc} assigned to MSVC") - oneapi_root_setvars = os.path.join(oneapi_root, "setvars.bat") - # some oneAPI exes return a version more precise than their - # install paths specify, so we determine path from - # the install path rather than the fc executable itself - numver = r"\d+\.\d+(?:\.\d+)?" - pattern = f"((?:{numver})|(?:latest))" - version_from_path = re.search(pattern, self.fc).group(1) - oneapi_version_setvars = os.path.join( - oneapi_root, "compiler", version_from_path, "env", "vars.bat" - ) - # order matters here, the specific version env must be invoked first, - # otherwise it will be ignored if the root setvars sets up the oneapi - # env first - env_cmds.extend( - [VarsInvocation(oneapi_version_setvars), VarsInvocation(oneapi_root_setvars)] - ) - self.msvc_compiler_environment = CmdCall(*env_cmds) - - @property - def cxx11_flag(self): - return "/std:c++11" - - @property - def cxx14_flag(self): - return "/std:c++14" - - @property - def cxx17_flag(self): - return "/std:c++17" - - @property - def cxx20_flag(self): - return "/std:c++20" - - @property - def c11_flag(self): - return "/std:c11" - - @property - def c17_flag(self): - return "/std:c17" - - @property - def msvc_version(self): - """This is the VCToolset version *NOT* the actual version of the cl compiler - For CL version, query `Msvc.cl_version`""" - return Version(re.search(Msvc.version_regex, self.cc).group(1)) - - @property - def short_msvc_version(self): - """This is the shorthand VCToolset version of form - MSVC - """ - return "MSVC" + self.vc_toolset_ver - - @property - def vc_toolset_ver(self): - """ - The toolset version is the version of the combined set of cl and link - This typically relates directly to VS version i.e. VS 2022 is v143 - VS 19 is v142, etc. - This value is defined by the first three digits of the major + minor - version of the VS toolset (143 for 14.3x.bbbbb). Traditionally the - minor version has remained a static two digit number for a VS release - series, however, as of VS22, this is no longer true, both - 14.4x.bbbbb and 14.3x.bbbbb are considered valid VS22 VC toolset - versions due to a change in toolset minor version sentiment. - - This is *NOT* the full version, for that see - Msvc.msvc_version or MSVC.platform_toolset_ver for the - raw platform toolset version - - """ - ver = self.msvc_version[:2].joined.string[:3] - return ver - - @property - def platform_toolset_ver(self): - """ - This is the platform toolset version of current MSVC compiler - i.e. 142. The platform toolset is the targeted MSVC library/compiler - versions by compilation (this is different from the VC Toolset) - - - This is different from the VC toolset version as established - by `short_msvc_version`, but typically are represented by the same - three digit value - """ - # Typically VS toolset version and platform toolset versions match - # VS22 introduces the first divergence of VS toolset version - # (144 for "recent" releases) and platform toolset version (143) - # so it needs additional handling until MS releases v144 - # (assuming v144 is also for VS22) - # or adds better support for detection - # TODO: (johnwparent) Update this logic for the next platform toolset - # or VC toolset version update - toolset_ver = self.vc_toolset_ver - 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 - # non zero return code if it is not provided - # and input file - return Version( - re.search( - Msvc.version_regex, - spack.compiler.get_compiler_version_output( - compiler, version_arg=None, ignore_errors=True - ), - ).group(1) - ) - - @property - def cl_version(self): - """Cl toolset version""" - return self._compiler_version(self.cc) - - @property - def ifx_version(self): - """Ifx compiler version associated with this version of MSVC""" - return self._compiler_version(self.fc) - - @property - def vs_root(self): - # The MSVC install root is located at a fix level above the compiler - # and is referenceable idiomatically via the pattern below - # this should be consistent accross versions - return os.path.abspath(os.path.join(self.cc, "../../../../../../../..")) - - def setup_custom_environment(self, pkg, env): - """Set environment variables for MSVC using the - Microsoft-provided script.""" - # Set the build environment variables for spack. Just using - # subprocess.call() doesn't work since that operates in its own - # environment which is destroyed (along with the adjusted variables) - # once the process terminates. So go the long way around: examine - # output, sort into dictionary, use that to make the build - # environment. - - # vcvars can target specific sdk versions, force it to pick up concretized sdk - # version, if needed by spec - if pkg.name != "win-sdk" and "win-sdk" in pkg.spec: - self.vcvars_call.sdk_ver = pkg.spec["win-sdk"].version.string - - out = self.msvc_compiler_environment() - int_env = dict( - (key, value) - for key, _, value in (line.partition("=") for line in out.splitlines()) - if key and value - ) - - for env_var in int_env: - if os.pathsep not in int_env[env_var]: - env.set(env_var, int_env[env_var]) - else: - env.set_path(env_var, int_env[env_var].split(os.pathsep)) - - # certain versions of ifx (2021.3.0:2023.1.0) do not play well with env:TMP - # that has a "." character in the path - # Work around by pointing tmp to the stage for the duration of the build - if self.fc and Version(self.fc_version(self.fc)).satisfies( - VersionRange("2021.3.0", "2023.1.0") - ): - new_tmp = tempfile.mkdtemp(dir=pkg.stage.path) - env.set("TMP", new_tmp) - - env.set("CC", self.cc) - env.set("CXX", self.cxx) - env.set("FC", self.fc) - env.set("F77", self.f77) - - @classmethod - def fc_version(cls, fc): - if not sys.platform == "win32": - return "unknown" - fc_ver = cls.default_version(fc) - FC_PATH[fc_ver] = fc - try: - sps = spack.operating_systems.windows_os.WindowsOs().compiler_search_paths - except AttributeError: - raise SpackError( - "Windows compiler search paths not established, " - "please report this behavior to github.com/spack/spack" - ) - clp = spack.util.executable.which_string("cl", path=sps) - return cls.default_version(clp) if clp else fc_ver diff --git a/lib/spack/spack/compilers/nag.py b/lib/spack/spack/compilers/nag.py deleted file mode 100644 index 7b78b06eaa3..00000000000 --- a/lib/spack/spack/compilers/nag.py +++ /dev/null @@ -1,111 +0,0 @@ -# Copyright Spack Project Developers. See COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -import os -import re - -import llnl.util.lang - -import spack.compiler - - -class Nag(spack.compiler.Compiler): - # Named wrapper links within build_env_path - # Use default wrappers for C and C++, in case provided in compilers.yaml - link_paths = { - "cc": "cc", - "cxx": "c++", - "f77": os.path.join("nag", "nagfor"), - "fc": os.path.join("nag", "nagfor"), - } - - version_argument = "-V" - - @classmethod - @llnl.util.lang.memoized - def extract_version_from_output(cls, output): - match = re.search(r"NAG Fortran Compiler Release (\d+).(\d+)\(.*\) Build (\d+)", output) - if match: - return ".".join(match.groups()) - - @property - def verbose_flag(self): - # NAG does not support a flag that would enable verbose output and - # compilation/linking at the same time (with either '-#' or '-dryrun' - # the compiler only prints the commands but does not run them). - # Therefore, the only thing we can do is to pass the '-v' argument to - # the underlying GCC. In order to get verbose output from the latter - # at both compile and linking stages, we need to call NAG with two - # additional flags: '-Wc,-v' and '-Wl,-v'. However, we return only - # '-Wl,-v' for the following reasons: - # 1) the interface of this method does not support multiple flags in - # the return value and, at least currently, verbose output at the - # linking stage has a higher priority for us; - # 2) NAG is usually mixed with GCC compiler, which also accepts - # '-Wl,-v' and produces meaningful result with it: '-v' is passed - # to the linker and the latter produces verbose output for the - # linking stage ('-Wc,-v', however, would break the compilation - # with a message from GCC that the flag is not recognized). - # - # This way, we at least enable the implicit rpath detection, which is - # based on compilation of a C file (see method - # spack.compiler._compile_dummy_c_source): in the case of a mixed - # NAG/GCC toolchain, the flag will be passed to g++ (e.g. - # 'g++ -Wl,-v ./main.c'), otherwise, the flag will be passed to nagfor - # (e.g. 'nagfor -Wl,-v ./main.c' - note that nagfor recognizes '.c' - # extension and treats the file accordingly). The list of detected - # rpaths will contain only GCC-related directories and rpaths to - # NAG-related directories are injected by nagfor anyway. - return "-Wl,-v" - - @property - def openmp_flag(self): - return "-openmp" - - @property - def debug_flags(self): - return ["-g", "-gline", "-g90"] - - @property - def opt_flags(self): - return ["-O", "-O0", "-O1", "-O2", "-O3", "-O4"] - - @property - def cxx11_flag(self): - # NAG does not have a C++ compiler - # However, it can be mixed with a compiler that does support it - return "-std=c++11" - - @property - def f77_pic_flag(self): - return "-PIC" - - @property - def fc_pic_flag(self): - return "-PIC" - - # Unlike other compilers, the NAG compiler passes options to GCC, which - # then passes them to the linker. Therefore, we need to doubly wrap the - # options with '-Wl,-Wl,,' - @property - def f77_rpath_arg(self): - return "-Wl,-Wl,,-rpath,," - - @property - def fc_rpath_arg(self): - return "-Wl,-Wl,,-rpath,," - - @property - def linker_arg(self): - return "-Wl,-Wl,," - - @property - def disable_new_dtags(self): - # Disable RPATH/RUNPATH forcing for NAG/GCC mixed toolchains: - return "" - - @property - def enable_new_dtags(self): - # Disable RPATH/RUNPATH forcing for NAG/GCC mixed toolchains: - return "" diff --git a/lib/spack/spack/compilers/nvhpc.py b/lib/spack/spack/compilers/nvhpc.py deleted file mode 100644 index 1c8e159f190..00000000000 --- a/lib/spack/spack/compilers/nvhpc.py +++ /dev/null @@ -1,78 +0,0 @@ -# Copyright Spack Project Developers. See COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -import os - -from spack.compiler import Compiler - - -class Nvhpc(Compiler): - # Named wrapper links within build_env_path - link_paths = { - "cc": os.path.join("nvhpc", "nvc"), - "cxx": os.path.join("nvhpc", "nvc++"), - "f77": os.path.join("nvhpc", "nvfortran"), - "fc": os.path.join("nvhpc", "nvfortran"), - } - - version_argument = "--version" - version_regex = r"nv[^ ]* (?:[^ ]+ Dev-r)?([0-9.]+)(?:-[0-9]+)?" - - @property - def verbose_flag(self): - return "-v" - - @property - def debug_flags(self): - return ["-g", "-gopt"] - - @property - def opt_flags(self): - return ["-O", "-O0", "-O1", "-O2", "-O3", "-O4"] - - @property - def openmp_flag(self): - return "-mp" - - @property - def cc_pic_flag(self): - return "-fpic" - - @property - def cxx_pic_flag(self): - return "-fpic" - - @property - def f77_pic_flag(self): - return "-fpic" - - @property - def fc_pic_flag(self): - return "-fpic" - - @property - def c99_flag(self): - return "-c99" - - @property - def c11_flag(self): - return "-c11" - - @property - def cxx11_flag(self): - return "--c++11" - - @property - def cxx14_flag(self): - return "--c++14" - - @property - def cxx17_flag(self): - return "--c++17" - - @property - def stdcxx_libs(self): - return ("-c++libs",) - - required_libs = ["libnvc", "libnvf"] diff --git a/lib/spack/spack/compilers/oneapi.py b/lib/spack/spack/compilers/oneapi.py deleted file mode 100644 index 255705c67be..00000000000 --- a/lib/spack/spack/compilers/oneapi.py +++ /dev/null @@ -1,171 +0,0 @@ -# Copyright Spack Project Developers. See COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -import os -from os.path import dirname, join - -from llnl.util import tty -from llnl.util.filesystem import ancestor - -import spack.util.executable -from spack.compiler import Compiler -from spack.version import Version - - -class Oneapi(Compiler): - # Named wrapper links within build_env_path - link_paths = { - "cc": os.path.join("oneapi", "icx"), - "cxx": os.path.join("oneapi", "icpx"), - "f77": os.path.join("oneapi", "ifx"), - "fc": os.path.join("oneapi", "ifx"), - } - - version_argument = "--version" - version_regex = r"(?:(?:oneAPI DPC\+\+(?:\/C\+\+)? Compiler)|(?:\(IFORT\))|(?:\(IFX\))) (\S+)" - - @property - def verbose_flag(self): - return "-v" - - required_libs = [ - "libirc", - "libifcore", - "libifcoremt", - "libirng", - "libsvml", - "libintlc", - "libimf", - "libsycl", - "libOpenCL", - ] - - @property - def debug_flags(self): - return ["-debug", "-g", "-g0", "-g1", "-g2", "-g3"] - - @property - def opt_flags(self): - return ["-O", "-O0", "-O1", "-O2", "-O3", "-Ofast", "-Os"] - - @property - def openmp_flag(self): - return "-fiopenmp" - - # There may be some additional options here for offload, e.g. : - # -fopenmp-simd Emit OpenMP code only for SIMD-based constructs. - # -fopenmp-targets= - # -fopenmp-version= - # -fopenmp Parse OpenMP pragmas and generate parallel code. - # -qno-openmp Disable OpenMP support - # -qopenmp-link= Choose whether to link with the static or - # dynamic OpenMP libraries. Default is dynamic. - # -qopenmp-simd Emit OpenMP code only for SIMD-based constructs. - # -qopenmp-stubs enables the user to compile OpenMP programs in - # sequential mode. The OpenMP directives are - # ignored and a stub OpenMP library is linked. - # -qopenmp-threadprivate= - # -qopenmp Parse OpenMP pragmas and generate parallel code. - # -static-openmp Use the static host OpenMP runtime while - # linking. - # -Xopenmp-target= - # -Xopenmp-target Pass to the target offloading toolchain. - # Source: icx --help output - - @property - def cxx11_flag(self): - return "-std=c++11" - - @property - def cxx14_flag(self): - return "-std=c++14" - - @property - def cxx17_flag(self): - return "-std=c++17" - - @property - def cxx20_flag(self): - return "-std=c++20" - - @property - def c99_flag(self): - return "-std=c99" - - @property - def c11_flag(self): - return "-std=c1x" - - @property - def cc_pic_flag(self): - return "-fPIC" - - @property - def cxx_pic_flag(self): - return "-fPIC" - - @property - def f77_pic_flag(self): - return "-fPIC" - - @property - def fc_pic_flag(self): - return "-fPIC" - - @property - def stdcxx_libs(self): - return ("-cxxlib",) - - @property - def prefix(self): - # OneAPI reports its install prefix when running ``--version`` - # on the line ``InstalledDir: /bin/compiler``. - cc = spack.util.executable.Executable(self.cc) - with self.compiler_environment(): - oneapi_output = cc("--version", output=str, error=str) - - for line in oneapi_output.splitlines(): - if line.startswith("InstalledDir:"): - oneapi_prefix = line.split(":")[1].strip() - # Go from /bin/compiler to - return ancestor(oneapi_prefix, 2) - - raise RuntimeError( - "could not find install prefix of OneAPI from output:\n\t{}".format(oneapi_output) - ) - - def setup_custom_environment(self, pkg, env): - # workaround bug in icpx driver where it requires sycl-post-link is on the PATH - # It is located in the same directory as the driver. Error message: - # clang++: error: unable to execute command: - # Executable "sycl-post-link" doesn't exist! - # also ensures that shared objects and libraries required by the compiler, - # e.g. libonnx, can be found succesfully - # due to a fix, this is no longer required for OneAPI versions >= 2024.2 - if self.cxx and pkg.spec.satisfies("%oneapi@:2024.1"): - env.prepend_path("PATH", dirname(self.cxx)) - env.prepend_path("LD_LIBRARY_PATH", join(dirname(dirname(self.cxx)), "lib")) - - # Edge cases for Intel's oneAPI compilers when using the legacy classic compilers: - # Always pass flags to disable deprecation warnings, since these warnings can - # confuse tools that parse the output of compiler commands (e.g. version checks). - # This is really only needed for Fortran, since oneapi@ should be using either - # icx+icpx+ifx or icx+icpx+ifort. But to be on the safe side (some users may - # want to try to swap icpx against icpc, for example), and since the Intel LLVM - # compilers accept these diag-disable flags, we apply them for all compilers. - if self.real_version >= Version("2021") and self.real_version < Version("2024"): - env.append_flags("SPACK_ALWAYS_CFLAGS", "-diag-disable=10441") - env.append_flags("SPACK_ALWAYS_CXXFLAGS", "-diag-disable=10441") - if self.real_version >= Version("2021") and self.real_version < Version("2025"): - env.append_flags("SPACK_ALWAYS_FFLAGS", "-diag-disable=10448") - - # 2024 release bumped the libsycl version because of an ABI - # change, 2024 compilers are required. You will see this - # error: - # - # /usr/bin/ld: warning: libsycl.so.7, needed by ...., not found - if pkg.spec.satisfies("%oneapi@:2023"): - for c in ["dnn"]: - if pkg.spec.satisfies(f"^intel-oneapi-{c}@2024:"): - tty.warn(f"intel-oneapi-{c}@2024 SYCL APIs requires %oneapi@2024:") diff --git a/lib/spack/spack/compilers/rocmcc.py b/lib/spack/spack/compilers/rocmcc.py deleted file mode 100644 index e397dc90795..00000000000 --- a/lib/spack/spack/compilers/rocmcc.py +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright Spack Project Developers. See COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -import re - -import llnl.util.lang - -import spack.compilers.clang - - -class Rocmcc(spack.compilers.clang.Clang): - @property - def link_paths(self): - link_paths = { - "cc": "rocmcc/amdclang", - "cxx": "rocmcc/amdclang++", - "f77": "rocmcc/amdflang", - "fc": "rocmcc/amdflang", - } - - return link_paths - - @property - def cxx11_flag(self): - return "-std=c++11" - - @property - def cxx14_flag(self): - return "-std=c++14" - - @property - def cxx17_flag(self): - return "-std=c++17" - - @property - def c99_flag(self): - return "-std=c99" - - @property - def c11_flag(self): - return "-std=c11" - - @classmethod - @llnl.util.lang.memoized - def extract_version_from_output(cls, output): - match = re.search(r"llvm-project roc-(\d+)[._](\d+)[._](\d+)", output) - if match: - return ".".join(match.groups()) - - @property - def stdcxx_libs(self): - return ("-lstdc++",) diff --git a/lib/spack/spack/compilers/xl.py b/lib/spack/spack/compilers/xl.py deleted file mode 100644 index 8bdec9586b7..00000000000 --- a/lib/spack/spack/compilers/xl.py +++ /dev/null @@ -1,92 +0,0 @@ -# Copyright Spack Project Developers. See COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -import os - -from spack.compiler import Compiler, UnsupportedCompilerFlag -from spack.version import Version - - -class Xl(Compiler): - # Named wrapper links within build_env_path - link_paths = { - "cc": os.path.join("xl", "xlc"), - "cxx": os.path.join("xl", "xlc++"), - "f77": os.path.join("xl", "xlf"), - "fc": os.path.join("xl", "xlf90"), - } - - version_argument = "-qversion" - version_regex = r"([0-9]?[0-9]\.[0-9])" - - @property - def verbose_flag(self): - return "-V" - - @property - def debug_flags(self): - return ["-g", "-g0", "-g1", "-g2", "-g8", "-g9"] - - @property - def opt_flags(self): - return ["-O", "-O0", "-O1", "-O2", "-O3", "-O4", "-O5", "-Ofast"] - - @property - def openmp_flag(self): - return "-qsmp=omp" - - @property - def cxx11_flag(self): - if self.real_version < Version("13.1"): - raise UnsupportedCompilerFlag(self, "the C++11 standard", "cxx11_flag", "< 13.1") - else: - return "-qlanglvl=extended0x" - - @property - def c99_flag(self): - if self.real_version >= Version("13.1.1"): - return "-std=gnu99" - if self.real_version >= Version("10.1"): - return "-qlanglvl=extc99" - raise UnsupportedCompilerFlag(self, "the C99 standard", "c99_flag", "< 10.1") - - @property - def c11_flag(self): - if self.real_version >= Version("13.1.2"): - return "-std=gnu11" - if self.real_version >= Version("12.1"): - return "-qlanglvl=extc1x" - raise UnsupportedCompilerFlag(self, "the C11 standard", "c11_flag", "< 12.1") - - @property - def cxx14_flag(self): - # .real_version does not have the "y.z" component of "w.x.y.z", which - # is required to distinguish whether support is available - if self.version >= Version("16.1.1.8"): - return "-std=c++14" - raise UnsupportedCompilerFlag(self, "the C++14 standard", "cxx14_flag", "< 16.1.1.8") - - @property - def cc_pic_flag(self): - return "-qpic" - - @property - def cxx_pic_flag(self): - return "-qpic" - - @property - def f77_pic_flag(self): - return "-qpic" - - @property - def fc_pic_flag(self): - return "-qpic" - - @property - def fflags(self): - # The -qzerosize flag is effective only for the Fortran 77 - # compilers and allows the use of zero size objects. - # For Fortran 90 and beyond, it is set by default and has not impact. - # Its use has no negative side effects. - return "-qzerosize" diff --git a/lib/spack/spack/compilers/xl_r.py b/lib/spack/spack/compilers/xl_r.py deleted file mode 100644 index 2ed31fff453..00000000000 --- a/lib/spack/spack/compilers/xl_r.py +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright Spack Project Developers. See COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -import os - -import spack.compilers.xl - - -class XlR(spack.compilers.xl.Xl): - # Named wrapper links within build_env_path - link_paths = { - "cc": os.path.join("xl_r", "xlc_r"), - "cxx": os.path.join("xl_r", "xlc++_r"), - "f77": os.path.join("xl_r", "xlf_r"), - "fc": os.path.join("xl_r", "xlf90_r"), - } diff --git a/lib/spack/spack/concretize.py b/lib/spack/spack/concretize.py index ae7cd7cd939..8bd561acb88 100644 --- a/lib/spack/spack/concretize.py +++ b/lib/spack/spack/concretize.py @@ -4,37 +4,18 @@ """High-level functions to concretize list of specs""" import sys import time -from contextlib import contextmanager from typing import Iterable, List, Optional, Sequence, Tuple, Union import llnl.util.tty as tty import spack.compilers +import spack.compilers.config import spack.config import spack.error import spack.repo import spack.util.parallel from spack.spec import ArchSpec, CompilerSpec, Spec -CHECK_COMPILER_EXISTENCE = True - - -@contextmanager -def disable_compiler_existence_check(): - global CHECK_COMPILER_EXISTENCE - CHECK_COMPILER_EXISTENCE, saved = False, CHECK_COMPILER_EXISTENCE - yield - CHECK_COMPILER_EXISTENCE = saved - - -@contextmanager -def enable_compiler_existence_check(): - global CHECK_COMPILER_EXISTENCE - CHECK_COMPILER_EXISTENCE, saved = True, CHECK_COMPILER_EXISTENCE - yield - CHECK_COMPILER_EXISTENCE = saved - - SpecPairInput = Tuple[Spec, Optional[Spec]] SpecPair = Tuple[Spec, Spec] TestsType = Union[bool, Iterable[str]] @@ -143,7 +124,7 @@ def concretize_separately( # Ensure we have compilers in compilers.yaml to avoid that # processes try to write the config file in parallel - _ = spack.compilers.all_compilers_config(spack.config.CONFIG) + _ = spack.compilers.config.all_compilers_from(spack.config.CONFIG) # Early return if there is nothing to do if len(args) == 0: diff --git a/lib/spack/spack/cray_manifest.py b/lib/spack/spack/cray_manifest.py index 44872cacff6..573e0614304 100644 --- a/lib/spack/spack/cray_manifest.py +++ b/lib/spack/spack/cray_manifest.py @@ -6,6 +6,7 @@ import os import traceback import warnings +from typing import Any, Dict, Iterable, List, Optional import jsonschema import jsonschema.exceptions @@ -13,7 +14,7 @@ import llnl.util.tty as tty import spack.cmd -import spack.compilers +import spack.compilers.config import spack.deptypes as dt import spack.error import spack.hash_types as hash_types @@ -21,78 +22,89 @@ import spack.repo import spack.spec import spack.store +from spack.detection.path import ExecutablesFinder from spack.schema.cray_manifest import schema as manifest_schema #: Cray systems can store a Spack-compatible description of system #: packages here. default_path = "/opt/cray/pe/cpe-descriptive-manifest/" -compiler_name_translation = {"nvidia": "nvhpc", "rocm": "rocmcc"} +COMPILER_NAME_TRANSLATION = {"nvidia": "nvhpc", "rocm": "llvm-amdgpu", "clang": "llvm"} def translated_compiler_name(manifest_compiler_name): """ When creating a Compiler object, Spack expects a name matching - one of the classes in `spack.compilers`. Names in the Cray manifest + one of the classes in `spack.compilers.config`. Names in the Cray manifest may differ; for cases where we know the name refers to a compiler in Spack, this function translates it automatically. This function will raise an error if there is no recorded translation and the name doesn't match a known compiler name. """ - if manifest_compiler_name in compiler_name_translation: - return compiler_name_translation[manifest_compiler_name] - elif manifest_compiler_name in spack.compilers.supported_compilers(): + if manifest_compiler_name in COMPILER_NAME_TRANSLATION: + return COMPILER_NAME_TRANSLATION[manifest_compiler_name] + elif manifest_compiler_name in spack.compilers.config.supported_compilers(): return manifest_compiler_name else: - raise spack.compilers.UnknownCompilerError( - "Manifest parsing - unknown compiler: {0}".format(manifest_compiler_name) + raise spack.compilers.config.UnknownCompilerError( + f"[CRAY MANIFEST] unknown compiler: {manifest_compiler_name}" ) -def compiler_from_entry(entry: dict, manifest_path: str): +def compiler_from_entry(entry: dict, *, manifest_path: str) -> Optional[spack.spec.Spec]: # Note that manifest_path is only passed here to compose a # useful warning message when paths appear to be missing. compiler_name = translated_compiler_name(entry["name"]) - - if "prefix" in entry: - prefix = entry["prefix"] - paths = dict( - (lang, os.path.join(prefix, relpath)) - for (lang, relpath) in entry["executables"].items() - ) - else: - paths = entry["executables"] + paths = extract_compiler_paths(entry) # Do a check for missing paths. Note that this isn't possible for # all compiler entries, since their "paths" might actually be # exe names like "cc" that depend on modules being loaded. Cray # manifest entries are always paths though. - missing_paths = [] - for path in paths.values(): - if not os.path.exists(path): - missing_paths.append(path) - - # to instantiate a compiler class we may need a concrete version: - version = "={}".format(entry["version"]) - arch = entry["arch"] - operating_system = arch["os"] - target = arch["target"] - - compiler_cls = spack.compilers.class_for_compiler_name(compiler_name) - spec = spack.spec.CompilerSpec(compiler_cls.name, version) - path_list = [paths.get(x, None) for x in ("cc", "cxx", "f77", "fc")] - + missing_paths = [x for x in paths if not os.path.exists(x)] if missing_paths: warnings.warn( "Manifest entry refers to nonexistent paths:\n\t" + "\n\t".join(missing_paths) - + f"\nfor {str(spec)}" + + f"\nfor {entry['name']}@{entry['version']}" + f"\nin {manifest_path}" + "\nPlease report this issue" ) - return compiler_cls(spec, operating_system, target, path_list) + try: + compiler_spec = compiler_spec_from_paths(pkg_name=compiler_name, compiler_paths=paths) + except spack.error.SpackError as e: + tty.debug(f"[CRAY MANIFEST] {e}") + return None + + compiler_spec.constrain( + f"platform=linux os={entry['arch']['os']} target={entry['arch']['target']}" + ) + return compiler_spec + + +def compiler_spec_from_paths(*, pkg_name: str, compiler_paths: Iterable[str]) -> spack.spec.Spec: + """Returns the external spec associated with a series of compilers, if any.""" + pkg_cls = spack.repo.PATH.get_pkg_class(pkg_name) + finder = ExecutablesFinder() + specs = finder.detect_specs(pkg=pkg_cls, paths=compiler_paths) + + if not specs or len(specs) > 1: + raise CrayCompilerDetectionError( + message=f"cannot detect a single {pkg_name} compiler for Cray manifest entry", + long_message=f"Analyzed paths are: {', '.join(compiler_paths)}", + ) + + return specs[0] + + +def extract_compiler_paths(entry: Dict[str, Any]) -> List[str]: + """Returns the paths to compiler executables, from a dictionary entry in the Cray manifest.""" + paths = list(entry["executables"].values()) + if "prefix" in entry: + paths = [os.path.join(entry["prefix"], relpath) for relpath in paths] + return paths def spec_from_entry(entry): @@ -120,7 +132,7 @@ def spec_from_entry(entry): version=entry["compiler"]["version"], ) - spec_format = "{name}@={version} {compiler} {arch}" + spec_format = "{name}@={version} {arch}" spec_str = spec_format.format( name=entry["name"], version=entry["version"], compiler=compiler_str, arch=arch_str ) @@ -181,6 +193,7 @@ def entries_to_specs(entries): for entry in entries: try: spec = spec_from_entry(entry) + assert spec.concrete, f"{spec} is not concrete" spec_dict[spec._hash] = spec except spack.repo.UnknownPackageError: tty.debug("Omitting package {0}: no corresponding repo package".format(entry["name"])) @@ -219,28 +232,43 @@ def read(path, apply_updates): specs = entries_to_specs(json_data["specs"]) tty.debug("{0}: {1} specs read from manifest".format(path, str(len(specs)))) - compilers = list() + compilers = [] if "compilers" in json_data: - compilers.extend(compiler_from_entry(x, path) for x in json_data["compilers"]) - tty.debug("{0}: {1} compilers read from manifest".format(path, str(len(compilers)))) - # Filter out the compilers that already appear in the configuration - compilers = spack.compilers.select_new_compilers(compilers) - if apply_updates and compilers: - for compiler in compilers: + for x in json_data["compilers"]: + # We don't want to fail reading the manifest, if a single compiler fails try: - spack.compilers.add_compilers_to_config([compiler]) + candidate = compiler_from_entry(x, manifest_path=path) except Exception: - warnings.warn( - f"Could not add compiler {str(compiler.spec)}: " - f"\n\tfrom manifest: {path}" - "\nPlease reexecute with 'spack -d' and include the stack trace" - ) - tty.debug(f"Include this\n{traceback.format_exc()}") + candidate = None + + if candidate is None: + continue + + compilers.append(candidate) + tty.debug(f"{path}: {str(len(compilers))} compilers read from manifest") + # Filter out the compilers that already appear in the configuration + compilers = spack.compilers.config.select_new_compilers(compilers) + if apply_updates and compilers: + try: + spack.compilers.config.add_compiler_to_config(compilers) + except Exception: + warnings.warn( + f"Could not add compilers from manifest: {path}" + "\nPlease reexecute with 'spack -d' and include the stack trace" + ) + tty.debug(f"Include this\n{traceback.format_exc()}") if apply_updates: for spec in specs.values(): + assert spec.concrete, f"{spec} is not concrete" spack.store.STORE.db.add(spec) class ManifestValidationError(spack.error.SpackError): def __init__(self, msg, long_msg=None): super().__init__(msg, long_msg) + + +class CrayCompilerDetectionError(spack.error.SpackError): + """Raised if a compiler, listed in the Cray manifest, cannot be detected correctly based on + the paths provided. + """ diff --git a/lib/spack/spack/database.py b/lib/spack/spack/database.py index ccb4a58e705..60b7068e37c 100644 --- a/lib/spack/spack/database.py +++ b/lib/spack/spack/database.py @@ -41,6 +41,7 @@ Union, ) +import spack import spack.repo try: @@ -81,11 +82,11 @@ #: DB version. This is stuck in the DB file to track changes in format. #: Increment by one when the database format changes. #: Versions before 5 were not integers. -_DB_VERSION = vn.Version("7") +_DB_VERSION = vn.Version("8") #: For any version combinations here, skip reindex when upgrading. #: Reindexing can take considerable time and is not always necessary. -_SKIP_REINDEX = [ +_REINDEX_NOT_NEEDED_ON_READ = [ # reindexing takes a significant amount of time, and there's # no reason to do it from DB version 0.9.3 to version 5. The # only difference is that v5 can contain "deprecated_for" @@ -94,6 +95,8 @@ (vn.Version("0.9.3"), vn.Version("5")), (vn.Version("5"), vn.Version("6")), (vn.Version("6"), vn.Version("7")), + (vn.Version("6"), vn.Version("8")), + (vn.Version("7"), vn.Version("8")), ] #: Default timeout for spack database locks in seconds or None (no timeout). @@ -146,11 +149,12 @@ def _getfqdn(): return socket.getfqdn() -def reader(version: vn.StandardVersion) -> Type["spack.spec.SpecfileReaderBase"]: +def reader(version: vn.ConcreteVersion) -> Type["spack.spec.SpecfileReaderBase"]: reader_cls = { vn.Version("5"): spack.spec.SpecfileV1, vn.Version("6"): spack.spec.SpecfileV3, vn.Version("7"): spack.spec.SpecfileV4, + vn.Version("8"): spack.spec.SpecfileV5, } return reader_cls[version] @@ -640,6 +644,17 @@ def __init__( self._write_transaction_impl = lk.WriteTransaction self._read_transaction_impl = lk.ReadTransaction + self._db_version: Optional[vn.ConcreteVersion] = None + + @property + def db_version(self) -> vn.ConcreteVersion: + if self._db_version is None: + raise AttributeError("version not set -- DB has not been read yet") + return self._db_version + + @db_version.setter + def db_version(self, value: vn.ConcreteVersion): + self._db_version = value def _ensure_parent_directories(self): """Create the parent directory for the DB, if necessary.""" @@ -784,16 +799,15 @@ def _assign_dependencies( spec._add_dependency(child, depflag=dt.canonicalize(dtypes), virtuals=virtuals) - def _read_from_file(self, filename): + def _read_from_file(self, filename: pathlib.Path, *, reindex: bool = False) -> None: """Fill database from file, do not maintain old data. Translate the spec portions from node-dict form to spec form. Does not do any locking. """ try: - with open(str(filename), "r", encoding="utf-8") as f: - # In the future we may use a stream of JSON objects, hence `raw_decode` for compat. - fdata, _ = JSONDecoder().raw_decode(f.read()) + # In the future we may use a stream of JSON objects, hence `raw_decode` for compat. + fdata, _ = JSONDecoder().raw_decode(filename.read_text(encoding="utf-8")) except Exception as e: raise CorruptDatabaseError("error parsing database:", str(e)) from e @@ -802,7 +816,7 @@ def _read_from_file(self, filename): def check(cond, msg): if not cond: - raise CorruptDatabaseError("Spack database is corrupt: %s" % msg, self._index_path) + raise CorruptDatabaseError(f"Spack database is corrupt: {msg}", self._index_path) check("database" in fdata, "no 'database' attribute in JSON DB.") @@ -810,24 +824,15 @@ def check(cond, msg): db = fdata["database"] check("version" in db, "no 'version' in JSON DB.") - # TODO: better version checking semantics. - version = vn.Version(db["version"]) - if version > _DB_VERSION: - raise InvalidDatabaseVersionError(self, _DB_VERSION, version) - elif version < _DB_VERSION and not any( - old == version and new == _DB_VERSION for old, new in _SKIP_REINDEX - ): - tty.warn(f"Spack database version changed from {version} to {_DB_VERSION}. Upgrading.") - - self.reindex() - installs = dict( - (k, v.to_dict(include_fields=self._record_fields)) for k, v in self._data.items() - ) + self.db_version = vn.Version(db["version"]) + if self.db_version > _DB_VERSION: + raise InvalidDatabaseVersionError(self, _DB_VERSION, self.db_version) + elif self.db_version < _DB_VERSION: + installs = self._handle_old_db_versions_read(check, db, reindex=reindex) else: - check("installs" in db, "no 'installs' in JSON DB.") - installs = db["installs"] + installs = self._handle_current_version_read(check, db) - spec_reader = reader(version) + spec_reader = reader(self.db_version) def invalid_record(hash_key, error): return CorruptDatabaseError( @@ -884,6 +889,39 @@ def invalid_record(hash_key, error): self._data = data self._installed_prefixes = installed_prefixes + def _handle_current_version_read(self, check, db): + check("installs" in db, "no 'installs' in JSON DB.") + installs = db["installs"] + return installs + + def _handle_old_db_versions_read(self, check, db, *, reindex: bool): + if reindex is False and not self.is_upstream: + self.raise_explicit_database_upgrade_error() + + if not self.is_readable(): + raise DatabaseNotReadableError( + f"cannot read database v{self.db_version} at {self.root}" + ) + + return self._handle_current_version_read(check, db) + + def is_readable(self) -> bool: + """Returns true if this DB can be read without reindexing""" + return (self.db_version, _DB_VERSION) in _REINDEX_NOT_NEEDED_ON_READ + + def raise_explicit_database_upgrade_error(self): + """Raises an ExplicitDatabaseUpgradeError with an appropriate message""" + raise ExplicitDatabaseUpgradeError( + f"database is v{self.db_version}, but Spack v{spack.__version__} needs v{_DB_VERSION}", + long_message=( + f"\nChange config:install_tree:root to use a different store, or use `spack " + f"reindex` to migrate the store at {self.root} to version {_DB_VERSION}.\n\n" + f"If you decide to migrate the store, note that:\n" + f"1. The operation cannot be reverted, and\n" + f"2. Older Spack versions will not be able to read the store anymore\n" + ), + ) + def reindex(self): """Build database index from scratch based on a directory layout. @@ -899,9 +937,8 @@ def reindex(self): def _read_suppress_error(): try: if self._index_path.is_file(): - self._read_from_file(self._index_path) - except CorruptDatabaseError as e: - tty.warn(f"Reindexing corrupt database, error was: {e}") + self._read_from_file(self._index_path, reindex=True) + except (CorruptDatabaseError, DatabaseNotReadableError): self._data = {} self._installed_prefixes = set() @@ -1844,6 +1881,14 @@ def database_version_message(self): return f"The expected DB version is '{self.expected}', but '{self.found}' was found." +class ExplicitDatabaseUpgradeError(SpackError): + """Raised to request an explicit DB upgrade to the user""" + + +class DatabaseNotReadableError(SpackError): + """Raised to signal Database.reindex that the reindex should happen via spec.json""" + + class NoSuchSpecError(KeyError): """Raised when a spec is not found in the database.""" diff --git a/lib/spack/spack/detection/common.py b/lib/spack/spack/detection/common.py index d472ec45861..b908dd24f57 100644 --- a/lib/spack/spack/detection/common.py +++ b/lib/spack/spack/detection/common.py @@ -224,6 +224,7 @@ def update_configuration( pkg_config["buildable"] = False pkg_to_cfg[package_name] = pkg_config + scope = scope or spack.config.default_modify_scope() pkgs_cfg = spack.config.get("packages", scope=scope) pkgs_cfg = spack.schema.merge_yaml(pkgs_cfg, pkg_to_cfg) spack.config.set("packages", pkgs_cfg, scope=scope) diff --git a/lib/spack/spack/directives.py b/lib/spack/spack/directives.py index 7dddd652674..5e8453aed3c 100644 --- a/lib/spack/spack/directives.py +++ b/lib/spack/spack/directives.py @@ -85,9 +85,6 @@ class OpenMpi(Package): PatchesType = Union[Patcher, str, List[Union[Patcher, str]]] -SUPPORTED_LANGUAGES = ("fortran", "cxx", "c") - - def _make_when_spec(value: WhenType) -> Optional[spack.spec.Spec]: """Create a ``Spec`` that indicates when a directive should be applied. @@ -296,7 +293,8 @@ def _depends_on( deps_by_name = pkg.dependencies.setdefault(when_spec, {}) dependency = deps_by_name.get(spec.name) - if spec.dependencies(): + edges = spec.edges_to_dependencies() + if edges and not all(x.depflag == dt.BUILD for x in edges): raise DirectiveError( f"the '^' sigil cannot be used in 'depends_on' directives. Please reformulate " f"the directive below as multiple directives:\n\n" @@ -373,9 +371,6 @@ def depends_on( """ dep_spec = spack.spec.Spec(spec) - if dep_spec.name in SUPPORTED_LANGUAGES: - assert type == "build", "languages must be of 'build' type" - return _language(lang_spec_str=spec, when=when) def _execute_depends_on(pkg: Type[spack.package_base.PackageBase]): _depends_on(pkg, dep_spec, when=when, type=type, patches=patches) @@ -910,21 +905,6 @@ def _execute_requires(pkg: Type[spack.package_base.PackageBase]): return _execute_requires -@directive("languages") -def _language(lang_spec_str: str, *, when: Optional[Union[str, bool]] = None): - """Temporary implementation of language virtuals, until compilers are proper dependencies.""" - - def _execute_languages(pkg: Type[spack.package_base.PackageBase]): - when_spec = _make_when_spec(when) - if not when_spec: - return - - languages = pkg.languages.setdefault(when_spec, set()) - languages.add(lang_spec_str) - - return _execute_languages - - class DependencyError(DirectiveError): """This is raised when a dependency specification is invalid.""" diff --git a/lib/spack/spack/directory_layout.py b/lib/spack/spack/directory_layout.py index 8c2381cf653..9acc66bdecb 100644 --- a/lib/spack/spack/directory_layout.py +++ b/lib/spack/spack/directory_layout.py @@ -21,7 +21,7 @@ from spack.error import SpackError default_projections = { - "all": "{architecture}/{compiler.name}-{compiler.version}/{name}-{version}-{hash}" + "all": "{architecture.platform}-{architecture.target}/{name}-{version}-{hash}" } diff --git a/lib/spack/spack/environment/__init__.py b/lib/spack/spack/environment/__init__.py index ea8c89f3d87..462b55d538d 100644 --- a/lib/spack/spack/environment/__init__.py +++ b/lib/spack/spack/environment/__init__.py @@ -9,7 +9,7 @@ `spack.lock` format =================== -Spack environments have existed since Spack ``v0.12.0``, and there have been 4 different +Spack environments have existed since Spack ``v0.12.0``, and there have been different ``spack.lock`` formats since then. The formats are documented here. The high-level format of a Spack lockfile hasn't changed much between versions, but the @@ -53,31 +53,44 @@ - ``v3`` - ``v4`` - ``v5`` + - ``v6`` * - ``v0.12:0.14`` - ✅ - - - - + - * - ``v0.15:0.16`` - ✅ - ✅ - - - + - * - ``v0.17`` - ✅ - ✅ - ✅ - - + - * - ``v0.18:`` - ✅ - ✅ - ✅ - ✅ - - * - ``v0.22:`` + - + * - ``v0.22:v0.23`` + - ✅ + - ✅ + - ✅ + - ✅ + - ✅ + - + * - ``v1.0:`` + - ✅ - ✅ - ✅ - ✅ @@ -459,6 +472,78 @@ } } } + + +Version 6 +--------- + +Version 6 uses specs where compilers are modeled as real dependencies, and not as a node attribute. +It doesn't change the top-level lockfile format. + +As part of Spack v1.0, compilers stopped being a node attribute, and became a build-only dependency. Packages may +declare a dependency on the c, cxx, or fortran languages, which are now treated as virtuals, and compilers would +be providers for one or more of those languages. Compilers can also inject runtime dependency, on the node being +compiled. The compiler-wrapper is explicitly represented as a node in the DAG, and enters the hash. + +.. code-block:: json + + { + "_meta": { + "file-type": "spack-lockfile", + "lockfile-version": 6, + "specfile-version": 5 + }, + "spack": { + "version": "1.0.0.dev0", + "type": "git", + "commit": "395b34f17417132389a6a8ee4dbf831c4a04f642" + }, + "roots": [ + { + "hash": "tivmbe3xjw7oqv4c3jv3v4jw42a7cajq", + "spec": "zlib-ng" + } + ], + "concrete_specs": { + "tivmbe3xjw7oqv4c3jv3v4jw42a7cajq": { + "name": "zlib-ng", + "version": "2.2.3", + "": {} + } + "dependencies": [ + { + "name": "compiler-wrapper", + "hash": "n5lamxu36f4cx4sm7m7gocalctve4mcx", + "parameters": { + "deptypes": [ + "build" + ], + "virtuals": [] + } + }, + { + "name": "gcc", + "hash": "b375mbpprxze4vxy4ho7aixhuchsime2", + "parameters": { + "deptypes": [ + "build" + ], + "virtuals": [ + "c", + "cxx" + ] + } + }, + { + "": {} + } + ], + "annotations": { + "original_specfile_version": 5 + }, + } + } + """ from .environment import ( diff --git a/lib/spack/spack/environment/depfile.py b/lib/spack/spack/environment/depfile.py index dfe8f851c79..f69bc15e4e1 100644 --- a/lib/spack/spack/environment/depfile.py +++ b/lib/spack/spack/environment/depfile.py @@ -165,9 +165,7 @@ def __init__( item.target.safe_name(), " ".join(self._install_target(s.safe_name()) for s in item.prereqs), item.target.spec_hash(), - item.target.unsafe_format( - "{name}{@version}{variants}{ arch=architecture} {%compiler}" - ), + item.target.unsafe_format("{name}{@version}{variants}{ arch=architecture}"), item.buildcache_flag, ) for item in adjacency_list diff --git a/lib/spack/spack/environment/environment.py b/lib/spack/spack/environment/environment.py index cbd808ff49e..577e03c4e50 100644 --- a/lib/spack/spack/environment/environment.py +++ b/lib/spack/spack/environment/environment.py @@ -131,7 +131,7 @@ def default_manifest_yaml(): valid_environment_name_re = r"^\w[\w-]*$" #: version of the lockfile format. Must increase monotonically. -lockfile_format_version = 5 +lockfile_format_version = 6 READER_CLS = { @@ -140,6 +140,7 @@ def default_manifest_yaml(): 3: spack.spec.SpecfileV2, 4: spack.spec.SpecfileV3, 5: spack.spec.SpecfileV4, + 6: spack.spec.SpecfileV5, } diff --git a/lib/spack/spack/mixins.py b/lib/spack/spack/mixins.py index d5467726f4e..6d49220967e 100644 --- a/lib/spack/spack/mixins.py +++ b/lib/spack/spack/mixins.py @@ -70,12 +70,16 @@ def _filter_compiler_wrappers_impl(pkg_or_builder): x = llnl.util.filesystem.FileFilter(*abs_files) - compiler_vars = [ - ("CC", pkg.compiler.cc), - ("CXX", pkg.compiler.cxx), - ("F77", pkg.compiler.f77), - ("FC", pkg.compiler.fc), - ] + compiler_vars = [] + if "c" in pkg.spec: + compiler_vars.append(("CC", pkg.spec["c"].package.cc)) + + if "cxx" in pkg.spec: + compiler_vars.append(("CXX", pkg.spec["cxx"].package.cxx)) + + if "fortran" in pkg.spec: + compiler_vars.append(("FC", pkg.spec["fortran"].package.fortran)) + compiler_vars.append(("F77", pkg.spec["fortran"].package.fortran)) # Some paths to the compiler wrappers might be substrings of the others. # For example: @@ -103,7 +107,11 @@ def _filter_compiler_wrappers_impl(pkg_or_builder): x.filter(wrapper_path, compiler_path, **filter_kwargs) # Remove this linking flag if present (it turns RPATH into RUNPATH) - x.filter("{0}--enable-new-dtags".format(pkg.compiler.linker_arg), "", **filter_kwargs) + for compiler_lang in ("c", "cxx", "fortran"): + if compiler_lang not in pkg.spec: + continue + compiler_pkg = pkg.spec[compiler_lang].package + x.filter(f"{compiler_pkg.linker_arg}--enable-new-dtags", "", **filter_kwargs) # NAG compiler is usually mixed with GCC, which has a different # prefix for linker arguments. diff --git a/lib/spack/spack/modules/lmod.py b/lib/spack/spack/modules/lmod.py index 13db094c787..58f94075252 100644 --- a/lib/spack/spack/modules/lmod.py +++ b/lib/spack/spack/modules/lmod.py @@ -5,18 +5,21 @@ import collections import itertools import os +import pathlib +import warnings from typing import Dict, List, Optional, Tuple import llnl.util.filesystem as fs import llnl.util.lang as lang -import spack.compilers +import spack.compilers.config import spack.config import spack.error import spack.repo import spack.spec import spack.tengine as tengine import spack.util.environment +from spack.aliases import BUILTIN_TO_LEGACY_COMPILER from .common import BaseConfiguration, BaseContext, BaseFileLayout, BaseModuleFileWriter @@ -58,7 +61,7 @@ def make_context( return LmodContext(make_configuration(spec, module_set_name, explicit)) -def guess_core_compilers(name, store=False) -> List[spack.spec.CompilerSpec]: +def guess_core_compilers(name, store=False) -> List[spack.spec.Spec]: """Guesses the list of core compilers installed in the system. Args: @@ -69,16 +72,12 @@ def guess_core_compilers(name, store=False) -> List[spack.spec.CompilerSpec]: List of found core compilers """ core_compilers = [] - for compiler in spack.compilers.all_compilers(): + for compiler in spack.compilers.config.all_compilers(init_config=False): try: - # A compiler is considered to be a core compiler if any of the - # C, C++ or Fortran compilers reside in a system directory - is_system_compiler = any( - os.path.dirname(getattr(compiler, x, "")) in spack.util.environment.SYSTEM_DIRS - for x in ("cc", "cxx", "f77", "fc") - ) + cc_dir = pathlib.Path(compiler.package.cc).parent + is_system_compiler = str(cc_dir) in spack.util.environment.SYSTEM_DIRS if is_system_compiler: - core_compilers.append(compiler.spec) + core_compilers.append(compiler) except (KeyError, TypeError, AttributeError): continue @@ -100,18 +99,38 @@ class LmodConfiguration(BaseConfiguration): default_projections = {"all": "{name}/{version}"} + compiler: Optional[spack.spec.Spec] + + def __init__(self, spec: spack.spec.Spec, module_set_name: str, explicit: bool) -> None: + super().__init__(spec, module_set_name, explicit) + + candidates = collections.defaultdict(list) + for node in spec.traverse(deptype=("link", "run")): + candidates["c"].extend(node.dependencies(virtuals=("c",))) + candidates["cxx"].extend(node.dependencies(virtuals=("c",))) + + if candidates["c"]: + self.compiler = candidates["c"][0] + if len(set(candidates["c"])) > 1: + warnings.warn( + f"{spec.short_spec} uses more than one compiler, and might not fit the " + f"LMod hierarchy. Using {self.compiler.short_spec} as the LMod compiler." + ) + + elif not candidates["c"]: + self.compiler = None + @property - def core_compilers(self) -> List[spack.spec.CompilerSpec]: + def core_compilers(self) -> List[spack.spec.Spec]: """Returns the list of "Core" compilers Raises: - CoreCompilersNotFoundError: if the key was not - specified in the configuration file or the sequence - is empty + CoreCompilersNotFoundError: if the key was not specified in the configuration file or + the sequence is empty """ - compilers = [ - spack.spec.CompilerSpec(c) for c in configuration(self.name).get("core_compilers", []) - ] + compilers = [] + for c in configuration(self.name).get("core_compilers", []): + compilers.extend(spack.spec.Spec(f"%{c}").dependencies()) if not compilers: compilers = guess_core_compilers(self.name, store=True) @@ -160,12 +179,15 @@ def hierarchy_tokens(self): @property @lang.memoized def requires(self): - """Returns a dictionary mapping all the requirements of this spec - to the actual provider. 'compiler' is always present among the - requirements. + """Returns a dictionary mapping all the requirements of this spec to the actual provider. + + The 'compiler' key is always present among the requirements. """ # If it's a core_spec, lie and say it requires a core compiler - if any(self.spec.satisfies(core_spec) for core_spec in self.core_specs): + if ( + any(self.spec.satisfies(core_spec) for core_spec in self.core_specs) + or self.compiler is None + ): return {"compiler": self.core_compilers[0]} hierarchy_filter_list = [] @@ -176,7 +198,8 @@ def requires(self): # Keep track of the requirements that this package has in terms # of virtual packages that participate in the hierarchical structure - requirements = {"compiler": self.spec.compiler} + + requirements = {"compiler": self.compiler} # For each virtual dependency in the hierarchy for x in self.hierarchy_tokens: # Skip anything filtered for this spec @@ -199,12 +222,12 @@ def provides(self): # virtual dependencies in spack # If it is in the list of supported compilers family -> compiler - if self.spec.name in spack.compilers.supported_compilers(): - provides["compiler"] = spack.spec.CompilerSpec(self.spec.format("{name}{@versions}")) - elif self.spec.name in spack.compilers.package_name_to_compiler_name: + if self.spec.name in spack.compilers.config.supported_compilers(): + provides["compiler"] = spack.spec.Spec(self.spec.format("{name}{@versions}")) + elif self.spec.name in BUILTIN_TO_LEGACY_COMPILER: # If it is the package for a supported compiler, but of a different name - cname = spack.compilers.package_name_to_compiler_name[self.spec.name] - provides["compiler"] = spack.spec.CompilerSpec(cname, self.spec.versions) + cname = BUILTIN_TO_LEGACY_COMPILER[self.spec.name] + provides["compiler"] = spack.spec.Spec(cname, self.spec.versions) # All the other tokens in the hierarchy must be virtual dependencies for x in self.hierarchy_tokens: @@ -300,12 +323,10 @@ def path_part_fmt(token): # If we are dealing with a core compiler, return 'Core' core_compilers = self.conf.core_compilers - if name == "compiler" and any( - spack.spec.CompilerSpec(value).satisfies(c) for c in core_compilers - ): + if name == "compiler" and any(spack.spec.Spec(value).satisfies(c) for c in core_compilers): return "Core" - # CompilerSpec does not have a hash, as we are not allowed to + # Spec does not have a hash, as we are not allowed to # use different flavors of the same compiler if name == "compiler": return path_part_fmt(token=value) diff --git a/lib/spack/spack/package_base.py b/lib/spack/spack/package_base.py index b2ab47ed359..4fa398e582b 100644 --- a/lib/spack/spack/package_base.py +++ b/lib/spack/spack/package_base.py @@ -30,7 +30,6 @@ import llnl.util.tty as tty from llnl.util.lang import classproperty, memoized -import spack.compilers import spack.config import spack.dependency import spack.deptypes as dt @@ -52,6 +51,7 @@ import spack.util.path import spack.util.web import spack.variant +from spack.compilers.adaptor import DeprecatedCompiler from spack.error import InstallError, NoURLError, PackageError from spack.filesystem_view import YamlFilesystemView from spack.resource import Resource @@ -588,6 +588,8 @@ class PackageBase(WindowsRPath, PackageViewMixin, metaclass=PackageMeta): """ + compiler = DeprecatedCompiler() + # # These are default values for instance variables. # @@ -1379,15 +1381,6 @@ def command(self) -> spack.util.executable.Executable: return spack.util.executable.Executable(path) raise RuntimeError(f"Unable to locate {self.spec.name} command in {self.home.bin}") - @property # type: ignore[misc] - @memoized - def compiler(self): - """Get the spack.compiler.Compiler object used to build this package""" - if not self.spec.concrete: - raise ValueError("Can only get a compiler for a concrete package.") - - return spack.compilers.compiler_for_spec(self.spec.compiler, self.spec.architecture) - def url_version(self, version): """ Given a version, this returns a string that should be substituted @@ -1499,7 +1492,7 @@ def do_stage(self, mirror_only=False): self.stage.create() # Fetch/expand any associated code. - if self.has_code: + if self.has_code and not self.spec.external: self.do_fetch(mirror_only) self.stage.expand_archive() else: @@ -1829,17 +1822,14 @@ def _resource_stage(self, resource): return resource_stage_folder def do_test(self, dirty=False, externals=False): - if self.test_requires_compiler: - compilers = spack.compilers.compilers_for_spec( - self.spec.compiler, arch_spec=self.spec.architecture + if self.test_requires_compiler and not any( + lang in self.spec for lang in ("c", "cxx", "fortran") + ): + tty.error( + f"Skipping tests for package {self.spec}, since a compiler is required, " + f"but not available" ) - if not compilers: - tty.error( - "Skipping tests for package %s\n" - % self.spec.format("{name}-{version}-{hash:7}") - + "Package test requires missing compiler %s" % self.spec.compiler - ) - return + return kwargs = { "dirty": dirty, diff --git a/lib/spack/spack/paths.py b/lib/spack/spack/paths.py index 4ea038f9f78..ed6e22953f2 100644 --- a/lib/spack/spack/paths.py +++ b/lib/spack/spack/paths.py @@ -31,7 +31,6 @@ # spack directory hierarchy lib_path = os.path.join(prefix, "lib", "spack") external_path = os.path.join(lib_path, "external") -build_env_path = os.path.join(lib_path, "env") module_path = os.path.join(lib_path, "spack") command_path = os.path.join(module_path, "cmd") analyzers_path = os.path.join(module_path, "analyzers") diff --git a/lib/spack/spack/provider_index.py b/lib/spack/spack/provider_index.py index 3a6431bba0b..db5f5d23098 100644 --- a/lib/spack/spack/provider_index.py +++ b/lib/spack/spack/provider_index.py @@ -240,8 +240,8 @@ def from_json(stream, repository): index.providers = _transform( providers, lambda vpkg, plist: ( - spack.spec.SpecfileV4.from_node_dict(vpkg), - set(spack.spec.SpecfileV4.from_node_dict(p) for p in plist), + spack.spec.SpecfileLatest.from_node_dict(vpkg), + set(spack.spec.SpecfileLatest.from_node_dict(p) for p in plist), ), ) return index diff --git a/lib/spack/spack/repo.py b/lib/spack/spack/repo.py index 5432c433f7a..2e1b613bd00 100644 --- a/lib/spack/spack/repo.py +++ b/lib/spack/spack/repo.py @@ -602,7 +602,9 @@ def _build_index(self, name: str, indexer: Indexer): """Determine which packages need an update, and update indexes.""" # Filename of the provider index cache (we assume they're all json) - cache_filename = f"{name}/{self.namespace}-index.json" + cache_filename = ( + f"{name}/{self.namespace}-specfile_v{spack.spec.SPECFILE_FORMAT_VERSION}-index.json" + ) # Compute which packages needs to be updated in the cache index_mtime = self.cache.mtime(cache_filename) diff --git a/lib/spack/spack/report.py b/lib/spack/spack/report.py index 04bdac7b4aa..0f23fcd6e50 100644 --- a/lib/spack/spack/report.py +++ b/lib/spack/spack/report.py @@ -77,7 +77,6 @@ def __enter__(self): "packages": [], } spec_record["properties"].append(Property("architecture", input_spec.architecture)) - spec_record["properties"].append(Property("compiler", input_spec.compiler)) self.init_spec_record(input_spec, spec_record) self.specs.append(spec_record) diff --git a/lib/spack/spack/schema/packages.py b/lib/spack/spack/schema/packages.py index 8c92b1f89eb..6623f325719 100644 --- a/lib/spack/spack/schema/packages.py +++ b/lib/spack/spack/schema/packages.py @@ -137,6 +137,15 @@ }, "variants": variants, }, + "deprecatedProperties": [ + { + "names": ["compiler"], + "message": "The packages:all:compiler preference has been deprecated in " + "Spack v1.0, and is currently ignored. It will be removed from config in " + "Spack v1.2.", + "error": False, + } + ], } }, "additionalProperties": { # package name diff --git a/lib/spack/spack/solver/asp.py b/lib/spack/spack/solver/asp.py index d9accc6e09f..e6bc8ba03eb 100644 --- a/lib/spack/spack/solver/asp.py +++ b/lib/spack/spack/solver/asp.py @@ -43,9 +43,8 @@ import spack import spack.binary_distribution -import spack.compiler -import spack.compilers -import spack.concretize +import spack.compilers.config +import spack.compilers.flags import spack.config import spack.deptypes as dt import spack.environment as ev @@ -69,6 +68,7 @@ import spack.version as vn import spack.version.git_ref_lookup from spack import traverse +from spack.compilers.libraries import CompilerPropertyDetector from spack.util.file_cache import FileCache from .core import ( @@ -92,9 +92,6 @@ TransformFunction = Callable[[spack.spec.Spec, List[AspFunction]], List[AspFunction]] -#: Enable the addition of a runtime node -WITH_RUNTIME = sys.platform != "win32" - class OutputConfiguration(NamedTuple): """Data class that contains configuration on what a clingo solve should output.""" @@ -120,7 +117,7 @@ def default_clingo_control(): control = clingo().Control() control.configuration.configuration = "tweety" control.configuration.solver.heuristic = "Domain" - control.configuration.solver.opt_strategy = "usc,one" + control.configuration.solver.opt_strategy = "usc,one,1" return control @@ -298,12 +295,11 @@ def remove_node(spec: spack.spec.Spec, facts: List[AspFunction]) -> List[AspFunc def all_libcs() -> Set[spack.spec.Spec]: """Return a set of all libc specs targeted by any configured compiler. If none, fall back to libc determined from the current Python process if dynamically linked.""" - - libcs = { - c.default_libc - for c in spack.compilers.all_compilers_from(spack.config.CONFIG) - if c.default_libc - } + libcs = set() + for c in spack.compilers.config.all_compilers_from(spack.config.CONFIG): + candidate = CompilerPropertyDetector(c).default_libc() + if candidate is not None: + libcs.add(candidate) if libcs: return libcs @@ -312,7 +308,7 @@ def all_libcs() -> Set[spack.spec.Spec]: return {libc} if libc else set() -def libc_is_compatible(lhs: spack.spec.Spec, rhs: spack.spec.Spec) -> List[spack.spec.Spec]: +def libc_is_compatible(lhs: spack.spec.Spec, rhs: spack.spec.Spec) -> bool: return ( lhs.name == rhs.name and lhs.external_path == rhs.external_path @@ -325,8 +321,8 @@ def using_libc_compatibility() -> bool: return spack.platforms.host().name == "linux" -def c_compiler_runs(compiler: spack.compiler.Compiler) -> bool: - return compiler.compiler_verbose_output is not None +def c_compiler_runs(compiler) -> bool: + return CompilerPropertyDetector(compiler).compiler_verbose_output() is not None def extend_flag_list(flag_list, new_flags): @@ -973,10 +969,12 @@ def _external_config_with_implicit_externals(configuration): if not using_libc_compatibility(): return packages_yaml - for compiler in spack.compilers.all_compilers_from(configuration): - libc = compiler.default_libc - if libc: - entry = {"spec": f"{libc} %{compiler.spec}", "prefix": libc.external_path} + seen = set() + for compiler in spack.compilers.config.all_compilers_from(configuration): + libc = CompilerPropertyDetector(compiler).default_libc() + if libc and libc not in seen: + seen.add(libc) + entry = {"spec": f"{libc}", "prefix": libc.external_path} packages_yaml.setdefault(libc.name, {}).setdefault("externals", []).append(entry) return packages_yaml @@ -1117,27 +1115,6 @@ def on_model(model): raise UnsatisfiableSpecError(msg) -class KnownCompiler(NamedTuple): - """Data class to collect information on compilers""" - - spec: spack.spec.Spec - os: str - target: Optional[str] - available: bool - compiler_obj: Optional[spack.compiler.Compiler] - - def _key(self): - return self.spec, self.os, self.target - - def __eq__(self, other: object): - if not isinstance(other, KnownCompiler): - return NotImplemented - return self._key() == other._key() - - def __hash__(self): - return hash(self._key()) - - class PyclingoDriver: def __init__(self, cores=True): """Driver for the Python clingo interface. @@ -1453,13 +1430,13 @@ class SourceContext: Facts generated for the spec may include this context. """ - def __init__(self): + def __init__(self, *, source: Optional[str] = None): # 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" + self.source = "none" if source is None else source class ConditionIdContext(SourceContext): @@ -1526,7 +1503,8 @@ def __init__(self, tests: bool = False): set ) - self.possible_compilers: List[KnownCompiler] = [] + self.possible_compilers: List[spack.spec.Spec] = [] + self.rejected_compilers: Set[spack.spec.Spec] = set() self.possible_oses: Set = set() self.variant_values_from_specs: Set = set() self.version_constraints: Set = set() @@ -1655,16 +1633,6 @@ def conflict_rules(self, pkg): ) self.gen.newline() - def package_languages(self, pkg): - for when_spec, languages in pkg.languages.items(): - 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, 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() - def config_compatible_os(self): """Facts about compatible os's specified in configs""" self.gen.h2("Compatible OS from concretizer config file") @@ -1674,34 +1642,6 @@ def config_compatible_os(self): self.gen.fact(fn.os_compatible(recent, old)) self.gen.newline() - def compiler_facts(self): - """Facts about available compilers.""" - - self.gen.h2("Available compilers") - for compiler_id, compiler in enumerate(self.possible_compilers): - self.gen.fact(fn.compiler_id(compiler_id)) - self.gen.fact(fn.compiler_name(compiler_id, compiler.spec.name)) - self.gen.fact(fn.compiler_version(compiler_id, compiler.spec.version)) - - if compiler.os: - self.gen.fact(fn.compiler_os(compiler_id, compiler.os)) - - if compiler.target is not None: - self.gen.fact(fn.compiler_target(compiler_id, compiler.target)) - - 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, flag_group)) - - if compiler.available: - self.gen.fact(fn.compiler_available(compiler_id)) - - self.gen.fact(fn.compiler_weight(compiler_id, compiler_id)) - self.gen.newline() - def package_requirement_rules(self, pkg): self.emit_facts_from_requirement_rules(self.requirement_parser.rules(pkg)) @@ -1715,9 +1655,6 @@ def pkg_rules(self, pkg, tests): self.pkg_version_rules(pkg) self.gen.newline() - # languages - self.package_languages(pkg) - # variants self.variant_rules(pkg) @@ -1734,12 +1671,6 @@ def pkg_rules(self, pkg, tests): if self.enable_splicing: self.package_splice_rules(pkg) - # virtual preferences - self.virtual_preferences( - pkg.name, - lambda v, p, i: self.gen.fact(fn.pkg_fact(pkg.name, fn.provider_preference(v, p, i))), - ) - self.package_requirement_rules(pkg) # trigger and effect tables @@ -2271,8 +2202,6 @@ def emit_facts_from_requirement_rules(self, rules: List[RequirementRule]): def external_packages(self): """Facts on external packages, from packages.yaml and implicit externals.""" - packages_yaml = _external_config_with_implicit_externals(spack.config.CONFIG) - self.gen.h1("External packages") spec_filters = [] concretizer_yaml = spack.config.get("concretizer") @@ -2280,7 +2209,6 @@ def external_packages(self): if isinstance(reuse_yaml, typing.Mapping): default_include = reuse_yaml.get("include", []) default_exclude = reuse_yaml.get("exclude", []) - libc_externals = list(all_libcs()) for source in reuse_yaml.get("from", []): if source["type"] != "external": continue @@ -2288,7 +2216,7 @@ def external_packages(self): include = source.get("include", default_include) if include: # Since libcs are implicit externals, we need to implicitly include them - include = include + libc_externals + include = include + self.libcs exclude = source.get("exclude", default_exclude) spec_filters.append( SpecFilter( @@ -2299,18 +2227,16 @@ def external_packages(self): ) ) + packages_yaml = _external_config_with_implicit_externals(spack.config.CONFIG) for pkg_name, data in packages_yaml.items(): if pkg_name == "all": continue - # 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 if pkg_name not in self.pkgs: continue + self.gen.h2(f"External package: {pkg_name}") # Check if the external package is buildable. If it is # not then "external()" is a fact, unless we can # reuse an already installed spec. @@ -2338,6 +2264,13 @@ def external_packages(self): for local_idx, spec in enumerate(candidate_specs): msg = f"{spec.name} available as external when satisfying {spec}" + if any(x.satisfies(spec) for x in self.rejected_compilers): + tty.debug( + f"[{__name__}]: not considering {spec} as external, since " + f"it's a non-working compiler" + ) + continue + if spec_filters and spec not in selected_externals: continue @@ -2345,13 +2278,32 @@ def external_packages(self): warnings.warn(f"cannot use the external spec {spec}: needs a concrete version") continue + def external_requirement(input_spec, requirements): + result = [] + for asp_fn in requirements: + if asp_fn.args[0] == "depends_on": + continue + if asp_fn.args[1] != input_spec.name: + continue + result.append(asp_fn) + return result + def external_imposition(input_spec, requirements): - return requirements + [ - fn.attr("external_conditions_hold", input_spec.name, local_idx) - ] + result = [] + for asp_fn in requirements: + if asp_fn.args[0] == "depends_on": + continue + elif asp_fn.args[0] == "build_requirement": + asp_fn.args = "external_build_requirement", *asp_fn.args[1:] + if asp_fn.args[1] != input_spec.name: + continue + result.append(asp_fn) + result.append(fn.attr("external_conditions_hold", input_spec.name, local_idx)) + return result try: context = ConditionContext() + context.transform_required = external_requirement context.transform_imposed = external_imposition self.condition(spec, spec, msg=msg, context=context) except (spack.error.SpecError, RuntimeError) as e: @@ -2531,28 +2483,6 @@ def _spec_clauses( else: clauses.append(f.variant_value(spec.name, vname, value)) - # compiler and compiler version - if spec.compiler: - clauses.append(f.node_compiler(spec.name, spec.compiler.name)) - - if spec.compiler.concrete: - clauses.append( - f.node_compiler_version(spec.name, spec.compiler.name, spec.compiler.version) - ) - - elif spec.compiler.versions and spec.compiler.versions != vn.any_version: - # The condition above emits a facts only if we have an actual constraint - # on the compiler version, and avoids emitting them if any version is fine - clauses.append( - fn.attr( - "node_compiler_version_satisfies", - spec.name, - spec.compiler.name, - spec.compiler.versions, - ) - ) - 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(): @@ -2590,6 +2520,7 @@ def _spec_clauses( # If the spec is external and concrete, we allow all the libcs on the system if spec.external and spec.concrete and using_libc_compatibility(): + clauses.append(fn.attr("needs_libc", spec.name)) for libc in self.libcs: clauses.append(fn.attr("compatible_libc", spec.name, libc.name, libc.version)) @@ -2603,11 +2534,17 @@ def _spec_clauses( # GCC runtime is solved again by clingo, even on concrete specs, to give # the possibility to reuse specs built against a different runtime. if dep.name == "gcc-runtime": + clauses.append( + fn.attr("compatible_runtime", spec.name, dep.name, f"{dep.version}:") + ) + constraint_spec = spack.spec.Spec(f"{dep.name}@{dep.version}") + self.spec_versions(constraint_spec) continue # libc is also solved again by clingo, but in this case the compatibility # is not encoded in the parent node - so we need to emit explicit facts if "libc" in dspec.virtuals: + clauses.append(fn.attr("needs_libc", spec.name)) for libc in self.libcs: if libc_is_compatible(libc, dep): clauses.append( @@ -2642,15 +2579,23 @@ def _spec_clauses( # if it's concrete, then the hashes above take care of dependency # constraints, but expand the hashes if asked for. if not spec.concrete or expand_hashes: - clauses.extend( - self._spec_clauses( - dep, - body=body, - expand_hashes=expand_hashes, - concrete_build_deps=concrete_build_deps, - context=context, - ) + dependency_clauses = self._spec_clauses( + dep, + body=body, + expand_hashes=expand_hashes, + concrete_build_deps=concrete_build_deps, + context=context, ) + if dspec.depflag == dt.BUILD: + clauses.append(fn.attr("depends_on", spec.name, dep.name, "build")) + if body is False: + for clause in dependency_clauses: + clause.name = "build_requirement" + clauses.append(fn.attr("build_requirement", spec.name, clause)) + else: + clauses.extend(dependency_clauses) + else: + clauses.extend(dependency_clauses) return clauses @@ -2748,7 +2693,9 @@ def _supported_targets(self, compiler_name, compiler_version, targets): try: with warnings.catch_warnings(): warnings.simplefilter("ignore") - target.optimization_flags(compiler_name, str(compiler_version)) + target.optimization_flags( + compiler_name, compiler_version.dotted_numeric_string + ) supported.append(target) except archspec.cpu.UnsupportedMicroarchitecture: continue @@ -2829,39 +2776,21 @@ def target_defaults(self, specs): platform = spack.platforms.host() uarch = archspec.cpu.TARGETS.get(platform.default) best_targets = {uarch.family.name} - for compiler_id, known_compiler in enumerate(self.possible_compilers): - if not known_compiler.available: - continue - - compiler = known_compiler.compiler_obj - # Stub support for cross-compilation, to be expanded later - if known_compiler.target is not None and compiler.target not in ( - str(uarch.family), - "any", - ): - self.gen.fact(fn.compiler_supports_target(compiler_id, compiler.target)) - self.gen.newline() - continue - + for compiler in self.possible_compilers: supported = self._supported_targets(compiler.name, compiler.version, candidate_targets) - # If we can't find supported targets it may be due to custom - # versions in the spec, e.g. gcc@foo. Try to match the - # real_version from the compiler object to get more accurate - # results. - if not supported: - supported = self._supported_targets( - compiler.name, compiler.real_version, candidate_targets - ) - if not supported: continue for target in supported: best_targets.add(target.name) - self.gen.fact(fn.compiler_supports_target(compiler_id, target.name)) + self.gen.fact( + fn.compiler_supports_target(compiler.name, compiler.version, target.name) + ) - self.gen.fact(fn.compiler_supports_target(compiler_id, uarch.family.name)) + self.gen.fact( + fn.compiler_supports_target(compiler.name, compiler.version, uarch.family.name) + ) self.gen.newline() i = 0 # TODO compute per-target offset? @@ -3066,6 +2995,7 @@ def setup( reuse: list of concrete specs that can be reused allow_deprecated: if True adds deprecated versions into the solve """ + reuse = reuse or [] check_packages_exist(specs) node_counter = create_counter(specs, tests=self.tests, possible_graph=self.possible_graph) @@ -3088,8 +3018,7 @@ def setup( self.explicitly_required_namespaces[node.name] = node.namespace self.gen = ProblemInstanceBuilder() - compiler_parser = CompilerParser(configuration=spack.config.CONFIG).with_input_specs(specs) - + self.gen.h1("Generic information") if using_libc_compatibility(): for libc in self.libcs: self.gen.fact(fn.host_libc(libc.name, libc.version)) @@ -3097,6 +3026,10 @@ def setup( if not allow_deprecated: self.gen.fact(fn.deprecated_versions_not_allowed()) + self.gen.newline() + for pkg_name in spack.compilers.config.supported_compilers(): + self.gen.fact(fn.compiler_package(pkg_name)) + # Calculate develop specs # they will be used in addition to command line specs # in determining known versions/targets/os @@ -3113,17 +3046,35 @@ def setup( specs = tuple(specs) # ensure compatible types to add + _ = spack.compilers.config.all_compilers(init_config=True) + + # Get compilers from buildcache only if injected through "reuse" specs + supported_compilers = spack.compilers.config.supported_compilers() + compilers_from_reuse = { + x for x in reuse if x.name in supported_compilers and not x.external + } + candidate_compilers, self.rejected_compilers = possible_compilers( + configuration=spack.config.CONFIG + ) + for x in candidate_compilers: + if x.external or x in reuse: + continue + reuse.append(x) + for dep in x.traverse(root=False, deptype="run"): + reuse.extend(dep.traverse(deptype=("link", "run"))) + + candidate_compilers.update(compilers_from_reuse) + self.possible_compilers = list(candidate_compilers) + self.possible_compilers.sort() # type: ignore[call-overload] + self.gen.h1("Reusable concrete specs") self.define_concrete_input_specs(specs, self.pkgs) if reuse: self.gen.fact(fn.optimize_for_reuse()) for reusable_spec in reuse: - compiler_parser.add_compiler_from_concrete_spec(reusable_spec) self.register_concrete_spec(reusable_spec, self.pkgs) self.concrete_specs() - self.possible_compilers = compiler_parser.possible_compilers() - self.gen.h1("Generic statements on possible packages") node_counter.possible_packages_facts(self.gen, fn) @@ -3134,7 +3085,6 @@ def setup( self.gen.h1("General Constraints") self.config_compatible_os() - self.compiler_facts() # architecture defaults self.platform_defaults() @@ -3188,9 +3138,8 @@ def setup( self.gen.h1("Variant Values defined in specs") self.define_variant_values() - if WITH_RUNTIME: - self.gen.h1("Runtimes") - self.define_runtime_constraints() + self.gen.h1("Runtimes") + self.define_runtime_constraints() self.gen.h1("Version Constraints") self.collect_virtual_constraints() @@ -3230,35 +3179,49 @@ def define_runtime_constraints(self): recorder = RuntimePropertyRecorder(self) for compiler in self.possible_compilers: - compiler_with_different_cls_names = { - "oneapi": "intel-oneapi-compilers", - "clang": "llvm", - } - compiler_cls_name = compiler_with_different_cls_names.get( - compiler.spec.name, compiler.spec.name - ) try: - compiler_cls = spack.repo.PATH.get_pkg_class(compiler_cls_name) - if hasattr(compiler_cls, "runtime_constraints"): - compiler_cls.runtime_constraints(spec=compiler.spec, pkg=recorder) + compiler_cls = spack.repo.PATH.get_pkg_class(compiler.name) except spack.repo.UnknownPackageError: pass + else: + if hasattr(compiler_cls, "runtime_constraints"): + compiler_cls.runtime_constraints(spec=compiler, pkg=recorder) + # Inject default flags for compilers + recorder("*").default_flags(compiler) - # Inject libc from available compilers, on Linux - if not compiler.available: + # FIXME (compiler as nodes): think of using isinstance(compiler_cls, WrappedCompiler) + # Add a dependency on the compiler wrapper + recorder("*").depends_on( + "compiler-wrapper", + when=f"%{compiler.name}@{compiler.versions}", + type="build", + description=f"Add the compiler wrapper when using {compiler}", + ) + + if not using_libc_compatibility(): continue - current_libc = compiler.compiler_obj.default_libc + current_libc = None + if compiler.external or compiler.installed: + current_libc = CompilerPropertyDetector(compiler).default_libc() + else: + try: + current_libc = compiler["libc"] + except (KeyError, RuntimeError) as e: + tty.debug(f"{compiler} cannot determine libc because: {e}") - if using_libc_compatibility() and current_libc: + if current_libc: recorder("*").depends_on( - "libc", when=f"%{compiler.spec}", type="link", description="Add libc" + "libc", + when=f"%{compiler.name}@{compiler.versions}", + type="link", + description=f"Add libc when using {compiler}", ) recorder("*").depends_on( - str(current_libc), - when=f"%{compiler.spec}", + f"{current_libc.name}@={current_libc.version}", + when=f"%{compiler.name}@{compiler.versions}", type="link", - description="Add libc", + description=f"Libc is {current_libc} when using {compiler}", ) recorder.consume_facts() @@ -3294,6 +3257,9 @@ def literal_specs(self, specs): # These facts are needed to compute the "condition_set" of the root pkg_name = clause.args[1] self.gen.fact(fn.mentioned_in_literal(trigger_id, root_name, pkg_name)) + elif clause_name == "depends_on": + pkg_name = clause.args[2] + self.gen.fact(fn.mentioned_in_literal(trigger_id, root_name, pkg_name)) requirements.append( fn.attr( @@ -3394,8 +3360,6 @@ class _Head: node_os = fn.attr("node_os_set") node_target = fn.attr("node_target_set") variant_value = fn.attr("variant_set") - node_compiler = fn.attr("node_compiler_set") - node_compiler_version = fn.attr("node_compiler_version_set") node_flag = fn.attr("node_flag_set") propagate = fn.attr("propagate") @@ -3410,8 +3374,6 @@ class _Body: node_os = fn.attr("node_os") node_target = fn.attr("node_target") variant_value = fn.attr("variant_value") - node_compiler = fn.attr("node_compiler") - node_compiler_version = fn.attr("node_compiler_version") node_flag = fn.attr("node_flag") propagate = fn.attr("propagate") @@ -3461,102 +3423,44 @@ def value(self) -> str: return "".join(self.asp_problem) -class CompilerParser: - """Parses configuration files, and builds a list of possible compilers for the solve.""" +def possible_compilers(*, configuration) -> Tuple[Set["spack.spec.Spec"], Set["spack.spec.Spec"]]: + result, rejected = set(), set() - def __init__(self, configuration) -> None: - self.compilers: Set[KnownCompiler] = set() - for c in spack.compilers.all_compilers_from(configuration): - if using_libc_compatibility() and not c_compiler_runs(c): + # Compilers defined in configuration + for c in spack.compilers.config.all_compilers_from(configuration): + if using_libc_compatibility() and not c_compiler_runs(c): + rejected.add(c) + try: + compiler = c.extra_attributes["compilers"]["c"] tty.debug( - f"the C compiler {c.cc} does not exist, or does not run correctly." - f" The compiler {c.spec} will not be used during concretization." + f"the C compiler {compiler} does not exist, or does not run correctly." + f" The compiler {c} will not be used during concretization." ) - continue + except KeyError: + tty.debug(f"the spec {c} does not provide a C compiler.") - if using_libc_compatibility() and not c.default_libc: - warnings.warn( - f"cannot detect libc from {c.spec}. The compiler will not be used " - f"during concretization." - ) - continue + continue - target = c.target if c.target != "any" else None - candidate = KnownCompiler( - spec=c.spec, os=c.operating_system, target=target, available=True, compiler_obj=c + if using_libc_compatibility() and not CompilerPropertyDetector(c).default_libc(): + rejected.add(c) + warnings.warn( + f"cannot detect libc from {c}. The compiler will not be used " + f"during concretization." ) - if candidate in self.compilers: - warnings.warn( - f"duplicate found for {c.spec} on {c.operating_system}/{c.target}. " - f"Edit your compilers.yaml configuration to remove it." - ) - continue + continue - self.compilers.add(candidate) + if c in result: + tty.debug(f"[{__name__}] duplicate {c.long_spec} compiler found") + continue - def with_input_specs(self, input_specs: List[spack.spec.Spec]) -> "CompilerParser": - """Accounts for input specs when building the list of possible compilers. + result.add(c) - Args: - input_specs: specs to be concretized - """ - 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): - # we don't need to validate compilers for already-built specs - if s.concrete or not s.compiler: - continue + # Compilers from the local store + supported_compilers = spack.compilers.config.supported_compilers() + for pkg_name in supported_compilers: + result.update(spack.store.STORE.db.query(pkg_name)) - version = s.compiler.versions.concrete - - if not version or any(item.spec.satisfies(s.compiler) for item in self.compilers): - continue - - # Error when a compiler is not found and strict mode is enabled - if strict: - raise spack.concretize.UnavailableCompilerVersionError(s.compiler) - - # Make up a compiler matching the input spec. This is for bootstrapping. - compiler_cls = spack.compilers.class_for_compiler_name(s.compiler.name) - compiler_obj = compiler_cls( - s.compiler, operating_system=default_os, target=default_target, paths=[None] * 4 - ) - self.compilers.add( - KnownCompiler( - spec=s.compiler, - os=default_os, - target=default_target, - available=True, - compiler_obj=compiler_obj, - ) - ) - - return self - - def add_compiler_from_concrete_spec(self, spec: spack.spec.Spec) -> None: - """Account for compilers that are coming from concrete specs, through reuse. - - Args: - spec: concrete spec to be reused - """ - assert spec.concrete, "the spec argument must be concrete" - candidate = KnownCompiler( - spec=spec.compiler, - os=str(spec.architecture.os), - target=str(spec.architecture.target.family), - available=False, - compiler_obj=None, - ) - self.compilers.add(candidate) - - def possible_compilers(self) -> List[KnownCompiler]: - # Here we have to sort two times, first sort by name and ascending version - result = sorted(self.compilers, key=lambda x: (x.spec.name, x.spec.version), reverse=True) - # Then stable sort to prefer available compilers and account for preferences - ppk = spack.package_prefs.PackagePrefs("all", "compiler", all=False) - result.sort(key=lambda x: (not x.available, ppk(x.spec))) - return result + return result, rejected class RuntimePropertyRecorder: @@ -3599,15 +3503,7 @@ def reset(self): """Resets the current state.""" self.current_package = None - def depends_on( - self, - dependency_str: str, - *, - when: str, - type: str, - description: str, - languages: Optional[List[str]] = None, - ) -> None: + def depends_on(self, dependency_str: str, *, when: str, type: str, description: str) -> None: """Injects conditional dependencies on packages. Conditional dependencies can be either "real" packages or virtual dependencies. @@ -3616,7 +3512,6 @@ def depends_on( dependency_str: the dependency spec to inject when: anonymous condition to be met on a package to have the dependency type: dependency type - languages: languages needed by the package for the dependency to be considered description: human-readable description of the rule for adding the dependency """ # TODO: The API for this function is not final, and is still subject to change. At @@ -3632,25 +3527,10 @@ def depends_on( if dependency_spec.versions != vn.any_version: self._setup.version_constraints.add((dependency_spec.name, dependency_spec.versions)) - placeholder = "XXX" - node_variable = "node(ID, Package)" - when_spec.name = placeholder - - body_clauses = self._setup.spec_clauses(when_spec, body=True) - body_str = ( - f" {f',{os.linesep} '.join(str(x) for x in body_clauses)},\n" - f" not external({node_variable}),\n" - f" not runtime(Package)" - ).replace(f'"{placeholder}"', f"{node_variable}") - if languages: - body_str += ",\n" - for language in languages: - body_str += f' attr("language", {node_variable}, "{language}")' + body_str, node_variable = self.rule_body_from(when_spec) head_clauses = self._setup.spec_clauses(dependency_spec, body=False) - runtime_pkg = dependency_spec.name - is_virtual = head_clauses[0].args[0] == "virtual_node" main_rule = ( f"% {description}\n" @@ -3685,6 +3565,38 @@ def depends_on( self.reset() + @staticmethod + def node_for(name: str) -> str: + return f'node(ID{name.replace("-", "_")}, "{name}")' + + def rule_body_from(self, when_spec: "spack.spec.Spec") -> Tuple[str, str]: + """Computes the rule body from a "when" spec, and returns it, along with the + node variable. + """ + + node_placeholder = "XXX" + node_variable = "node(ID, Package)" + when_substitutions = {} + for s in when_spec.traverse(root=False): + when_substitutions[f'"{s.name}"'] = self.node_for(s.name) + when_spec.name = node_placeholder + body_clauses = self._setup.spec_clauses(when_spec, body=True) + for clause in body_clauses: + if clause.args[0] == "virtual_on_incoming_edges": + # Substitute: attr("virtual_on_incoming_edges", ProviderNode, Virtual) + # with: attr("virtual_on_edge", ParentNode, ProviderNode, Virtual) + # (avoid adding virtuals everywhere, if a single edge needs it) + _, provider, virtual = clause.args + clause.args = "virtual_on_edge", node_placeholder, provider, virtual + body_str = ( + f" {f',{os.linesep} '.join(str(x) for x in body_clauses)},\n" + f" not external({node_variable}),\n" + f" not runtime(Package)" + ).replace(f'"{node_placeholder}"', f"{node_variable}") + for old, replacement in when_substitutions.items(): + body_str = body_str.replace(old, replacement) + return body_str, node_variable + def requires(self, impose: str, *, when: str): """Injects conditional requirements on a given package. @@ -3699,7 +3611,6 @@ def requires(self, impose: str, *, when: str): when_spec = spack.spec.Spec(f"{self.current_package}{when}") assert imposed_spec.versions.concrete, f"{impose} must have a concrete version" - assert when_spec.compiler.concrete, f"{when} must have a concrete compiler" # Add versions to possible versions for s in (imposed_spec, when_spec): @@ -3720,32 +3631,53 @@ def propagate(self, constraint_str: str, *, when: str): when_spec = spack.spec.Spec(when) assert when_spec.name is None, "only anonymous when specs are accepted" - placeholder = "XXX" - node_variable = "node(ID, Package)" - when_spec.name = placeholder - - body_clauses = self._setup.spec_clauses(when_spec, body=True) - body_str = ( - f" {f',{os.linesep} '.join(str(x) for x in body_clauses)},\n" - f" not external({node_variable}),\n" - f" not runtime(Package)" - ).replace(f'"{placeholder}"', f"{node_variable}") + when_substitutions = {} + for s in when_spec.traverse(root=False): + when_substitutions[f'"{s.name}"'] = self.node_for(s.name) + body_str, node_variable = self.rule_body_from(when_spec) constraint_spec = spack.spec.Spec(constraint_str) - assert constraint_spec.name is None, "only anonymous constraint specs are accepted" - constraint_spec.name = placeholder constraint_clauses = self._setup.spec_clauses(constraint_spec, body=False) for clause in constraint_clauses: - if clause.args[0] == "node_compiler_version_satisfies": - self._setup.compiler_version_constraints.add(constraint_spec.compiler) - args = f'"{constraint_spec.compiler.name}", "{constraint_spec.compiler.versions}"' - head_str = f"propagate({node_variable}, node_compiler_version_satisfies({args}))" + if clause.args[0] == "node_version_satisfies": + self._setup.version_constraints.add( + (constraint_spec.name, constraint_spec.versions) + ) + args = f'"{constraint_spec.name}", "{constraint_spec.versions}"' + head_str = f"propagate({node_variable}, node_version_satisfies({args}))" rule = f"{head_str} :-\n{body_str}.\n\n" self.rules.append(rule) self.reset() + def default_flags(self, spec: "spack.spec.Spec"): + if not spec.external or "flags" not in spec.extra_attributes: + self.reset() + return + + when_spec = spack.spec.Spec(f"^[deptypes=build] {spec}") + body_str, node_variable = self.rule_body_from(when_spec) + + node_placeholder = "XXX" + flags = spec.extra_attributes["flags"] + root_spec_str = f"{node_placeholder}" + for flag_type, default_values in flags.items(): + root_spec_str = f"{root_spec_str} {flag_type}='{default_values}'" + root_spec = spack.spec.Spec(root_spec_str) + head_clauses = self._setup.spec_clauses( + root_spec, body=False, context=SourceContext(source="compiler") + ) + self.rules.append(f"% Default compiler flags for {spec}\n") + for clause in head_clauses: + if clause.args[0] == "node": + continue + head_str = str(clause).replace(f'"{node_placeholder}"', f"{node_variable}") + rule = f"{head_str} :-\n{body_str}.\n\n" + self.rules.append(rule) + + self.reset() + def consume_facts(self): """Consume the facts collected by this object, and emits rules and facts for the runtimes. @@ -3785,7 +3717,6 @@ class SpecBuilder: r"^compatible_libc$", r"^dependency_holds$", r"^external_conditions_hold$", - r"^node_compiler$", r"^package_hash$", r"^root$", r"^track_dependencies$", @@ -3866,10 +3797,6 @@ def variant_selected(self, node, name, value, variant_type, variant_id): def version(self, node, version): self._specs[node].versions = vn.VersionList([vn.Version(version)]) - 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, node_flag): self._specs[node].compiler_flags.add_flag( node_flag.flag_type, node_flag.flag, False, node_flag.flag_group, node_flag.source @@ -3924,17 +3851,14 @@ def reorder_flags(self): 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( - (c.spec, c) for c in reversed(spack.compilers.all_compilers_from(spack.config.CONFIG)) - ) - cmd_specs = dict((s.name, s) for spec in self._command_line_specs for s in spec.traverse()) + cmd_specs = {s.name: s for spec in self._command_line_specs for s in spec.traverse()} for node, spec in self._specs.items(): # if bootstrapping, compiler is not in config and has no flags - flagmap_from_compiler = {} - if spec.compiler in compilers: - flagmap_from_compiler = compilers[spec.compiler].flags + flagmap_from_compiler = { + flag_type: [x for x in values if x.source == "compiler"] + for flag_type, values in spec.compiler_flags.items() + } for flag_type in spec.compiler_flags.valid_compiler_flags(): ordered_flags = [] @@ -3982,7 +3906,7 @@ def _order_index(flag_group): for grp in prioritized_groups: grp_flags = tuple( - x for (x, y) in spack.compiler.tokenize_flags(grp.flag_group) + x for (x, y) in spack.compilers.flags.tokenize_flags(grp.flag_group) ) if grp_flags == from_compiler: continue @@ -4050,9 +3974,8 @@ def sort_fn(function_tuple) -> Tuple[int, int]: return (-1, 0) def build_specs(self, function_tuples): - # Functions don't seem to be in particular order in output. Sort - # them here so that directives that build objects (like node and - # node_compiler) are called in the right order. + # Functions don't seem to be in particular order in output. Sort them here so that + # directives that build objects, like node, are called in the right order. self.function_tuples = sorted(set(function_tuples), key=self.sort_fn) self._specs = {} for name, args in self.function_tuples: @@ -4116,6 +4039,14 @@ def build_specs(self, function_tuples): for root in roots.values(): root._finalize_concretization() + # Unify hashes (this is to avoid duplicates of runtimes and compilers) + unifier = ConcreteSpecsByHash() + keys = list(self._specs) + for key in keys: + current_spec = self._specs[key] + unifier.add(current_spec) + self._specs[key] = unifier[current_spec.dag_hash()] + # Only attempt to resolve automatic splices if the solver produced any if self._splices: resolved_splices = spack.solver.splicing._resolve_collected_splices( @@ -4303,6 +4234,9 @@ def _is_reusable(spec: spack.spec.Spec, packages, local: bool) -> bool: if "dev_path" in spec.variants: return False + if spec.name == "compiler-wrapper": + return False + if not spec.external: return _has_runtime_dependencies(spec) @@ -4330,13 +4264,12 @@ def _is_reusable(spec: spack.spec.Spec, packages, local: bool) -> bool: def _has_runtime_dependencies(spec: spack.spec.Spec) -> bool: - if not WITH_RUNTIME: - return True - - if spec.compiler.name == "gcc" and not spec.dependencies("gcc-runtime"): + # TODO (compiler as nodes): this function contains specific names from builtin, and should + # be made more general + if "gcc" in spec and "gcc-runtime" not in spec: return False - if spec.compiler.name == "oneapi" and not spec.dependencies("intel-oneapi-runtime"): + if "intel-oneapi-compilers" in spec and "intel-oneapi-runtime" not in spec: return False return True @@ -4581,14 +4514,38 @@ def __init__(self): self.selector = ReusableSpecsSelector(configuration=spack.config.CONFIG) @staticmethod - def _check_input_and_extract_concrete_specs(specs): - reusable = [] + def _check_input_and_extract_concrete_specs( + specs: List[spack.spec.Spec], + ) -> List[spack.spec.Spec]: + reusable: List[spack.spec.Spec] = [] + analyzer = create_graph_analyzer() for root in specs: for s in root.traverse(): if s.concrete: reusable.append(s) - elif spack.repo.PATH.is_virtual(s.name): - continue + else: + if spack.repo.PATH.is_virtual(s.name): + continue + # Error if direct dependencies cannot be satisfied + deps = {edge.spec.name for edge in s.edges_to_dependencies() if edge.direct} + if deps: + graph = analyzer.possible_dependencies( + s, allowed_deps=dt.ALL, transitive=False + ) + deps.difference_update(graph.real_pkgs, graph.virtuals) + if deps: + start_str = f"'{root}'" if s == root else f"'{s}' in '{root}'" + raise UnsatisfiableSpecError( + f"{start_str} cannot depend on {', '.join(deps)}" + ) + + try: + spack.repo.PATH.get_pkg_class(s.fullname) + except spack.repo.UnknownPackageError: + raise UnsatisfiableSpecError( + f"cannot concretize '{root}', since '{s.name}' does not exist" + ) + spack.spec.Spec.ensure_valid_variants(s) return reusable @@ -4745,3 +4702,7 @@ def __init__(self, provided, conflicts): class InvalidSpliceError(spack.error.SpackError): """For cases in which the splice configuration is invalid.""" + + +class NoCompilerFoundError(spack.error.SpackError): + """Raised when there is no possible compiler""" diff --git a/lib/spack/spack/solver/concretize.lp b/lib/spack/spack/solver/concretize.lp index 287128206ac..de25bbf5dac 100644 --- a/lib/spack/spack/solver/concretize.lp +++ b/lib/spack/spack/solver/concretize.lp @@ -38,8 +38,6 @@ internal_error("Only nodes can have node_os"). :- attr("node_target", PackageNode, _), not attr("node", PackageNode), internal_error("Only nodes can have node_target"). -:- attr("node_compiler_version", PackageNode, _, _), not attr("node", PackageNode), - 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), @@ -146,6 +144,15 @@ unification_set(SetID, VirtualNode) max_dupes(Package, X), ID1=0..X-1, ID2=0..X-1, ID2 < ID1, internal_error("virtual node skipped id number"). +% Prefer to assign lower ID to virtuals associated with a lower penalty provider +:- not unification_set("root", node(X, Virtual)), + not unification_set("root", node(Y, Virtual)), + X < Y, + provider_weight(_, node(X, Virtual), WeightX), + provider_weight(_, node(Y, Virtual), WeightY), + WeightY < WeightX. + + %----------------------------------------------------------------------------- % Map literal input specs to facts that drive the solve %----------------------------------------------------------------------------- @@ -216,14 +223,6 @@ error(100, multiple_values_error, Attribute, Package) attr_single_value(Attribute), 2 { attr(Attribute, node(ID, Package), Value) }. -%----------------------------------------------------------------------------- -% Languages used -%----------------------------------------------------------------------------- - -attr("language", node(X, Package), Language) :- - condition_holds(ConditionID, node(X, Package)), - pkg_fact(Package,language(ConditionID, Language)). - %----------------------------------------------------------------------------- % Version semantics %----------------------------------------------------------------------------- @@ -315,20 +314,17 @@ possible_version_weight(node(ID, Package), Weight) { attr("version", node(ID, Package), Version) : pkg_fact(Package, version_satisfies(Constraint, Version)) } :- attr("node_version_satisfies", node(ID, Package), Constraint). -% If there is at least a version that satisfy the constraint, impose a lower -% bound on the choice rule to avoid false positives with the error below -1 { attr("version", node(ID, Package), Version) : pkg_fact(Package, version_satisfies(Constraint, Version)) } - :- attr("node_version_satisfies", node(ID, Package), Constraint), - pkg_fact(Package, version_satisfies(Constraint, _)), - internal_error("must choose a single version to satisfy version constraints"). - % More specific error message if the version cannot satisfy some constraint % Otherwise covered by `no_version_error` and `versions_conflict_error`. -error(10, "Cannot satisfy '{0}@{1}'", Package, Constraint) +error(1, "Cannot satisfy '{0}@{1}'", Package, Constraint) :- attr("node_version_satisfies", node(ID, Package), Constraint), attr("version", node(ID, Package), Version), not pkg_fact(Package, version_satisfies(Constraint, Version)). +error(10, "Cannot satisfy '{0}@{1}'", Package, Constraint) + :- attr("node_version_satisfies", node(ID, Package), Constraint), + not attr("version", node(ID, Package), _). + attr("node_version_satisfies", node(ID, Package), Constraint) :- attr("version", node(ID, Package), Version), pkg_fact(Package, version_satisfies(Constraint, Version)). @@ -377,6 +373,7 @@ trigger_node(ID, node(PackageID, Package), node(VirtualID, Virtual)) :- pkg_fact condition_nodes(TriggerID, PackageNode, node(X, A1)) :- condition_packages(TriggerID, A1), condition_set(PackageNode, node(X, A1)), + not self_build_requirement(PackageNode, node(X, A1)), trigger_node(TriggerID, PackageNode, _). cannot_hold(TriggerID, PackageNode) @@ -391,6 +388,7 @@ 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("depends_on", node(X, A1), node(Y, A2), A3) : condition_requirement(ID, "depends_on", A1, A2, A3), condition_nodes(ID, PackageNode, node(X, A1)), condition_nodes(ID, PackageNode, node(Y, A2)); not cannot_hold(ID, PackageNode). condition_holds(ConditionID, node(X, Package)) @@ -420,7 +418,12 @@ imposed_nodes(EffectID, node(NodeID, Package), node(X, A1)) pkg_fact(Package, condition_effect(ID, EffectID)), imposed_packages(EffectID, A1), condition_set(node(NodeID, Package), node(X, A1)), - trigger_node(TriggerID, _, node(NodeID, Package)). + trigger_node(TriggerID, _, node(NodeID, Package)), + % We don't want to add build requirements to imposed nodes, to avoid + % unsat problems when we deal with self-dependencies: gcc@14 %gcc@10 + not self_build_requirement(node(NodeID, Package), node(X, A1)). + +self_build_requirement(node(X, Package), node(Y, Package)) :- build_requirement(node(X, Package), node(Y, Package)). imposed_nodes(ConditionID, PackageNode, node(X, A1)) :- imposed_packages(ConditionID, A1), @@ -456,6 +459,49 @@ provider(ProviderNode, VirtualNode) :- attr("provider_set", ProviderNode, Virtua imposed_constraint(ID, "depends_on", A1, A2, A3), internal_error("Build deps must land in exactly one duplicate"). +% The rule below accounts for expressions like: +% +% root ^dep %compiler +% +% where "compiler" is a dependency of "dep", but is enforced by a condition imposed by "root" +1 { attr("depends_on", node(A1_DUPE_ID, A1), node(0..Y-1, A2), A3) : max_dupes(A2, Y) } 1 + :- impose(ID, RootNode), + unification_set("root", RootNode), + condition_set(RootNode, node(A1_DUPE_ID, A1)), + not self_build_requirement(RootNode, node(A1_DUPE_ID, A1)), + imposed_constraint(ID, "depends_on", A1, A2, A3), + internal_error("Build deps must land in exactly one duplicate"). + +1 { build_requirement(node(X, Parent), node(0..Y-1, BuildDependency)) : max_dupes(BuildDependency, Y) } 1 + :- attr("build_requirement", node(X, Parent), build_requirement("node", BuildDependency)), + impose(ID, node(X, Parent)), + imposed_constraint(ID,"build_requirement",Parent,_). + +1 { virtual_build_requirement(ParentNode, node(0..Y-1, Virtual)) : max_dupes(Virtual, Y) } 1 + :- attr("dependency_holds", ParentNode, Virtual, "build"), + not attr("dependency_holds", ParentNode, Virtual,"link"), + not attr("dependency_holds", ParentNode, Virtual,"run"), + virtual(Virtual). + +attr("virtual_node", VirtualNode) :- virtual_build_requirement(ParentNode, VirtualNode). +build_requirement(ParentNode, ProviderNode) :- virtual_build_requirement(ParentNode, VirtualNode), provider(ProviderNode, VirtualNode). + +% From cli we can have literal expressions like: +% +% root %gcc@12.0 ^dep %gcc@11.2 +% +% Adding a "build_requirement" is a way to discriminate between the incompatible +% version constraints on "gcc" in the "imposed_constraint". +attr("node_version_satisfies", node(X, BuildDependency), Constraint) :- + attr("build_requirement", ParentNode, build_requirement("node_version_satisfies", BuildDependency, Constraint)), + build_requirement(ParentNode, node(X, BuildDependency)). + +attr("depends_on", node(X, Parent), node(Y, BuildDependency), "build") :- build_requirement(node(X, Parent), node(Y, BuildDependency)). + +1 { attr("provider_set", node(X, BuildDependency), node(0..Y-1, Virtual)) : max_dupes(Virtual, Y) } 1 :- + attr("build_requirement", ParentNode, build_requirement("provider_set", BuildDependency, Virtual)), + build_requirement(ParentNode, node(X, BuildDependency)). + % Reconstruct virtual dependencies for reused specs attr("virtual_on_edge", node(X, A1), node(Y, A2), Virtual) :- impose(ID, node(X, A1)), @@ -495,9 +541,15 @@ virtual_condition_holds(node(Y, A2), Virtual) %----------------------------------------------------------------------------- % Concrete specs %----------------------------------------------------------------------------- + % if a package is assigned a hash, it's concrete. concrete(PackageNode) :- attr("hash", PackageNode, _), attr("node", PackageNode). +:- concrete(PackageNode), + depends_on(PackageNode, DependencyNode), + not concrete(DependencyNode), + not abi_splice_conditions_hold(_, DependencyNode, _, _). + %----------------------------------------------------------------------------- % Dependency semantics %----------------------------------------------------------------------------- @@ -519,11 +571,51 @@ attr("track_dependencies", Node) :- build(Node), not external(Node). % this ensures a user can't say `zlib ^libiconv` (neither of which have any % dependencies) and get a two-node unconnected graph needed(PackageNode) :- attr("root", PackageNode). -needed(DependencyNode) :- needed(PackageNode), depends_on(PackageNode, DependencyNode). +needed(ChildNode) :- edge_needed(ParentNode, ChildNode). + +edge_needed(ParentNode, node(X, Child)) :- depends_on(ParentNode, node(X, Child)), runtime(Child). +edge_needed(ParentNode, ChildNode) :- depends_on(ParentNode, ChildNode) , concrete(ParentNode). + +edge_needed(ParentNode, node(X, Child)) :- + depends_on(ParentNode, node(X, Child)), + build(ParentNode), + attr("dependency_holds", ParentNode, Child, _). + +virtual_edge_needed(ParentNode, ChildNode, node(X, Virtual)) :- + depends_on(ParentNode, ChildNode), + build(ParentNode), + node_depends_on_virtual(ParentNode, Virtual), + provider(ChildNode, node(X, Virtual)). + +virtual_edge_needed(ParentNode, ChildNode, node(X, Virtual)) :- + concrete(ParentNode), + concrete(ChildNode), + provider(ChildNode, node(X, Virtual)), + attr("virtual_on_edge", ParentNode, ChildNode, Virtual). + +virtual_edge_needed(ParentNode, ChildNode, node(X, Virtual)) :- + concrete(ParentNode), + abi_splice_conditions_hold(_, ChildNode, _, _), + provider(ChildNode, node(X, Virtual)), + attr("virtual_on_edge", ParentNode, ChildNode, Virtual). + + +edge_needed(ParentNode, ChildNode) :- virtual_edge_needed(ParentNode, ChildNode, _). +provider_needed(ChildNode, VirtualNode) :- virtual_edge_needed(_, ChildNode, VirtualNode). +provider_needed(ChildNode, VirtualNode) :- attr("virtual_root", VirtualNode), provider(ChildNode, VirtualNode). + error(10, "'{0}' is not a valid dependency for any package in the DAG", Package) :- attr("node", node(ID, Package)), not needed(node(ID, Package)). +:- depends_on(ParentNode, ChildNode), + not edge_needed(ParentNode, ChildNode), + build(ParentNode). + +:- provider(PackageNode, VirtualNode), + not provider_needed(PackageNode, VirtualNode), + not attr("virtual_root", VirtualNode). + % Extensions depending on each other must all extend the same node (e.g. all Python packages % depending on each other must depend on the same Python interpreter) @@ -534,6 +626,7 @@ error(100, "{0} and {1} must depend on the same {2}", ExtensionParent, Extension depends_on(ExtensionChild, node(Y, ExtendeePackage)), X != Y. + #defined dependency_type/2. %----------------------------------------------------------------------------- @@ -560,14 +653,18 @@ possible_provider_weight(ProviderNode, VirtualNode, 0, "Set on the command line" % Enforces all virtuals to be provided, if multiple of them are provided together error(100, "Package '{0}' needs to provide both '{1}' and '{2}' together, but provides only '{1}'", Package, Virtual1, Virtual2) -:- condition_holds(ID, node(X, Package)), +:- % This package provides 2 or more virtuals together + condition_holds(ID, node(X, Package)), pkg_fact(Package, provided_together(ID, SetID, Virtual1)), pkg_fact(Package, provided_together(ID, SetID, Virtual2)), Virtual1 != Virtual2, - attr("virtual_on_incoming_edges", node(X, Package), Virtual1), - not attr("virtual_on_incoming_edges", node(X, Package), Virtual2), - attr("virtual_node", node(_, Virtual1)), - attr("virtual_node", node(_, Virtual2)). + % One node depends on those virtuals AND on this package + node_depends_on_virtual(ClientNode, Virtual1), + node_depends_on_virtual(ClientNode, Virtual2), + depends_on(ClientNode, node(X, Package)), + % But this package is a provider of only one of them + provider(node(X, Package), node(_, Virtual1)), + not provider(node(X, Package), node(_, Virtual2)). % if a package depends on a virtual, it's not external and we have a % provider for that virtual then it depends on the provider @@ -612,8 +709,8 @@ attr("virtual_on_incoming_edges", ProviderNode, Virtual) % The provider must be selected among the possible providers. error(100, "'{0}' cannot be a provider for the '{1}' virtual", Package, Virtual) - :- attr("provider_set", node(min_dupe_id, Package), node(min_dupe_id, Virtual)), - not virtual_condition_holds( node(min_dupe_id, Package), Virtual). + :- attr("provider_set", node(X, Package), node(Y, Virtual)), + not virtual_condition_holds( node(X, Package), Virtual). error(100, "Cannot find valid provider for virtual {0}", Virtual) :- attr("virtual_node", node(X, Virtual)), @@ -653,7 +750,9 @@ do_not_impose(EffectID, node(X, Package)) virtual_condition_holds(_, PossibleProvider, Virtual), PossibleProvider != ProviderNode, explicitly_requested_root(PossibleProvider), + not self_build_requirement(PossibleProvider, ProviderNode), not explicitly_requested_root(ProviderNode), + not language(Virtual), internal_error("If a root can provide a virtual, it must be the provider"). % A package cannot be the actual provider for a virtual if it does not @@ -736,6 +835,16 @@ attr("external_spec_selected", node(ID, Package), LocalIndex) :- attr("node", node(ID, Package)), not attr("hash", node(ID, Package), _). +% Account for compiler annotation on externals +:- not attr("root", ExternalNode), + attr("external_build_requirement", ExternalNode, build_requirement("node", Compiler)), + not node_compiler(_, node(_, Compiler)). + +1 { attr("node_version_satisfies", node(X, Compiler), Constraint) : node_compiler(_, node(X, Compiler)) } + :- not attr("root", ExternalNode), + attr("external_build_requirement", ExternalNode, build_requirement("node", Compiler)), + attr("external_build_requirement", ExternalNode, build_requirement("node_version_satisfies", Compiler, Constraint)). + % it cannot happen that a spec is external, but none of the external specs % conditions hold. error(100, "Attempted to use external for '{0}' which does not satisfy any configured external spec", Package) @@ -797,8 +906,10 @@ required_provider(Provider, Virtual) pkg_fact(Virtual, condition_effect(ConditionID, EffectID)), imposed_constraint(EffectID, "node", Provider). -:- provider(node(Y, Package), node(X, Virtual)), required_provider(Provider, Virtual), Package != Provider, - internal_error("If a provider is required the concretizer must use it"). +error(1, "Trying to use {0} as a provider for {1}, but {2} is required", Package, Virtual, Provider) :- + provider(node(Y, Package), node(X, Virtual)), + required_provider(Provider, Virtual), + Package != Provider. % TODO: the following choice rule allows the solver to add compiler % flags if their only source is from a requirement. This is overly-specific @@ -1151,14 +1262,19 @@ error(100, "Cannot propagate the variant '{0}' from the package: {1} because pac % A propagated flag implies: % 1. The same flag type is not set on this node -% 2. This node has the same compiler as the propagation source +% 2. This node has the same compilers as the propagation source + +node_compiler(node(X, Package), node(Y, Compiler)) :- node_compiler(node(X, Package), node(Y, Compiler), Language). + +node_compiler(node(X, Package), node(Y, Compiler), Language) :- + attr("virtual_on_edge", node(X, Package), node(Y, Compiler), Language), + compiler(Compiler), language(Language). 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), + % Same compilers as propagation source + node_compiler(node(PackageID, Package), CompilerNode, Language) : node_compiler(SourceNode, CompilerNode, Language); attr("propagate", SourceNode, node_flag(FlagType, Flag, FlagGroup, Source), _), node(PackageID, Package) != SourceNode, not runtime(Package). @@ -1166,7 +1282,7 @@ propagated_flag(node(PackageID, Package), node_flag(FlagType, Flag, FlagGroup, S 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) :- +error(100, "{0} and {1} cannot both propagate compiler flags '{2}' to {3}", Source1, Source2, FlagType, Package) :- propagated_flag(node(ID, Package), node_flag(FlagType, _, _, _), node(_, Source1)), propagated_flag(node(ID, Package), node_flag(FlagType, _, _, _), node(_, Source2)), Source1 < Source2. @@ -1175,12 +1291,30 @@ error(100, "{0} and {1} cannot both propagate compiler flags '{2}' to {3}", Sour % Compiler constraints %---- -attr("node_compiler_version_satisfies", node(ID, Package), Compiler, Version) :- - propagate(node(ID, Package), node_compiler_version_satisfies(Compiler, Version)), - node_compiler(node(ID, Package), CompilerID), - compiler_name(CompilerID, Compiler), - not runtime(Package), - not external(Package). +% If a node is built, impose constraints on the compiler coming from dependents +attr("node_version_satisfies", node(Y, Compiler), VersionRange) :- + propagate(node(X, Package), node_version_satisfies(Compiler, VersionRange)), + attr("depends_on", node(X, Package), node(Y, Compiler), "build"), + not external(node(X, Package)), + not runtime(Package). + +attr("node_version_satisfies", node(X, Runtime), VersionRange) :- + attr("node", node(X, Runtime)), + attr("compatible_runtime", PackageNode, Runtime, VersionRange), + concrete(PackageNode). + +% If a compiler package is depended on with type link, it's used as a library +compiler_used_as_a_library(node(X, Child), Hash) :- + concrete(node(X, Child)), + attr("hash", node(X, Child), Hash), + compiler_package(Child), % Used to restrict grounding for this rule + attr("depends_on", _, node(X, Child), "link"). + +% If a compiler is used for C on a package, it must provide C++ too, if need be, and vice-versa +:- attr("virtual_on_edge", PackageNode, CompilerNode1, "c"), + attr("virtual_on_edge", PackageNode, CompilerNode2, "cxx"), + CompilerNode1 != CompilerNode2. + %----------------------------------------------------------------------------- % Runtimes @@ -1189,11 +1323,14 @@ attr("node_compiler_version_satisfies", node(ID, Package), Compiler, Version) :- % Check whether the DAG has any built package has_built_packages() :- build(X), not external(X). -% If we build packages, the runtime nodes must use an available compiler -1 { node_compiler(PackageNode, CompilerID) : build(PackageNode), not external(PackageNode) } :- - has_built_packages(), - runtime(RuntimePackage), - node_compiler(node(_, RuntimePackage), CompilerID). +% "gcc-runtime" is always built +:- concrete(node(X, "gcc-runtime")), has_built_packages(). + +% The "gcc" linked to "gcc-runtime" must be used by at least another package +:- attr("depends_on", node(X, "gcc-runtime"), node(Y, "gcc"), "build"), + node_compiler(_, node(_, "gcc")), + not 2 { attr("depends_on", PackageNode, node(Y, "gcc"), "build") : attr("node", PackageNode) }. + %----------------------------------------------------------------------------- % Platform semantics @@ -1266,7 +1403,7 @@ attr("node_target_satisfies", PackageNode, Constraint) % If a node has a target, all of its dependencies must be compatible with that target error(100, "Cannot find compatible targets for {0} and {1}", Package, Dependency) - :- depends_on(node(X, Package), node(Y, Dependency)), + :- attr("depends_on", node(X, Package), node(Y, Dependency), Type), Type != "build", attr("node_target", node(X, Package), Target), not node_target_compatible(node(Y, Dependency), Target). @@ -1278,29 +1415,33 @@ node_target_compatible(PackageNode, Target) target_compatible(Target, MyTarget). #defined target_satisfies/2. +compiler(Compiler) :- compiler_supports_target(Compiler, _, _). -% can't use targets on node if the compiler for the node doesn't support them -error(100, "{0} compiler '{2}@{3}' incompatible with 'target={1}'", Package, Target, Compiler, Version) +% Can't use targets on node if the compiler for the node doesn't support them +language("c"). +language("cxx"). +language("fortran"). +language_runtime("fortran-rt"). + +error(10, "Only external, or concrete, compilers are allowed for the {0} language", Language) + :- provider(ProviderNode, node(_, Language)), + language(Language), + not external(ProviderNode), + not concrete(ProviderNode). + +error(10, "{0} compiler '{2}@{3}' incompatible with 'target={1}'", Package, Target, Compiler, Version) :- attr("node_target", node(X, Package), Target), - node_compiler(node(X, Package), CompilerID), - not compiler_supports_target(CompilerID, Target), - compiler_name(CompilerID, Compiler), - compiler_version(CompilerID, Version), + node_compiler(node(X, Package), node(Y, Compiler)), + attr("version", node(Y, Compiler), Version), + not compiler_supports_target(Compiler, Version, Target), build(node(X, Package)). #defined compiler_supports_target/2. -#defined compiler_available/1. % if a target is set explicitly, respect it attr("node_target", PackageNode, Target) :- attr("node", PackageNode), attr("node_target_set", PackageNode, Target). -% each node has the weight of its assigned target -target_weight(Target, 0) - :- attr("node", PackageNode), - attr("node_target", PackageNode, Target), - attr("node_target_set", PackageNode, Target). - node_target_weight(PackageNode, MinWeight) :- attr("node", PackageNode), attr("node_target", PackageNode, Target), @@ -1325,150 +1466,12 @@ error(100, "'{0} target={1}' is not compatible with this machine", Package, Targ attr("node_target", node(X, Package), Target), not target(Target). -%----------------------------------------------------------------------------- -% Compiler semantics -%----------------------------------------------------------------------------- -% There must be only one compiler set per built node. -{ node_compiler(PackageNode, CompilerID) : compiler_id(CompilerID), compiler_available(CompilerID) } :- - attr("node", PackageNode), - build(PackageNode). - -% Infer the compiler that matches a reused node -node_compiler(PackageNode, CompilerID) - :- attr("node_compiler_version", PackageNode, CompilerName, CompilerVersion), - attr("node", PackageNode), - compiler_name(CompilerID, CompilerName), - compiler_version(CompilerID, CompilerVersion), - concrete(PackageNode). - -% Expand the internal attribute into "attr("node_compiler_version") -attr("node_compiler_version", PackageNode, CompilerName, CompilerVersion) - :- node_compiler(PackageNode, CompilerID), - compiler_name(CompilerID, CompilerName), - compiler_version(CompilerID, CompilerVersion), - compiler_available(CompilerID), - build(PackageNode). - -attr("node_compiler", PackageNode, CompilerName) - :- attr("node_compiler_version", PackageNode, CompilerName, CompilerVersion). - -error(100, "No valid compiler version found for '{0}'", Package) - :- attr("node", node(X, Package)), - not node_compiler(node(X, Package), _). - -% We can't have a compiler be enforced and select the version from another compiler -error(100, "Cannot select a single compiler for package {0}", Package) - :- attr("node", node(X, Package)), - 2 { attr("node_compiler_version", node(X, Package), C, V) }. - -% If the compiler of a node cannot be satisfied, raise -error(10, "No valid compiler for {0} satisfies '%{1}'", Package, Compiler) - :- attr("node", node(X, Package)), - attr("node_compiler_version_satisfies", node(X, Package), Compiler, ":"), - not compiler_version_satisfies(Compiler, ":", _). - -% If the compiler of a node must satisfy a constraint, then its version -% must be chosen among the ones that satisfy said constraint -error(100, "Package {0} cannot satisfy '%{1}@{2}'", Package, Compiler, Constraint) - :- attr("node", node(X, Package)), - attr("node_compiler_version_satisfies", node(X, Package), Compiler, Constraint), - not compiler_version_satisfies(Compiler, Constraint, _). - -error(100, "Package {0} cannot satisfy '%{1}@{2}'", Package, Compiler, Constraint) - :- attr("node", node(X, Package)), - attr("node_compiler_version_satisfies", node(X, Package), Compiler, Constraint), - not compiler_version_satisfies(Compiler, Constraint, ID), - node_compiler(node(X, Package), ID). - -% If the node is associated with a compiler and the compiler satisfy a constraint, then -% the compiler associated with the node satisfy the same constraint -attr("node_compiler_version_satisfies", PackageNode, Compiler, Constraint) - :- node_compiler(PackageNode, CompilerID), - compiler_name(CompilerID, Compiler), - compiler_version_satisfies(Compiler, Constraint, CompilerID). - -#defined compiler_version_satisfies/3. - -% If the compiler version was set from the command line, -% respect it verbatim -error(100, "Cannot set the required compiler: {2}%{0}@{1}", Compiler, Version, Package) - :- attr("node_compiler_version_set", node(X, Package), Compiler, Version), - not attr("node_compiler_version", node(X, Package), Compiler, Version). - -error(100, "Cannot set the required compiler: {1}%{0}", Compiler, Package) - :- attr("node_compiler_set", node(X, Package), Compiler), - not attr("node_compiler_version", node(X, Package), Compiler, _). - -% Cannot select a compiler if it is not supported on the OS -% Compilers that are explicitly marked as allowed -% are excluded from this check -error(100, "{0} compiler '%{1}@{2}' incompatible with 'os={3}'", Package, Compiler, Version, OS) - :- attr("node_os", node(X, Package), OS), - node_compiler(node(X, Package), CompilerID), - compiler_name(CompilerID, Compiler), - compiler_version(CompilerID, Version), - compiler_os(CompilerID, CompilerOS), - not os_compatible(CompilerOS, OS), - build(node(X, Package)). - -% If a package and one of its dependencies don't have the -% same compiler there's a mismatch. -compiler_match(PackageNode, DependencyNode) - :- depends_on(PackageNode, DependencyNode), - node_compiler(PackageNode, CompilerID), - node_compiler(DependencyNode, CompilerID). - -compiler_mismatch(PackageNode, DependencyNode) - :- depends_on(PackageNode, DependencyNode), - not attr("node_compiler_set", DependencyNode, _), - not compiler_match(PackageNode, DependencyNode). - -compiler_mismatch_required(PackageNode, DependencyNode) - :- depends_on(PackageNode, DependencyNode), - attr("node_compiler_set", DependencyNode, _), - not compiler_match(PackageNode, DependencyNode). - -#defined compiler_os/3. - -% compilers weighted by preference according to packages.yaml -node_compiler_weight(node(ID, Package), Weight) - :- node_compiler(node(ID, Package), CompilerID), - compiler_name(CompilerID, Compiler), - compiler_version(CompilerID, V), - compiler_weight(CompilerID, Weight). - -node_compiler_weight(node(ID, Package), 100) - :- node_compiler(node(ID, Package), CompilerID), - compiler_name(CompilerID, Compiler), - compiler_version(CompilerID, V), - 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.", Package, Compiler, Version) - :- attr("node_compiler_version", node(ID, Package), Compiler, Version), - not node_compiler(node(ID, Package), _). - -#defined node_compiler_preference/4. -#defined compiler_weight/3. - %----------------------------------------------------------------------------- % Compiler flags %----------------------------------------------------------------------------- -% compiler flags from compilers.yaml are put on nodes if compiler matches -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). - attr("node_flag", PackageNode, NodeFlag) :- attr("node_flag_set", PackageNode, NodeFlag). -#defined compiler_flag/4. - - %----------------------------------------------------------------------------- % Installed Packages %----------------------------------------------------------------------------- @@ -1501,32 +1504,53 @@ hash_attr(Hash, "node_version_satisfies", PackageName, Constraint) :- % This recovers the exact semantics for hash reuse hash and depends_on are where % splices are decided, and virtual_on_edge can result in name-changes, which is % why they are all treated separately. -imposed_constraint(Hash, Attr, PackageName) :- - hash_attr(Hash, Attr, PackageName). -imposed_constraint(Hash, Attr, PackageName, A1) :- - hash_attr(Hash, Attr, PackageName, A1), Attr != "hash". -imposed_constraint(Hash, Attr, PackageName, Arg1, Arg2) :- - hash_attr(Hash, Attr, PackageName, Arg1, Arg2), + +imposed_constraint(Hash, Attr, PackageName) :- hash_attr(Hash, Attr, PackageName), Attr != "virtual_node". + +imposed_constraint(Hash, Attr, PackageName, A1) :- hash_attr(Hash, Attr, PackageName, A1), Attr != "hash". + +imposed_constraint(Hash, Attr, PackageName, A1, A2) :- + hash_attr(Hash, Attr, PackageName, A1, A2), Attr != "depends_on", Attr != "virtual_on_edge". -imposed_constraint(Hash, Attr, PackageName, A1, A2, A3) :- - hash_attr(Hash, Attr, PackageName, A1, A2, A3). + +imposed_constraint(Hash, Attr, PackageName, A1, A2, A3) :- hash_attr(Hash, Attr, PackageName, A1, A2, A3). imposed_constraint(Hash, "hash", PackageName, Hash) :- installed_hash(PackageName, Hash). + +% If a compiler is not used as a library, we just enforce "run" dependency, so we +% can get by with a much smaller search space. +avoid_link_dependency(Hash, DepName) :- + hash_attr(Hash, "depends_on", PackageName, DepName, "link"), + not hash_attr(Hash, "depends_on", PackageName, DepName, "run"), + hash_attr(Hash, "hash", DepName, DepHash), + compiler_package(PackageName), + not compiler_used_as_a_library(node(_, PackageName), Hash). + % Without splicing, we simply recover the exact semantics imposed_constraint(ParentHash, "hash", ChildName, ChildHash) :- hash_attr(ParentHash, "hash", ChildName, ChildHash), ChildHash != ParentHash, + not avoid_link_dependency(ParentHash, ChildName), not abi_splice_conditions_hold(_, _, ChildName, ChildHash). imposed_constraint(Hash, "depends_on", PackageName, DepName, Type) :- hash_attr(Hash, "depends_on", PackageName, DepName, Type), hash_attr(Hash, "hash", DepName, DepHash), + not avoid_link_dependency(Hash, DepName), not attr("splice_at_hash", _, _, DepName, DepHash). imposed_constraint(Hash, "virtual_on_edge", PackageName, DepName, VirtName) :- hash_attr(Hash, "virtual_on_edge", PackageName, DepName, VirtName), + not avoid_link_dependency(Hash, DepName), not attr("splice_at_hash", _, _, DepName,_). +imposed_constraint(Hash, "virtual_node", VirtName) :- + hash_attr(Hash, "virtual_on_edge", PackageName, DepName, VirtName), + hash_attr(Hash, "virtual_node", VirtName), + not avoid_link_dependency(Hash, DepName), + not attr("splice_at_hash", _, _, DepName,_). + + % Rules pertaining to attr("splice_at_hash") and abi_splice_conditions_hold will % be conditionally loaded from splices.lp @@ -1611,7 +1635,7 @@ opt_criterion(310, "requirement weight"). % Try hard to reuse installed packages (i.e., minimize the number built) opt_criterion(110, "number of packages to build (vs. reuse)"). #minimize { 0@110: #true }. -#minimize { 1@110,PackageNode : build(PackageNode), optimize_for_reuse() }. +#minimize { 1@110,PackageNode : build(PackageNode) }. opt_criterion(100, "number of nodes from the same package"). #minimize { 0@100: #true }. @@ -1658,9 +1682,9 @@ opt_criterion(60, "preferred providers for roots"). #minimize{ 0@260: #true }. #minimize{ 0@60: #true }. #minimize{ - Weight@60+Priority,ProviderNode,Virtual - : provider_weight(ProviderNode, Virtual, Weight), - attr("root", ProviderNode), + Weight@60+Priority,ProviderNode,X,Virtual + : provider_weight(ProviderNode, node(X, Virtual), Weight), + attr("root", ProviderNode), not language(Virtual), not language_runtime(Virtual), build_priority(ProviderNode, Priority) }. @@ -1687,35 +1711,49 @@ opt_criterion(50, "number of non-default variants (non-roots)"). % Minimize the weights of the providers, i.e. use as much as % possible the most preferred providers -opt_criterion(45, "preferred providers (non-roots)"). +opt_criterion(48, "preferred providers (non-roots)"). +#minimize{ 0@248: #true }. +#minimize{ 0@48: #true }. +#minimize{ + Weight@48+Priority,ProviderNode,X,Virtual + : provider_weight(ProviderNode, node(X, Virtual), Weight), + not attr("root", ProviderNode), not language(Virtual), not language_runtime(Virtual), + build_priority(ProviderNode, Priority) +}. + +% Minimize the number of compilers used on nodes + +compiler_penalty(PackageNode, C-1) :- + C = #count { CompilerNode : node_compiler(PackageNode, CompilerNode) }, + node_compiler(PackageNode, _). + +opt_criterion(46, "number of compilers used on the same node"). +#minimize{ 0@246: #true }. +#minimize{ 0@46: #true }. +#minimize{ + Penalty@46+Priority,PackageNode + : compiler_penalty(PackageNode, Penalty), build_priority(PackageNode, Priority) +}. + +% Minimize the ids of the providers, i.e. use as much as +% possible the first providers +opt_criterion(45, "number of duplicate virtuals needed"). #minimize{ 0@245: #true }. #minimize{ 0@45: #true }. #minimize{ Weight@45+Priority,ProviderNode,Virtual - : provider_weight(ProviderNode, Virtual, Weight), - not attr("root", ProviderNode), + : provider(ProviderNode, node(Weight, Virtual)), build_priority(ProviderNode, Priority) }. -% Try to minimize the number of compiler mismatches in the DAG. -opt_criterion(40, "compiler mismatches that are not required"). +opt_criterion(40, "preferred compilers"). #minimize{ 0@240: #true }. #minimize{ 0@40: #true }. #minimize{ - 1@40+Priority,PackageNode,node(ID, Dependency) - : compiler_mismatch(PackageNode, node(ID, Dependency)), - build_priority(node(ID, Dependency), Priority), - not runtime(Dependency) -}. - -opt_criterion(39, "compiler mismatches that are required"). -#minimize{ 0@239: #true }. -#minimize{ 0@39: #true }. -#minimize{ - 1@39+Priority,PackageNode,node(ID, Dependency) - : compiler_mismatch_required(PackageNode, node(ID, Dependency)), - build_priority(node(ID, Dependency), Priority), - not runtime(Dependency) + Weight@40+Priority,ProviderNode,X,Virtual + : provider_weight(ProviderNode, node(X, Virtual), Weight), + language(Virtual), + build_priority(ProviderNode, Priority) }. opt_criterion(30, "non-preferred OS's"). @@ -1750,17 +1788,6 @@ opt_criterion(20, "default values of variants not being used (non-roots)"). build_priority(PackageNode, Priority) }. -% Try to use preferred compilers -opt_criterion(15, "non-preferred compilers"). -#minimize{ 0@215: #true }. -#minimize{ 0@15: #true }. -#minimize{ - Weight@15+Priority,node(X, Package) - : node_compiler_weight(node(X, Package), Weight), - build_priority(node(X, Package), Priority), - not runtime(Package) -}. - % Minimize the number of mismatches for targets in the DAG, try % to select the preferred target. opt_criterion(10, "target mismatches"). @@ -1783,20 +1810,15 @@ opt_criterion(5, "non-preferred targets"). not runtime(Package) }. - -% Minimize the number of compiler mismatches for runtimes -opt_criterion(4, "compiler mismatches (runtimes)"). +opt_criterion(4, "preferred providers (language runtimes)"). #minimize{ 0@204: #true }. #minimize{ 0@4: #true }. #minimize{ - 1@4,PackageNode,node(ID, Dependency) - : compiler_mismatch(PackageNode, node(ID, Dependency)), runtime(Dependency) + Weight@4+Priority,ProviderNode,X,Virtual + : provider_weight(ProviderNode, node(X, Virtual), Weight), + language_runtime(Virtual), + build_priority(ProviderNode, Priority) }. -#minimize{ - 1@4,PackageNode,node(ID, Dependency) - : compiler_mismatch_required(PackageNode, node(ID, Dependency)), runtime(Dependency) -}. - % Choose more recent versions for runtimes opt_criterion(3, "version badness (runtimes)"). @@ -1829,6 +1851,16 @@ opt_criterion(1, "edge wiring"). depends_on(ParentNode, PackageNode) }. + +#minimize{ 0@201: #true }. +#minimize{ 0@1: #true }. +#minimize{ + Weight@1,ParentNode,ProviderNode,Virtual + : provider_weight(ProviderNode, Virtual, Weight), + not attr("root", ProviderNode), + depends_on(ParentNode, ProviderNode) +}. + %----------- % Notes %----------- diff --git a/lib/spack/spack/solver/heuristic.lp b/lib/spack/spack/solver/heuristic.lp index c793276a452..38b116a30b6 100644 --- a/lib/spack/spack/solver/heuristic.lp +++ b/lib/spack/spack/solver/heuristic.lp @@ -6,16 +6,28 @@ % Heuristic to speed-up solves %============================================================================= +#heuristic node_compiler(ParentNode, CompilerNode). [1200, init] +#heuristic node_compiler(ParentNode, CompilerNode). [ 6, factor] +#heuristic node_compiler(ParentNode, CompilerNode). [ -1, sign] +#heuristic node_compiler(ParentNode, CompilerNode) : attr("depends_on", ParentNode, CompilerNode, "build"), provider_weight(CompilerNode, Language, 0), language(Language). [1@2, sign] + +#heuristic attr("virtual_node", node(X, Virtual)). [600, 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("virtual_node", node(0, "c")). [1@3, sign] +#heuristic attr("virtual_node", node(0, "cxx")). [1@3, sign] + +#heuristic unification_set(SetID, Node). [400, init] +#heuristic unification_set(SetID, Node). [ 4, factor] +#heuristic unification_set(SetID, Node). [ -1, sign] +#heuristic unification_set("root", node(0, "libc")). [ 1@2, sign] + #heuristic attr("node", PackageNode). [300, init] -#heuristic attr("node", PackageNode). [ 2, factor] +#heuristic attr("node", PackageNode). [ 4, 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] -#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). [100, 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] @@ -37,6 +49,3 @@ % Use default targets #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/input_analysis.py b/lib/spack/spack/solver/input_analysis.py index 260f2a1e292..d6dce8695d4 100644 --- a/lib/spack/spack/solver/input_analysis.py +++ b/lib/spack/spack/solver/input_analysis.py @@ -461,7 +461,10 @@ def _compute_cache_values(self) -> None: self._possible_dependencies = set(self._link_run) | set(self._total_build) def possible_packages_facts(self, gen, fn): - build_tools = spack.repo.PATH.packages_with_tags("build-tools") + build_tools = set() + for current_tag in ("build-tools", "compiler"): + build_tools.update(spack.repo.PATH.packages_with_tags(current_tag)) + gen.h2("Packages with at most a single node") for package_name in sorted(self.possible_dependencies() - build_tools): gen.fact(fn.max_dupes(package_name, 1)) @@ -499,7 +502,6 @@ def possible_packages_facts(self, gen, fn): class FullDuplicatesCounter(MinimalDuplicatesCounter): def possible_packages_facts(self, gen, fn): - build_tools = spack.repo.PATH.packages_with_tags("build-tools") counter = collections.Counter( list(self._link_run) + list(self._total_build) + list(self._direct_build) ) @@ -510,6 +512,10 @@ def possible_packages_facts(self, gen, fn): gen.newline() gen.h2("Build unification sets ") + build_tools = set() + for current_tag in ("build-tools", "compiler"): + build_tools.update(spack.repo.PATH.packages_with_tags(current_tag)) + for name in sorted(self.possible_dependencies() & build_tools): gen.fact(fn.multiple_unification_sets(name)) gen.newline() diff --git a/lib/spack/spack/solver/libc_compatibility.lp b/lib/spack/spack/solver/libc_compatibility.lp index 1b0f3a9cf98..fe6aefda958 100644 --- a/lib/spack/spack/solver/libc_compatibility.lp +++ b/lib/spack/spack/solver/libc_compatibility.lp @@ -8,25 +8,25 @@ % These rules are used on Linux %============================================================================= -% A package cannot be reused if the libc is not compatible with it -error(100, "Cannot reuse {0} since we cannot determine libc compatibility", ReusedPackage) - :- provider(node(X, LibcPackage), node(0, "libc")), - attr("version", node(X, LibcPackage), LibcVersion), - attr("hash", node(R, ReusedPackage), Hash), - % Libc packages can be reused without the "compatible_libc" attribute - ReusedPackage != LibcPackage, - not attr("compatible_libc", node(R, ReusedPackage), LibcPackage, LibcVersion). - -% A libc is needed in the DAG -:- has_built_packages(), not provider(_, node(0, "libc")). - % Non-libc reused specs must be host libc compatible. In case we build packages, we get a % host compatible libc provider from other rules. If nothing is built, there is no libc provider, % since it's pruned from reusable specs, meaning we have to explicitly impose reused specs are host % compatible. -:- attr("hash", node(R, ReusedPackage), Hash), - not provider(node(R, ReusedPackage), node(0, "libc")), - not attr("compatible_libc", node(R, ReusedPackage), _, _). + +% A package cannot be reused if it needs a libc that is not compatible with the current one +error(100, "Cannot reuse {0} since we cannot determine libc compatibility", ReusedPackage) + :- provider(node(X, LibcPackage), node(0, "libc")), + attr("version", node(X, LibcPackage), LibcVersion), + concrete(node(R, ReusedPackage)), + attr("needs_libc", node(R, ReusedPackage)), + not attr("compatible_libc", node(R, ReusedPackage), LibcPackage, LibcVersion). + +% In case we don't need a provider for libc, ensure there's at least one compatible libc on the host +error(100, "Cannot reuse {0} since we cannot determine libc compatibility", ReusedPackage) + :- not provider(_, node(0, "libc")), + concrete(node(R, ReusedPackage)), + attr("needs_libc", node(R, ReusedPackage)), + not attr("compatible_libc", node(R, ReusedPackage), _, _). % The libc provider must be one that a compiler can target :- has_built_packages(), @@ -34,9 +34,3 @@ error(100, "Cannot reuse {0} since we cannot determine libc compatibility", Reus attr("node", node(X, LibcPackage)), attr("version", node(X, LibcPackage), LibcVersion), not host_libc(LibcPackage, LibcVersion). - -% A built node must depend on libc -:- build(PackageNode), - provider(LibcNode, node(0, "libc")), - not external(PackageNode), - not depends_on(PackageNode, LibcNode). diff --git a/lib/spack/spack/solver/requirements.py b/lib/spack/spack/solver/requirements.py index c6c475d0148..9392bcecd75 100644 --- a/lib/spack/spack/solver/requirements.py +++ b/lib/spack/spack/solver/requirements.py @@ -9,6 +9,7 @@ import spack.config import spack.error import spack.package_base +import spack.repo import spack.spec from spack.util.spack_yaml import get_mark_from_yaml_data @@ -40,6 +41,8 @@ class RequirementParser: def __init__(self, configuration: spack.config.Configuration): self.config = configuration + self.runtime_pkgs = spack.repo.PATH.packages_with_tags("runtime") + self.compiler_pkgs = spack.repo.PATH.packages_with_tags("compiler") def rules(self, pkg: spack.package_base.PackageBase) -> List[RequirementRule]: result = [] @@ -215,20 +218,32 @@ def reject_requirement_constraint( self, pkg_name: str, *, constraint: spack.spec.Spec, kind: RequirementKind ) -> bool: """Returns True if a requirement constraint should be rejected""" - if kind == RequirementKind.DEFAULT: - # Requirements under all: are applied only if they are satisfiable considering only - # package rules, so e.g. variants must exist etc. Otherwise, they are rejected. - try: - s = spack.spec.Spec(pkg_name) - s.constrain(constraint) - s.validate_or_raise() - except spack.error.SpackError as e: - tty.debug( - f"[{__name__}] Rejecting the default '{constraint}' requirement " - f"on '{pkg_name}': {str(e)}", - level=2, - ) - return True + # If it's a specific package requirement, it's never rejected + if kind != RequirementKind.DEFAULT: + return False + + # Reject requirements with dependencies for runtimes and compilers + # These are usually requests on compilers, in the form of % + involves_dependencies = bool(constraint.dependencies()) + if involves_dependencies and ( + pkg_name in self.runtime_pkgs or pkg_name in self.compiler_pkgs + ): + tty.debug(f"[{__name__}] Rejecting '{constraint}' for compiler package {pkg_name}") + return True + + # Requirements under all: are applied only if they are satisfiable considering only + # package rules, so e.g. variants must exist etc. Otherwise, they are rejected. + try: + s = spack.spec.Spec(pkg_name) + s.constrain(constraint) + s.validate_or_raise() + except spack.error.SpackError as e: + tty.debug( + f"[{__name__}] Rejecting the default '{constraint}' requirement " + f"on '{pkg_name}': {str(e)}", + level=2, + ) + return True return False diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index b391d2c563b..cf116e1fc16 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -67,6 +67,7 @@ List, Match, Optional, + Sequence, Set, Tuple, Union, @@ -85,8 +86,8 @@ import llnl.util.tty.color as clr import spack -import spack.compiler -import spack.compilers +import spack.aliases +import spack.compilers.flags import spack.deptypes as dt import spack.error import spack.hash_types as ht @@ -173,18 +174,14 @@ #: Default format for Spec.format(). This format can be round-tripped, so that: #: Spec(Spec("string").format()) == Spec("string)" DEFAULT_FORMAT = ( - "{name}{@versions}" - "{compiler_flags}" + "{name}{@versions}{compiler_flags}" "{variants}{ namespace=namespace_if_anonymous}{ arch=architecture}{/abstract_hash}" - " {%compiler.name}{@compiler.versions}" ) #: Display format, which eliminates extra `@=` in the output, for readability. DISPLAY_FORMAT = ( - "{name}{@version}" - "{compiler_flags}" + "{name}{@version}{compiler_flags}" "{variants}{ namespace=namespace_if_anonymous}{ arch=architecture}{/abstract_hash}" - " {%compiler.name}{@compiler.version}" ) #: Regular expression to pull spec contents out of clearsigned signature @@ -198,7 +195,7 @@ ) #: specfile format version. Must increase monotonically -SPECFILE_FORMAT_VERSION = 4 +SPECFILE_FORMAT_VERSION = 5 class InstallStatus(enum.Enum): @@ -632,134 +629,87 @@ def __repr__(self): def __contains__(self, string): return string in str(self) or string in self.target + def complete_with_defaults(self) -> None: + default_architecture = ArchSpec.default_arch() + if not self.platform: + self.platform = default_architecture.platform + + if not self.os: + self.os = default_architecture.os + + if not self.target: + self.target = default_architecture.target + -@lang.lazy_lexicographic_ordering class CompilerSpec: - """The CompilerSpec field represents the compiler or range of compiler - versions that a package should be built with. CompilerSpecs have a - name and a version list.""" + """Adaptor to the old compiler spec interface. Exposes just a few attributes""" - __slots__ = "name", "versions" - - def __init__(self, *args): - nargs = len(args) - if nargs == 1: - arg = args[0] - # If there is one argument, it's either another CompilerSpec - # to copy or a string to parse - if isinstance(arg, str): - spec = spack.spec_parser.parse_one_or_raise(f"%{arg}") - self.name = spec.compiler.name - self.versions = spec.compiler.versions - - elif isinstance(arg, CompilerSpec): - self.name = arg.name - self.versions = arg.versions.copy() - - else: - raise TypeError( - "Can only build CompilerSpec from string or " - + "CompilerSpec. Found %s" % type(arg) - ) - - elif nargs == 2: - name, version = args - self.name = name - self.versions = vn.VersionList([vn.ver(version)]) - - else: - raise TypeError("__init__ takes 1 or 2 arguments. (%d given)" % nargs) - - def _autospec(self, compiler_spec_like): - if isinstance(compiler_spec_like, CompilerSpec): - return compiler_spec_like - return CompilerSpec(compiler_spec_like) - - def intersects(self, other: "CompilerSpec") -> bool: - """Return True if all concrete specs matching self also match other, otherwise False. - - For compiler specs this means that the name of the compiler must be the same for - self and other, and that the versions ranges should intersect. - - Args: - other: spec to be satisfied - """ - other = self._autospec(other) - return self.name == other.name and self.versions.intersects(other.versions) - - def satisfies(self, other: "CompilerSpec") -> bool: - """Return True if all concrete specs matching self also match other, otherwise False. - - For compiler specs this means that the name of the compiler must be the same for - self and other, and that the version range of self is a subset of that of other. - - Args: - other: spec to be satisfied - """ - other = self._autospec(other) - return self.name == other.name and self.versions.satisfies(other.versions) - - def constrain(self, other: "CompilerSpec") -> bool: - """Intersect self's versions with other. - - Return whether the CompilerSpec changed. - """ - other = self._autospec(other) - - # ensure that other will actually constrain this spec. - if not other.intersects(self): - raise UnsatisfiableCompilerSpecError(other, self) - - return self.versions.intersect(other.versions) + def __init__(self, spec): + self.spec = spec @property - def concrete(self): - """A CompilerSpec is concrete if its versions are concrete and there - is an available compiler with the right version.""" - return self.versions.concrete + def name(self): + return self.spec.name @property def version(self): - if not self.concrete: - raise spack.error.SpecError("Spec is not concrete: " + str(self)) - return self.versions[0] + return self.spec.version - def copy(self): - clone = CompilerSpec.__new__(CompilerSpec) - clone.name = self.name - clone.versions = self.versions.copy() - return clone - - def _cmp_iter(self): - yield self.name - yield self.versions - - def to_dict(self): - return {"compiler": {"name": self.name, **self.versions.to_dict()}} - - @staticmethod - def from_dict(d): - d = d["compiler"] - return CompilerSpec(d["name"], vn.VersionList.from_dict(d)) + @property + def versions(self): + return self.spec.versions @property def display_str(self): """Equivalent to {compiler.name}{@compiler.version} for Specs, without extra @= for readability.""" - if self.concrete: + if self.spec.concrete: return f"{self.name}@{self.version}" elif self.versions != vn.any_version: return f"{self.name}@{self.versions}" return self.name - def __str__(self): - out = self.name - if self.versions and self.versions != vn.any_version: - out += f"@{self.versions}" - return out + def __lt__(self, other): + if not isinstance(other, CompilerSpec): + return self.spec < other + return self.spec < other.spec - def __repr__(self): - return str(self) + def __eq__(self, other): + if not isinstance(other, CompilerSpec): + return self.spec == other + return self.spec == other.spec + + def __hash__(self): + return hash(self.spec) + + def __str__(self): + return str(self.spec) + + def _cmp_iter(self): + return self.spec._cmp_iter() + + def __bool__(self): + if self.spec == Spec(): + return False + return bool(self.spec) + + +class DeprecatedCompilerSpec(lang.DeprecatedProperty): + def __init__(self): + super().__init__(name="compiler") + + def factory(self, instance, owner): + if instance.original_spec_format() < 5: + compiler = instance.annotations.compiler_node_attribute + assert compiler is not None, "a compiler spec is expected" + return CompilerSpec(compiler) + + for language in ("c", "cxx", "fortran"): + deps = instance.dependencies(virtuals=language) + if deps: + return CompilerSpec(deps[0]) + + raise AttributeError(f"{instance} has no C, C++, or Fortran compiler") @lang.lazy_lexicographic_ordering @@ -780,15 +730,22 @@ class DependencySpec: virtuals: virtual packages provided from child to parent node. """ - __slots__ = "parent", "spec", "depflag", "virtuals" + __slots__ = "parent", "spec", "depflag", "virtuals", "direct" def __init__( - self, parent: "Spec", spec: "Spec", *, depflag: dt.DepFlag, virtuals: Tuple[str, ...] + self, + parent: "Spec", + spec: "Spec", + *, + depflag: dt.DepFlag, + virtuals: Tuple[str, ...], + direct: bool = False, ): self.parent = parent self.spec = spec self.depflag = depflag self.virtuals = tuple(sorted(set(virtuals))) + self.direct = direct def update_deptypes(self, depflag: dt.DepFlag) -> bool: """Update the current dependency types""" @@ -807,7 +764,13 @@ def update_virtuals(self, virtuals: Iterable[str]) -> bool: def copy(self) -> "DependencySpec": """Return a copy of this edge""" - return DependencySpec(self.parent, self.spec, depflag=self.depflag, virtuals=self.virtuals) + return DependencySpec( + self.parent, + self.spec, + depflag=self.depflag, + virtuals=self.virtuals, + direct=self.direct, + ) def _cmp_iter(self): yield self.parent.name if self.parent else None @@ -1061,7 +1024,7 @@ def select( parent: Optional[str] = None, child: Optional[str] = None, depflag: dt.DepFlag = dt.ALL, - virtuals: Optional[List[str]] = None, + virtuals: Optional[Sequence[str]] = None, ) -> List[DependencySpec]: """Selects a list of edges and returns them. @@ -1451,8 +1414,30 @@ def tree( return out +class SpecAnnotations: + def __init__(self) -> None: + self.original_spec_format = SPECFILE_FORMAT_VERSION + self.compiler_node_attribute: Optional["Spec"] = None + + def with_spec_format(self, spec_format: int) -> "SpecAnnotations": + self.original_spec_format = spec_format + return self + + def with_compiler(self, compiler: "Spec") -> "SpecAnnotations": + self.compiler_node_attribute = compiler + return self + + def __repr__(self) -> str: + result = f"SpecAnnotations().with_spec_format({self.original_spec_format})" + if self.compiler_node_attribute: + result += f"with_compiler({str(self.compiler_node_attribute)})" + return result + + @lang.lazy_lexicographic_ordering(set_hash=False) class Spec: + compiler = DeprecatedCompilerSpec() + @staticmethod def default_arch(): """Return an anonymous spec for the default architecture""" @@ -1482,7 +1467,6 @@ def __init__(self, spec_like=None, *, external_path=None, external_modules=None) self.versions = vn.VersionList(":") self.variants = VariantMap(self) self.architecture = None - self.compiler = None self.compiler_flags = FlagMap(self) self._dependents = _EdgeMap(store_by_child=False) self._dependencies = _EdgeMap(store_by_child=True) @@ -1518,12 +1502,13 @@ def __init__(self, spec_like=None, *, external_path=None, external_modules=None) # is deployed "as built." # Build spec should be the actual build spec unless marked dirty. self._build_spec = None + self.annotations = SpecAnnotations() if isinstance(spec_like, str): spack.spec_parser.parse_one_or_raise(spec_like, self) elif spec_like is not None: - raise TypeError("Can't make spec out of %s" % type(spec_like)) + raise TypeError(f"Can't make spec out of {type(spec_like)}") @staticmethod def _format_module_list(modules): @@ -1619,12 +1604,12 @@ def edges_from_dependents( ] def edges_to_dependencies( - self, name=None, depflag: dt.DepFlag = dt.ALL, *, virtuals: Optional[List[str]] = None + self, name=None, depflag: dt.DepFlag = dt.ALL, *, virtuals: Optional[Sequence[str]] = None ) -> List[DependencySpec]: """Returns a list of edges connecting this node in the DAG to children. Args: - name (str): filter dependencies by package name + name: filter dependencies by package name depflag: allowed dependency types virtuals: allowed virtuals """ @@ -1640,12 +1625,16 @@ def edge_attributes(self) -> str: return "" union = DependencySpec(parent=Spec(), spec=self, depflag=0, virtuals=()) + all_direct_edges = all(x.direct for x in edges) + for edge in edges: union.update_deptypes(edge.depflag) union.update_virtuals(edge.virtuals) - deptypes_str = ( - f"deptypes={','.join(dt.flag_to_tuple(union.depflag))}" if union.depflag else "" - ) + + deptypes_str = "" + if not all_direct_edges and union.depflag: + deptypes_str = f"deptypes={','.join(dt.flag_to_tuple(union.depflag))}" + virtuals_str = f"virtuals={','.join(union.virtuals)}" if union.virtuals else "" if not deptypes_str and not virtuals_str: return "" @@ -1657,7 +1646,7 @@ def dependencies( name=None, deptype: Union[dt.DepTypes, dt.DepFlag] = dt.ALL, *, - virtuals: Optional[List[str]] = None, + virtuals: Optional[Sequence[str]] = None, ) -> List["Spec"]: """Returns a list of direct dependencies (nodes in the DAG) @@ -1727,7 +1716,7 @@ def _add_flag(self, name, value, propagate): self.namespace = value elif name in valid_flags: assert self.compiler_flags is not None - flags_and_propagation = spack.compiler.tokenize_flags(value, propagate) + flags_and_propagation = spack.compilers.flags.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, flag_group) @@ -1758,10 +1747,18 @@ def _set_architecture(self, **kwargs): else: setattr(self.architecture, new_attr, new_value) - def _add_dependency(self, spec: "Spec", *, depflag: dt.DepFlag, virtuals: Tuple[str, ...]): - """Called by the parser to add another spec as a dependency.""" + def _add_dependency( + self, spec: "Spec", *, depflag: dt.DepFlag, virtuals: Tuple[str, ...], direct: bool = False + ): + """Called by the parser to add another spec as a dependency. + + Args: + depflag: dependency type for this edge + virtuals: virtuals on this edge + direct: if True denotes a direct dependency (associated with the % sigil) + """ if spec.name not in self._dependencies or not spec.name: - self.add_dependency_edge(spec, depflag=depflag, virtuals=virtuals) + self.add_dependency_edge(spec, depflag=depflag, virtuals=virtuals, direct=direct) return # Keep the intersection of constraints when a dependency is added multiple times with @@ -1784,7 +1781,7 @@ def _add_dependency(self, spec: "Spec", *, depflag: dt.DepFlag, virtuals: Tuple[ f"\t'{str(self)}' cannot depend on '{required_dep_str}'" ) - self.add_dependency_edge(spec, depflag=depflag, virtuals=virtuals) + self.add_dependency_edge(spec, depflag=depflag, virtuals=virtuals, direct=direct) return try: @@ -1796,7 +1793,12 @@ def _add_dependency(self, spec: "Spec", *, depflag: dt.DepFlag, virtuals: Tuple[ ) def add_dependency_edge( - self, dependency_spec: "Spec", *, depflag: dt.DepFlag, virtuals: Tuple[str, ...] + self, + dependency_spec: "Spec", + *, + depflag: dt.DepFlag, + virtuals: Tuple[str, ...], + direct: bool = False, ): """Add a dependency edge to this spec. @@ -1804,6 +1806,7 @@ def add_dependency_edge( dependency_spec: spec of the dependency deptypes: dependency types for this edge virtuals: virtuals provided by this edge + direct: if True denotes a direct dependency """ # Check if we need to update edges that are already present selected = self._dependencies.select(child=dependency_spec.name) @@ -1842,7 +1845,9 @@ def add_dependency_edge( edge.update_virtuals(virtuals=virtuals) return - edge = DependencySpec(self, dependency_spec, depflag=depflag, virtuals=virtuals) + edge = DependencySpec( + self, dependency_spec, depflag=depflag, virtuals=virtuals, direct=direct + ) self._dependencies.add(edge) dependency_spec._dependents.add(edge) @@ -2069,32 +2074,37 @@ def traverse_edges( def long_spec(self): """Returns a string of the spec with the dependencies completely enumerated.""" - root_str = [self.format()] - sorted_dependencies = sorted( - self.traverse(root=False), key=lambda x: (x.name, x.abstract_hash) + parts = [self.format()] + direct, transitive = lang.stable_partition( + self.edges_to_dependencies(), predicate_fn=lambda x: x.direct ) - sorted_dependencies = [ - d.format("{edge_attributes} " + DEFAULT_FORMAT) for d in sorted_dependencies - ] - spec_str = " ^".join(root_str + sorted_dependencies) - return spec_str.strip() + for item in sorted(direct, key=lambda x: x.spec.name): + current_name = item.spec.name + new_name = spack.aliases.BUILTIN_TO_LEGACY_COMPILER.get(current_name, current_name) + # note: depflag not allowed, currently, on "direct" edges + edge_attributes = "" + if item.virtuals: + edge_attributes = item.spec.format("{edge_attributes}") + " " + + parts.append(f"%{edge_attributes}{item.spec.format()}".replace(current_name, new_name)) + for item in sorted(transitive, key=lambda x: x.spec.name): + # Recurse to attach build deps in order + edge_attributes = "" + if item.virtuals or item.depflag: + edge_attributes = item.spec.format("{edge_attributes}") + " " + parts.append(f"^{edge_attributes}{str(item.spec)}") + return " ".join(parts).strip() @property def short_spec(self): """Returns a version of the spec with the dependencies hashed instead of completely enumerated.""" - return self.format( - "{name}{@version}{variants}{ arch=architecture}" - "{/hash:7}{%compiler.name}{@compiler.version}" - ) + return self.format("{name}{@version}{variants}{ arch=architecture}{/hash:7}") @property def cshort_spec(self): """Returns an auto-colorized version of ``self.short_spec``.""" - return self.cformat( - "{name}{@version}{variants}{ arch=architecture}" - "{/hash:7}{%compiler.name}{@compiler.version}" - ) + return self.cformat("{name}{@version}{variants}{ arch=architecture}{/hash:7}") @property def prefix(self) -> spack.util.prefix.Prefix: @@ -2259,10 +2269,6 @@ def to_node_dict(self, hash=ht.dag_hash): 'platform_os': 'mojave', 'target': 'x86_64', }, - 'compiler': { - 'name': 'apple-clang', - 'version': '10.0.0', - }, 'namespace': 'builtin', 'parameters': { 'fts': 'true', @@ -2303,9 +2309,6 @@ def to_node_dict(self, hash=ht.dag_hash): if self.architecture: d.update(self.architecture.to_dict()) - if self.compiler: - d.update(self.compiler.to_dict()) - if self.namespace: d["namespace"] = self.namespace @@ -2389,6 +2392,12 @@ def to_node_dict(self, hash=ht.dag_hash): "name": self.build_spec.name, hash.name: self.build_spec._cached_hash(hash), } + + # Annotations + d["annotations"] = {"original_specfile_version": self.annotations.original_spec_format} + if self.annotations.original_spec_format < 5: + d["annotations"]["compiler"] = str(self.annotations.compiler_node_attribute) + return d def to_dict(self, hash=ht.dag_hash): @@ -2542,8 +2551,6 @@ def override(init_spec, change_spec): else: 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: for flagname, flagvals in change_spec.compiler_flags.items(): new_spec.compiler_flags[flagname] = flagvals @@ -2715,8 +2722,10 @@ def from_dict(data) -> "Spec": spec = SpecfileV2.load(data) elif int(data["spec"]["_meta"]["version"]) == 3: spec = SpecfileV3.load(data) - else: + elif int(data["spec"]["_meta"]["version"]) == 4: spec = SpecfileV4.load(data) + else: + spec = SpecfileV5.load(data) # Any git version should for s in spec.traverse(): @@ -2966,10 +2975,14 @@ def validate_or_raise(self): if spec.name and not spack.repo.PATH.is_virtual(spec.name): spack.repo.PATH.get_pkg_class(spec.fullname) - # validate compiler in addition to the package name. - if spec.compiler: - if not spack.compilers.supported(spec.compiler): - raise UnsupportedCompilerError(spec.compiler.name) + # FIXME: atm allow '%' on abstract specs only if they depend on C, C++, or Fortran + if spec.dependencies(deptype="build"): + pkg_cls = spack.repo.PATH.get_pkg_class(spec.fullname) + pkg_dependencies = pkg_cls.dependency_names() + if not any(x in pkg_dependencies for x in ("c", "cxx", "fortran")): + raise UnsupportedCompilerError( + f"{spec.fullname} does not depend on 'c', 'cxx, or 'fortran'" + ) # Ensure correctness of variants (if the spec is not virtual) if not spack.repo.PATH.is_virtual(spec.name): @@ -3071,12 +3084,6 @@ def constrain(self, other, deps=True): self.namespace = other.namespace changed = True - if self.compiler is not None and other.compiler is not None: - changed |= self.compiler.constrain(other.compiler) - elif self.compiler is None: - changed |= self.compiler != other.compiler - self.compiler = other.compiler - changed |= self.versions.intersect(other.versions) changed |= self.variants.constrain(other.variants) @@ -3097,10 +3104,8 @@ def constrain(self, other, deps=True): return changed - def _constrain_dependencies(self, other): + def _constrain_dependencies(self, other: "Spec") -> bool: """Apply constraints of other spec's dependencies to this spec.""" - other = self._autospec(other) - if not other._dependencies: return False @@ -3114,9 +3119,13 @@ def _constrain_dependencies(self, other): raise UnconstrainableDependencySpecError(other) # Handle common first-order constraints directly + # Note: This doesn't handle constraining transitive dependencies with the same name + # as direct dependencies changed = False - for name in self.common_dependencies(other): - changed |= self[name].constrain(other[name], deps=False) + common_dependencies = {x.name for x in self.dependencies()} + common_dependencies &= {x.name for x in other.dependencies()} + for name in common_dependencies: + changed |= self[name].constrain(other[name], deps=True) if name in self._dependencies: # WARNING: This function is an implementation detail of the # WARNING: original concretizer. Since with that greedy @@ -3139,13 +3148,14 @@ def _constrain_dependencies(self, other): dep_spec_copy.spec.copy(), depflag=dep_spec_copy.depflag, virtuals=dep_spec_copy.virtuals, + direct=dep_spec_copy.direct, ) changed = True return changed def common_dependencies(self, other): - """Return names of dependencies that self an other have in common.""" + """Return names of dependencies that self and other have in common.""" common = set(s.name for s in self.traverse(root=False)) common.intersection_update(s.name for s in other.traverse(root=False)) return common @@ -3247,10 +3257,6 @@ def intersects(self, other: Union[str, "Spec"], deps: bool = True) -> bool: if not self.versions.intersects(other.versions): return False - if self.compiler and other.compiler: - if not self.compiler.intersects(other.compiler): - return False - if not self.variants.intersects(other.variants): return False @@ -3273,8 +3279,10 @@ def _intersects_dependencies(self, other): return True # Handle first-order constraints directly - for name in self.common_dependencies(other): - if not self[name].intersects(other[name], deps=False): + common_dependencies = {x.name for x in self.dependencies()} + common_dependencies &= {x.name for x in other.dependencies()} + for name in common_dependencies: + if not self[name].intersects(other[name], deps=True): return False # For virtual dependencies, we need to dig a little deeper. @@ -3361,12 +3369,6 @@ def satisfies(self, other: Union[str, "Spec"], deps: bool = True) -> bool: if not self.versions.satisfies(other.versions): return False - if self.compiler and other.compiler: - if not self.compiler.satisfies(other.compiler): - return False - elif other.compiler and not self.compiler: - return False - if not self.variants.satisfies(other.variants): return False @@ -3404,6 +3406,32 @@ def satisfies(self, other: Union[str, "Spec"], deps: bool = True) -> bool: if spack.repo.PATH.is_virtual(rhs_edge.spec.name): rhs_edge.update_virtuals(virtuals=(rhs_edge.spec.name,)) + if rhs_edge.direct: + # Note: this relies on abstract specs from string not being deeper than 2 levels + # e.g. in foo %fee ^bar %baz we cannot go deeper than "baz" and e.g. specify its + # dependencies too. + # + # We also need to account for cases like gcc@ %gcc@ where the parent + # name is the same as the child name + # + # The same assumptions hold on Spec.constrain, and Spec.intersect + current_node = self + if rhs_edge.parent.name is not None and rhs_edge.parent.name != rhs_edge.spec.name: + try: + current_node = self[rhs_edge.parent.name] + except KeyError: + return False + + candidates = current_node.dependencies( + name=rhs_edge.spec.name, + deptype=rhs_edge.depflag, + virtuals=rhs_edge.virtuals or None, + ) + if not candidates or not any(x.satisfies(rhs_edge.spec) for x in candidates): + return False + + continue + if not rhs_edge.virtuals: continue @@ -3494,7 +3522,6 @@ def _dup(self, other: "Spec", deps: Union[bool, dt.DepTypes, dt.DepFlag] = True) self.name != other.name and self.versions != other.versions and self.architecture != other.architecture - and self.compiler != other.compiler and self.variants != other.variants and self.concrete != other.concrete and self.external_path != other.external_path @@ -3509,7 +3536,6 @@ def _dup(self, other: "Spec", deps: Union[bool, dt.DepTypes, dt.DepFlag] = True) self.name = other.name self.versions = other.versions.copy() self.architecture = other.architecture.copy() if other.architecture else None - self.compiler = other.compiler.copy() if other.compiler else None self.compiler_flags = other.compiler_flags.copy() self.compiler_flags.spec = self self.variants = other.variants.copy() @@ -3532,6 +3558,7 @@ def _dup(self, other: "Spec", deps: Union[bool, dt.DepTypes, dt.DepFlag] = True) self.external_modules = other.external_modules self.extra_attributes = other.extra_attributes self.namespace = other.namespace + self.annotations = other.annotations # If we copy dependencies, preserve DAG structure in the new spec if deps: @@ -3574,7 +3601,10 @@ def spid(spec): new_specs[spid(edge.spec)] = edge.spec.copy(deps=False) new_specs[spid(edge.parent)].add_dependency_edge( - new_specs[spid(edge.spec)], depflag=edge.depflag, virtuals=edge.virtuals + new_specs[spid(edge.spec)], + depflag=edge.depflag, + virtuals=edge.virtuals, + direct=edge.direct, ) def copy(self, deps: Union[bool, dt.DepTypes, dt.DepFlag] = True, **kwargs): @@ -3636,7 +3666,7 @@ def __getitem__(self, name: str): # Consider all direct dependencies and transitive runtime dependencies order = itertools.chain( - self.edges_to_dependencies(depflag=dt.ALL), + self.edges_to_dependencies(depflag=dt.BUILD | dt.TEST), self.traverse_edges(deptype=dt.LINK | dt.RUN, order="breadth", cover="edges"), ) @@ -3720,7 +3750,6 @@ def _cmp_node(self): yield self.namespace yield self.versions yield self.variants - yield self.compiler yield self.compiler_flags yield self.architecture yield self.abstract_hash @@ -3771,9 +3800,6 @@ def format(self, format_string: str = DEFAULT_FORMAT, color: Optional[bool] = Fa name version - compiler - compiler.name - compiler.version compiler_flags variants architecture @@ -3915,6 +3941,9 @@ def format_attribute(match_object: Match) -> str: try: current = getattr(current, part) except AttributeError: + if part == "compiler": + return "none" + raise SpecFormatStringError( f"Attempted to format attribute {attribute}. " f"Spec {'.'.join(parts[:idx])} has no attribute {part}" @@ -4431,6 +4460,13 @@ def attach_git_version_lookup(self): if isinstance(v, vn.GitVersion) and v._ref_version is None: v.attach_lookup(spack.version.git_ref_lookup.GitRefLookup(self.fullname)) + def original_spec_format(self) -> int: + """Returns the spec format originally used for this spec.""" + return self.annotations.original_spec_format + + def has_virtual_dependency(self, virtual: str) -> bool: + return bool(self.dependencies(virtuals=(virtual,))) + class VariantMap(lang.HashableMap): """Map containing variant instances. New values can be added only @@ -4652,9 +4688,9 @@ def substitute_abstract_variants(spec: Spec): ) -def parse_with_version_concrete(spec_like: Union[str, Spec], compiler: bool = False): +def parse_with_version_concrete(spec_like: Union[str, Spec]): """Same as Spec(string), but interprets @x as @=x""" - s: Union[CompilerSpec, Spec] = CompilerSpec(spec_like) if compiler else Spec(spec_like) + s = Spec(spec_like) interpreted_version = s.versions.concrete_range_as_version if interpreted_version: s.versions = vn.VersionList([interpreted_version]) @@ -4756,11 +4792,6 @@ def from_node_dict(cls, node): if "arch" in node: spec.architecture = ArchSpec.from_dict(node) - if "compiler" in node: - spec.compiler = CompilerSpec.from_dict(node) - else: - spec.compiler = None - propagated_names = node.get("propagate", []) for name, values in node.get("parameters", {}).items(): propagate = name in propagated_names @@ -4799,12 +4830,28 @@ def from_node_dict(cls, node): # FIXME: Monkey patches mvar to store patches order mvar._patches_in_order_of_appearance = patches + # Annotate the compiler spec, might be used later + if "annotations" not in node: + # Specfile v4 and earlier + spec.annotations.with_spec_format(cls.SPEC_VERSION) + if "compiler" in node: + spec.annotations.with_compiler(cls.legacy_compiler(node)) + else: + spec.annotations.with_spec_format(node["annotations"]["original_specfile_version"]) + if "compiler" in node["annotations"]: + spec.annotations.with_compiler(Spec(f"{node['annotations']['compiler']}")) + # Don't read dependencies here; from_dict() is used by # from_yaml() and from_json() to read the root *and* each dependency # spec. return spec + @classmethod + def legacy_compiler(cls, node): + d = node["compiler"] + return Spec(f"{d['name']}@{vn.VersionList.from_dict(d)}") + @classmethod def _load(cls, data): """Construct a spec from JSON/YAML using the format version 2. @@ -4871,6 +4918,8 @@ def read_specfile_dep_specs(cls, deps, hash_type=ht.dag_hash.name): class SpecfileV1(SpecfileReaderBase): + SPEC_VERSION = 1 + @classmethod def load(cls, data): """Construct a spec from JSON/YAML using the format version 1. @@ -4940,6 +4989,8 @@ def read_specfile_dep_specs(cls, deps, hash_type=ht.dag_hash.name): class SpecfileV2(SpecfileReaderBase): + SPEC_VERSION = 2 + @classmethod def load(cls, data): result = cls._load(data) @@ -4994,10 +5045,12 @@ def extract_build_spec_info_from_node_dict(cls, node, hash_type=ht.dag_hash.name class SpecfileV3(SpecfileV2): - pass + SPEC_VERSION = 3 class SpecfileV4(SpecfileV2): + SPEC_VERSION = 4 + @classmethod def extract_info_from_dep(cls, elt, hash): dep_hash = elt[hash.name] @@ -5011,6 +5064,18 @@ def load(cls, data): return cls._load(data) +class SpecfileV5(SpecfileV4): + SPEC_VERSION = 5 + + @classmethod + def legacy_compiler(cls, node): + raise RuntimeError("The 'compiler' option is unexpected in specfiles at v5 or greater") + + +#: Alias to the latest version of specfiles +SpecfileLatest = SpecfileV5 + + class LazySpecCache(collections.defaultdict): """Cache for Specs that uses a spec_like as key, and computes lazily the corresponding value ``Spec(spec_like``. @@ -5133,9 +5198,6 @@ class DuplicateCompilerSpecError(spack.error.SpecError): class UnsupportedCompilerError(spack.error.SpecError): """Raised when the user asks for a compiler spack doesn't know about.""" - def __init__(self, compiler_name): - super().__init__("The '%s' compiler is not yet supported." % compiler_name) - class DuplicateArchitectureError(spack.error.SpecError): """Raised when the same architecture occurs in a spec twice.""" @@ -5244,10 +5306,7 @@ def __init__(self, spec): class AmbiguousHashError(spack.error.SpecError): def __init__(self, msg, *specs): - spec_fmt = ( - "{namespace}.{name}{@version}{compiler_flags}{variants}" - "{ arch=architecture}{/hash:7}{%compiler}" - ) + spec_fmt = "{namespace}.{name}{@version}{variants}{ arch=architecture}{/hash:7}" specs_str = "\n " + "\n ".join(spec.format(spec_fmt) for spec in specs) super().__init__(msg + specs_str) diff --git a/lib/spack/spack/spec_parser.py b/lib/spack/spack/spec_parser.py index 981794847da..6739dc9aef1 100644 --- a/lib/spack/spack/spec_parser.py +++ b/lib/spack/spack/spec_parser.py @@ -72,6 +72,7 @@ import spack.spec import spack.util.spack_yaml import spack.version +from spack.aliases import LEGACY_COMPILER_TO_BUILTIN from spack.tokenize import Token, TokenBase, Tokenizer #: Valid name for specs and variants. Here we are not using @@ -101,6 +102,9 @@ #: Regex with groups to use for splitting (optionally propagated) key-value pairs SPLIT_KVP = re.compile(rf"^({NAME})(==?)(.*)$") +#: Regex with groups to use for splitting %[virtuals=...] tokens +SPLIT_COMPILER_TOKEN = re.compile(rf"^%\[virtuals=({VALUE}|{QUOTED_VALUE})]\s*(.*)$") + #: A filename starts either with a "." or a "/" or a "{name}/, or on Windows, a drive letter #: followed by a colon and "\" or "." or {name}\ WINDOWS_FILENAME = r"(?:\.|[a-zA-Z0-9-_]*\\|[a-zA-Z]:\\)(?:[a-zA-Z0-9-_\.\\]*)(?:\.json|\.yaml)" @@ -136,6 +140,11 @@ class SpecTokens(TokenBase): # Compilers COMPILER_AND_VERSION = rf"(?:%\s*(?:{NAME})(?:[\s]*)@\s*(?:{VERSION_LIST}))" COMPILER = rf"(?:%\s*(?:{NAME}))" + COMPILER_AND_VERSION_WITH_VIRTUALS = ( + rf"(?:%\[virtuals=(?:{VALUE}|{QUOTED_VALUE})\]" + rf"\s*(?:{NAME})(?:[\s]*)@\s*(?:{VERSION_LIST}))" + ) + COMPILER_WITH_VIRTUALS = rf"(?:%\[virtuals=(?:{VALUE}|{QUOTED_VALUE})\]\s*(?:{NAME}))" # FILENAME FILENAME = rf"(?:{FILENAME})" # Package name @@ -315,12 +324,11 @@ def all_specs(self) -> List["spack.spec.Spec"]: class SpecNodeParser: """Parse a single spec node from a stream of tokens""" - __slots__ = "ctx", "has_compiler", "has_version", "literal_str" + __slots__ = "ctx", "has_version", "literal_str" def __init__(self, ctx, literal_str): self.ctx = ctx self.literal_str = literal_str - self.has_compiler = False self.has_version = False def parse( @@ -376,24 +384,32 @@ def warn_if_after_compiler(token: str): parser_warnings.append(f"`{token}` should go before `{last_compiler}`") while True: - if self.ctx.accept(SpecTokens.COMPILER): - if self.has_compiler: - raise_parsing_error("Spec cannot have multiple compilers") + if ( + self.ctx.accept(SpecTokens.COMPILER) + or self.ctx.accept(SpecTokens.COMPILER_AND_VERSION) + or self.ctx.accept(SpecTokens.COMPILER_WITH_VIRTUALS) + or self.ctx.accept(SpecTokens.COMPILER_AND_VERSION_WITH_VIRTUALS) + ): + current_token = self.ctx.current_token + if current_token.kind in ( + SpecTokens.COMPILER_WITH_VIRTUALS, + SpecTokens.COMPILER_AND_VERSION_WITH_VIRTUALS, + ): + m = SPLIT_COMPILER_TOKEN.match(current_token.value) + assert m, "SPLIT_COMPILER_TOKEN and COMPILER_* do not agree." + virtuals_str, compiler_str = m.groups() + virtuals = tuple(virtuals_str.strip("'\" ").split(",")) + else: + virtuals = tuple() + compiler_str = current_token.value[1:] - compiler_name = self.ctx.current_token.value[1:] - initial_spec.compiler = spack.spec.CompilerSpec(compiler_name.strip(), ":") - self.has_compiler = True - last_compiler = self.ctx.current_token.value + build_dependency = spack.spec.Spec(compiler_str) + if build_dependency.name in LEGACY_COMPILER_TO_BUILTIN: + build_dependency.name = LEGACY_COMPILER_TO_BUILTIN[build_dependency.name] - elif self.ctx.accept(SpecTokens.COMPILER_AND_VERSION): - if self.has_compiler: - raise_parsing_error("Spec cannot have multiple compilers") - - compiler_name, compiler_version = self.ctx.current_token.value[1:].split("@") - initial_spec.compiler = spack.spec.CompilerSpec( - compiler_name.strip(), compiler_version + initial_spec._add_dependency( + build_dependency, depflag=spack.deptypes.BUILD, virtuals=virtuals, direct=True ) - self.has_compiler = True last_compiler = self.ctx.current_token.value elif ( diff --git a/lib/spack/spack/test/abi_splicing.py b/lib/spack/spack/test/abi_splicing.py index 4c0ca7f0d1b..b0234fd35d8 100644 --- a/lib/spack/spack/test/abi_splicing.py +++ b/lib/spack/spack/test/abi_splicing.py @@ -11,7 +11,7 @@ import spack.config import spack.deptypes as dt from spack.installer import PackageInstaller -from spack.solver.asp import SolverError +from spack.solver.asp import SolverError, UnsatisfiableSpecError from spack.spec import Spec @@ -65,7 +65,7 @@ def test_splice_installed_hash(install_specs, mutable_config): mutable_config.set("packages", packages_config) goal_spec = "splice-t@1 ^splice-h@1.0.2+compat ^splice-z@1.0.0" - with pytest.raises(SolverError): + with pytest.raises(UnsatisfiableSpecError): spack.concretize.concretize_one(goal_spec) _enable_splicing() concrete = spack.concretize.concretize_one(goal_spec) @@ -87,7 +87,7 @@ def test_splice_build_splice_node(install_specs, mutable_config): mutable_config.set("packages", _make_specs_non_buildable(["splice-t"])) goal_spec = "splice-t@1 ^splice-h@1.0.2+compat ^splice-z@1.0.0+compat" - with pytest.raises(SolverError): + with pytest.raises(UnsatisfiableSpecError): spack.concretize.concretize_one(goal_spec) _enable_splicing() @@ -113,7 +113,7 @@ def test_double_splice(install_specs, mutable_config): mutable_config.set("packages", _make_specs_non_buildable(["splice-t", "splice-h", "splice-z"])) goal_spec = "splice-t@1 ^splice-h@1.0.2+compat ^splice-z@1.0.2+compat" - with pytest.raises(SolverError): + with pytest.raises(UnsatisfiableSpecError): spack.concretize.concretize_one(goal_spec) _enable_splicing() @@ -202,7 +202,7 @@ def test_manyvariant_matching_variant_splice( original = install_specs(original_spec)[0] mutable_config.set("packages", {"depends-on-manyvariants": {"buildable": False}}) - with pytest.raises(SolverError): + with pytest.raises((UnsatisfiableSpecError, SolverError)): spack.concretize.concretize_one(goal_spec) _enable_splicing() diff --git a/lib/spack/spack/test/architecture.py b/lib/spack/spack/test/architecture.py index 3eac18014d3..3afe6bf6630 100644 --- a/lib/spack/spack/test/architecture.py +++ b/lib/spack/spack/test/architecture.py @@ -128,9 +128,7 @@ def test_satisfy_strict_constraint_when_not_concrete(architecture_tuple, constra str(archspec.cpu.host().family) != "x86_64", reason="tests are for x86_64 uarch ranges" ) def test_concretize_target_ranges(root_target_range, dep_target_range, result, monkeypatch): - spec = Spec( + spec = spack.concretize.concretize_one( f"pkg-a foobar=bar target={root_target_range} %gcc@10 ^pkg-b target={dep_target_range}" ) - with spack.concretize.disable_compiler_existence_check(): - spec = spack.concretize.concretize_one(spec) assert spec.target == spec["pkg-b"].target == result diff --git a/lib/spack/spack/test/bindist.py b/lib/spack/spack/test/bindist.py index 826f6e6cfc6..9278d9bf1d8 100644 --- a/lib/spack/spack/test/bindist.py +++ b/lib/spack/spack/test/bindist.py @@ -27,7 +27,7 @@ import spack.binary_distribution as bindist import spack.caches -import spack.compilers +import spack.compilers.config import spack.concretize import spack.config import spack.fetch_strategy @@ -87,7 +87,7 @@ def config_directory(tmp_path_factory): for name in [f"site/{platform.system().lower()}", "site", "user"] ] with spack.config.use_configuration(*cfg_scopes): - _ = spack.compilers.find_compilers(scope="site") + _ = spack.compilers.config.find_compilers(scope="site") yield defaults_dir @@ -150,10 +150,7 @@ def install_dir_non_default_layout(tmpdir): """Hooks a fake install directory with a non-default layout""" opt_dir = tmpdir.join("opt") original_store, spack.store.STORE = spack.store.STORE, spack.store.Store( - str(opt_dir), - projections={ - "all": "{name}/{version}/{architecture}-{compiler.name}-{compiler.version}-{hash}" - }, + str(opt_dir), projections={"all": "{name}-{version}-{hash:4}"} ) try: yield spack.store @@ -397,7 +394,7 @@ def test_spec_needs_rebuild(monkeypatch, tmpdir): s = spack.concretize.concretize_one("libdwarf") # Install a package - install_cmd(s.name) + install_cmd("--fake", s.name) # Put installed package in the buildcache buildcache_cmd("push", "-u", mirror_dir.strpath, s.name) @@ -426,7 +423,7 @@ def test_generate_index_missing(monkeypatch, tmpdir, mutable_config): s = spack.concretize.concretize_one("libdwarf") # Install a package - install_cmd("--no-cache", s.name) + install_cmd("--fake", "--no-cache", s.name) # Create a buildcache and update index buildcache_cmd("push", "-u", mirror_dir.strpath, s.name) @@ -550,11 +547,8 @@ def test_install_legacy_buildcache_layout(mutable_config, compiler_factory, inst where the .spack file contained a repeated spec.json and another compressed archive file containing the install tree. This test makes sure we can still read that layout.""" - mutable_config.set( - "compilers", [compiler_factory(spec="gcc@4.5.0", operating_system="debian6")] - ) legacy_layout_dir = os.path.join(test_path, "data", "mirrors", "legacy_layout") - mirror_url = "file://{0}".format(legacy_layout_dir) + mirror_url = f"file://{legacy_layout_dir}" filename = ( "test-debian6-core2-gcc-4.5.0-archive-files-2.0-" "l3vdiqvbobmspwyb4q2b62fz6nitd4hk.spec.json" @@ -563,9 +557,7 @@ def test_install_legacy_buildcache_layout(mutable_config, compiler_factory, inst mirror_cmd("add", "--scope", "site", "test-legacy-layout", mirror_url) output = install_cmd("--no-check-signature", "--cache-only", "-f", spec_json_path, output=str) mirror_cmd("rm", "--scope=site", "test-legacy-layout") - expect_line = ( - "Extracting archive-files-2.0-" "l3vdiqvbobmspwyb4q2b62fz6nitd4hk from binary cache" - ) + expect_line = "Extracting archive-files-2.0-l3vdiqvbobmspwyb4q2b62fz6nitd4hk from binary cache" assert expect_line in output @@ -1138,10 +1130,11 @@ def test_get_valid_spec_file_no_json(tmp_path, filename): bindist._get_valid_spec_file(str(tmp_path / filename), max_supported_layout=1) -def test_download_tarball_with_unsupported_layout_fails(tmp_path, mutable_config, capsys): +def test_download_tarball_with_unsupported_layout_fails( + tmp_path, mock_packages, mutable_config, capsys +): layout_version = bindist.CURRENT_BUILD_CACHE_LAYOUT_VERSION + 1 - spec = Spec("gmake@4.4.1 arch=linux-ubuntu23.04-zen2 %gcc@13.1.0") - spec._mark_concrete() + spec = spack.concretize.concretize_one("pkg-c") spec_dict = spec.to_dict() spec_dict["buildcache_layout_version"] = layout_version diff --git a/lib/spack/spack/test/bootstrap.py b/lib/spack/spack/test/bootstrap.py index 17476999790..22355d7b509 100644 --- a/lib/spack/spack/test/bootstrap.py +++ b/lib/spack/spack/test/bootstrap.py @@ -7,12 +7,14 @@ import spack.bootstrap import spack.bootstrap.config import spack.bootstrap.core -import spack.compilers +import spack.compilers.config import spack.config import spack.environment import spack.store import spack.util.path +from .conftest import _true + @pytest.fixture def active_mock_environment(mutable_config, mutable_mock_env_path): @@ -93,12 +95,14 @@ def test_raising_exception_if_bootstrap_disabled(mutable_config): spack.bootstrap.config.store_path() -def test_raising_exception_module_importable(): +def test_raising_exception_module_importable(config, monkeypatch): + monkeypatch.setattr(spack.bootstrap.core, "source_is_enabled", _true) with pytest.raises(ImportError, match='cannot bootstrap the "asdf" Python module'): spack.bootstrap.core.ensure_module_importable_or_raise("asdf") -def test_raising_exception_executables_in_path(): +def test_raising_exception_executables_in_path(config, monkeypatch): + monkeypatch.setattr(spack.bootstrap.core, "source_is_enabled", _true) with pytest.raises(RuntimeError, match="cannot bootstrap any of the asdf, fdsa executables"): spack.bootstrap.core.ensure_executables_in_path_or_raise(["asdf", "fdsa"], "python") @@ -127,22 +131,22 @@ def test_bootstrap_disables_modulefile_generation(mutable_config): @pytest.mark.regression("25992") @pytest.mark.requires_executables("gcc") -def test_bootstrap_search_for_compilers_with_no_environment(no_compilers_yaml): - assert not spack.compilers.all_compiler_specs(init_config=False) +def test_bootstrap_search_for_compilers_with_no_environment(no_packages_yaml): + assert not spack.compilers.config.all_compilers(init_config=False) with spack.bootstrap.ensure_bootstrap_configuration(): - assert spack.compilers.all_compiler_specs(init_config=False) - assert not spack.compilers.all_compiler_specs(init_config=False) + assert spack.compilers.config.all_compilers(init_config=False) + assert not spack.compilers.config.all_compilers(init_config=False) @pytest.mark.regression("25992") @pytest.mark.requires_executables("gcc") def test_bootstrap_search_for_compilers_with_environment_active( - no_compilers_yaml, active_mock_environment + no_packages_yaml, active_mock_environment ): - assert not spack.compilers.all_compiler_specs(init_config=False) + assert not spack.compilers.config.all_compilers(init_config=False) with spack.bootstrap.ensure_bootstrap_configuration(): - assert spack.compilers.all_compiler_specs(init_config=False) - assert not spack.compilers.all_compiler_specs(init_config=False) + assert spack.compilers.config.all_compilers(init_config=False) + assert not spack.compilers.config.all_compilers(init_config=False) @pytest.mark.regression("26189") @@ -218,12 +222,10 @@ def test_source_is_disabled(mutable_config): # Get the configuration dictionary of the current bootstrapping source conf = next(iter(spack.bootstrap.core.bootstrapping_sources())) - # The source is not explicitly enabled or disabled, so the following - # call should raise to skip using it for bootstrapping + # The source is not explicitly enabled or disabled, so the following should return False assert not spack.bootstrap.core.source_is_enabled(conf) - # Try to explicitly disable the source and verify that the behavior - # is the same as above + # Try to explicitly disable the source and verify that the behavior is the same as above spack.config.add("bootstrap:trusted:{0}:{1}".format(conf["name"], False)) assert not spack.bootstrap.core.source_is_enabled(conf) diff --git a/lib/spack/spack/test/build_environment.py b/lib/spack/spack/test/build_environment.py index 86c6b5a120f..ed8bcbd86dc 100644 --- a/lib/spack/spack/test/build_environment.py +++ b/lib/spack/spack/test/build_environment.py @@ -2,7 +2,6 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) import os -import platform import posixpath import sys @@ -14,19 +13,16 @@ from llnl.util.filesystem import HeaderList, LibraryList import spack.build_environment -import spack.compiler -import spack.compilers import spack.concretize import spack.config import spack.deptypes as dt import spack.package_base -import spack.paths import spack.spec +import spack.util.environment 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.environment import EnvironmentModifications from spack.util.executable import Executable @@ -43,61 +39,45 @@ def prep_and_join(path, *pths): @pytest.fixture -def build_environment(working_env): - cc = Executable(os.path.join(build_env_path, "cc")) - cxx = Executable(os.path.join(build_env_path, "c++")) - fc = Executable(os.path.join(build_env_path, "fc")) - +def build_environment(monkeypatch, wrapper_dir, tmp_path): realcc = "/bin/mycc" - prefix = "/spack-test-prefix" + prefix = str(tmp_path) - os.environ["SPACK_CC"] = realcc - os.environ["SPACK_CXX"] = realcc - os.environ["SPACK_FC"] = realcc + monkeypatch.setenv("SPACK_CC", realcc) + monkeypatch.setenv("SPACK_CXX", realcc) + monkeypatch.setenv("SPACK_FC", realcc) - os.environ["SPACK_PREFIX"] = prefix - os.environ["SPACK_ENV_PATH"] = "test" - os.environ["SPACK_DEBUG_LOG_DIR"] = "." - os.environ["SPACK_DEBUG_LOG_ID"] = "foo-hashabc" - os.environ["SPACK_COMPILER_SPEC"] = "gcc@4.4.7" - os.environ["SPACK_SHORT_SPEC"] = "foo@1.2 arch=linux-rhel6-x86_64 /hashabc" + monkeypatch.setenv("SPACK_PREFIX", prefix) + monkeypatch.setenv("SPACK_COMPILER_WRAPPER_PATH", "test") + monkeypatch.setenv("SPACK_DEBUG_LOG_DIR", ".") + monkeypatch.setenv("SPACK_DEBUG_LOG_ID", "foo-hashabc") + monkeypatch.setenv("SPACK_SHORT_SPEC", "foo@1.2 arch=linux-rhel6-x86_64 /hashabc") - os.environ["SPACK_CC_RPATH_ARG"] = "-Wl,-rpath," - os.environ["SPACK_CXX_RPATH_ARG"] = "-Wl,-rpath," - os.environ["SPACK_F77_RPATH_ARG"] = "-Wl,-rpath," - os.environ["SPACK_FC_RPATH_ARG"] = "-Wl,-rpath," - os.environ["SPACK_LINKER_ARG"] = "-Wl," - os.environ["SPACK_DTAGS_TO_ADD"] = "--disable-new-dtags" - os.environ["SPACK_DTAGS_TO_STRIP"] = "--enable-new-dtags" - os.environ["SPACK_SYSTEM_DIRS"] = "/usr/include|/usr/lib" - os.environ["SPACK_MANAGED_DIRS"] = f"{prefix}/opt/spack" - os.environ["SPACK_TARGET_ARGS"] = "" + monkeypatch.setenv("SPACK_CC_RPATH_ARG", "-Wl,-rpath,") + monkeypatch.setenv("SPACK_CXX_RPATH_ARG", "-Wl,-rpath,") + monkeypatch.setenv("SPACK_F77_RPATH_ARG", "-Wl,-rpath,") + monkeypatch.setenv("SPACK_FC_RPATH_ARG", "-Wl,-rpath,") + monkeypatch.setenv("SPACK_CC_LINKER_ARG", "-Wl,") + monkeypatch.setenv("SPACK_CXX_LINKER_ARG", "-Wl,") + monkeypatch.setenv("SPACK_FC_LINKER_ARG", "-Wl,") + monkeypatch.setenv("SPACK_F77_LINKER_ARG", "-Wl,") + monkeypatch.setenv("SPACK_DTAGS_TO_ADD", "--disable-new-dtags") + monkeypatch.setenv("SPACK_DTAGS_TO_STRIP", "--enable-new-dtags") + monkeypatch.setenv("SPACK_SYSTEM_DIRS", "/usr/include|/usr/lib") + monkeypatch.setenv("SPACK_MANAGED_DIRS", f"{prefix}/opt/spack") + monkeypatch.setenv("SPACK_TARGET_ARGS", "") - if "SPACK_DEPENDENCIES" in os.environ: - del os.environ["SPACK_DEPENDENCIES"] + monkeypatch.delenv("SPACK_DEPENDENCIES", raising=False) - yield {"cc": cc, "cxx": cxx, "fc": fc} + cc = Executable(str(wrapper_dir / "cc")) + cxx = Executable(str(wrapper_dir / "c++")) + fc = Executable(str(wrapper_dir / "fc")) - for name in ( - "SPACK_CC", - "SPACK_CXX", - "SPACK_FC", - "SPACK_PREFIX", - "SPACK_ENV_PATH", - "SPACK_DEBUG_LOG_DIR", - "SPACK_COMPILER_SPEC", - "SPACK_SHORT_SPEC", - "SPACK_CC_RPATH_ARG", - "SPACK_CXX_RPATH_ARG", - "SPACK_F77_RPATH_ARG", - "SPACK_FC_RPATH_ARG", - "SPACK_TARGET_ARGS", - ): - del os.environ[name] + return {"cc": cc, "cxx": cxx, "fc": fc} @pytest.fixture -def ensure_env_variables(config, mock_packages, monkeypatch, working_env): +def ensure_env_variables(mutable_config, mock_packages, monkeypatch, working_env): """Returns a function that takes a dictionary and updates os.environ for the test lifetime accordingly. Plugs-in mock config and repo. """ @@ -162,19 +142,24 @@ def test_static_to_shared_library(build_environment): @pytest.mark.regression("8345") -@pytest.mark.usefixtures("config", "mock_packages") -def test_cc_not_changed_by_modules(monkeypatch, working_env): - s = spack.concretize.concretize_one("cmake") - pkg = s.package +@pytest.mark.usefixtures("mock_packages") +@pytest.mark.not_on_windows("Module files are not supported on Windows") +def test_cc_not_changed_by_modules(monkeypatch, mutable_config, working_env, compiler_factory): + """Tests that external module files that are loaded cannot change the + CC environment variable. + """ + gcc_entry = compiler_factory(spec="gcc@14.0.1 languages=c,c++") + gcc_entry["modules"] = ["some_module"] + mutable_config.set("packages", {"gcc": {"externals": [gcc_entry]}}) def _set_wrong_cc(x): os.environ["CC"] = "NOT_THIS_PLEASE" os.environ["ANOTHER_VAR"] = "THIS_IS_SET" monkeypatch.setattr(spack.build_environment, "load_module", _set_wrong_cc) - monkeypatch.setattr(pkg.compiler, "modules", ["some_module"]) - spack.build_environment.setup_package(pkg, False) + s = spack.concretize.concretize_one("cmake %gcc@14") + spack.build_environment.setup_package(s.package, dirty=False) assert os.environ["CC"] != "NOT_THIS_PLEASE" assert os.environ["ANOTHER_VAR"] == "THIS_IS_SET" @@ -185,7 +170,7 @@ def test_setup_dependent_package_inherited_modules( ): # This will raise on regression s = spack.concretize.concretize_one("cmake-client-inheritor") - PackageInstaller([s.package]).install() + PackageInstaller([s.package], fake=True).install() @pytest.mark.parametrize( @@ -265,22 +250,30 @@ def test_setup_dependent_package_inherited_modules( ], ) def test_compiler_config_modifications( - initial, modifications, expected, ensure_env_variables, monkeypatch + initial, + modifications, + expected, + ensure_env_variables, + compiler_factory, + mutable_config, + monkeypatch, ): # Set the environment as per prerequisites ensure_env_variables(initial) + gcc_entry = compiler_factory(spec="gcc@14.0.1 languages=c,c++") + gcc_entry["extra_attributes"]["environment"] = modifications + mutable_config.set("packages", {"gcc": {"externals": [gcc_entry]}}) + def platform_pathsep(pathlist): if Path.platform_path == Path.windows: pathlist = pathlist.replace(":", ";") return convert_to_platform_path(pathlist) - # Monkeypatch a pkg.compiler.environment with the required modifications - pkg = spack.concretize.concretize_one("cmake").package - monkeypatch.setattr(pkg.compiler, "environment", modifications) + pkg = spack.concretize.concretize_one("cmake %gcc@14").package # Trigger the modifications - spack.build_environment.setup_package(pkg, False) + spack.build_environment.setup_package(pkg, dirty=False) # Check they were applied for name, value in expected.items(): @@ -291,25 +284,6 @@ def platform_pathsep(pathlist): assert name not in os.environ -def test_compiler_custom_env(config, mock_packages, monkeypatch, working_env): - if sys.platform == "win32": - test_path = r"C:\test\path\element\custom-env" + "\\" - else: - test_path = r"/test/path/element/custom-env/" - - def custom_env(pkg, env): - env.prepend_path("PATH", test_path) - env.append_flags("ENV_CUSTOM_CC_FLAGS", "--custom-env-flag1") - - pkg = spack.concretize.concretize_one("cmake").package - monkeypatch.setattr(pkg.compiler, "setup_custom_environment", custom_env) - spack.build_environment.setup_package(pkg, False) - - # Note: trailing slash may be stripped by internal logic - assert test_path[:-1] in os.environ["PATH"] - assert "--custom-env-flag1" in os.environ["ENV_CUSTOM_CC_FLAGS"] - - def test_external_config_env(mock_packages, mutable_config, working_env): cmake_config = { "externals": [ @@ -329,25 +303,28 @@ def test_external_config_env(mock_packages, mutable_config, working_env): @pytest.mark.regression("9107") -def test_spack_paths_before_module_paths(config, mock_packages, monkeypatch, working_env): - s = spack.concretize.concretize_one("cmake") - pkg = s.package +@pytest.mark.not_on_windows("Windows does not support module files") +def test_spack_paths_before_module_paths( + mutable_config, mock_packages, compiler_factory, monkeypatch, working_env, wrapper_dir +): + gcc_entry = compiler_factory(spec="gcc@14.0.1 languages=c,c++") + gcc_entry["modules"] = ["some_module"] + mutable_config.set("packages", {"gcc": {"externals": [gcc_entry]}}) module_path = os.path.join("path", "to", "module") + monkeypatch.setenv("SPACK_COMPILER_WRAPPER_PATH", wrapper_dir) def _set_wrong_cc(x): os.environ["PATH"] = module_path + os.pathsep + os.environ["PATH"] monkeypatch.setattr(spack.build_environment, "load_module", _set_wrong_cc) - monkeypatch.setattr(pkg.compiler, "modules", ["some_module"]) - spack.build_environment.setup_package(pkg, False) + s = spack.concretize.concretize_one("cmake") - spack_path = os.path.join(spack.paths.prefix, os.path.join("lib", "spack", "env")) + spack.build_environment.setup_package(s.package, dirty=False) paths = os.environ["PATH"].split(os.pathsep) - - assert paths.index(spack_path) < paths.index(module_path) + assert paths.index(str(wrapper_dir)) < paths.index(module_path) def test_package_inheritance_module_setup(config, mock_packages, working_env): @@ -490,19 +467,16 @@ def test_parallel_false_is_not_propagating(default_mock_concretization): @pytest.mark.parametrize( "config_setting,expected_flag", - [ - ("runpath", "" if platform.system() == "Darwin" else "--enable-new-dtags"), - ("rpath", "" if platform.system() == "Darwin" else "--disable-new-dtags"), - ], + [("runpath", "--enable-new-dtags"), ("rpath", "--disable-new-dtags")], ) -def test_setting_dtags_based_on_config(config_setting, expected_flag, config, mock_packages): +@pytest.mark.skipif(sys.platform != "linux", reason="dtags make sense only on linux") +def test_setting_dtags_based_on_config( + config_setting, expected_flag, config, mock_packages, working_env +): # Pick a random package to be able to set compiler's variables s = spack.concretize.concretize_one("cmake") - pkg = s.package - - env = EnvironmentModifications() with spack.config.override("config:shared_linking", {"type": config_setting, "bind": False}): - spack.build_environment.set_compiler_environment_variables(pkg, env) + env = spack.build_environment.setup_package(s.package, dirty=False) modifications = env.group_by_name() assert "SPACK_DTAGS_TO_STRIP" in modifications assert "SPACK_DTAGS_TO_ADD" in modifications @@ -765,59 +739,41 @@ def test_rpath_with_duplicate_link_deps(): @pytest.mark.parametrize( "compiler_spec,target_name,expected_flags", [ - # Homogeneous compilers + # Semver versions ("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", ""), + ("gcc@=9.2.0", "haswell", "-march=haswell -mtune=haswell"), + # Check that custom string versions are accepted + ("gcc@=9.2.0-foo", "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", "x86_64", "-march=x86-64"), ], ) @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) + compiler = spack.spec.parse_with_version_concrete(compiler_spec) 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"), - ], +@pytest.mark.skipif( + str(archspec.cpu.host().family) != "x86_64", reason="tests check specific x86_64 uarch flags" ) -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"]) +@pytest.mark.not_on_windows("Windows doesn't support the compiler wrapper") +def test_optimization_flags_are_using_node_target(default_mock_concretization, monkeypatch): + """Tests that we are using the target on the node to be compiled to retrieve the uarch + specific flags, and not the target of the compiler. + """ + compiler_wrapper_pkg = default_mock_concretization("compiler-wrapper target=core2").package + mpileaks = default_mock_concretization("mpileaks target=x86_64") - opt_flags = spack.build_environment.optimization_flags(compiler, target) - assert opt_flags == expected_flags + env = EnvironmentModifications() + compiler_wrapper_pkg.setup_dependent_build_environment(env, mpileaks) + actions = env.group_by_name()["SPACK_TARGET_ARGS_CC"] + + assert len(actions) == 1 and isinstance(actions[0], spack.util.environment.SetEnv) + assert actions[0].value == "-march=x86-64 -mtune=generic" diff --git a/lib/spack/spack/test/cc.py b/lib/spack/spack/test/cc.py index 1a8f79c3b7f..e9aea962085 100644 --- a/lib/spack/spack/test/cc.py +++ b/lib/spack/spack/test/cc.py @@ -12,7 +12,6 @@ import spack.build_environment import spack.config -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 @@ -110,12 +109,6 @@ #: The prefix of the package being mock installed pkg_prefix = "/spack-test-prefix" -# Compilers to use during tests -cc = Executable(os.path.join(build_env_path, "cc")) -ld = Executable(os.path.join(build_env_path, "ld")) -cpp = Executable(os.path.join(build_env_path, "cpp")) -cxx = Executable(os.path.join(build_env_path, "c++")) -fc = Executable(os.path.join(build_env_path, "fc")) #: the "real" compiler the wrapper is expected to invoke real_cc = "/bin/mycc" @@ -132,6 +125,7 @@ headerpad = ["-headerpad_max_install_names"] target_args = ["-march=znver2", "-mtune=znver2"] +target_args_fc = ["-march=znver4", "-mtune=znver4"] # common compile arguments: includes, libs, -Wl linker args, other args common_compile_args = ( @@ -152,10 +146,9 @@ def wrapper_environment(working_env): SPACK_CXX=real_cc, SPACK_FC=real_cc, SPACK_PREFIX=pkg_prefix, - SPACK_ENV_PATH="test", + SPACK_COMPILER_WRAPPER_PATH="test", SPACK_DEBUG_LOG_DIR=".", SPACK_DEBUG_LOG_ID="foo-hashabc", - SPACK_COMPILER_SPEC="gcc@4.4.7", SPACK_SHORT_SPEC="foo@1.2 arch=linux-rhel6-x86_64 /hashabc", SPACK_SYSTEM_DIRS=SYSTEM_DIR_CASE_ENTRY, SPACK_MANAGED_DIRS="/path/to/spack-1/opt/spack/*|/path/to/spack-2/opt/spack/*", @@ -166,8 +159,13 @@ def wrapper_environment(working_env): SPACK_LINK_DIRS=None, SPACK_INCLUDE_DIRS=None, SPACK_RPATH_DIRS=None, - SPACK_TARGET_ARGS="-march=znver2 -mtune=znver2", - SPACK_LINKER_ARG="-Wl,", + SPACK_TARGET_ARGS_CC="-march=znver2 -mtune=znver2", + SPACK_TARGET_ARGS_CXX="-march=znver2 -mtune=znver2", + SPACK_TARGET_ARGS_FORTRAN="-march=znver4 -mtune=znver4", + SPACK_CC_LINKER_ARG="-Wl,", + SPACK_CXX_LINKER_ARG="-Wl,", + SPACK_FC_LINKER_ARG="-Wl,", + SPACK_F77_LINKER_ARG="-Wl,", SPACK_DTAGS_TO_ADD="--disable-new-dtags", SPACK_DTAGS_TO_STRIP="--enable-new-dtags", SPACK_COMPILER_FLAGS_KEEP="", @@ -196,6 +194,7 @@ def check_args(cc, args, expected): per line, so that we see whether arguments that should (or shouldn't) contain spaces are parsed correctly. """ + cc = Executable(str(cc)) with set_env(SPACK_TEST_COMMAND="dump-args"): cc_modified_args = cc(*args, output=str).strip().split("\n") assert cc_modified_args == expected @@ -208,6 +207,7 @@ def check_args_contents(cc, args, must_contain, must_not_contain): per line, so that we see whether arguments that should (or shouldn't) contain spaces are parsed correctly. """ + cc = Executable(str(cc)) with set_env(SPACK_TEST_COMMAND="dump-args"): cc_modified_args = cc(*args, output=str).strip().split("\n") for a in must_contain: @@ -222,6 +222,7 @@ def check_env_var(executable, var, expected): This assumes that cc will print debug output when it's environment contains SPACK_TEST_COMMAND=dump-env- """ + executable = Executable(str(executable)) with set_env(SPACK_TEST_COMMAND="dump-env-" + var): output = executable(*test_args, output=str).strip() assert executable.path + ": " + var + ": " + expected == output @@ -229,17 +230,25 @@ def check_env_var(executable, var, expected): def dump_mode(cc, args): """Make cc dump the mode it detects, and return it.""" + cc = Executable(str(cc)) with set_env(SPACK_TEST_COMMAND="dump-mode"): return cc(*args, output=str).strip() -def test_no_wrapper_environment(): +def test_no_wrapper_environment(wrapper_dir): + cc = Executable(str(wrapper_dir / "cc")) with pytest.raises(ProcessError): output = cc(output=str) assert "Spack compiler must be run from Spack" in output -def test_vcheck_mode(wrapper_environment): +def test_modes(wrapper_environment, wrapper_dir): + cc = wrapper_dir / "cc" + cxx = wrapper_dir / "c++" + cpp = wrapper_dir / "cpp" + ld = wrapper_dir / "ld" + + # vcheck assert dump_mode(cc, ["-I/include", "--version"]) == "vcheck" assert dump_mode(cc, ["-I/include", "-V"]) == "vcheck" assert dump_mode(cc, ["-I/include", "-v"]) == "vcheck" @@ -247,38 +256,39 @@ def test_vcheck_mode(wrapper_environment): assert dump_mode(cc, ["-I/include", "--version", "-c"]) == "vcheck" assert dump_mode(cc, ["-I/include", "-V", "-o", "output"]) == "vcheck" - -def test_cpp_mode(wrapper_environment): + # cpp assert dump_mode(cc, ["-E"]) == "cpp" assert dump_mode(cxx, ["-E"]) == "cpp" assert dump_mode(cpp, []) == "cpp" - -def test_as_mode(wrapper_environment): + # as assert dump_mode(cc, ["-S"]) == "as" - -def test_ccld_mode(wrapper_environment): + # ccld assert dump_mode(cc, []) == "ccld" assert dump_mode(cc, ["foo.c", "-o", "foo"]) == "ccld" assert dump_mode(cc, ["foo.c", "-o", "foo", "-Wl,-rpath,foo"]) == "ccld" assert dump_mode(cc, ["foo.o", "bar.o", "baz.o", "-o", "foo", "-Wl,-rpath,foo"]) == "ccld" - -def test_ld_mode(wrapper_environment): + # ld assert dump_mode(ld, []) == "ld" assert dump_mode(ld, ["foo.o", "bar.o", "baz.o", "-o", "foo", "-Wl,-rpath,foo"]) == "ld" -def test_ld_unterminated_rpath(wrapper_environment): +@pytest.mark.regression("37179") +def test_expected_args(wrapper_environment, wrapper_dir): + cc = wrapper_dir / "cc" + fc = wrapper_dir / "fc" + ld = wrapper_dir / "ld" + + # ld_unterminated_rpath check_args( ld, ["foo.o", "bar.o", "baz.o", "-o", "foo", "-rpath"], ["ld", "--disable-new-dtags", "foo.o", "bar.o", "baz.o", "-o", "foo", "-rpath"], ) - -def test_xlinker_unterminated_rpath(wrapper_environment): + # xlinker_unterminated_rpath check_args( cc, ["foo.o", "bar.o", "baz.o", "-o", "foo", "-Xlinker", "-rpath"], @@ -296,8 +306,7 @@ def test_xlinker_unterminated_rpath(wrapper_environment): ], ) - -def test_wl_unterminated_rpath(wrapper_environment): + # wl_unterminated_rpath check_args( cc, ["foo.o", "bar.o", "baz.o", "-o", "foo", "-Wl,-rpath"], @@ -306,99 +315,7 @@ def test_wl_unterminated_rpath(wrapper_environment): + ["-Wl,--disable-new-dtags", "foo.o", "bar.o", "baz.o", "-o", "foo", "-Wl,-rpath"], ) - -def test_ld_flags(wrapper_environment, wrapper_flags): - check_args( - ld, - test_args, - ["ld"] - + test_include_paths - + test_library_paths - + ["--disable-new-dtags"] - + test_rpaths - + test_args_without_paths - + spack_ldlibs, - ) - - -def test_cpp_flags(wrapper_environment, wrapper_flags): - check_args( - cpp, - test_args, - ["cpp"] - + test_include_paths - + test_library_paths - + test_args_without_paths - + spack_cppflags, - ) - - -def test_cc_flags(wrapper_environment, wrapper_flags): - check_args( - cc, - test_args, - [real_cc] - + target_args - + test_include_paths - + ["-Lfoo"] - + test_library_paths - + ["-Wl,--disable-new-dtags"] - + test_wl_rpaths - + test_args_without_paths - + spack_cppflags - + spack_cflags - + ["-Wl,--gc-sections"] - + spack_ldlibs, - ) - - -def test_cxx_flags(wrapper_environment, wrapper_flags): - check_args( - cxx, - test_args, - [real_cc] - + target_args - + test_include_paths - + ["-Lfoo"] - + test_library_paths - + ["-Wl,--disable-new-dtags"] - + test_wl_rpaths - + test_args_without_paths - + spack_cppflags - + ["-Wl,--gc-sections"] - + spack_ldlibs, - ) - - -def test_fc_flags(wrapper_environment, wrapper_flags): - check_args( - fc, - test_args, - [real_cc] - + target_args - + test_include_paths - + ["-Lfoo"] - + test_library_paths - + ["-Wl,--disable-new-dtags"] - + test_wl_rpaths - + test_args_without_paths - + spack_fflags - + spack_cppflags - + ["-Wl,--gc-sections"] - + spack_ldlibs, - ) - - -def test_always_cflags(wrapper_environment, wrapper_flags): - with set_env(SPACK_ALWAYS_CFLAGS="-always1 -always2"): - check_args( - cc, - ["-v", "--cmd-line-v-opt"], - [real_cc] + ["-always1", "-always2"] + ["-v", "--cmd-line-v-opt"], - ) - - -def test_Wl_parsing(wrapper_environment): + # Wl_parsing check_args( cc, ["-Wl,-rpath,/a,--enable-new-dtags,-rpath=/b,--rpath", "-Wl,/c"], @@ -407,26 +324,22 @@ def test_Wl_parsing(wrapper_environment): + ["-Wl,--disable-new-dtags", "-Wl,-rpath,/a", "-Wl,-rpath,/b", "-Wl,-rpath,/c"], ) - -@pytest.mark.regression("37179") -def test_Wl_parsing_with_missing_value(wrapper_environment): + # Wl_parsing_with_missing_value check_args( cc, ["-Wl,-rpath=/a,-rpath=", "-Wl,--rpath="], [real_cc] + target_args + ["-Wl,--disable-new-dtags", "-Wl,-rpath,/a"], ) - -@pytest.mark.regression("37179") -def test_Wl_parsing_NAG_is_ignored(wrapper_environment): + # Wl_parsing_NAG_is_ignored check_args( fc, ["-Wl,-Wl,,x,,y,,z"], - [real_cc] + target_args + ["-Wl,--disable-new-dtags", "-Wl,-Wl,,x,,y,,z"], + [real_cc] + target_args_fc + ["-Wl,--disable-new-dtags", "-Wl,-Wl,,x,,y,,z"], ) - -def test_Xlinker_parsing(wrapper_environment): + # Xlinker_parsing + # # -Xlinker ... -Xlinker may have compiler flags inbetween, like -O3 in this # example. Also check that a trailing -Xlinker (which is a compiler error) is not # dropped or given an empty argument. @@ -457,8 +370,8 @@ def test_Xlinker_parsing(wrapper_environment): ], ) - -def test_rpath_without_value(wrapper_environment): + # rpath_without_value + # # cc -Wl,-rpath without a value shouldn't drop -Wl,-rpath; # same for -Xlinker check_args( @@ -472,14 +385,10 @@ def test_rpath_without_value(wrapper_environment): [real_cc] + target_args + ["-Wl,--disable-new-dtags", "-O3", "-g", "-Xlinker", "-rpath"], ) - -def test_dep_rpath(wrapper_environment): - """Ensure RPATHs for root package are added.""" + # dep_rapth check_args(cc, test_args, [real_cc] + target_args + common_compile_args) - -def test_dep_include(wrapper_environment): - """Ensure a single dependency include directory is added.""" + # dep_include with set_env(SPACK_INCLUDE_DIRS="x"): check_args( cc, @@ -494,29 +403,9 @@ def test_dep_include(wrapper_environment): + test_args_without_paths, ) - -def test_system_path_cleanup(wrapper_environment): - """Ensure SPACK_ENV_PATH is removed from PATH, even with trailing / - - The compiler wrapper has to ensure that it is not called nested - like it would happen when gcc's collect2 looks in PATH for ld. - - To prevent nested calls, the compiler wrapper removes the elements - of SPACK_ENV_PATH from PATH. Autotest's generated testsuite appends - a / to each element of PATH when adding AUTOTEST_PATH. - Thus, ensure that PATH cleanup works even with trailing /. - """ - system_path = "/bin:/usr/bin:/usr/local/bin" - cc_dir = os.path.dirname(cc.path) - with set_env(SPACK_ENV_PATH=cc_dir, SPACK_CC="true"): - with set_env(PATH=cc_dir + ":" + system_path): - check_env_var(cc, "PATH", system_path) - with set_env(PATH=cc_dir + "/:" + system_path): - check_env_var(cc, "PATH", system_path) - - -def test_dep_lib(wrapper_environment): - """Ensure a single dependency RPATH is added.""" + # dep_lib + # + # Ensure a single dependency RPATH is added with set_env(SPACK_LINK_DIRS="x", SPACK_RPATH_DIRS="x"): check_args( cc, @@ -532,9 +421,9 @@ def test_dep_lib(wrapper_environment): + test_args_without_paths, ) - -def test_dep_lib_no_rpath(wrapper_environment): - """Ensure a single dependency link flag is added with no dep RPATH.""" + # dep_lib_no_rpath + # + # Ensure a single dependency link flag is added with no dep RPATH with set_env(SPACK_LINK_DIRS="x"): check_args( cc, @@ -549,9 +438,8 @@ def test_dep_lib_no_rpath(wrapper_environment): + test_args_without_paths, ) - -def test_dep_lib_no_lib(wrapper_environment): - """Ensure a single dependency RPATH is added with no -L.""" + # dep_lib_no_lib + # Ensure a single dependency RPATH is added with no -L with set_env(SPACK_RPATH_DIRS="x"): check_args( cc, @@ -566,9 +454,8 @@ def test_dep_lib_no_lib(wrapper_environment): + test_args_without_paths, ) - -def test_ccld_deps(wrapper_environment): - """Ensure all flags are added in ccld mode.""" + # ccld_deps + # Ensure all flags are added in ccld mode with set_env( SPACK_INCLUDE_DIRS="xinc:yinc:zinc", SPACK_RPATH_DIRS="xlib:ylib:zlib", @@ -589,13 +476,13 @@ def test_ccld_deps(wrapper_environment): + test_args_without_paths, ) - -def test_ccld_deps_isystem(wrapper_environment): - """Ensure all flags are added in ccld mode. - When a build uses -isystem, Spack should inject it's - include paths using -isystem. Spack will insert these - after any provided -isystem includes, but before any - system directories included using -isystem""" + # ccld_deps_isystem + # + # Ensure all flags are added in ccld mode. + # When a build uses -isystem, Spack should inject it's + # include paths using -isystem. Spack will insert these + # after any provided -isystem includes, but before any + # system directories included using -isystem with set_env( SPACK_INCLUDE_DIRS="xinc:yinc:zinc", SPACK_RPATH_DIRS="xlib:ylib:zlib", @@ -617,9 +504,8 @@ def test_ccld_deps_isystem(wrapper_environment): + test_args_without_paths, ) - -def test_cc_deps(wrapper_environment): - """Ensure -L and RPATHs are not added in cc mode.""" + # cc_deps + # Ensure -L and RPATHs are not added in cc mode with set_env( SPACK_INCLUDE_DIRS="xinc:yinc:zinc", SPACK_RPATH_DIRS="xlib:ylib:zlib", @@ -637,9 +523,8 @@ def test_cc_deps(wrapper_environment): + test_args_without_paths, ) - -def test_ccld_with_system_dirs(wrapper_environment): - """Ensure all flags are added in ccld mode.""" + # ccld_with_system_dirs + # Ensure all flags are added in ccld mode with set_env( SPACK_INCLUDE_DIRS="xinc:yinc:zinc", SPACK_RPATH_DIRS="xlib:ylib:zlib", @@ -670,12 +555,11 @@ def test_ccld_with_system_dirs(wrapper_environment): + test_args_without_paths, ) - -def test_ccld_with_system_dirs_isystem(wrapper_environment): - """Ensure all flags are added in ccld mode. - Ensure that includes are in the proper - place when a build uses -isystem, and uses - system directories in the include paths""" + # ccld_with_system_dirs_isystem + # Ensure all flags are added in ccld mode. + # Ensure that includes are in the proper + # place when a build uses -isystem, and uses + # system directories in the include paths with set_env( SPACK_INCLUDE_DIRS="xinc:yinc:zinc", SPACK_RPATH_DIRS="xlib:ylib:zlib", @@ -708,9 +592,8 @@ def test_ccld_with_system_dirs_isystem(wrapper_environment): + test_args_without_paths, ) - -def test_ld_deps(wrapper_environment): - """Ensure no (extra) -I args or -Wl, are passed in ld mode.""" + # ld_deps + # Ensure no (extra) -I args or -Wl, are passed in ld mode with set_env( SPACK_INCLUDE_DIRS="xinc:yinc:zinc", SPACK_RPATH_DIRS="xlib:ylib:zlib", @@ -729,9 +612,8 @@ def test_ld_deps(wrapper_environment): + test_args_without_paths, ) - -def test_ld_deps_no_rpath(wrapper_environment): - """Ensure SPACK_LINK_DEPS controls -L for ld.""" + # ld_deps_no_rpath + # Ensure SPACK_LINK_DEPS controls -L for ld with set_env(SPACK_INCLUDE_DIRS="xinc:yinc:zinc", SPACK_LINK_DIRS="xlib:ylib:zlib"): check_args( ld, @@ -745,9 +627,8 @@ def test_ld_deps_no_rpath(wrapper_environment): + test_args_without_paths, ) - -def test_ld_deps_no_link(wrapper_environment): - """Ensure SPACK_RPATH_DEPS controls -rpath for ld.""" + # ld_deps_no_link + # Ensure SPACK_RPATH_DEPS controls -rpath for ld with set_env(SPACK_INCLUDE_DIRS="xinc:yinc:zinc", SPACK_RPATH_DIRS="xlib:ylib:zlib"): check_args( ld, @@ -762,10 +643,124 @@ def test_ld_deps_no_link(wrapper_environment): ) -def test_ld_deps_partial(wrapper_environment): +def test_expected_args_with_flags(wrapper_environment, wrapper_flags, wrapper_dir): + cc = wrapper_dir / "cc" + cxx = wrapper_dir / "c++" + cpp = wrapper_dir / "cpp" + fc = wrapper_dir / "fc" + ld = wrapper_dir / "ld" + + # ld_flags + check_args( + ld, + test_args, + ["ld"] + + test_include_paths + + test_library_paths + + ["--disable-new-dtags"] + + test_rpaths + + test_args_without_paths + + spack_ldlibs, + ) + + # cpp_flags + check_args( + cpp, + test_args, + ["cpp"] + + test_include_paths + + test_library_paths + + test_args_without_paths + + spack_cppflags, + ) + + # cc_flags + check_args( + cc, + test_args, + [real_cc] + + target_args + + test_include_paths + + ["-Lfoo"] + + test_library_paths + + ["-Wl,--disable-new-dtags"] + + test_wl_rpaths + + test_args_without_paths + + spack_cppflags + + spack_cflags + + ["-Wl,--gc-sections"] + + spack_ldlibs, + ) + + # cxx_flags + check_args( + cxx, + test_args, + [real_cc] + + target_args + + test_include_paths + + ["-Lfoo"] + + test_library_paths + + ["-Wl,--disable-new-dtags"] + + test_wl_rpaths + + test_args_without_paths + + spack_cppflags + + ["-Wl,--gc-sections"] + + spack_ldlibs, + ) + + # fc_flags + check_args( + fc, + test_args, + [real_cc] + + target_args_fc + + test_include_paths + + ["-Lfoo"] + + test_library_paths + + ["-Wl,--disable-new-dtags"] + + test_wl_rpaths + + test_args_without_paths + + spack_fflags + + spack_cppflags + + ["-Wl,--gc-sections"] + + spack_ldlibs, + ) + + # always_cflags + with set_env(SPACK_ALWAYS_CFLAGS="-always1 -always2"): + check_args( + cc, + ["-v", "--cmd-line-v-opt"], + [real_cc] + ["-always1", "-always2"] + ["-v", "--cmd-line-v-opt"], + ) + + +def test_system_path_cleanup(wrapper_environment, wrapper_dir): + """Ensure SPACK_COMPILER_WRAPPER_PATH is removed from PATH, even with trailing / + + The compiler wrapper has to ensure that it is not called nested + like it would happen when gcc's collect2 looks in PATH for ld. + + To prevent nested calls, the compiler wrapper removes the elements + of SPACK_COMPILER_WRAPPER_PATH from PATH. Autotest's generated testsuite appends + a / to each element of PATH when adding AUTOTEST_PATH. + Thus, ensure that PATH cleanup works even with trailing /. + """ + cc = wrapper_dir / "cc" + system_path = "/bin:/usr/bin:/usr/local/bin" + with set_env(SPACK_COMPILER_WRAPPER_PATH=str(wrapper_dir), SPACK_CC="true"): + with set_env(PATH=str(wrapper_dir) + ":" + system_path): + check_env_var(cc, "PATH", system_path) + with set_env(PATH=str(wrapper_dir) + "/:" + system_path): + check_env_var(cc, "PATH", system_path) + + +def test_ld_deps_partial(wrapper_environment, wrapper_dir): """Make sure ld -r (partial link) is handled correctly on OS's where it doesn't accept rpaths. """ + ld = wrapper_dir / "ld" with set_env(SPACK_INCLUDE_DIRS="xinc", SPACK_RPATH_DIRS="xlib", SPACK_LINK_DIRS="xlib"): # TODO: do we need to add RPATHs on other platforms like Linux? # TODO: Can't we treat them the same? @@ -802,7 +797,8 @@ def test_ld_deps_partial(wrapper_environment): ) -def test_ccache_prepend_for_cc(wrapper_environment): +def test_ccache_prepend_for_cc(wrapper_environment, wrapper_dir): + cc = wrapper_dir / "cc" with set_env(SPACK_CCACHE_BINARY="ccache"): os.environ["SPACK_SHORT_SPEC"] = "foo@1.2=linux-x86_64" check_args( @@ -825,24 +821,26 @@ def test_ccache_prepend_for_cc(wrapper_environment): ) -def test_no_ccache_prepend_for_fc(wrapper_environment): +def test_no_ccache_prepend_for_fc(wrapper_environment, wrapper_dir): + fc = wrapper_dir / "fc" os.environ["SPACK_SHORT_SPEC"] = "foo@1.2=linux-x86_64" check_args( fc, test_args, # no ccache for Fortran - [real_cc] + target_args + common_compile_args, + [real_cc] + target_args_fc + common_compile_args, ) os.environ["SPACK_SHORT_SPEC"] = "foo@1.2=darwin-x86_64" check_args( fc, test_args, # no ccache for Fortran - [real_cc] + target_args + lheaderpad + common_compile_args, + [real_cc] + target_args_fc + lheaderpad + common_compile_args, ) -def test_keep_and_replace(wrapper_environment): +def test_keep_and_replace(wrapper_environment, wrapper_dir): + cc = wrapper_dir / "cc" werror_specific = ["-Werror=meh"] werror = ["-Werror"] werror_all = werror_specific + werror @@ -903,7 +901,8 @@ def test_keep_and_replace(wrapper_environment): ], ) @pytest.mark.usefixtures("wrapper_environment", "mutable_config") -def test_flag_modification(cfg_override, initial, expected, must_be_gone): +def test_flag_modification(cfg_override, initial, expected, must_be_gone, wrapper_dir): + cc = wrapper_dir / "cc" spack.config.add(cfg_override) env = spack.build_environment.clean_environment() @@ -914,7 +913,9 @@ def test_flag_modification(cfg_override, initial, expected, must_be_gone): @pytest.mark.regression("9160") -def test_disable_new_dtags(wrapper_environment, wrapper_flags): +def test_disable_new_dtags(wrapper_environment, wrapper_flags, wrapper_dir): + cc = Executable(str(wrapper_dir / "cc")) + ld = Executable(str(wrapper_dir / "ld")) with set_env(SPACK_TEST_COMMAND="dump-args"): result = ld(*test_args, output=str).strip().split("\n") assert "--disable-new-dtags" in result @@ -923,7 +924,9 @@ def test_disable_new_dtags(wrapper_environment, wrapper_flags): @pytest.mark.regression("9160") -def test_filter_enable_new_dtags(wrapper_environment, wrapper_flags): +def test_filter_enable_new_dtags(wrapper_environment, wrapper_flags, wrapper_dir): + cc = Executable(str(wrapper_dir / "cc")) + ld = Executable(str(wrapper_dir / "ld")) with set_env(SPACK_TEST_COMMAND="dump-args"): result = ld(*(test_args + ["--enable-new-dtags"]), output=str) result = result.strip().split("\n") @@ -935,7 +938,9 @@ def test_filter_enable_new_dtags(wrapper_environment, wrapper_flags): @pytest.mark.regression("22643") -def test_linker_strips_loopopt(wrapper_environment, wrapper_flags): +def test_linker_strips_loopopt(wrapper_environment, wrapper_flags, wrapper_dir): + cc = Executable(str(wrapper_dir / "cc")) + ld = Executable(str(wrapper_dir / "ld")) with set_env(SPACK_TEST_COMMAND="dump-args"): # ensure that -loopopt=0 is not present in ld mode result = ld(*(test_args + ["-loopopt=0"]), output=str) @@ -955,7 +960,9 @@ def test_linker_strips_loopopt(wrapper_environment, wrapper_flags): assert "-loopopt=0" in result -def test_spack_managed_dirs_are_prioritized(wrapper_environment): +def test_spack_managed_dirs_are_prioritized(wrapper_environment, wrapper_dir): + cc = Executable(str(wrapper_dir / "cc")) + # We have two different stores with 5 packages divided over them pkg1 = "/path/to/spack-1/opt/spack/linux-ubuntu22.04-zen2/gcc-13.2.0/pkg-1.0-abcdef" pkg2 = "/path/to/spack-1/opt/spack/linux-ubuntu22.04-zen2/gcc-13.2.0/pkg-2.0-abcdef" diff --git a/lib/spack/spack/test/ci.py b/lib/spack/spack/test/ci.py index 3412cf41736..ecdda0c6d58 100644 --- a/lib/spack/spack/test/ci.py +++ b/lib/spack/spack/test/ci.py @@ -339,22 +339,29 @@ def __call__(self, *args, **kwargs): def test_get_spec_filter_list(mutable_mock_env_path, mutable_mock_repo): - """Test that given an active environment and list of touched pkgs, - we get the right list of possibly-changed env specs""" + """Tests that, given an active environment and list of touched pkgs, we get the right + list of possibly-changed env specs. + + The test concretizes the following environment: + + [ ] hypre@=0.2.15+shared build_system=generic + [bl ] ^openblas-with-lapack@=0.2.15 build_system=generic + [ ] mpileaks@=2.3~debug~opt+shared+static build_system=generic + [bl ] ^callpath@=1.0 build_system=generic + [bl ] ^dyninst@=8.2 build_system=generic + [bl ] ^libdwarf@=20130729 build_system=generic + [bl ] ^libelf@=0.8.13 build_system=generic + [b ] ^gcc@=10.2.1 build_system=generic languages='c,c++,fortran' + [ l ] ^gcc-runtime@=10.2.1 build_system=generic + [bl ] ^mpich@=3.0.4~debug build_system=generic + + and simulates a change in libdwarf. + """ e1 = ev.create("test") e1.add("mpileaks") e1.add("hypre") e1.concretize() - # Concretizing the above environment results in the following graphs: - - # mpileaks -> mpich (provides mpi virtual dep of mpileaks) - # -> callpath -> dyninst -> libelf - # -> libdwarf -> libelf - # -> mpich (provides mpi dep of callpath) - - # hypre -> openblas-with-lapack (provides lapack and blas virtual deps of hypre) - touched = ["libdwarf"] # Make sure we return the correct set of possibly affected specs, @@ -366,17 +373,35 @@ def test_get_spec_filter_list(mutable_mock_env_path, mutable_mock_repo): # no spec traversals. Passing any other number yields differing # numbers of possibly affected specs. - full_set = set(["mpileaks", "mpich", "callpath", "dyninst", "libdwarf", "libelf"]) - empty_set = set([]) - depth_2_set = set(["mpich", "callpath", "dyninst", "libdwarf", "libelf"]) - depth_1_set = set(["dyninst", "libdwarf", "libelf"]) - depth_0_set = set(["libdwarf", "libelf"]) + full_set = { + "mpileaks", + "mpich", + "callpath", + "dyninst", + "libdwarf", + "libelf", + "gcc", + "gcc-runtime", + "compiler-wrapper", + } + depth_2_set = { + "mpich", + "callpath", + "dyninst", + "libdwarf", + "libelf", + "gcc", + "gcc-runtime", + "compiler-wrapper", + } + depth_1_set = {"dyninst", "libdwarf", "libelf", "gcc", "gcc-runtime", "compiler-wrapper"} + depth_0_set = {"libdwarf", "libelf", "gcc", "gcc-runtime", "compiler-wrapper"} expectations = { None: full_set, 3: full_set, 100: full_set, - -1: empty_set, + -1: set(), 0: depth_0_set, 1: depth_1_set, 2: depth_2_set, @@ -384,7 +409,7 @@ def test_get_spec_filter_list(mutable_mock_env_path, mutable_mock_repo): for key, val in expectations.items(): affected_specs = ci.get_spec_filter_list(e1, touched, dependent_traverse_depth=key) - affected_pkg_names = set([s.name for s in affected_specs]) + affected_pkg_names = {s.name for s in affected_specs} assert affected_pkg_names == val diff --git a/lib/spack/spack/test/cmd/ci.py b/lib/spack/spack/test/cmd/ci.py index 31ac7981d23..fd2ac4c9be6 100644 --- a/lib/spack/spack/test/cmd/ci.py +++ b/lib/spack/spack/test/cmd/ci.py @@ -186,9 +186,9 @@ def test_ci_generate_with_env(ci_generate_test, tmp_path, mock_binary_index): assert yaml_contents["workflow"]["rules"] == [{"when": "always"}] assert "stages" in yaml_contents - assert len(yaml_contents["stages"]) == 5 + assert len(yaml_contents["stages"]) == 6 assert yaml_contents["stages"][0] == "stage-0" - assert yaml_contents["stages"][4] == "stage-rebuild-index" + assert yaml_contents["stages"][5] == "stage-rebuild-index" assert "rebuild-index" in yaml_contents rebuild_job = yaml_contents["rebuild-index"] diff --git a/lib/spack/spack/test/cmd/compiler.py b/lib/spack/spack/test/cmd/compiler.py index ad4d475eada..6b060329476 100644 --- a/lib/spack/spack/test/cmd/compiler.py +++ b/lib/spack/spack/test/cmd/compiler.py @@ -3,15 +3,13 @@ # SPDX-License-Identifier: (Apache-2.0 OR MIT) import os import shutil -import sys import pytest import spack.cmd.compiler -import spack.compilers +import spack.compilers.config import spack.config import spack.main -import spack.spec import spack.util.pattern import spack.version @@ -69,7 +67,7 @@ def compilers_dir(mock_executable): @pytest.mark.not_on_windows("Cannot execute bash script on Windows") @pytest.mark.regression("11678,13138") -def test_compiler_find_without_paths(no_compilers_yaml, working_env, mock_executable): +def test_compiler_find_without_paths(no_packages_yaml, working_env, mock_executable): """Tests that 'spack compiler find' looks into PATH by default, if no specific path is given. """ @@ -84,22 +82,30 @@ def test_compiler_find_without_paths(no_compilers_yaml, working_env, mock_execut @pytest.mark.regression("37996") def test_compiler_remove(mutable_config, mock_packages): """Tests that we can remove a compiler from configuration.""" - assert spack.spec.CompilerSpec("gcc@=9.4.0") in spack.compilers.all_compiler_specs() + assert any( + compiler.satisfies("gcc@=9.4.0") for compiler in spack.compilers.config.all_compilers() + ) args = spack.util.pattern.Bunch(all=True, compiler_spec="gcc@9.4.0", add_paths=[], scope=None) spack.cmd.compiler.compiler_remove(args) - assert spack.spec.CompilerSpec("gcc@=9.4.0") not in spack.compilers.all_compiler_specs() + assert not any( + compiler.satisfies("gcc@=9.4.0") for compiler in spack.compilers.config.all_compilers() + ) @pytest.mark.regression("37996") def test_removing_compilers_from_multiple_scopes(mutable_config, mock_packages): # Duplicate "site" scope into "user" scope - site_config = spack.config.get("compilers", scope="site") - spack.config.set("compilers", site_config, scope="user") + site_config = spack.config.get("packages", scope="site") + spack.config.set("packages", site_config, scope="user") - assert spack.spec.CompilerSpec("gcc@=9.4.0") in spack.compilers.all_compiler_specs() + assert any( + compiler.satisfies("gcc@=9.4.0") for compiler in spack.compilers.config.all_compilers() + ) args = spack.util.pattern.Bunch(all=True, compiler_spec="gcc@9.4.0", add_paths=[], scope=None) spack.cmd.compiler.compiler_remove(args) - assert spack.spec.CompilerSpec("gcc@=9.4.0") not in spack.compilers.all_compiler_specs() + assert not any( + compiler.satisfies("gcc@=9.4.0") for compiler in spack.compilers.config.all_compilers() + ) @pytest.mark.not_on_windows("Cannot execute bash script on Windows") @@ -119,7 +125,7 @@ def test_compiler_add(mutable_config, mock_executable): bin_dir = gcc_path.parent root_dir = bin_dir.parent - compilers_before_find = set(spack.compilers.all_compiler_specs()) + compilers_before_find = set(spack.compilers.config.all_compilers()) args = spack.util.pattern.Bunch( all=None, compiler_spec=None, @@ -129,7 +135,7 @@ def test_compiler_add(mutable_config, mock_executable): jobs=1, ) spack.cmd.compiler.compiler_find(args) - compilers_after_find = set(spack.compilers.all_compiler_specs()) + compilers_after_find = set(spack.compilers.config.all_compilers()) compilers_added_by_find = compilers_after_find - compilers_before_find assert len(compilers_added_by_find) == 1 @@ -139,45 +145,7 @@ def test_compiler_add(mutable_config, mock_executable): @pytest.mark.not_on_windows("Cannot execute bash script on Windows") @pytest.mark.regression("17590") -@pytest.mark.parametrize("mixed_toolchain", [True, False]) -def test_compiler_find_mixed_suffixes( - mixed_toolchain, no_compilers_yaml, working_env, compilers_dir -): - """Ensure that we'll mix compilers with different suffixes when necessary.""" - os.environ["PATH"] = str(compilers_dir) - output = compiler( - "find", "--scope=site", "--mixed-toolchain" if mixed_toolchain else "--no-mixed-toolchain" - ) - - assert "clang@11.0.0" in output - assert "gcc@8.4.0" in output - - config = spack.compilers.get_compiler_config( - no_compilers_yaml, scope="site", init_config=False - ) - clang = next(c["compiler"] for c in config if c["compiler"]["spec"] == "clang@=11.0.0") - gcc = next(c["compiler"] for c in config if c["compiler"]["spec"] == "gcc@=8.4.0") - - gfortran_path = str(compilers_dir / "gfortran-8") - - assert clang["paths"] == { - "cc": str(compilers_dir / "clang"), - "cxx": str(compilers_dir / "clang++"), - "f77": gfortran_path if mixed_toolchain else None, - "fc": gfortran_path if mixed_toolchain else None, - } - - assert gcc["paths"] == { - "cc": str(compilers_dir / "gcc-8"), - "cxx": str(compilers_dir / "g++-8"), - "f77": gfortran_path, - "fc": gfortran_path, - } - - -@pytest.mark.not_on_windows("Cannot execute bash script on Windows") -@pytest.mark.regression("17590") -def test_compiler_find_prefer_no_suffix(no_compilers_yaml, working_env, compilers_dir): +def test_compiler_find_prefer_no_suffix(no_packages_yaml, working_env, compilers_dir): """Ensure that we'll pick 'clang' over 'clang-gpu' when there is a choice.""" clang_path = compilers_dir / "clang" shutil.copy(clang_path, clang_path.parent / "clang-gpu") @@ -186,20 +154,19 @@ def test_compiler_find_prefer_no_suffix(no_compilers_yaml, working_env, compiler os.environ["PATH"] = str(compilers_dir) output = compiler("find", "--scope=site") - assert "clang@11.0.0" in output + assert "llvm@11.0.0" in output assert "gcc@8.4.0" in output - config = spack.compilers.get_compiler_config( - no_compilers_yaml, scope="site", init_config=False - ) - clang = next(c["compiler"] for c in config if c["compiler"]["spec"] == "clang@=11.0.0") + compilers = spack.compilers.config.all_compilers_from(no_packages_yaml, scope="site") + clang = [x for x in compilers if x.satisfies("llvm@11")] - assert clang["paths"]["cc"] == str(compilers_dir / "clang") - assert clang["paths"]["cxx"] == str(compilers_dir / "clang++") + assert len(clang) == 1 + assert clang[0].extra_attributes["compilers"]["c"] == str(compilers_dir / "clang") + assert clang[0].extra_attributes["compilers"]["cxx"] == str(compilers_dir / "clang++") @pytest.mark.not_on_windows("Cannot execute bash script on Windows") -def test_compiler_find_path_order(no_compilers_yaml, working_env, compilers_dir): +def test_compiler_find_path_order(no_packages_yaml, working_env, compilers_dir): """Ensure that we look for compilers in the same order as PATH, when there are duplicates""" new_dir = compilers_dir / "first_in_path" new_dir.mkdir() @@ -210,19 +177,19 @@ def test_compiler_find_path_order(no_compilers_yaml, working_env, compilers_dir) compiler("find", "--scope=site") - config = spack.compilers.get_compiler_config( - no_compilers_yaml, scope="site", init_config=False - ) - gcc = next(c["compiler"] for c in config if c["compiler"]["spec"] == "gcc@=8.4.0") - assert gcc["paths"] == { - "cc": str(new_dir / "gcc-8"), + compilers = spack.compilers.config.all_compilers(scope="site") + gcc = [x for x in compilers if x.satisfies("gcc@8.4")] + + # Ensure we found both duplicates + assert len(gcc) == 2 + assert gcc[0].extra_attributes["compilers"] == { + "c": str(new_dir / "gcc-8"), "cxx": str(new_dir / "g++-8"), - "f77": str(new_dir / "gfortran-8"), - "fc": str(new_dir / "gfortran-8"), + "fortran": str(new_dir / "gfortran-8"), } -def test_compiler_list_empty(no_compilers_yaml, working_env, compilers_dir): +def test_compiler_list_empty(no_packages_yaml, working_env, compilers_dir): """Spack should not automatically search for compilers when listing them and none are available. And when stdout is not a tty like in tests, there should be no output and no error exit code. @@ -250,10 +217,10 @@ def test_compiler_list_empty(no_compilers_yaml, working_env, compilers_dir): "flags": {"fflags": "-ffree-form"}, }, }, - """gcc@7.7.7: -\tpaths: -\t\tcc = /path/to/fake/gcc -\t\tcxx = /path/to/fake/g++ + """gcc@7.7.7 languages=c,cxx,fortran os=foobar target=x86_64: + paths: + cc = /path/to/fake/gcc + cxx = /path/to/fake/g++ \t\tf77 = /path/to/fake/gfortran \t\tfc = /path/to/fake/gfortran \tflags: @@ -265,7 +232,7 @@ def test_compiler_list_empty(no_compilers_yaml, working_env, compilers_dir): ], ) def test_compilers_shows_packages_yaml( - external, expected, no_compilers_yaml, working_env, compilers_dir + external, expected, no_packages_yaml, working_env, compilers_dir ): """Spack should see a single compiler defined from packages.yaml""" external["prefix"] = external["prefix"].format(prefix=os.path.dirname(compilers_dir)) @@ -275,12 +242,5 @@ def test_compilers_shows_packages_yaml( packages["gcc"] = gcc_entry spack.config.set("packages", packages) - out = compiler("list") + out = compiler("list", fail_on_error=True) assert out.count("gcc@7.7.7") == 1 - - out = compiler("info", "gcc@7.7.7") - assert out == expected.format( - compilers_dir=str(compilers_dir), - sep=os.sep, - suffix=".bat" if sys.platform == "win32" else "", - ) diff --git a/lib/spack/spack/test/cmd/dependencies.py b/lib/spack/spack/test/cmd/dependencies.py index e13439eba08..17b33945389 100644 --- a/lib/spack/spack/test/cmd/dependencies.py +++ b/lib/spack/spack/test/cmd/dependencies.py @@ -13,7 +13,7 @@ dependencies = SpackCommand("dependencies") -mpis = [ +MPIS = [ "intel-parallel-studio", "low-priority-provider", "mpich", @@ -21,16 +21,17 @@ "multi-provider-mpi", "zmpi", ] -mpi_deps = ["fake"] +COMPILERS = ["gcc", "llvm"] +MPI_DEPS = ["fake"] @pytest.mark.parametrize( "cli_args,expected", [ - (["mpileaks"], set(["callpath"] + mpis)), + (["mpileaks"], set(["callpath"] + MPIS + COMPILERS)), ( ["--transitive", "mpileaks"], - set(["callpath", "dyninst", "libdwarf", "libelf"] + mpis + mpi_deps), + set(["callpath", "dyninst", "libdwarf", "libelf"] + MPIS + MPI_DEPS + COMPILERS), ), (["--transitive", "--deptype=link,run", "dtbuild1"], {"dtlink2", "dtrun2"}), (["--transitive", "--deptype=build", "dtbuild1"], {"dtbuild2", "dtlink2"}), @@ -49,12 +50,11 @@ def test_direct_installed_dependencies(mock_packages, database): with color_when(False): out = dependencies("--installed", "mpileaks^mpich") - lines = [line for line in out.strip().split("\n") if not line.startswith("--")] - hashes = set([re.split(r"\s+", line)[0] for line in lines]) + root = spack.store.STORE.db.query_one("mpileaks ^mpich") - expected = set( - [spack.store.STORE.db.query_one(s).dag_hash(7) for s in ["mpich", "callpath^mpich"]] - ) + lines = [line for line in out.strip().split("\n") if line and not line.startswith("--")] + hashes = {re.split(r"\s+", line)[0] for line in lines} + expected = {s.dag_hash(7) for s in root.dependencies()} assert expected == hashes @@ -64,14 +64,10 @@ def test_transitive_installed_dependencies(mock_packages, database): with color_when(False): out = dependencies("--installed", "--transitive", "mpileaks^zmpi") - lines = [line for line in out.strip().split("\n") if not line.startswith("--")] - hashes = set([re.split(r"\s+", line)[0] for line in lines]) + root = spack.store.STORE.db.query_one("mpileaks ^zmpi") - expected = set( - [ - spack.store.STORE.db.query_one(s).dag_hash(7) - for s in ["zmpi", "callpath^zmpi", "fake", "dyninst", "libdwarf", "libelf"] - ] - ) + lines = [line for line in out.strip().split("\n") if line and not line.startswith("--")] + hashes = {re.split(r"\s+", line)[0] for line in lines} + expected = {s.dag_hash(7) for s in root.traverse(root=False)} assert expected == hashes diff --git a/lib/spack/spack/test/cmd/diff.py b/lib/spack/spack/test/cmd/diff.py index c077e49af14..b1d2514bb15 100644 --- a/lib/spack/spack/test/cmd/diff.py +++ b/lib/spack/spack/test/cmd/diff.py @@ -223,14 +223,12 @@ def test_load_first(install_mockery, mock_fetch, mock_archive, mock_packages): for dep in ("mpileaks", "callpath", "dyninst", "libelf", "libdwarf", "mpich") ) assert all( - len([diff for diff in result["intersect"] if diff[0] == attr]) == 6 + len([diff for diff in result["intersect"] if diff[0] == attr]) == 8 for attr in ( "version", "node_target", "node_platform", "node_os", - "node_compiler", - "node_compiler_version", "node", "package_hash", "hash", diff --git a/lib/spack/spack/test/cmd/env.py b/lib/spack/spack/test/cmd/env.py index 640efdeef6c..a46824310cf 100644 --- a/lib/spack/spack/test/cmd/env.py +++ b/lib/spack/spack/test/cmd/env.py @@ -4286,7 +4286,7 @@ def test_env_include_packages_url( """Test inclusion of a (GitHub) URL.""" develop_url = "https://github.com/fake/fake/blob/develop/" default_packages = develop_url + "etc/fake/defaults/packages.yaml" - sha256 = "a422e35b3a18869d0611a4137b37314131749ecdc070a7cd7183f488da81201a" + sha256 = "8b69d9c6e983dfb8bac2ddc3910a86265cffdd9c85f905c716d426ec5b0d9847" spack_yaml = tmpdir.join("spack.yaml") with spack_yaml.open("w") as f: f.write( diff --git a/lib/spack/spack/test/cmd/find.py b/lib/spack/spack/test/cmd/find.py index a2cf28f75a0..5c543b15f65 100644 --- a/lib/spack/spack/test/cmd/find.py +++ b/lib/spack/spack/test/cmd/find.py @@ -170,7 +170,7 @@ def _check_json_output(spec_list): def _check_json_output_deps(spec_list): - assert len(spec_list) == 13 + assert len(spec_list) == 16 names = [spec["name"] for spec in spec_list] assert names.count("mpileaks") == 3 @@ -272,6 +272,9 @@ def test_find_format_deps(database, config): dyninst-8.2 libdwarf-20130729 libelf-0.8.13 + compiler-wrapper-1.0 + gcc-10.2.1 + gcc-runtime-10.2.1 zmpi-1.0 fake-1.0 @@ -282,24 +285,22 @@ def test_find_format_deps(database, config): @pytest.mark.db def test_find_format_deps_paths(database, config): output = find("-dp", "--format", "{name}-{version}", "mpileaks", "^zmpi") - - spec = spack.concretize.concretize_one("mpileaks ^zmpi") - prefixes = [s.prefix for s in spec.traverse()] - + mpileaks = spack.concretize.concretize_one("mpileaks ^zmpi") assert ( output - == """\ -mpileaks-2.3 {0} - callpath-1.0 {1} - dyninst-8.2 {2} - libdwarf-20130729 {3} - libelf-0.8.13 {4} - zmpi-1.0 {5} - fake-1.0 {6} + == f"""\ +mpileaks-2.3 {mpileaks.prefix} + callpath-1.0 {mpileaks['callpath'].prefix} + dyninst-8.2 {mpileaks['dyninst'].prefix} + libdwarf-20130729 {mpileaks['libdwarf'].prefix} + libelf-0.8.13 {mpileaks['libelf'].prefix} + compiler-wrapper-1.0 {mpileaks['compiler-wrapper'].prefix} + gcc-10.2.1 {mpileaks['gcc'].prefix} + gcc-runtime-10.2.1 {mpileaks['gcc-runtime'].prefix} + zmpi-1.0 {mpileaks['zmpi'].prefix} + fake-1.0 {mpileaks['fake'].prefix} -""".format( - *prefixes - ) +""" ) @@ -317,12 +318,6 @@ def test_find_very_long(database, config): ) -@pytest.mark.db -def test_find_show_compiler(database, config): - output = find("--no-groups", "--show-full-compiler", "mpileaks") - assert "mpileaks@2.3 %gcc@10.2.1" in output - - @pytest.mark.db def test_find_not_found(database, config, capsys): with capsys.disabled(): @@ -464,7 +459,7 @@ def test_environment_with_version_range_in_compiler_doesnt_fail(tmp_path): with test_environment: output = find() - assert "zlib %gcc@12.1.0" in output + assert "zlib" in output _pkga = ( diff --git a/lib/spack/spack/test/cmd/gc.py b/lib/spack/spack/test/cmd/gc.py index 24131b311c9..648b9a62e3d 100644 --- a/lib/spack/spack/test/cmd/gc.py +++ b/lib/spack/spack/test/cmd/gc.py @@ -21,7 +21,8 @@ @pytest.mark.db def test_gc_without_build_dependency(mutable_database): assert "There are no unused specs." in gc("-yb") - assert "There are no unused specs." in gc("-y") + # 'gcc' is a pure build dependency in the DB + assert "There are no unused specs." not in gc("-y") @pytest.mark.db @@ -60,7 +61,7 @@ def test_gc_with_environment(mutable_database, mutable_mock_env_path): add("cmake") install() assert mutable_database.query_local("cmake") - output = gc("-y") + output = gc("-by") assert "Restricting garbage collection" in output assert "There are no unused specs" in output diff --git a/lib/spack/spack/test/cmd/install.py b/lib/spack/spack/test/cmd/install.py index 533fe369d1c..b13dc952e3e 100644 --- a/lib/spack/spack/test/cmd/install.py +++ b/lib/spack/spack/test/cmd/install.py @@ -54,14 +54,14 @@ def test_install_package_and_dependency( ): log = "test" with tmpdir.as_cwd(): - install("--log-format=junit", "--log-file={0}".format(log), "libdwarf") + install("--fake", "--log-format=junit", f"--log-file={log}", "libdwarf") files = tmpdir.listdir() - filename = tmpdir.join("{0}.xml".format(log)) + filename = tmpdir.join(f"{log}.xml") assert filename in files content = filename.open().read() - assert 'tests="2"' in content + assert 'tests="4"' in content assert 'failures="0"' in content assert 'errors="0"' in content @@ -97,20 +97,20 @@ def test_install_package_already_installed( tmpdir, mock_packages, mock_archive, mock_fetch, install_mockery ): with tmpdir.as_cwd(): - install("libdwarf") - install("--log-format=junit", "--log-file=test.xml", "libdwarf") + install("--fake", "libdwarf") + install("--fake", "--log-format=junit", "--log-file=test.xml", "libdwarf") files = tmpdir.listdir() filename = tmpdir.join("test.xml") assert filename in files content = filename.open().read() - assert 'tests="2"' in content + assert 'tests="5"' in content assert 'failures="0"' in content assert 'errors="0"' in content skipped = [line for line in content.split("\n") if "skipped" in line] - assert len(skipped) == 2 + assert len(skipped) == 5 @pytest.mark.parametrize( @@ -183,8 +183,8 @@ def test_install_with_source(mock_packages, mock_archive, mock_fetch, install_mo def test_install_env_variables(mock_packages, mock_archive, mock_fetch, install_mockery): - spec = spack.concretize.concretize_one("libdwarf") - install("libdwarf") + spec = spack.concretize.concretize_one("pkg-c") + install("pkg-c") assert os.path.isfile(spec.package.install_env_path) @@ -203,10 +203,9 @@ def test_show_log_on_error(mock_packages, mock_archive, mock_fetch, install_mock def test_install_overwrite(mock_packages, mock_archive, mock_fetch, install_mockery): - # Try to install a spec and then to reinstall it. - spec = spack.concretize.concretize_one("libdwarf") - - install("libdwarf") + """Tests installing a spec, and then re-installing it in the same prefix.""" + spec = spack.concretize.concretize_one("pkg-c") + install("pkg-c") # Ignore manifest and install times manifest = os.path.join( @@ -228,7 +227,7 @@ def test_install_overwrite(mock_packages, mock_archive, mock_fetch, install_mock assert bad_md5 != expected_md5 - install("--overwrite", "-y", "libdwarf") + install("--overwrite", "-y", "pkg-c") assert os.path.exists(spec.prefix) assert fs.hash_directory(spec.prefix, ignore=ignores) == expected_md5 @@ -236,12 +235,10 @@ def test_install_overwrite(mock_packages, mock_archive, mock_fetch, install_mock def test_install_overwrite_not_installed(mock_packages, mock_archive, mock_fetch, install_mockery): - # Try to install a spec and then to reinstall it. - spec = spack.concretize.concretize_one("libdwarf") - + """Tests that overwrite doesn't fail if the package is not installed""" + spec = spack.concretize.concretize_one("pkg-c") assert not os.path.exists(spec.prefix) - - install("--overwrite", "-y", "libdwarf") + install("--overwrite", "-y", "pkg-c") assert os.path.exists(spec.prefix) @@ -272,12 +269,10 @@ def test_install_commit(mock_git_version_info, install_mockery, mock_packages, m def test_install_overwrite_multiple(mock_packages, mock_archive, mock_fetch, install_mockery): # Try to install a spec and then to reinstall it. libdwarf = spack.concretize.concretize_one("libdwarf") - - install("libdwarf") - cmake = spack.concretize.concretize_one("cmake") - install("cmake") + install("--fake", "libdwarf") + install("--fake", "cmake") ld_manifest = os.path.join( libdwarf.prefix, @@ -313,7 +308,7 @@ def test_install_overwrite_multiple(mock_packages, mock_archive, mock_fetch, ins assert bad_libdwarf_md5 != expected_libdwarf_md5 assert bad_cmake_md5 != expected_cmake_md5 - install("--overwrite", "-y", "libdwarf", "cmake") + install("--fake", "--overwrite", "-y", "libdwarf", "cmake") assert os.path.exists(libdwarf.prefix) assert os.path.exists(cmake.prefix) @@ -452,16 +447,16 @@ def just_throw(*args, **kwargs): # Only libelf error is reported (through libdwarf root spec). libdwarf # install is skipped and it is not an error. - assert 'tests="1"' in content + assert 'tests="0"' not in content assert 'failures="0"' in content - assert 'errors="1"' in content + assert 'errors="0"' not in content # Nothing should have succeeded assert 'errors="0"' not in content # We want to have both stdout and stderr assert "" in content - assert 'error message="{0}"'.format(msg) in content + assert f'error message="{msg}"' in content @pytest.mark.usefixtures("noop_install", "mock_packages", "config") @@ -548,10 +543,10 @@ def test_cdash_upload_build_error(tmpdir, mock_fetch, install_mockery, capfd): def test_cdash_upload_clean_build(tmpdir, mock_fetch, install_mockery, capfd): # capfd interferes with Spack's capturing of e.g., Build.xml output with capfd.disabled(), tmpdir.as_cwd(): - install("--log-file=cdash_reports", "--log-format=cdash", "pkg-a") + install("--log-file=cdash_reports", "--log-format=cdash", "pkg-c") report_dir = tmpdir.join("cdash_reports") assert report_dir in tmpdir.listdir() - report_file = report_dir.join("pkg-a_Build.xml") + report_file = report_dir.join("Build.xml") assert report_file in report_dir.listdir() content = report_file.open().read() assert "" in content @@ -568,14 +563,14 @@ def test_cdash_upload_extra_params(tmpdir, mock_fetch, install_mockery, capfd): "--cdash-build=my_custom_build", "--cdash-site=my_custom_site", "--cdash-track=my_custom_track", - "pkg-a", + "pkg-c", ) report_dir = tmpdir.join("cdash_reports") assert report_dir in tmpdir.listdir() - report_file = report_dir.join("pkg-a_Build.xml") + report_file = report_dir.join("Build.xml") assert report_file in report_dir.listdir() content = report_file.open().read() - assert 'Site BuildName="my_custom_build - pkg-a"' in content + assert 'Site BuildName="my_custom_build"' in content assert 'Name="my_custom_site"' in content assert "-my_custom_track" in content @@ -585,17 +580,17 @@ def test_cdash_buildstamp_param(tmpdir, mock_fetch, install_mockery, capfd): # capfd interferes with Spack's capture of e.g., Build.xml output with capfd.disabled(), tmpdir.as_cwd(): cdash_track = "some_mocked_track" - buildstamp_format = "%Y%m%d-%H%M-{0}".format(cdash_track) + buildstamp_format = f"%Y%m%d-%H%M-{cdash_track}" buildstamp = time.strftime(buildstamp_format, time.localtime(int(time.time()))) install( "--log-file=cdash_reports", "--log-format=cdash", - "--cdash-buildstamp={0}".format(buildstamp), - "pkg-a", + f"--cdash-buildstamp={buildstamp}", + "pkg-c", ) report_dir = tmpdir.join("cdash_reports") assert report_dir in tmpdir.listdir() - report_file = report_dir.join("pkg-a_Build.xml") + report_file = report_dir.join("Build.xml") assert report_file in report_dir.listdir() content = report_file.open().read() assert buildstamp in content @@ -609,8 +604,7 @@ def test_cdash_install_from_spec_json( with capfd.disabled(), tmpdir.as_cwd(): spec_json_path = str(tmpdir.join("spec.json")) - pkg_spec = spack.concretize.concretize_one("pkg-a") - + pkg_spec = spack.concretize.concretize_one("pkg-c") with open(spec_json_path, "w", encoding="utf-8") as fd: fd.write(pkg_spec.to_json(hash=ht.dag_hash)) @@ -626,7 +620,7 @@ def test_cdash_install_from_spec_json( report_dir = tmpdir.join("cdash_reports") assert report_dir in tmpdir.listdir() - report_file = report_dir.join("pkg-a_Configure.xml") + report_file = report_dir.join("Configure.xml") assert report_file in report_dir.listdir() content = report_file.open().read() install_command_regex = re.compile( @@ -635,7 +629,7 @@ def test_cdash_install_from_spec_json( m = install_command_regex.search(content) assert m install_command = m.group(1) - assert "pkg-a@" in install_command + assert "pkg-c@" in install_command @pytest.mark.disable_clean_stage_check @@ -672,7 +666,7 @@ def test_cache_only_fails(tmpdir, mock_fetch, install_mockery, capfd): with capfd.disabled(): out = install("--cache-only", "libdwarf", fail_on_error=False) - assert "Failed to install libelf" in out + assert "Failed to install gcc-runtime" in out assert "Skipping build of libdwarf" in out assert "was not installed" in out @@ -809,12 +803,12 @@ def test_install_no_add_in_env(tmpdir, mutable_mock_env_path, mock_fetch, instal # Activate the environment with e: # Assert using --no-add with a spec not in the env fails - inst_out = install("--no-add", "boost", fail_on_error=False, output=str) + inst_out = install("--fake", "--no-add", "boost", fail_on_error=False, output=str) assert "You can add specs to the environment with 'spack add " in inst_out # Without --add, ensure that two packages "a" get installed - inst_out = install("pkg-a", output=str) + inst_out = install("--fake", "pkg-a", output=str) assert len([x for x in e.all_specs() if x.installed and x.name == "pkg-a"]) == 2 # Install an unambiguous dependency spec (that already exists as a dep @@ -848,14 +842,14 @@ def test_install_no_add_in_env(tmpdir, mutable_mock_env_path, mock_fetch, instal # root of the environment as well as installed. assert b_spec not in e.roots() - install("--add", "pkg-b") + install("--fake", "--add", "pkg-b") assert b_spec in e.roots() assert b_spec not in e.uninstalled_specs() # Install a novel spec with --add and make sure it is added as a root # and installed. - install("--add", "bowtie") + install("--fake", "--add", "bowtie") assert any([s.name == "bowtie" for s in e.roots()]) assert not any([s.name == "bowtie" for s in e.uninstalled_specs()]) @@ -883,7 +877,7 @@ def test_cdash_auth_token(tmpdir, mock_fetch, install_mockery, monkeypatch, capf # capfd interferes with Spack's capturing with tmpdir.as_cwd(), capfd.disabled(): monkeypatch.setenv("SPACK_CDASH_AUTH_TOKEN", "asdf") - out = install("-v", "--log-file=cdash_reports", "--log-format=cdash", "pkg-a") + out = install("--fake", "-v", "--log-file=cdash_reports", "--log-format=cdash", "pkg-a") assert "Using CDash auth token from environment" in out @@ -944,7 +938,7 @@ def test_install_env_with_tests_all( with ev.read("test"): test_dep = spack.concretize.concretize_one("test-dependency") add("depb") - install("--test", "all") + install("--fake", "--test", "all") assert os.path.exists(test_dep.prefix) @@ -957,7 +951,7 @@ def test_install_env_with_tests_root( with ev.read("test"): test_dep = spack.concretize.concretize_one("test-dependency") add("depb") - install("--test", "root") + install("--fake", "--test", "root") assert not os.path.exists(test_dep.prefix) diff --git a/lib/spack/spack/test/cmd/load.py b/lib/spack/spack/test/cmd/load.py index 125a8ed0325..e0b6e6b06cb 100644 --- a/lib/spack/spack/test/cmd/load.py +++ b/lib/spack/spack/test/cmd/load.py @@ -29,7 +29,7 @@ def test_manpath_trailing_colon( # Test that the commands generated by load add the MANPATH prefix # inspections. Also test that Spack correctly preserves the default/existing # manpath search path via a trailing colon - install("mpileaks") + install("--fake", "mpileaks") sh_out = load(shell, "mpileaks") lines = [line.strip("\n") for line in sh_out.split(commandsep)] @@ -48,7 +48,7 @@ def test_load_recursive(install_mockery, mock_fetch, mock_archive, mock_packages def test_load_shell(shell, set_command): """Test that `spack load` applies prefix inspections of its required runtime deps in topo-order""" - install("mpileaks") + install("--fake", "mpileaks") mpileaks_spec = spack.concretize.concretize_one("mpileaks") # Ensure our reference variable is clean. @@ -117,7 +117,7 @@ def test_load_includes_run_env( """Tests that environment changes from the package's `setup_run_environment` method are added to the user environment in addition to the prefix inspections""" - install("mpileaks") + install("--fake", "mpileaks") shell_out = load(shell, "mpileaks") @@ -127,8 +127,8 @@ def test_load_includes_run_env( def test_load_first(install_mockery, mock_fetch, mock_archive, mock_packages): """Test with and without the --first option""" shell = "--bat" if sys.platform == "win32" else "--sh" - install("libelf@0.8.12") - install("libelf@0.8.13") + install("--fake", "libelf@0.8.12") + install("--fake", "libelf@0.8.13") # Now there are two versions of libelf, which should cause an error out = load(shell, "libelf", fail_on_error=False) @@ -141,7 +141,7 @@ def test_load_first(install_mockery, mock_fetch, mock_archive, mock_packages): def test_load_fails_no_shell(install_mockery, mock_fetch, mock_archive, mock_packages): """Test that spack load prints an error message without a shell.""" - install("mpileaks") + install("--fake", "mpileaks") out = load("mpileaks", fail_on_error=False) assert "To set up shell support" in out @@ -167,7 +167,7 @@ def test_unload( ): """Tests that any variables set in the user environment are undone by the unload command""" - install("mpileaks") + install("--fake", "mpileaks") mpileaks_spec = spack.concretize.concretize_one("mpileaks") # Set so unload has something to do @@ -188,7 +188,7 @@ def test_unload_fails_no_shell( install_mockery, mock_fetch, mock_archive, mock_packages, working_env ): """Test that spack unload prints an error message without a shell.""" - install("mpileaks") + install("--fake", "mpileaks") mpileaks_spec = spack.concretize.concretize_one("mpileaks") os.environ[uenv.spack_loaded_hashes_var] = mpileaks_spec.dag_hash() diff --git a/lib/spack/spack/test/cmd/location.py b/lib/spack/spack/test/cmd/location.py index e37d1ab60da..22218a570f0 100644 --- a/lib/spack/spack/test/cmd/location.py +++ b/lib/spack/spack/test/cmd/location.py @@ -36,8 +36,8 @@ def mock_spec(): def test_location_first(install_mockery, mock_fetch, mock_archive, mock_packages): """Test with and without the --first option""" install = SpackCommand("install") - install("libelf@0.8.12") - install("libelf@0.8.13") + install("--fake", "libelf@0.8.12") + install("--fake", "libelf@0.8.13") # This would normally return an error without --first assert location("--first", "--install-dir", "libelf") diff --git a/lib/spack/spack/test/cmd/logs.py b/lib/spack/spack/test/cmd/logs.py index 274be40c7e6..0f4d48955f2 100644 --- a/lib/spack/spack/test/cmd/logs.py +++ b/lib/spack/spack/test/cmd/logs.py @@ -54,19 +54,19 @@ def disable_capture(capfd): def test_logs_cmd_errors(install_mockery, mock_fetch, mock_archive, mock_packages): - spec = spack.concretize.concretize_one("libelf") + spec = spack.concretize.concretize_one("pkg-c") assert not spec.installed with pytest.raises(spack.main.SpackCommandError, match="is not installed or staged"): - logs("libelf") + logs("pkg-c") with pytest.raises(spack.main.SpackCommandError, match="Too many specs"): - logs("libelf mpi") + logs("pkg-c mpi") - install("libelf") + install("pkg-c") os.remove(spec.package.install_log_path) with pytest.raises(spack.main.SpackCommandError, match="No logs are available"): - logs("libelf") + logs("pkg-c") def _write_string_to_path(string, path): @@ -98,7 +98,7 @@ def test_dump_logs(install_mockery, mock_fetch, mock_archive, mock_packages, dis spack.cmd.logs._logs(cmdline_spec, concrete_spec) assert _rewind_collect_and_decode(redirected_stdout) == stage_log_content - install("libelf") + install("--fake", "libelf") # Sanity check: make sure a path is recorded, regardless of whether # it exists (if it does exist, we will overwrite it with content diff --git a/lib/spack/spack/test/cmd/maintainers.py b/lib/spack/spack/test/cmd/maintainers.py index 03d87dba5a7..88f5f7842e2 100644 --- a/lib/spack/spack/test/cmd/maintainers.py +++ b/lib/spack/spack/test/cmd/maintainers.py @@ -11,7 +11,13 @@ maintainers = spack.main.SpackCommand("maintainers") -MAINTAINED_PACKAGES = ["maintainers-1", "maintainers-2", "maintainers-3", "py-extension1"] +MAINTAINED_PACKAGES = [ + "gcc-runtime", + "maintainers-1", + "maintainers-2", + "maintainers-3", + "py-extension1", +] def split(output): @@ -34,6 +40,8 @@ def test_all(mock_packages, capfd): with capfd.disabled(): out = split(maintainers("--all")) assert out == [ + "gcc-runtime:", + "haampie", "maintainers-1:", "user1,", "user2", @@ -59,6 +67,8 @@ def test_all_by_user(mock_packages, capfd): with capfd.disabled(): out = split(maintainers("--all", "--by-user")) assert out == [ + "haampie:", + "gcc-runtime", "user0:", "maintainers-3", "user1:", diff --git a/lib/spack/spack/test/cmd/mark.py b/lib/spack/spack/test/cmd/mark.py index 8954dbe3c3f..e8aa7ba653b 100644 --- a/lib/spack/spack/test/cmd/mark.py +++ b/lib/spack/spack/test/cmd/mark.py @@ -33,7 +33,7 @@ def test_mark_all_explicit(mutable_database): mark("-e", "-a") gc("-y") all_specs = spack.store.STORE.layout.all_specs() - assert len(all_specs) == 15 + assert len(all_specs) == 17 @pytest.mark.db @@ -50,7 +50,7 @@ def test_mark_one_explicit(mutable_database): uninstall("-y", "-a", "mpileaks") gc("-y") all_specs = spack.store.STORE.layout.all_specs() - assert len(all_specs) == 3 + assert len(all_specs) == 4 @pytest.mark.db @@ -58,7 +58,7 @@ def test_mark_one_implicit(mutable_database): mark("-i", "externaltest") gc("-y") all_specs = spack.store.STORE.layout.all_specs() - assert len(all_specs) == 14 + assert len(all_specs) == 15 @pytest.mark.db @@ -67,4 +67,4 @@ def test_mark_all_implicit_then_explicit(mutable_database): mark("-e", "-a") gc("-y") all_specs = spack.store.STORE.layout.all_specs() - assert len(all_specs) == 15 + assert len(all_specs) == 17 diff --git a/lib/spack/spack/test/cmd/mirror.py b/lib/spack/spack/test/cmd/mirror.py index d75fa30a8d8..a9ede4df73d 100644 --- a/lib/spack/spack/test/cmd/mirror.py +++ b/lib/spack/spack/test/cmd/mirror.py @@ -362,7 +362,7 @@ def test_mirror_destroy( spec_name = "libdwarf" # Put a binary package in a buildcache - install("--no-cache", spec_name) + install("--fake", "--no-cache", spec_name) buildcache("push", "-u", "-f", mirror_dir.strpath, spec_name) contents = os.listdir(mirror_dir.strpath) diff --git a/lib/spack/spack/test/cmd/reindex.py b/lib/spack/spack/test/cmd/reindex.py index 1642b53a91e..523eb91c5e9 100644 --- a/lib/spack/spack/test/cmd/reindex.py +++ b/lib/spack/spack/test/cmd/reindex.py @@ -14,13 +14,10 @@ def test_reindex_basic(mock_packages, mock_archive, mock_fetch, install_mockery): - install("libelf@0.8.13") - install("libelf@0.8.12") - + install("--fake", "libelf@0.8.13") + install("--fake", "libelf@0.8.12") all_installed = spack.store.STORE.db.query() - reindex() - assert spack.store.STORE.db.query() == all_installed @@ -35,23 +32,19 @@ def _clear_db(tmp_path): def test_reindex_db_deleted(mock_packages, mock_archive, mock_fetch, install_mockery, tmp_path): - install("libelf@0.8.13") - install("libelf@0.8.12") - + install("--fake", "libelf@0.8.13") + install("--fake", "libelf@0.8.12") all_installed = spack.store.STORE.db.query() - _clear_db(tmp_path) - reindex() - assert spack.store.STORE.db.query() == all_installed def test_reindex_with_deprecated_packages( mock_packages, mock_archive, mock_fetch, install_mockery, tmp_path ): - install("libelf@0.8.13") - install("libelf@0.8.12") + install("--fake", "libelf@0.8.13") + install("--fake", "libelf@0.8.12") deprecate("-y", "libelf@0.8.12", "libelf@0.8.13") diff --git a/lib/spack/spack/test/cmd/stage.py b/lib/spack/spack/test/cmd/stage.py index b1f85ddbe86..c76dfde63f0 100644 --- a/lib/spack/spack/test/cmd/stage.py +++ b/lib/spack/spack/test/cmd/stage.py @@ -105,7 +105,11 @@ def test_stage_full_env(mutable_mock_env_path, monkeypatch): e.concretize() # list all the package names that should be staged - expected = set(dep.name for dep in spack.traverse.traverse_nodes(e.concrete_roots())) + expected, externals = set(), set() + for dep in spack.traverse.traverse_nodes(e.concrete_roots()): + expected.add(dep.name) + if dep.external: + externals.add(dep.name) # pop the package name from the list instead of actually staging def fake_stage(pkg, mirror_only=False): @@ -116,8 +120,7 @@ def fake_stage(pkg, mirror_only=False): with e: stage() - # assert that all were staged - assert len(expected) == 0 + assert expected == externals @pytest.mark.disable_clean_stage_check diff --git a/lib/spack/spack/test/cmd/test.py b/lib/spack/spack/test/cmd/test.py index 38abd1adf51..4bf4d1736a9 100644 --- a/lib/spack/spack/test/cmd/test.py +++ b/lib/spack/spack/test/cmd/test.py @@ -51,7 +51,7 @@ def test_test_dup_alias( mock_test_stage, mock_packages, mock_archive, mock_fetch, install_mockery, capfd ): """Ensure re-using an alias fails with suggestion to change.""" - install("libdwarf") + install("--fake", "libdwarf") # Run the (no) tests with the alias once spack_test("run", "--alias", "libdwarf", "libdwarf") diff --git a/lib/spack/spack/test/cmd/uninstall.py b/lib/spack/spack/test/cmd/uninstall.py index 6021f1d93fb..1c48e9504f5 100644 --- a/lib/spack/spack/test/cmd/uninstall.py +++ b/lib/spack/spack/test/cmd/uninstall.py @@ -80,9 +80,8 @@ def test_recursive_uninstall(mutable_database): """Test recursive uninstall.""" uninstall("-y", "-a", "--dependents", "callpath") - all_specs = spack.store.STORE.layout.all_specs() - assert len(all_specs) == 9 # query specs with multiple configurations + all_specs = spack.store.STORE.layout.all_specs() mpileaks_specs = [s for s in all_specs if s.satisfies("mpileaks")] callpath_specs = [s for s in all_specs if s.satisfies("callpath")] mpi_specs = [s for s in all_specs if s.satisfies("mpi")] @@ -94,23 +93,21 @@ def test_recursive_uninstall(mutable_database): @pytest.mark.db @pytest.mark.regression("3690") -@pytest.mark.parametrize("constraint,expected_number_of_specs", [("dyninst", 8), ("libelf", 6)]) +@pytest.mark.parametrize("constraint,expected_number_of_specs", [("dyninst", 10), ("libelf", 8)]) def test_uninstall_spec_with_multiple_roots( constraint, expected_number_of_specs, mutable_database ): uninstall("-y", "-a", "--dependents", constraint) - all_specs = spack.store.STORE.layout.all_specs() assert len(all_specs) == expected_number_of_specs @pytest.mark.db -@pytest.mark.parametrize("constraint,expected_number_of_specs", [("dyninst", 14), ("libelf", 14)]) +@pytest.mark.parametrize("constraint,expected_number_of_specs", [("dyninst", 16), ("libelf", 16)]) def test_force_uninstall_spec_with_ref_count_not_zero( constraint, expected_number_of_specs, mutable_database ): uninstall("-f", "-y", constraint) - all_specs = spack.store.STORE.layout.all_specs() assert len(all_specs) == expected_number_of_specs @@ -176,7 +173,7 @@ def db_specs(): all_specs, mpileaks_specs, callpath_specs, mpi_specs = db_specs() total_specs = len(all_specs) - assert total_specs == 14 + assert total_specs == 16 assert len(mpileaks_specs) == 3 assert len(callpath_specs) == 2 assert len(mpi_specs) == 3 diff --git a/lib/spack/spack/test/cmd/verify.py b/lib/spack/spack/test/cmd/verify.py index 9143efdd9ce..64f1397016b 100644 --- a/lib/spack/spack/test/cmd/verify.py +++ b/lib/spack/spack/test/cmd/verify.py @@ -75,7 +75,7 @@ def test_single_file_verify_cmd(tmpdir): def test_single_spec_verify_cmd(tmpdir, mock_packages, mock_archive, mock_fetch, install_mockery): # Test the verify command interface to verify a single spec - install("libelf") + install("--fake", "libelf") s = spack.concretize.concretize_one("libelf") prefix = s.prefix hash = s.dag_hash() @@ -102,8 +102,7 @@ def test_single_spec_verify_cmd(tmpdir, mock_packages, mock_archive, mock_fetch, def test_libraries(tmp_path, install_mockery, mock_fetch): gcc = spack.util.executable.which("gcc", required=True) s = spack.concretize.concretize_one("libelf") - spack.installer.PackageInstaller([s.package]).install() - os.mkdir(s.prefix.bin) + spack.installer.PackageInstaller([s.package], fake=True).install() # There are no ELF files so the verification should pass verify("libraries", f"/{s.dag_hash()}") diff --git a/lib/spack/spack/test/cmd/view.py b/lib/spack/spack/test/cmd/view.py index 1ff3556a871..b5f8ab92fc1 100644 --- a/lib/spack/spack/test/cmd/view.py +++ b/lib/spack/spack/test/cmd/view.py @@ -30,26 +30,26 @@ commands = ["hardlink", "symlink", "hard", "add", "copy", "relocate"] -def create_projection_file(tmpdir, projection): +def create_projection_file(tmp_path, projection): if "projections" not in projection: projection = {"projections": projection} - - projection_file = tmpdir.mkdir("projection").join("projection.yaml") - projection_file.write(s_yaml.dump(projection)) + projection_file = tmp_path / "projection" / "projection.yaml" + projection_file.parent.mkdir(parents=True, exist_ok=True) + projection_file.write_text(s_yaml.dump(projection)) return projection_file @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))) - view(cmd, viewpath, "libdwarf") - package_prefix = os.path.join(viewpath, "libdwarf") - assert os.path.exists(package_prefix) +def test_view_link_type(tmp_path, mock_packages, mock_archive, mock_fetch, install_mockery, cmd): + install("--fake", "libdwarf") + view_dir = tmp_path / f"view_{cmd}" + view(cmd, str(view_dir), "libdwarf") + package_bin = view_dir / "bin" / "libdwarf" + assert package_bin.exists() # Check that we use symlinks for and only for the appropriate subcommands is_link_cmd = cmd in ("symlink", "add") - assert os.path.islink(package_prefix) == is_link_cmd + assert os.path.islink(str(package_bin)) == is_link_cmd @pytest.mark.parametrize("add_cmd", commands) @@ -67,60 +67,60 @@ def test_view_link_type_remove( @pytest.mark.parametrize("cmd", commands) -def test_view_projections(tmpdir, mock_packages, mock_archive, mock_fetch, install_mockery, cmd): - install("libdwarf@20130207") +def test_view_projections(tmp_path, mock_packages, mock_archive, mock_fetch, install_mockery, cmd): + install("--fake", "libdwarf@20130207") + view_dir = tmp_path / f"view_{cmd}" - viewpath = str(tmpdir.mkdir("view_{0}".format(cmd))) view_projection = {"projections": {"all": "{name}-{version}"}} - projection_file = create_projection_file(tmpdir, view_projection) - view(cmd, viewpath, "--projection-file={0}".format(projection_file), "libdwarf") + projection_file = create_projection_file(tmp_path, view_projection) + view(cmd, str(view_dir), f"--projection-file={projection_file}", "libdwarf") - package_prefix = os.path.join(viewpath, "libdwarf-20130207/libdwarf") - assert os.path.exists(package_prefix) + package_bin = view_dir / "libdwarf-20130207" / "bin" / "libdwarf" + assert package_bin.exists() # Check that we use symlinks for and only for the appropriate subcommands is_symlink_cmd = cmd in ("symlink", "add") - assert os.path.islink(package_prefix) == is_symlink_cmd + assert package_bin.is_symlink() == is_symlink_cmd def test_view_multiple_projections( - tmpdir, mock_packages, mock_archive, mock_fetch, install_mockery + tmp_path, mock_packages, mock_archive, mock_fetch, install_mockery ): - install("libdwarf@20130207") - install("extendee@1.0%gcc") + install("--fake", "libdwarf@20130207") + install("--fake", "extendee@1.0") + view_dir = tmp_path / "view" - viewpath = str(tmpdir.mkdir("view")) view_projection = s_yaml.syaml_dict( - [("extendee", "{name}-{compiler.name}"), ("all", "{name}-{version}")] + [("extendee", "{name}-{architecture.platform}"), ("all", "{name}-{version}")] ) - projection_file = create_projection_file(tmpdir, view_projection) - view("add", viewpath, "--projection-file={0}".format(projection_file), "libdwarf", "extendee") + projection_file = create_projection_file(tmp_path, view_projection) + view("add", str(view_dir), f"--projection-file={projection_file}", "libdwarf", "extendee") - libdwarf_prefix = os.path.join(viewpath, "libdwarf-20130207/libdwarf") - extendee_prefix = os.path.join(viewpath, "extendee-gcc/bin") - assert os.path.exists(libdwarf_prefix) - assert os.path.exists(extendee_prefix) + libdwarf_prefix = view_dir / "libdwarf-20130207" / "bin" + extendee_prefix = view_dir / "extendee-test" / "bin" + assert libdwarf_prefix.exists() + assert extendee_prefix.exists() def test_view_multiple_projections_all_first( - tmpdir, mock_packages, mock_archive, mock_fetch, install_mockery + tmp_path, mock_packages, mock_archive, mock_fetch, install_mockery ): - install("libdwarf@20130207") - install("extendee@1.0%gcc") + install("--fake", "libdwarf@20130207") + install("--fake", "extendee@1.0") + view_dir = tmp_path / "view" - viewpath = str(tmpdir.mkdir("view")) view_projection = s_yaml.syaml_dict( - [("all", "{name}-{version}"), ("extendee", "{name}-{compiler.name}")] + [("all", "{name}-{version}"), ("extendee", "{name}-{architecture.platform}")] ) - projection_file = create_projection_file(tmpdir, view_projection) - view("add", viewpath, "--projection-file={0}".format(projection_file), "libdwarf", "extendee") + projection_file = create_projection_file(tmp_path, view_projection) + view("add", str(view_dir), f"--projection-file={projection_file}", "libdwarf", "extendee") - libdwarf_prefix = os.path.join(viewpath, "libdwarf-20130207/libdwarf") - extendee_prefix = os.path.join(viewpath, "extendee-gcc/bin") - assert os.path.exists(libdwarf_prefix) - assert os.path.exists(extendee_prefix) + libdwarf_prefix = view_dir / "libdwarf-20130207" / "bin" + extendee_prefix = view_dir / "extendee-test" / "bin" + assert libdwarf_prefix.exists() + assert extendee_prefix.exists() def test_view_external(tmpdir, mock_packages, mock_archive, mock_fetch, install_mockery): diff --git a/lib/spack/spack/test/compilers/__init__.py b/lib/spack/spack/test/compilers/__init__.py deleted file mode 100644 index c4ecc87fb8a..00000000000 --- a/lib/spack/spack/test/compilers/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# Copyright Spack Project Developers. See COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) diff --git a/lib/spack/spack/test/compilers/basics.py b/lib/spack/spack/test/compilers/basics.py deleted file mode 100644 index 65bd082f7cd..00000000000 --- a/lib/spack/spack/test/compilers/basics.py +++ /dev/null @@ -1,940 +0,0 @@ -# Copyright Spack Project Developers. See COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) -"""Test basic behavior of compilers in Spack""" -import json -import os -from copy import copy -from typing import Optional - -import pytest - -import llnl.util.filesystem as fs - -import spack.compiler -import spack.compilers -import spack.config -import spack.spec -import spack.util.module_cmd -from spack.compiler import Compiler -from spack.util.executable import Executable, ProcessError -from spack.util.file_cache import FileCache - - -def test_multiple_conflicting_compiler_definitions(mutable_config): - compiler_def = { - "compiler": { - "flags": {}, - "modules": [], - "paths": {"cc": "cc", "cxx": "cxx", "f77": "null", "fc": "null"}, - "extra_rpaths": [], - "operating_system": "test", - "target": "test", - "environment": {}, - "spec": "clang@0.0.0", - } - } - - compiler_config = [compiler_def, compiler_def] - compiler_config[0]["compiler"]["paths"]["f77"] = "f77" - mutable_config.update_config("compilers", compiler_config) - - arch_spec = spack.spec.ArchSpec(("test", "test", "test")) - cmp = spack.compilers.compiler_for_spec("clang@=0.0.0", arch_spec) - assert cmp.f77 == "f77" - - -def test_compiler_flags_from_config_are_grouped(): - compiler_entry = { - "spec": "intel@17.0.2", - "operating_system": "foo-os", - "paths": {"cc": "cc-path", "cxx": "cxx-path", "fc": None, "f77": None}, - "flags": {"cflags": "-O0 -foo-flag foo-val"}, - "modules": None, - } - - compiler = spack.compilers.compiler_from_dict(compiler_entry) - assert any(x == "-foo-flag foo-val" for x in compiler.flags["cflags"]) - - -# Test behavior of flags and UnsupportedCompilerFlag. - -# Utility function to test most flags. -default_compiler_entry = { - "spec": "apple-clang@2.0.0", - "operating_system": "foo-os", - "paths": {"cc": "cc-path", "cxx": "cxx-path", "fc": "fc-path", "f77": "f77-path"}, - "flags": {}, - "modules": None, -} - - -# Fake up a mock compiler where everything is defaulted. -class MockCompiler(Compiler): - def __init__(self): - super().__init__( - cspec="badcompiler@1.0.0", - operating_system=default_compiler_entry["operating_system"], - target=None, - paths=[ - default_compiler_entry["paths"]["cc"], - default_compiler_entry["paths"]["cxx"], - default_compiler_entry["paths"]["fc"], - default_compiler_entry["paths"]["f77"], - ], - environment={}, - ) - - @property - def name(self): - return "mockcompiler" - - @property - def version(self): - return "1.0.0" - - _verbose_flag = "--verbose" - - @property - def verbose_flag(self): - return self._verbose_flag - - required_libs = ["libgfortran"] - - -@pytest.mark.not_on_windows("Not supported on Windows (yet)") -def test_implicit_rpaths(dirs_with_libfiles, monkeypatch): - lib_to_dirs, all_dirs = dirs_with_libfiles - monkeypatch.setattr( - MockCompiler, - "_compile_dummy_c_source", - lambda self: "ld " + " ".join(f"-L{d}" for d in all_dirs), - ) - retrieved_rpaths = MockCompiler().implicit_rpaths() - assert set(retrieved_rpaths) == set(lib_to_dirs["libstdc++"] + lib_to_dirs["libgfortran"]) - - -without_flag_output = "ld -L/path/to/first/lib -L/path/to/second/lib64" -with_flag_output = "ld -L/path/to/first/with/flag/lib -L/path/to/second/lib64" - - -def call_compiler(exe, *args, **kwargs): - # This method can replace Executable.__call__ to emulate a compiler that - # changes libraries depending on a flag. - if "--correct-flag" in exe.exe: - return with_flag_output - return without_flag_output - - -@pytest.mark.not_on_windows("Not supported on Windows (yet)") -@pytest.mark.parametrize( - "exe,flagname", - [ - ("cxx", "cxxflags"), - ("cxx", "cppflags"), - ("cxx", "ldflags"), - ("cc", "cflags"), - ("cc", "cppflags"), - ], -) -@pytest.mark.enable_compiler_execution -def test_compile_dummy_c_source_adds_flags(monkeypatch, exe, flagname): - # create fake compiler that emits mock verbose output - compiler = MockCompiler() - monkeypatch.setattr(Executable, "__call__", call_compiler) - - if exe == "cxx": - compiler.cc = None - compiler.fc = None - compiler.f77 = None - elif exe == "cc": - compiler.cxx = None - compiler.fc = None - compiler.f77 = None - else: - assert False - - # Test without flags - assert compiler._compile_dummy_c_source() == without_flag_output - - if flagname: - # set flags and test - compiler.flags = {flagname: ["--correct-flag"]} - assert compiler._compile_dummy_c_source() == with_flag_output - - -@pytest.mark.enable_compiler_execution -def test_compile_dummy_c_source_no_path(): - compiler = MockCompiler() - compiler.cc = None - compiler.cxx = None - assert compiler._compile_dummy_c_source() is None - - -@pytest.mark.enable_compiler_execution -def test_compile_dummy_c_source_no_verbose_flag(): - compiler = MockCompiler() - compiler._verbose_flag = None - assert compiler._compile_dummy_c_source() is None - - -@pytest.mark.not_on_windows("Not supported on Windows (yet)") -@pytest.mark.enable_compiler_execution -def test_compile_dummy_c_source_load_env(working_env, monkeypatch, tmpdir): - gcc = str(tmpdir.join("gcc")) - with open(gcc, "w", encoding="utf-8") as f: - f.write( - f"""#!/bin/sh -if [ "$ENV_SET" = "1" ] && [ "$MODULE_LOADED" = "1" ]; then - printf '{without_flag_output}' -fi -""" - ) - fs.set_executable(gcc) - - # Set module load to turn compiler on - def module(*args): - if args[0] == "show": - return "" - elif args[0] == "load": - os.environ["MODULE_LOADED"] = "1" - - monkeypatch.setattr(spack.util.module_cmd, "module", module) - - compiler = MockCompiler() - compiler.cc = gcc - compiler.environment = {"set": {"ENV_SET": "1"}} - compiler.modules = ["turn_on"] - - assert compiler._compile_dummy_c_source() == without_flag_output - - -# Get the desired flag from the specified compiler spec. -def flag_value(flag, spec): - compiler = None - if spec is None: - compiler = MockCompiler() - else: - compiler_entry = copy(default_compiler_entry) - compiler_entry["spec"] = spec - compiler = spack.compilers.compiler_from_dict(compiler_entry) - - return getattr(compiler, flag) - - -# Utility function to verify that the expected exception is thrown for -# an unsupported flag. -def unsupported_flag_test(flag, spec=None): - caught_exception = None - try: - flag_value(flag, spec) - except spack.compiler.UnsupportedCompilerFlag: - caught_exception = True - - assert caught_exception and "Expected exception not thrown." - - -# Verify the expected flag value for the give compiler spec. -def supported_flag_test(flag, flag_value_ref, spec=None): - assert flag_value(flag, spec) == flag_value_ref - - -# Tests for UnsupportedCompilerFlag exceptions from default -# implementations of flags. -def test_default_flags(): - supported_flag_test("cc_rpath_arg", "-Wl,-rpath,") - supported_flag_test("cxx_rpath_arg", "-Wl,-rpath,") - supported_flag_test("f77_rpath_arg", "-Wl,-rpath,") - supported_flag_test("fc_rpath_arg", "-Wl,-rpath,") - supported_flag_test("linker_arg", "-Wl,") - unsupported_flag_test("openmp_flag") - unsupported_flag_test("cxx11_flag") - unsupported_flag_test("cxx14_flag") - unsupported_flag_test("cxx17_flag") - supported_flag_test("cxx98_flag", "") - unsupported_flag_test("c99_flag") - unsupported_flag_test("c11_flag") - supported_flag_test("cc_pic_flag", "-fPIC") - supported_flag_test("cxx_pic_flag", "-fPIC") - supported_flag_test("f77_pic_flag", "-fPIC") - supported_flag_test("fc_pic_flag", "-fPIC") - supported_flag_test("debug_flags", ["-g"]) - supported_flag_test("opt_flags", ["-O", "-O0", "-O1", "-O2", "-O3"]) - - -# Verify behavior of particular compiler definitions. -def test_arm_flags(): - supported_flag_test("openmp_flag", "-fopenmp", "arm@1.0") - supported_flag_test("cxx11_flag", "-std=c++11", "arm@1.0") - supported_flag_test("cxx14_flag", "-std=c++14", "arm@1.0") - supported_flag_test("cxx17_flag", "-std=c++1z", "arm@1.0") - supported_flag_test("c99_flag", "-std=c99", "arm@1.0") - supported_flag_test("c11_flag", "-std=c11", "arm@1.0") - supported_flag_test("cc_pic_flag", "-fPIC", "arm@1.0") - supported_flag_test("cxx_pic_flag", "-fPIC", "arm@1.0") - supported_flag_test("f77_pic_flag", "-fPIC", "arm@1.0") - supported_flag_test("fc_pic_flag", "-fPIC", "arm@1.0") - supported_flag_test("opt_flags", ["-O", "-O0", "-O1", "-O2", "-O3", "-Ofast"], "arm@1.0") - - -def test_cce_flags(): - supported_flag_test("version_argument", "--version", "cce@9.0.1") - supported_flag_test("version_argument", "-V", "cce@9.0.1-classic") - supported_flag_test("openmp_flag", "-fopenmp", "cce@9.0.1") - supported_flag_test("openmp_flag", "-h omp", "cce@9.0.1-classic") - supported_flag_test("openmp_flag", "-h omp", "cce@1.0") - supported_flag_test("cxx11_flag", "-std=c++11", "cce@9.0.1") - supported_flag_test("cxx11_flag", "-h std=c++11", "cce@9.0.1-classic") - supported_flag_test("cxx11_flag", "-h std=c++11", "cce@1.0") - unsupported_flag_test("c99_flag", "cce@8.0") - supported_flag_test("c99_flag", "-std=c99", "cce@9.0.1") - supported_flag_test("c99_flag", "-h c99,noconform,gnu", "cce@8.1") - supported_flag_test("c99_flag", "-h std=c99,noconform,gnu", "cce@8.4") - unsupported_flag_test("c11_flag", "cce@8.4") - supported_flag_test("c11_flag", "-std=c11", "cce@9.0.1") - supported_flag_test("c11_flag", "-h std=c11,noconform,gnu", "cce@8.5") - supported_flag_test("cc_pic_flag", "-h PIC", "cce@1.0") - supported_flag_test("cxx_pic_flag", "-h PIC", "cce@1.0") - supported_flag_test("f77_pic_flag", "-h PIC", "cce@1.0") - supported_flag_test("fc_pic_flag", "-h PIC", "cce@1.0") - supported_flag_test("cc_pic_flag", "-fPIC", "cce@9.1.0") - supported_flag_test("cxx_pic_flag", "-fPIC", "cce@9.1.0") - supported_flag_test("f77_pic_flag", "-fPIC", "cce@9.1.0") - supported_flag_test("fc_pic_flag", "-fPIC", "cce@9.1.0") - supported_flag_test("stdcxx_libs", (), "cce@1.0") - supported_flag_test("debug_flags", ["-g", "-G0", "-G1", "-G2", "-Gfast"], "cce@1.0") - - -def test_apple_clang_flags(): - supported_flag_test("openmp_flag", "-Xpreprocessor -fopenmp", "apple-clang@2.0.0") - unsupported_flag_test("cxx11_flag", "apple-clang@2.0.0") - supported_flag_test("cxx11_flag", "-std=c++11", "apple-clang@4.0.0") - unsupported_flag_test("cxx14_flag", "apple-clang@5.0.0") - supported_flag_test("cxx14_flag", "-std=c++1y", "apple-clang@5.1.0") - supported_flag_test("cxx14_flag", "-std=c++14", "apple-clang@6.1.0") - unsupported_flag_test("cxx17_flag", "apple-clang@6.0.0") - supported_flag_test("cxx17_flag", "-std=c++1z", "apple-clang@6.1.0") - supported_flag_test("c99_flag", "-std=c99", "apple-clang@6.1.0") - unsupported_flag_test("c11_flag", "apple-clang@3.0.0") - supported_flag_test("c11_flag", "-std=c11", "apple-clang@6.1.0") - supported_flag_test("cc_pic_flag", "-fPIC", "apple-clang@2.0.0") - supported_flag_test("cxx_pic_flag", "-fPIC", "apple-clang@2.0.0") - supported_flag_test("f77_pic_flag", "-fPIC", "apple-clang@2.0.0") - supported_flag_test("fc_pic_flag", "-fPIC", "apple-clang@2.0.0") - - -def test_clang_flags(): - supported_flag_test("version_argument", "--version", "clang@foo.bar") - supported_flag_test("openmp_flag", "-fopenmp", "clang@3.3") - unsupported_flag_test("cxx11_flag", "clang@3.2") - supported_flag_test("cxx11_flag", "-std=c++11", "clang@3.3") - unsupported_flag_test("cxx14_flag", "clang@3.3") - supported_flag_test("cxx14_flag", "-std=c++1y", "clang@3.4") - supported_flag_test("cxx14_flag", "-std=c++14", "clang@3.5") - unsupported_flag_test("cxx17_flag", "clang@3.4") - supported_flag_test("cxx17_flag", "-std=c++1z", "clang@3.5") - supported_flag_test("cxx17_flag", "-std=c++17", "clang@5.0") - unsupported_flag_test("cxx20_flag", "clang@4.0") - supported_flag_test("cxx20_flag", "-std=c++2a", "clang@5.0") - supported_flag_test("cxx20_flag", "-std=c++20", "clang@11.0") - unsupported_flag_test("cxx23_flag", "clang@11.0") - supported_flag_test("cxx23_flag", "-std=c++2b", "clang@12.0") - supported_flag_test("cxx23_flag", "-std=c++23", "clang@17.0") - supported_flag_test("c99_flag", "-std=c99", "clang@3.3") - unsupported_flag_test("c11_flag", "clang@2.0") - supported_flag_test("c11_flag", "-std=c11", "clang@6.1.0") - unsupported_flag_test("c23_flag", "clang@8.0") - supported_flag_test("c23_flag", "-std=c2x", "clang@9.0") - supported_flag_test("c23_flag", "-std=c23", "clang@18.0") - supported_flag_test("cc_pic_flag", "-fPIC", "clang@3.3") - supported_flag_test("cxx_pic_flag", "-fPIC", "clang@3.3") - supported_flag_test("f77_pic_flag", "-fPIC", "clang@3.3") - supported_flag_test("fc_pic_flag", "-fPIC", "clang@3.3") - supported_flag_test( - "debug_flags", - [ - "-gcodeview", - "-gdwarf-2", - "-gdwarf-3", - "-gdwarf-4", - "-gdwarf-5", - "-gline-tables-only", - "-gmodules", - "-g", - ], - "clang@3.3", - ) - supported_flag_test( - "opt_flags", - ["-O0", "-O1", "-O2", "-O3", "-Ofast", "-Os", "-Oz", "-Og", "-O", "-O4"], - "clang@3.3", - ) - - -def test_aocc_flags(): - supported_flag_test( - "debug_flags", - [ - "-gcodeview", - "-gdwarf-2", - "-gdwarf-3", - "-gdwarf-4", - "-gdwarf-5", - "-gline-tables-only", - "-gmodules", - "-g", - ], - "aocc@2.2.0", - ) - supported_flag_test( - "opt_flags", - ["-O0", "-O1", "-O2", "-O3", "-Ofast", "-Os", "-Oz", "-Og", "-O", "-O4"], - "aocc@2.2.0", - ) - - supported_flag_test("stdcxx_libs", ("-lstdc++",), "aocc@2.2.0") - supported_flag_test("openmp_flag", "-fopenmp", "aocc@2.2.0") - supported_flag_test("cxx11_flag", "-std=c++11", "aocc@2.2.0") - supported_flag_test("cxx14_flag", "-std=c++14", "aocc@2.2.0") - supported_flag_test("cxx17_flag", "-std=c++17", "aocc@2.2.0") - supported_flag_test("c99_flag", "-std=c99", "aocc@2.2.0") - supported_flag_test("c11_flag", "-std=c11", "aocc@2.2.0") - supported_flag_test("cc_pic_flag", "-fPIC", "aocc@2.2.0") - supported_flag_test("cxx_pic_flag", "-fPIC", "aocc@2.2.0") - supported_flag_test("f77_pic_flag", "-fPIC", "aocc@2.2.0") - supported_flag_test("fc_pic_flag", "-fPIC", "aocc@2.2.0") - supported_flag_test("version_argument", "--version", "aocc@2.2.0") - flg = "-Wno-unused-command-line-argument -mllvm -eliminate-similar-expr=false" - supported_flag_test("cflags", flg, "aocc@3.0.0") - supported_flag_test("cxxflags", flg, "aocc@3.0.0") - supported_flag_test("fflags", flg, "aocc@3.0.0") - - -def test_fj_flags(): - supported_flag_test("openmp_flag", "-Kopenmp", "fj@4.0.0") - supported_flag_test("cxx98_flag", "-std=c++98", "fj@4.0.0") - supported_flag_test("cxx11_flag", "-std=c++11", "fj@4.0.0") - supported_flag_test("cxx14_flag", "-std=c++14", "fj@4.0.0") - supported_flag_test("cxx17_flag", "-std=c++17", "fj@4.0.0") - supported_flag_test("c99_flag", "-std=c99", "fj@4.0.0") - supported_flag_test("c11_flag", "-std=c11", "fj@4.0.0") - supported_flag_test("cc_pic_flag", "-KPIC", "fj@4.0.0") - supported_flag_test("cxx_pic_flag", "-KPIC", "fj@4.0.0") - supported_flag_test("f77_pic_flag", "-KPIC", "fj@4.0.0") - supported_flag_test("fc_pic_flag", "-KPIC", "fj@4.0.0") - supported_flag_test("opt_flags", ["-O0", "-O1", "-O2", "-O3", "-Ofast"], "fj@4.0.0") - supported_flag_test("debug_flags", "-g", "fj@4.0.0") - - -def test_gcc_flags(): - supported_flag_test("openmp_flag", "-fopenmp", "gcc@4.1") - supported_flag_test("cxx98_flag", "", "gcc@5.2") - supported_flag_test("cxx98_flag", "-std=c++98", "gcc@6.0") - unsupported_flag_test("cxx11_flag", "gcc@4.2") - supported_flag_test("cxx11_flag", "-std=c++0x", "gcc@4.3") - supported_flag_test("cxx11_flag", "-std=c++11", "gcc@4.7") - unsupported_flag_test("cxx14_flag", "gcc@4.7") - supported_flag_test("cxx14_flag", "-std=c++1y", "gcc@4.8") - supported_flag_test("cxx14_flag", "-std=c++14", "gcc@4.9") - supported_flag_test("cxx14_flag", "-std=c++14", "gcc@6.0") - unsupported_flag_test("cxx17_flag", "gcc@4.9") - supported_flag_test("cxx17_flag", "-std=c++1z", "gcc@5.0") - supported_flag_test("cxx17_flag", "-std=c++17", "gcc@6.0") - unsupported_flag_test("c99_flag", "gcc@4.4") - supported_flag_test("c99_flag", "-std=c99", "gcc@4.5") - unsupported_flag_test("c11_flag", "gcc@4.6") - supported_flag_test("c11_flag", "-std=c11", "gcc@4.7") - supported_flag_test("cc_pic_flag", "-fPIC", "gcc@4.0") - supported_flag_test("cxx_pic_flag", "-fPIC", "gcc@4.0") - supported_flag_test("f77_pic_flag", "-fPIC", "gcc@4.0") - supported_flag_test("fc_pic_flag", "-fPIC", "gcc@4.0") - supported_flag_test("stdcxx_libs", ("-lstdc++",), "gcc@4.1") - supported_flag_test( - "debug_flags", ["-g", "-gstabs+", "-gstabs", "-gxcoff+", "-gxcoff", "-gvms"], "gcc@4.0" - ) - supported_flag_test( - "opt_flags", ["-O", "-O0", "-O1", "-O2", "-O3", "-Os", "-Ofast", "-Og"], "gcc@4.0" - ) - - -def test_intel_flags(): - supported_flag_test("openmp_flag", "-openmp", "intel@=15.0") - supported_flag_test("openmp_flag", "-qopenmp", "intel@=16.0") - unsupported_flag_test("cxx11_flag", "intel@=11.0") - supported_flag_test("cxx11_flag", "-std=c++0x", "intel@=12.0") - supported_flag_test("cxx11_flag", "-std=c++11", "intel@=13") - 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") - supported_flag_test("f77_pic_flag", "-fPIC", "intel@=1.0") - supported_flag_test("fc_pic_flag", "-fPIC", "intel@=1.0") - supported_flag_test("stdcxx_libs", ("-cxxlib",), "intel@=1.0") - supported_flag_test("debug_flags", ["-debug", "-g", "-g0", "-g1", "-g2", "-g3"], "intel@=1.0") - supported_flag_test( - "opt_flags", ["-O", "-O0", "-O1", "-O2", "-O3", "-Ofast", "-Os"], "intel@=1.0" - ) - - -def test_oneapi_flags(): - supported_flag_test("openmp_flag", "-fiopenmp", "oneapi@=2020.8.0.0827") - supported_flag_test("cxx11_flag", "-std=c++11", "oneapi@=2020.8.0.0827") - supported_flag_test("cxx14_flag", "-std=c++14", "oneapi@=2020.8.0.0827") - supported_flag_test("c99_flag", "-std=c99", "oneapi@=2020.8.0.0827") - supported_flag_test("c11_flag", "-std=c1x", "oneapi@=2020.8.0.0827") - supported_flag_test("cc_pic_flag", "-fPIC", "oneapi@=2020.8.0.0827") - supported_flag_test("cxx_pic_flag", "-fPIC", "oneapi@=2020.8.0.0827") - supported_flag_test("f77_pic_flag", "-fPIC", "oneapi@=2020.8.0.0827") - supported_flag_test("fc_pic_flag", "-fPIC", "oneapi@=2020.8.0.0827") - supported_flag_test("stdcxx_libs", ("-cxxlib",), "oneapi@=2020.8.0.0827") - supported_flag_test( - "debug_flags", ["-debug", "-g", "-g0", "-g1", "-g2", "-g3"], "oneapi@=2020.8.0.0827" - ) - supported_flag_test( - "opt_flags", ["-O", "-O0", "-O1", "-O2", "-O3", "-Ofast", "-Os"], "oneapi@=2020.8.0.0827" - ) - - -def test_nag_flags(): - supported_flag_test("openmp_flag", "-openmp", "nag@=1.0") - supported_flag_test("cxx11_flag", "-std=c++11", "nag@=1.0") - supported_flag_test("cc_pic_flag", "-fPIC", "nag@=1.0") - supported_flag_test("cxx_pic_flag", "-fPIC", "nag@=1.0") - supported_flag_test("f77_pic_flag", "-PIC", "nag@=1.0") - supported_flag_test("fc_pic_flag", "-PIC", "nag@=1.0") - supported_flag_test("cc_rpath_arg", "-Wl,-rpath,", "nag@=1.0") - supported_flag_test("cxx_rpath_arg", "-Wl,-rpath,", "nag@=1.0") - supported_flag_test("f77_rpath_arg", "-Wl,-Wl,,-rpath,,", "nag@=1.0") - supported_flag_test("fc_rpath_arg", "-Wl,-Wl,,-rpath,,", "nag@=1.0") - supported_flag_test("linker_arg", "-Wl,-Wl,,", "nag@=1.0") - supported_flag_test("debug_flags", ["-g", "-gline", "-g90"], "nag@=1.0") - supported_flag_test("opt_flags", ["-O", "-O0", "-O1", "-O2", "-O3", "-O4"], "nag@=1.0") - - -def test_nvhpc_flags(): - supported_flag_test("openmp_flag", "-mp", "nvhpc@=20.9") - supported_flag_test("cxx11_flag", "--c++11", "nvhpc@=20.9") - supported_flag_test("cxx14_flag", "--c++14", "nvhpc@=20.9") - supported_flag_test("cxx17_flag", "--c++17", "nvhpc@=20.9") - supported_flag_test("c99_flag", "-c99", "nvhpc@=20.9") - supported_flag_test("c11_flag", "-c11", "nvhpc@=20.9") - supported_flag_test("cc_pic_flag", "-fpic", "nvhpc@=20.9") - supported_flag_test("cxx_pic_flag", "-fpic", "nvhpc@=20.9") - supported_flag_test("f77_pic_flag", "-fpic", "nvhpc@=20.9") - supported_flag_test("fc_pic_flag", "-fpic", "nvhpc@=20.9") - supported_flag_test("debug_flags", ["-g", "-gopt"], "nvhpc@=20.9") - supported_flag_test("opt_flags", ["-O", "-O0", "-O1", "-O2", "-O3", "-O4"], "nvhpc@=20.9") - supported_flag_test("stdcxx_libs", ("-c++libs",), "nvhpc@=20.9") - - -def test_xl_flags(): - supported_flag_test("openmp_flag", "-qsmp=omp", "xl@=1.0") - unsupported_flag_test("cxx11_flag", "xl@=13.0") - supported_flag_test("cxx11_flag", "-qlanglvl=extended0x", "xl@=13.1") - unsupported_flag_test("c99_flag", "xl@=10.0") - supported_flag_test("c99_flag", "-qlanglvl=extc99", "xl@=10.1") - supported_flag_test("c99_flag", "-std=gnu99", "xl@=13.1.1") - unsupported_flag_test("c11_flag", "xl@=12.0") - supported_flag_test("c11_flag", "-qlanglvl=extc1x", "xl@=12.1") - supported_flag_test("c11_flag", "-std=gnu11", "xl@=13.1.2") - supported_flag_test("cc_pic_flag", "-qpic", "xl@=1.0") - supported_flag_test("cxx_pic_flag", "-qpic", "xl@=1.0") - supported_flag_test("f77_pic_flag", "-qpic", "xl@=1.0") - supported_flag_test("fc_pic_flag", "-qpic", "xl@=1.0") - supported_flag_test("fflags", "-qzerosize", "xl@=1.0") - supported_flag_test("debug_flags", ["-g", "-g0", "-g1", "-g2", "-g8", "-g9"], "xl@=1.0") - supported_flag_test( - "opt_flags", ["-O", "-O0", "-O1", "-O2", "-O3", "-O4", "-O5", "-Ofast"], "xl@=1.0" - ) - - -def test_xl_r_flags(): - supported_flag_test("openmp_flag", "-qsmp=omp", "xl_r@=1.0") - unsupported_flag_test("cxx11_flag", "xl_r@=13.0") - supported_flag_test("cxx11_flag", "-qlanglvl=extended0x", "xl_r@=13.1") - unsupported_flag_test("c99_flag", "xl_r@=10.0") - supported_flag_test("c99_flag", "-qlanglvl=extc99", "xl_r@=10.1") - supported_flag_test("c99_flag", "-std=gnu99", "xl_r@=13.1.1") - unsupported_flag_test("c11_flag", "xl_r@=12.0") - supported_flag_test("c11_flag", "-qlanglvl=extc1x", "xl_r@=12.1") - supported_flag_test("c11_flag", "-std=gnu11", "xl_r@=13.1.2") - supported_flag_test("cc_pic_flag", "-qpic", "xl_r@=1.0") - supported_flag_test("cxx_pic_flag", "-qpic", "xl_r@=1.0") - supported_flag_test("f77_pic_flag", "-qpic", "xl_r@=1.0") - supported_flag_test("fc_pic_flag", "-qpic", "xl_r@=1.0") - supported_flag_test("fflags", "-qzerosize", "xl_r@=1.0") - supported_flag_test("debug_flags", ["-g", "-g0", "-g1", "-g2", "-g8", "-g9"], "xl@=1.0") - supported_flag_test( - "opt_flags", ["-O", "-O0", "-O1", "-O2", "-O3", "-O4", "-O5", "-Ofast"], "xl@=1.0" - ) - - -@pytest.mark.parametrize( - "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 -): - mixed_c = compiler_factory(spec="clang@8.0.0", operating_system="debian6") - mixed_c["compiler"]["paths"] = { - "cc": "/path/to/clang-8", - "cxx": "/path/to/clang++-8", - "f77": "/path/to/gfortran-9", - "fc": "/path/to/gfortran-9", - } - mutable_config.set( - "compilers", - [ - compiler_factory(spec="gcc@4.7.2", operating_system="debian6"), - compiler_factory(spec="clang@3.3", operating_system="debian6"), - mixed_c, - ], - ) - - compiler = spack.compilers.compilers_for_spec(compiler_spec).pop() - assert spack.compilers.is_mixed_toolchain(compiler) is expected_result - - -@pytest.mark.regression("14798,13733") -def test_raising_if_compiler_target_is_over_specific(config): - # Compiler entry with an overly specific target - compilers = [ - { - "compiler": { - "spec": "gcc@9.0.1", - "paths": { - "cc": "/usr/bin/gcc-9", - "cxx": "/usr/bin/g++-9", - "f77": "/usr/bin/gfortran-9", - "fc": "/usr/bin/gfortran-9", - }, - "flags": {}, - "operating_system": "ubuntu18.04", - "target": "haswell", - "modules": [], - "environment": {}, - "extra_rpaths": [], - } - } - ] - arch_spec = spack.spec.ArchSpec(("linux", "ubuntu18.04", "haswell")) - with spack.config.override("compilers", compilers): - cfg = spack.compilers.get_compiler_config(config) - with pytest.raises(ValueError): - spack.compilers.get_compilers(cfg, spack.spec.CompilerSpec("gcc@9.0.1"), arch_spec) - - -@pytest.mark.not_on_windows("Not supported on Windows (yet)") -@pytest.mark.enable_compiler_execution -def test_compiler_get_real_version(working_env, monkeypatch, tmpdir): - # Test variables - test_version = "2.2.2" - - # Create compiler - gcc = str(tmpdir.join("gcc")) - with open(gcc, "w", encoding="utf-8") as f: - f.write( - """#!/bin/sh -if [ "$CMP_ON" = "1" ]; then - echo "$CMP_VER" -fi -""" - ) - fs.set_executable(gcc) - - # Add compiler to config - compiler_info = { - "spec": "gcc@foo", - "paths": {"cc": gcc, "cxx": None, "f77": None, "fc": None}, - "flags": {}, - "operating_system": "fake", - "target": "fake", - "modules": ["turn_on"], - "environment": {"set": {"CMP_VER": test_version}}, - "extra_rpaths": [], - } - compiler_dict = {"compiler": compiler_info} - - # Set module load to turn compiler on - def module(*args): - if args[0] == "show": - return "" - elif args[0] == "load": - os.environ["CMP_ON"] = "1" - - monkeypatch.setattr(spack.util.module_cmd, "module", module) - - # Run and confirm output - compilers = spack.compilers.get_compilers([compiler_dict]) - assert len(compilers) == 1 - compiler = compilers[0] - version = compiler.get_real_version() - assert version == test_version - - -@pytest.mark.regression("42679") -def test_get_compilers(config): - """Tests that we can select compilers whose versions differ only for a suffix.""" - common = { - "flags": {}, - "operating_system": "ubuntu23.10", - "target": "x86_64", - "modules": [], - "environment": {}, - "extra_rpaths": [], - } - with_suffix = { - "spec": "gcc@13.2.0-suffix", - "paths": { - "cc": "/usr/bin/gcc-13.2.0-suffix", - "cxx": "/usr/bin/g++-13.2.0-suffix", - "f77": "/usr/bin/gfortran-13.2.0-suffix", - "fc": "/usr/bin/gfortran-13.2.0-suffix", - }, - **common, - } - without_suffix = { - "spec": "gcc@13.2.0", - "paths": { - "cc": "/usr/bin/gcc-13.2.0", - "cxx": "/usr/bin/g++-13.2.0", - "f77": "/usr/bin/gfortran-13.2.0", - "fc": "/usr/bin/gfortran-13.2.0", - }, - **common, - } - - compilers = [{"compiler": without_suffix}, {"compiler": with_suffix}] - - assert spack.compilers.get_compilers( - compilers, cspec=spack.spec.CompilerSpec("gcc@=13.2.0-suffix") - ) == [spack.compilers._compiler_from_config_entry(with_suffix)] - - assert spack.compilers.get_compilers( - compilers, cspec=spack.spec.CompilerSpec("gcc@=13.2.0") - ) == [spack.compilers._compiler_from_config_entry(without_suffix)] - - -@pytest.mark.enable_compiler_execution -def test_compiler_get_real_version_fails(working_env, monkeypatch, tmpdir): - # Test variables - test_version = "2.2.2" - - # Create compiler - gcc = str(tmpdir.join("gcc")) - with open(gcc, "w", encoding="utf-8") as f: - f.write( - """#!/bin/sh -if [ "$CMP_ON" = "1" ]; then - echo "$CMP_VER" -fi -""" - ) - fs.set_executable(gcc) - - # Add compiler to config - compiler_info = { - "spec": "gcc@foo", - "paths": {"cc": gcc, "cxx": None, "f77": None, "fc": None}, - "flags": {}, - "operating_system": "fake", - "target": "fake", - "modules": ["turn_on"], - "environment": {"set": {"CMP_VER": test_version}}, - "extra_rpaths": [], - } - compiler_dict = {"compiler": compiler_info} - - # Set module load to turn compiler on - def module(*args): - if args[0] == "show": - return "" - elif args[0] == "load": - os.environ["SPACK_TEST_CMP_ON"] = "1" - - monkeypatch.setattr(spack.util.module_cmd, "module", module) - - # Make compiler fail when getting implicit rpaths - def _call(*args, **kwargs): - raise ProcessError("Failed intentionally") - - monkeypatch.setattr(Executable, "__call__", _call) - - # Run and no change to environment - compilers = spack.compilers.get_compilers([compiler_dict]) - assert len(compilers) == 1 - compiler = compilers[0] - assert compiler.get_real_version() == "unknown" - # Confirm environment does not change after failed call - assert "SPACK_TEST_CMP_ON" not in os.environ - - -@pytest.mark.not_on_windows("Bash scripting unsupported on Windows (for now)") -@pytest.mark.enable_compiler_execution -def test_compiler_flags_use_real_version(working_env, monkeypatch, tmpdir): - # Create compiler - gcc = str(tmpdir.join("gcc")) - with open(gcc, "w", encoding="utf-8") as f: - f.write( - """#!/bin/sh -echo "4.4.4" -""" - ) # Version for which c++11 flag is -std=c++0x - fs.set_executable(gcc) - - # Add compiler to config - compiler_info = { - "spec": "gcc@foo", - "paths": {"cc": gcc, "cxx": None, "f77": None, "fc": None}, - "flags": {}, - "operating_system": "fake", - "target": "fake", - "modules": ["turn_on"], - "environment": {}, - "extra_rpaths": [], - } - compiler_dict = {"compiler": compiler_info} - - # Run and confirm output - compilers = spack.compilers.get_compilers([compiler_dict]) - assert len(compilers) == 1 - compiler = compilers[0] - flag = compiler.cxx11_flag - assert flag == "-std=c++0x" - - -@pytest.mark.enable_compiler_verification -def test_compiler_executable_verification_raises(tmpdir): - compiler = MockCompiler() - compiler.cc = "/this/path/does/not/exist" - - with pytest.raises(spack.compiler.CompilerAccessError): - compiler.verify_executables() - - -@pytest.mark.enable_compiler_verification -def test_compiler_executable_verification_success(tmpdir): - def prepare_executable(name): - real = str(tmpdir.join("cc").ensure()) - fs.set_executable(real) - setattr(compiler, name, real) - - # setup mock compiler with real paths - compiler = MockCompiler() - for name in ("cc", "cxx", "f77", "fc"): - prepare_executable(name) - - # testing that this doesn't raise an error because the paths exist and - # are executable - compiler.verify_executables() - - # Test that null entries don't fail - compiler.cc = None - compiler.verify_executables() - - -@pytest.mark.parametrize( - "compilers_extra_attributes,expected_length", - [ - # If we detect a C compiler we expect the result to be valid - ({"c": "/usr/bin/clang-12", "cxx": "/usr/bin/clang-12"}, 1), - # If we detect only a C++ compiler we expect the result to be discarded - ({"cxx": "/usr/bin/clang-12"}, 0), - ], -) -def test_detection_requires_c_compiler(compilers_extra_attributes, expected_length): - """Tests that compilers automatically added to the configuration have - at least a C compiler. - """ - packages_yaml = { - "llvm": { - "externals": [ - { - "spec": "clang@12.0.0", - "prefix": "/usr", - "extra_attributes": {"compilers": compilers_extra_attributes}, - } - ] - } - } - result = spack.compilers.CompilerConfigFactory.from_packages_yaml(packages_yaml) - assert len(result) == expected_length - - -def test_compiler_environment(working_env): - """Test whether environment modifications from compilers are applied in compiler_environment""" - os.environ.pop("TEST", None) - compiler = Compiler( - "gcc@=13.2.0", - operating_system="ubuntu20.04", - target="x86_64", - paths=["/test/bin/gcc", "/test/bin/g++"], - environment={"set": {"TEST": "yes"}}, - ) - with compiler.compiler_environment(): - assert os.environ["TEST"] == "yes" - - -class MockCompilerWithoutExecutables(MockCompiler): - def __init__(self): - super().__init__() - self._compile_dummy_c_source_count = 0 - self._get_real_version_count = 0 - - def _compile_dummy_c_source(self) -> Optional[str]: - self._compile_dummy_c_source_count += 1 - return "gcc helloworld.c -o helloworld" - - def get_real_version(self) -> str: - self._get_real_version_count += 1 - return "1.0.0" - - -def test_compiler_output_caching(tmp_path): - """Test that compiler output is cached on the filesystem.""" - # The first call should trigger the cache to updated. - a = MockCompilerWithoutExecutables() - cache = spack.compiler.FileCompilerCache(FileCache(str(tmp_path))) - assert cache.get(a).c_compiler_output == "gcc helloworld.c -o helloworld" - assert cache.get(a).real_version == "1.0.0" - assert a._compile_dummy_c_source_count == 1 - assert a._get_real_version_count == 1 - - # The second call on an equivalent but distinct object should not trigger compiler calls. - b = MockCompilerWithoutExecutables() - cache = spack.compiler.FileCompilerCache(FileCache(str(tmp_path))) - assert cache.get(b).c_compiler_output == "gcc helloworld.c -o helloworld" - assert cache.get(b).real_version == "1.0.0" - assert b._compile_dummy_c_source_count == 0 - assert b._get_real_version_count == 0 - - # Cache schema change should be handled gracefully. - with open(cache.cache.cache_path(cache.name), "w", encoding="utf-8") as f: - for k in cache._data: - cache._data[k] = "corrupted entry" - f.write(json.dumps(cache._data)) - - c = MockCompilerWithoutExecutables() - cache = spack.compiler.FileCompilerCache(FileCache(str(tmp_path))) - assert cache.get(c).c_compiler_output == "gcc helloworld.c -o helloworld" - assert cache.get(c).real_version == "1.0.0" - - # Cache corruption should be handled gracefully. - with open(cache.cache.cache_path(cache.name), "w", encoding="utf-8") as f: - f.write("corrupted cache") - - d = MockCompilerWithoutExecutables() - cache = spack.compiler.FileCompilerCache(FileCache(str(tmp_path))) - assert cache.get(d).c_compiler_output == "gcc helloworld.c -o helloworld" - assert cache.get(d).real_version == "1.0.0" diff --git a/lib/spack/spack/test/compilers/conversion.py b/lib/spack/spack/test/compilers/conversion.py new file mode 100644 index 00000000000..84ce07f5ded --- /dev/null +++ b/lib/spack/spack/test/compilers/conversion.py @@ -0,0 +1,85 @@ +# Copyright Spack Project Developers. See COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +"""Tests conversions from compilers.yaml""" +import pytest + +from spack.compilers.config import CompilerFactory + + +@pytest.fixture() +def mock_compiler(mock_executable): + gcc = mock_executable("gcc", "echo 13.2.0") + gxx = mock_executable("g++", "echo 13.2.0") + gfortran = mock_executable("gfortran", "echo 13.2.0") + return { + "spec": "gcc@13.2.0", + "paths": {"cc": str(gcc), "cxx": str(gxx), "f77": str(gfortran), "fc": str(gfortran)}, + } + + +# - compiler: +# spec: clang@=10.0.0 +# paths: +# cc: /usr/bin/clang +# cxx: /usr/bin/clang++ +# f77: null +# fc: null +# flags: {} +# operating_system: ubuntu20.04 +# target: x86_64 +# modules: [] +# environment: {} +# extra_rpaths: [] + + +def test_basic_compiler_conversion(mock_compiler, tmp_path): + """Tests the conversion of a compiler using a single toolchain, with default options.""" + compilers = CompilerFactory.from_legacy_yaml(mock_compiler) + compiler_spec = compilers[0] + assert compiler_spec.satisfies("gcc@13.2.0 languages=c,c++,fortran") + assert compiler_spec.external + assert compiler_spec.external_path == str(tmp_path) + + for language in ("c", "cxx", "fortran"): + assert language in compiler_spec.extra_attributes["compilers"] + + +def test_compiler_conversion_with_flags(mock_compiler): + """Tests that flags are converted appropriately for external compilers""" + mock_compiler["flags"] = {"cflags": "-O3", "cxxflags": "-O2 -g"} + compiler_spec = CompilerFactory.from_legacy_yaml(mock_compiler)[0] + assert compiler_spec.external + assert "flags" in compiler_spec.extra_attributes + assert compiler_spec.extra_attributes["flags"]["cflags"] == "-O3" + assert compiler_spec.extra_attributes["flags"]["cxxflags"] == "-O2 -g" + + +def tests_compiler_conversion_with_environment(mock_compiler): + """Tests that custom environment modifications are converted appropriately + for external compilers + """ + mods = {"set": {"FOO": "foo", "BAR": "bar"}, "unset": ["BAZ"]} + mock_compiler["environment"] = mods + compiler_spec = CompilerFactory.from_legacy_yaml(mock_compiler)[0] + assert compiler_spec.external + assert "environment" in compiler_spec.extra_attributes + assert compiler_spec.extra_attributes["environment"] == mods + + +def tests_compiler_conversion_extra_rpaths(mock_compiler): + """Tests that extra rpaths are converted appropriately for external compilers""" + mock_compiler["extra_rpaths"] = ["/foo/bar"] + compiler_spec = CompilerFactory.from_legacy_yaml(mock_compiler)[0] + assert compiler_spec.external + assert "extra_rpaths" in compiler_spec.extra_attributes + assert compiler_spec.extra_attributes["extra_rpaths"] == ["/foo/bar"] + + +def tests_compiler_conversion_modules(mock_compiler): + """Tests that modules are converted appropriately for external compilers""" + modules = ["foo/4.1.2", "bar/5.1.4"] + mock_compiler["modules"] = modules + compiler_spec = CompilerFactory.from_legacy_yaml(mock_compiler)[0] + assert compiler_spec.external + assert compiler_spec.external_modules == modules diff --git a/lib/spack/spack/test/compilers/libraries.py b/lib/spack/spack/test/compilers/libraries.py new file mode 100644 index 00000000000..828b17e2ec4 --- /dev/null +++ b/lib/spack/spack/test/compilers/libraries.py @@ -0,0 +1,124 @@ +# Copyright Spack Project Developers. See COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +import copy +import os + +import pytest + +import llnl.util.filesystem as fs + +import spack.compilers.config +import spack.compilers.libraries +import spack.util.executable +import spack.util.module_cmd + +without_flag_output = "ld -L/path/to/first/lib -L/path/to/second/lib64" +with_flag_output = "ld -L/path/to/first/with/flag/lib -L/path/to/second/lib64" + + +def call_compiler(exe, *args, **kwargs): + # This method can replace Executable.__call__ to emulate a compiler that + # changes libraries depending on a flag. + if "--correct-flag" in exe.exe: + return with_flag_output + return without_flag_output + + +@pytest.fixture() +def mock_gcc(config): + compilers = spack.compilers.config.all_compilers_from(configuration=config) + compilers.sort(key=lambda x: (x.name == "gcc", x.version)) + # Deepcopy is used to avoid more boilerplate when changing the "extra_attributes" + return copy.deepcopy(compilers[-1]) + + +class TestCompilerPropertyDetector: + @pytest.mark.parametrize( + "language,flagname", + [ + ("cxx", "cxxflags"), + ("cxx", "cppflags"), + ("cxx", "ldflags"), + ("c", "cflags"), + ("c", "cppflags"), + ], + ) + @pytest.mark.not_on_windows("Not supported on Windows") + def test_compile_dummy_c_source(self, mock_gcc, monkeypatch, language, flagname): + monkeypatch.setattr(spack.util.executable.Executable, "__call__", call_compiler) + for key in list(mock_gcc.extra_attributes["compilers"]): + if key == language: + continue + mock_gcc.extra_attributes["compilers"].pop(key) + + detector = spack.compilers.libraries.CompilerPropertyDetector(mock_gcc) + + # Test without flags + assert detector._compile_dummy_c_source() == without_flag_output + + # Set flags and test + if flagname: + mock_gcc.extra_attributes.setdefault("flags", {}) + monkeypatch.setitem(mock_gcc.extra_attributes["flags"], flagname, "--correct-flag") + assert detector._compile_dummy_c_source() == with_flag_output + + def test_compile_dummy_c_source_no_path(self, mock_gcc): + mock_gcc.extra_attributes["compilers"] = {} + detector = spack.compilers.libraries.CompilerPropertyDetector(mock_gcc) + assert detector._compile_dummy_c_source() is None + + def test_compile_dummy_c_source_no_verbose_flags(self, mock_gcc, monkeypatch): + monkeypatch.setattr(mock_gcc.package, "verbose_flags", "") + detector = spack.compilers.libraries.CompilerPropertyDetector(mock_gcc) + assert detector._compile_dummy_c_source() is None + + @pytest.mark.not_on_windows("Module files are not supported on Windows") + def test_compile_dummy_c_source_load_env(self, mock_gcc, monkeypatch, tmp_path): + gcc = tmp_path / "gcc" + gcc.write_text( + f"""#!/bin/sh + if [ "$ENV_SET" = "1" ] && [ "$MODULE_LOADED" = "1" ]; then + printf '{without_flag_output}' + fi + """ + ) + fs.set_executable(str(gcc)) + + # Set module load to turn compiler on + def module(*args): + if args[0] == "show": + return "" + elif args[0] == "load": + monkeypatch.setenv("MODULE_LOADED", "1") + + monkeypatch.setattr(spack.util.module_cmd, "module", module) + + mock_gcc.extra_attributes["compilers"]["c"] = str(gcc) + mock_gcc.extra_attributes["environment"] = {"set": {"ENV_SET": "1"}} + mock_gcc.external_modules = ["turn_on"] + + detector = spack.compilers.libraries.CompilerPropertyDetector(mock_gcc) + assert detector._compile_dummy_c_source() == without_flag_output + + @pytest.mark.not_on_windows("Not supported on Windows") + def test_implicit_rpaths(self, mock_gcc, dirs_with_libfiles, monkeypatch): + lib_to_dirs, all_dirs = dirs_with_libfiles + + detector = spack.compilers.libraries.CompilerPropertyDetector(mock_gcc) + monkeypatch.setattr( + spack.compilers.libraries.CompilerPropertyDetector, + "_compile_dummy_c_source", + lambda self: "ld " + " ".join(f"-L{d}" for d in all_dirs), + ) + + retrieved_rpaths = detector.implicit_rpaths() + assert set(retrieved_rpaths) == set(lib_to_dirs["libstdc++"] + lib_to_dirs["libgfortran"]) + + def test_compiler_environment(self, working_env, mock_gcc, monkeypatch): + """Test whether environment modifications are applied in compiler_environment""" + monkeypatch.delenv("TEST", raising=False) + mock_gcc.extra_attributes["environment"] = {"set": {"TEST": "yes"}} + detector = spack.compilers.libraries.CompilerPropertyDetector(mock_gcc) + with detector.compiler_environment(): + assert os.environ["TEST"] == "yes" diff --git a/lib/spack/spack/test/concretization/compiler_runtimes.py b/lib/spack/spack/test/concretization/compiler_runtimes.py index a9af50b4001..6a2a41a4cb9 100644 --- a/lib/spack/spack/test/concretization/compiler_runtimes.py +++ b/lib/spack/spack/test/concretization/compiler_runtimes.py @@ -17,8 +17,6 @@ from spack.environment.environment import ViewDescriptor from spack.version import Version -pytestmark = [pytest.mark.usefixtures("enable_runtimes")] - def _concretize_with_reuse(*, root_str, reused_str): reused_spec = spack.concretize.concretize_one(reused_str) @@ -36,14 +34,6 @@ def runtime_repo(mutable_config): yield mock_repo -@pytest.fixture -def enable_runtimes(): - original = spack.solver.asp.WITH_RUNTIME - spack.solver.asp.WITH_RUNTIME = True - yield - spack.solver.asp.WITH_RUNTIME = original - - def test_correct_gcc_runtime_is_injected_as_dependency(runtime_repo): s = spack.concretize.concretize_one("pkg-a%gcc@10.2.1 ^pkg-b%gcc@9.4.0") a, b = s["pkg-a"], s["pkg-b"] @@ -103,7 +93,7 @@ def test_external_nodes_do_not_have_runtimes(runtime_repo, mutable_config, tmp_p "pkg-a%gcc@10.2.1", "pkg-b target=x86_64 %gcc@9.4.0", { - "pkg-a": "gcc-runtime@10.2.1 target=x86_64", + "pkg-a": "gcc-runtime@10.2.1 target=core2", "pkg-b": "gcc-runtime@9.4.0 target=x86_64", }, 2, @@ -123,7 +113,7 @@ def test_reusing_specs_with_gcc_runtime(root_str, reused_str, expected, nruntime root, reused_spec = _concretize_with_reuse(root_str=root_str, reused_str=reused_str) runtime_a = root.dependencies("gcc-runtime")[0] - assert runtime_a.satisfies(expected["pkg-a"]) + assert runtime_a.satisfies(expected["pkg-a"]), runtime_a.tree() runtime_b = root["pkg-b"].dependencies("gcc-runtime")[0] assert runtime_b.satisfies(expected["pkg-b"]) @@ -159,3 +149,27 @@ def test_views_can_handle_duplicate_runtime_nodes( for x in not_expected: assert all(not node.satisfies(x) for node in candidate_specs) + + +def test_runtimes_can_be_concretized_as_standalone(runtime_repo): + """Tests that we can concretize a runtime as a standalone""" + gcc_runtime = spack.concretize.concretize_one("gcc-runtime") + + deps = gcc_runtime.dependencies() + assert len(deps) == 1 + gcc = deps[0] + assert gcc_runtime.version == gcc.version + + +def test_runtimes_are_not_reused_if_compiler_not_used(runtime_repo): + """Tests that, if we can reuse specs with a more recent runtime version than the compiler we + asked for, we will not end-up with a DAG using the recent runtime, and the old compiler. + """ + root, reused = _concretize_with_reuse(root_str="pkg-a %gcc@9", reused_str="pkg-a %gcc@10") + + assert "gcc-runtime" in root + gcc_runtime, gcc = root["gcc-runtime"], root["gcc"] + assert gcc_runtime.satisfies("@9") and not gcc_runtime.satisfies("@10") + assert gcc.satisfies("@9") and not gcc.satisfies("@10") + # Same gcc used for both languages + assert root["c"] == root["cxx"] diff --git a/lib/spack/spack/test/concretization/core.py b/lib/spack/spack/test/concretization/core.py index f02134782bd..0e6458725db 100644 --- a/lib/spack/spack/test/concretization/core.py +++ b/lib/spack/spack/test/concretization/core.py @@ -1,7 +1,6 @@ # Copyright Spack Project Developers. See COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) -import copy import os import sys @@ -14,8 +13,7 @@ import spack.binary_distribution import spack.cmd -import spack.compiler -import spack.compilers +import spack.compilers.config import spack.concretize import spack.config import spack.deptypes as dt @@ -31,9 +29,10 @@ import spack.spec import spack.store import spack.util.file_cache +import spack.util.spack_yaml as syaml import spack.variant as vt from spack.installer import PackageInstaller -from spack.spec import CompilerSpec, Spec +from spack.spec import Spec from spack.version import Version, VersionList, ver @@ -59,9 +58,6 @@ def check_spec(abstract, concrete): for flag in concrete.compiler_flags.valid_compiler_flags(): assert flag in concrete.compiler_flags - if abstract.compiler and abstract.compiler.concrete: - assert abstract.compiler == concrete.compiler - if abstract.architecture and abstract.architecture.concrete: assert abstract.architecture == concrete.architecture @@ -90,7 +86,6 @@ def binary_compatibility(monkeypatch, request): return monkeypatch.setattr(spack.solver.asp, "using_libc_compatibility", lambda: True) - monkeypatch.setattr(spack.compiler.Compiler, "default_libc", Spec("glibc@=2.28")) @pytest.fixture( @@ -275,15 +270,15 @@ def change(self, changes=None): @pytest.fixture() def clang12_with_flags(compiler_factory): - c = compiler_factory(spec="clang@12.2.0", operating_system="redhat6") - c["compiler"]["flags"] = {"cflags": "-O3", "cxxflags": "-O3"} + c = compiler_factory(spec="llvm@12.2.0 os=redhat6") + c["extra_attributes"]["flags"] = {"cflags": "-O3", "cxxflags": "-O3"} return c @pytest.fixture() def gcc11_with_flags(compiler_factory): - c = compiler_factory(spec="gcc@11.1.0", operating_system="redhat6") - c["compiler"]["flags"] = {"cflags": "-O0 -g", "cxxflags": "-O0 -g", "fflags": "-O0 -g"} + c = compiler_factory(spec="gcc@11.1.0 os=redhat6") + c["extra_attributes"]["flags"] = {"cflags": "-O0 -g", "cxxflags": "-O0 -g", "fflags": "-O0 -g"} return c @@ -345,16 +340,6 @@ def test_concretize_with_restricted_virtual(self): concrete = check_concretize("mpileaks ^mpich2@1.3.1:1.4") assert concrete["mpich2"].satisfies("mpich2@1.3.1:1.4") - def test_concretize_enable_disable_compiler_existence_check(self): - with spack.concretize.enable_compiler_existence_check(): - with pytest.raises(spack.concretize.UnavailableCompilerVersionError): - check_concretize("dttop %gcc@=100.100") - - with spack.concretize.disable_compiler_existence_check(): - spec = check_concretize("dttop %gcc@=100.100") - assert spec.satisfies("%gcc@100.100") - assert spec["dtlink3"].satisfies("%gcc@100.100") - def test_concretize_with_provides_when(self): """Make sure insufficient versions of MPI are not in providers list when we ask for some advanced version. @@ -383,7 +368,13 @@ def test_different_compilers_get_different_flags( self, mutable_config, clang12_with_flags, gcc11_with_flags ): """Tests that nodes get the flags of the associated compiler.""" - mutable_config.set("compilers", [clang12_with_flags, gcc11_with_flags]) + mutable_config.set( + "packages", + { + "llvm": {"externals": [clang12_with_flags]}, + "gcc": {"externals": [gcc11_with_flags]}, + }, + ) t = archspec.cpu.host().family client = spack.concretize.concretize_one( Spec( @@ -402,7 +393,7 @@ def test_spec_flags_maintain_order(self, mutable_config, gcc11_with_flags): """Tests that Spack assembles flags in a consistent way (i.e. with the same ordering), for successive concretizations. """ - mutable_config.set("compilers", [gcc11_with_flags]) + mutable_config.set("packages", {"gcc": {"externals": [gcc11_with_flags]}}) spec_str = "libelf os=redhat6 %gcc@11.1.0" for _ in range(3): s = spack.concretize.concretize_one(spec_str) @@ -410,24 +401,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") ) - 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 - t = archspec.cpu.host().family - spec = Spec(f"pkg-a platform=test os=redhat6 target={t} %clang@12.2.0") - - # Get the compiler that matches the spec ( - compiler = spack.compilers.compiler_for_spec("clang@=12.2.0", spec.architecture) - - # Configure spack to have two identical compilers with different flags - default_dict = spack.compilers._to_dict(compiler) - different_dict = copy.deepcopy(default_dict) - different_dict["compiler"]["flags"] = {"cflags": "-O2"} - - with spack.config.override("compilers", [different_dict]): - spec = spack.concretize.concretize_one(spec) - assert spec.satisfies("cflags=-O2") - @pytest.mark.parametrize( "spec_str,expected,not_expected", [ @@ -444,13 +417,6 @@ 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'", @@ -469,28 +435,40 @@ def test_compiler_flag_propagation(self, spec_str, expected, not_expected): assert not root.satisfies(constraint) def test_mixing_compilers_only_affects_subdag(self): - spack.config.set("packages:all:compiler", ["clang", "gcc"]) - spec = spack.concretize.concretize_one("dt-diamond%gcc ^dt-diamond-bottom%clang") - for dep in spec.traverse(): - assert ("%clang" in dep) == (dep.name == "dt-diamond-bottom") + """Tests that, when we mix compilers, the one with lower penalty is used for nodes + where the compiler is not forced. + """ + spec = spack.concretize.concretize_one("dt-diamond%clang ^dt-diamond-bottom%gcc") + # This is intended to traverse the "root" unification set, and check compilers + # on the nodes in the set + for x in spec.traverse(deptype=("link", "run")): + if "c" not in x or not x.name.startswith("dt-diamond"): + continue + expected_gcc = x.name != "dt-diamond" + assert ( + bool(x.dependencies(name="llvm", deptype="build")) is not expected_gcc + ), x.long_spec + assert bool(x.dependencies(name="gcc", deptype="build")) is expected_gcc + assert x.satisfies("%clang") is not expected_gcc + assert x.satisfies("%gcc") is expected_gcc def test_compiler_inherited_upwards(self): spec = spack.concretize.concretize_one("dt-diamond ^dt-diamond-bottom%clang") - for dep in spec.traverse(): - assert "%clang" in dep + for x in spec.traverse(deptype=("link", "run")): + if "c" not in x: + continue + assert x.satisfies("%clang") def test_architecture_deep_inheritance(self, mock_targets, compiler_factory): """Make sure that indirect dependencies receive architecture information from the root even when partial architecture information is provided by an intermediate dependency. """ - cnl_compiler = compiler_factory(spec="gcc@4.5.0", operating_system="CNL") - # CNL compiler has no target attribute, and this is essential to make detection pass - del cnl_compiler["compiler"]["target"] - with spack.config.override("compilers", [cnl_compiler]): + cnl_compiler = compiler_factory(spec="gcc@4.5.0 os=CNL target=nocona") + with spack.config.override("packages", {"gcc": {"externals": [cnl_compiler]}}): spec_str = "mpileaks os=CNL target=nocona %gcc@4.5.0 ^dyninst os=CNL ^callpath os=CNL" spec = spack.concretize.concretize_one(spec_str) - for s in spec.traverse(root=False): + for s in spec.traverse(root=False, deptype=("link", "run")): assert s.architecture.target == spec.architecture.target def test_compiler_flags_from_user_are_grouped(self): @@ -722,11 +700,9 @@ def test_concretize_propagate_variant_second_level_dep_not_in_source(self): assert not spec.satisfies("parent-foo-bar +fee") def test_no_matching_compiler_specs(self): - # only relevant when not building compilers as needed - with spack.concretize.enable_compiler_existence_check(): - s = Spec("pkg-a %gcc@=0.0.0") - with pytest.raises(spack.concretize.UnavailableCompilerVersionError): - s = spack.concretize.concretize_one(s) + s = Spec("pkg-a %gcc@0.0.0") + with pytest.raises(spack.solver.asp.UnsatisfiableSpecError): + spack.concretize.concretize_one(s) def test_no_compilers_for_arch(self): s = Spec("pkg-a arch=linux-rhel0-x86_64") @@ -766,21 +742,59 @@ def test_virtual_is_fully_expanded_for_mpileaks(self): assert all(not d.dependencies(name="mpi") for d in spec.traverse()) assert all(x in spec for x in ("zmpi", "mpi")) - @pytest.mark.parametrize("compiler_str", ["clang", "gcc", "gcc@10.2.1", "clang@:15.0.0"]) - def test_compiler_inheritance(self, compiler_str): - spec_str = "mpileaks %{0}".format(compiler_str) + @pytest.mark.parametrize( + "spec_str,expected,not_expected", + [ + # clang only provides C, and C++ compilers, while gcc has also fortran + # + # If we ask mpileaks%clang, then %gcc must be used for fortran, and since + # %gcc is preferred to clang in config, it will be used for most nodes + ( + "mpileaks %clang", + {"mpileaks": "%clang", "libdwarf": "%gcc", "libelf": "%gcc"}, + {"libdwarf": "%clang", "libelf": "%clang"}, + ), + ( + "mpileaks %clang@:15.0.0", + {"mpileaks": "%clang", "libdwarf": "%gcc", "libelf": "%gcc"}, + {"libdwarf": "%clang", "libelf": "%clang"}, + ), + ( + "mpileaks %gcc", + {"mpileaks": "%gcc", "libdwarf": "%gcc", "libelf": "%gcc"}, + {"mpileaks": "%clang", "libdwarf": "%clang", "libelf": "%clang"}, + ), + ( + "mpileaks %gcc@10.2.1", + {"mpileaks": "%gcc", "libdwarf": "%gcc", "libelf": "%gcc"}, + {"mpileaks": "%clang", "libdwarf": "%clang", "libelf": "%clang"}, + ), + # dyninst doesn't require fortran, so %clang is propagated + ( + "dyninst %clang", + {"dyninst": "%clang", "libdwarf": "%clang", "libelf": "%clang"}, + {"libdwarf": "%gcc", "libelf": "%gcc"}, + ), + ], + ) + def test_compiler_inheritance(self, spec_str, expected, not_expected): + """Spack tries to propagate compilers as much as possible, but prefers using a single + toolchain on a node, rather than mixing them. + """ spec = spack.concretize.concretize_one(spec_str) - assert spec["libdwarf"].compiler.satisfies(compiler_str) - assert spec["libelf"].compiler.satisfies(compiler_str) + for name, constraint in expected.items(): + assert spec[name].satisfies(constraint) + + for name, constraint in not_expected.items(): + assert not spec[name].satisfies(constraint) def test_external_package(self): - spec = Spec("externaltool%gcc") - spec = spack.concretize.concretize_one(spec) - assert spec["externaltool"].external_path == os.path.sep + os.path.join( - "path", "to", "external_tool" - ) - assert "externalprereq" not in spec - assert spec["externaltool"].compiler.satisfies("gcc") + """Tests that an external is preferred, if present, and that it does not + have dependencies. + """ + spec = spack.concretize.concretize_one("externaltool") + assert spec.external_path == os.path.sep + os.path.join("path", "to", "external_tool") + assert not spec.dependencies() def test_nobuild_package(self): """Test that a non-buildable package raise an error if no specs @@ -792,16 +806,14 @@ def test_nobuild_package(self): def test_external_and_virtual(self, mutable_config): mutable_config.set("packages:stuff", {"buildable": False}) - spec = Spec("externaltest") - spec = spack.concretize.concretize_one(spec) + spec = spack.concretize.concretize_one("externaltest") assert spec["externaltool"].external_path == os.path.sep + os.path.join( "path", "to", "external_tool" ) + # "stuff" is a virtual provided by externalvirtual assert spec["stuff"].external_path == os.path.sep + os.path.join( - "path", "to", "external_virtual_gcc" + "path", "to", "external_virtual_clang" ) - assert spec["externaltool"].compiler.satisfies("gcc") - assert spec["stuff"].compiler.satisfies("gcc") def test_compiler_child(self): s = Spec("mpileaks target=x86_64 %clang ^dyninst%gcc") @@ -826,7 +838,7 @@ def test_conflict_in_all_directives_true(self): with pytest.raises(spack.error.SpackError): s = spack.concretize.concretize_one(s) - @pytest.mark.parametrize("spec_str", ["conflict@10.0+foo%clang"]) + @pytest.mark.parametrize("spec_str", ["unsat-provider@1.0+foo"]) def test_no_conflict_in_external_specs(self, spec_str): # Modify the configuration to have the spec with conflict # registered as an external @@ -914,7 +926,9 @@ def test_simultaneous_concretization_of_specs(self, abstract_specs): concrete_specs = spack.concretize._concretize_specs_together(abstract_specs) # Check there's only one configuration of each package in the DAG - names = set(dep.name for spec in concrete_specs for dep in spec.traverse()) + names = set( + dep.name for spec in concrete_specs for dep in spec.traverse(deptype=("link", "run")) + ) for name in names: name_specs = set(spec[name] for spec in concrete_specs if name in spec) assert len(name_specs) == 1 @@ -935,39 +949,45 @@ def test_noversion_pkg(self, spec): spack.concretize.concretize_one(spec) @pytest.mark.not_on_windows("Not supported on Windows (yet)") - # Include targets to prevent regression on 20537 @pytest.mark.parametrize( - "spec, best_achievable", + "spec,compiler_spec,best_achievable", [ - ("mpileaks%gcc@=4.4.7 ^dyninst@=10.2.1 target=x86_64:", "core2"), - ("mpileaks target=x86_64: %gcc@=4.8", "haswell"), - ("mpileaks target=x86_64: %gcc@=5.3.0", "broadwell"), - ("mpileaks target=x86_64: %apple-clang@=5.1.0", "x86_64"), + ( + "mpileaks%gcc@=4.4.7 ^dyninst@=10.2.1 target=x86_64:", + "gcc@4.4.7 languages=c,c++,fortran", + "core2", + ), + ("mpileaks target=x86_64: %gcc@=4.8", "gcc@4.8 languages=c,c++,fortran", "haswell"), + ( + "mpileaks target=x86_64: %gcc@=5.3.0", + "gcc@5.3.0 languages=c,c++,fortran", + "broadwell", + ), ], ) @pytest.mark.regression("13361", "20537") + @pytest.mark.usefixtures("mock_targets") def test_adjusting_default_target_based_on_compiler( - self, spec, best_achievable, current_host, mock_targets + self, spec, compiler_spec, best_achievable, current_host, compiler_factory, mutable_config ): best_achievable = archspec.cpu.TARGETS[best_achievable] expected = best_achievable if best_achievable < current_host else current_host - with spack.concretize.disable_compiler_existence_check(): - s = spack.concretize.concretize_one(spec) - assert str(s.architecture.target) == str(expected) + mutable_config.set( + "packages", {"gcc": {"externals": [compiler_factory(spec=f"{compiler_spec}")]}} + ) + s = spack.concretize.concretize_one(spec) + assert str(s.architecture.target) == str(expected) - def test_compiler_version_matches_any_entry_in_compilers_yaml(self): + @pytest.mark.parametrize( + "constraint,expected", [("%gcc@10.2", "@=10.2.1"), ("%gcc@10.2:", "@=10.2.1")] + ) + def test_compiler_version_matches_any_entry_in_packages_yaml(self, constraint, expected): # The behavior here has changed since #8735 / #14730. Now %gcc@10.2 is an abstract # compiler spec, and it should first find a matching compiler gcc@=10.2.1 - assert spack.concretize.concretize_one( - Spec("mpileaks %gcc@10.2") - ).compiler == CompilerSpec("gcc@=10.2.1") - assert spack.concretize.concretize_one( - Spec("mpileaks %gcc@10.2:") - ).compiler == CompilerSpec("gcc@=10.2.1") - - # This compiler does not exist - with pytest.raises(spack.concretize.UnavailableCompilerVersionError): - spack.concretize.concretize_one("mpileaks %gcc@=10.2") + s = spack.concretize.concretize_one(f"mpileaks {constraint}") + gcc_deps = s.dependencies(name="gcc", deptype="build") + assert len(gcc_deps) == 1 + assert gcc_deps[0].satisfies(expected) def test_concretize_anonymous(self): with pytest.raises(spack.error.SpackError): @@ -987,14 +1007,12 @@ def test_concretize_anonymous_dep(self, spec_str): ("bowtie@1.4.0", "%gcc@10.2.1"), # Version with conflicts and no valid gcc select another compiler ("bowtie@1.3.0", "%clang@15.0.0"), - # If a higher gcc is available still prefer that - ("bowtie@1.2.2 os=redhat6", "%gcc@11.1.0"), + # If a higher gcc is available, with a worse os, still prefer that + ("bowtie@1.2.2", "%gcc@11.1.0"), ], ) - def test_compiler_conflicts_in_package_py( - self, spec_str, expected_str, clang12_with_flags, gcc11_with_flags - ): - with spack.config.override("compilers", [clang12_with_flags, gcc11_with_flags]): + def test_compiler_conflicts_in_package_py(self, spec_str, expected_str, gcc11_with_flags): + with spack.config.override("packages", {"gcc": {"externals": [gcc11_with_flags]}}): s = spack.concretize.concretize_one(spec_str) assert s.satisfies(expected_str) @@ -1115,26 +1133,6 @@ def test_working_around_conflicting_defaults(self, spec_str, expected): for constraint in expected: assert s.satisfies(constraint) - @pytest.mark.regression("4635") - @pytest.mark.parametrize( - "spec_str,expected", - [("cmake", ["%clang"]), ("cmake %gcc", ["%gcc"]), ("cmake %clang", ["%clang"])], - ) - def test_external_package_and_compiler_preferences(self, spec_str, expected, mutable_config): - packages_yaml = { - "all": {"compiler": ["clang", "gcc"]}, - "cmake": { - "externals": [{"spec": "cmake@3.4.3", "prefix": "/usr"}], - "buildable": False, - }, - } - mutable_config.set("packages", packages_yaml) - s = spack.concretize.concretize_one(spec_str) - - assert s.external - for condition in expected: - assert s.satisfies(condition) - @pytest.mark.regression("5651") def test_package_with_constraint_not_met_by_external(self): """Check that if we have an external package A at version X.Y in @@ -1173,57 +1171,6 @@ def test_dependency_conditional_on_another_dependency_state(self): assert s.concrete assert not s.satisfies("^variant-on-dependency-condition-b") - @pytest.mark.regression("8082") - @pytest.mark.parametrize( - "spec_str,expected", [("cmake %gcc", "%gcc"), ("cmake %clang", "%clang")] - ) - def test_compiler_constraint_with_external_package(self, spec_str, expected): - packages_yaml = { - "cmake": {"externals": [{"spec": "cmake@3.4.3", "prefix": "/usr"}], "buildable": False} - } - spack.config.set("packages", packages_yaml) - - s = spack.concretize.concretize_one(spec_str) - assert s.external - assert s.satisfies(expected) - - @pytest.mark.regression("20976") - @pytest.mark.parametrize( - "compiler,spec_str,expected,xfailold", - [ - ( - "gcc", - "external-common-python %clang", - "%clang ^external-common-openssl%gcc ^external-common-gdbm%clang", - False, - ), - ( - "clang", - "external-common-python", - "%clang ^external-common-openssl%clang ^external-common-gdbm%clang", - True, - ), - ], - ) - def test_compiler_in_nonbuildable_external_package( - self, compiler, spec_str, expected, xfailold - ): - """Check that the compiler of a non-buildable external package does not - spread to other dependencies, unless no other commpiler is specified.""" - packages_yaml = { - "external-common-openssl": { - "externals": [ - {"spec": "external-common-openssl@1.1.1i%" + compiler, "prefix": "/usr"} - ], - "buildable": False, - } - } - spack.config.set("packages", packages_yaml) - - s = spack.concretize.concretize_one(spec_str) - assert s.satisfies(expected) - assert "external-common-perl" not in [d.name for d in s.dependencies()] - def test_external_that_would_require_a_virtual_dependency(self): s = spack.concretize.concretize_one("requires-virtual") @@ -1284,7 +1231,7 @@ def test_compiler_match_is_preferred_to_newer_version(self, compiler_factory): # that an old version of openblas is selected, rather than # a different compiler for just that node. with spack.config.override( - "compilers", [compiler_factory(spec="gcc@10.1.0", operating_system="redhat6")] + "packages", {"gcc": {"externals": [compiler_factory(spec="gcc@10.1.0 os=redhat6")]}} ): spec_str = "simple-inheritance+openblas os=redhat6 %gcc@10.1.0" s = spack.concretize.concretize_one(spec_str) @@ -1313,15 +1260,6 @@ def test_variant_not_default(self): d = s["dep-with-variants"] assert "+foo+bar+baz" in d - @pytest.mark.regression("20055") - def test_custom_compiler_version(self, mutable_config, compiler_factory, monkeypatch): - mutable_config.set( - "compilers", [compiler_factory(spec="gcc@10foo", operating_system="redhat6")] - ) - monkeypatch.setattr(spack.compiler.Compiler, "real_version", "10.2.1") - s = spack.concretize.concretize_one("pkg-a os=redhat6 %gcc@10foo") - assert "%gcc@10foo" in s - def test_all_patches_applied(self): uuidpatch = ( "a60a42b73e03f207433c5579de207c6ed61d58e4d12dd3b5142eb525728d89ea" @@ -1464,10 +1402,8 @@ def test_reuse_with_flags(self, mutable_database, mutable_config): spack.config.set("concretizer:reuse", True) spec = spack.concretize.concretize_one("pkg-a cflags=-g cxxflags=-g") PackageInstaller([spec.package], fake=True, explicit=True).install() - - testspec = Spec("pkg-a cflags=-g") - testspec = spack.concretize.concretize_one(testspec) - assert testspec == spec + testspec = spack.concretize.concretize_one("pkg-a cflags=-g") + assert testspec == spec, testspec.tree() @pytest.mark.regression("20784") def test_concretization_of_test_dependencies(self): @@ -1524,30 +1460,6 @@ def test_external_with_non_default_variant_as_dependency(self): assert "~bar" in s["external-non-default-variant"] assert s["external-non-default-variant"].external - @pytest.mark.regression("22871") - @pytest.mark.parametrize( - "spec_str,expected_os", - [ - ("mpileaks", "os=debian6"), - # To trigger the bug in 22871 we need to have the same compiler - # spec available on both operating systems - ("mpileaks platform=test os=debian6 %gcc@10.2.1", "os=debian6"), - ("mpileaks platform=test os=redhat6 %gcc@10.2.1", "os=redhat6"), - ], - ) - def test_os_selection_when_multiple_choices_are_possible( - self, spec_str, expected_os, compiler_factory - ): - # GCC 10.2.1 is defined both for debian and for redhat - with spack.config.override( - "compilers", [compiler_factory(spec="gcc@10.2.1", operating_system="redhat6")] - ): - s = spack.concretize.concretize_one(spec_str) - for node in s.traverse(): - if node.name == "glibc": - continue - assert node.satisfies(expected_os) - @pytest.mark.regression("22718") @pytest.mark.parametrize( "spec_str,expected_compiler", @@ -1557,6 +1469,8 @@ def test_compiler_is_unique(self, spec_str, expected_compiler): s = spack.concretize.concretize_one(spec_str) for node in s.traverse(): + if not node.satisfies("^ c"): + continue assert node.satisfies(expected_compiler) @pytest.mark.parametrize( @@ -1837,20 +1751,20 @@ def test_reuse_with_unknown_package_dont_raise(self, tmpdir, temporary_store, mo assert s.namespace == "builtin.mock" @pytest.mark.parametrize( - "specs,expected,libc_offset", + "specs,checks", [ - (["libelf", "libelf@0.8.10"], 1, 1), - (["libdwarf%gcc", "libelf%clang"], 2, 1), - (["libdwarf%gcc", "libdwarf%clang"], 3, 1), - (["libdwarf^libelf@0.8.12", "libdwarf^libelf@0.8.13"], 4, 1), - (["hdf5", "zmpi"], 3, 1), - (["hdf5", "mpich"], 2, 1), - (["hdf5^zmpi", "mpich"], 4, 1), - (["mpi", "zmpi"], 2, 1), - (["mpi", "mpich"], 1, 1), + (["libelf", "libelf@0.8.10"], {"libelf": 1}), + (["libdwarf%gcc", "libelf%clang"], {"libdwarf": 1, "libelf": 1}), + (["libdwarf%gcc", "libdwarf%clang"], {"libdwarf": 2, "libelf": 1}), + (["libdwarf^libelf@0.8.12", "libdwarf^libelf@0.8.13"], {"libdwarf": 2, "libelf": 2}), + (["hdf5", "zmpi"], {"zmpi": 1, "fake": 1}), + (["hdf5", "mpich"], {"mpich": 1}), + (["hdf5^zmpi", "mpich"], {"mpi": 2, "mpich": 1, "zmpi": 1, "fake": 1}), + (["mpi", "zmpi"], {"mpi": 1, "mpich": 0, "zmpi": 1, "fake": 1}), + (["mpi", "mpich"], {"mpi": 1, "mpich": 1, "zmpi": 0}), ], ) - def test_best_effort_coconcretize(self, specs, expected, libc_offset): + def test_best_effort_coconcretize(self, specs, checks): specs = [Spec(s) for s in specs] solver = spack.solver.asp.Solver() solver.reuse = False @@ -1859,10 +1773,9 @@ def test_best_effort_coconcretize(self, specs, expected, libc_offset): for s in result.specs: concrete_specs.update(s.traverse()) - if not spack.solver.asp.using_libc_compatibility(): - libc_offset = 0 - - assert len(concrete_specs) == expected + libc_offset + for matching_spec, expected_count in checks.items(): + matches = [x for x in concrete_specs if x.satisfies(matching_spec)] + assert len(matches) == expected_count @pytest.mark.parametrize( "specs,expected_spec,occurances", @@ -1950,9 +1863,7 @@ def test_misleading_error_message_on_version(self, mutable_database): with spack.config.override("concretizer:reuse", True): solver = spack.solver.asp.Solver() setup = spack.solver.asp.SpackSolverSetup() - with pytest.raises( - spack.solver.asp.UnsatisfiableSpecError, match="'dep-with-variants@999'" - ): + with pytest.raises(spack.solver.asp.UnsatisfiableSpecError, match="Cannot satisfy"): solver.driver.solve(setup, [root_spec], reuse=reusable_specs) @pytest.mark.regression("31148") @@ -1977,17 +1888,9 @@ def test_version_weight_and_provenance(self): # # Depending on the target, it may also use gnuconfig result_spec = result.specs[0] - num_specs = len(list(result_spec.traverse())) - - libc_offset = 1 if spack.solver.asp.using_libc_compatibility() else 0 - criteria = [ - (num_specs - 1 - libc_offset, None, "number of packages to build (vs. reuse)"), - (2, 0, "version badness (non roots)"), - ] - - for criterion in criteria: - assert criterion in result.criteria, criterion + assert (2, 0, "version badness (non roots)") in result.criteria assert result_spec.satisfies("^pkg-b@1.0") + assert result_spec["pkg-b"].dag_hash() == reusable_specs[1].dag_hash() def test_reuse_succeeds_with_config_compatible_os(self): root_spec = Spec("pkg-b") @@ -2108,17 +2011,17 @@ def test_installed_specs_disregard_conflicts(self, mutable_database, monkeypatch assert s.satisfies("~debug"), s @pytest.mark.regression("32471") - def test_require_targets_are_allowed(self, mutable_database): + def test_require_targets_are_allowed(self, mutable_config, mutable_database): """Test that users can set target constraints under the require attribute.""" # Configuration to be added to packages.yaml required_target = archspec.cpu.TARGETS[spack.platforms.test.Test.default].family external_conf = {"all": {"require": f"target={required_target}"}} - spack.config.set("packages", external_conf) + mutable_config.set("packages", external_conf) with spack.config.override("concretizer:reuse", False): spec = spack.concretize.concretize_one("mpich") - for s in spec.traverse(): + for s in spec.traverse(deptype=("link", "run")): assert s.satisfies(f"target={required_target}") def test_external_python_extensions_have_dependency(self): @@ -2286,97 +2189,36 @@ def test_unsolved_specs_raises_error(self, monkeypatch, mock_packages): solver.driver.solve(setup, specs, reuse=[]) @pytest.mark.regression("43141") - def test_clear_error_when_unknown_compiler_requested(self, mock_packages): + @pytest.mark.parametrize( + "spec_str,expected_match", + [ + # A package does not exist + ("pkg-a ^foo", "since 'foo' does not exist"), + # Request a compiler for a package that doesn't need it + ("pkg-c %gcc", "cannot depend on gcc"), + ], + ) + def test_errors_on_statically_checked_preconditions(self, spec_str, expected_match): """Tests that the solver can report a case where the compiler cannot be set""" - with pytest.raises( - spack.error.UnsatisfiableSpecError, match="Cannot set the required compiler: pkg-a%foo" - ): - spack.concretize.concretize_one("pkg-a %foo") + with pytest.raises(spack.error.UnsatisfiableSpecError, match=expected_match): + spack.concretize.concretize_one(spec_str) @pytest.mark.regression("36339") - def test_compiler_match_constraints_when_selected(self): + @pytest.mark.parametrize( + "compiler_str,expected", + [ + ("gcc@:9", "@=9.4.0"), + ("gcc@:10", "@=10.2.1"), + ("gcc@10", "@=10.2.1"), + ("gcc@10:", "@=10.2.1"), + ], + ) + def test_compiler_match_constraints_when_selected(self, compiler_str, expected): """Test that, when multiple compilers with the same name are in the configuration we ensure that the selected one matches all the required constraints. """ - compiler_configuration = [ - { - "compiler": { - "spec": "gcc@11.1.0", - "paths": { - "cc": "/usr/bin/gcc", - "cxx": "/usr/bin/g++", - "f77": "/usr/bin/gfortran", - "fc": "/usr/bin/gfortran", - }, - "operating_system": "debian6", - "modules": [], - } - }, - { - "compiler": { - "spec": "gcc@12.1.0", - "paths": { - "cc": "/usr/bin/gcc", - "cxx": "/usr/bin/g++", - "f77": "/usr/bin/gfortran", - "fc": "/usr/bin/gfortran", - }, - "operating_system": "debian6", - "modules": [], - } - }, - ] - spack.config.set("compilers", compiler_configuration) - s = spack.concretize.concretize_one("pkg-a %gcc@:11") - assert s.compiler.version == ver("=11.1.0"), s - - @pytest.mark.regression("36339") - @pytest.mark.not_on_windows("Not supported on Windows") - @pytest.mark.enable_compiler_execution - def test_compiler_with_custom_non_numeric_version(self, mock_executable): - """Test that, when a compiler has a completely made up version, we can use its - 'real version' to detect targets and don't raise during concretization. - """ - gcc_path = mock_executable("gcc", output="echo 9") - compiler_configuration = [ - { - "compiler": { - "spec": "gcc@foo", - "paths": {"cc": str(gcc_path), "cxx": str(gcc_path), "f77": None, "fc": None}, - "operating_system": "debian6", - "modules": [], - } - } - ] - spack.config.set("compilers", compiler_configuration) - s = spack.concretize.concretize_one("pkg-a %gcc@foo") - assert s.compiler.version == ver("=foo") - - @pytest.mark.regression("36628") - def test_concretization_with_compilers_supporting_target_any(self): - """Tests that a compiler with 'target: any' can satisfy any target, and is a viable - candidate for concretization. - """ - compiler_configuration = [ - { - "compiler": { - "spec": "gcc@12.1.0", - "paths": { - "cc": "/some/path/gcc", - "cxx": "/some/path/g++", - "f77": None, - "fc": None, - }, - "operating_system": "debian6", - "target": "any", - "modules": [], - } - } - ] - - with spack.config.override("compilers", compiler_configuration): - s = spack.concretize.concretize_one("pkg-a") - assert s.satisfies("%gcc@12.1.0") + s = spack.concretize.concretize_one(f"pkg-a %{compiler_str}") + assert s["gcc"].satisfies(expected) @pytest.mark.parametrize("spec_str", ["mpileaks", "mpileaks ^mpich"]) def test_virtuals_are_annotated_on_edges(self, spec_str): @@ -2505,25 +2347,23 @@ def test_select_lower_priority_package_from_repository_stack( def test_reuse_specs_from_non_available_compilers(self, mutable_config, mutable_database): """Tests that we can reuse specs with compilers that are not configured locally.""" - # All the specs in the mutable DB have been compiled with %gcc@=10.2.1 - specs = mutable_database.query_local() - assert all(s.satisfies("%gcc@=10.2.1") for s in specs) + # All the specs in the mutable DB have been compiled with %gcc@10.2.1 + mpileaks = [s for s in mutable_database.query_local() if s.name == "mpileaks"] - spack.compilers.remove_compiler_from_config("gcc@=10.2.1") - assert not spack.compilers.compilers_for_spec("gcc@=10.2.1") + # Remove gcc@10.2.1 + remover = spack.compilers.config.CompilerRemover(mutable_config) + remover.mark_compilers(match="gcc@=10.2.1") + remover.flush() mutable_config.set("concretizer:reuse", True) # mpileaks is in the database, it will be reused with gcc@=10.2.1 root = spack.concretize.concretize_one("mpileaks") - for s in root.traverse(): - assert s.satisfies("%gcc@10.2.1") + assert root.satisfies("%gcc@10.2.1") + assert any(root.dag_hash() == x.dag_hash() for x in mpileaks) - # fftw is not in the database, therefore the root will be compiled with gcc@=9.4.0, - # while the mpi is reused from the database and is compiled with gcc@=10.2.1 - root = spack.concretize.concretize_one("fftw") - assert root.satisfies("%gcc@=9.4.0") - for s in root.traverse(root=False): - assert s.satisfies("%gcc@10.2.1") + # fftw is not in the database, therefore it will be compiled with gcc@=9.4.0 + root = spack.concretize.concretize_one("fftw~mpi") + assert root.satisfies("%gcc@9.4.0") @pytest.mark.regression("43406") def test_externals_with_platform_explicitly_set(self, tmp_path): @@ -2554,25 +2394,36 @@ def test_spec_with_build_dep_from_json(self, tmp_path): @pytest.mark.regression("44040") def test_exclude_specs_from_reuse(self, monkeypatch): - """Tests that we can exclude a spec from reuse when concretizing, and that the spec + r"""Tests that we can exclude a spec from reuse when concretizing, and that the spec is not added back to the solve as a dependency of another reusable spec. The expected spec is: o callpath@1.0 |\ - | |\ - o | | mpich@3.0.4 - |/ / - | o dyninst@8.2 - |/| - | |\ - | | o libdwarf@20130729 - | |/| - |/|/ - | o libelf@0.8.13 - |/ - o glibc@2.31 + o | mpich@3.0.4 + |\ \ + | |\ \ + | | | o dyninst@8.2 + | |_|/| + |/| |/| + | |/|/| + | | | |\ + | | | | o libdwarf@20130729 + | |_|_|/| + |/| |_|/| + | |/| |/| + | | |/|/ + | | | o libelf@0.8.13 + | |_|/| + |/| |/| + | |/|/ + | o | gcc-runtime@10.5.0 + |/| | + | |/ + o | glibc@2.31 + / + o gcc@10.5.0 """ # Prepare a mock mirror that returns an old version of dyninst request_str = "callpath ^mpich" @@ -2639,11 +2490,11 @@ def test_can_reuse_concrete_externals_for_dependents(self, mutable_config, tmp_p preferred to concretizing another external from packages.yaml """ packages_yaml = { - "externaltool": {"externals": [{"spec": "externaltool@2.0", "prefix": "/fake/path"}]} + "externaltool": {"externals": [{"spec": "externaltool@0.9", "prefix": "/fake/path"}]} } mutable_config.set("packages", packages_yaml) - # Concretize with gcc@9 to get a suboptimal spec, since we have gcc@10 available - external_spec = spack.concretize.concretize_one("externaltool@2 %gcc@9") + # Concretize with v0.9 to get a suboptimal spec, since we have gcc@10 available + external_spec = spack.concretize.concretize_one("externaltool@0.9") assert external_spec.external root_specs = [Spec("sombrero")] @@ -2707,24 +2558,24 @@ def test_correct_external_is_selected_from_packages_yaml(self, mutable_config): reconstruct the prefix, and other external attributes. """ packages_yaml = { - "cmake": { + "mpileaks": { "externals": [ - {"spec": "cmake@3.23.1 %gcc", "prefix": "/tmp/prefix1"}, - {"spec": "cmake@3.23.1 %clang", "prefix": "/tmp/prefix2"}, + {"spec": "mpileaks@2.3 +opt", "prefix": "/tmp/prefix1"}, + {"spec": "mpileaks@2.3 ~opt", "prefix": "/tmp/prefix2"}, ] } } concretizer_yaml = { - "reuse": {"roots": True, "from": [{"type": "external", "exclude": ["%gcc"]}]} + "reuse": {"roots": True, "from": [{"type": "external", "exclude": ["+opt"]}]} } mutable_config.set("packages", packages_yaml) mutable_config.set("concretizer", concretizer_yaml) - s = spack.concretize.concretize_one("cmake") + s = spack.concretize.concretize_one("mpileaks") # Check that we got the properties from the right external assert s.external - assert s.satisfies("%clang") + assert s.satisfies("~opt") assert s.prefix == "/tmp/prefix2" @@ -3163,7 +3014,7 @@ def test_filtering_reused_specs( @pytest.mark.usefixtures("mutable_database", "mock_store") @pytest.mark.parametrize( "reuse_yaml,expected_length", - [({"from": [{"type": "local"}]}, 17), ({"from": [{"type": "buildcache"}]}, 0)], + [({"from": [{"type": "local"}]}, 19), ({"from": [{"type": "buildcache"}]}, 0)], ) @pytest.mark.not_on_windows("Expected length is different on Windows") def test_selecting_reused_sources( @@ -3176,6 +3027,9 @@ def test_selecting_reused_sources( specs = selector.reusable_specs(["mpileaks"]) assert len(specs) == expected_length + # Compiler wrapper is not reused, as it might have changed from previous installations + assert not [x for x in specs if x.name == "compiler-wrapper"] + @pytest.mark.parametrize( "specs,include,exclude,expected", @@ -3305,3 +3159,180 @@ def _ensure_cache_hits(self, problem: str): # object for _ in range(5): assert h == spack.concretize.concretize_one("hdf5") + + +@pytest.mark.regression("42679") +@pytest.mark.parametrize("compiler_str", ["gcc@=9.4.0", "gcc@=9.4.0-foo"]) +def test_selecting_compiler_with_suffix(mutable_config, mock_packages, compiler_str): + """Tests that we can select compilers whose versions differ only for a suffix.""" + packages_yaml = syaml.load_config( + """ +packages: + gcc: + externals: + - spec: "gcc@9.4.0-foo languages='c,c++'" + prefix: /path + extra_attributes: + compilers: + c: /path/bin/gcc + cxx: /path/bin/g++ +""" + ) + mutable_config.set("packages", packages_yaml["packages"]) + s = spack.concretize.concretize_one(f"libelf %{compiler_str}") + assert s["c"].satisfies(compiler_str) + + +def test_duplicate_compiler_in_externals(mutable_config, mock_packages): + """Tests that having duplicate compilers in packages.yaml do not raise and error.""" + packages_yaml = syaml.load_config( + """ +packages: + gcc: + externals: + - spec: "gcc@9.4.0 languages='c,c++'" + prefix: /path + extra_attributes: + compilers: + c: /path/bin/gcc + cxx: /path/bin/g++ + - spec: "gcc@9.4.0 languages='c,c++'" + prefix: /path + extra_attributes: + compilers: + c: /path/bin/gcc + cxx: /path/bin/g++ +""" + ) + mutable_config.set("packages", packages_yaml["packages"]) + s = spack.concretize.concretize_one("libelf %gcc@9.4") + assert s["c"].satisfies("gcc@9.4.0") + + +def test_compiler_can_depend_on_themselves_to_build(config, mock_packages): + """Tests that a compiler can depend on "itself" to bootstrap.""" + s = Spec("gcc@14 %gcc@9.4.0").concretized() + assert s.satisfies("gcc@14") + assert s.satisfies("^gcc-runtime@9.4.0") + + gcc_used_to_build = s.dependencies(name="gcc", virtuals=("c",)) + assert len(gcc_used_to_build) == 1 and gcc_used_to_build[0].satisfies("gcc@9.4.0") + + +def test_compiler_attribute_is_tolerated_in_externals(mutable_config, mock_packages, tmp_path): + """Tests that we don't error out if an external specifies a compiler, even though externals + don't have dependencies. + """ + packages_yaml = syaml.load_config( + f""" +packages: + cmake: + externals: + - spec: "cmake@3.27.4 %gcc@14.1.0" + prefix: {tmp_path} +""" + ) + mutable_config.set("packages", packages_yaml["packages"]) + s = spack.concretize.concretize_one("cmake") + assert s.external and s.external_path == str(tmp_path) + + +def test_compiler_can_be_built_with_other_compilers(config, mock_packages): + """Tests that a compiler can be built also with another compiler.""" + s = Spec("llvm@18 +clang %gcc").concretized() + assert s.satisfies("llvm@18") + + c_compiler = s.dependencies(virtuals=("c",)) + assert len(c_compiler) == 1 and c_compiler[0].satisfies("gcc@10") + + +@pytest.mark.parametrize( + "spec_str,expected", + [ + # Only one compiler is in the DAG, so pick the external associated with it + ("dyninst %clang", "clang"), + ("dyninst %gcc", "gcc"), + # Both compilers are in the DAG, so pick the best external according to other criteria + ("dyninst %clang ^libdwarf%gcc", "clang"), + ("dyninst %gcc ^libdwarf%clang", "clang"), + ], +) +def test_compiler_match_for_externals_is_taken_into_account( + spec_str, expected, mutable_config, mock_packages, tmp_path +): + """Tests that compiler annotation for externals are somehow taken into account for a match""" + packages_yaml = syaml.load_config( + f""" +packages: + libelf: + externals: + - spec: "libelf@0.8.12 %gcc" + prefix: {tmp_path / 'gcc'} + - spec: "libelf@0.8.13 %clang" + prefix: {tmp_path / 'clang'} +""" + ) + mutable_config.set("packages", packages_yaml["packages"]) + s = spack.concretize.concretize_one(spec_str) + libelf = s["libelf"] + assert libelf.external and libelf.external_path == str(tmp_path / expected) + + +@pytest.mark.parametrize( + "spec_str,expected", + [ + # Only one compiler is in the DAG, so pick the external associated with it + ("dyninst %gcc@10", "libelf-gcc10"), + ("dyninst %gcc@9", "libelf-gcc9"), + # Both compilers are in the DAG, so pick the best external according to other criteria + ("dyninst %gcc@10 ^libdwarf%gcc@9", "libelf-gcc9"), + ], +) +def test_compiler_match_for_externals_with_versions( + spec_str, expected, mutable_config, mock_packages, tmp_path +): + """Tests that version constraints are taken into account for compiler annotations + on externals + """ + packages_yaml = syaml.load_config( + f""" +packages: + libelf: + buildable: false + externals: + - spec: "libelf@0.8.12 %gcc@10" + prefix: {tmp_path / 'libelf-gcc10'} + - spec: "libelf@0.8.13 %gcc@9" + prefix: {tmp_path / 'libelf-gcc9'} +""" + ) + mutable_config.set("packages", packages_yaml["packages"]) + s = spack.concretize.concretize_one(spec_str) + libelf = s["libelf"] + assert libelf.external and libelf.external_path == str(tmp_path / expected) + + +def test_specifying_compilers_with_virtuals_syntax(default_mock_concretization): + """Tests that we can pin compilers to nodes using the %[virtuals=...] syntax""" + # clang will be used for both C and C++, since they are provided together + mpich = default_mock_concretization("mpich %[virtuals=fortran] gcc %clang") + + assert mpich["fortran"].satisfies("gcc") + assert mpich["c"].satisfies("llvm") + assert mpich["cxx"].satisfies("llvm") + + # gcc is the default compiler + mpileaks = default_mock_concretization( + "mpileaks ^libdwarf %gcc ^mpich %[virtuals=fortran] gcc %clang" + ) + + assert mpileaks["c"].satisfies("gcc") + + libdwarf = mpileaks["libdwarf"] + assert libdwarf["c"].satisfies("gcc") + assert libdwarf["c"].satisfies("gcc") + + mpich = mpileaks["mpi"] + assert mpich["fortran"].satisfies("gcc") + assert mpich["c"].satisfies("llvm") + assert mpich["cxx"].satisfies("llvm") diff --git a/lib/spack/spack/test/concretization/errors.py b/lib/spack/spack/test/concretization/errors.py index b05895c520a..6060d588cb5 100644 --- a/lib/spack/spack/test/concretization/errors.py +++ b/lib/spack/spack/test/concretization/errors.py @@ -9,7 +9,7 @@ import spack.solver.asp version_error_messages = [ - "Cannot satisfy 'fftw@:1.0' and 'fftw@1.1:", + "Cannot satisfy", " required because quantum-espresso depends on fftw@:1.0", " required because quantum-espresso ^fftw@1.1: requested explicitly", " required because quantum-espresso ^fftw@1.1: requested explicitly", diff --git a/lib/spack/spack/test/concretization/flag_mixing.py b/lib/spack/spack/test/concretization/flag_mixing.py index dc65a50f4ae..27cc55ebda6 100644 --- a/lib/spack/spack/test/concretization/flag_mixing.py +++ b/lib/spack/spack/test/concretization/flag_mixing.py @@ -75,39 +75,48 @@ def test_mix_spec_and_dependent(concretize_scope, test_repo): 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: [] +packages: + gcc: + externals: + - spec: gcc@12.100.100 + prefix: /fake + extra_attributes: + compilers: + c: /fake/bin/gcc + cxx: /fake/bin/g++ + flags: + cflags: {cflags} """ 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") + update_concretize_scope(conf_str, "packages") s1 = spack.concretize.concretize_one('y cflags="-O2" %gcc@12.100.100') assert s1.satisfies('cflags="-Wall -O2"') def test_pkg_flags_from_compiler_and_none(concretize_scope, mock_packages): - conf_str = _compiler_cfg_one_entry_with_cflags("-Wall") - update_concretize_scope(conf_str, "compilers") + packages_yaml = f""" +{_compiler_cfg_one_entry_with_cflags("-Wall")} + llvm: + externals: + - spec: llvm+clang@19.1.0 + prefix: /fake + extra_attributes: + compilers: + c: /fake/bin/clang + cxx: /fake/bin/clang++ +""" + update_concretize_scope(packages_yaml, "packages") s1 = spack.spec.Spec("cmake%gcc@12.100.100") - s2 = spack.spec.Spec("cmake-client^cmake%clang") + s2 = spack.spec.Spec("cmake-client^cmake%clang@19.1.0") concrete = dict(spack.concretize.concretize_together([(s1, None), (s2, None)])) assert concrete[s1].compiler_flags["cflags"] == ["-Wall"] - assert concrete[s2].compiler_flags["cflags"] == [] + assert concrete[s2]["cmake"].compiler_flags["cflags"] == [] @pytest.mark.parametrize( @@ -135,17 +144,20 @@ def test_flag_order_and_grouping( The ordering rules are explained in ``asp.SpecBuilder.reorder_flags``. """ + conf_str = """ +packages: +""" + if cmp_flags: + conf_str = _compiler_cfg_one_entry_with_cflags(cmp_flags) + if req_flags: conf_str = f"""\ -packages: +{conf_str} 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") + update_concretize_scope(conf_str, "packages") compiler_spec = "" if cmp_flags: @@ -180,16 +192,12 @@ def test_two_dependents_flag_mixing(concretize_scope, test_repo): 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") + update_concretize_scope(conf_str, "packages") root_spec = spack.concretize.concretize_one("v cflags=='-f1' %gcc@12.100.100") 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 = spack.concretize.concretize_one("x ~activatemultiflag cflags=='-f1'") assert root_spec1["y"].satisfies("cflags='-f1 -d1'") @@ -237,7 +245,7 @@ def test_dev_mix_flags(tmp_path, concretize_scope, mutable_mock_env_path, test_r """ conf_str = _compiler_cfg_one_entry_with_cflags("-f1") - update_concretize_scope(conf_str, "compilers") + update_concretize_scope(conf_str, "packages") manifest_file = tmp_path / ev.manifest_name manifest_file.write_text(env_content) @@ -263,3 +271,12 @@ def test_diamond_dep_flag_mixing(concretize_scope, test_repo): 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() + + +def test_flag_injection_different_compilers(mock_packages, mutable_config): + """Tests that flag propagation is not activated on nodes with a compiler that is different + from the propagation source. + """ + s = spack.concretize.concretize_one('mpileaks %gcc cflags=="-O2" ^callpath %llvm') + assert s.satisfies('cflags="-O2"') and s["c"].name == "gcc" + assert not s["callpath"].satisfies('cflags="-O2"') and s["callpath"]["c"].name == "llvm" diff --git a/lib/spack/spack/test/concretization/preferences.py b/lib/spack/spack/test/concretization/preferences.py index 004e3140c42..e5b61000edd 100644 --- a/lib/spack/spack/test/concretization/preferences.py +++ b/lib/spack/spack/test/concretization/preferences.py @@ -15,7 +15,7 @@ import spack.util.module_cmd import spack.util.spack_yaml as syaml from spack.error import ConfigError -from spack.spec import CompilerSpec, Spec +from spack.spec import Spec from spack.version import Version @@ -105,16 +105,6 @@ def test_preferred_variants_from_wildcard(self): update_packages("multivalue-variant", "variants", "foo=bar") assert_variant_values("multivalue-variant foo=*", foo=("bar",)) - @pytest.mark.parametrize( - "compiler_str,spec_str", - [("gcc@=9.4.0", "mpileaks"), ("clang@=15.0.0", "mpileaks"), ("gcc@=9.4.0", "openmpi")], - ) - def test_preferred_compilers(self, compiler_str, spec_str): - """Test preferred compilers are applied correctly""" - update_packages("all", "compiler", [compiler_str]) - spec = spack.concretize.concretize_one(spec_str) - assert spec.compiler == CompilerSpec(compiler_str) - def test_preferred_target(self, mutable_mock_repo): """Test preferred targets are applied correctly""" spec = concretize("mpich") @@ -127,12 +117,12 @@ def test_preferred_target(self, mutable_mock_repo): spec = concretize("mpileaks") assert str(spec["mpileaks"].target) == preferred - assert str(spec["mpich"].target) == preferred + assert str(spec["mpi"].target) == preferred update_packages("all", "target", [default]) spec = concretize("mpileaks") assert str(spec["mpileaks"].target) == default - assert str(spec["mpich"].target) == default + assert str(spec["mpi"].target) == default def test_preferred_versions(self): """Test preferred package versions are applied correctly""" diff --git a/lib/spack/spack/test/concretization/requirements.py b/lib/spack/spack/test/concretization/requirements.py index 48ceee33fc9..fe768611de7 100644 --- a/lib/spack/spack/test/concretization/requirements.py +++ b/lib/spack/spack/test/concretization/requirements.py @@ -494,8 +494,10 @@ def test_default_requirements_with_all(spec_str, requirement_str, concretize_sco update_packages_config(conf_str) spec = spack.concretize.concretize_one(spec_str) + assert "c" in spec for s in spec.traverse(): - assert s.satisfies(requirement_str) + if "c" in s and s.name not in ("gcc", "llvm"): + assert s.satisfies(requirement_str) @pytest.mark.parametrize( @@ -522,8 +524,7 @@ def test_default_and_package_specific_requirements( spec = spack.concretize.concretize_one("x") assert spec.satisfies(specific_exp) - for s in spec.traverse(root=False): - assert s.satisfies(generic_exp) + assert spec["y"].satisfies(generic_exp) @pytest.mark.parametrize("mpi_requirement", ["mpich", "mpich2", "zmpi"]) @@ -763,33 +764,23 @@ def test_skip_requirement_when_default_requirement_condition_cannot_be_met( assert "shared" not in s["callpath"].variants -def test_requires_directive(concretize_scope, mock_packages): - compilers_yaml = pathlib.Path(concretize_scope) / "compilers.yaml" - - # NOTE: target is omitted here so that the test works on aarch64, as well. - compilers_yaml.write_text( - """ -compilers:: -- compiler: - spec: gcc@12.0.0 - paths: - cc: /usr/bin/clang-12 - cxx: /usr/bin/clang++-12 - f77: null - fc: null - operating_system: debian6 - modules: [] -""" - ) - spack.config.CONFIG.clear_caches() - +def test_requires_directive(mock_packages, config): # This package requires either clang or gcc s = spack.concretize.concretize_one("requires_clang_or_gcc") - assert s.satisfies("%gcc@12.0.0") + assert s.satisfies("%gcc") + s = spack.concretize.concretize_one("requires_clang_or_gcc %gcc") + assert s.satisfies("%gcc") + s = spack.concretize.concretize_one("requires_clang_or_gcc %clang") + # Test both the real package (llvm) and its alias (clang) + assert s.satisfies("%llvm") and s.satisfies("%clang") # This package can only be compiled with clang + s = spack.concretize.concretize_one("requires_clang") + assert s.satisfies("%llvm") + s = spack.concretize.concretize_one("requires_clang %clang") + assert s.satisfies("%llvm") with pytest.raises(spack.error.SpackError, match="can only be compiled with Clang"): - spack.concretize.concretize_one("requires_clang") + spack.concretize.concretize_one("requires_clang %gcc") @pytest.mark.parametrize( @@ -955,10 +946,9 @@ def test_requiring_package_on_multiple_virtuals(concretize_scope, mock_packages) all: prefer: - "%clang" - compiler: [gcc] """, "multivalue-variant", - ["%clang"], + ["%[virtuals=c] llvm"], ["%gcc"], ), ( @@ -969,8 +959,8 @@ def test_requiring_package_on_multiple_virtuals(concretize_scope, mock_packages) - "%clang" """, "multivalue-variant %gcc", - ["%gcc"], - ["%clang"], + ["%[virtuals=c] gcc"], + ["%llvm"], ), # Test parsing objects instead of strings ( @@ -979,10 +969,9 @@ def test_requiring_package_on_multiple_virtuals(concretize_scope, mock_packages) all: prefer: - spec: "%clang" - compiler: [gcc] """, "multivalue-variant", - ["%clang"], + ["%[virtuals=c] llvm"], ["%gcc"], ), # Test using preferences on virtuals @@ -1036,15 +1025,15 @@ def test_requiring_package_on_multiple_virtuals(concretize_scope, mock_packages) def test_strong_preferences_packages_yaml( packages_yaml, spec_str, expected, not_expected, concretize_scope, mock_packages ): - """Tests that "preferred" specs are stronger than usual preferences, but can be overridden.""" + """Tests that strong preferences are taken into account for compilers.""" update_packages_config(packages_yaml) s = spack.concretize.concretize_one(spec_str) for constraint in expected: - assert s.satisfies(constraint), constraint + assert s.satisfies(constraint) for constraint in not_expected: - assert not s.satisfies(constraint), constraint + assert not s.satisfies(constraint) @pytest.mark.parametrize( diff --git a/lib/spack/spack/test/config.py b/lib/spack/spack/test/config.py index 5bc4ff47f07..127d51124be 100644 --- a/lib/spack/spack/test/config.py +++ b/lib/spack/spack/test/config.py @@ -262,10 +262,10 @@ def test_add_config_path(mutable_config): assert set_value == "/path/to/config.yaml" # Now a package:all setting - path = "packages:all:compiler:[gcc]" + path = "packages:all:target:[x86_64]" spack.config.add(path) - compilers = spack.config.get("packages")["all"]["compiler"] - assert "gcc" in compilers + targets = spack.config.get("packages")["all"]["target"] + assert "x86_64" in targets # Try quotes to escape brackets path = ( @@ -909,7 +909,6 @@ def test_single_file_scope(config, env_yaml): # from the single-file config assert spack.config.get("config:verify_ssl") is False assert spack.config.get("config:dirty") is False - assert spack.config.get("packages:all:compiler") == ["gcc@4.5.3", "gcc", "clang"] # from the lower config scopes assert spack.config.get("config:checksum") is True @@ -933,7 +932,7 @@ def test_single_file_scope_section_override(tmpdir, config): verify_ssl: False packages:: all: - compiler: [ 'gcc@4.5.3' ] + target: [ x86_64 ] repos: - /x/y/z """ @@ -946,7 +945,7 @@ def test_single_file_scope_section_override(tmpdir, config): with spack.config.override(scope): # from the single-file config assert spack.config.get("config:verify_ssl") is False - assert spack.config.get("packages:all:compiler") == ["gcc@4.5.3"] + assert spack.config.get("packages:all:target") == ["x86_64"] # from the lower config scopes assert spack.config.get("config:checksum") is True @@ -1221,10 +1220,10 @@ def test_user_config_path_is_default_when_env_var_is_empty(working_env): def test_default_install_tree(monkeypatch, default_config): - s = spack.spec.Spec("nonexistent@x.y.z arch=foo-bar-baz %none@a.b.c") + s = spack.spec.Spec("nonexistent@x.y.z arch=foo-bar-baz") monkeypatch.setattr(s, "dag_hash", lambda length: "abc123") _, _, projections = spack.store.parse_install_tree(spack.config.get("config")) - assert s.format(projections["all"]) == "foo-bar-baz/none-a.b.c/nonexistent-x.y.z-abc123" + assert s.format(projections["all"]) == "foo-baz/nonexistent-x.y.z-abc123" def test_local_config_can_be_disabled(working_env): diff --git a/lib/spack/spack/test/conftest.py b/lib/spack/spack/test/conftest.py index 775985ccc03..88261dd782c 100644 --- a/lib/spack/spack/test/conftest.py +++ b/lib/spack/spack/test/conftest.py @@ -43,8 +43,8 @@ import spack.binary_distribution import spack.bootstrap.core import spack.caches -import spack.compiler -import spack.compilers +import spack.compilers.config +import spack.compilers.libraries import spack.concretize import spack.config import spack.directives_meta @@ -384,23 +384,6 @@ def archspec_host_is_spack_test_host(monkeypatch): monkeypatch.setattr(archspec.cpu, "host", _host) -# -# Disable checks on compiler executable existence -# -@pytest.fixture(scope="function", autouse=True) -def mock_compiler_executable_verification(request, monkeypatch): - """Mock the compiler executable verification to allow missing executables. - - This fixture can be disabled for tests of the compiler verification - functionality by:: - - @pytest.mark.enable_compiler_verification - - If a test is marked in that way this is a no-op.""" - if "enable_compiler_verification" not in request.keywords: - monkeypatch.setattr(spack.compiler.Compiler, "verify_executables", _return_none) - - # Hooks to add command line options or set other custom behaviors. # They must be placed here to be found by pytest. See: # @@ -460,18 +443,6 @@ def no_chdir(): assert os.getcwd() == original_wd -@pytest.fixture(scope="function", autouse=True) -def reset_compiler_cache(): - """Ensure that the compiler cache is not shared across Spack tests - - This cache can cause later tests to fail if left in a state incompatible - with the new configuration. Since tests can make almost unlimited changes - to their setup, default to not use the compiler cache across tests.""" - spack.compilers._compiler_cache = {} - yield - spack.compilers._compiler_cache = {} - - def onerror(func, path, error_info): # Python on Windows is unable to remvove paths without # write (IWUSR) permissions (such as those generated by Git on Windows) @@ -612,16 +583,11 @@ def mock_binary_index(monkeypatch, tmpdir_factory): @pytest.fixture(autouse=True) -def _skip_if_missing_executables(request): +def _skip_if_missing_executables(request, monkeypatch): """Permits to mark tests with 'require_executables' and skip the tests if the executables passed as arguments are not found. """ - if hasattr(request.node, "get_marker"): - # TODO: Remove the deprecated API as soon as we drop support for Python 2.6 - marker = request.node.get_marker("requires_executables") - else: - marker = request.node.get_closest_marker("requires_executables") - + marker = request.node.get_closest_marker("requires_executables") if marker: required_execs = marker.args missing_execs = [x for x in required_execs if spack.util.executable.which(x) is None] @@ -629,6 +595,9 @@ def _skip_if_missing_executables(request): msg = "could not find executables: {0}" pytest.skip(msg.format(", ".join(missing_execs))) + # In case we require a compiler, clear the caches used to speed-up detection + monkeypatch.setattr(spack.compilers.libraries.DefaultDynamicLinkerFilter, "_CACHE", {}) + @pytest.fixture(scope="session") def test_platform(): @@ -809,8 +778,8 @@ def configuration_dir(tmpdir_factory, linux_os): config.write(config_template.read_text().format(install_tree_root, locks)) target = str(archspec.cpu.host().family) - compilers = tmpdir.join("site", "compilers.yaml") - compilers_template = test_config / "compilers.yaml" + compilers = tmpdir.join("site", "packages.yaml") + compilers_template = test_config / "packages.yaml" compilers.write(compilers_template.read_text().format(linux_os=linux_os, target=target)) modules = tmpdir.join("site", "modules.yaml") @@ -914,12 +883,12 @@ def concretize_scope(mutable_config, tmpdir): @pytest.fixture -def no_compilers_yaml(mutable_config): +def no_packages_yaml(mutable_config): """Creates a temporary configuration without compilers.yaml""" for local_config in mutable_config.scopes.values(): if not isinstance(local_config, spack.config.DirectoryConfigScope): continue - compilers_yaml = local_config.get_section_filename("compilers") + compilers_yaml = local_config.get_section_filename("packages") if os.path.exists(compilers_yaml): os.remove(compilers_yaml) return mutable_config @@ -1082,26 +1051,11 @@ def _return_none(*args): return None -def _compiler_output(self): - return "" - - -def _get_real_version(self): - return str(self.version) - - -@pytest.fixture(scope="function", autouse=True) -def disable_compiler_execution(monkeypatch, request): - """Disable compiler execution to determine implicit link paths and libc flavor and version. - To re-enable use `@pytest.mark.enable_compiler_execution`""" - if "enable_compiler_execution" not in request.keywords: - monkeypatch.setattr(spack.compiler.Compiler, "_compile_dummy_c_source", _compiler_output) - monkeypatch.setattr(spack.compiler.Compiler, "get_real_version", _get_real_version) - - @pytest.fixture(autouse=True) def disable_compiler_output_cache(monkeypatch): - monkeypatch.setattr(spack.compiler, "COMPILER_CACHE", spack.compiler.CompilerCache()) + monkeypatch.setattr( + spack.compilers.libraries, "COMPILER_CACHE", spack.compilers.libraries.CompilerCache() + ) @pytest.fixture(scope="function") @@ -2181,15 +2135,11 @@ def create_test_repo(tmpdir, pkg_name_content_tuples): def compiler_factory(): """Factory for a compiler dict, taking a spec and an OS as arguments.""" - def _factory(*, spec, operating_system): + def _factory(*, spec): return { - "compiler": { - "spec": spec, - "operating_system": operating_system, - "paths": {"cc": "/path/to/cc", "cxx": "/path/to/cxx", "f77": None, "fc": None}, - "modules": [], - "target": str(archspec.cpu.host().family), - } + "spec": f"{spec}", + "prefix": "/path", + "extra_attributes": {"compilers": {"c": "/path/bin/cc", "cxx": "/path/bin/cxx"}}, } return _factory @@ -2205,6 +2155,10 @@ def _true(x): return True +def _libc_from_python(self): + return spack.spec.Spec("glibc@=2.28") + + @pytest.fixture() def do_not_check_runtimes_on_reuse(monkeypatch): monkeypatch.setattr(spack.solver.asp, "_has_runtime_dependencies", _true) @@ -2214,8 +2168,11 @@ def do_not_check_runtimes_on_reuse(monkeypatch): def _c_compiler_always_exists(): fn = spack.solver.asp.c_compiler_runs spack.solver.asp.c_compiler_runs = _true + mthd = spack.compilers.libraries.CompilerPropertyDetector.default_libc + spack.compilers.libraries.CompilerPropertyDetector.default_libc = _libc_from_python yield spack.solver.asp.c_compiler_runs = fn + spack.compilers.libraries.CompilerPropertyDetector.default_libc = mthd @pytest.fixture(scope="session") @@ -2294,3 +2251,22 @@ def _include_cache_root(): def mock_include_cache(monkeypatch): """Override the include cache directory so tests don't pollute user cache.""" monkeypatch.setattr(spack.config, "_include_cache_location", _include_cache_root) + + +@pytest.fixture() +def wrapper_dir(install_mockery): + """Installs the compiler wrapper and returns the prefix where the script is installed.""" + wrapper = spack.spec.Spec("compiler-wrapper").concretized() + wrapper_pkg = wrapper.package + PackageInstaller([wrapper_pkg], explicit=True).install() + return wrapper_pkg.bin_dir() + + +def _noop(*args, **kwargs): + pass + + +@pytest.fixture(autouse=True) +def no_compilers_init(monkeypatch): + """Disables automatic compiler initialization""" + monkeypatch.setattr(spack.compilers.config, "_init_packages_yaml", _noop) diff --git a/lib/spack/spack/test/cray_manifest.py b/lib/spack/spack/test/cray_manifest.py index f04a51c0b0d..c19858c7539 100644 --- a/lib/spack/spack/test/cray_manifest.py +++ b/lib/spack/spack/test/cray_manifest.py @@ -18,7 +18,7 @@ import spack import spack.cmd import spack.cmd.external -import spack.compilers +import spack.compilers.config import spack.cray_manifest as cray_manifest import spack.platforms import spack.platforms.test @@ -27,6 +27,13 @@ import spack.store from spack.cray_manifest import compiler_from_entry, entries_to_specs +pytestmark = [ + pytest.mark.skipif( + str(spack.platforms.host()) != "linux", reason="Cray manifest files are only for linux" + ), + pytest.mark.usefixtures("mutable_config", "mock_packages"), +] + class JsonSpecEntry: def __init__(self, name, hash, prefix, version, arch, compiler, dependencies, parameters): @@ -69,27 +76,24 @@ def compiler_json(self): class JsonCompilerEntry: - def __init__(self, name, version, arch=None, executables=None): + def __init__(self, *, name, version, arch=None, executables=None, prefix=None): self.name = name self.version = version - if not arch: - arch = JsonArchEntry("anyplatform", "anyos", "anytarget") - if not executables: - executables = { - "cc": "/path/to/compiler/cc", - "cxx": "/path/to/compiler/cxx", - "fc": "/path/to/compiler/fc", - } - self.arch = arch - self.executables = executables + self.arch = arch or JsonArchEntry("anyplatform", "anyos", "anytarget") + self.executables = executables or {"cc": "cc", "cxx": "cxx", "fc": "fc"} + self.prefix = prefix def compiler_json(self): - return { + result = { "name": self.name, "version": self.version, "arch": self.arch.compiler_json(), "executables": self.executables, } + # See https://github.com/spack/spack/pull/40061 + if self.prefix is not None: + result["prefix"] = self.prefix + return result def spec_json(self): """The compiler spec only lists the name/version, not @@ -178,30 +182,27 @@ def test_manifest_compatibility(_common_arch, _common_compiler, _raw_json_x): assert x_from_entry == _raw_json_x -def test_compiler_from_entry(): - compiler_data = json.loads( - """\ -{ - "name": "gcc", - "prefix": "/path/to/compiler/", - "version": "7.5.0", - "arch": { - "os": "centos8", - "target": "x86_64" - }, - "executables": { - "cc": "/path/to/compiler/cc", - "cxx": "/path/to/compiler/cxx", - "fc": "/path/to/compiler/fc" - } -} -""" +def test_compiler_from_entry(mock_executable): + """Tests that we can detect a compiler from a valid entry in the Cray manifest""" + cc = mock_executable("gcc", output="echo 7.5.0") + cxx = mock_executable("g++", output="echo 7.5.0") + fc = mock_executable("gfortran", output="echo 7.5.0") + + compiler = compiler_from_entry( + JsonCompilerEntry( + name="gcc", + version="7.5.0", + arch=JsonArchEntry(platform="linux", os="centos8", target="x86_64"), + prefix=str(cc.parent), + executables={"cc": "gcc", "cxx": "g++", "fc": "gfortran"}, + ).compiler_json(), + manifest_path="/example/file", ) - compiler = compiler_from_entry(compiler_data, "/example/file") - assert compiler.cc == "/path/to/compiler/cc" - assert compiler.cxx == "/path/to/compiler/cxx" - assert compiler.fc == "/path/to/compiler/fc" - assert compiler.operating_system == "centos8" + + assert compiler.satisfies("gcc@7.5.0 target=x86_64 os=centos8") + assert compiler.extra_attributes["compilers"]["c"] == str(cc) + assert compiler.extra_attributes["compilers"]["cxx"] == str(cxx) + assert compiler.extra_attributes["compilers"]["fortran"] == str(fc) @pytest.fixture @@ -262,7 +263,7 @@ def the_host_is_linux(): cray_arch = JsonArchEntry(platform="cray", os="rhel8", target="x86_64") spec_json = JsonSpecEntry( - name="cray-mpich", + name="mpich", hash="craympichfakehashaaa", prefix="/path/to/cray-mpich/", version="1.0.0", @@ -276,37 +277,19 @@ def the_host_is_linux(): assert spec.architecture.platform == "linux" -def test_translate_compiler_name(_common_arch): - nvidia_compiler = JsonCompilerEntry( - name="nvidia", - version="19.1", - arch=_common_arch, - executables={"cc": "/path/to/compiler/nvc", "cxx": "/path/to/compiler/nvc++"}, - ) - - compiler = compiler_from_entry(nvidia_compiler.compiler_json(), "/example/file") - assert compiler.name == "nvhpc" - - spec_json = JsonSpecEntry( - name="hwloc", - hash="hwlocfakehashaaa", - prefix="/path/to/hwloc-install/", - version="2.0.3", - arch=_common_arch.spec_json(), - compiler=nvidia_compiler.spec_json(), - dependencies={}, - parameters={}, - ).to_dict() - - (spec,) = entries_to_specs([spec_json]).values() - assert spec.compiler.name == "nvhpc" +@pytest.mark.parametrize( + "name_in_manifest,expected_name", + [("nvidia", "nvhpc"), ("rocm", "llvm-amdgpu"), ("clang", "llvm")], +) +def test_translated_compiler_name(name_in_manifest, expected_name): + assert cray_manifest.translated_compiler_name(name_in_manifest) == expected_name def test_failed_translate_compiler_name(_common_arch): unknown_compiler = JsonCompilerEntry(name="unknown", version="1.0") - with pytest.raises(spack.compilers.UnknownCompilerError): - compiler_from_entry(unknown_compiler.compiler_json(), "/example/file") + with pytest.raises(spack.compilers.config.UnknownCompilerError): + compiler_from_entry(unknown_compiler.compiler_json(), manifest_path="/example/file") spec_json = JsonSpecEntry( name="packagey", @@ -319,18 +302,16 @@ def test_failed_translate_compiler_name(_common_arch): parameters={}, ).to_dict() - with pytest.raises(spack.compilers.UnknownCompilerError): + with pytest.raises(spack.compilers.config.UnknownCompilerError): entries_to_specs([spec_json]) @pytest.fixture def manifest_content(generate_openmpi_entries, _common_compiler, _other_compiler): return { - # Note: the cray_manifest module doesn't use the _meta section right - # now, but it is anticipated to be useful "_meta": { "file-type": "cray-pe-json", - "system-type": "test", + "system-type": "EX", "schema-version": "1.3", "cpe-version": "22.06", }, @@ -339,86 +320,60 @@ def manifest_content(generate_openmpi_entries, _common_compiler, _other_compiler } -def test_read_cray_manifest( - tmpdir, mutable_config, mock_packages, mutable_database, manifest_content -): +def test_read_cray_manifest(temporary_store, manifest_file): """Check that (a) we can read the cray manifest and add it to the Spack Database and (b) we can concretize specs based on that. """ - with tmpdir.as_cwd(): - test_db_fname = "external-db.json" - with open(test_db_fname, "w", encoding="utf-8") as db_file: - json.dump(manifest_content, db_file) - cray_manifest.read(test_db_fname, True) - query_specs = spack.store.STORE.db.query("openmpi") - assert any(x.dag_hash() == "openmpifakehasha" for x in query_specs) + cray_manifest.read(str(manifest_file), True) - concretized_specs = spack.cmd.parse_specs( - "depends-on-openmpi ^/openmpifakehasha".split(), concretize=True - ) - assert concretized_specs[0]["hwloc"].dag_hash() == "hwlocfakehashaaa" + query_specs = temporary_store.db.query("openmpi") + assert any(x.dag_hash() == "openmpifakehasha" for x in query_specs) + + concretized_spec = spack.spec.Spec("depends-on-openmpi ^/openmpifakehasha").concretized() + assert concretized_spec["hwloc"].dag_hash() == "hwlocfakehashaaa" -def test_read_cray_manifest_add_compiler_failure( - tmpdir, mutable_config, mock_packages, mutable_database, manifest_content, monkeypatch +def test_read_cray_manifest_add_compiler_failure(temporary_store, manifest_file, monkeypatch): + """Tests the Cray manifest can be read even if some compilers cannot be added.""" + + def _mock(entry, *, manifest_path): + if entry["name"] == "clang": + raise RuntimeError("cannot determine the compiler") + return spack.spec.Spec(f"{entry['name']}@{entry['version']}") + + monkeypatch.setattr(cray_manifest, "compiler_from_entry", _mock) + + cray_manifest.read(str(manifest_file), True) + query_specs = spack.store.STORE.db.query("openmpi") + assert any(x.dag_hash() == "openmpifakehasha" for x in query_specs) + + +def test_read_cray_manifest_twice_no_duplicates( + mutable_config, temporary_store, manifest_file, monkeypatch, tmp_path ): - """Check that cray manifest can be read even if some compilers cannot - be added. - """ - orig_add_compilers_to_config = spack.compilers.add_compilers_to_config + def _mock(entry, *, manifest_path): + return spack.spec.Spec(f"{entry['name']}@{entry['version']}", external_path=str(tmp_path)) - class fail_for_clang: - def __init__(self): - self.called_with_clang = False + monkeypatch.setattr(cray_manifest, "compiler_from_entry", _mock) - def __call__(self, compilers, **kwargs): - if any(x.name == "clang" for x in compilers): - self.called_with_clang = True - raise Exception() - return orig_add_compilers_to_config(compilers, **kwargs) + # Read the manifest twice + cray_manifest.read(str(manifest_file), True) + cray_manifest.read(str(manifest_file), True) - checker = fail_for_clang() - monkeypatch.setattr(spack.compilers, "add_compilers_to_config", checker) + config_data = mutable_config.get("packages")["gcc"] + assert "externals" in config_data - with tmpdir.as_cwd(): - test_db_fname = "external-db.json" - with open(test_db_fname, "w", encoding="utf-8") as db_file: - json.dump(manifest_content, db_file) - cray_manifest.read(test_db_fname, True) - query_specs = spack.store.STORE.db.query("openmpi") - assert any(x.dag_hash() == "openmpifakehasha" for x in query_specs) - - assert checker.called_with_clang + specs = [spack.spec.Spec(x["spec"]) for x in config_data["externals"]] + assert len(specs) == len(set(specs)) + assert len([c for c in specs if c.satisfies("gcc@10.2.0.2112")]) == 1 -def test_read_cray_manifest_twice_no_compiler_duplicates( - tmpdir, mutable_config, mock_packages, mutable_database, manifest_content -): - with tmpdir.as_cwd(): - test_db_fname = "external-db.json" - with open(test_db_fname, "w", encoding="utf-8") as db_file: - json.dump(manifest_content, db_file) - - # Read the manifest twice - cray_manifest.read(test_db_fname, True) - cray_manifest.read(test_db_fname, True) - - compilers = spack.compilers.all_compilers() - filtered = list( - c for c in compilers if c.spec == spack.spec.CompilerSpec("gcc@=10.2.0.2112") - ) - assert len(filtered) == 1 - - -def test_read_old_manifest_v1_2(tmpdir, mutable_config, mock_packages, mutable_database): - """Test reading a file using the older format - ('version' instead of 'schema-version'). - """ - manifest_dir = str(tmpdir.mkdir("manifest_dir")) - manifest_file_path = os.path.join(manifest_dir, "test.json") - with open(manifest_file_path, "w", encoding="utf-8") as manifest_file: - manifest_file.write( - """\ +def test_read_old_manifest_v1_2(tmp_path, temporary_store): + """Test reading a file using the older format ('version' instead of 'schema-version').""" + manifest = tmp_path / "manifest_dir" / "test.json" + manifest.parent.mkdir(parents=True) + manifest.write_text( + """\ { "_meta": { "file-type": "cray-pe-json", @@ -428,11 +383,11 @@ def test_read_old_manifest_v1_2(tmpdir, mutable_config, mock_packages, mutable_d "specs": [] } """ - ) - cray_manifest.read(manifest_file_path, True) + ) + cray_manifest.read(str(manifest), True) -def test_convert_validation_error(tmpdir, mutable_config, mock_packages, mutable_database): +def test_convert_validation_error(tmpdir, mutable_config, mock_packages, temporary_store): manifest_dir = str(tmpdir.mkdir("manifest_dir")) # Does not parse as valid JSON invalid_json_path = os.path.join(manifest_dir, "invalid-json.json") @@ -464,48 +419,40 @@ def test_convert_validation_error(tmpdir, mutable_config, mock_packages, mutable ) with pytest.raises(cray_manifest.ManifestValidationError) as e: cray_manifest.read(invalid_schema_path, True) - str(e) @pytest.fixture -def directory_with_manifest(tmpdir, manifest_content): +def manifest_file(tmp_path, manifest_content): """Create a manifest file in a directory. Used by 'spack external'.""" - with tmpdir.as_cwd(): - test_db_fname = "external-db.json" - with open(test_db_fname, "w", encoding="utf-8") as db_file: - json.dump(manifest_content, db_file) - - yield str(tmpdir) + filename = tmp_path / "external-db.json" + with open(filename, "w", encoding="utf-8") as db_file: + json.dump(manifest_content, db_file) + return filename def test_find_external_nonempty_default_manifest_dir( - mutable_database, mutable_mock_repo, tmpdir, monkeypatch, directory_with_manifest + temporary_store, mutable_mock_repo, tmpdir, monkeypatch, manifest_file ): """The user runs 'spack external find'; the default manifest directory contains a manifest file. Ensure that the specs are read. """ monkeypatch.setenv("PATH", "") - monkeypatch.setattr(spack.cray_manifest, "default_path", str(directory_with_manifest)) + monkeypatch.setattr(spack.cray_manifest, "default_path", str(manifest_file.parent)) spack.cmd.external._collect_and_consume_cray_manifest_files(ignore_default_dir=False) - specs = spack.store.STORE.db.query("hwloc") + specs = temporary_store.db.query("hwloc") assert any(x.dag_hash() == "hwlocfakehashaaa" for x in specs) -def test_reusable_externals_cray_manifest( - tmpdir, mutable_config, mock_packages, temporary_store, manifest_content -): +def test_reusable_externals_cray_manifest(temporary_store, manifest_file): """The concretizer should be able to reuse specs imported from a manifest without a externals config entry in packages.yaml""" - with tmpdir.as_cwd(): - with open("external-db.json", "w", encoding="utf-8") as f: - json.dump(manifest_content, f) - cray_manifest.read(path="external-db.json", apply_updates=True) + cray_manifest.read(path=str(manifest_file), apply_updates=True) - # Get any imported spec - spec = temporary_store.db.query_local()[0] + # Get any imported spec + spec = temporary_store.db.query_local()[0] - # Reusable if imported locally - assert spack.solver.asp._is_reusable(spec, packages={}, local=True) + # Reusable if imported locally + assert spack.solver.asp._is_reusable(spec, packages={}, local=True) - # If cray manifest entries end up in a build cache somehow, they are not reusable - assert not spack.solver.asp._is_reusable(spec, packages={}, local=False) + # If cray manifest entries end up in a build cache somehow, they are not reusable + assert not spack.solver.asp._is_reusable(spec, packages={}, local=False) diff --git a/lib/spack/spack/test/data/config/compilers.yaml b/lib/spack/spack/test/data/config/compilers.yaml deleted file mode 100644 index 0d5345130ac..00000000000 --- a/lib/spack/spack/test/data/config/compilers.yaml +++ /dev/null @@ -1,41 +0,0 @@ -compilers: -- compiler: - spec: gcc@=9.4.0 - operating_system: {linux_os.name}{linux_os.version} - paths: - cc: /path/to/gcc - cxx: /path/to/g++ - f77: None - fc: None - modules: [] - target: {target} -- compiler: - spec: gcc@=9.4.0 - operating_system: redhat6 - paths: - cc: /path/to/gcc - cxx: /path/to/g++ - f77: None - fc: None - modules: [] - target: {target} -- compiler: - spec: clang@=15.0.0 - operating_system: {linux_os.name}{linux_os.version} - paths: - cc: /path/to/clang - cxx: /path/to/clang++ - f77: None - fc: None - modules: [] - target: {target} -- compiler: - spec: gcc@=10.2.1 - operating_system: {linux_os.name}{linux_os.version} - paths: - cc: /path/to/gcc - cxx: /path/to/g++ - f77: None - fc: None - modules: [] - target: {target} diff --git a/lib/spack/spack/test/data/config/packages.yaml b/lib/spack/spack/test/data/config/packages.yaml index 25fbe888c5e..537a8af2053 100644 --- a/lib/spack/spack/test/data/config/packages.yaml +++ b/lib/spack/spack/test/data/config/packages.yaml @@ -1,30 +1,35 @@ packages: all: - compiler: [gcc, clang] providers: - mpi: [openmpi, mpich, zmpi] + c: [gcc, llvm] + cxx: [gcc, llvm] + fortran: [gcc] + fortran-rt: [gcc-runtime] + libc: [glibc] + libgfortran: [gcc-runtime] + mpi: [mpich, zmpi] lapack: [openblas-with-lapack] blas: [openblas] externaltool: buildable: False externals: - - spec: externaltool@1.0%gcc@10.2.1 + - spec: externaltool@1.0 prefix: /path/to/external_tool - - spec: externaltool@0.9%gcc@10.2.1 + - spec: externaltool@0.9 prefix: /usr - - spec: externaltool@0_8%gcc@10.2.1 + - spec: externaltool@0_8 prefix: /usr externalvirtual: buildable: False externals: - - spec: externalvirtual@2.0%clang@15.0.0 + - spec: externalvirtual@2.0 prefix: /path/to/external_virtual_clang - - spec: externalvirtual@1.0%gcc@10.2.1 + - spec: externalvirtual@1.0 prefix: /path/to/external_virtual_gcc externalmodule: buildable: False externals: - - spec: externalmodule@1.0%gcc@4.5.0 + - spec: externalmodule@1.0 modules: - external-module 'requires-virtual': @@ -51,3 +56,34 @@ packages: prefix: /usr version-test-dependency-preferred: version: ['5.2.5'] + + # Compilers + gcc: + externals: + - spec: "gcc@9.4.0 languages='c,c++' os={linux_os.name}{linux_os.version} target={target}" + prefix: /path + extra_attributes: + compilers: + c: /path/bin/gcc + cxx: /path/bin/g++ + - spec: "gcc@9.4.0 languages='c,c++' os=redhat6 target={target}" + prefix: /path + extra_attributes: + compilers: + c: /path/bin/gcc + cxx: /path/bin/g++ + - spec: "gcc@10.2.1 languages='c,c++,fortran' os={linux_os.name}{linux_os.version} target={target}" + prefix: /path + extra_attributes: + compilers: + c: /path/bin/gcc-10 + cxx: /path/bin/g++-10 + fortran: /path/bin/gfortran-10 + llvm: + externals: + - spec: "llvm@15.0.0 +clang os={linux_os.name}{linux_os.version} target={target}" + prefix: /path + extra_attributes: + compilers: + c: /path/bin/clang + cxx: /path/bin/clang++ diff --git a/lib/spack/spack/test/database.py b/lib/spack/spack/test/database.py index 4862a04071b..425a6b3f0bc 100644 --- a/lib/spack/spack/test/database.py +++ b/lib/spack/spack/test/database.py @@ -95,11 +95,11 @@ def upstream_and_downstream_db(tmpdir, gen_mock_layout): @pytest.mark.parametrize( "install_tree,result", [ - ("all", ["pkg-b", "pkg-c"]), + ("all", ["pkg-b", "pkg-c", "gcc-runtime", "gcc", "compiler-wrapper"]), ("upstream", ["pkg-c"]), - ("local", ["pkg-b"]), + ("local", ["pkg-b", "gcc-runtime", "gcc", "compiler-wrapper"]), ("{u}", ["pkg-c"]), - ("{d}", ["pkg-b"]), + ("{d}", ["pkg-b", "gcc-runtime", "gcc", "compiler-wrapper"]), ], ids=["all", "upstream", "local", "upstream_path", "downstream_path"], ) @@ -117,7 +117,7 @@ def test_query_by_install_tree( down_db.add(b) specs = down_db.query(install_tree=install_tree.format(u=up_db.root, d=down_db.root)) - assert [s.name for s in specs] == result + assert {s.name for s in specs} == set(result) def test_spec_installed_upstream( @@ -491,7 +491,7 @@ def test_005_db_exists(database): def test_010_all_install_sanity(database): """Ensure that the install layout reflects what we think it does.""" all_specs = spack.store.STORE.layout.all_specs() - assert len(all_specs) == 15 + assert len(all_specs) == 17 # Query specs with multiple configurations mpileaks_specs = [s for s in all_specs if s.satisfies("mpileaks")] @@ -608,7 +608,7 @@ def test_050_basic_query(database): """Ensure querying database is consistent with what is installed.""" # query everything total_specs = len(spack.store.STORE.db.query()) - assert total_specs == 17 + assert total_specs == 20 # query specs with multiple configurations mpileaks_specs = database.query("mpileaks") @@ -827,11 +827,11 @@ def check_unused(roots, deptype, expected): assert set(u.name for u in unused) == set(expected) default_dt = dt.LINK | dt.RUN - check_unused(None, default_dt, ["cmake"]) + check_unused(None, default_dt, ["cmake", "gcc", "compiler-wrapper"]) check_unused( [si, ml_mpich, ml_mpich2, ml_zmpi, externaltest], default_dt, - ["trivial-smoke-test", "cmake"], + ["trivial-smoke-test", "cmake", "gcc", "compiler-wrapper"], ) check_unused( [si, ml_mpich, ml_mpich2, ml_zmpi, externaltest], @@ -846,7 +846,15 @@ def check_unused(roots, deptype, expected): check_unused( [si, ml_mpich, ml_mpich2, ml_zmpi], default_dt, - ["trivial-smoke-test", "cmake", "externaltest", "externaltool", "externalvirtual"], + [ + "trivial-smoke-test", + "cmake", + "externaltest", + "externaltool", + "externalvirtual", + "gcc", + "compiler-wrapper", + ], ) @@ -1080,7 +1088,7 @@ def test_check_parents(spec_str, parent_name, expected_nparents, database): def test_db_all_hashes(database): # ensure we get the right number of hashes without a read transaction hashes = database.all_hashes() - assert len(hashes) == 17 + assert len(hashes) == 20 # and make sure the hashes match with database.read_transaction(): diff --git a/lib/spack/spack/test/directory_layout.py b/lib/spack/spack/test/directory_layout.py index 668e6b67d61..9578d0e4ba6 100644 --- a/lib/spack/spack/test/directory_layout.py +++ b/lib/spack/spack/test/directory_layout.py @@ -34,11 +34,7 @@ def test_yaml_directory_layout_parameters(tmpdir, default_mock_concretization): layout_default = DirectoryLayout(str(tmpdir)) path_default = layout_default.relative_path_for_spec(spec) assert path_default == str( - Path( - spec.format( - "{architecture}/" "{compiler.name}-{compiler.version}/" "{name}-{version}-{hash}" - ) - ) + Path(spec.format("{architecture.platform}-{architecture.target}/{name}-{version}-{hash}")) ) # Test hash_length parameter works correctly @@ -51,7 +47,7 @@ def test_yaml_directory_layout_parameters(tmpdir, default_mock_concretization): assert len(path_default) - len(path_7) == 25 # Test path_scheme - arch, compiler, package7 = path_7.split(os.sep) + arch, package7 = path_7.split(os.sep) projections_package7 = {"all": "{name}-{version}-{hash:7}"} layout_package7 = DirectoryLayout(str(tmpdir), projections=projections_package7) path_package7 = layout_package7.relative_path_for_spec(spec) diff --git a/lib/spack/spack/test/env.py b/lib/spack/spack/test/env.py index 9fe67c878c0..a888c88d99b 100644 --- a/lib/spack/spack/test/env.py +++ b/lib/spack/spack/test/env.py @@ -969,3 +969,31 @@ def test_env_include_configs(mutable_mock_env_path, mock_packages): python_reqs = spack.config.get("packages")["python"]["require"] req_specs = set(x["spec"] for x in python_reqs) assert req_specs == set(["@3.11:"]) + + +def test_using_multiple_compilers_on_a_node_is_discouraged( + tmp_path, mutable_config, mock_packages +): + """Tests that when we specify % Spack tries to use that compiler for all the + languages needed by that node. + """ + manifest = tmp_path / "spack.yaml" + manifest.write_text( + """\ +spack: + specs: + - mpileaks%clang ^mpich%gcc + concretizer: + unify: true +""" + ) + with ev.Environment(tmp_path) as e: + e.concretize() + mpileaks = e.concrete_roots()[0] + + assert not mpileaks.satisfies("%gcc") and mpileaks.satisfies("%clang") + assert len(mpileaks.dependencies(virtuals=("c", "cxx"))) == 1 + + mpich = mpileaks["mpich"] + assert mpich.satisfies("%gcc") and not mpich.satisfies("%clang") + assert len(mpich.dependencies(virtuals=("c", "cxx"))) == 1 diff --git a/lib/spack/spack/test/graph.py b/lib/spack/spack/test/graph.py index 1de96712234..e82358c02aa 100644 --- a/lib/spack/spack/test/graph.py +++ b/lib/spack/spack/test/graph.py @@ -50,40 +50,66 @@ def test_ascii_graph_mpileaks(config, mock_packages, monkeypatch): graph_str == r"""o mpileaks |\ -| o callpath -|/| -o | mpich - / -o dyninst -|\ -| o libdwarf -|/ -o libelf -""" - or graph_str - == r"""o mpileaks -|\ -o | callpath -|\| -| o mpich -| -o dyninst -|\ -o | libdwarf -|/ -o libelf -""" - or graph_str - == r"""o mpileaks -|\ -| o callpath -|/| -| o dyninst | |\ -o | | mpich - / / -| o libdwarf +| | |\ +| | | |\ +| | | | o callpath +| |_|_|/| +|/| |_|/| +| |/| |/| +| | |/|/| +| | | | o dyninst +| | |_|/| +| |/| |/| +| | |/|/| +| | | | |\ +o | | | | | mpich +|\| | | | | +|\ \ \ \ \ \ +| |_|/ / / / +|/| | | | | +| |/ / / / +| | | | o libdwarf +| |_|_|/| +|/| |_|/| +| |/| |/| +| | |/|/ +| | | o libelf +| |_|/| +|/| |/| +| |/|/ +| o | compiler-wrapper +| / +| o gcc-runtime |/ -o libelf +o gcc +""" + or graph_str + == r"""o mpileaks +|\ +| |\ +| | |\ +| | | o callpath +| |_|/| +|/| |/| +| |/|/| +| | | o dyninst +| | |/| +| |/|/| +| | | |\ +o | | | | mpich +|\| | | | +| |/ / / +|/| | | +| | | o libdwarf +| |_|/| +|/| |/| +| |/|/ +| | o libelf +| |/| +|/|/ +| o gcc-runtime +|/ +o gcc """ ) diff --git a/lib/spack/spack/test/installer.py b/lib/spack/spack/test/installer.py index 54ef9a4b1bf..862f04cc038 100644 --- a/lib/spack/spack/test/installer.py +++ b/lib/spack/spack/test/installer.py @@ -1023,11 +1023,11 @@ def test_install_fail_multi(install_mockery, mock_fetch, monkeypatch): def test_install_fail_fast_on_detect(install_mockery, monkeypatch, capsys): """Test fail_fast install when an install failure is detected.""" - b = spack.concretize.concretize_one("pkg-b") - c = spack.concretize.concretize_one("pkg-c") + # Note: this test depends on the order of the installations + b, c = spack.concretize.concretize_one("pkg-b"), spack.concretize.concretize_one("pkg-c") b_id, c_id = inst.package_id(b), inst.package_id(c) - installer = create_installer([b, c], {"fail_fast": True}) + installer = create_installer([c, b], {"fail_fast": True}) # Make sure all packages are identified as failed # This will prevent b from installing, which will cause the build of c to be skipped. @@ -1036,9 +1036,9 @@ def test_install_fail_fast_on_detect(install_mockery, monkeypatch, capsys): 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" - assert c_id not in installer.failed, "Expected no attempt to install pkg-c" - assert f"{b_id} failed to install" in capsys.readouterr().err + assert c_id in installer.failed + assert b_id not in installer.failed, "Expected no attempt to install pkg-c" + assert f"{c_id} failed to install" in capsys.readouterr().err def _test_install_fail_fast_on_except_patch(installer, **kwargs): @@ -1071,10 +1071,11 @@ def test_install_fail_fast_on_except(install_mockery, monkeypatch, capsys): def test_install_lock_failures(install_mockery, monkeypatch, capfd): """Cover basic install lock failure handling in a single pass.""" + # Note: this test relies on installing a package with no dependencies def _requeued(installer, task, install_status): tty.msg("requeued {0}".format(task.pkg.spec.name)) - installer = create_installer(["pkg-b"], {}) + installer = create_installer(["pkg-c"], {}) # Ensure never acquire a lock monkeypatch.setattr(inst.PackageInstaller, "_ensure_locked", _not_locked) @@ -1093,13 +1094,14 @@ def _requeued(installer, task, install_status): def test_install_lock_installed_requeue(install_mockery, monkeypatch, capfd): """Cover basic install handling for installed package.""" - b = spack.concretize.concretize_one("pkg-b") - b_pkg_id = inst.package_id(b) - installer = create_installer([b]) + # Note: this test relies on installing a package with no dependencies + concrete_spec = spack.concretize.concretize_one("pkg-c") + pkg_id = inst.package_id(concrete_spec) + installer = create_installer([concrete_spec]) def _prep(installer, task): - installer.installed.add(b_pkg_id) - tty.msg(f"{b_pkg_id} is installed") + installer.installed.add(pkg_id) + tty.msg(f"{pkg_id} is installed") # also do not allow the package to be locked again monkeypatch.setattr(inst.PackageInstaller, "_ensure_locked", _not_locked) @@ -1116,7 +1118,7 @@ def _requeued(installer, task, install_status): with pytest.raises(spack.error.InstallError, match="request failed"): installer.install() - assert b_pkg_id not in installer.installed + assert pkg_id not in installer.installed expected = ["is installed", "read locked", "requeued"] for exp, ln in zip(expected, capfd.readouterr().out.splitlines()): @@ -1125,6 +1127,7 @@ def _requeued(installer, task, install_status): def test_install_read_locked_requeue(install_mockery, monkeypatch, capfd): """Cover basic read lock handling for uninstalled package with requeue.""" + # Note: this test relies on installing a package with no dependencies orig_fn = inst.PackageInstaller._ensure_locked def _read(installer, lock_type, pkg): @@ -1147,7 +1150,7 @@ def _requeued(installer, task, install_status): # Ensure don't continually requeue the task monkeypatch.setattr(inst.PackageInstaller, "_requeue_task", _requeued) - installer = create_installer(["pkg-b"], {}) + installer = create_installer(["pkg-c"], {}) with pytest.raises(spack.error.InstallError, match="request failed"): installer.install() @@ -1162,7 +1165,8 @@ def _requeued(installer, task, install_status): def test_install_skip_patch(install_mockery, mock_fetch): """Test the path skip_patch install path.""" - installer = create_installer(["pkg-b"], {"fake": False, "skip_patch": True}) + # Note: this test relies on installing a package with no dependencies + installer = create_installer(["pkg-c"], {"fake": False, "skip_patch": True}) installer.install() assert inst.package_id(installer.build_requests[0].pkg.spec) in installer.installed @@ -1182,8 +1186,9 @@ def test_overwrite_install_backup_success(temporary_store, config, mock_packages When doing an overwrite install that fails, Spack should restore the backup of the original prefix, and leave the original spec marked installed. """ + # Note: this test relies on installing a package with no dependencies # Get a build task. TODO: refactor this to avoid calling internal methods - installer = create_installer(["pkg-b"]) + installer = create_installer(["pkg-c"]) installer._init_queue() task = installer._pop_task() @@ -1224,6 +1229,7 @@ def test_overwrite_install_backup_failure(temporary_store, config, mock_packages original prefix. If that fails, the spec is lost, and it should be removed from the database. """ + # Note: this test relies on installing a package with no dependencies class InstallerThatAccidentallyDeletesTheBackupDir: def _install_task(self, task, install_status): @@ -1243,7 +1249,7 @@ def remove(self, spec): self.called = True # Get a build task. TODO: refactor this to avoid calling internal methods - installer = create_installer(["pkg-b"]) + installer = create_installer(["pkg-c"]) installer._init_queue() task = installer._pop_task() diff --git a/lib/spack/spack/test/link_paths.py b/lib/spack/spack/test/link_paths.py index a8eb90e5767..5c07c8e9877 100644 --- a/lib/spack/spack/test/link_paths.py +++ b/lib/spack/spack/test/link_paths.py @@ -7,8 +7,9 @@ import pytest +import spack.compilers.libraries import spack.paths -from spack.compiler import _parse_non_system_link_dirs +from spack.compilers.libraries import parse_non_system_link_dirs drive = "" if sys.platform == "win32": @@ -25,13 +26,13 @@ def allow_nonexistent_paths(monkeypatch): # Allow nonexistent paths to be detected as part of the output # for testing purposes. - monkeypatch.setattr(os.path, "isdir", lambda x: True) + monkeypatch.setattr(spack.compilers.libraries, "filter_non_existing_dirs", lambda x: x) def check_link_paths(filename, paths): with open(os.path.join(datadir, filename), encoding="utf-8") as file: output = file.read() - detected_paths = _parse_non_system_link_dirs(output) + detected_paths = parse_non_system_link_dirs(output) actual = detected_paths expected = paths diff --git a/lib/spack/spack/test/llnl/util/lang.py b/lib/spack/spack/test/llnl/util/lang.py index dbdcb1dea84..7769ac05d8f 100644 --- a/lib/spack/spack/test/llnl/util/lang.py +++ b/lib/spack/spack/test/llnl/util/lang.py @@ -6,7 +6,6 @@ import re import sys from datetime import datetime, timedelta -from textwrap import dedent import pytest @@ -290,13 +289,6 @@ def inner(): with h.forward("top-level"): raise TypeError("ok") - assert h.grouped_message(with_tracebacks=False) == dedent( - """\ - due to the following failures: - inner method raised ValueError: wow! - top-level raised TypeError: ok""" - ) - def test_grouped_exception_base_type(): h = llnl.util.lang.GroupedExceptionHandler() diff --git a/lib/spack/spack/test/modules/lmod.py b/lib/spack/spack/test/modules/lmod.py index 5bd0d73cd15..f066a31f0a5 100644 --- a/lib/spack/spack/test/modules/lmod.py +++ b/lib/spack/spack/test/modules/lmod.py @@ -112,7 +112,7 @@ def test_compilers_provided_different_name( self, factory, module_configuration, compiler_factory ): with spack.config.override( - "compilers", [compiler_factory(spec="clang@3.3", operating_system="debian6")] + "packages", {"llvm": {"externals": [compiler_factory(spec="llvm@3.3")]}} ): module_configuration("complex_hierarchy") module, spec = factory("intel-oneapi-compilers%clang@3.3") @@ -120,7 +120,7 @@ def test_compilers_provided_different_name( provides = module.conf.provides assert "compiler" in provides - assert provides["compiler"] == spack.spec.CompilerSpec("oneapi@=3.0") + assert provides["compiler"] == spack.spec.Spec("intel-oneapi-compilers@=3.0") def test_simple_case(self, modulefile_content, module_configuration): """Tests the generation of a simple Lua module file.""" @@ -139,7 +139,7 @@ def test_autoload_direct(self, modulefile_content, module_configuration): module_configuration("autoload_direct") content = modulefile_content(mpileaks_spec_string) - assert len([x for x in content if "depends_on(" in x]) == 2 + assert len([x for x in content if "depends_on(" in x]) == 3 def test_autoload_all(self, modulefile_content, module_configuration): """Tests the automatic loading of all dependencies.""" @@ -147,7 +147,7 @@ def test_autoload_all(self, modulefile_content, module_configuration): module_configuration("autoload_all") content = modulefile_content(mpileaks_spec_string) - assert len([x for x in content if "depends_on(" in x]) == 5 + assert len([x for x in content if "depends_on(" in x]) == 6 def test_alter_environment(self, modulefile_content, module_configuration): """Tests modifications to run-time environment.""" @@ -265,7 +265,7 @@ def test_exclude(self, modulefile_content, module_configuration): module_configuration("exclude") content = modulefile_content(mpileaks_spec_string) - assert len([x for x in content if "depends_on(" in x]) == 1 + assert len([x for x in content if "depends_on(" in x]) == 2 def test_no_hash(self, factory, module_configuration): """Makes sure that virtual providers (in the hierarchy) always @@ -372,7 +372,7 @@ def test_guess_core_compilers(self, factory, module_configuration, monkeypatch): module_configuration("missing_core_compilers") # Our mock paths must be detected as system paths - monkeypatch.setattr(spack.util.environment, "SYSTEM_DIRS", ["/path/to"]) + monkeypatch.setattr(spack.util.environment, "SYSTEM_DIRS", ["/path/bin"]) # We don't want to really write into user configuration # when running tests @@ -434,7 +434,7 @@ def test_modules_relative_to_view( ): with ev.create_in_dir(str(tmpdir), with_view=True) as e: module_configuration("with_view") - install("--add", "cmake") + install("--fake", "--add", "cmake") spec = spack.concretize.concretize_one("cmake") diff --git a/lib/spack/spack/test/modules/tcl.py b/lib/spack/spack/test/modules/tcl.py index 33cb66b333e..61ef2dd641b 100644 --- a/lib/spack/spack/test/modules/tcl.py +++ b/lib/spack/spack/test/modules/tcl.py @@ -45,8 +45,8 @@ def test_autoload_direct(self, modulefile_content, module_configuration): len([x for x in content if "if {![info exists ::env(LMOD_VERSION_MAJOR)]} {" in x]) == 1 ) - assert len([x for x in content if "depends-on " in x]) == 2 - assert len([x for x in content if "module load " in x]) == 2 + assert len([x for x in content if "depends-on " in x]) == 3 + assert len([x for x in content if "module load " in x]) == 3 # dtbuild1 has # - 1 ('run',) dependency @@ -76,8 +76,8 @@ def test_autoload_all(self, modulefile_content, module_configuration): len([x for x in content if "if {![info exists ::env(LMOD_VERSION_MAJOR)]} {" in x]) == 1 ) - assert len([x for x in content if "depends-on " in x]) == 5 - assert len([x for x in content if "module load " in x]) == 5 + assert len([x for x in content if "depends-on " in x]) == 6 + assert len([x for x in content if "module load " in x]) == 6 # dtbuild1 has # - 1 ('run',) dependency @@ -101,7 +101,7 @@ def test_prerequisites_direct( module_configuration("prerequisites_direct") content = modulefile_content(f"mpileaks target={host_architecture_str}") - assert len([x for x in content if "prereq" in x]) == 2 + assert len([x for x in content if "prereq" in x]) == 3 def test_prerequisites_all( self, modulefile_content, module_configuration, host_architecture_str @@ -111,7 +111,7 @@ def test_prerequisites_all( module_configuration("prerequisites_all") content = modulefile_content(f"mpileaks target={host_architecture_str}") - assert len([x for x in content if "prereq" in x]) == 5 + assert len([x for x in content if "prereq" in x]) == 6 def test_alter_environment(self, modulefile_content, module_configuration): """Tests modifications to run-time environment.""" @@ -236,14 +236,14 @@ def test_exclude(self, modulefile_content, module_configuration, host_architectu module_configuration("exclude") content = modulefile_content("mpileaks ^zmpi") - assert len([x for x in content if "module load " in x]) == 1 + assert len([x for x in content if "module load " in x]) == 2 with pytest.raises(FileNotFoundError): modulefile_content(f"callpath target={host_architecture_str}") content = modulefile_content(f"zmpi target={host_architecture_str}") - assert len([x for x in content if "module load " in x]) == 1 + assert len([x for x in content if "module load " in x]) == 2 def test_naming_scheme_compat(self, factory, module_configuration): """Tests backwards compatibility for naming_scheme key""" @@ -481,8 +481,8 @@ def test_autoload_with_constraints(self, modulefile_content, module_configuratio # Test the mpileaks that should have the autoloaded dependencies content = modulefile_content("mpileaks ^mpich2") - assert len([x for x in content if "depends-on " in x]) == 2 - assert len([x for x in content if "module load " in x]) == 2 + assert len([x for x in content if "depends-on " in x]) == 3 + assert len([x for x in content if "module load " in x]) == 3 # Test the mpileaks that should NOT have the autoloaded dependencies content = modulefile_content("mpileaks ^mpich") diff --git a/lib/spack/spack/test/multimethod.py b/lib/spack/spack/test/multimethod.py index c1c6ea28be4..454095cd1b9 100644 --- a/lib/spack/spack/test/multimethod.py +++ b/lib/spack/spack/test/multimethod.py @@ -7,7 +7,6 @@ import pytest import spack.concretize -import spack.config import spack.platforms from spack.multimethod import NoSuchMethodError @@ -53,7 +52,7 @@ def test_no_version_match(pkg_name): # Constraints on compilers with a default ("%gcc", "has_a_default", "gcc"), ("%clang", "has_a_default", "clang"), - ("os=elcapitan %apple-clang", "has_a_default", "default"), + ("%gcc@9", "has_a_default", "default"), # Constraints on dependencies ("^zmpi", "different_by_dep", "zmpi"), ("^mpich", "different_by_dep", "mpich"), @@ -68,13 +67,9 @@ def test_no_version_match(pkg_name): ], ) def test_multimethod_calls( - pkg_name, constraint_str, method_name, expected_result, compiler_factory + pkg_name, constraint_str, method_name, expected_result, default_mock_concretization ): - # Add apple-clang, as it is required by one of the tests - with spack.config.override( - "compilers", [compiler_factory(spec="apple-clang@9.1.0", operating_system="elcapitan")] - ): - s = spack.concretize.concretize_one(f"{pkg_name} {constraint_str}") + s = default_mock_concretization(f"{pkg_name}{constraint_str}") msg = f"Method {method_name} from {s} is giving a wrong result" assert getattr(s.package, method_name)() == expected_result, msg diff --git a/lib/spack/spack/test/oci/integration_test.py b/lib/spack/spack/test/oci/integration_test.py index 6c059727139..88e1b617eeb 100644 --- a/lib/spack/spack/test/oci/integration_test.py +++ b/lib/spack/spack/test/oci/integration_test.py @@ -15,12 +15,15 @@ import pytest +import spack import spack.binary_distribution import spack.database +import spack.deptypes as dt import spack.environment as ev import spack.error import spack.oci.opener import spack.spec +import spack.traverse from spack.main import SpackCommand from spack.oci.image import Digest, ImageReference, default_config, default_manifest from spack.oci.oci import blob_exists, get_manifest_and_config, upload_blob, upload_manifest @@ -82,7 +85,13 @@ def test_buildcache_tag(install_mockery, mock_fetch, mutable_mock_env_path): name = ImageReference.from_string("example.com/image:full_env") with ev.read("test") as e: - specs = [x for x in e.all_specs() if not x.external] + specs = [ + x + for x in spack.traverse.traverse_nodes( + e.concrete_roots(), deptype=dt.LINK | dt.RUN + ) + if not x.external + ] manifest, config = get_manifest_and_config(name) @@ -99,7 +108,9 @@ def test_buildcache_tag(install_mockery, mock_fetch, mutable_mock_env_path): name = ImageReference.from_string("example.com/image:single_spec") manifest, config = get_manifest_and_config(name) - assert len(manifest["layers"]) == len([x for x in libelf.traverse() if not x.external]) + assert len(manifest["layers"]) == len( + [x for x in libelf.traverse(deptype=dt.LINK | dt.RUN) if not x.external] + ) def test_buildcache_push_with_base_image_command(mutable_database, tmpdir): diff --git a/lib/spack/spack/test/package_class.py b/lib/spack/spack/test/package_class.py index 7edec99fabe..3e014647d3e 100644 --- a/lib/spack/spack/test/package_class.py +++ b/lib/spack/spack/test/package_class.py @@ -16,7 +16,6 @@ import llnl.util.filesystem as fs import spack.binary_distribution -import spack.compilers import spack.concretize import spack.deptypes as dt import spack.error @@ -30,21 +29,28 @@ from spack.solver.input_analysis import NoStaticAnalysis, StaticAnalysis +@pytest.fixture(scope="module") +def compiler_names(mock_repo_path): + return [spec.name for spec in mock_repo_path.providers_for("c")] + + @pytest.fixture() -def mpileaks_possible_deps(mock_packages, mpi_names): +def mpileaks_possible_deps(mock_packages, mpi_names, compiler_names): possible = { - "callpath": set(["dyninst"] + mpi_names), + "callpath": set(["dyninst"] + mpi_names + compiler_names), "low-priority-provider": set(), - "dyninst": set(["libdwarf", "libelf"]), + "dyninst": set(["libdwarf", "libelf"] + compiler_names), "fake": set(), + "gcc": set(compiler_names), "intel-parallel-studio": set(), - "libdwarf": set(["libelf"]), - "libelf": set(), - "mpich": set(), - "mpich2": set(), - "mpileaks": set(["callpath"] + mpi_names), + "libdwarf": set(["libelf"] + compiler_names), + "libelf": set(compiler_names), + "llvm": {"gcc", "llvm"}, + "mpich": set(compiler_names), + "mpich2": set(compiler_names), + "mpileaks": set(["callpath"] + mpi_names + compiler_names), "multi-provider-mpi": set(), - "zmpi": set(["fake"]), + "zmpi": set(["fake"] + compiler_names), } return possible @@ -76,6 +82,8 @@ def mpi_names(mock_inspector): { "fake", "mpileaks", + "gcc", + "llvm", "multi-provider-mpi", "callpath", "dyninst", @@ -113,8 +121,13 @@ def test_possible_dependencies(pkg_name, fn_kwargs, expected, mock_runtimes, moc def test_possible_dependencies_virtual(mock_inspector, mock_packages, mock_runtimes, mpi_names): expected = set(mpi_names) for name in mpi_names: - expected.update(dep for dep in mock_packages.get_pkg_class(name).dependencies_by_name()) + expected.update( + dep + for dep in mock_packages.get_pkg_class(name).dependencies_by_name() + if not mock_packages.is_virtual(dep) + ) expected.update(mock_runtimes) + expected.update(s.name for s in mock_packages.providers_for("c")) real_pkgs, *_ = mock_inspector.possible_dependencies( "mpi", transitive=False, allowed_deps=dt.ALL @@ -284,18 +297,15 @@ def test_package_fetcher_fails(): def test_package_test_no_compilers(mock_packages, monkeypatch, capfd): - def compilers(compiler, arch_spec): - return None - - monkeypatch.setattr(spack.compilers, "compilers_for_spec", compilers) - + """Ensures that a test which needs the compiler, and build dependencies, to run, is skipped + if no compiler is available. + """ s = spack.spec.Spec("pkg-a") pkg = BaseTestPackage(s) pkg.test_requires_compiler = True pkg.do_test() error = capfd.readouterr()[1] assert "Skipping tests for package" in error - assert "test requires missing compiler" in error def test_package_subscript(default_mock_concretization): diff --git a/lib/spack/spack/test/packages.py b/lib/spack/spack/test/packages.py index 9c4b1142a78..2912c689079 100644 --- a/lib/spack/spack/test/packages.py +++ b/lib/spack/spack/test/packages.py @@ -69,7 +69,7 @@ def test_inheritance_of_directives(self): # Check dictionaries that should have been filled by directives dependencies = pkg_cls.dependencies_by_name() - assert len(dependencies) == 3 + assert len(dependencies) == 4 assert "cmake" in dependencies assert "openblas" in dependencies assert "mpi" in dependencies diff --git a/lib/spack/spack/test/solver/intermediate.py b/lib/spack/spack/test/solver/intermediate.py deleted file mode 100644 index 8a99906d15a..00000000000 --- a/lib/spack/spack/test/solver/intermediate.py +++ /dev/null @@ -1,49 +0,0 @@ -# Copyright Spack Project Developers. See COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) -"""Unit tests for objects turning configuration into an intermediate format used by the solver.""" -import pytest - -import spack.compilers -import spack.spec -from spack.concretize import UnavailableCompilerVersionError -from spack.solver import asp - - -class TestCompilerParser: - def test_expected_order_mock_config(self, config): - """Tests the expected preference order in the mock compiler configuration""" - parser = asp.CompilerParser(config) - expected_order = ["gcc@=10.2.1", "gcc@=9.4.0", "gcc@=9.4.0", "clang@=15.0.0"] - for c, expected in zip(parser.possible_compilers(), expected_order): - assert c.spec.satisfies(expected) - - @pytest.mark.parametrize("spec_str", ["a %gcc@=13.2.0", "a ^b %gcc@=13.2.0"]) - def test_compiler_from_input_raise(self, spec_str, config): - """Tests that having an unknown compiler in the input spec raises an exception, if we - don't allow bootstrapping missing compilers. - """ - spec = spack.spec.Spec(spec_str) - with pytest.raises(UnavailableCompilerVersionError): - asp.CompilerParser(config).with_input_specs([spec]) - - def test_compilers_inferred_from_concrete_specs(self, mutable_config, mutable_database): - """Test that compilers inferred from concrete specs, that are not in the local - configuration too, are last in the preference order. - """ - spack.compilers.remove_compiler_from_config("gcc@=10.2.1") - assert not spack.compilers.compilers_for_spec("gcc@=10.2.1") - - parser = asp.CompilerParser(mutable_config) - for reuse_spec in mutable_database.query(): - parser.add_compiler_from_concrete_spec(reuse_spec) - - expected_order = [ - ("gcc@=9.4.0", True), - ("gcc@=9.4.0", True), - ("clang@=15.0.0", True), - ("gcc@=10.2.1", False), - ] - for c, (expected, available) in zip(parser.possible_compilers(), expected_order): - assert c.spec.satisfies(expected) - assert c.available is available diff --git a/lib/spack/spack/test/spec_dag.py b/lib/spack/spack/test/spec_dag.py index 2b5a18e3ea2..885930d51bd 100644 --- a/lib/spack/spack/test/spec_dag.py +++ b/lib/spack/spack/test/spec_dag.py @@ -9,6 +9,7 @@ import spack.concretize import spack.deptypes as dt import spack.error +import spack.installer import spack.repo import spack.util.hash as hashutil import spack.version @@ -80,8 +81,7 @@ def test_test_deptype(tmpdir): assert "z" not in spec -@pytest.mark.usefixtures("config") -def test_installed_deps(monkeypatch, mock_packages): +def test_installed_deps(monkeypatch, install_mockery): """Ensure that concrete specs and their build deps don't constrain solves. Preinstall a package ``c`` that has a constrained build dependency on ``d``, then @@ -101,7 +101,7 @@ def test_installed_deps(monkeypatch, mock_packages): # |/ \| c --> d build # d e c --> e build/link # - a, b, c, d, e = ["installed-deps-%s" % s for s in "abcde"] + a, b, c, d, e = [f"installed-deps-{s}" for s in "abcde"] # install C, which will force d's version to be 2 # BUT d is only a build dependency of C, so it won't constrain @@ -110,19 +110,12 @@ def test_installed_deps(monkeypatch, mock_packages): c_spec = spack.concretize.concretize_one(c) assert c_spec[d].version == spack.version.Version("2") - installed_names = [s.name for s in c_spec.traverse()] - - def _mock_installed(self): - return self.name in installed_names - - monkeypatch.setattr(Spec, "installed", _mock_installed) + spack.installer.PackageInstaller([c_spec.package], fake=True, explicit=True).install() # install A, which depends on B, C, D, and E, and force A to # use the installed C. It should *not* force A to use the installed D # *if* we're doing a fresh installation. - a_spec = Spec(a) - a_spec._add_dependency(c_spec, depflag=dt.BUILD | dt.LINK, virtuals=()) - a_spec = spack.concretize.concretize_one(a_spec) + a_spec = spack.concretize.concretize_one(f"{a} ^/{c_spec.dag_hash()}") assert spack.version.Version("2") == a_spec[c][d].version assert spack.version.Version("2") == a_spec[e].version assert spack.version.Version("3") == a_spec[b][d].version @@ -183,120 +176,267 @@ def test_conflicting_package_constraints(self, set_dependency): with pytest.raises(spack.error.UnsatisfiableSpecError): spack.concretize.concretize_one(spec) - def test_preorder_node_traversal(self): - dag = spack.concretize.concretize_one("mpileaks ^zmpi") + @pytest.mark.parametrize( + "pairs,traverse_kwargs", + [ + # Preorder node traversal + ( + [ + (0, "mpileaks"), + (1, "callpath"), + (2, "compiler-wrapper"), + (2, "dyninst"), + (3, "gcc"), + (3, "gcc-runtime"), + (3, "libdwarf"), + (4, "libelf"), + (2, "zmpi"), + (3, "fake"), + ], + {}, + ), + # Preorder edge traversal + ( + [ + (0, "mpileaks"), + (1, "callpath"), + (2, "compiler-wrapper"), + (2, "dyninst"), + (3, "compiler-wrapper"), + (3, "gcc"), + (3, "gcc-runtime"), + (4, "gcc"), + (3, "libdwarf"), + (4, "compiler-wrapper"), + (4, "gcc"), + (4, "gcc-runtime"), + (4, "libelf"), + (5, "compiler-wrapper"), + (5, "gcc"), + (5, "gcc-runtime"), + (3, "libelf"), + (2, "gcc"), + (2, "gcc-runtime"), + (2, "zmpi"), + (3, "compiler-wrapper"), + (3, "fake"), + (3, "gcc"), + (3, "gcc-runtime"), + (1, "compiler-wrapper"), + (1, "gcc"), + (1, "gcc-runtime"), + (1, "zmpi"), + ], + {"cover": "edges"}, + ), + # Preorder path traversal + ( + [ + (0, "mpileaks"), + (1, "callpath"), + (2, "compiler-wrapper"), + (2, "dyninst"), + (3, "compiler-wrapper"), + (3, "gcc"), + (3, "gcc-runtime"), + (4, "gcc"), + (3, "libdwarf"), + (4, "compiler-wrapper"), + (4, "gcc"), + (4, "gcc-runtime"), + (5, "gcc"), + (4, "libelf"), + (5, "compiler-wrapper"), + (5, "gcc"), + (5, "gcc-runtime"), + (6, "gcc"), + (3, "libelf"), + (4, "compiler-wrapper"), + (4, "gcc"), + (4, "gcc-runtime"), + (5, "gcc"), + (2, "gcc"), + (2, "gcc-runtime"), + (3, "gcc"), + (2, "zmpi"), + (3, "compiler-wrapper"), + (3, "fake"), + (3, "gcc"), + (3, "gcc-runtime"), + (4, "gcc"), + (1, "compiler-wrapper"), + (1, "gcc"), + (1, "gcc-runtime"), + (2, "gcc"), + (1, "zmpi"), + (2, "compiler-wrapper"), + (2, "fake"), + (2, "gcc"), + (2, "gcc-runtime"), + (3, "gcc"), + ], + {"cover": "paths"}, + ), + # Postorder node traversal + ( + [ + (2, "compiler-wrapper"), + (3, "gcc"), + (3, "gcc-runtime"), + (4, "libelf"), + (3, "libdwarf"), + (2, "dyninst"), + (3, "fake"), + (2, "zmpi"), + (1, "callpath"), + (0, "mpileaks"), + ], + {"order": "post"}, + ), + # Postorder edge traversal + ( + [ + (2, "compiler-wrapper"), + (3, "compiler-wrapper"), + (3, "gcc"), + (4, "gcc"), + (3, "gcc-runtime"), + (4, "compiler-wrapper"), + (4, "gcc"), + (4, "gcc-runtime"), + (5, "compiler-wrapper"), + (5, "gcc"), + (5, "gcc-runtime"), + (4, "libelf"), + (3, "libdwarf"), + (3, "libelf"), + (2, "dyninst"), + (2, "gcc"), + (2, "gcc-runtime"), + (3, "compiler-wrapper"), + (3, "fake"), + (3, "gcc"), + (3, "gcc-runtime"), + (2, "zmpi"), + (1, "callpath"), + (1, "compiler-wrapper"), + (1, "gcc"), + (1, "gcc-runtime"), + (1, "zmpi"), + (0, "mpileaks"), + ], + {"cover": "edges", "order": "post"}, + ), + # Postorder path traversal + ( + [ + (2, "compiler-wrapper"), + (3, "compiler-wrapper"), + (3, "gcc"), + (4, "gcc"), + (3, "gcc-runtime"), + (4, "compiler-wrapper"), + (4, "gcc"), + (5, "gcc"), + (4, "gcc-runtime"), + (5, "compiler-wrapper"), + (5, "gcc"), + (6, "gcc"), + (5, "gcc-runtime"), + (4, "libelf"), + (3, "libdwarf"), + (4, "compiler-wrapper"), + (4, "gcc"), + (5, "gcc"), + (4, "gcc-runtime"), + (3, "libelf"), + (2, "dyninst"), + (2, "gcc"), + (3, "gcc"), + (2, "gcc-runtime"), + (3, "compiler-wrapper"), + (3, "fake"), + (3, "gcc"), + (4, "gcc"), + (3, "gcc-runtime"), + (2, "zmpi"), + (1, "callpath"), + (1, "compiler-wrapper"), + (1, "gcc"), + (2, "gcc"), + (1, "gcc-runtime"), + (2, "compiler-wrapper"), + (2, "fake"), + (2, "gcc"), + (3, "gcc"), + (2, "gcc-runtime"), + (1, "zmpi"), + (0, "mpileaks"), + ], + {"cover": "paths", "order": "post"}, + ), + ], + ) + def test_traversal(self, pairs, traverse_kwargs, default_mock_concretization): + r"""Tests different traversals of the following graph - names = ["mpileaks", "callpath", "dyninst", "libdwarf", "libelf", "zmpi", "fake"] - pairs = list(zip([0, 1, 2, 3, 4, 2, 3], names)) + o mpileaks@2.3/3qeg7jx + |\ + | |\ + | | |\ + | | | |\ + | | | | |\ + | | | | | o callpath@1.0/4gilijr + | |_|_|_|/| + |/| |_|_|/| + | |/| |_|/| + | | |/| |/| + | | | |/|/| + | | | | | o dyninst@8.2/u4oymb3 + | | |_|_|/| + | |/| |_|/| + | | |/| |/| + | | | |/|/| + | | | | | |\ + o | | | | | | mpich@3.0.4/g734fu6 + |\| | | | | | + |\ \ \ \ \ \ \ + | |_|/ / / / / + |/| | | | | | + | |\ \ \ \ \ \ + | | |_|/ / / / + | |/| | | | | + | | |/ / / / + | | | | | o libdwarf@20130729/q5r7l2r + | |_|_|_|/| + |/| |_|_|/| + | |/| |_|/| + | | |/| |/| + | | | |/|/ + | | | | o libelf@0.8.13/i2x6pya + | |_|_|/| + |/| |_|/| + | |/| |/| + | | |/|/ + | | o | compiler-wrapper@1.0/njdili2 + | | / + o | | gcc-runtime@10.5.0/iyytqeo + |\| | + | |/ + |/| + | o gcc@10.5.0/ljeisd4 + | + o glibc@2.31/tbyn33w + """ + dag = default_mock_concretization("mpileaks ^zmpi") + names = [x for _, x in pairs] - traversal = dag.traverse() - assert [x.name for x in traversal] == names - - traversal = dag.traverse(depth=True) + traversal = dag.traverse(**traverse_kwargs, depth=True) assert [(x, y.name) for x, y in traversal] == pairs - def test_preorder_edge_traversal(self): - dag = spack.concretize.concretize_one("mpileaks ^zmpi") - - names = [ - "mpileaks", - "callpath", - "dyninst", - "libdwarf", - "libelf", - "libelf", - "zmpi", - "fake", - "zmpi", - ] - pairs = list(zip([0, 1, 2, 3, 4, 3, 2, 3, 1], names)) - - traversal = dag.traverse(cover="edges") + traversal = dag.traverse(**traverse_kwargs) assert [x.name for x in traversal] == names - traversal = dag.traverse(cover="edges", depth=True) - assert [(x, y.name) for x, y in traversal] == pairs - - def test_preorder_path_traversal(self): - dag = spack.concretize.concretize_one("mpileaks ^zmpi") - - names = [ - "mpileaks", - "callpath", - "dyninst", - "libdwarf", - "libelf", - "libelf", - "zmpi", - "fake", - "zmpi", - "fake", - ] - pairs = list(zip([0, 1, 2, 3, 4, 3, 2, 3, 1, 2], names)) - - traversal = dag.traverse(cover="paths") - assert [x.name for x in traversal] == names - - traversal = dag.traverse(cover="paths", depth=True) - assert [(x, y.name) for x, y in traversal] == pairs - - def test_postorder_node_traversal(self): - dag = spack.concretize.concretize_one("mpileaks ^zmpi") - - names = ["libelf", "libdwarf", "dyninst", "fake", "zmpi", "callpath", "mpileaks"] - pairs = list(zip([4, 3, 2, 3, 2, 1, 0], names)) - - traversal = dag.traverse(order="post") - assert [x.name for x in traversal] == names - - traversal = dag.traverse(depth=True, order="post") - assert [(x, y.name) for x, y in traversal] == pairs - - def test_postorder_edge_traversal(self): - dag = spack.concretize.concretize_one("mpileaks ^zmpi") - - names = [ - "libelf", - "libdwarf", - "libelf", - "dyninst", - "fake", - "zmpi", - "callpath", - "zmpi", - "mpileaks", - ] - pairs = list(zip([4, 3, 3, 2, 3, 2, 1, 1, 0], names)) - - traversal = dag.traverse(cover="edges", order="post") - assert [x.name for x in traversal] == names - - traversal = dag.traverse(cover="edges", depth=True, order="post") - assert [(x, y.name) for x, y in traversal] == pairs - - def test_postorder_path_traversal(self): - dag = spack.concretize.concretize_one("mpileaks ^zmpi") - - names = [ - "libelf", - "libdwarf", - "libelf", - "dyninst", - "fake", - "zmpi", - "callpath", - "fake", - "zmpi", - "mpileaks", - ] - pairs = list(zip([4, 3, 3, 2, 3, 2, 1, 2, 1, 0], names)) - - traversal = dag.traverse(cover="paths", order="post") - assert [x.name for x in traversal] == names - - traversal = dag.traverse(cover="paths", depth=True, order="post") - assert [(x, y.name) for x, y in traversal] == pairs - def test_dependents_and_dependencies_are_correct(self): spec = Spec.from_literal( { @@ -739,10 +879,10 @@ def test_spec_tree_respect_deptypes(self): "query,expected_length,expected_satisfies", [ ({"virtuals": ["mpi"]}, 1, ["mpich", "mpi"]), - ({"depflag": dt.BUILD}, 2, ["mpich", "mpi", "callpath"]), + ({"depflag": dt.BUILD}, 4, ["mpich", "mpi", "callpath"]), ({"depflag": dt.BUILD, "virtuals": ["mpi"]}, 1, ["mpich", "mpi"]), - ({"depflag": dt.LINK}, 2, ["mpich", "mpi", "callpath"]), - ({"depflag": dt.BUILD | dt.LINK}, 2, ["mpich", "mpi", "callpath"]), + ({"depflag": dt.LINK}, 3, ["mpich", "mpi", "callpath"]), + ({"depflag": dt.BUILD | dt.LINK}, 5, ["mpich", "mpi", "callpath"]), ({"virtuals": ["lapack"]}, 0, []), ], ) @@ -751,12 +891,14 @@ def test_query_dependency_edges( ): """Tests querying edges to dependencies on the following DAG: - [ ] mpileaks@=2.3 - [bl ] ^callpath@=1.0 - [bl ] ^dyninst@=8.2 - [bl ] ^libdwarf@=20130729 - [bl ] ^libelf@=0.8.13 - [bl ] ^mpich@=3.0.4 + - [ ] mpileaks@2.3 + - [bl ] ^callpath@1.0 + - [bl ] ^dyninst@8.2 + - [bl ] ^libdwarf@20130729 + - [bl ] ^libelf@0.8.13 + [e] [b ] ^gcc@10.1.0 + - [ l ] ^gcc-runtime@10.1.0 + - [bl ] ^mpich@3.0.4~debug """ mpileaks = default_mock_concretization("mpileaks") edges = mpileaks.edges_to_dependencies(**query) @@ -822,8 +964,8 @@ def test_synthetic_construction_of_split_dependencies_from_same_package(mock_pac root.add_dependency_edge(build_spec, depflag=dt.BUILD, virtuals=()) # Check dependencies from the perspective of root - assert len(root.dependencies()) == 2 - assert all(x.name == "pkg-c" for x in root.dependencies()) + assert len(root.dependencies()) == 5 + assert len([x for x in root.dependencies() if x.name == "pkg-c"]) == 2 assert "@2.0" in root.dependencies(name="pkg-c", deptype=dt.BUILD)[0] assert "@1.0" in root.dependencies(name="pkg-c", deptype=dt.LINK | dt.RUN)[0] @@ -847,8 +989,7 @@ def test_synthetic_construction_bootstrapping(mock_packages, config): root.add_dependency_edge(bootstrap, depflag=dt.BUILD, virtuals=()) - assert len(root.dependencies()) == 1 - assert root.dependencies()[0].name == "pkg-b" + assert len([x for x in root.dependencies() if x.name == "pkg-b"]) == 1 assert root.name == "pkg-b" @@ -867,8 +1008,8 @@ def test_addition_of_different_deptypes_in_multiple_calls(mock_packages, config) root.add_dependency_edge(bootstrap, depflag=current_depflag, virtuals=()) # Check edges in dependencies - assert len(root.edges_to_dependencies()) == 1 - forward_edge = root.edges_to_dependencies(depflag=current_depflag)[0] + assert len(root.edges_to_dependencies(name="pkg-b")) == 1 + forward_edge = root.edges_to_dependencies(depflag=current_depflag, name="pkg-b")[0] assert current_depflag & forward_edge.depflag assert id(forward_edge.parent) == id(root) assert id(forward_edge.spec) == id(bootstrap) diff --git a/lib/spack/spack/test/spec_semantics.py b/lib/spack/spack/test/spec_semantics.py index d782cbb8d49..382c852d8e0 100644 --- a/lib/spack/spack/test/spec_semantics.py +++ b/lib/spack/spack/test/spec_semantics.py @@ -18,15 +18,7 @@ import spack.variant import spack.version as vn from spack.error import SpecError, UnsatisfiableSpecError -from spack.spec import ( - ArchSpec, - CompilerSpec, - DependencySpec, - Spec, - SpecFormatSigilError, - SpecFormatStringError, - UnsupportedCompilerError, -) +from spack.spec import ArchSpec, DependencySpec, Spec, SpecFormatSigilError, SpecFormatStringError from spack.variant import ( InvalidVariantValueError, MultipleValuesInExclusiveVariantError, @@ -460,8 +452,6 @@ def test_concrete_specs_which_satisfies_abstract(self, lhs, rhs, default_mock_co ("foo platform=linux", "platform=test os=redhat6 target=x86"), ("foo os=redhat6", "platform=test os=debian6 target=x86_64"), ("foo target=x86_64", "platform=test os=redhat6 target=x86"), - ("foo%intel", "%gcc"), - ("foo%intel", "%gcc"), ("foo%gcc@4.3", "%gcc@4.4:4.6"), ("foo@4.0%gcc", "@1:3%gcc"), ("foo@4.0%gcc@4.5", "@1:3%gcc@4.4:4.6"), @@ -794,6 +784,7 @@ def test_virtual_index(self): ("libelf^foo", "libelf^foo+debug"), ("libelf^foo", "libelf^foo~debug"), ("libelf", "^foo"), + ("mpileaks ^callpath %gcc@14", "mpileaks ^callpath %gcc@14.1"), ], ) def test_lhs_is_changed_when_constraining(self, lhs, rhs): @@ -827,6 +818,7 @@ def test_lhs_is_changed_when_constraining(self, lhs, rhs): ("libelf^foo+debug", "libelf^foo+debug"), ("libelf^foo~debug", "libelf^foo~debug"), ('libelf^foo cppflags="-O3"', 'libelf^foo cppflags="-O3"'), + ("mpileaks ^callpath %gcc@14.1", "mpileaks ^callpath %gcc@14"), ], ) def test_lhs_is_not_changed_when_constraining(self, lhs, rhs): @@ -937,7 +929,6 @@ def check_prop(check_spec, fmt_str, prop, getter): "{name}", "{version}", "{@version}", - "{%compiler}", "{namespace}", "{ namespace=namespace}", "{ namespace =namespace}", @@ -1513,15 +1504,16 @@ def test_unsatisfiable_virtual_deps_bindings(self, spec_str): ("git-test@git.foo/bar", "{name}-{version}", str(pathlib.Path("git-test-git.foo_bar"))), ("git-test@git.foo/bar", "{name}-{version}-{/hash}", None), ("git-test@git.foo/bar", "{name}/{version}", str(pathlib.Path("git-test", "git.foo_bar"))), + # {compiler} is 'none' if a package does not depend on C, C++, or Fortran ( - "git-test@{0}=1.0%gcc".format("a" * 40), + f"git-test@{'a' * 40}=1.0%gcc", "{name}/{version}/{compiler}", - str(pathlib.Path("git-test", "{0}_1.0".format("a" * 40), "gcc")), + str(pathlib.Path("git-test", f"{'a' * 40}_1.0", "none")), ), ( "git-test@git.foo/bar=1.0%gcc", "{name}/{version}/{compiler}", - str(pathlib.Path("git-test", "git.foo_bar_1.0", "gcc")), + str(pathlib.Path("git-test", "git.foo_bar_1.0", "none")), ), ], ) @@ -1705,12 +1697,19 @@ def test_call_dag_hash_on_old_dag_hash_spec(mock_packages, default_mock_concreti def test_spec_trim(mock_packages, config): top = spack.concretize.concretize_one("dt-diamond") top.trim("dt-diamond-left") - remaining = set(x.name for x in top.traverse()) - assert set(["dt-diamond", "dt-diamond-right", "dt-diamond-bottom"]) == remaining + remaining = {x.name for x in top.traverse()} + assert { + "compiler-wrapper", + "dt-diamond", + "dt-diamond-right", + "dt-diamond-bottom", + "gcc-runtime", + "gcc", + } == remaining top.trim("dt-diamond-right") - remaining = set(x.name for x in top.traverse()) - assert set(["dt-diamond"]) == remaining + remaining = {x.name for x in top.traverse()} + assert {"compiler-wrapper", "dt-diamond", "gcc-runtime", "gcc"} == remaining @pytest.mark.regression("30861") @@ -1740,11 +1739,6 @@ def test_concretize_partial_old_dag_hash_spec(mock_packages, config): assert not getattr(spec["dt-diamond-bottom"], "_package_hash", None) -def test_unsupported_compiler(): - with pytest.raises(UnsupportedCompilerError): - Spec("gcc%fake-compiler").validate_or_raise() - - def test_package_hash_affects_dunder_and_dag_hash(mock_packages, default_mock_concretization): a1 = default_mock_concretization("pkg-a") a2 = default_mock_concretization("pkg-a") @@ -1815,10 +1809,10 @@ def test_abstract_contains_semantic(lhs, rhs, expected, mock_packages): (ArchSpec, "None-ubuntu20.04-None", "None-ubuntu20.04-None", (True, True, True)), (ArchSpec, "None-ubuntu20.04-None", "None-ubuntu22.04-None", (False, False, False)), # Compiler - (CompilerSpec, "gcc", "clang", (False, False, False)), - (CompilerSpec, "gcc", "gcc@5", (True, False, True)), - (CompilerSpec, "gcc@5", "gcc@5.3", (True, False, True)), - (CompilerSpec, "gcc@5", "gcc@5-tag", (True, False, True)), + (Spec, "gcc", "clang", (False, False, False)), + (Spec, "gcc", "gcc@5", (True, False, True)), + (Spec, "gcc@5", "gcc@5.3", (True, False, True)), + (Spec, "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", (True, False, False)), @@ -1840,6 +1834,10 @@ def test_abstract_contains_semantic(lhs, rhs, expected, mock_packages): (Spec, "target=:haswell", "target=x86_64_v4:", (False, False, False)), # Edge case of uarch that split in a diamond structure, from a common ancestor (Spec, "target=:cascadelake", "target=:cannonlake", (False, False, False)), + # Spec with compilers + (Spec, "mpileaks %gcc@5", "mpileaks %gcc@6", (False, False, False)), + (Spec, "mpileaks ^callpath %gcc@5", "mpileaks ^callpath %gcc@6", (False, False, False)), + (Spec, "mpileaks ^callpath %gcc@5", "mpileaks ^callpath %gcc@5.4", (True, False, True)), ], ) def test_intersects_and_satisfies(factory, lhs_str, rhs_str, results): @@ -1884,8 +1882,8 @@ def test_intersects_and_satisfies(factory, lhs_str, rhs_str, results): "None-ubuntu20.04-nocona,haswell", ), # Compiler - (CompilerSpec, "gcc@5", "gcc@5-tag", True, "gcc@5-tag"), - (CompilerSpec, "gcc@5", "gcc@5", False, "gcc@5"), + (Spec, "foo %gcc@5", "foo %gcc@5-tag", True, "foo %gcc@5-tag"), + (Spec, "foo %gcc@5", "foo %gcc@5", False, "foo %gcc@5"), # Flags (Spec, "cppflags=-foo", "cppflags=-foo", False, "cppflags=-foo"), (Spec, "cppflags=-foo", "cflags=-foo", True, "cppflags=-foo cflags=-foo"), @@ -2010,3 +2008,63 @@ def test_comparison_after_breaking_hash_change(): y = Spec.from_dict(after_breakage) assert x != y assert len({x, y}) == 2 + + +def test_satisfies_and_subscript_with_compilers(default_mock_concretization): + """Tests the semantic of "satisfies" and __getitem__ for the following spec: + + [ ] multivalue-variant@2.3 + [bl ] ^callpath@1.0 + [bl ] ^dyninst@8.2 + [bl ] ^libdwarf@20130729 + [bl ] ^libelf@0.8.13 + [b ] ^gcc@10.2.1 + [ l ] ^gcc-runtime@10.2.1 + [bl ] ^mpich@3.0.4 + [bl ] ^pkg-a@2.0 + [b ] ^gmake@4.4 + [bl ] ^pkg-b@1.0 + """ + s = default_mock_concretization("multivalue-variant") + + # Check a direct build/link dependency + assert s.satisfies("^pkg-a") + assert s.dependencies(name="pkg-a")[0] == s["pkg-a"] + + # Transitive build/link dependency + assert s.satisfies("^libelf") + assert s["libdwarf"].dependencies(name="libelf")[0] == s["libelf"] + + # Direct build dependencies + assert s.satisfies("^[virtuals=c] gcc") + assert s.dependencies(name="gcc")[0] == s["gcc"] + assert s.dependencies(name="gcc")[0] == s["c"] + + # Transitive build dependencies + assert s.satisfies("^gmake") + + # "gmake" is not in the link/run subdag + direct build deps + with pytest.raises(KeyError): + _ = s["gmake"] + + # We need to pass through "pkg-a" to get "gmake" with [] notation + assert s["pkg-a"].dependencies(name="gmake")[0] == s["pkg-a"]["gmake"] + + +@pytest.mark.parametrize( + "spec_str,spec_fmt,expected", + [ + # Depends on C + ("mpileaks", "{name}-{compiler.name}", "mpileaks-gcc"), + ("mpileaks", "{name}-{compiler.name}-{compiler.version}", "mpileaks-gcc-10.2.1"), + # No compiler + ("pkg-c", "{name}-{compiler.name}", "pkg-c-none"), + ("pkg-c", "{name}-{compiler.name}-{compiler.version}", "pkg-c-none-none"), + ], +) +def test_spec_format_with_compiler_adaptors( + spec_str, spec_fmt, expected, default_mock_concretization +): + """Tests the output of spec format, when involving `Spec.compiler` adaptors""" + s = default_mock_concretization(spec_str) + assert s.format(spec_fmt) == expected diff --git a/lib/spack/spack/test/spec_syntax.py b/lib/spack/spack/test/spec_syntax.py index 40a1cac2417..f9e08915afb 100644 --- a/lib/spack/spack/test/spec_syntax.py +++ b/lib/spack/spack/test/spec_syntax.py @@ -13,6 +13,7 @@ import spack.concretize import spack.platforms.test import spack.repo +import spack.solver.asp import spack.spec from spack.spec_parser import ( UNIX_FILENAME, @@ -222,8 +223,8 @@ def _specfile_for(spec_str, filename): Token(SpecTokens.UNQUALIFIED_PACKAGE_NAME, value="stackwalker"), Token(SpecTokens.VERSION, value="@8.1_1e"), ], - "mvapich_foo ^_openmpi@1.2:1.4,1.6 cppflags=-O3 +debug~qt_4 %intel@12.1 " - "^stackwalker@8.1_1e", + "mvapich_foo ^_openmpi@1.2:1.4,1.6 cppflags=-O3 +debug~qt_4 %intel@12.1" + " ^stackwalker@8.1_1e", ), # Specs containing YAML or JSON in the package name ( @@ -602,6 +603,42 @@ def _specfile_for(spec_str, filename): ], "zlib foo==bar", ), + # Compilers specifying virtuals + ( + "zlib %[virtuals=c] gcc", + [ + Token(SpecTokens.UNQUALIFIED_PACKAGE_NAME, "zlib"), + Token(SpecTokens.COMPILER_WITH_VIRTUALS, "%[virtuals=c] gcc"), + ], + "zlib %[virtuals=c] gcc", + ), + ( + "zlib %[virtuals=c,cxx] gcc", + [ + Token(SpecTokens.UNQUALIFIED_PACKAGE_NAME, "zlib"), + Token(SpecTokens.COMPILER_WITH_VIRTUALS, "%[virtuals=c,cxx] gcc"), + ], + "zlib %[virtuals=c,cxx] gcc", + ), + ( + "zlib %[virtuals=c,cxx] gcc@14.1", + [ + Token(SpecTokens.UNQUALIFIED_PACKAGE_NAME, "zlib"), + Token(SpecTokens.COMPILER_AND_VERSION_WITH_VIRTUALS, "%[virtuals=c,cxx] gcc@14.1"), + ], + "zlib %[virtuals=c,cxx] gcc@14.1", + ), + ( + "zlib %[virtuals=fortran] gcc@14.1 %[virtuals=c,cxx] clang", + [ + Token(SpecTokens.UNQUALIFIED_PACKAGE_NAME, "zlib"), + Token( + SpecTokens.COMPILER_AND_VERSION_WITH_VIRTUALS, "%[virtuals=fortran] gcc@14.1" + ), + Token(SpecTokens.COMPILER_WITH_VIRTUALS, "%[virtuals=c,cxx] clang"), + ], + "zlib %[virtuals=fortran] gcc@14.1 %[virtuals=c,cxx] clang", + ), ], ) def test_parse_single_spec(spec_str, tokens, expected_roundtrip, mock_git_test_package): @@ -818,13 +855,10 @@ def test_dep_spec_by_hash(database, config): assert "zmpi" in mpileaks_hash_fake assert mpileaks_hash_fake["zmpi"] == spack.spec.Spec("zmpi") - mpileaks_hash_zmpi = SpecParser( - f"mpileaks %{mpileaks_zmpi.compiler} ^ /{zmpi.dag_hash()}" - ).next_spec() + mpileaks_hash_zmpi = SpecParser(f"mpileaks ^ /{zmpi.dag_hash()}").next_spec() mpileaks_hash_zmpi.replace_hash() assert "zmpi" in mpileaks_hash_zmpi assert mpileaks_hash_zmpi["zmpi"] == zmpi - assert mpileaks_zmpi.compiler.satisfies(mpileaks_hash_zmpi.compiler) mpileaks_hash_fake_and_zmpi = SpecParser( f"mpileaks ^/{fake.dag_hash()[:4]} ^ /{zmpi.dag_hash()[:5]}" @@ -985,13 +1019,6 @@ def test_disambiguate_hash_by_spec(spec1, spec2, constraint, mock_packages, monk ("x@1.2%y@1.2@2.3:2.4", "version"), # Duplicate dependency ("x ^y@1 ^y@2", "Cannot depend on incompatible specs"), - # Duplicate compiler - ("x%intel%intel", "compiler"), - ("x%intel%gcc", "compiler"), - ("x%gcc%intel", "compiler"), - ("x ^y%intel%intel", "compiler"), - ("x ^y%intel%gcc", "compiler"), - ("x ^y%gcc%intel", "compiler"), # Duplicate Architectures ("x arch=linux-rhel7-x86_64 arch=linux-rhel7-x86_64", "two architectures"), ("x arch=linux-rhel7-x86_64 arch=linux-rhel7-ppc64le", "two architectures"), @@ -1146,7 +1173,7 @@ def test_parse_filename_missing_slash_as_spec(specfile_for, tmpdir, filename): ) # make sure that only happens when the spec ends in yaml - with pytest.raises(spack.repo.UnknownPackageError) as exc_info: + with pytest.raises(spack.solver.asp.UnsatisfiableSpecError) as exc_info: spack.concretize.concretize_one(SpecParser("builtin.mock.doesnotexist").next_spec()) assert not exc_info.value.long_message or ( "Did you mean to specify a filename with" not in exc_info.value.long_message diff --git a/lib/spack/spack/test/spec_yaml.py b/lib/spack/spack/test/spec_yaml.py index fd11cce3704..13f7b65a1f8 100644 --- a/lib/spack/spack/test/spec_yaml.py +++ b/lib/spack/spack/test/spec_yaml.py @@ -428,6 +428,11 @@ def test_load_json_specfiles(specfile, expected_hash, reader_cls): for edge in s2.traverse_edges(): assert isinstance(edge.virtuals, tuple), edge + # Ensure we can format {compiler} tokens + assert s2.format("{compiler}") != "none" + assert s2.format("{compiler.name}") == "gcc" + assert s2.format("{compiler.version}") != "none" + def test_anchorify_1(): """Test that anchorify replaces duplicate values with references to a single instance, and @@ -497,3 +502,10 @@ def test_pickle_roundtrip_for_abstract_specs(spec_str): t = pickle.loads(pickle.dumps(s)) assert s == t assert str(s) == str(t) + + +def test_specfile_alias_is_updated(): + """Tests that the SpecfileLatest alias gets updated on a Specfile version bump""" + specfile_class_name = f"SpecfileV{spack.spec.SPECFILE_FORMAT_VERSION}" + specfile_cls = getattr(spack.spec, specfile_class_name) + assert specfile_cls is spack.spec.SpecfileLatest diff --git a/lib/spack/spack/test/tag.py b/lib/spack/spack/test/tag.py index fe4d93dc2a4..3a4e953dfbb 100644 --- a/lib/spack/spack/test/tag.py +++ b/lib/spack/spack/test/tag.py @@ -85,7 +85,7 @@ def test_tag_get_available(tags, expected, mock_packages): def test_tag_get_installed_packages(mock_packages, mock_archive, mock_fetch, install_mockery): - install("mpich") + install("--fake", "mpich") for skip in [False, True]: all_pkgs = spack.tag.packages_with_tags(None, True, skip) diff --git a/lib/spack/spack/test/util/remote_file_cache.py b/lib/spack/spack/test/util/remote_file_cache.py index 1835527d4a6..4f421922c39 100644 --- a/lib/spack/spack/test/util/remote_file_cache.py +++ b/lib/spack/spack/test/util/remote_file_cache.py @@ -51,10 +51,10 @@ def test_rfc_remote_local_path_no_dest(): _ = rfc_util.local_path(path, "") -compilers_sha256 = ( - "381732677538143a8f900406c0654f2730e2919a11740bdeaf35757ab3e1ef3e" - if sys.platform == "win32" - else "e91148ed5a0da7844e9f3f9cfce0fa60cce509461886bc3b006ee9eb711f69df" +packages_yaml_sha256 = ( + "8b69d9c6e983dfb8bac2ddc3910a86265cffdd9c85f905c716d426ec5b0d9847" + if sys.platform != "win32" + else "182a5cdfdd88f50be23e55607b46285854c664c064e5a9f3f1e0200ebca6a1db" ) @@ -67,7 +67,8 @@ def test_rfc_remote_local_path_no_dest(): ValueError, "Requires sha256", ), - (f"{gitlab_url}/compilers.yaml", compilers_sha256, None, ""), + # This is the packages.yaml in lib/spack/spack/test/data/config + (f"{gitlab_url}/packages.yaml", packages_yaml_sha256, None, ""), (f"{gitlab_url}/packages.yaml", "abcdef", ValueError, "does not match"), (f"{github_url.format('blob')}/README.md", "", OSError, "No such"), (github_url.format("tree"), "", OSError, "No such"), diff --git a/pytest.ini b/pytest.ini index 79d187fa70d..79db8545913 100644 --- a/pytest.ini +++ b/pytest.ini @@ -11,8 +11,6 @@ markers = regression: tests that fix a reported bug requires_executables: tests that requires certain executables in PATH to run nomockstage: use a stage area specifically created for this test, instead of relying on a common mock stage - enable_compiler_verification: enable compiler verification within unit tests - 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 1263b6bd5a4..0b217c159c8 100644 --- a/share/spack/gitlab/cloud_pipelines/.gitlab-ci.yml +++ b/share/spack/gitlab/cloud_pipelines/.gitlab-ci.yml @@ -741,6 +741,7 @@ aws-pcluster-generate-x86_64_v4: - - . "./share/spack/setup-env.sh" # TODO: Move this to the container next time it is rebuilt - export PATH=/home/software/spack/__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_placeh/linux-amzn2-x86_64_v3/gcc-7.3.1/binutils-2.37-qvccg7zpskturysmr4bzbsfrx34kvazo/bin:$PATH + - spack -c "config:install_tree:root:/home/software/spack/__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_placeh" reindex aws-pcluster-build-x86_64_v4: extends: [ ".linux_x86_64_v4", ".aws-pcluster-x86_64_v4", ".build" ] @@ -765,6 +766,7 @@ aws-pcluster-generate-neoverse_v1: - - . "./share/spack/setup-env.sh" # TODO: Move this to the container next time it is rebuilt - export PATH=/home/software/spack/__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_placeh/linux-amzn2-aarch64/gcc-7.3.1/binutils-2.37-2yxz3xsjfmesxujxtlrgcctxlyilynmp/bin:$PATH + - spack -c "config:install_tree:root:/home/software/spack/__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_placeh" reindex aws-pcluster-build-neoverse_v1: extends: [ ".linux_neoverse_v1", ".aws-pcluster-neoverse_v1", ".build" ] diff --git a/share/spack/gitlab/cloud_pipelines/configs/config.yaml b/share/spack/gitlab/cloud_pipelines/configs/config.yaml index 89e9800e5fc..abc5a4bacda 100644 --- a/share/spack/gitlab/cloud_pipelines/configs/config.yaml +++ b/share/spack/gitlab/cloud_pipelines/configs/config.yaml @@ -6,5 +6,4 @@ config: root: /home/software/spack padded_length: 256 projections: - all: '{architecture}/{compiler.name}-{compiler.version}/{name}-{version}-{hash}' - + all: "{architecture.platform}-{architecture.target}/{name}-{version}-{hash}" diff --git a/share/spack/gitlab/cloud_pipelines/configs/cray-rhel/compilers.yaml b/share/spack/gitlab/cloud_pipelines/configs/cray-rhel/compilers.yaml deleted file mode 100644 index 9f0dfc90dea..00000000000 --- a/share/spack/gitlab/cloud_pipelines/configs/cray-rhel/compilers.yaml +++ /dev/null @@ -1,27 +0,0 @@ -compilers: -- compiler: - spec: cce@=18.0.0 - paths: - cc: /opt/cray/pe/cce/18.0.0/bin/craycc - cxx: /opt/cray/pe/cce/18.0.0/bin/crayCC - f77: /opt/cray/pe/cce/18.0.0/bin/crayftn - fc: /opt/cray/pe/cce/18.0.0/bin/crayftn - flags: {} - operating_system: rhel8 - target: x86_64 - modules: [] - environment: {} - extra_rpaths: [] -- compiler: - spec: gcc@=8.5.0 - paths: - cc: /usr/bin/gcc - cxx: /usr/bin/g++ - f77: /usr/bin/gfortran - fc: /usr/bin/gfortran - flags: {} - operating_system: rhel8 - target: x86_64 - modules: [] - environment: {} - extra_rpaths: [] \ No newline at end of file diff --git a/share/spack/gitlab/cloud_pipelines/configs/cray-rhel/config.yaml b/share/spack/gitlab/cloud_pipelines/configs/cray-rhel/config.yaml index 893ff7e11ae..81cc5c04cc5 100644 --- a/share/spack/gitlab/cloud_pipelines/configs/cray-rhel/config.yaml +++ b/share/spack/gitlab/cloud_pipelines/configs/cray-rhel/config.yaml @@ -1,8 +1,4 @@ config: - db_lock_timeout: 120 install_tree: root: $spack/opt/spack - padded_length: 256 - projections: - all: '{architecture}/{compiler.name}-{compiler.version}/{name}-{version}-{hash}' diff --git a/share/spack/gitlab/cloud_pipelines/configs/cray-rhel/x86_64_v3/packages.yaml b/share/spack/gitlab/cloud_pipelines/configs/cray-rhel/x86_64_v3/packages.yaml new file mode 100644 index 00000000000..1fe78f367a4 --- /dev/null +++ b/share/spack/gitlab/cloud_pipelines/configs/cray-rhel/x86_64_v3/packages.yaml @@ -0,0 +1,5 @@ +packages: + all: + target: ["x86_64_v3"] + require: + - "target=x86_64_v3" diff --git a/share/spack/gitlab/cloud_pipelines/configs/linux/ci.yaml b/share/spack/gitlab/cloud_pipelines/configs/linux/ci.yaml index 5fd569c4a96..25b5fb2c245 100644 --- a/share/spack/gitlab/cloud_pipelines/configs/linux/ci.yaml +++ b/share/spack/gitlab/cloud_pipelines/configs/linux/ci.yaml @@ -4,7 +4,7 @@ ci: before_script-: # Test package relocation on linux using a modified prefix # This is not well supported on MacOS (https://github.com/spack/spack/issues/37162) - - - spack config add "config:install_tree:projections:${SPACK_JOB_SPEC_PKG_NAME}:'morepadding/{architecture}/{compiler.name}-{compiler.version}/{name}-{version}-{hash}'" + - - spack config add "config:install_tree:projections:${SPACK_JOB_SPEC_PKG_NAME}:'morepadding/{architecture.platform}-{architecture.target}/{name}-{version}-{hash}'" - match_behavior: first submapping: - match: 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 045c89de2dc..4bd9a184c18 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 @@ -25,6 +25,7 @@ spack: - spack --version - spack arch - export PATH=/home/software/spack/__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_placeh/linux-amzn2-aarch64/gcc-7.3.1/binutils-2.37-2yxz3xsjfmesxujxtlrgcctxlyilynmp/bin:$PATH + - spack -c "config:install_tree:root:/home/software/spack/__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_placeh" reindex - signing-job: before_script: # Do not distribute Intel & ARM binaries @@ -32,24 +33,21 @@ spack: - for i in $(aws s3 ls --recursive ${SPACK_REMOTE_MIRROR_OVERRIDE}/build_cache/ | grep armpl | awk '{print $4}' | sed -e 's?^.*build_cache/??g'); do aws s3 rm ${SPACK_REMOTE_MIRROR_OVERRIDE}/build_cache/$i; done cdash: build-group: AWS Packages + config: shared_linking: missing_library_policy: ignore # due to use of externals - compilers: - - compiler: - environment: {} - extra_rpaths: [] - flags: {} - modules: [] - operating_system: amzn2 - paths: - cc: /home/software/spack/__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_placeh/linux-amzn2-aarch64/gcc-7.3.1/gcc-12.4.0-v6wxye6ijzrxnzxftcwnpu3psohsjl2b/bin/gcc - cxx: /home/software/spack/__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_placeh/linux-amzn2-aarch64/gcc-7.3.1/gcc-12.4.0-v6wxye6ijzrxnzxftcwnpu3psohsjl2b/bin/g++ - f77: /home/software/spack/__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_placeh/linux-amzn2-aarch64/gcc-7.3.1/gcc-12.4.0-v6wxye6ijzrxnzxftcwnpu3psohsjl2b/bin/gfortran - fc: /home/software/spack/__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_placeh/linux-amzn2-aarch64/gcc-7.3.1/gcc-12.4.0-v6wxye6ijzrxnzxftcwnpu3psohsjl2b/bin/gfortran - spec: gcc@=12.4.0 - target: aarch64 + packages: + gcc: + externals: + - spec: gcc@=12.4.0 + prefix: /home/software/spack/__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_placeh/linux-amzn2-aarch64/gcc-7.3.1/gcc-12.4.0-v6wxye6ijzrxnzxftcwnpu3psohsjl2b + extra_attributes: + compilers: + c: /home/software/spack/__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_placeh/linux-amzn2-aarch64/gcc-7.3.1/gcc-12.4.0-v6wxye6ijzrxnzxftcwnpu3psohsjl2b/bin/gcc + cxx: /home/software/spack/__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_placeh/linux-amzn2-aarch64/gcc-7.3.1/gcc-12.4.0-v6wxye6ijzrxnzxftcwnpu3psohsjl2b/bin/g++ + fortran: /home/software/spack/__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_placeh/linux-amzn2-aarch64/gcc-7.3.1/gcc-12.4.0-v6wxye6ijzrxnzxftcwnpu3psohsjl2b/bin/gfortran acfl: require: - "%gcc" @@ -97,8 +95,11 @@ spack: externals: - prefix: /opt/slurm spec: slurm@22.05.8 +pmix + require: + - "+pmix" all: - compiler: [gcc, arm, nvhpc, clang] + require: + - "%gcc" providers: blas: [armpl-gcc, openblas] fftw-api: [armpl-gcc, fftw] 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 d4da712cd75..4597d187b26 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 @@ -7,7 +7,7 @@ spack: # 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 + - palace %oneapi # TODO: Find out how to make +ipo cmake flag work. # - quantum-espresso %oneapi - openmpi %oneapi @@ -29,6 +29,7 @@ spack: - spack --version - spack arch - export PATH=/home/software/spack/__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_placeh/linux-amzn2-x86_64_v3/gcc-7.3.1/binutils-2.37-qvccg7zpskturysmr4bzbsfrx34kvazo/bin:$PATH + - spack -c "config:install_tree:root:/home/software/spack/__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_placeh" reindex - signing-job: before_script: # Do not distribute Intel & ARM binaries @@ -36,38 +37,35 @@ spack: - for i in $(aws s3 ls --recursive ${SPACK_REMOTE_MIRROR_OVERRIDE}/build_cache/ | grep armpl | awk '{print $4}' | sed -e 's?^.*build_cache/??g'); do aws s3 rm ${SPACK_REMOTE_MIRROR_OVERRIDE}/build_cache/$i; done cdash: build-group: AWS Packages + config: shared_linking: missing_library_policy: ignore # due to use of externals - compilers: - - compiler: - environment: {} - extra_rpaths: [] - flags: {} - modules: [] - operating_system: amzn2 - paths: - cc: /home/software/spack/__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_placeh/linux-amzn2-x86_64_v3/gcc-7.3.1/gcc-12.4.0-pttzchh7o54nhmycj4wgzw5mic6rk2nb/bin/gcc - cxx: /home/software/spack/__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_placeh/linux-amzn2-x86_64_v3/gcc-7.3.1/gcc-12.4.0-pttzchh7o54nhmycj4wgzw5mic6rk2nb/bin/g++ - f77: /home/software/spack/__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_placeh/linux-amzn2-x86_64_v3/gcc-7.3.1/gcc-12.4.0-pttzchh7o54nhmycj4wgzw5mic6rk2nb/bin/gfortran - fc: /home/software/spack/__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_placeh/linux-amzn2-x86_64_v3/gcc-7.3.1/gcc-12.4.0-pttzchh7o54nhmycj4wgzw5mic6rk2nb/bin/gfortran - spec: gcc@=12.4.0 - target: x86_64 - - compiler: - environment: {} - extra_rpaths: - - /home/software/spack/__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_placeh/linux-amzn2-x86_64_v3/gcc-7.3.1/gcc-12.4.0-pttzchh7o54nhmycj4wgzw5mic6rk2nb/lib64 - flags: {} - modules: [] - operating_system: amzn2 - paths: - cc: /home/software/spack/__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_placeh/linux-amzn2-x86_64_v3/gcc-12.4.0/intel-oneapi-compilers-2024.1.0-f5u3psfhbwscasajkn324igtupn3blop/compiler/2024.1/bin/icx - cxx: /home/software/spack/__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_placeh/linux-amzn2-x86_64_v3/gcc-12.4.0/intel-oneapi-compilers-2024.1.0-f5u3psfhbwscasajkn324igtupn3blop/compiler/2024.1/bin/icpx - f77: /home/software/spack/__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_placeh/linux-amzn2-x86_64_v3/gcc-12.4.0/intel-oneapi-compilers-2024.1.0-f5u3psfhbwscasajkn324igtupn3blop/compiler/2024.1/bin/ifx - fc: /home/software/spack/__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_placeh/linux-amzn2-x86_64_v3/gcc-12.4.0/intel-oneapi-compilers-2024.1.0-f5u3psfhbwscasajkn324igtupn3blop/compiler/2024.1/bin/ifx - spec: oneapi@=2024.1.0 - target: x86_64 + packages: + gcc: + externals: + - spec: gcc@=12.4.0 + prefix: /home/software/spack/__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_placeh/linux-amzn2-x86_64_v3/gcc-7.3.1/gcc-12.4.0-pttzchh7o54nhmycj4wgzw5mic6rk2nb + extra_attributes: + compilers: + c: /home/software/spack/__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_placeh/linux-amzn2-x86_64_v3/gcc-7.3.1/gcc-12.4.0-pttzchh7o54nhmycj4wgzw5mic6rk2nb/bin/gcc + cxx: /home/software/spack/__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_placeh/linux-amzn2-x86_64_v3/gcc-7.3.1/gcc-12.4.0-pttzchh7o54nhmycj4wgzw5mic6rk2nb/bin/g++ + fortran: /home/software/spack/__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_placeh/linux-amzn2-x86_64_v3/gcc-7.3.1/gcc-12.4.0-pttzchh7o54nhmycj4wgzw5mic6rk2nb/bin/gfortran + intel-oneapi-compilers: + externals: + - spec: intel-oneapi-compilers@=2024.1.0 + prefix: /home/software/spack/__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_placeh/linux-amzn2-x86_64_v3/gcc-12.4.0/intel-oneapi-compilers-2024.1.0-f5u3psfhbwscasajkn324igtupn3blop + extra_attributes: + compilers: + c: /home/software/spack/__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_placeh/linux-amzn2-x86_64_v3/gcc-12.4.0/intel-oneapi-compilers-2024.1.0-f5u3psfhbwscasajkn324igtupn3blop/compiler/2024.1/bin/icx + cxx: /home/software/spack/__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_placeh/linux-amzn2-x86_64_v3/gcc-12.4.0/intel-oneapi-compilers-2024.1.0-f5u3psfhbwscasajkn324igtupn3blop/compiler/2024.1/bin/icpx + fortran: /home/software/spack/__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_placeh/linux-amzn2-x86_64_v3/gcc-12.4.0/intel-oneapi-compilers-2024.1.0-f5u3psfhbwscasajkn324igtupn3blop/compiler/2024.1/bin/ifx + extra_rpaths: + - /home/software/spack/__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_placeh/linux-amzn2-x86_64_v3/gcc-7.3.1/gcc-12.4.0-pttzchh7o54nhmycj4wgzw5mic6rk2nb/lib64 + fortran: + require: + - "intel-oneapi-compilers" gettext: # Newer gettext cannot build with gcc@12 and old AL2 glibc headers # Older gettext versions do not build correctly with oneapi. @@ -123,11 +121,14 @@ spack: externals: - prefix: /opt/slurm spec: slurm@22.05.8 +pmix + require: + - +pmix wrf: require: - wrf@4 build_type=dm+sm all: - compiler: [oneapi, gcc] + require: + - "%oneapi" permissions: read: world write: user diff --git a/share/spack/gitlab/cloud_pipelines/stacks/build_systems/spack.yaml b/share/spack/gitlab/cloud_pipelines/stacks/build_systems/spack.yaml index 248c699fa95..2f5177af30d 100644 --- a/share/spack/gitlab/cloud_pipelines/stacks/build_systems/spack.yaml +++ b/share/spack/gitlab/cloud_pipelines/stacks/build_systems/spack.yaml @@ -4,6 +4,9 @@ spack: all: require: - target=x86_64_v3 + c: + require: + - gcc specs: - 'uncrustify build_system=autotools' diff --git a/share/spack/gitlab/cloud_pipelines/stacks/developer-tools-aarch64-linux-gnu/spack.yaml b/share/spack/gitlab/cloud_pipelines/stacks/developer-tools-aarch64-linux-gnu/spack.yaml index aa152e1ff98..66c7d21dac6 100644 --- a/share/spack/gitlab/cloud_pipelines/stacks/developer-tools-aarch64-linux-gnu/spack.yaml +++ b/share/spack/gitlab/cloud_pipelines/stacks/developer-tools-aarch64-linux-gnu/spack.yaml @@ -15,7 +15,8 @@ spack: # editors - neovim~no_luajit - py-pynvim - - emacs+json+native+treesitter # note, pulls in gcc + # FIXME (compiler as nodes): recover dependency on gcc as a library when +native + - 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/developer-tools-x86_64_v3-linux-gnu/spack.yaml b/share/spack/gitlab/cloud_pipelines/stacks/developer-tools-x86_64_v3-linux-gnu/spack.yaml index c69cd35fc41..c0d35f61dc5 100644 --- a/share/spack/gitlab/cloud_pipelines/stacks/developer-tools-x86_64_v3-linux-gnu/spack.yaml +++ b/share/spack/gitlab/cloud_pipelines/stacks/developer-tools-x86_64_v3-linux-gnu/spack.yaml @@ -8,7 +8,7 @@ spack: - ~cuda - ~rocm prefer: - - "%gcc" + - "%gcc" concretizer: unify: true reuse: false @@ -18,7 +18,8 @@ spack: # editors - neovim~no_luajit - py-pynvim - - emacs+json+native+treesitter # note, pulls in gcc + # FIXME (compiler as nodes): recover dependency on gcc as a library when +native + - 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-cray-rhel/spack.yaml b/share/spack/gitlab/cloud_pipelines/stacks/e4s-cray-rhel/spack.yaml index 71f922aa9e4..a9ff3d5afdd 100644 --- a/share/spack/gitlab/cloud_pipelines/stacks/e4s-cray-rhel/spack.yaml +++ b/share/spack/gitlab/cloud_pipelines/stacks/e4s-cray-rhel/spack.yaml @@ -20,6 +20,9 @@ spack: - "%cce" providers: blas: [cray-libsci] + c: [cce] + cxx: [cce] + fortran: [cce] lapack: [cray-libsci] mpi: [cray-mpich] tbb: [intel-tbb] 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 f772287c947..88eb89346f9 100644 --- a/share/spack/gitlab/cloud_pipelines/stacks/e4s-oneapi/spack.yaml +++ b/share/spack/gitlab/cloud_pipelines/stacks/e4s-oneapi/spack.yaml @@ -12,15 +12,18 @@ spack: - target=x86_64_v3 - '%oneapi' providers: + c: [intel-oneapi-compilers, gcc] + cxx: [intel-oneapi-compilers, gcc] + fortran: [intel-oneapi-compilers, gcc] blas: [openblas] tbb: [intel-tbb] variants: +mpi gl: require: osmesa + fortran: + require: intel-oneapi-compilers elfutils: variants: ~nls - gcc-runtime: - require: "target=x86_64_v3 %gcc" hdf5: variants: +fortran +hl +shared libfabric: @@ -32,10 +35,7 @@ spack: openblas: variants: threads=openmp trilinos: - variants: +amesos +amesos2 +anasazi +aztec +belos +boost +epetra +epetraext - +ifpack +ifpack2 +intrepid +intrepid2 +isorropia +kokkos +ml +minitensor +muelu - +nox +piro +phalanx +rol +rythmos +sacado +stk +shards +shylu +stokhos +stratimikos - +teko +tempus +tpetra +trilinoscouplings +zoltan +zoltan2 +superlu-dist gotype=long_long + variants: +amesos +amesos2 +anasazi +aztec +belos +boost +epetra +epetraext +ifpack +ifpack2 +intrepid +intrepid2 +isorropia +kokkos +ml +minitensor +muelu +nox +piro +phalanx +rol +rythmos +sacado +stk +shards +shylu +stokhos +stratimikos +teko +tempus +tpetra +trilinoscouplings +zoltan +zoltan2 +superlu-dist gotype=long_long xz: variants: +pic mpi: @@ -48,6 +48,9 @@ spack: unzip: require: - 'target=x86_64_v3 %gcc' + py-maturin: + require: + - 'target=x86_64_v3 %gcc' binutils: require: - 'target=x86_64_v3 %gcc' diff --git a/share/spack/gitlab/cloud_pipelines/stacks/e4s/spack.yaml b/share/spack/gitlab/cloud_pipelines/stacks/e4s/spack.yaml index c9894a74de2..1cde3b982cc 100644 --- a/share/spack/gitlab/cloud_pipelines/stacks/e4s/spack.yaml +++ b/share/spack/gitlab/cloud_pipelines/stacks/e4s/spack.yaml @@ -12,6 +12,12 @@ spack: - "%gcc" - target=x86_64_v3 variants: +mpi + c: + require: gcc + cxx: + require: gcc + fortran: + require: gcc mpi: require: - mpich diff --git a/share/spack/qa/setup.sh b/share/spack/qa/setup.sh index 12729d25de2..fdae00f8c6d 100755 --- a/share/spack/qa/setup.sh +++ b/share/spack/qa/setup.sh @@ -30,7 +30,6 @@ if [[ "$COVERAGE" == "true" ]]; then bashcov=$(realpath ${QA_DIR}/bashcov) # instrument scripts requiring shell coverage - sed -i "s@#\!/bin/bash@#\!${bashcov}@" "$SPACK_ROOT/lib/spack/env/cc" if [ "$(uname -o)" != "Darwin" ]; then # On darwin, #! interpreters must be binaries, so no sbang for bashcov sed -i "s@#\!/bin/sh@#\!${bashcov}@" "$SPACK_ROOT/bin/sbang" diff --git a/share/spack/spack-completion.fish b/share/spack/spack-completion.fish index 654b1b3b43a..b4d4f7932b7 100644 --- a/share/spack/spack-completion.fish +++ b/share/spack/spack-completion.fish @@ -1084,9 +1084,9 @@ set -g __fish_spack_optspecs_spack_compiler_find h/help mixed-toolchain no-mixed complete -c spack -n '__fish_spack_using_command compiler find' -s h -l help -f -a help complete -c spack -n '__fish_spack_using_command compiler find' -s h -l help -d 'show this help message and exit' complete -c spack -n '__fish_spack_using_command compiler find' -l mixed-toolchain -f -a mixed_toolchain -complete -c spack -n '__fish_spack_using_command compiler find' -l mixed-toolchain -d 'Allow mixed toolchains (for example: clang, clang++, gfortran)' +complete -c spack -n '__fish_spack_using_command compiler find' -l mixed-toolchain -d '(DEPRECATED) Allow mixed toolchains (for example: clang, clang++, gfortran)' complete -c spack -n '__fish_spack_using_command compiler find' -l no-mixed-toolchain -f -a mixed_toolchain -complete -c spack -n '__fish_spack_using_command compiler find' -l no-mixed-toolchain -d 'Do not allow mixed toolchains (for example: clang, clang++, gfortran)' +complete -c spack -n '__fish_spack_using_command compiler find' -l no-mixed-toolchain -d '(DEPRECATED) Do not allow mixed toolchains (for example: clang, clang++, gfortran)' complete -c spack -n '__fish_spack_using_command compiler find' -l scope -r -f -a '_builtin defaults system site user command_line' complete -c spack -n '__fish_spack_using_command compiler find' -l scope -r -d 'configuration scope to modify' complete -c spack -n '__fish_spack_using_command compiler find' -s j -l jobs -r -f -a jobs @@ -1098,9 +1098,9 @@ set -g __fish_spack_optspecs_spack_compiler_add h/help mixed-toolchain no-mixed- complete -c spack -n '__fish_spack_using_command compiler add' -s h -l help -f -a help complete -c spack -n '__fish_spack_using_command compiler add' -s h -l help -d 'show this help message and exit' complete -c spack -n '__fish_spack_using_command compiler add' -l mixed-toolchain -f -a mixed_toolchain -complete -c spack -n '__fish_spack_using_command compiler add' -l mixed-toolchain -d 'Allow mixed toolchains (for example: clang, clang++, gfortran)' +complete -c spack -n '__fish_spack_using_command compiler add' -l mixed-toolchain -d '(DEPRECATED) Allow mixed toolchains (for example: clang, clang++, gfortran)' complete -c spack -n '__fish_spack_using_command compiler add' -l no-mixed-toolchain -f -a mixed_toolchain -complete -c spack -n '__fish_spack_using_command compiler add' -l no-mixed-toolchain -d 'Do not allow mixed toolchains (for example: clang, clang++, gfortran)' +complete -c spack -n '__fish_spack_using_command compiler add' -l no-mixed-toolchain -d '(DEPRECATED) Do not allow mixed toolchains (for example: clang, clang++, gfortran)' complete -c spack -n '__fish_spack_using_command compiler add' -l scope -r -f -a '_builtin defaults system site user command_line' complete -c spack -n '__fish_spack_using_command compiler add' -l scope -r -d 'configuration scope to modify' complete -c spack -n '__fish_spack_using_command compiler add' -s j -l jobs -r -f -a jobs @@ -1827,7 +1827,7 @@ complete -c spack -n '__fish_spack_using_command find' -s c -l show-concretized complete -c spack -n '__fish_spack_using_command find' -s f -l show-flags -f -a show_flags complete -c spack -n '__fish_spack_using_command find' -s f -l show-flags -d 'show spec compiler flags' complete -c spack -n '__fish_spack_using_command find' -l show-full-compiler -f -a show_full_compiler -complete -c spack -n '__fish_spack_using_command find' -l show-full-compiler -d 'show full compiler specs' +complete -c spack -n '__fish_spack_using_command find' -l show-full-compiler -d '(DEPRECATED) show full compiler specs. Currently it'"'"'s a no-op' complete -c spack -n '__fish_spack_using_command find' -s x -l explicit -f -a explicit complete -c spack -n '__fish_spack_using_command find' -s x -l explicit -d 'show only specs that were installed explicitly' complete -c spack -n '__fish_spack_using_command find' -s X -l implicit -f -a implicit diff --git a/var/spack/repos/builtin.mock/packages/bowtie/package.py b/var/spack/repos/builtin.mock/packages/bowtie/package.py index 860f646e9b6..f6bb8b41ec2 100644 --- a/var/spack/repos/builtin.mock/packages/bowtie/package.py +++ b/var/spack/repos/builtin.mock/packages/bowtie/package.py @@ -15,5 +15,8 @@ class Bowtie(Package): version("1.2.2", md5="1c837ecd990bb022d07e7aab32b09847") version("1.2.0", md5="1c837ecd990bb022d07e7aab32b09847") + depends_on("c", type="build") + conflicts("%gcc@:4.5.0", when="@1.2.2") - conflicts("%gcc@:10.2.1", when="@:1.3.0") + conflicts("%gcc@:10.2.1", when="@:1.2.9") + conflicts("%gcc", when="@1.3") diff --git a/var/spack/repos/builtin.mock/packages/callpath/package.py b/var/spack/repos/builtin.mock/packages/callpath/package.py index 7184c15dcbb..cf3d52707f7 100644 --- a/var/spack/repos/builtin.mock/packages/callpath/package.py +++ b/var/spack/repos/builtin.mock/packages/callpath/package.py @@ -13,6 +13,8 @@ class Callpath(Package): version("0.9", md5="0123456789abcdef0123456789abcdef") version("1.0", md5="0123456789abcdef0123456789abcdef") + depends_on("c", type="build") + depends_on("dyninst") depends_on("mpi") diff --git a/var/spack/repos/builtin.mock/packages/cmake-client/package.py b/var/spack/repos/builtin.mock/packages/cmake-client/package.py index c28e19518c2..c9bf018e960 100644 --- a/var/spack/repos/builtin.mock/packages/cmake-client/package.py +++ b/var/spack/repos/builtin.mock/packages/cmake-client/package.py @@ -29,6 +29,8 @@ class CmakeClient(CMakePackage): variant("single", description="", default="blue", values=("blue", "red", "green"), multi=False) variant("truthy", description="", default=True) + depends_on("c", type="build") + callback_counter = 0 flipped = False diff --git a/var/spack/repos/builtin.mock/packages/cmake/package.py b/var/spack/repos/builtin.mock/packages/cmake/package.py index 12d229b1bee..1c34499a3bd 100644 --- a/var/spack/repos/builtin.mock/packages/cmake/package.py +++ b/var/spack/repos/builtin.mock/packages/cmake/package.py @@ -22,6 +22,9 @@ class Cmake(Package): tags = ["build-tools"] + depends_on("c", type="build") + depends_on("cxx", type="build") + version( "3.23.1", md5="4cb3ff35b2472aae70f542116d616e63", diff --git a/var/spack/repos/builtin.mock/packages/compiler-wrapper b/var/spack/repos/builtin.mock/packages/compiler-wrapper new file mode 120000 index 00000000000..cd3a417be31 --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/compiler-wrapper @@ -0,0 +1 @@ +../../builtin/packages/compiler-wrapper/ \ No newline at end of file diff --git a/var/spack/repos/builtin.mock/packages/conflict-parent/package.py b/var/spack/repos/builtin.mock/packages/conflict-parent/package.py index 57cad8615c6..6dc3240c24c 100644 --- a/var/spack/repos/builtin.mock/packages/conflict-parent/package.py +++ b/var/spack/repos/builtin.mock/packages/conflict-parent/package.py @@ -14,6 +14,7 @@ class ConflictParent(Package): version("1.0", md5="0123456789abcdef0123456789abcdef") depends_on("conflict") + depends_on("c", type="build") conflicts("^conflict~foo", when="@0.9") diff --git a/var/spack/repos/builtin.mock/packages/conflict/package.py b/var/spack/repos/builtin.mock/packages/conflict/package.py index 209cd78539b..1b36c351518 100644 --- a/var/spack/repos/builtin.mock/packages/conflict/package.py +++ b/var/spack/repos/builtin.mock/packages/conflict/package.py @@ -17,6 +17,8 @@ class Conflict(Package): conflicts("%clang", when="+foo") + depends_on("c", type="build") + def install(self, spec, prefix): configure("--prefix=%s" % prefix) make() diff --git a/var/spack/repos/builtin.mock/packages/dt-diamond-bottom/package.py b/var/spack/repos/builtin.mock/packages/dt-diamond-bottom/package.py index 1082bb350be..dcc6cd77eb2 100644 --- a/var/spack/repos/builtin.mock/packages/dt-diamond-bottom/package.py +++ b/var/spack/repos/builtin.mock/packages/dt-diamond-bottom/package.py @@ -12,3 +12,5 @@ class DtDiamondBottom(Package): url = "http://www.example.com/dt-diamond-bottom-1.0.tar.gz" version("1.0", md5="0123456789abcdef0123456789abcdef") + + depends_on("c", type="build") diff --git a/var/spack/repos/builtin.mock/packages/dt-diamond-left/package.py b/var/spack/repos/builtin.mock/packages/dt-diamond-left/package.py index 682218390f1..a9337a576eb 100644 --- a/var/spack/repos/builtin.mock/packages/dt-diamond-left/package.py +++ b/var/spack/repos/builtin.mock/packages/dt-diamond-left/package.py @@ -14,3 +14,4 @@ class DtDiamondLeft(Package): version("1.0", md5="0123456789abcdef0123456789abcdef") depends_on("dt-diamond-bottom", type="build") + depends_on("c", type="build") diff --git a/var/spack/repos/builtin.mock/packages/dt-diamond-right/package.py b/var/spack/repos/builtin.mock/packages/dt-diamond-right/package.py index 9b3c42f800b..ed2b39973b3 100644 --- a/var/spack/repos/builtin.mock/packages/dt-diamond-right/package.py +++ b/var/spack/repos/builtin.mock/packages/dt-diamond-right/package.py @@ -14,3 +14,4 @@ class DtDiamondRight(Package): version("1.0", md5="0123456789abcdef0123456789abcdef") depends_on("dt-diamond-bottom", type=("build", "link", "run")) + depends_on("c", type="build") diff --git a/var/spack/repos/builtin.mock/packages/dt-diamond/package.py b/var/spack/repos/builtin.mock/packages/dt-diamond/package.py index 3774de7f932..0d60584a4f3 100644 --- a/var/spack/repos/builtin.mock/packages/dt-diamond/package.py +++ b/var/spack/repos/builtin.mock/packages/dt-diamond/package.py @@ -15,3 +15,5 @@ class DtDiamond(Package): depends_on("dt-diamond-left") depends_on("dt-diamond-right") + + depends_on("c", type="build") diff --git a/var/spack/repos/builtin.mock/packages/dyninst/package.py b/var/spack/repos/builtin.mock/packages/dyninst/package.py index 900737dd312..5f2d1e232d9 100644 --- a/var/spack/repos/builtin.mock/packages/dyninst/package.py +++ b/var/spack/repos/builtin.mock/packages/dyninst/package.py @@ -28,6 +28,8 @@ class Dyninst(Package): depends_on("libelf") depends_on("libdwarf") + depends_on("c", type="build") + def install(self, spec, prefix): mkdirp(prefix) touch(join_path(prefix, "dummyfile")) diff --git a/var/spack/repos/builtin.mock/packages/fftw/package.py b/var/spack/repos/builtin.mock/packages/fftw/package.py index 4ffb4c000d6..a169b4aa27e 100644 --- a/var/spack/repos/builtin.mock/packages/fftw/package.py +++ b/var/spack/repos/builtin.mock/packages/fftw/package.py @@ -18,4 +18,6 @@ class Fftw(Package): variant("mpi", default=False, description="Enable MPI") + depends_on("c", type="build") + depends_on("mpi", when="+mpi") diff --git a/var/spack/repos/builtin.mock/packages/gcc-runtime b/var/spack/repos/builtin.mock/packages/gcc-runtime new file mode 120000 index 00000000000..6f620d9d8c2 --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/gcc-runtime @@ -0,0 +1 @@ +../../builtin/packages/gcc-runtime \ No newline at end of file diff --git a/var/spack/repos/builtin.mock/packages/gcc/package.py b/var/spack/repos/builtin.mock/packages/gcc/package.py index 5aae4bae941..d029a522681 100644 --- a/var/spack/repos/builtin.mock/packages/gcc/package.py +++ b/var/spack/repos/builtin.mock/packages/gcc/package.py @@ -1,6 +1,7 @@ # Copyright Spack Project Developers. See COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) +import os.path from spack.package import * @@ -11,9 +12,10 @@ class Gcc(CompilerPackage, Package): homepage = "http://www.example.com" url = "http://www.example.com/gcc-1.0.tar.gz" - version("1.0", md5="0123456789abcdef0123456789abcdef") - version("2.0", md5="abcdef0123456789abcdef0123456789") + version("14.0", md5="abcdef0123456789abcdef0123456789") version("3.0", md5="def0123456789abcdef0123456789abc") + version("2.0", md5="abcdef0123456789abcdef0123456789") + version("1.0", md5="0123456789abcdef0123456789abcdef") variant( "languages", @@ -23,7 +25,12 @@ class Gcc(CompilerPackage, Package): description="Compilers and runtime libraries to build", ) - depends_on("conflict", when="@3.0") + provides("c", "cxx", when="languages=c,c++") + provides("c", when="languages=c") + provides("cxx", when="languages=c++") + provides("fortran", when="languages=fortran") + + depends_on("c", type="build") c_names = ["gcc"] cxx_names = ["g++"] @@ -33,9 +40,82 @@ class Gcc(CompilerPackage, Package): compiler_version_regex = r"(? str: + flags = { + "cxx": {"11": "-std=c++11", "14": "-std=c++14", "17": "-std=c++17"}, + "c": {"99": "-std=c99", "11": "-std=c11"}, + } + return flags[language][standard] diff --git a/var/spack/repos/builtin/packages/apple-clang/package.py b/var/spack/repos/builtin/packages/apple-clang/package.py index a4636a9ee0e..57ee9e998c0 100644 --- a/var/spack/repos/builtin/packages/apple-clang/package.py +++ b/var/spack/repos/builtin/packages/apple-clang/package.py @@ -1,6 +1,8 @@ # Copyright Spack Project Developers. See COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) +import os + from spack.package import * from spack.pkg.builtin.llvm import LlvmDetection @@ -16,6 +18,17 @@ class AppleClang(BundlePackage, LlvmDetection, CompilerPackage): compiler_languages = ["c", "cxx"] compiler_version_regex = r"^Apple (?:LLVM|clang) version ([^ )]+)" + openmp_flag = "-Xpreprocessor -fopenmp" + + compiler_wrapper_link_paths = { + "c": os.path.join("clang", "clang"), + "cxx": os.path.join("clang", "clang++"), + } + + implicit_rpath_libs = ["libclang"] + + provides("c", "cxx") + requires("platform=darwin") @classmethod @@ -38,3 +51,28 @@ def cxx(self): msg = "apple-clang is expected to be an external spec" assert self.spec.concrete and self.spec.external, msg return self.spec.extra_attributes["compilers"].get("cxx", None) + + def _standard_flag(self, *, language, standard): + flags = { + "cxx": { + "11": [("@4.0:", "-std=c++11")], + "14": [("@6.1:", "-std=c++14")], + "17": [("@6.1:10.0", "-std=c++1z"), ("10.1:", "-std=c++17")], + "20": [("@10.0:13.0", "-std=c++2a"), ("13.1:", "-std=c++20")], + "23": [("13.0:", "-std=c++2b")], + }, + "c": { + "99": [("@4.0:", "-std=c99")], + "11": [("@4.0:", "-std=c11")], + "17": [("@11.1:", "-std=c17")], + "23": [("@11.1:", "-std=c2x")], + }, + } + for condition, flag in flags[language][standard]: + if self.spec.satisfies(condition): + return flag + else: + raise RuntimeError( + f"{self.spec} does not support the '{standard}' standard " + f"for the '{language}' language" + ) diff --git a/var/spack/repos/builtin/packages/armpl-gcc/package.py b/var/spack/repos/builtin/packages/armpl-gcc/package.py index b758f0dbb58..77cf566d72a 100644 --- a/var/spack/repos/builtin/packages/armpl-gcc/package.py +++ b/var/spack/repos/builtin/packages/armpl-gcc/package.py @@ -4,7 +4,6 @@ import os -import spack.error import spack.platforms from spack.package import * @@ -406,6 +405,10 @@ class ArmplGcc(Package): provides("lapack") provides("fftw-api@3") + depends_on("c", type="build") + depends_on("fortran", type="build") + requires("^[virtuals=c,fortran] gcc", msg="armpl-gcc is only compatible with the GCC compiler") + depends_on("gmake", type="build") # Run the installer with the desired install directory @@ -431,8 +434,6 @@ def install(self, spec, prefix): # Unmount image hdiutil("detach", mountpoint) return - if self.compiler.name != "gcc": - raise spack.error.SpackError(("Only compatible with GCC.\n")) with when("@:22"): armpl_version = spec.version.up_to(3).string.split("_")[0] diff --git a/var/spack/repos/builtin/packages/ascent/package.py b/var/spack/repos/builtin/packages/ascent/package.py index 9de2d4a9a14..32c4a842726 100644 --- a/var/spack/repos/builtin/packages/ascent/package.py +++ b/var/spack/repos/builtin/packages/ascent/package.py @@ -376,8 +376,9 @@ def _get_host_config_path(self, spec): # if on llnl systems, we can use the SYS_TYPE if "SYS_TYPE" in env: sys_type = env["SYS_TYPE"] - host_config_path = "{0}-{1}-{2}-ascent-{3}.cmake".format( - socket.gethostname(), sys_type, spec.compiler, spec.dag_hash() + compiler_str = f"{self['c'].name}-{self['c'].version}" + host_config_path = ( + f"{socket.gethostname()}-{sys_type}-{compiler_str}" f"-ascent-{spec.dag_hash()}.cmake" ) dest_dir = spec.prefix host_config_path = os.path.abspath(join_path(dest_dir, host_config_path)) diff --git a/var/spack/repos/builtin/packages/blt/package.py b/var/spack/repos/builtin/packages/blt/package.py index ce055c4959a..f5bf224d753 100644 --- a/var/spack/repos/builtin/packages/blt/package.py +++ b/var/spack/repos/builtin/packages/blt/package.py @@ -22,7 +22,7 @@ def spec_uses_gccname(spec): def llnl_link_helpers(options, spec, compiler): # From local package: - if compiler.fc: + if "fortran" in spec: fortran_compilers = ["gfortran", "xlf"] if any(f_comp in compiler.fc for f_comp in fortran_compilers) and ( "clang" in compiler.cxx @@ -37,7 +37,7 @@ def llnl_link_helpers(options, spec, compiler): if flags: options.append(cmake_cache_string("BLT_EXE_LINKER_FLAGS", flags, description)) - if "cce" in compiler.cxx: + if "cxx" in spec and spec["cxx"].name == "cce": description = "Adds a missing rpath for libraries " "associated with the fortran compiler" # Here is where to find libs that work for fortran libdir = "/opt/cray/pe/cce/{0}/cce-clang/x86_64/lib".format(compiler.version) diff --git a/var/spack/repos/builtin/packages/bzip2/package.py b/var/spack/repos/builtin/packages/bzip2/package.py index a0f56620f51..4e754853704 100644 --- a/var/spack/repos/builtin/packages/bzip2/package.py +++ b/var/spack/repos/builtin/packages/bzip2/package.py @@ -77,6 +77,9 @@ def patch(self): filter_file(r"-O2 ", "-O0 ", makefile) filter_file(r"-Ox ", "-O0 ", makefile) + if self.spec.satisfies("platform=windows"): + return + # bzip2 comes with two separate Makefiles for static and dynamic builds # Tell both to use Spack's compiler wrapper instead of GCC filter_file(r"^CC=gcc", "CC={0}".format(spack_cc), "Makefile") diff --git a/var/spack/repos/builtin/packages/cce/package.py b/var/spack/repos/builtin/packages/cce/package.py index 23323803005..080bcf27234 100644 --- a/var/spack/repos/builtin/packages/cce/package.py +++ b/var/spack/repos/builtin/packages/cce/package.py @@ -1,6 +1,8 @@ # Copyright Spack Project Developers. See COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) +import os.path + from spack.package import * @@ -20,10 +22,50 @@ class Cce(Package, CompilerPackage): r"[Cc]ray (?:clang|C :|C\+\+ :|Fortran :) [Vv]ersion.*?(\d+(?:\.\d+)+)" ) - # notify when the package is updated. + debug_flags = ["-g", "-G0", "-G1", "-G2", "-Gfast"] + + compiler_wrapper_link_paths = { + "c": os.path.join("cce", "craycc"), + "cxx": os.path.join("cce", "case-insensitive", "crayCC"), + "fortran": os.path.join("cce", "crayftn"), + } + + implicit_rpath_libs = [ + "libalign", + "libcrayacc_amdgpu", + "libcrayacc_x86_64", + "libcraymath", + "libcraymp", + "libcrayompd", + "libcsup", + "libfi", + "libf", + "libmodules64", + "libmodules", + "libopenacc_amdgpu", + "libopenacc", + "libopenacc_x86_64", + "libpgas-shmem", + "libplinterface", + "libquadmath", + "libu", + ] + maintainers("becker33") version("16.0.0") + provides("c", "cxx") + provides("fortran") + + requires("platform=linux") + + def _standard_flag(self, *, language, standard): + flags = { + "cxx": {"11": "-std=c++11", "14": "-std=c++14", "17": "-std=c++17"}, + "c": {"99": "-std=c99", "11": "-std=c11"}, + } + return flags[language][standard] + def install(self, spec, prefix): raise NotImplementedError("cray compiler must be configured as external") diff --git a/var/spack/repos/builtin/packages/claw/package.py b/var/spack/repos/builtin/packages/claw/package.py index 32b3933fb41..de167f08539 100644 --- a/var/spack/repos/builtin/packages/claw/package.py +++ b/var/spack/repos/builtin/packages/claw/package.py @@ -1,11 +1,6 @@ # Copyright Spack Project Developers. See COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) - -import os - -import spack.compilers -import spack.spec from spack.package import * @@ -87,8 +82,6 @@ class Claw(CMakePackage): def flag_handler(self, name, flags): if name == "cflags": compiler_spec = self.spec.compiler - if spack.compilers.is_mixed_toolchain(self.compiler): - compiler_spec = self._get_real_compiler_spec("cc") or compiler_spec if any( [ compiler_spec.satisfies(s) @@ -105,25 +98,3 @@ def cmake_args(self): args = ["-DOMNI_CONF_OPTION=--with-libxml2=%s" % self.spec["libxml2"].prefix] return args - - def _get_real_compiler_spec(self, language): - lang_compiler = getattr(self.compiler, language) - - if not lang_compiler: - return None - - for compiler_name in spack.compilers.supported_compilers(): - compiler_cls = spack.compilers.class_for_compiler_name(compiler_name) - lang_version_fn = getattr(compiler_cls, "{0}_version".format(language)) - for regexp in compiler_cls.search_regexps(language): - if regexp.match(os.path.basename(lang_compiler)): - try: - detected_version = lang_version_fn(lang_compiler) - if detected_version: - compiler_version = Version(detected_version) - if compiler_version != Version("unknown"): - return spack.spec.CompilerSpec(compiler_name, compiler_version) - except Exception: - continue - - return None diff --git a/var/spack/repos/builtin/packages/clingo/package.py b/var/spack/repos/builtin/packages/clingo/package.py index 4c448043099..f1ae1d87ae3 100644 --- a/var/spack/repos/builtin/packages/clingo/package.py +++ b/var/spack/repos/builtin/packages/clingo/package.py @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) -from spack.compiler import UnsupportedCompilerFlag +from spack.compilers.error import UnsupportedCompilerFlag from spack.package import * @@ -38,8 +38,8 @@ class Clingo(CMakePackage): version("5.3.0", sha256="b0d406d2809352caef7fccf69e8864d55e81ee84f4888b0744894977f703f976") version("5.2.2", sha256="da1ef8142e75c5a6f23c9403b90d4f40b9f862969ba71e2aaee9a257d058bfcf") - depends_on("c", type="build") # generated - depends_on("cxx", type="build") # generated + depends_on("c", type="build") + depends_on("cxx", type="build") variant("docs", default=False, description="build documentation with Doxygen") variant("python", default=True, description="build with python bindings") @@ -100,7 +100,7 @@ def cmake_py_shared(self): def cmake_args(self): try: - self.compiler.cxx14_flag + self["cxx"].standard_flag(language="cxx", standard="14") except UnsupportedCompilerFlag: InstallError("clingo requires a C++14-compliant C++ compiler") diff --git a/var/spack/repos/builtin/packages/cmake/package.py b/var/spack/repos/builtin/packages/cmake/package.py index 955e5516cb5..cb0c665e0c2 100644 --- a/var/spack/repos/builtin/packages/cmake/package.py +++ b/var/spack/repos/builtin/packages/cmake/package.py @@ -245,16 +245,6 @@ def determine_version(cls, exe): match = re.search(r"cmake.*version\s+(\S+)", output) return match.group(1) if match else None - def flag_handler(self, name, flags): - if name == "cxxflags" and self.compiler.name == "fj": - cxx11plus_flags = (self.compiler.cxx11_flag, self.compiler.cxx14_flag) - cxxpre11_flags = self.compiler.cxx98_flag - if any(f in flags for f in cxxpre11_flags): - raise ValueError("cannot build cmake pre-c++11 standard") - elif not any(f in flags for f in cxx11plus_flags): - flags.append(self.compiler.cxx11_flag) - return (flags, None, None) - def bootstrap_args(self): spec = self.spec args = [] diff --git a/lib/spack/env/cc b/var/spack/repos/builtin/packages/compiler-wrapper/cc.sh similarity index 97% rename from lib/spack/env/cc rename to var/spack/repos/builtin/packages/compiler-wrapper/cc.sh index b6db53d2fa8..3cfb0ffbf86 100755 --- a/lib/spack/env/cc +++ b/var/spack/repos/builtin/packages/compiler-wrapper/cc.sh @@ -36,15 +36,9 @@ readonly lsep='' # the script runs. They are set by routines in spack.build_environment # as part of the package installation process. readonly params="\ -SPACK_ENV_PATH +SPACK_COMPILER_WRAPPER_PATH SPACK_DEBUG_LOG_DIR SPACK_DEBUG_LOG_ID -SPACK_COMPILER_SPEC -SPACK_CC_RPATH_ARG -SPACK_CXX_RPATH_ARG -SPACK_F77_RPATH_ARG -SPACK_FC_RPATH_ARG -SPACK_LINKER_ARG SPACK_SHORT_SPEC SPACK_SYSTEM_DIRS SPACK_MANAGED_DIRS" @@ -345,6 +339,9 @@ case "$command" in ;; ld|ld.gold|ld.lld) mode=ld + if [ -z "$SPACK_CC_RPATH_ARG" ]; then + comp="CXX" + fi ;; *) die "Unknown compiler: $command" @@ -399,10 +396,12 @@ fi # dtags_to_add="${SPACK_DTAGS_TO_ADD}" dtags_to_strip="${SPACK_DTAGS_TO_STRIP}" -linker_arg="${SPACK_LINKER_ARG}" + +linker_arg="ERROR: LINKER ARG WAS NOT SET, MAYBE THE PACKAGE DOES NOT DEPEND ON ${comp}?" +eval "linker_arg=\${SPACK_${comp}_LINKER_ARG:?${linker_arg}}" # Set up rpath variable according to language. -rpath="ERROR: RPATH ARG WAS NOT SET" +rpath="ERROR: RPATH ARG WAS NOT SET, MAYBE THE PACKAGE DOES NOT DEPEND ON ${comp}?" eval "rpath=\${SPACK_${comp}_RPATH_ARG:?${rpath}}" # Dump the mode and exit if the command is dump-mode. @@ -411,13 +410,6 @@ if [ "$SPACK_TEST_COMMAND" = "dump-mode" ]; then exit fi -# If, say, SPACK_CC is set but SPACK_FC is not, we want to know. Compilers do not -# *have* to set up Fortran executables, so we need to tell the user when a build is -# about to attempt to use them unsuccessfully. -if [ -z "$command" ]; then - die "Compiler '$SPACK_COMPILER_SPEC' does not have a $language compiler configured." -fi - # # Filter '.' and Spack environment directories out of PATH so that # this script doesn't just call itself @@ -426,7 +418,7 @@ new_dirs="" IFS=':' for dir in $PATH; do addpath=true - for spack_env_dir in $SPACK_ENV_PATH; do + for spack_env_dir in $SPACK_COMPILER_WRAPPER_PATH; do case "${dir%%/}" in "$spack_env_dir"|'.'|'') addpath=false @@ -787,15 +779,17 @@ case "$mode" in C) extend spack_flags_list SPACK_ALWAYS_CFLAGS extend spack_flags_list SPACK_CFLAGS + preextend flags_list SPACK_TARGET_ARGS_CC ;; CXX) extend spack_flags_list SPACK_ALWAYS_CXXFLAGS extend spack_flags_list SPACK_CXXFLAGS + preextend flags_list SPACK_TARGET_ARGS_CXX + ;; + F) + preextend flags_list SPACK_TARGET_ARGS_FORTRAN ;; esac - - # prepend target args - preextend flags_list SPACK_TARGET_ARGS ;; esac diff --git a/var/spack/repos/builtin/packages/compiler-wrapper/package.py b/var/spack/repos/builtin/packages/compiler-wrapper/package.py new file mode 100644 index 00000000000..50e0772f85d --- /dev/null +++ b/var/spack/repos/builtin/packages/compiler-wrapper/package.py @@ -0,0 +1,274 @@ +# Copyright Spack Project Developers. See COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +import pathlib +import shutil +import sys +from typing import List + +import archspec.cpu + +from llnl.util import lang + +import spack.compilers.libraries +import spack.package_base +from spack.package import * + + +class CompilerWrapper(Package): + """Spack compiler wrapper script. + + Compiler commands go through this compiler wrapper in Spack builds. + The compiler wrapper is a thin layer around the standard compilers. + It enables several key pieces of functionality: + + 1. It allows Spack to swap compilers into and out of builds easily. + 2. It adds several options to the compile line so that spack + packages can find their dependencies at build time and run time: + -I and/or -isystem arguments for dependency /include directories. + -L arguments for dependency /lib directories. + -Wl,-rpath arguments for dependency /lib directories. + 3. It provides a mechanism to inject flags from specs + """ + + homepage = "https://github.com/spack/spack" + url = f"file:///{pathlib.PurePath(__file__).parent}/cc.sh" + + # FIXME (compiler as nodes): use a different tag, since this is only to exclude + # this node from auto-generated rules + tags = ["runtime"] + + license("Apache-2.0 OR MIT") + + if sys.platform != "win32": + version( + "1.0", + sha256="c65a9d2b2d4eef67ab5cb0684d706bb9f005bb2be94f53d82683d7055bdb837c", + expand=False, + ) + else: + version("1.0") + has_code = False + + def bin_dir(self) -> pathlib.Path: + # This adds an extra "spack" subdir, so that the script and symlinks don't get + # their way to the default view + return pathlib.Path(str(self.prefix)) / "libexec" / "spack" + + def install(self, spec, prefix): + if sys.platform == "win32": + placeholder = self.bin_dir() / "placeholder-wrapper" + placeholder.parent.mkdir(parents=True) + placeholder.write_text( + "This file is a placeholder for the compiler wrapper on Windows." + ) + return + + cc_script = pathlib.Path(self.stage.source_path) / "cc.sh" + bin_dir = self.bin_dir() + + # Copy the script + bin_dir.mkdir(parents=True) + installed_script = bin_dir / "cc" + shutil.copy(cc_script, str(installed_script)) + set_executable(installed_script) + + # Create links to use the script under different names + for name in ( + "ld.lld", + "ld.gold", + "ld", + "ftn", + "fc", + "f95", + "f90", + "f77", + "cpp", + "c99", + "c89", + "c++", + ): + (bin_dir / name).symlink_to(installed_script) + + for subdir, name in ( + ("aocc", "clang"), + ("aocc", "clang++"), + ("aocc", "flang"), + ("arm", "armclang"), + ("arm", "armclang++"), + ("arm", "armflang"), + ("case-insensitive", "CC"), + ("cce", "cc"), + ("cce", "craycc"), + ("cce", "crayftn"), + ("cce", "ftn"), + ("clang", "clang"), + ("clang", "clang++"), + ("clang", "flang"), + ("fj", "fcc"), + ("fj", "frt"), + ("gcc", "gcc"), + ("gcc", "g++"), + ("gcc", "gfortran"), + ("intel", "icc"), + ("intel", "icpc"), + ("intel", "ifort"), + ("nag", "nagfor"), + ("nvhpc", "nvc"), + ("nvhpc", "nvc++"), + ("nvhpc", "nvfortran"), + ("oneapi", "icx"), + ("oneapi", "icpx"), + ("oneapi", "ifx"), + ("rocmcc", "amdclang"), + ("rocmcc", "amdclang++"), + ("rocmcc", "amdflang"), + ("xl", "xlc"), + ("xl", "xlc++"), + ("xl", "xlf"), + ("xl", "xlf90"), + ("xl_r", "xlc_r"), + ("xl_r", "xlc++_r"), + ("xl_r", "xlf_r"), + ("xl_r", "xlf90_r"), + ): + (bin_dir / subdir).mkdir(exist_ok=True) + (bin_dir / subdir / name).symlink_to(installed_script) + + # Extra symlinks for Cray + cray_dir = bin_dir / "cce" / "case-insensitive" + cray_dir.mkdir(exist_ok=True) + (cray_dir / "crayCC").symlink_to(installed_script) + (cray_dir / "CC").symlink_to(installed_script) + + def setup_dependent_build_environment(self, env, dependent_spec): + if sys.platform == "win32": + return + + _var_list = [] + if dependent_spec.has_virtual_dependency("c"): + _var_list.append(("c", "cc", "CC", "SPACK_CC")) + + if dependent_spec.has_virtual_dependency("cxx"): + _var_list.append(("cxx", "cxx", "CXX", "SPACK_CXX")) + + if dependent_spec.has_virtual_dependency("fortran"): + _var_list.append(("fortran", "fortran", "F77", "SPACK_F77")) + _var_list.append(("fortran", "fortran", "FC", "SPACK_FC")) + + # The package is not used as a compiler, so skip this setup + if not _var_list: + return + + bin_dir = self.bin_dir() + implicit_rpaths, env_paths = [], [] + for language, attr_name, wrapper_var_name, spack_var_name in _var_list: + compiler_pkg = dependent_spec[language].package + if not hasattr(compiler_pkg, attr_name): + continue + + compiler = getattr(compiler_pkg, attr_name) + env.set(spack_var_name, compiler) + + if language not in compiler_pkg.compiler_wrapper_link_paths: + continue + + wrapper_path = bin_dir / compiler_pkg.compiler_wrapper_link_paths.get(language) + + env.set(wrapper_var_name, str(wrapper_path)) + env.set(f"SPACK_{wrapper_var_name}_RPATH_ARG", compiler_pkg.rpath_arg) + + uarch = dependent_spec.architecture.target + version_number, _ = archspec.cpu.version_components( + compiler_pkg.spec.version.dotted_numeric_string + ) + try: + isa_arg = uarch.optimization_flags(compiler_pkg.archspec_name(), version_number) + except (ValueError, archspec.cpu.UnsupportedMicroarchitecture): + isa_arg = "" + + if isa_arg: + env.set(f"SPACK_TARGET_ARGS_{attr_name.upper()}", isa_arg) + + # Add spack build environment path with compiler wrappers first in + # the path. We add the compiler wrapper path, which includes default + # wrappers (cc, c++, f77, f90), AND a subdirectory containing + # compiler-specific symlinks. The latter ensures that builds that + # are sensitive to the *name* of the compiler see the right name when + # we're building with the wrappers. + # + # Conflicts on case-insensitive systems (like "CC" and "cc") are + # handled by putting one in the /case-insensitive + # directory. Add that to the path too. + compiler_specific_dir = ( + bin_dir / compiler_pkg.compiler_wrapper_link_paths[language] + ).parent + + for item in [bin_dir, compiler_specific_dir]: + env_paths.append(item) + ci = item / "case-insensitive" + if ci.is_dir(): + env_paths.append(ci) + + env.set(f"SPACK_{wrapper_var_name}_LINKER_ARG", compiler_pkg.linker_arg) + + # Check if this compiler has implicit rpaths + implicit_rpaths.extend(_implicit_rpaths(pkg=compiler_pkg)) + + if implicit_rpaths: + # Implicit rpaths are accumulated across all compilers so, whenever they are mixed, + # the compiler used in ccld mode will account for rpaths from other compilers too. + implicit_rpaths = lang.dedupe(implicit_rpaths) + env.set("SPACK_COMPILER_IMPLICIT_RPATHS", ":".join(implicit_rpaths)) + + env.set("SPACK_ENABLE_NEW_DTAGS", self.enable_new_dtags) + env.set("SPACK_DISABLE_NEW_DTAGS", self.disable_new_dtags) + + for item in env_paths: + env.prepend_path("SPACK_COMPILER_WRAPPER_PATH", item) + + def setup_dependent_package(self, module, dependent_spec): + bin_dir = self.bin_dir() + + if dependent_spec.has_virtual_dependency("c"): + compiler_pkg = dependent_spec["c"].package + setattr( + module, "spack_cc", str(bin_dir / compiler_pkg.compiler_wrapper_link_paths["c"]) + ) + + if dependent_spec.has_virtual_dependency("cxx"): + compiler_pkg = dependent_spec["cxx"].package + setattr( + module, "spack_cxx", str(bin_dir / compiler_pkg.compiler_wrapper_link_paths["cxx"]) + ) + + if dependent_spec.has_virtual_dependency("fortran"): + compiler_pkg = dependent_spec["fortran"].package + setattr( + module, + "spack_fc", + str(bin_dir / compiler_pkg.compiler_wrapper_link_paths["fortran"]), + ) + setattr( + module, + "spack_f77", + str(bin_dir / compiler_pkg.compiler_wrapper_link_paths["fortran"]), + ) + + @property + def disable_new_dtags(self) -> str: + if self.spec.satisfies("platform=darwin"): + return "" + return "--disable-new-dtags" + + @property + def enable_new_dtags(self) -> str: + if self.spec.satisfies("platform=darwin"): + return "" + return "--enable-new-dtags" + + +def _implicit_rpaths(pkg: spack.package_base.PackageBase) -> List[str]: + detector = spack.compilers.libraries.CompilerPropertyDetector(pkg.spec) + paths = detector.implicit_rpaths() + return paths diff --git a/var/spack/repos/builtin/packages/conduit/package.py b/var/spack/repos/builtin/packages/conduit/package.py index 9eaf01df577..2396546da73 100644 --- a/var/spack/repos/builtin/packages/conduit/package.py +++ b/var/spack/repos/builtin/packages/conduit/package.py @@ -302,10 +302,11 @@ def _get_host_config_path(self, spec): # if on llnl systems, we can use the SYS_TYPE if "SYS_TYPE" in env: sys_type = env["SYS_TYPE"] - host_config_path = "{0}-{1}-{2}-conduit-{3}.cmake".format( - socket.gethostname(), sys_type, spec.compiler, spec.dag_hash() - ) + compiler_str = f"{self['c'].name}-{self['c'].version}" + host_config_path = ( + f"{socket.gethostname()}-{sys_type}-{compiler_str}" f"-conduit-{spec.dag_hash()}.cmake" + ) dest_dir = self.stage.source_path host_config_path = os.path.abspath(join_path(dest_dir, host_config_path)) return host_config_path diff --git a/var/spack/repos/builtin/packages/cray-libsci/package.py b/var/spack/repos/builtin/packages/cray-libsci/package.py index c4802df7b79..df81b412847 100644 --- a/var/spack/repos/builtin/packages/cray-libsci/package.py +++ b/var/spack/repos/builtin/packages/cray-libsci/package.py @@ -62,7 +62,10 @@ def external_prefix(self): @property def blas_libs(self): shared = True if "+shared" in self.spec else False - compiler = self.spec.compiler.name + + candidates = [name for name in self.canonical_names.values() if name in self.prefix] + if len(candidates) != 1: + raise RuntimeError("cannot determine libsci libraries") lib = [] if self.spec.satisfies("+openmp") and self.spec.satisfies("+mpi"): @@ -76,7 +79,7 @@ def blas_libs(self): libname = [] for lib_fmt in lib: - libname.append(lib_fmt.format(self.canonical_names[compiler].lower())) + libname.append(lib_fmt.format(candidates[0].lower())) return find_libraries(libname, root=self.prefix.lib, shared=shared, recursive=False) diff --git a/var/spack/repos/builtin/packages/cray-mpich/package.py b/var/spack/repos/builtin/packages/cray-mpich/package.py index 485ca4da6eb..8be3e5ae2dd 100644 --- a/var/spack/repos/builtin/packages/cray-mpich/package.py +++ b/var/spack/repos/builtin/packages/cray-mpich/package.py @@ -79,10 +79,15 @@ def setup_run_environment(self, env): self.setup_mpi_wrapper_variables(env) return - env.set("MPICC", self.compiler.cc) - env.set("MPICXX", self.compiler.cxx) - env.set("MPIFC", self.compiler.fc) - env.set("MPIF77", self.compiler.f77) + if self.spec.has_virtual_dependency("c"): + env.set("MPICC", self["c"].cc) + + if self.spec.has_virtual_dependency("cxx"): + env.set("MPICXX", self["cxx"].cxx) + + if self.spec.has_virtual_dependency("fortran"): + env.set("MPIFC", self["fortran"].fortran) + env.set("MPIF77", self["fortran"].fortran) def setup_dependent_package(self, module, dependent_spec): spec = self.spec diff --git a/var/spack/repos/builtin/packages/cray-mvapich2/package.py b/var/spack/repos/builtin/packages/cray-mvapich2/package.py index f362b89503c..265e9ef5015 100644 --- a/var/spack/repos/builtin/packages/cray-mvapich2/package.py +++ b/var/spack/repos/builtin/packages/cray-mvapich2/package.py @@ -29,10 +29,15 @@ class CrayMvapich2(MpichEnvironmentModifications, Package): requires("platform=linux", msg="Cray MVAPICH2 is only available on Cray") def setup_run_environment(self, env): - env.set("MPICC", self.compiler.cc) - env.set("MPICXX", self.compiler.cxx) - env.set("MPIFC", self.compiler.fc) - env.set("MPIF77", self.compiler.f77) + if self.spec.has_virtual_dependency("c"): + env.set("MPICC", self["c"].cc) + + if self.spec.has_virtual_dependency("cxx"): + env.set("MPICXX", self["cxx"].cxx) + + if self.spec.has_virtual_dependency("fortran"): + env.set("MPIFC", self["fortran"].fortran) + env.set("MPIF77", self["fortran"].fortran) def install(self, spec, prefix): raise InstallError( diff --git a/var/spack/repos/builtin/packages/cuda/package.py b/var/spack/repos/builtin/packages/cuda/package.py index 72dd1cc5604..1743adcd82f 100644 --- a/var/spack/repos/builtin/packages/cuda/package.py +++ b/var/spack/repos/builtin/packages/cuda/package.py @@ -727,7 +727,8 @@ def setup_build_environment(self, env): env.append_path("LD_LIBRARY_PATH", libxml2_home.lib) def setup_dependent_build_environment(self, env, dependent_spec): - env.set("CUDAHOSTCXX", dependent_spec.package.compiler.cxx) + if "cxx" in dependent_spec: + env.set("CUDAHOSTCXX", dependent_spec["cxx"].package.cxx) env.set("CUDA_HOME", self.prefix) env.set("NVHPC_CUDA_HOME", self.prefix) diff --git a/var/spack/repos/builtin/packages/cxx/package.py b/var/spack/repos/builtin/packages/cxx/package.py index 000d345ceec..daf88e61041 100644 --- a/var/spack/repos/builtin/packages/cxx/package.py +++ b/var/spack/repos/builtin/packages/cxx/package.py @@ -4,8 +4,6 @@ import os -import spack.compilers -import spack.spec from spack.package import * @@ -17,25 +15,14 @@ class Cxx(Package): def test_cxx(self): """Compile and run 'Hello World'""" - cxx = which(os.environ["CXX"]) expected = ["Hello world", "YES!"] - + cxx = Executable(self.cxx) test_source = self.test_suite.current_test_data_dir for test in os.listdir(test_source): exe_name = f"{test}.exe" - filepath = test_source.join(test) with test_part(self, f"test_cxx_{test}", f"build and run {exe_name}"): - # standard options - # Hack to get compiler attributes - # TODO: remove this when compilers are dependencies - c_name = clang if self.spec.satisfies("llvm+clang") else self.name - c_spec = spack.spec.CompilerSpec(c_name, self.spec.version) - c_cls = spack.compilers.class_for_compiler_name(c_name) - compiler = c_cls(c_spec, None, None, ["fakecc", "fakecxx"]) - cxx_opts = [compiler.cxx11_flag] if "c++11" in test else [] - cxx_opts += ["-o", exe_name, filepath] - - cxx(*cxx_opts) + filepath = join_path(test_source, test) + cxx("-o", exe_name, filepath) exe = which(exe_name) out = exe(output=str.split, error=str.split) check_outputs(expected, out) diff --git a/var/spack/repos/builtin/packages/dealii/package.py b/var/spack/repos/builtin/packages/dealii/package.py index c75ccfe3de0..1f55d7e87e6 100644 --- a/var/spack/repos/builtin/packages/dealii/package.py +++ b/var/spack/repos/builtin/packages/dealii/package.py @@ -54,9 +54,9 @@ class Dealii(CMakePackage, CudaPackage): version("8.2.1", sha256="d75674e45fe63cd9fa294460fe45228904d51a68f744dbb99cd7b60720f3b2a0") version("8.1.0", sha256="d666bbda2a17b41b80221d7029468246f2658051b8c00d9c5907cd6434c4df99") - 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") # Configuration variants variant( @@ -685,7 +685,7 @@ def cmake_args(self): # Add flags for machine vectorization, used when tutorials # and user code is built. # See https://github.com/dealii/dealii/issues/9164 - options.append(self.define("DEAL_II_CXX_FLAGS", os.environ["SPACK_TARGET_ARGS"])) + options.append(self.define("DEAL_II_CXX_FLAGS", os.environ["SPACK_TARGET_ARGS_CXX"])) # platform introspection - needs to be disabled in some environments if spec.satisfies("+platform-introspection"): diff --git a/var/spack/repos/builtin/packages/esmf/package.py b/var/spack/repos/builtin/packages/esmf/package.py index 0b4da2bcaed..ea4257c94d5 100644 --- a/var/spack/repos/builtin/packages/esmf/package.py +++ b/var/spack/repos/builtin/packages/esmf/package.py @@ -7,7 +7,6 @@ import spack.build_systems.makefile import spack.build_systems.python -import spack.compiler from spack.build_environment import dso_suffix, stat_suffix from spack.package import * @@ -259,29 +258,16 @@ def setup_build_environment(self, env): # ESMF_COMPILER must be set to select which Fortran and # C++ compilers are being used to build the ESMF library. - if self.pkg.compiler.name == "gcc": + if spec["fortran"].name == "gcc" and spec["c"].name == "gcc": + gfortran_major_version = int(spec["fortran"].version[0]) env.set("ESMF_COMPILER", "gfortran") - with self.pkg.compiler.compiler_environment(): - gfortran_major_version = int( - spack.compiler.get_compiler_version_output( - self.pkg.compiler.fc, "-dumpversion" - ).split(".")[0] - ) elif self.pkg.compiler.name == "intel" or self.pkg.compiler.name == "oneapi": env.set("ESMF_COMPILER", "intel") - elif self.pkg.compiler.name in ["clang", "apple-clang"]: - if "flang" in self.pkg.compiler.fc: - env.set("ESMF_COMPILER", "llvm") - elif "gfortran" in self.pkg.compiler.fc: - env.set("ESMF_COMPILER", "gfortranclang") - with self.pkg.compiler.compiler_environment(): - gfortran_major_version = int( - spack.compiler.get_compiler_version_output( - self.pkg.compiler.fc, "-dumpversion" - ).split(".")[0] - ) - else: - raise InstallError("Unsupported C/C++/Fortran compiler combination") + elif spec["fortran"].name == "gcc" and spec["c"].name in ["clang", "apple-clang"]: + gfortran_major_version = int(spec["fortran"].version[0]) + env.set("ESMF_COMPILER", "gfortranclang") + elif spec["fortran"].name == "llvm": + env.set("ESMF_COMPILER", "llvm") elif self.pkg.compiler.name == "nag": env.set("ESMF_COMPILER", "nag") elif self.pkg.compiler.name == "nvhpc": diff --git a/var/spack/repos/builtin/packages/fj/package.py b/var/spack/repos/builtin/packages/fj/package.py index 3f0898330f0..dd31eddac73 100644 --- a/var/spack/repos/builtin/packages/fj/package.py +++ b/var/spack/repos/builtin/packages/fj/package.py @@ -1,6 +1,8 @@ # Copyright Spack Project Developers. See COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) +import os.path + from spack.package import * @@ -14,6 +16,9 @@ class Fj(Package, CompilerPackage): maintainers("t-karatsu") + provides("c", "cxx") + provides("fortran") + def install(self, spec, prefix): raise InstallError( "Fujitsu compilers are not installable yet, but can be " @@ -26,3 +31,29 @@ def install(self, spec, prefix): fortran_names = ["frt"] compiler_version_regex = r"\((?:FCC|FRT)\) ([a-z\d.]+)" compiler_version_argument = "--version" + + debug_flags = ["-g"] + opt_flags = ["-O0", "-O1", "-O2", "-O3", "-Ofast"] + + pic_flag = "-KPIC" + openmp_flag = "-Kopenmp" + + compiler_wrapper_link_paths = { + "c": os.path.join("fj", "fcc"), + "cxx": os.path.join("fj", "case-insensitive", "FCC"), + "fortran": os.path.join("fj", "frt"), + } + + implicit_rpath_libs = ["libfj90i", "libfj90f", "libfjsrcinfo"] + + def _standard_flag(self, *, language, standard): + flags = { + "cxx": { + "98": "-std=c++98", + "11": "-std=c++11", + "14": "-std=c++14", + "17": "-std=c++17", + }, + "c": {"99": "-std=c99", "11": "-std=c11"}, + } + return flags[language][standard] diff --git a/var/spack/repos/builtin/packages/gcc-runtime/package.py b/var/spack/repos/builtin/packages/gcc-runtime/package.py index 95680003b7a..2c12f6eee99 100644 --- a/var/spack/repos/builtin/packages/gcc-runtime/package.py +++ b/var/spack/repos/builtin/packages/gcc-runtime/package.py @@ -27,8 +27,6 @@ class GccRuntime(Package): license("GPL-3.0-or-later WITH GCC-exception-3.1") - requires("%gcc") - LIBRARIES = [ "asan", "atomic", @@ -47,15 +45,18 @@ class GccRuntime(Package): # libgfortran ABI provides("fortran-rt", "libgfortran") - provides("libgfortran@3", when="%gcc@:6") - provides("libgfortran@4", when="%gcc@7") - provides("libgfortran@5", when="%gcc@8:") + provides("libgfortran@3", when="@:6") + provides("libgfortran@4", when="@7") + provides("libgfortran@5", when="@8:") depends_on("libc", type="link", when="platform=linux") + depends_on("gcc", type="build") + def install(self, spec, prefix): + gcc_pkg = self["gcc"] if spec.platform in ["linux", "freebsd"]: - libraries = get_elf_libraries(compiler=self.compiler, libraries=self.LIBRARIES) + libraries = get_elf_libraries(compiler=gcc_pkg, libraries=self.LIBRARIES) elif spec.platform == "darwin": libraries = self._get_libraries_macho() else: @@ -75,9 +76,8 @@ def install(self, spec, prefix): def _get_libraries_macho(self): """Same as _get_libraries_elf but for Mach-O binaries""" - cc = Executable(self.compiler.cc) + cc = self._get_compiler() path_and_install_name = [] - for name in self.LIBRARIES: if name == "gcc_s": # On darwin, libgcc_s is versioned and can't be linked as -lgcc_s, @@ -115,6 +115,23 @@ def _get_libraries_macho(self): return path_and_install_name + def _get_compiler(self): + gcc_pkg = self["gcc"] + exe_path = None + for attr_name in ("cc", "cxx", "fortran"): + try: + exe_path = getattr(gcc_pkg, attr_name) + except AttributeError: + pass + + if not exe_path: + continue + cc = Executable(exe_path) + break + else: + raise InstallError(f"cannot find any compiler for {gcc_pkg.spec}") + return cc + @property def libs(self): # Currently these libs are not linkable with -l, they all have a suffix. diff --git a/var/spack/repos/builtin/packages/gcc/package.py b/var/spack/repos/builtin/packages/gcc/package.py index 9566b4db95c..697204b8354 100644 --- a/var/spack/repos/builtin/packages/gcc/package.py +++ b/var/spack/repos/builtin/packages/gcc/package.py @@ -9,7 +9,7 @@ from llnl.util.symlink import readlink -import spack.compiler +import spack.build_systems.compiler import spack.platforms import spack.repo import spack.util.libc @@ -32,9 +32,10 @@ class Gcc(AutotoolsPackage, GNUMirrorPackage, CompilerPackage): license("GPL-2.0-or-later AND LGPL-2.1-or-later") - provides("c") - provides("cxx") - provides("fortran") + provides("c", "cxx", when="languages=c,c++") + provides("c", when="languages=c") + provides("cxx", when="languages=c++") + provides("fortran", when="languages=fortran") version("master", branch="master") @@ -190,10 +191,7 @@ class Gcc(AutotoolsPackage, GNUMirrorPackage, CompilerPackage): "RelWithDebInfo: -O2 -g; MinSizeRel: -Os", ) variant( - "profiled", - default=False, - description="Use Profile Guided Optimization", - when="+bootstrap %gcc", + "profiled", default=False, description="Use Profile Guided Optimization", when="+bootstrap" ) depends_on("flex", type="build", when="@master") @@ -594,7 +592,12 @@ def supported_languages(self): # This weirdness is because it could be called on an abstract spec if "languages" not in self.spec.variants: return self.compiler_languages - return [x for x in self.compiler_languages if x in self.spec.variants["languages"].value] + variant_value = {"cxx": "c++"} + return [ + x + for x in self.compiler_languages + if self.spec.satisfies(f"languages={variant_value.get(x, x)}") + ] c_names = ["gcc"] cxx_names = ["g++"] @@ -605,6 +608,40 @@ def supported_languages(self): compiler_version_regex = r"([0-9.]+)" compiler_version_argument = ("-dumpfullversion", "-dumpversion") + compiler_wrapper_link_paths = { + "c": os.path.join("gcc", "gcc"), + "cxx": os.path.join("gcc", "g++"), + "fortran": os.path.join("gcc", "gfortran"), + } + + debug_flags = ["-g", "-gstabs+", "-gstabs", "-gxcoff+", "-gxcoff", "-gvms"] + opt_flags = ["-O", "-O0", "-O1", "-O2", "-O3", "-Os", "-Ofast", "-Og"] + + implicit_rpath_libs = ["libgcc", "libgfortran"] + stdcxx_libs = "-lstdc++" + + def _standard_flag(self, *, language, standard): + flags = { + "cxx": { + "98": [("@6:", "-std=c++98"), ("@:5", "")], + "11": [("@4.3:4.6", "-std=c++0x"), ("@4.7:", "-std=c++11")], + "14": [("@4.8", "-std=c++1y"), ("@4.9:", "-std=c++14")], + "17": [("@5", "-std=c++1z"), ("@6:", "-std=c++17")], + "20": [("@8:10", "-std=c++2a"), ("@11:", "-std=c++20")], + "23": [("@11:13", "-std=c++2b"), ("@14:", "-std=c++23")], + }, + "c": {"99": [("@4.5:", "-std=c99")], "11": [("@4.7:", "-std=c11")]}, + } + for condition, flag in flags[language][standard]: + if self.spec.satisfies(condition): + return flag + + else: + raise RuntimeError( + f"{self.spec} does not support the '{standard}' standard " + f"for the '{language}' language" + ) + @classmethod def filter_detected_exes(cls, prefix, exes_in_prefix): # Apple's gcc is actually apple clang, so skip it. @@ -612,7 +649,9 @@ def filter_detected_exes(cls, prefix, exes_in_prefix): not_apple_clang = [] for exe in exes_in_prefix: try: - output = spack.compiler.get_compiler_version_output(exe, "--version") + output = spack.build_systems.compiler.compiler_output( + exe, version_argument="--version" + ) except Exception: output = "" if "clang version" in output: @@ -652,38 +691,20 @@ def validate_detected_spec(cls, spec, extra_attributes): msg = "{0} not in {1}" assert key in compilers, msg.format(key, spec) - @property - def cc(self): - msg = "cannot retrieve C compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("c", None) - result = None + def _cc_path(self): if self.spec.satisfies("languages=c"): - result = str(self.spec.prefix.bin.gcc) - return result + return str(self.spec.prefix.bin.gcc) + return None - @property - def cxx(self): - msg = "cannot retrieve C++ compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("cxx", None) - result = None + def _cxx_path(self): if self.spec.satisfies("languages=c++"): - result = os.path.join(self.spec.prefix.bin, "g++") - return result + return os.path.join(self.spec.prefix.bin, "g++") + return None - @property - def fortran(self): - msg = "cannot retrieve Fortran compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("fortran", None) - result = None + def _fortran_path(self): if self.spec.satisfies("languages=fortran"): - result = str(self.spec.prefix.bin.gfortran) - return result + return str(self.spec.prefix.bin.gfortran) + return None def url_for_version(self, version): # This function will be called when trying to fetch from url, before @@ -1145,7 +1166,7 @@ def runtime_constraints(cls, *, spec, pkg): ) pkg("*").depends_on( f"gcc-runtime@{str(spec.version)}:", - when=f"%{str(spec)}", + when=f"^[deptypes=build] {spec.name}@{spec.versions}", type="link", description=f"If any package uses %{str(spec)}, " f"it depends on gcc-runtime@{str(spec.version)}:", @@ -1160,18 +1181,21 @@ def runtime_constraints(cls, *, spec, pkg): for fortran_virtual in ("fortran-rt", gfortran_str): pkg("*").depends_on( fortran_virtual, - when=f"%{str(spec)}", - languages=["fortran"], + when=f"^[virtuals=fortran deptypes=build] {spec.name}@{spec.versions}", type="link", description=f"Add a dependency on '{gfortran_str}' for nodes compiled with " f"{str(spec)} and using the 'fortran' language", ) # The version of gcc-runtime is the same as the %gcc used to "compile" it - pkg("gcc-runtime").requires(f"@={str(spec.version)}", when=f"%{str(spec)}") + pkg("gcc-runtime").requires( + f"@{str(spec.versions)}", when=f"^[deptypes=build] {spec.name}@{spec.versions}" + ) # If a node used %gcc@X.Y its dependencies must use gcc-runtime@:X.Y # (technically @:X is broader than ... <= @=X but this should work in practice) - pkg("*").propagate(f"%gcc@:{str(spec.version)}", when=f"%{str(spec)}") + pkg("*").propagate( + f"gcc@:{str(spec.version)}", when=f"^[deptypes=build] {spec.name}@{spec.versions}" + ) def _post_buildcache_install_hook(self): if not self.spec.satisfies("platform=linux"): diff --git a/var/spack/repos/builtin/packages/glibc/package.py b/var/spack/repos/builtin/packages/glibc/package.py index 3e2130a217e..46d851c5d5f 100644 --- a/var/spack/repos/builtin/packages/glibc/package.py +++ b/var/spack/repos/builtin/packages/glibc/package.py @@ -111,6 +111,8 @@ class Glibc(AutotoolsPackage, GNUMirrorPackage): # include_next not working patch("67fbfa5.patch", when="@:2.7") + conflicts("musl") + def setup_build_environment(self, env): if self.spec.satisfies("@:2.21"): env.append_flags("LDFLAGS", "-no-pie") diff --git a/var/spack/repos/builtin/packages/go/package.py b/var/spack/repos/builtin/packages/go/package.py index fef03bec1c4..6433e57d063 100644 --- a/var/spack/repos/builtin/packages/go/package.py +++ b/var/spack/repos/builtin/packages/go/package.py @@ -86,6 +86,9 @@ class Go(Package): phases = ["build", "install"] + depends_on("c", type="build") + depends_on("cxx", type="build") + def url_for_version(self, version): return f"https://go.dev/dl/go{version}.src.tar.gz" @@ -98,8 +101,8 @@ def determine_version(cls, exe): def setup_build_environment(self, env): # We need to set CC/CXX_FOR_TARGET, otherwise cgo will use the # internal Spack wrappers and fail. - env.set("CC_FOR_TARGET", self.compiler.cc) - env.set("CXX_FOR_TARGET", self.compiler.cxx) + env.set("CC_FOR_TARGET", self["c"].cc) + env.set("CXX_FOR_TARGET", self["cxx"].cxx) env.set("GOMAXPROCS", make_jobs) def build(self, spec, prefix): diff --git a/var/spack/repos/builtin/packages/gromacs/package.py b/var/spack/repos/builtin/packages/gromacs/package.py index d1da47a684b..9d24159d724 100644 --- a/var/spack/repos/builtin/packages/gromacs/package.py +++ b/var/spack/repos/builtin/packages/gromacs/package.py @@ -738,7 +738,7 @@ def cmake_args(self): ): with open(".".join([os.environ["SPACK_CXX"], "cfg"]), "r") as f: options.append("-DCMAKE_CXX_FLAGS={}".format(f.read())) - elif self.spec.satisfies("^gcc"): + elif self.spec["cxx"].name == "gcc": options.append("-DGMX_GPLUSPLUS_PATH=%s/g++" % self.spec["gcc"].prefix.bin) if self.spec.satisfies("+double"): diff --git a/var/spack/repos/builtin/packages/intel-oneapi-compilers-classic/package.py b/var/spack/repos/builtin/packages/intel-oneapi-compilers-classic/package.py index f6dcbec83ec..0755331d973 100644 --- a/var/spack/repos/builtin/packages/intel-oneapi-compilers-classic/package.py +++ b/var/spack/repos/builtin/packages/intel-oneapi-compilers-classic/package.py @@ -40,6 +40,19 @@ def compiler_version_regex(self): return r"([1-9][0-9]*\.[0-9]*\.[0-9]*)" return r"\((?:IFORT|ICC)\) ([^ ]+)" + compiler_wrapper_link_paths = { + "c": os.path.join("intel", "icc"), + "cxx": os.path.join("intel", "icpc"), + "fortran": os.path.join("intel", "ifort"), + } + + implicit_rpath_libs = ["libirc", "libifcore", "libifcoremt", "libirng"] + + stdcxx_libs = ("-cxxlib",) + + provides("c", "cxx") + provides("fortran") + # Versions before 2021 are in the `intel` package # intel-oneapi versions before 2022 use intel@19.0.4 for ver, oneapi_ver in { @@ -86,6 +99,20 @@ def setup_run_environment(self, env): env.set("F77", bin_prefix.ifort) env.set("FC", bin_prefix.ifort) + def setup_dependent_build_environment(self, env, dependent_spec): + super().setup_dependent_build_environment(env, dependent_spec) + # Edge cases for Intel's oneAPI compilers when using the legacy classic compilers: + # Always pass flags to disable deprecation warnings, since these warnings can + # confuse tools that parse the output of compiler commands (e.g. version checks). + if dependent_spec.satisfies("^[virtuals=c] intel-oneapi-compilers-classic"): + env.append_flags("SPACK_ALWAYS_CFLAGS", "-diag-disable=10441") + + if dependent_spec.satisfies("^[virtuals=cxx] intel-oneapi-compilers-classic"): + env.append_flags("SPACK_ALWAYS_CXXFLAGS", "-diag-disable=10441") + + if dependent_spec.satisfies("^[virtuals=fortran] intel-oneapi-compilers-classic"): + env.append_flags("SPACK_ALWAYS_FFLAGS", "-diag-disable=10448") + def install(self, spec, prefix): # If we symlink top-level directories directly, files won't show up in views # Create real dirs and symlink files instead @@ -108,3 +135,15 @@ def symlink_dir(self, src, dest): link_tree.merge(dest_path) else: os.symlink(src_path, dest_path) + + def _cc_path(self): + return str(self.prefix.bin.icc) + + def _cxx_path(self): + return str(self.prefix.bin.icpc) + + def _fortran_path(self): + return str(self.prefix.bin.ifort) + + def archspec_name(self): + return "intel" 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 7e6961af478..11a8feb3eb8 100644 --- a/var/spack/repos/builtin/packages/intel-oneapi-compilers/package.py +++ b/var/spack/repos/builtin/packages/intel-oneapi-compilers/package.py @@ -1,9 +1,11 @@ # Copyright Spack Project Developers. See COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) - import os +import os.path +import pathlib import platform +import warnings from spack.build_environment import dso_suffix from spack.package import * @@ -340,6 +342,46 @@ class IntelOneapiCompilers(IntelOneApiPackage, CompilerPackage): r"(?:(?:oneAPI DPC\+\+(?:\/C\+\+)? Compiler)|(?:\(IFORT\))|(?:\(IFX\))) (\S+)" ) + debug_flags = ["-debug", "-g", "-g0", "-g1", "-g2", "-g3"] + opt_flags = ["-O", "-O0", "-O1", "-O2", "-O3", "-Ofast", "-Os"] + + openmp_flag = "-fiopenmp" + + compiler_wrapper_link_paths = { + "c": os.path.join("oneapi", "icx"), + "cxx": os.path.join("oneapi", "icpx"), + "fortran": os.path.join("oneapi", "ifx"), + } + + implicit_rpath_libs = [ + "libirc", + "libifcore", + "libifcoremt", + "libirng", + "libsvml", + "libintlc", + "libimf", + "libsycl", + "libOpenCL", + ] + + stdcxx_libs = ("-cxxlib",) + + provides("c", "cxx") + provides("fortran") + + def _standard_flag(self, *, language, standard): + flags = { + "cxx": { + "11": "-std=c++11", + "14": "-std=c++14", + "17": "-std=c++17", + "20": "-std=c++20", + }, + "c": {"99": "-std=c99", "11": "-std=c1x"}, + } + return flags[language][standard] + # See https://github.com/spack/spack/issues/39252 depends_on("patchelf@:0.17", type="build", when="@:2024.1") # Add the nvidia variant @@ -348,10 +390,8 @@ class IntelOneapiCompilers(IntelOneApiPackage, CompilerPackage): # Add the amd variant variant("amd", default=False, description="Install AMD plugin for OneAPI") conflicts("@:2022.2.1", when="+amd", msg="Codeplay AMD plugin requires newer release") - # TODO: effectively gcc is a direct dependency of intel-oneapi-compilers, but we - # cannot express that properly. For now, add conflicts for non-gcc compilers - # instead. - requires("%gcc", msg="intel-oneapi-compilers must be installed with %gcc") + + depends_on("gcc languages=c,c++", type="run") for v in versions: version(v["version"], expand=False, **v["cpp"]) @@ -430,6 +470,31 @@ def setup_run_environment(self, env): env.set("F77", self._llvm_bin.ifx) env.set("FC", self._llvm_bin.ifx) + def setup_dependent_build_environment(self, env, dependent_spec): + super().setup_dependent_build_environment(env, dependent_spec) + # workaround bug in icpx driver where it requires sycl-post-link is on the PATH + # It is located in the same directory as the driver. Error message: + # clang++: error: unable to execute command: + # Executable "sycl-post-link" doesn't exist! + # also ensures that shared objects and libraries required by the compiler, + # e.g. libonnx, can be found succesfully + # due to a fix, this is no longer required for OneAPI versions >= 2024.2 + bin_dir = os.path.dirname(self.cxx) + lib_dir = os.path.join(os.path.dirname(bin_dir), "lib") + if self.cxx and self.spec.satisfies("%oneapi@:2024.1"): + env.prepend_path("PATH", bin_dir) + env.prepend_path("LD_LIBRARY_PATH", lib_dir) + + # 2024 release bumped the libsycl version because of an ABI + # change, 2024 compilers are required. You will see this + # error: + # + # /usr/bin/ld: warning: libsycl.so.7, needed by ...., not found + if self.spec.satisfies("%oneapi@:2023"): + for c in ["dnn"]: + if self.spec.satisfies(f"^intel-oneapi-{c}@2024:"): + warnings.warn(f"intel-oneapi-{c}@2024 SYCL APIs requires %oneapi@2024:") + def install(self, spec, prefix): # Copy instead of install to speed up debugging # install_tree("/opt/intel/oneapi/compiler", self.prefix) @@ -525,9 +590,9 @@ def extend_config_flags(self): common_flags = ["-Wl,-rpath,{}".format(d) for d in self._ld_library_path()] # Make sure that underlying clang gets the right GCC toolchain by default - llvm_flags = ["--gcc-toolchain={}".format(self.compiler.prefix)] - classic_flags = ["-gcc-name={}".format(self.compiler.cc)] - classic_flags.append("-gxx-name={}".format(self.compiler.cxx)) + gcc = self.spec["gcc"].package + llvm_flags = [f"--gcc-toolchain={gcc.prefix}"] + classic_flags = [f"-gcc-name={gcc.cc}", f"-gxx-name={gcc.cxx}"] # Older versions trigger -Wunused-command-line-argument warnings whenever # linker flags are passed in preprocessor (-E) or compilation mode (-c). @@ -562,6 +627,24 @@ def _ld_library_path(self): if find(p, "*." + dso_suffix, recursive=False): yield p + def archspec_name(self): + return "oneapi" + + @classmethod + def determine_variants(cls, exes, version_str): + variant, extra_attributes = super().determine_variants(exes, version_str) + + bin_dirs = {pathlib.Path(x).parent for x in exes} + if len(bin_dirs) != 1: + dirs = ", ".join([str(x) for x in sorted(bin_dirs)]) + raise RuntimeError(f"executables found in multiple dirs: {dirs}") + bin_dir = bin_dirs.pop() + prefix_parts = bin_dir.parts[: bin_dir.parts.index("compiler")] + computed_prefix = pathlib.Path(*prefix_parts) + extra_attributes["prefix"] = str(computed_prefix) + + return variant, extra_attributes + @classmethod def runtime_constraints(cls, *, spec, pkg): pkg("*").depends_on( @@ -572,7 +655,7 @@ def runtime_constraints(cls, *, spec, pkg): ) pkg("*").depends_on( f"intel-oneapi-runtime@{str(spec.version)}:", - when=f"%{str(spec)}", + when=f"^[deptypes=build] {spec.name}@{spec.versions}", type="link", description=f"If any package uses %{str(spec)}, " f"it depends on intel-oneapi-runtime@{str(spec.version)}:", @@ -581,11 +664,28 @@ def runtime_constraints(cls, *, spec, pkg): for fortran_virtual in ("fortran-rt", "libifcore@5"): pkg("*").depends_on( fortran_virtual, - when=f"%{str(spec)}", - languages=["fortran"], + when=f"^[virtuals=fortran deptypes=build] {spec.name}@{spec.versions}", type="link", description=f"Add a dependency on 'libifcore' for nodes compiled with " f"{str(spec)} and using the 'fortran' language", ) # The version of intel-oneapi-runtime is the same as the %oneapi used to "compile" it - pkg("intel-oneapi-runtime").requires(f"@={str(spec.version)}", when=f"%{str(spec)}") + pkg("intel-oneapi-runtime").requires( + f"@{str(spec.versions)}", when=f"^[deptypes=build] {spec.name}@{spec.versions}" + ) + + # If a node used %intel-oneapi=runtime@X.Y its dependencies must use @:X.Y + # (technically @:X is broader than ... <= @=X but this should work in practice) + pkg("*").propagate( + f"intel-oneapi-compilers@:{str(spec.version)}", + when=f"^[deptypes=build] {spec.name}@{spec.versions}", + ) + + def _cc_path(self): + return str(self._llvm_bin.icx) + + def _cxx_path(self): + return str(self._llvm_bin.icpx) + + def _fortran_path(self): + return str(self._llvm_bin.ifx) 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 3c2796f06b4..573b520b0ab 100644 --- a/var/spack/repos/builtin/packages/intel-oneapi-mpi/package.py +++ b/var/spack/repos/builtin/packages/intel-oneapi-mpi/package.py @@ -206,11 +206,15 @@ def setup_dependent_package(self, module, dep_spec): def setup_dependent_build_environment(self, env, dependent_spec): dependent_module = dependent_spec.package.module - env.set("I_MPI_CC", dependent_module.spack_cc) - env.set("I_MPI_CXX", dependent_module.spack_cxx) - env.set("I_MPI_F77", dependent_module.spack_f77) - env.set("I_MPI_F90", dependent_module.spack_fc) - env.set("I_MPI_FC", dependent_module.spack_fc) + for var_name, attr_name in ( + ("I_MPI_CC", "spack_cc"), + ("I_MPI_CXX", "spack_cxx"), + ("I_MPI_FC", "spack_fc"), + ("I_MPI_F90", "spack_fc"), + ("I_MPI_F77", "spack_f77"), + ): + if hasattr(dependent_module, attr_name): + env.set(var_name, getattr(dependent_module, attr_name)) # Set compiler wrappers for dependent build stage wrappers = self.wrapper_paths() 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 2ff2e5b1889..d4548efc48e 100644 --- a/var/spack/repos/builtin/packages/intel-oneapi-runtime/package.py +++ b/var/spack/repos/builtin/packages/intel-oneapi-runtime/package.py @@ -19,8 +19,7 @@ class IntelOneapiRuntime(Package): tags = ["runtime"] - requires("%oneapi") - + depends_on("intel-oneapi-compilers", type="build") depends_on("gcc-runtime", type="link") LIBRARIES = [ @@ -46,7 +45,8 @@ class IntelOneapiRuntime(Package): depends_on("libc", type="link", when="platform=linux") def install(self, spec, prefix): - libraries = get_elf_libraries(compiler=self.compiler, libraries=self.LIBRARIES) + oneapi_pkg = self.spec["intel-oneapi-compilers"].package + libraries = get_elf_libraries(compiler=oneapi_pkg, libraries=self.LIBRARIES) mkdir(prefix.lib) if not libraries: diff --git a/var/spack/repos/builtin/packages/intel/package.py b/var/spack/repos/builtin/packages/intel/package.py index 5e4159d8f99..67c3dddfaf2 100644 --- a/var/spack/repos/builtin/packages/intel/package.py +++ b/var/spack/repos/builtin/packages/intel/package.py @@ -3,7 +3,9 @@ # SPDX-License-Identifier: (Apache-2.0 OR MIT) import re -import spack.compiler +import llnl.util.tty as tty + +import spack.build_systems.compiler from spack.package import * @@ -234,7 +236,9 @@ class Intel(IntelPackage): def determine_version(cls, exe): version_regex = re.compile(r"\((?:IFORT|ICC)\) ([^ ]+)") try: - output = spack.compiler.get_compiler_version_output(exe, "--version") + output = spack.build_systems.compiler.compiler_output( + exe, version_argument="--version" + ) match = version_regex.search(output) if match: return match.group(1) diff --git a/var/spack/repos/builtin/packages/libtheora/package.py b/var/spack/repos/builtin/packages/libtheora/package.py index f835016467c..64fcd5d3da1 100644 --- a/var/spack/repos/builtin/packages/libtheora/package.py +++ b/var/spack/repos/builtin/packages/libtheora/package.py @@ -88,7 +88,7 @@ def setup_build_environment(self, env): # devenv is needed to convert ancient MSbuild project to modern # msbuild project so MSBuild versions older than 2010 can build this # project - devenv_path = os.path.join(self.pkg.compiler.vs_root, "Common7", "IDE") + devenv_path = os.path.join(self.pkg["msvc"].vs_root, "Common7", "IDE") env.prepend_path("PATH", devenv_path) @property diff --git a/var/spack/repos/builtin/packages/libxml2/package.py b/var/spack/repos/builtin/packages/libxml2/package.py index baf0672cd80..c7f3c5ab40e 100644 --- a/var/spack/repos/builtin/packages/libxml2/package.py +++ b/var/spack/repos/builtin/packages/libxml2/package.py @@ -110,7 +110,7 @@ def url_for_version(self, version): def flag_handler(self, name, flags): if name == "cflags" and self.spec.satisfies("+pic"): - flags.append(self.compiler.cc_pic_flag) + flags.append(self["c"].pic_flag) flags.append("-DPIC") return (flags, None, None) diff --git a/var/spack/repos/builtin/packages/llvm-amdgpu/package.py b/var/spack/repos/builtin/packages/llvm-amdgpu/package.py index f907aafa486..0ba64fb8613 100644 --- a/var/spack/repos/builtin/packages/llvm-amdgpu/package.py +++ b/var/spack/repos/builtin/packages/llvm-amdgpu/package.py @@ -6,17 +6,27 @@ import shutil from spack.package import * +from spack.pkg.builtin.llvm import LlvmDetection -class LlvmAmdgpu(CMakePackage, CompilerPackage): +class LlvmAmdgpu(CMakePackage, LlvmDetection, CompilerPackage): """Toolkit for the construction of highly optimized compilers, optimizers, and run-time environments.""" 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.2.4.tar.gz" - tags = ["rocm"] + tags = ["rocm", "compiler"] executables = [r"amdclang", r"amdclang\+\+", r"amdflang", r"clang.*", r"flang.*", "llvm-.*"] + + compiler_wrapper_link_paths = { + "c": "rocmcc/amdclang", + "cxx": "rocmcc/amdclang++", + "fortran": "rocmcc/amdflang", + } + + stdcxx_libs = ("-lstdc++",) + generator("ninja") maintainers("srekolam", "renjithravindrankannath", "haampie", "afzpatel") @@ -51,6 +61,9 @@ class LlvmAmdgpu(CMakePackage, CompilerPackage): depends_on("cxx", type="build") # generated depends_on("fortran", type="build") # generated + provides("c", "cxx") + provides("fortran") + variant( "rocm-device-libs", default=True, @@ -215,6 +228,13 @@ class LlvmAmdgpu(CMakePackage, CompilerPackage): when="@master", ) + def _standard_flag(self, *, language, standard): + flags = { + "cxx": {"11": "-std=c++11", "14": "-std=c++14", "17": "-std=c++17"}, + "c": {"99": "-std=c99", "11": "-std=c1x"}, + } + return flags[language][standard] + def cmake_args(self): llvm_projects = ["clang", "lld", "clang-tools-extra", "compiler-rt"] llvm_runtimes = ["libcxx", "libcxxabi"] @@ -341,3 +361,12 @@ def setup_dependent_build_environment(self, env, dependent_spec): if "libclang_rt.asan-x86_64.so" in files: env.prepend_path("LD_LIBRARY_PATH", root) env.prune_duplicate_paths("LD_LIBRARY_PATH") + + def _cc_path(self): + return os.path.join(self.spec.prefix.bin, "amdclang") + + def _cxx_path(self): + return os.path.join(self.spec.prefix.bin, "amdclang++") + + def _fortran_path(self): + return os.path.join(self.spec.prefix.bin, "amdflang") diff --git a/var/spack/repos/builtin/packages/llvm/package.py b/var/spack/repos/builtin/packages/llvm/package.py index 2c48ac22cb4..a79c0e8897f 100644 --- a/var/spack/repos/builtin/packages/llvm/package.py +++ b/var/spack/repos/builtin/packages/llvm/package.py @@ -7,7 +7,6 @@ from llnl.util.lang import classproperty -import spack.compilers from spack.build_systems.cmake import get_cmake_prefix_path from spack.operating_systems.mac_os import macos_sdk_path from spack.package import * @@ -395,6 +394,9 @@ class Llvm(CMakePackage, CudaPackage, LlvmDetection, CompilerPackage): provides("libllvm@4", when="@4.0.0:4") provides("libllvm@3", when="@3.0.0:3") + provides("c", "cxx", when="+clang") + provides("fortran", when="+flang") + extends("python", when="+python") # Build dependency @@ -496,9 +498,9 @@ class Llvm(CMakePackage, CudaPackage, LlvmDetection, CompilerPackage): }, }.items(): with when(v): - for comp in spack.compilers.supported_compilers(): - conflicts("%{0}{1}".format(comp, compiler_conflicts.get(comp, ""))) - del v, compiler_conflicts, comp + for _name, _constraint in compiler_conflicts.items(): + conflicts(f"%{_name}{_constraint}") + del v, compiler_conflicts, _name, _constraint # libomptarget conflicts("+cuda", when="@15:") # +cuda variant is obselete since LLVM 15 @@ -832,49 +834,69 @@ def validate_detected_spec(cls, spec, extra_attributes): msg = "{0} compiler not found for {1}" assert key in compilers, msg.format(key, spec) - @property - def cc(self): - msg = "cannot retrieve C compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("c", None) - result = None + def _cc_path(self): if self.spec.satisfies("+clang"): - result = os.path.join(self.spec.prefix.bin, "clang") - return result + return os.path.join(self.spec.prefix.bin, "clang") + return None - @property - def cxx(self): - msg = "cannot retrieve C++ compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("cxx", None) - result = None + def _cxx_path(self): if self.spec.satisfies("+clang"): - result = os.path.join(self.spec.prefix.bin, "clang++") - return result + return os.path.join(self.spec.prefix.bin, "clang++") + return None - @property - def fc(self): - msg = "cannot retrieve Fortran compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("fc", None) - result = None + def _fortran_path(self): if self.spec.satisfies("+flang"): - result = os.path.join(self.spec.prefix.bin, "flang") - return result + return os.path.join(self.spec.prefix.bin, "flang") + return None - @property - def f77(self): - msg = "cannot retrieve Fortran 77 compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("f77", None) - result = None - if self.spec.satisfies("+flang"): - result = os.path.join(self.spec.prefix.bin, "flang") - return result + debug_flags = [ + "-gcodeview", + "-gdwarf-2", + "-gdwarf-3", + "-gdwarf-4", + "-gdwarf-5", + "-gline-tables-only", + "-gmodules", + "-g", + ] + + opt_flags = ["-O0", "-O1", "-O2", "-O3", "-Ofast", "-Os", "-Oz", "-Og", "-O", "-O4"] + + compiler_wrapper_link_paths = { + "c": os.path.join("clang", "clang"), + "cxx": os.path.join("clang", "clang++"), + "fortran": os.path.join("clang", "flang"), + } + + implicit_rpath_libs = ["libclang"] + + def _standard_flag(self, *, language, standard): + flags = { + "cxx": { + "11": [("@3.3:", "-std=c++11")], + "14": [("@3.5:", "-std=c++14")], + "17": [("@3.5:4", "-std=c++1z"), ("@5:", "-std=c++17")], + "20": [("@5:10", "-std=c++2a"), ("@11:", "-std=c++20")], + "23": [("@12:16", "-std=c++2b"), ("@17:", "-std=c++23")], + }, + "c": { + "99": [("@:", "-std=c99")], + "11": [("@3.1:", "-std=c11")], + "17": [("@6:", "-std=c17")], + "23": [("@9:17", "-std=c2x"), ("@18:", "-std=c23")], + }, + } + for condition, flag in flags[language][standard]: + if self.spec.satisfies(condition): + return flag + else: + raise RuntimeError( + f"{self.spec} does not support the '{standard}' standard " + f"for the '{language}' language" + ) + + def archspec_name(self): + return "clang" @property def libs(self): diff --git a/var/spack/repos/builtin/packages/lvarray/package.py b/var/spack/repos/builtin/packages/lvarray/package.py index 13129e8347a..e5d7eedc50c 100644 --- a/var/spack/repos/builtin/packages/lvarray/package.py +++ b/var/spack/repos/builtin/packages/lvarray/package.py @@ -121,12 +121,9 @@ def _get_host_config_path(self, spec): var = "-".join([var, "cuda"]) hostname = socket.gethostname().rstrip("1234567890") - host_config_path = "%s-%s-%s%s.cmake" % ( - hostname, - self._get_sys_type(spec), - spec.compiler, - var, - ) + c_compiler = self["c"] + compiler_str = f"{c_compiler.name}-{c_compiler.version}" + host_config_path = f"{hostname}-{self._get_sys_type(spec)}-{compiler_str}{var}.cmake" dest_dir = self.stage.source_path host_config_path = os.path.abspath(pjoin(dest_dir, host_config_path)) diff --git a/var/spack/repos/builtin/packages/mapl/package.py b/var/spack/repos/builtin/packages/mapl/package.py index b070be4f1c8..6cf7240df93 100644 --- a/var/spack/repos/builtin/packages/mapl/package.py +++ b/var/spack/repos/builtin/packages/mapl/package.py @@ -4,7 +4,6 @@ import subprocess -import spack.compiler from spack.package import * @@ -258,9 +257,7 @@ class Mapl(CMakePackage): # MAPL can use ifx only from MAPL 2.51 onwards and only supports # ifx 2025.0 and newer due to bugs in ifx. conflicts("%oneapi@2025:", when="@:2.50") - # NOTE there is a further check on oneapi in the cmake_args below - # that is hard to conflict since we don't know the fortran compiler - # at this point + conflicts("^[virtuals=fortran] intel-oneapi-compilers") variant("flap", default=False, description="Build with FLAP support", when="@:2.39") variant("pflogger", default=True, description="Build with pFlogger support") @@ -381,35 +378,16 @@ def cmake_args(self): # Compatibility flags for gfortran fflags = [] - if self.compiler.name in ["gcc", "clang", "apple-clang"]: + if self["fortran"].name == "gcc": fflags.append("-ffree-line-length-none") - gfortran_major_ver = int( - spack.compiler.get_compiler_version_output(self.compiler.fc, "-dumpversion").split( - "." - )[0] - ) + + gfortran_major_ver = int(self.spec["fortran"].version[0]) if gfortran_major_ver >= 10: fflags.append("-fallow-invalid-boz") fflags.append("-fallow-argument-mismatch") if fflags: args.append(self.define("CMAKE_Fortran_FLAGS", " ".join(fflags))) - # If oneapi@:2024 is used and it gets past the conflict above, we might be - # using ifx or ifort. If we are using ifx and the MAPL version is 2.50 or older - # we need to raise an error - - if self.spec.satisfies("@:2.50 %oneapi@:2024"): - # We now need to get which Fortran compiler is used here but there - # isn't an easy way like: - # if self.spec["fortran"].name == "ifx": - # yet (see https://github.com/spack/spack/pull/45189) - # So we need to parse the output of $FC --version - output = spack.compiler.get_compiler_version_output( - self.compiler.fc, "-diag-disable=10448 --version", ignore_errors=True - ) - if "ifx" in output: - raise InstallError("MAPL versions 2.50 and older do not support ifx") - # Scripts often need to know the MPI stack used to setup the environment. # Normally, we can autodetect this, but building with Spack does not # seem to work. We need to pass in the MPI stack used to CMake diff --git a/var/spack/repos/builtin/packages/mpich/package.py b/var/spack/repos/builtin/packages/mpich/package.py index 6980d8810ca..a6359052ac3 100644 --- a/var/spack/repos/builtin/packages/mpich/package.py +++ b/var/spack/repos/builtin/packages/mpich/package.py @@ -6,7 +6,7 @@ import re import sys -import spack.compilers +import spack.compilers.config import spack.package_base from spack.package import * @@ -25,10 +25,8 @@ def setup_dependent_build_environment(self, env, dependent_spec): ("MPICH_F90", "spack_fc"), ("MPICH_F77", "spack_f77"), ): - if not hasattr(dependent_module, attr_name): - continue - - env.set(var_name, getattr(dependent_module, attr_name)) + if hasattr(dependent_module, attr_name): + env.set(var_name, getattr(dependent_module, attr_name)) def setup_build_environment(self, env): env.unset("F90") @@ -384,7 +382,7 @@ def determine_version(cls, exe): @classmethod def determine_variants(cls, exes, version): def get_spack_compiler_spec(compiler): - spack_compilers = spack.compilers.find_compilers([os.path.dirname(compiler)]) + spack_compilers = spack.compilers.config.find_compilers([os.path.dirname(compiler)]) actual_compiler = None # check if the compiler actually matches the one we want for spack_compiler in spack_compilers: @@ -510,25 +508,6 @@ def autoreconf(self, spec, prefix): bash = which("bash") bash("./autogen.sh") - @run_before("autoreconf") - def die_without_fortran(self): - # Until we can pass variants such as +fortran through virtual - # dependencies depends_on('mpi'), require Fortran compiler to - # avoid delayed build errors in dependents. - # The user can work around this by disabling Fortran explicitly - # with ~fortran - - f77 = self.compiler.f77 - fc = self.compiler.fc - - fortran_missing = f77 is None or fc is None - - if "+fortran" in self.spec and fortran_missing: - raise InstallError( - "mpich +fortran requires Fortran compilers. Configure " - "Fortran compiler or disable Fortran support with ~fortran" - ) - def configure_args(self): spec = self.spec config_args = [ diff --git a/var/spack/repos/builtin/packages/msvc/package.py b/var/spack/repos/builtin/packages/msvc/package.py index 347e969e236..e06b9c98ac2 100644 --- a/var/spack/repos/builtin/packages/msvc/package.py +++ b/var/spack/repos/builtin/packages/msvc/package.py @@ -1,9 +1,15 @@ # Copyright Spack Project Developers. See COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) +import os.path import re +import subprocess -import spack.compiler +import archspec.cpu + +import spack.build_systems.compiler +import spack.platforms +import spack.version from spack.package import * FC_PATH: Dict[str, str] = dict() @@ -39,6 +45,16 @@ def install(self, spec, prefix): compiler_version_argument = "" compiler_version_regex = r"([1-9][0-9]*\.[0-9]*\.[0-9]*)" + # Due to the challenges of supporting compiler wrappers + # in Windows, we leave these blank, and dynamically compute + # based on proper versions of MSVC from there + # pending acceptance of #28117 for full support using + # compiler wrappers + compiler_wrapper_link_paths = {"c": "", "cxx": "", "fortran": ""} + + provides("c", "cxx") + requires("platform=windows", msg="MSVC is only supported on Windows") + @classmethod def determine_version(cls, exe): # MSVC compiler does not have a proper version argument @@ -46,7 +62,9 @@ def determine_version(cls, exe): is_ifx = "ifx.exe" in str(exe) match = re.search( cls.compiler_version_regex, - spack.compiler.get_compiler_version_output(exe, version_arg=None, ignore_errors=True), + spack.build_systems.compiler.compiler_output( + exe, version_argument=None, ignore_errors=1 + ), ) if match: if is_ifx: @@ -67,26 +85,233 @@ def determine_variants(cls, exes, version_str): # TODO: remove this once #45189 lands # TODO: interrogate intel and msvc for compatibility after # #45189 lands - extras["compilers"]["fortran"] = get_latest_valid_fortran_pth() + fortran_compiler = get_latest_valid_fortran_pth() + if fortran_compiler is not None: + extras["compilers"]["fortran"] = fortran_compiler return spec, extras - @property - def cc(self): - if self.spec.external: - return self.spec.extra_attributes["compilers"]["c"] - msg = "cannot retrieve C compiler [spec is not concrete]" - assert self.spec.concrete, msg + def setup_dependent_build_environment(self, env, dependent_spec): + self.init_msvc() + # Set the build environment variables for spack. Just using + # subprocess.call() doesn't work since that operates in its own + # environment which is destroyed (along with the adjusted variables) + # once the process terminates. So go the long way around: examine + # output, sort into dictionary, use that to make the build + # environment. + + # vcvars can target specific sdk versions, force it to pick up concretized sdk + # version, if needed by spec + if dependent_spec.name != "win-sdk" and "win-sdk" in dependent_spec: + self.vcvars_call.sdk_ver = dependent_spec["win-sdk"].version.string + + out = self.msvc_compiler_environment() + int_env = dict( + (key, value) + for key, _, value in (line.partition("=") for line in out.splitlines()) + if key and value + ) + + for env_var in int_env: + if os.pathsep not in int_env[env_var]: + env.set(env_var, int_env[env_var]) + else: + env.set_path(env_var, int_env[env_var].split(os.pathsep)) + + env.set("CC", self.cc) + env.set("CXX", self.cxx) + + def init_msvc(self): + # To use the MSVC compilers, VCVARS must be invoked + # VCVARS is located at a fixed location, referencable + # idiomatically by the following relative path from the + # compiler. + # Spack first finds the compilers via VSWHERE + # and stores their path, but their respective VCVARS + # file must be invoked before useage. + env_cmds = [] + compiler_root = os.path.join(os.path.dirname(self.cc), "../../../../../..") + vcvars_script_path = os.path.join(compiler_root, "Auxiliary", "Build", "vcvars64.bat") + # get current platform architecture and format for vcvars argument + arch = spack.platforms.real_host().default.lower() + arch = arch.replace("-", "_") + if str(archspec.cpu.host().family) == "x86_64": + arch = "amd64" + + msvc_version = spack.version.Version( + re.search(Msvc.compiler_version_regex, self.cc).group(1) + ) + self.vcvars_call = VCVarsInvocation(vcvars_script_path, arch, msvc_version) + env_cmds.append(self.vcvars_call) + self.msvc_compiler_environment = CmdCall(*env_cmds) + + def _standard_flag(self, *, language: str, standard: str) -> str: + flags = { + "cxx": { + "11": "/std:c++11", + "14": "/std:c++14", + "17": "/std:c++17", + "20": "/std:c++20", + }, + "c": {"11": "/std:c11", "17": "/std:c17"}, + } + return flags[language][standard] @property - def cxx(self): - if self.spec.external: - return self.spec.extra_attributes["compilers"]["cxx"] - msg = "cannot retrieve C++ compiler [spec is not concrete]" - assert self.spec.concrete, msg + def short_msvc_version(self): + """This is the shorthand VCToolset version of form + MSVC + """ + return "MSVC" + self.vc_toolset_ver @property - def fortran(self): - if self.spec.external: - return self.spec.extra_attributes["compilers"]["fortran"] - msg = "cannot retrieve Fortran compiler [spec is not concrete]" - assert self.spec.concrete, msg + def vc_toolset_ver(self): + """ + The toolset version is the version of the combined set of cl and link + This typically relates directly to VS version i.e. VS 2022 is v143 + VS 19 is v142, etc. + This value is defined by the first three digits of the major + minor + version of the VS toolset (143 for 14.3x.bbbbb). Traditionally the + minor version has remained a static two digit number for a VS release + series, however, as of VS22, this is no longer true, both + 14.4x.bbbbb and 14.3x.bbbbb are considered valid VS22 VC toolset + versions due to a change in toolset minor version sentiment. + + This is *NOT* the full version, for that see + Msvc.msvc_version or MSVC.platform_toolset_ver for the + raw platform toolset version + + """ + ver = self.msvc_version[:2].joined.string[:3] + return ver + + @property + def msvc_version(self): + """This is the VCToolset version *NOT* the actual version of the cl compiler""" + return spack.version.Version(re.search(Msvc.compiler_version_regex, self.cc).group(1)) + + @property + def vs_root(self): + # The MSVC install root is located at a fix level above the compiler + # and is referenceable idiomatically via the pattern below + # this should be consistent accross versions + return os.path.abspath(os.path.join(self.cc, "../../../../../../../..")) + + @property + def platform_toolset_ver(self): + """ + This is the platform toolset version of current MSVC compiler + i.e. 142. The platform toolset is the targeted MSVC library/compiler + versions by compilation (this is different from the VC Toolset) + + + This is different from the VC toolset version as established + by `short_msvc_version`, but typically are represented by the same + three digit value + """ + # Typically VS toolset version and platform toolset versions match + # VS22 introduces the first divergence of VS toolset version + # (144 for "recent" releases) and platform toolset version (143) + # so it needs additional handling until MS releases v144 + # (assuming v144 is also for VS22) + # or adds better support for detection + # TODO: (johnwparent) Update this logic for the next platform toolset + # or VC toolset version update + toolset_ver = self.vc_toolset_ver + vs22_toolset = spack.version.Version(toolset_ver) > Version("142") + return toolset_ver if not vs22_toolset else "143" + + +class CmdCall: + """Compose a call to `cmd` for an ordered series of cmd commands/scripts""" + + def __init__(self, *cmds): + if not cmds: + raise RuntimeError( + """Attempting to run commands from CMD without specifying commands. + Please add commands to be run.""" + ) + self._cmds = cmds + + def __call__(self): + out = subprocess.check_output(self.cmd_line, stderr=subprocess.STDOUT) # novermin + return out.decode("utf-16le", errors="replace") # novermin + + @property + def cmd_line(self): + base_call = "cmd /u /c " + commands = " && ".join([x.command_str() for x in self._cmds]) + # If multiple commands are being invoked by a single subshell + # they must be encapsulated by a double quote. Always double + # quote to be sure of proper handling + # cmd will properly resolve nested double quotes as needed + # + # `set`` writes out the active env to the subshell stdout, + # and in this context we are always trying to obtain env + # state so it should always be appended + return base_call + f'"{commands} && set"' + + +class VarsInvocation: + def __init__(self, script): + self._script = script + + def command_str(self): + return f'"{self._script}"' + + @property + def script(self): + return self._script + + +class VCVarsInvocation(VarsInvocation): + def __init__(self, script, arch, msvc_version): + super(VCVarsInvocation, self).__init__(script) + self._arch = arch + self._msvc_version = msvc_version + + @property + def sdk_ver(self): + """Accessor for Windows SDK version property + + Note: This property may not be set by + the calling context and as such this property will + return an empty string + + This property will ONLY be set if the SDK package + is a dependency somewhere in the Spack DAG of the package + for which we are constructing an MSVC compiler env. + Otherwise this property should be unset to allow the VCVARS + script to use its internal heuristics to determine appropriate + SDK version + """ + if getattr(self, "_sdk_ver", None): + return self._sdk_ver + ".0" + return "" + + @sdk_ver.setter + def sdk_ver(self, val): + self._sdk_ver = val + + @property + def arch(self): + return self._arch + + @property + def vcvars_ver(self): + return f"-vcvars_ver={self._msvc_version}" + + def command_str(self): + script = super(VCVarsInvocation, self).command_str() + return f"{script} {self.arch} {self.sdk_ver} {self.vcvars_ver}" + + +FC_PATH = {} + + +def get_valid_fortran_pth(): + """Assign maximum available fortran compiler version""" + # TODO (johnwparent): validate compatibility w/ try compiler + # functionality when added + sort_fn = lambda fc_ver: spack.version.Version(fc_ver) + sort_fc_ver = sorted(list(FC_PATH.keys()), key=sort_fn) + return FC_PATH[sort_fc_ver[-1]] if sort_fc_ver else None diff --git a/var/spack/repos/builtin/packages/musl/package.py b/var/spack/repos/builtin/packages/musl/package.py index 516f538b16e..9ec77c895b0 100644 --- a/var/spack/repos/builtin/packages/musl/package.py +++ b/var/spack/repos/builtin/packages/musl/package.py @@ -48,6 +48,8 @@ class Musl(MakefilePackage): depends_on("c", type="build") # generated + conflicts("glibc") + def patch(self): config = FileFilter("configure") if self.compiler.name == "gcc": diff --git a/var/spack/repos/builtin/packages/mvapich2/package.py b/var/spack/repos/builtin/packages/mvapich2/package.py index f4f242965b3..2c704891966 100644 --- a/var/spack/repos/builtin/packages/mvapich2/package.py +++ b/var/spack/repos/builtin/packages/mvapich2/package.py @@ -6,7 +6,7 @@ import re import sys -import spack.compilers +import spack.compilers.config from spack.package import * from spack.pkg.builtin.mpich import MpichEnvironmentModifications @@ -172,7 +172,7 @@ def determine_version(cls, exe): @classmethod def determine_variants(cls, exes, version): def get_spack_compiler_spec(path): - spack_compilers = spack.compilers.find_compilers([path]) + spack_compilers = spack.compilers.config.find_compilers([path]) for spack_compiler in spack_compilers: if os.path.dirname(spack_compiler.cc) == path: return spack_compiler.spec diff --git a/var/spack/repos/builtin/packages/nag/package.py b/var/spack/repos/builtin/packages/nag/package.py index 74482793320..7cd51060b17 100644 --- a/var/spack/repos/builtin/packages/nag/package.py +++ b/var/spack/repos/builtin/packages/nag/package.py @@ -2,6 +2,7 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) import os +import os.path from spack.package import * @@ -72,10 +73,47 @@ def setup_run_environment(self, env): compiler_version_regex = r"NAG Fortran Compiler Release (\d+).(\d+)\(.*\) Build (\d+)" compiler_version_argument = "-V" - @property - def fortran(self): - msg = "cannot retrieve Fortran compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("fortran", None) + # Unlike other compilers, the NAG compiler passes options to GCC, which + # then passes them to the linker. Therefore, we need to doubly wrap the + # options with '-Wl,-Wl,,' + rpath_arg = "-Wl,-Wl,,-rpath,," + linker_arg = "-Wl,-Wl,," + disable_new_dtags = "" + enable_new_dtags = "" + debug_flags = ["-g", "-gline", "-g90"] + opt_flags = ["-O", "-O0", "-O1", "-O2", "-O3", "-O4"] + + compiler_wrapper_link_paths = {"fortran": os.path.join("nag", "nagfor")} + + # NAG does not support a flag that would enable verbose output and + # compilation/linking at the same time (with either '-#' or '-dryrun' + # the compiler only prints the commands but does not run them). + # Therefore, the only thing we can do is to pass the '-v' argument to + # the underlying GCC. In order to get verbose output from the latter + # at both compile and linking stages, we need to call NAG with two + # additional flags: '-Wc,-v' and '-Wl,-v'. However, we return only + # '-Wl,-v' for the following reasons: + # 1) the interface of this method does not support multiple flags in + # the return value and, at least currently, verbose output at the + # linking stage has a higher priority for us; + # 2) NAG is usually mixed with GCC compiler, which also accepts + # '-Wl,-v' and produces meaningful result with it: '-v' is passed + # to the linker and the latter produces verbose output for the + # linking stage ('-Wc,-v', however, would break the compilation + # with a message from GCC that the flag is not recognized). + # + # This way, we at least enable the implicit rpath detection, which is + # based on compilation of a C file (see method + # spack.compiler._compile_dummy_c_source): in the case of a mixed + # NAG/GCC toolchain, the flag will be passed to g++ (e.g. + # 'g++ -Wl,-v ./main.c'), otherwise, the flag will be passed to nagfor + # (e.g. 'nagfor -Wl,-v ./main.c' - note that nagfor recognizes '.c' + # extension and treats the file accordingly). The list of detected + # rpaths will contain only GCC-related directories and rpaths to + # NAG-related directories are injected by nagfor anyway. + verbose_flag = "-Wl,-v" + + openmp_flag = "-openmp" + + def _fortran_path(self): return str(self.spec.prefix.bin.nagfor) diff --git a/var/spack/repos/builtin/packages/ncurses/package.py b/var/spack/repos/builtin/packages/ncurses/package.py index 6a800f41f6b..555550b7931 100644 --- a/var/spack/repos/builtin/packages/ncurses/package.py +++ b/var/spack/repos/builtin/packages/ncurses/package.py @@ -106,9 +106,9 @@ def setup_build_environment(self, env): def flag_handler(self, name, flags): if name == "cflags": - flags.append(self.compiler.cc_pic_flag) + flags.append(self["c"].pic_flag) elif name == "cxxflags": - flags.append(self.compiler.cxx_pic_flag) + flags.append(self["cxx"].pic_flag) # ncurses@:6.0 fails in definition of macro 'mouse_trafo' without -P if self.spec.satisfies("@:6.0 %gcc@5.0:"): @@ -118,7 +118,7 @@ def flag_handler(self, name, flags): # ncurses@:6.0 uses dynamic exception specifications not allowed in c++17 if self.spec.satisfies("@:5"): if name == "cxxflags": - flags.append(self.compiler.cxx14_flag) + flags.append(self["cxx"].standard_flag(language="cxx", standard="14")) return (flags, None, None) diff --git a/var/spack/repos/builtin/packages/nvhpc/package.py b/var/spack/repos/builtin/packages/nvhpc/package.py index fe530a289ae..607ce9ae403 100644 --- a/var/spack/repos/builtin/packages/nvhpc/package.py +++ b/var/spack/repos/builtin/packages/nvhpc/package.py @@ -3,7 +3,7 @@ # SPDX-License-Identifier: (Apache-2.0 OR MIT) # # Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved. - +import os.path import platform from spack.package import * @@ -446,9 +446,7 @@ class Nvhpc(Package, CompilerPackage): if pkg: version(ver, sha256=pkg[0], url=pkg[1]) - depends_on("c", type="build") # generated - depends_on("cxx", type="build") # generated - depends_on("fortran", type="build") # generated + depends_on("gcc languages=c,c++,fortran", type="run") variant("blas", default=True, description="Enable BLAS") variant( @@ -469,7 +467,8 @@ class Nvhpc(Package, CompilerPackage): provides("lapack", when="+lapack") provides("mpi", when="+mpi") - requires("%gcc", msg="nvhpc must be installed with %gcc") + provides("c", "cxx") + provides("fortran") # For now we only detect compiler components # It will require additional work to detect mpi/lapack/blas components @@ -480,6 +479,28 @@ class Nvhpc(Package, CompilerPackage): compiler_version_argument = "--version" compiler_version_regex = r"nv[^ ]* (?:[^ ]+ Dev-r)?([0-9.]+)(?:-[0-9]+)?" + debug_flags = ["-g", "-gopt"] + opt_flags = ["-O", "-O0", "-O1", "-O2", "-O3", "-O4"] + + pic_flag = "-fpic" + openmp_flag = "-mp" + + compiler_wrapper_link_paths = { + "c": os.path.join("nvhpc", "nvc"), + "cxx": os.path.join("nvhpc", "nvc++"), + "fortran": os.path.join("nvhpc", "nvfortran"), + } + + implicit_rpath_libs = ["libnvc", "libnvf"] + stdcxx_libs = ("-c++libs",) + + def _standard_flag(self, *, language, standard): + flags = { + "cxx": {"11": "--c++11", "14": "--c++14", "17": "--c++17"}, + "c": {"99": "-c99", "11": "-c11"}, + } + return flags[language][standard] + @classmethod def determine_variants(cls, exes, version_str): # TODO: use other exes to determine default_cuda/install_type/blas/lapack/mpi variants @@ -509,11 +530,11 @@ def install(self, spec, prefix): makelocalrc_args = [ "-gcc", - self.compiler.cc, + self["gcc"].cc, "-gpp", - self.compiler.cxx, + self["gcc"].cxx, "-g77", - self.compiler.f77, + self["gcc"].fortran, "-x", compilers_bin, ] diff --git a/var/spack/repos/builtin/packages/openfoam/package.py b/var/spack/repos/builtin/packages/openfoam/package.py index 3bfddc1f765..d01733b8300 100644 --- a/var/spack/repos/builtin/packages/openfoam/package.py +++ b/var/spack/repos/builtin/packages/openfoam/package.py @@ -924,7 +924,12 @@ class OpenfoamArch: #: Map spack compiler names to OpenFOAM compiler names # By default, simply capitalize the first letter - compiler_mapping = {"aocc": "Amd", "fj": "Fujitsu", "intel": "Icc", "oneapi": "Icx"} + compiler_mapping = { + "aocc": "Amd", + "fj": "Fujitsu", + "intel": "Icc", + "intel-oneapi-compilers": "Icx", + } def __init__(self, spec, **kwargs): # Some user settings, to be adjusted manually or via variants diff --git a/var/spack/repos/builtin/packages/openmpi/package.py b/var/spack/repos/builtin/packages/openmpi/package.py index 2f4a285cb21..58e9b82275a 100644 --- a/var/spack/repos/builtin/packages/openmpi/package.py +++ b/var/spack/repos/builtin/packages/openmpi/package.py @@ -7,7 +7,9 @@ import re import sys -import spack.compilers +import llnl.util.tty as tty + +import spack.compilers.config from spack.package import * @@ -898,10 +900,14 @@ def setup_run_environment(self, env): def setup_dependent_build_environment(self, env, dependent_spec): # Use the spack compiler wrappers under MPI dependent_module = dependent_spec.package.module - env.set("OMPI_CC", dependent_module.spack_cc) - env.set("OMPI_CXX", dependent_module.spack_cxx) - env.set("OMPI_FC", dependent_module.spack_fc) - env.set("OMPI_F77", dependent_module.spack_f77) + for var_name, attr_name in ( + ("OMPI_CC", "spack_cc"), + ("OMPI_CXX", "spack_cxx"), + ("OMPI_FC", "spack_fc"), + ("OMPI_F77", "spack_f77"), + ): + if hasattr(dependent_module, attr_name): + env.set(var_name, getattr(dependent_module, attr_name)) # See https://www.open-mpi.org/faq/?category=building#installdirs for suffix in [ @@ -1357,7 +1363,7 @@ def test_example(self): def get_spack_compiler_spec(compiler): - spack_compilers = spack.compilers.find_compilers([os.path.dirname(compiler)]) + spack_compilers = spack.compilers.config.find_compilers([os.path.dirname(compiler)]) actual_compiler = None # check if the compiler actually matches the one we want for spack_compiler in spack_compilers: diff --git a/var/spack/repos/builtin/packages/openssl/package.py b/var/spack/repos/builtin/packages/openssl/package.py index 37076e812fc..fa382d59039 100644 --- a/var/spack/repos/builtin/packages/openssl/package.py +++ b/var/spack/repos/builtin/packages/openssl/package.py @@ -130,7 +130,7 @@ def install(self, spec, prefix): if spec.satisfies("@1.0"): options.append("no-krb5") # clang does not support the .arch directive in assembly files. - if "clang" in self.compiler.cc and spec.target.family == "aarch64": + if "clang" in self["c"].cc and spec.target.family == "aarch64": options.append("no-asm") elif "%nvhpc" in spec: # Last tested on nvidia@22.3 for x86_64: diff --git a/var/spack/repos/builtin/packages/perl/package.py b/var/spack/repos/builtin/packages/perl/package.py index c4f64fd4e3c..87e4f337390 100644 --- a/var/spack/repos/builtin/packages/perl/package.py +++ b/var/spack/repos/builtin/packages/perl/package.py @@ -337,7 +337,7 @@ def do_stage(self, mirror_only=False): def nmake_arguments(self): args = [] if self.spec.satisfies("%msvc"): - args.append("CCTYPE=%s" % self.compiler.short_msvc_version) + args.append("CCTYPE=%s" % self["msvc"].short_msvc_version) else: raise RuntimeError("Perl unsupported for non MSVC compilers on Windows") args.append("INST_TOP=%s" % windows_sfn(self.prefix.replace("/", "\\"))) @@ -384,7 +384,7 @@ def configure_args(self): # https://github.com/spack/spack/pull/3081 and # https://github.com/spack/spack/pull/4416 if spec.satisfies("%intel"): - config_args.append("-Accflags={0}".format(self.compiler.cc_pic_flag)) + config_args.append("-Accflags={0}".format(self["c"].pic_flag)) if "+shared" in spec: config_args.append("-Duseshrplib") @@ -543,9 +543,10 @@ def filter_config_dot_pm(self): "-MModule::Loaded", "-MConfig", "-e", "print is_loaded(Config)", output=str ) + c_compiler = self["c"].cc with self.make_briefly_writable(config_dot_pm): match = "cc *=>.*" - substitute = "cc => '{cc}',".format(cc=self.compiler.cc) + substitute = "cc => '{cc}',".format(cc=c_compiler) filter_file(match, substitute, config_dot_pm, **kwargs) # And the path Config_heavy.pl @@ -554,11 +555,11 @@ def filter_config_dot_pm(self): with self.make_briefly_writable(config_heavy): match = "^cc=.*" - substitute = "cc='{cc}'".format(cc=self.compiler.cc) + substitute = "cc='{cc}'".format(cc=c_compiler) filter_file(match, substitute, config_heavy, **kwargs) match = "^ld=.*" - substitute = "ld='{ld}'".format(ld=self.compiler.cc) + substitute = "ld='{ld}'".format(ld=c_compiler) filter_file(match, substitute, config_heavy, **kwargs) match = "^ccflags='" diff --git a/var/spack/repos/builtin/packages/py-maturin/package.py b/var/spack/repos/builtin/packages/py-maturin/package.py index 53bf72e66dd..12a23478f4f 100644 --- a/var/spack/repos/builtin/packages/py-maturin/package.py +++ b/var/spack/repos/builtin/packages/py-maturin/package.py @@ -45,3 +45,4 @@ class PyMaturin(PythonPackage): # https://patchwork.yoctoproject.org/project/oe-core/patch/8803dc101b641c948805cab9e5784c38f43b0e51.1702791173.git.tim.orling@konsulko.com/ # This seems to still be an issue for others depends_on("bzip2") + depends_on("c", type="build") diff --git a/var/spack/repos/builtin/packages/py-petsc4py/ldshared.patch b/var/spack/repos/builtin/packages/py-petsc4py/ldshared.patch index 026a48722e5..fe32ce08749 100644 --- a/var/spack/repos/builtin/packages/py-petsc4py/ldshared.patch +++ b/var/spack/repos/builtin/packages/py-petsc4py/ldshared.patch @@ -7,7 +7,7 @@ index 8a2466a5bd..73c08b923a 100644 ldflags = getenv('LDFLAGS', cflags + ' ' + (ldflags or '')) ldcmd = split_quoted(ld) + split_quoted(ldflags) - ldshared = [flg for flg in split_quoted(ldshared) if flg not in ldcmd] -+ ldshared = [flg for flg in split_quoted(ldshared) if flg not in ldcmd and (flg.find('/lib/spack/env')<0)] ++ ldshared = [flg for flg in split_quoted(ldshared) if flg not in ldcmd and (flg.find('/lib/spack/env')<0) and (flg.find('/libexec/spack')<0)] ldshared = str.join(' ', ldshared) # def get_flags(cmd): diff --git a/var/spack/repos/builtin/packages/py-petsc4py/ldshared_319.patch b/var/spack/repos/builtin/packages/py-petsc4py/ldshared_319.patch new file mode 100644 index 00000000000..038625cb3a6 --- /dev/null +++ b/var/spack/repos/builtin/packages/py-petsc4py/ldshared_319.patch @@ -0,0 +1,12 @@ +diff --unified --recursive --no-dereference spack-src1/conf/confpetsc.py spack-src2/conf/confpetsc.py +--- spack-src1/conf/confpetsc.py 2025-02-17 13:02:08.781676798 +0100 ++++ spack-src2/conf/confpetsc.py 2025-02-17 13:03:13.024625112 +0100 +@@ -350,7 +350,7 @@ + ldshared = [ + flg + for flg in split_quoted(ldshared) +- if flg not in ldcmd and (flg.find('/lib/spack/env') < 0) ++ if flg not in ldcmd and (flg.find('/lib/spack/env') < 0) and (flg.find('/libexec/spack/') < 0) + ] + ldshared = str.join(' ', ldshared) + diff --git a/var/spack/repos/builtin/packages/py-petsc4py/package.py b/var/spack/repos/builtin/packages/py-petsc4py/package.py index bb261409d49..8498b699809 100644 --- a/var/spack/repos/builtin/packages/py-petsc4py/package.py +++ b/var/spack/repos/builtin/packages/py-petsc4py/package.py @@ -94,6 +94,9 @@ class PyPetsc4py(PythonPackage): variant("mpi", default=True, description="Activates MPI support") + # Hack to fix https://github.com/spack/spack/issues/21451, where Petsc4Py expects LDSHARED + # to start with the same executable as get_config_var("CC") + patch("ldshared_319.patch", when="@3.19:") patch("ldshared.patch", when="@:3.18") depends_on("py-cython@3:", when="@3.20:", type="build") diff --git a/var/spack/repos/builtin/packages/py-safetensors/package.py b/var/spack/repos/builtin/packages/py-safetensors/package.py index c2f73bc6cbe..2df4d7591a1 100644 --- a/var/spack/repos/builtin/packages/py-safetensors/package.py +++ b/var/spack/repos/builtin/packages/py-safetensors/package.py @@ -22,3 +22,5 @@ class PySafetensors(PythonPackage): depends_on("py-maturin@1", type="build", when="@0.4.3:") depends_on("py-setuptools", when="@0.3.1", type="build") depends_on("py-setuptools-rust", when="@0.3.1", type="build") + + depends_on("c", type="build") diff --git a/var/spack/repos/builtin/packages/py-tokenizers/package.py b/var/spack/repos/builtin/packages/py-tokenizers/package.py index 3f0f71bd7f7..62c2270ee87 100644 --- a/var/spack/repos/builtin/packages/py-tokenizers/package.py +++ b/var/spack/repos/builtin/packages/py-tokenizers/package.py @@ -47,3 +47,6 @@ class PyTokenizers(PythonPackage): # https://github.com/huggingface/tokenizers/issues/176 # https://github.com/PyO3/pyo3/issues/5 depends_on("rust@nightly", when="@:0.8", type="build") + + depends_on("c", type="build") + depends_on("cxx", type="build") diff --git a/var/spack/repos/builtin/packages/python/package.py b/var/spack/repos/builtin/packages/python/package.py index 372a9281c14..d5c887f7ead 100644 --- a/var/spack/repos/builtin/packages/python/package.py +++ b/var/spack/repos/builtin/packages/python/package.py @@ -14,7 +14,6 @@ from llnl.util.lang import dedupe -import spack.paths from spack.build_environment import dso_suffix, stat_suffix from spack.package import * @@ -692,7 +691,7 @@ def configure_args(self): config_args.append("--without-ensurepip") if "+pic" in spec: - cflags.append(self.compiler.cc_pic_flag) + cflags.append(self["c"].pic_flag) if "+ssl" in spec: config_args.append("--with-openssl={0}".format(spec["openssl"].prefix)) @@ -810,9 +809,9 @@ def filter_compilers(self): filenames = [self.get_sysconfigdata_name(), self.config_vars["makefile_filename"]] - filter_file(spack_cc, self.compiler.cc, *filenames, **kwargs) - if spack_cxx and self.compiler.cxx: - filter_file(spack_cxx, self.compiler.cxx, *filenames, **kwargs) + filter_file(spack_cc, self["c"].cc, *filenames, **kwargs) + if spack_cxx: + filter_file(spack_cxx, self["cxx"].cxx, *filenames, **kwargs) @run_after("install") def symlink(self): @@ -1269,6 +1268,11 @@ def setup_dependent_build_environment(self, env, dependent_spec): """Set PYTHONPATH to include the site-packages directory for the extension and any other python extensions it depends on. """ + # The logic below is linux specific, and used to inject the compiler wrapper to + # compile Python extensions. Thus, it is not needed on Windows. + if sys.platform == "win32": + return + # We need to make sure that the extensions are compiled and linked with # the Spack wrapper. Paths to the executables that are used for these # operations are normally taken from the sysconfigdata file, which we @@ -1288,16 +1292,24 @@ def setup_dependent_build_environment(self, env, dependent_spec): # try to modify LDSHARED (LDCXXSHARED), the second variable, which is # used for linking, in a consistent manner. - for compile_var, link_var in [("CC", "LDSHARED"), ("CXX", "LDCXXSHARED")]: + for language, compile_var, link_var in [ + ("c", "CC", "LDSHARED"), + ("cxx", "CXX", "LDCXXSHARED"), + ]: + if not dependent_spec.has_virtual_dependency(language): + continue + + compiler_wrapper_pkg = dependent_spec["compiler-wrapper"].package + compiler_pkg = dependent_spec[language].package + # First, we get the values from the sysconfigdata: config_compile = self.config_vars[compile_var] config_link = self.config_vars[link_var] # The dependent environment will have the compilation command set to # the following: - new_compile = join_path( - spack.paths.build_env_path, - dependent_spec.package.compiler.link_paths[compile_var.lower()], + new_compile = str( + compiler_wrapper_pkg.bin_dir() / compiler_pkg.compiler_wrapper_link_paths[language] ) # Normally, the link command starts with the compilation command: diff --git a/var/spack/repos/builtin/packages/rpcsvc-proto/package.py b/var/spack/repos/builtin/packages/rpcsvc-proto/package.py index 2cb75e10b09..63fe04daf4c 100644 --- a/var/spack/repos/builtin/packages/rpcsvc-proto/package.py +++ b/var/spack/repos/builtin/packages/rpcsvc-proto/package.py @@ -2,7 +2,6 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) -import spack.paths from spack.package import * @@ -35,6 +34,6 @@ def change_makefile(self): # Add 'cpp' path for rpcgen filter_file( "rpcgen/rpcgen", - f"rpcgen/rpcgen -Y {spack.paths.spack_root}/lib/spack/env", + f"rpcgen/rpcgen -Y {self['compiler-wrapper'].bin_dir()}", "rpcsvc/Makefile", ) diff --git a/var/spack/repos/builtin/packages/spectrum-mpi/package.py b/var/spack/repos/builtin/packages/spectrum-mpi/package.py index 13a4be26c6b..a5b0871684f 100644 --- a/var/spack/repos/builtin/packages/spectrum-mpi/package.py +++ b/var/spack/repos/builtin/packages/spectrum-mpi/package.py @@ -4,7 +4,7 @@ import os import re -import spack.compilers +import spack.compilers.config from spack.package import * @@ -48,7 +48,7 @@ def get_host_compiler(exe): def get_spack_compiler_spec(compilers_found): # check using cc for now, as everyone should have that defined. path = os.path.dirname(compilers_found["cc"]) - spack_compilers = spack.compilers.find_compilers([path]) + spack_compilers = spack.compilers.config.find_compilers([path]) actual_compiler = None # check if the compiler actually matches the one we want for spack_compiler in spack_compilers: diff --git a/var/spack/repos/builtin/packages/taskflow/package.py b/var/spack/repos/builtin/packages/taskflow/package.py index 44e76d98587..331cc2dcc2d 100644 --- a/var/spack/repos/builtin/packages/taskflow/package.py +++ b/var/spack/repos/builtin/packages/taskflow/package.py @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) -from spack.compiler import UnsupportedCompilerFlag +from spack.compilers.error import UnsupportedCompilerFlag from spack.package import * diff --git a/var/spack/repos/builtin/packages/vasp/package.py b/var/spack/repos/builtin/packages/vasp/package.py index 5e9701b2a47..fab016d467b 100644 --- a/var/spack/repos/builtin/packages/vasp/package.py +++ b/var/spack/repos/builtin/packages/vasp/package.py @@ -86,7 +86,7 @@ class Vasp(MakefilePackage, CudaPackage): depends_on("nccl", when="@6.3: +cuda") depends_on("hdf5+fortran+mpi", when="+hdf5") # at the very least the nvhpc mpi seems required - depends_on("nvhpc+mpi+lapack+blas", when="%nvhpc") + requires("^nvhpc+mpi+lapack+blas", when="%nvhpc") conflicts( "%gcc@:8", msg="GFortran before 9.x does not support all features needed to build VASP" diff --git a/var/spack/repos/builtin/packages/vtk-h/package.py b/var/spack/repos/builtin/packages/vtk-h/package.py index 4a20bc2c5d4..97a9f46d0db 100644 --- a/var/spack/repos/builtin/packages/vtk-h/package.py +++ b/var/spack/repos/builtin/packages/vtk-h/package.py @@ -112,8 +112,9 @@ def _get_host_config_path(self, spec): # if on llnl systems, we can use the SYS_TYPE if "SYS_TYPE" in env: sys_type = env["SYS_TYPE"] - host_config_path = "{0}-{1}-{2}-vtkh-{3}.cmake".format( - socket.gethostname(), sys_type, spec.compiler, spec.dag_hash() + compiler_str = f"{self['cxx'].name}-{self['cxx'].version}" + host_config_path = ( + f"{socket.gethostname()}-{sys_type}-{compiler_str}-vtkh-{spec.dag_hash()}.cmake" ) dest_dir = spec.prefix host_config_path = os.path.abspath(join_path(dest_dir, host_config_path)) diff --git a/var/spack/repos/builtin/packages/win-file/package.py b/var/spack/repos/builtin/packages/win-file/package.py index 29624b31693..0f66363b6e8 100644 --- a/var/spack/repos/builtin/packages/win-file/package.py +++ b/var/spack/repos/builtin/packages/win-file/package.py @@ -22,6 +22,8 @@ class WinFile(Package): version("5.45", sha256="11b8f3abf647c711bc50ef8451c8d6e955f11c4afd8b0a98f2ac65e9b6e10d5e") + depends_on("c", type="build") + @classmethod def determine_version(cls, exe): output = Executable(exe)("--version", output=str, error=str) diff --git a/var/spack/repos/builtin/packages/win-gpg/package.py b/var/spack/repos/builtin/packages/win-gpg/package.py index 501668703fc..8c0876f8e79 100644 --- a/var/spack/repos/builtin/packages/win-gpg/package.py +++ b/var/spack/repos/builtin/packages/win-gpg/package.py @@ -23,6 +23,8 @@ class WinGpg(Package): version("2.4.5", sha256="249ab87bd06abea3140054089bad44d9a5d1531413590576da609142db2673ec") + depends_on("c", type="build") + @classmethod def determine_version(cls, exe): output = Executable(exe)("--version", output=str, error=str) diff --git a/var/spack/repos/builtin/packages/xl/package.py b/var/spack/repos/builtin/packages/xl/package.py index 438ac4c214d..6528946e364 100644 --- a/var/spack/repos/builtin/packages/xl/package.py +++ b/var/spack/repos/builtin/packages/xl/package.py @@ -1,6 +1,8 @@ # Copyright Spack Project Developers. See COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) +import os.path + from spack.package import * @@ -14,6 +16,9 @@ class Xl(Package, CompilerPackage): variant("r", default=True, description="The _r version of compilers") + provides("c", "cxx") + provides("fortran") + def install(self, spec, prefix): raise InstallError( "XL compilers are not installable yet, but can be " @@ -27,6 +32,48 @@ def install(self, spec, prefix): compiler_version_argument = "-qversion" compiler_version_regex = r"([0-9]?[0-9]\.[0-9])" + pic_flag = "-qpic" + openmp_flag = "-qsmp=omp" + + debug_flags = ["-g", "-g0", "-g1", "-g2", "-g8", "-g9"] + opt_flags = ["-O", "-O0", "-O1", "-O2", "-O3", "-O4", "-O5", "-Ofast"] + verbose_flag = "-V" + + @property + def link_paths(self): + if self.spec.satisfies("~r"): + return { + "c": os.path.join("xl", "xlc"), + "cxx": os.path.join("xl", "xlc++"), + "fortran": os.path.join("xl", "xlf"), + } + + return { + "c": os.path.join("xl", "xlc_r"), + "cxx": os.path.join("xl", "xlc++_r"), + "fortran": os.path.join("xl", "xlf_r"), + } + + def _standard_flag(self, *, language, standard): + flags = { + "cxx": { + "11": [("@13.1:", "-qlanglvl=extended0x")], + "14": [("@16.1.1.8:", "-std=c++14")], + }, + "c": { + "99": [("@10.1:13.0", "-qlanglvl=extc99"), ("@13.1:", "-std=gnu99")], + "11": [("@12.1:13.1.1", "-qlanglvl=extc1x"), ("@13.1.2:", "-std=gnu11")], + }, + } + for condition, flag in flags[language][standard]: + if self.spec.satisfies(condition): + return flag + else: + raise RuntimeError( + f"{self.spec} does not support the '{standard}' standard " + f"for the '{language}' language" + ) + @classmethod def determine_variants(cls, exes, version_str): _r_exes = [e for e in exes if e.endswith("_r")] @@ -41,24 +88,3 @@ def determine_variants(cls, exes, version_str): if _compilers: results.append(("~r", {"compilers": _compilers})) return results - - @property - def cc(self): - if self.spec.external: - return self.spec.extra_attributes["compilers"]["c"] - msg = "cannot retrieve C compiler [spec is not concrete]" - assert self.spec.concrete, msg - - @property - def cxx(self): - if self.spec.external: - return self.spec.extra_attributes["compilers"]["cxx"] - msg = "cannot retrieve C++ compiler [spec is not concrete]" - assert self.spec.concrete, msg - - @property - def fortran(self): - if self.spec.external: - return self.spec.extra_attributes["compilers"]["fortran"] - msg = "cannot retrieve Fortran compiler [spec is not concrete]" - assert self.spec.concrete, msg diff --git a/var/spack/repos/builtin/packages/yafyaml/package.py b/var/spack/repos/builtin/packages/yafyaml/package.py index f1e4f699fee..ac2975d168a 100644 --- a/var/spack/repos/builtin/packages/yafyaml/package.py +++ b/var/spack/repos/builtin/packages/yafyaml/package.py @@ -3,9 +3,7 @@ # SPDX-License-Identifier: (Apache-2.0 OR MIT) import os -import re -import spack.compiler from spack.package import * @@ -65,35 +63,8 @@ class Yafyaml(CMakePackage): msg="yaFyaml only works with the Fujitsu compiler from 1.3.0 onwards", ) - # GCC 13.3 and higher only work with yafyaml 1.4.0 onwards - # First we can check if the spec is gcc@13.3... conflicts("%gcc@13.3:", when="@:1.3.0", msg="GCC 13.3+ only works with yafyaml 1.4.0 onwards") - # ...but if it is not (say apple-clang with gfortran as a fc), there is - # no easy way to check this. So we hijack flag_handler to raise an - # exception if we detect gfortran 13.3 or 14. - # NOTE: This will only error out at install time, so `spack spec` will - # not catch this. - def flag_handler(self, name, flags): - # We need to match any compiler that has a name of gfortran or gfortran-* - pattern = re.compile(r"gfortran(-\d+)?$") - - if pattern.search(self.compiler.fc): - gfortran_version = spack.compiler.get_compiler_version_output( - self.compiler.fc, "-dumpfullversion" - ).strip() - - # gfortran_version is now a string like "13.3.0". We now need to just capture - # the major and minor version numbers - gfortran_version = ".".join(gfortran_version.split(".")[:2]) - - if self.spec.satisfies("@:1.3.0") and (float(gfortran_version) >= 13.3): - raise InstallError( - f"Your gfortran version {gfortran_version} is not compatible with " - f"yafyaml 1.3.0 and below. Use yafyaml 1.4.0 or higher." - ) - return None, None, None - variant( "build_type", default="Release", diff --git a/var/spack/repos/builtin/packages/yoda/package.py b/var/spack/repos/builtin/packages/yoda/package.py index d6a8300f6bf..60a59c85fb4 100644 --- a/var/spack/repos/builtin/packages/yoda/package.py +++ b/var/spack/repos/builtin/packages/yoda/package.py @@ -72,6 +72,7 @@ class Yoda(AutotoolsPackage): version("1.0.4", sha256="697fe397c69689feecb2a731e19b2ff85e19343b8198c4f18a7064c4f7123950") version("1.0.3", sha256="6a1d1d75d9d74da457726ea9463c1b0b6ba38d4b43ef54e1c33f885e70fdae4b") + depends_on("c", type="build") depends_on("cxx", type="build") variant("hdf5", default=False, description="Enable HDF5 compatibility", when="@2.1:") diff --git a/var/spack/repos/builtin/packages/zlib-ng/package.py b/var/spack/repos/builtin/packages/zlib-ng/package.py index 753d21a83b3..4ae5e18be2a 100644 --- a/var/spack/repos/builtin/packages/zlib-ng/package.py +++ b/var/spack/repos/builtin/packages/zlib-ng/package.py @@ -71,7 +71,7 @@ def libs(self): def flag_handler(self, name, flags): if name == "cflags" and self.spec.satisfies("+pic build_system=autotools"): - flags.append(self.compiler.cc_pic_flag) + flags.append(self["c"].pic_flag) return (flags, None, None) diff --git a/var/spack/repos/compiler_runtime.test/packages/compiler-wrapper b/var/spack/repos/compiler_runtime.test/packages/compiler-wrapper new file mode 120000 index 00000000000..cd3a417be31 --- /dev/null +++ b/var/spack/repos/compiler_runtime.test/packages/compiler-wrapper @@ -0,0 +1 @@ +../../builtin/packages/compiler-wrapper/ \ No newline at end of file diff --git a/var/spack/repos/compiler_runtime.test/packages/gcc b/var/spack/repos/compiler_runtime.test/packages/gcc new file mode 120000 index 00000000000..17e3b9e575b --- /dev/null +++ b/var/spack/repos/compiler_runtime.test/packages/gcc @@ -0,0 +1 @@ +../../builtin.mock/packages/gcc \ No newline at end of file diff --git a/var/spack/repos/compiler_runtime.test/packages/gcc-runtime b/var/spack/repos/compiler_runtime.test/packages/gcc-runtime new file mode 120000 index 00000000000..0e770302bf4 --- /dev/null +++ b/var/spack/repos/compiler_runtime.test/packages/gcc-runtime @@ -0,0 +1 @@ +../../builtin.mock/packages/gcc-runtime \ No newline at end of file diff --git a/var/spack/repos/compiler_runtime.test/packages/gcc-runtime/package.py b/var/spack/repos/compiler_runtime.test/packages/gcc-runtime/package.py deleted file mode 100644 index e85021ba0ae..00000000000 --- a/var/spack/repos/compiler_runtime.test/packages/gcc-runtime/package.py +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright Spack Project Developers. See COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -from spack.package import * - - -class GccRuntime(Package): - homepage = "https://example.com" - has_code = False - tags = ["runtime"] - requires("%gcc") diff --git a/var/spack/repos/compiler_runtime.test/packages/gcc/package.py b/var/spack/repos/compiler_runtime.test/packages/gcc/package.py deleted file mode 100644 index ddd0e04852e..00000000000 --- a/var/spack/repos/compiler_runtime.test/packages/gcc/package.py +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright Spack Project Developers. See COPYRIGHT file for details. -# -# SPDX-License-Identifier: (Apache-2.0 OR MIT) - -from spack.package import * - - -class Gcc(Package): - homepage = "http://www.example.com/" - has_code = False - - version("13.2.0") - version("12.3.0") - - @classmethod - def runtime_constraints(cls, *, spec, pkg): - pkg("*").depends_on( - "gcc-runtime", - when="%gcc", - type="link", - description="If any package uses %gcc, it depends on gcc-runtime", - ) - pkg("*").depends_on( - f"gcc-runtime@{str(spec.version)}:", - when=f"%{str(spec)}", - type="link", - description=f"If any package uses %{str(spec)}, " - f"it depends on gcc-runtime@{str(spec.version)}:", - ) - # The version of gcc-runtime is the same as the %gcc used to "compile" it - pkg("gcc-runtime").requires(f"@={str(spec.version)}", when=f"%{str(spec)}") - - # If a node used %gcc@X.Y its dependencies must use gcc-runtime@:X.Y - pkg("*").propagate(f"%gcc@:{str(spec.version)}", when=f"%{str(spec)}") diff --git a/var/spack/repos/compiler_runtime.test/packages/glibc b/var/spack/repos/compiler_runtime.test/packages/glibc new file mode 120000 index 00000000000..f9cd337cc24 --- /dev/null +++ b/var/spack/repos/compiler_runtime.test/packages/glibc @@ -0,0 +1 @@ +../../builtin.mock/packages/glibc \ No newline at end of file diff --git a/var/spack/repos/compiler_runtime.test/packages/gmake b/var/spack/repos/compiler_runtime.test/packages/gmake new file mode 120000 index 00000000000..86bbc3dd35a --- /dev/null +++ b/var/spack/repos/compiler_runtime.test/packages/gmake @@ -0,0 +1 @@ +../../builtin.mock/packages/gmake \ No newline at end of file diff --git a/var/spack/repos/compiler_runtime.test/packages/gnuconfig b/var/spack/repos/compiler_runtime.test/packages/gnuconfig new file mode 120000 index 00000000000..cfb894494bd --- /dev/null +++ b/var/spack/repos/compiler_runtime.test/packages/gnuconfig @@ -0,0 +1 @@ +../../builtin.mock/packages/gnuconfig \ No newline at end of file diff --git a/var/spack/repos/compiler_runtime.test/packages/pkg-a/package.py b/var/spack/repos/compiler_runtime.test/packages/pkg-a/package.py index f467fe3a6ed..ef30c324e72 100644 --- a/var/spack/repos/compiler_runtime.test/packages/pkg-a/package.py +++ b/var/spack/repos/compiler_runtime.test/packages/pkg-a/package.py @@ -10,3 +10,6 @@ class PkgA(Package): version("1.0") depends_on("pkg-b") + + depends_on("c", type="build") + depends_on("cxx", type="build") diff --git a/var/spack/repos/compiler_runtime.test/packages/pkg-b/package.py b/var/spack/repos/compiler_runtime.test/packages/pkg-b/package.py index 0bdbaacd0c1..83948af641e 100644 --- a/var/spack/repos/compiler_runtime.test/packages/pkg-b/package.py +++ b/var/spack/repos/compiler_runtime.test/packages/pkg-b/package.py @@ -9,3 +9,6 @@ class PkgB(Package): has_code = False version("1.0") + + depends_on("c", type="build") + depends_on("cxx", type="build") diff --git a/var/spack/repos/duplicates.test/packages/gcc b/var/spack/repos/duplicates.test/packages/gcc new file mode 120000 index 00000000000..17e3b9e575b --- /dev/null +++ b/var/spack/repos/duplicates.test/packages/gcc @@ -0,0 +1 @@ +../../builtin.mock/packages/gcc \ No newline at end of file diff --git a/var/spack/repos/duplicates.test/packages/gcc-runtime b/var/spack/repos/duplicates.test/packages/gcc-runtime new file mode 120000 index 00000000000..0e770302bf4 --- /dev/null +++ b/var/spack/repos/duplicates.test/packages/gcc-runtime @@ -0,0 +1 @@ +../../builtin.mock/packages/gcc-runtime \ No newline at end of file diff --git a/var/spack/repos/duplicates.test/packages/glibc b/var/spack/repos/duplicates.test/packages/glibc new file mode 120000 index 00000000000..f9cd337cc24 --- /dev/null +++ b/var/spack/repos/duplicates.test/packages/glibc @@ -0,0 +1 @@ +../../builtin.mock/packages/glibc \ No newline at end of file diff --git a/var/spack/repos/duplicates.test/packages/gnuconfig b/var/spack/repos/duplicates.test/packages/gnuconfig new file mode 120000 index 00000000000..cfb894494bd --- /dev/null +++ b/var/spack/repos/duplicates.test/packages/gnuconfig @@ -0,0 +1 @@ +../../builtin.mock/packages/gnuconfig \ No newline at end of file diff --git a/var/spack/repos/duplicates.test/packages/llvm b/var/spack/repos/duplicates.test/packages/llvm new file mode 120000 index 00000000000..7dddef3a960 --- /dev/null +++ b/var/spack/repos/duplicates.test/packages/llvm @@ -0,0 +1 @@ +../../builtin.mock/packages/llvm \ No newline at end of file diff --git a/var/spack/repos/edges.test/packages/gcc b/var/spack/repos/edges.test/packages/gcc new file mode 120000 index 00000000000..17e3b9e575b --- /dev/null +++ b/var/spack/repos/edges.test/packages/gcc @@ -0,0 +1 @@ +../../builtin.mock/packages/gcc \ No newline at end of file diff --git a/var/spack/repos/edges.test/packages/gcc-runtime b/var/spack/repos/edges.test/packages/gcc-runtime new file mode 120000 index 00000000000..0e770302bf4 --- /dev/null +++ b/var/spack/repos/edges.test/packages/gcc-runtime @@ -0,0 +1 @@ +../../builtin.mock/packages/gcc-runtime \ No newline at end of file diff --git a/var/spack/repos/edges.test/packages/glibc b/var/spack/repos/edges.test/packages/glibc new file mode 120000 index 00000000000..f9cd337cc24 --- /dev/null +++ b/var/spack/repos/edges.test/packages/glibc @@ -0,0 +1 @@ +../../builtin.mock/packages/glibc \ No newline at end of file diff --git a/var/spack/repos/edges.test/packages/gmake b/var/spack/repos/edges.test/packages/gmake new file mode 120000 index 00000000000..86bbc3dd35a --- /dev/null +++ b/var/spack/repos/edges.test/packages/gmake @@ -0,0 +1 @@ +../../builtin.mock/packages/gmake \ No newline at end of file diff --git a/var/spack/repos/edges.test/packages/gnuconfig b/var/spack/repos/edges.test/packages/gnuconfig new file mode 120000 index 00000000000..cfb894494bd --- /dev/null +++ b/var/spack/repos/edges.test/packages/gnuconfig @@ -0,0 +1 @@ +../../builtin.mock/packages/gnuconfig \ No newline at end of file diff --git a/var/spack/repos/edges.test/packages/llvm b/var/spack/repos/edges.test/packages/llvm new file mode 120000 index 00000000000..7dddef3a960 --- /dev/null +++ b/var/spack/repos/edges.test/packages/llvm @@ -0,0 +1 @@ +../../builtin.mock/packages/llvm \ No newline at end of file diff --git a/var/spack/repos/flags.test/packages/compiler-wrapper b/var/spack/repos/flags.test/packages/compiler-wrapper new file mode 120000 index 00000000000..cd3a417be31 --- /dev/null +++ b/var/spack/repos/flags.test/packages/compiler-wrapper @@ -0,0 +1 @@ +../../builtin/packages/compiler-wrapper/ \ No newline at end of file diff --git a/var/spack/repos/flags.test/packages/gcc b/var/spack/repos/flags.test/packages/gcc new file mode 120000 index 00000000000..17e3b9e575b --- /dev/null +++ b/var/spack/repos/flags.test/packages/gcc @@ -0,0 +1 @@ +../../builtin.mock/packages/gcc \ No newline at end of file diff --git a/var/spack/repos/flags.test/packages/gcc-runtime b/var/spack/repos/flags.test/packages/gcc-runtime new file mode 120000 index 00000000000..0e770302bf4 --- /dev/null +++ b/var/spack/repos/flags.test/packages/gcc-runtime @@ -0,0 +1 @@ +../../builtin.mock/packages/gcc-runtime \ No newline at end of file diff --git a/var/spack/repos/flags.test/packages/glibc b/var/spack/repos/flags.test/packages/glibc new file mode 120000 index 00000000000..f9cd337cc24 --- /dev/null +++ b/var/spack/repos/flags.test/packages/glibc @@ -0,0 +1 @@ +../../builtin.mock/packages/glibc \ No newline at end of file diff --git a/var/spack/repos/flags.test/packages/gmake b/var/spack/repos/flags.test/packages/gmake new file mode 120000 index 00000000000..eefeb5e47f5 --- /dev/null +++ b/var/spack/repos/flags.test/packages/gmake @@ -0,0 +1 @@ +../../builtin.mock/packages/gmake/ \ No newline at end of file diff --git a/var/spack/repos/flags.test/packages/gnuconfig b/var/spack/repos/flags.test/packages/gnuconfig new file mode 120000 index 00000000000..cfb894494bd --- /dev/null +++ b/var/spack/repos/flags.test/packages/gnuconfig @@ -0,0 +1 @@ +../../builtin.mock/packages/gnuconfig \ No newline at end of file diff --git a/var/spack/repos/requirements.test/packages/compiler-wrapper b/var/spack/repos/requirements.test/packages/compiler-wrapper new file mode 120000 index 00000000000..d0feadce051 --- /dev/null +++ b/var/spack/repos/requirements.test/packages/compiler-wrapper @@ -0,0 +1 @@ +../../builtin.mock/packages/compiler-wrapper/ \ No newline at end of file diff --git a/var/spack/repos/requirements.test/packages/gcc b/var/spack/repos/requirements.test/packages/gcc new file mode 120000 index 00000000000..17e3b9e575b --- /dev/null +++ b/var/spack/repos/requirements.test/packages/gcc @@ -0,0 +1 @@ +../../builtin.mock/packages/gcc \ No newline at end of file diff --git a/var/spack/repos/requirements.test/packages/gcc-runtime b/var/spack/repos/requirements.test/packages/gcc-runtime new file mode 120000 index 00000000000..0e770302bf4 --- /dev/null +++ b/var/spack/repos/requirements.test/packages/gcc-runtime @@ -0,0 +1 @@ +../../builtin.mock/packages/gcc-runtime \ No newline at end of file diff --git a/var/spack/repos/requirements.test/packages/glibc b/var/spack/repos/requirements.test/packages/glibc new file mode 120000 index 00000000000..f9cd337cc24 --- /dev/null +++ b/var/spack/repos/requirements.test/packages/glibc @@ -0,0 +1 @@ +../../builtin.mock/packages/glibc \ No newline at end of file diff --git a/var/spack/repos/requirements.test/packages/gmake b/var/spack/repos/requirements.test/packages/gmake new file mode 120000 index 00000000000..eefeb5e47f5 --- /dev/null +++ b/var/spack/repos/requirements.test/packages/gmake @@ -0,0 +1 @@ +../../builtin.mock/packages/gmake/ \ No newline at end of file diff --git a/var/spack/repos/requirements.test/packages/gnuconfig b/var/spack/repos/requirements.test/packages/gnuconfig new file mode 120000 index 00000000000..cfb894494bd --- /dev/null +++ b/var/spack/repos/requirements.test/packages/gnuconfig @@ -0,0 +1 @@ +../../builtin.mock/packages/gnuconfig \ No newline at end of file diff --git a/var/spack/repos/requirements.test/packages/llvm b/var/spack/repos/requirements.test/packages/llvm new file mode 120000 index 00000000000..7dddef3a960 --- /dev/null +++ b/var/spack/repos/requirements.test/packages/llvm @@ -0,0 +1 @@ +../../builtin.mock/packages/llvm \ No newline at end of file