diff --git a/.github/workflows/ubuntu-ci-x86_64-gnu.yaml b/.github/workflows/ubuntu-ci-x86_64-gnu.yaml index 2b4be8ffe..f85113ac7 100644 --- a/.github/workflows/ubuntu-ci-x86_64-gnu.yaml +++ b/.github/workflows/ubuntu-ci-x86_64-gnu.yaml @@ -131,6 +131,16 @@ jobs: echo "jedi-ufs-env ..." spack install --fail-fast --source --no-check-signature jedi-ufs-env 2>&1 | tee log.install.gnu-11.4.0-buildcache.jedi-ufs-env spack buildcache create -u /home/ubuntu/spack-stack/build-cache/ jedi-ufs-env + + elif [[ "${TEMPLATE}" == *"cylc-dev"* ]]; then + # Workaround for not being able to install rust from build-cache, see + # https://github.com/spack/spack/issues/48971 + echo "rust dependencies ..." + spack install --verbose --source --no-check-signature --only=dependencies rust 2>&1 | tee log.install.gnu-11.4.0-buildcache.${TEMPLATE}.001.rust-dependencies + + # rust from source + echo "rust (from source) ..." + spack install --verbose --source --no-cache rust 2>&1 | tee log.install.gnu-11.4.0-buildcache.${TEMPLATE}.002.rust fi # the rest diff --git a/configs/sites/tier1/acorn/compilers.yaml b/configs/sites/tier1/acorn/compilers.yaml index 7e63ca9c2..f686fe188 100644 --- a/configs/sites/tier1/acorn/compilers.yaml +++ b/configs/sites/tier1/acorn/compilers.yaml @@ -21,7 +21,7 @@ compilers: CONFIG_SITE: '' extra_rpaths: [] - compiler: - spec: intel@2022.0.2.262 + spec: intel@2022.2.0.262 paths: cc: cc cxx: CC diff --git a/configs/sites/tier1/acorn/packages.yaml b/configs/sites/tier1/acorn/packages.yaml index f17a882ef..dc453226e 100644 --- a/configs/sites/tier1/acorn/packages.yaml +++ b/configs/sites/tier1/acorn/packages.yaml @@ -41,3 +41,6 @@ externals: - spec: grep@3.1 prefix: /usr + esmf: + require: + - '+python' diff --git a/configs/sites/tier1/acorn/packages_intel.yaml b/configs/sites/tier1/acorn/packages_intel.yaml index b9cfc096c..efdfdc867 100644 --- a/configs/sites/tier1/acorn/packages_intel.yaml +++ b/configs/sites/tier1/acorn/packages_intel.yaml @@ -32,9 +32,7 @@ py-numpy: require:: - '^[virtuals=lapack,blas] openblas' - - '@:1.25' - - any_of: ['@:1.24'] - when: '%intel@19.1.3.304' + - '@1.26 %gcc' # *DH eckit: require: diff --git a/configs/sites/tier1/hera/compilers.yaml b/configs/sites/tier1/hera/compilers.yaml index d2e98f057..4bb5ba4ef 100644 --- a/configs/sites/tier1/hera/compilers.yaml +++ b/configs/sites/tier1/hera/compilers.yaml @@ -17,15 +17,32 @@ compilers: CPATH: '/apps/gnu/gcc-9.2.0/include' extra_rpaths: [] - compiler: - spec: gcc@9.2.0 + spec: gcc@13.2.0 paths: - cc: /apps/gnu/gcc-9.2.0/bin/gcc - cxx: /apps/gnu/gcc-9.2.0/bin/g++ - f77: /apps/gnu/gcc-9.2.0/bin/gfortran - fc: /apps/gnu/gcc-9.2.0/bin/gfortran + cc: /apps/gnu/gcc-13.2.0/bin/gcc + cxx: /apps/gnu/gcc-13.2.0/bin/g++ + f77: /apps/gnu/gcc-13.2.0/bin/gfortran + fc: /apps/gnu/gcc-13.2.0/bin/gfortran flags: {} operating_system: rocky8 modules: - - gnu/9.2.0 + - gnu/13.2.0 environment: {} extra_rpaths: [] +- compiler: + spec: oneapi@2024.2.1 + paths: + cc: /apps/oneapi/compiler/2024.2/bin/icx + cxx: /apps/oneapi/compiler/2024.2/bin/icpx + f77: /apps/oneapi/compiler/2024.2/bin/ifort + fc: /apps/oneapi/compiler/2024.2/bin/ifort + flags: {} + operating_system: rocky8 + modules: + - intel/2024.2.1 + environment: + prepend_path: + PATH: '/apps/gnu/gcc-13.2.0/bin' + LD_LIBRARY_PATH: '/apps/gnu/gcc-13.2.0/lib64' + CPATH: '/apps/gnu/gcc-13.2.0/include' + extra_rpaths: [] diff --git a/configs/sites/tier1/hera/mirrors.yaml b/configs/sites/tier1/hera/mirrors.yaml index f6c5a8d1e..678593275 100644 --- a/configs/sites/tier1/hera/mirrors.yaml +++ b/configs/sites/tier1/hera/mirrors.yaml @@ -1,7 +1,7 @@ mirrors: local-source: fetch: - url: file:///scratch1/NCEPDEV/nems/role.epic/spack-stack/source-cache + url: file:///scratch4/NCEPDEV/stmp/role.epic/spack-stack/mirror access_pair: - null - null @@ -9,7 +9,7 @@ mirrors: profile: null endpoint_url: null push: - url: file:///scratch1/NCEPDEV/nems/role.epic/spack-stack/source-cache + url: file:///scratch4/NCEPDEV/stmp/role.epic/spack-stack/mirror access_pair: - null - null diff --git a/configs/sites/tier1/hera/packages_gcc.yaml b/configs/sites/tier1/hera/packages_gcc.yaml index 3d2b4d6cb..23e55c774 100644 --- a/configs/sites/tier1/hera/packages_gcc.yaml +++ b/configs/sites/tier1/hera/packages_gcc.yaml @@ -1,6 +1,6 @@ packages: all: - compiler:: [gcc@9.2.0] + compiler:: [gcc@13.2.0] providers: mpi:: [openmpi@4.1.6] mpi: @@ -9,5 +9,5 @@ packages: externals: - spec: openmpi@4.1.6~atomics~cuda~cxx~cxx_exceptions~gpfs~internal-hwloc~internal-libevent~internal-pmix~java+legacylaunchers~lustre~memchecker~openshmem~orterunprefix+pmi+romio+rsh~singularity+static+vt+wrapper-rpath fabrics=ucx schedulers=slurm modules: - - gnu/9.2.0 - - openmpi/4.1.6_gnu9.2.0 + - gnu/13.2.0 + - openmpi/4.1.6 diff --git a/configs/sites/tier1/hera/packages_oneapi.yaml b/configs/sites/tier1/hera/packages_oneapi.yaml new file mode 100644 index 000000000..f70c19f2d --- /dev/null +++ b/configs/sites/tier1/hera/packages_oneapi.yaml @@ -0,0 +1,43 @@ +packages: + all: + compiler:: [oneapi@2024.2.1] + providers: + mpi:: [intel-oneapi-mpi@2021.13] + # Remove the next three lines to switch to intel-oneapi-mkl + blas:: [openblas] + fftw-api:: [fftw] + lapack:: [openblas] + mpi: + buildable: False + intel-oneapi-mpi: + buildable: False + externals: + - spec: intel-oneapi-mpi@2021.13%oneapi@2024.2.1 + modules: + - intel/2024.2.1 + - impi/2024.2.1 + prefix: /apps/oneapi + intel-oneapi-mkl: + # Remove buildable: False and uncomment externals section below to use intel-oneapi-mkl + buildable: False + #externals: + #- spec: intel-oneapi-mkl@2022.0.2%intel@2021.5.0 + # prefix: /apps/oneapi + # DH* Remove this section to switch to intel-oneapi-mkl + ectrans: + require:: + - '@1.2.0 ~mkl +fftw' + gsibec: + require:: + - '@1.2.1 ~mkl' + py-numpy: + require:: + - '@1.26' + - '^openblas' + # *DH + zlib-ng: + require: + - '~shared' + cdo: + require: + - '@2.3.0' diff --git a/configs/sites/tier1/orion/packages.yaml b/configs/sites/tier1/orion/packages.yaml index 509e47e1d..c14c9a705 100644 --- a/configs/sites/tier1/orion/packages.yaml +++ b/configs/sites/tier1/orion/packages.yaml @@ -103,10 +103,6 @@ packages: externals: - spec: pkgconf@1.7.3 prefix: /usr - qt: - externals: - - spec: qt@5.15.8 - prefix: /apps/spack-managed/gcc-11.3.1/qt-5.15.8-d47tsna6f5dylcpblkfgw4gpn2cucihd sed: externals: - spec: sed@4.8 diff --git a/configs/sites/tier1/s4/compilers.yaml b/configs/sites/tier1/s4/compilers.yaml index 6e8ebb5c7..d23d4be3c 100644 --- a/configs/sites/tier1/s4/compilers.yaml +++ b/configs/sites/tier1/s4/compilers.yaml @@ -17,6 +17,27 @@ compilers: LD_LIBRARY_PATH: /opt/intel/oneapi/2023.2/compiler/2023.2.0/linux/compiler/lib/intel64_lin:/opt/gcc/10.2.0/lib64:/opt/gcc/10.2.0/lib CPATH: /opt/gcc/10.2.0/include extra_rpaths: [] +- compiler: + spec: oneapi@2024.2.1 + paths: + cc: /opt/intel/oneapi/2024/compiler/2024.2/bin/icx + cxx: /opt/intel/oneapi/2024/compiler/2024.2/bin/icpx + f77: /opt/intel/oneapi/2024/compiler/2024.2/bin/ifort + fc: /opt/intel/oneapi/2024/compiler/2024.2/bin/ifort + flags: + fflags: -diag-disable=10448 + operating_system: rocky8 + target: x86_64 + modules: + - intel/2024.2 + environment: + prepend_path: + PATH: /opt/gcc/10.2.0/bin + LD_LIBRARY_PATH: /opt/gcc/10.2.0/lib64:/opt/gcc/10.2.0/lib + CPATH: /opt/gcc/10.2.0/include + append_path: + PATH: /opt/intel/oneapi/2024/compiler/2024.2/opt/compiler/include/intel64 + extra_rpaths: [] - compiler: spec: gcc@=13.3.0 paths: @@ -58,3 +79,4 @@ compilers: modules: [] environment: {} extra_rpaths: [] + diff --git a/configs/sites/tier1/s4/packages.yaml b/configs/sites/tier1/s4/packages.yaml index eb7bb70c8..e589d9c5c 100644 --- a/configs/sites/tier1/s4/packages.yaml +++ b/configs/sites/tier1/s4/packages.yaml @@ -1,8 +1,10 @@ packages: all: - compiler:: [intel@2021.10.0,gcc@10.2.0] + compiler:: [oneapi@2024.2.1,gcc@10.2.0] + #compiler:: [intel@2021.10.0,gcc@10.2.0] providers: - mpi:: [intel-oneapi-mpi@2021.10.0] + mpi:: [intel-oneapi-mpi@2021.13] + # mpi:: [intel-oneapi-mpi@2021.10.0] # Remove the next three lines to switch to intel-oneapi-mkl blas:: [openblas] fftw-api:: [fftw] @@ -14,18 +16,24 @@ packages: ### MPI, Python, MKL mpi: buildable: False + #intel-oneapi-mpi: + # externals: + # - spec: intel-oneapi-mpi@2021.10.0%intel@2021.10.0 +classic-names + # prefix: /opt/intel/oneapi/2024 + # modules: + # - intel/2023.2 intel-oneapi-mpi: externals: - - spec: intel-oneapi-mpi@2021.10.0%intel@2021.10.0 +classic-names - prefix: /opt/intel/oneapi/2023.2 + - spec: intel-oneapi-mpi@2021.13%oneapi@2024.2.1 + prefix: /opt/intel/oneapi/2024 modules: - - intel/2023.2 + - intel/2024.2 intel-oneapi-mkl: # Remove buildable: False and uncomment externals section below to use intel-oneapi-mkl buildable: False #externals: #- spec: intel-oneapi-mkl@2023.2.0%intel@2021.10.0 - # prefix: /opt/intel/oneapi/2023.2 + # prefix: /opt/intel/oneapi/2024 # modules: # - intel/2023.2 # Remove this section to switch to intel-oneapi-mkl @@ -80,7 +88,7 @@ packages: externals: - spec: cpio@2.12 prefix: /usr - # OS curl/openssl cause problems + # OS curl/openssl cause problems #curl: # externals: # - spec: curl@7.61.1+gssapi+ldap+nghttp2 @@ -203,3 +211,4 @@ packages: externals: - spec: zip@3.0 prefix: /usr + diff --git a/configs/sites/tier1/wcoss2/compilers.yaml b/configs/sites/tier1/wcoss2/compilers.yaml new file mode 100644 index 000000000..8721b0e9d --- /dev/null +++ b/configs/sites/tier1/wcoss2/compilers.yaml @@ -0,0 +1,45 @@ +compilers: +- compiler: + spec: intel@19.1.3.304 + paths: + cc: cc + cxx: CC + f77: ftn + fc: ftn + flags: {} + operating_system: sles15 + modules: + - PrgEnv-intel/8.3.3 + - craype/2.7.17 + - intel/19.1.3.304 + - libfabric + environment: + set: + # OpenSUSE on WCOSS2 machines sets CONFIG_SITE so + # Automake-based builds are installed in lib64 + # which confuses some packages. + CONFIG_SITE: '' + unset: [PYTHONPATH] + extra_rpaths: [] +- compiler: + spec: gcc@10.2.0 + paths: + cc: cc + cxx: CC + f77: ftn + fc: ftn + flags: {} + operating_system: sles15 + modules: + - PrgEnv-gnu/8.3.3 + - craype/2.7.13 + - gcc/10.2.0 + - libfabric + environment: + set: + # OpenSUSE on WCOSS2 machines sets CONFIG_SITE so + # Automake-based builds are installed in lib64 + # which confuses some packages. + CONFIG_SITE: '' + unset: [PYTHONPATH] + extra_rpaths: [] diff --git a/configs/sites/tier1/wcoss2/config.yaml b/configs/sites/tier1/wcoss2/config.yaml new file mode 100644 index 000000000..b02cc2880 --- /dev/null +++ b/configs/sites/tier1/wcoss2/config.yaml @@ -0,0 +1,5 @@ +config: + build_jobs: 6 + template_dirs: + - $env/site/templates + - $spack/share/spack/templates diff --git a/configs/sites/tier1/wcoss2/modules.yaml b/configs/sites/tier1/wcoss2/modules.yaml new file mode 100644 index 000000000..68cdd1e90 --- /dev/null +++ b/configs/sites/tier1/wcoss2/modules.yaml @@ -0,0 +1,16 @@ +modules: + default: + enable:: + - lmod + lmod: + include: + - python + hierarchy: + - mpi + - hdf5_virtual + - netcdf_c_virtual + - esmf_virtual + - python_virtual + boost: + suffixes: + '%gcc': gcc diff --git a/configs/sites/tier1/wcoss2/packages.yaml b/configs/sites/tier1/wcoss2/packages.yaml new file mode 100644 index 000000000..13d2e803a --- /dev/null +++ b/configs/sites/tier1/wcoss2/packages.yaml @@ -0,0 +1,126 @@ + packages: + # + ### Set compiler. + # + all: + prefer: ['%intel@19.1.3.304'] + compiler:: [intel@19.1.3.304] + providers: + mpi: [cray-mpich] + # + ### Strictly set virtual package providers. + # + mpi: + buildable: False + require: cray-mpich + fftw-api: + require: fftw + blas: + require: openblas + lapack: + require: openblas + jpeg: + require: libjpeg-turbo + # + ### External packages. + # + cray-mpich: + externals: + - spec: cray-mpich@8.1.9~wrappers + modules: + - libfabric + - craype-network-ofi + - cray-mpich/8.1.9 + # + ### Individual package settings. + # Use `require::` to override require's from {common,site}/packages.yaml, + # and `require: - '...'` to add to existing ones. + # + boost: + require:: + - '@1.84 ~atomic +chrono +date_time +exception +filesystem ~graph ~iostreams + ~locale ~log ~math ~mpi ~numpy +pic +program_options +python ~random +regex + +serialization ~signals +system +test +thread +timer ~wave visibility=hidden cxxstd=17' + cdo: + require: + - 'grib2=none' # avoids eccodes/grib-api dependency + - '%intel' + - any_of: ["@2.2.2"] + when: "%intel@2022.0.2.262" + message: "2.3.0 is the last version to use C++17" + - any_of: ["@2.0.5"] + when: "%intel@19.1.3.304" + message: "2.0.5 is the last version to use C++14" + curl: + require: + - ~nghttp2 # avoid nghttp2 dependency + eccodes: + require: + - any_of: ["@2.25.0"] + when: "%intel@19.1.3.304" + message: "2.25.0 is the last version to use C++11 (as opposed to C++17)" + ecmwf-atlas: + 'require:': + - +fckit ~trans ~fftw # disabling trans and fftw to minimize dependencies; older version because newer eckit doesn't build with intel@19 + - any_of: ['@:0.39'] + when: '%intel@19.1.3.304' + ectrans: + require:: + - '@1.2.0 ~mkl +fftw' + esmf: + require: + - snapshot=none # make sure spack-stack doesn't accidentally give us a beta snapshot + - '~python' + fckit: + 'require:': +eckit # older version needed for older eckit & ecmwf-atlas + flex: + require: '@2.6.4' + gcc-runtime: + require: '%gcc' + gdal: + variants: ~curl + gettext: + version: ['0.19.7'] + git-lfs: + require: '%gcc' + glib: + require: + - any_of: ['@:2.74.3'] + when: '%intel@:19' + gsibec: + require:: + - '@1.2.1 ~mkl' + harfbuzz: + require: '%gcc' + libffi: + require: '@3.3' + libunistring: + require: '@:1.0' + mapl: + require: + - ~pflogger ~fargparse ~extdata2g # minimize dependencies + netcdf-c: + 'require:': +mpi ~parallel-netcdf ~dap ~blosc ~szip build_system=autotools # disabling dap prevents network access; disabling blosc and szip reduces dependencies + patchelf: + version: ['0.13.1'] + py-cython:: + require: '@0.29.36' + py-numpy: + require:: + - '^[virtuals=lapack,blas] openblas' + - '@:1.25' + - any_of: ['@:1.24'] + when: '%intel@:19' + py-pandas: + 'require:': ~excel # minimize dependencies + py-scipy: + require: + - any_of: ["@1.10.1"] + when: '%intel@:19' + py-setuptools: + require: '@63.4.3' # avoid duplicate build deps + rhash: + version: ['1.3.5'] + subversion: + require: + - ~serf +pic # avoid serf dependency diff --git a/configs/sites/tier1/wcoss2/templates/modules/modulefile.lua b/configs/sites/tier1/wcoss2/templates/modules/modulefile.lua new file mode 100644 index 000000000..46cdc3677 --- /dev/null +++ b/configs/sites/tier1/wcoss2/templates/modules/modulefile.lua @@ -0,0 +1,101 @@ +-- -*- lua -*- +-- Module file created by spack (https://github.com/spack/spack) on {{ timestamp }} +-- +-- {{ spec.short_spec }} +-- + +{% block header %} +{% if short_description %} +whatis([[Name : {{ spec.name }}]]) +whatis([[Version : {{ spec.version }}]]) +whatis([[Target : {{ spec.target }}]]) +whatis([[Short description : {{ short_description }}]]) +{% endif %} +{% if configure_options %} +whatis([[Configure options : {{ configure_options }}]]) +{% endif %} + +help([[Name : {{ spec.name }}]]) +help([[Version: {{ spec.version }}]]) +help([[Target : {{ spec.target }}]]) +{% if long_description %} +help() +help([[{{ long_description| textwrap(72)| join() }}]]) +{% endif %} +{% endblock %} + +{% block provides %} +{# Prepend the path I unlock as a provider of #} +{# services and set the families of services I provide #} +{% if has_modulepath_modifications %} +-- Services provided by the package +{% for name in provides %} +family("{{ name }}") +{% endfor %} + +-- Loading this module unlocks the path below unconditionally +{% for path in unlocked_paths %} +prepend_path("MODULEPATH", "{{ path }}") +{% endfor %} + +{# Try to see if missing providers have already #} +{# been loaded into the environment #} +{% if has_conditional_modifications %} +-- Try to load variables into path to see if providers are there +{% for name in missing %} +local {{ name }}_name = os.getenv("LMOD_{{ name|upper() }}_NAME") +local {{ name }}_version = os.getenv("LMOD_{{ name|upper() }}_VERSION") +{% endfor %} + +-- Change MODULEPATH based on the result of the tests above +{% for condition, path in conditionally_unlocked_paths %} +if {{ condition }} then + local t = pathJoin({{ path }}) + prepend_path("MODULEPATH", t) +end +{% endfor %} + +-- Set variables to notify the provider of the new services +{% for name in provides %} +setenv("LMOD_{{ name|upper() }}_NAME", "{{ name_part }}") +setenv("LMOD_{{ name|upper() }}_VERSION", "{{ version_part }}") +{% endfor %} +{% endif %} +{% endif %} +{% endblock %} + +{% block autoloads %} +{% for module in autoload %} +prereq("{{ module }}") +{% endfor %} +{% endblock %} +{# #} +{% block conflict %} +{% for name in conflicts %} +conflict("{{ name }}") +{% endfor %} +{% endblock %} + +{% block environment %} +{% for command_name, cmd in environment_modifications %} +{% if command_name == 'PrependPath' %} +prepend_path("{{ cmd.name }}", "{{ cmd.value }}", "{{ cmd.separator }}") +{% elif command_name in ('AppendPath', 'AppendFlagsEnv') %} +append_path("{{ cmd.name }}", "{{ cmd.value }}", "{{ cmd.separator }}") +{% elif command_name in ('RemovePath', 'RemoveFlagsEnv') %} +remove_path("{{ cmd.name }}", "{{ cmd.value }}", "{{ cmd.separator }}") +{% elif command_name == 'SetEnv' %} +setenv("{{ cmd.name }}", "{{ cmd.value }}") +{% elif command_name == 'UnsetEnv' %} +unsetenv("{{ cmd.name }}") +{% endif %} +{% endfor %} +{# Make sure system man pages are enabled by appending trailing delimiter to MANPATH #} +{% if has_manpath_modifications %} +append_path("MANPATH", "", ":") +{% endif %} +{% endblock %} + +{% block footer %} +{# In case the module needs to be extended with custom Lua code #} +{% endblock %} diff --git a/configs/templates/nco/spack.yaml b/configs/templates/nco/spack.yaml index e1263204e..e14f7c125 100644 --- a/configs/templates/nco/spack.yaml +++ b/configs/templates/nco/spack.yaml @@ -5,27 +5,23 @@ spack: config: install_tree: root: $env/install - modules: - default: - roots: - lmod: $env/install/modulefiles - tcl: $env/install/modulefiles + deprecated: true view: false + include: [] specs: - awscli - bacio - - boost + - boost %intel - bufr - - cairo - cdo - cfitsio - cmake - crtm - curl - - ecflow + - ecflow ^boost%gcc - eckit - ecmwf-atlas - eigen @@ -90,51 +86,3 @@ spack: - w3nco - wgrib2 - wrf-io - - packages: - # Strictly set virtual package providers: - mpi: - require: cray-mpich - fftw-api: - require: fftw - blas: - require: openblas - lapack: - require: openblas - jpeg: - require: libjpeg-turbo - # Individual package settings. - # Use `require::` to override require's from {common,site}/packages.yaml, - # and `require: - '...'` to add to existing ones. - cdo: - require: - - 'grib2=none' # avoids eccodes/grib-api dependency - curl: - require: - - '~nghttp2' # avoid nghttp2 dependency - ecmwf-atlas: - require:: '@0.33.0 +fckit ~trans ~fftw' # disabling trans and fftw to minimize dependencies; older version because newer eckit doesn't build with intel@19 - esmf: - require: - - 'snapshot=none' # make sure spack-stack doesn't accidentally give us a beta snapshot - fckit: - require:: '@0.10.1 +eckit' # older version needed for older eckit & ecmwf-atlas - glib: - require: '@:2.74.3' # newer versions don't build with intel@19 - mapl: - require: - - '~pflogger ~fargparse ~extdata2g' # minimize dependencies - netcdf-c: - require:: '@4.9.2 +mpi ~parallel-netcdf ~dap ~blosc ~szip build_system=autotools' # disabling dap prevents network access; disabling blosc and szip reduces dependencies - py-pandas: - require:: '~excel' # minimize dependencies - subversion: - require: - - '~serf +pic' # avoid serf dependency - # Explicitly require gcc when needed so Spack won't do anything weird: - boost: - require: '%gcc' - gcc-runtime: - require: '%gcc' - harfbuzz: - require: '%gcc'