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