Add ESMF v8.4.1, and number of other changes to improve ESMF integration with Spack (#35980)
* Add v8.4.1, and a few other changes.
    Minor adjustments for better alignment between Spack and ESMF native
    build. For ESMF >= 8.3.1 now Spack defaults to using
    external-parallelio. Before use internal version, which was PIO-1 all
    the way up to v8.3.0b10 anyway! Xerces is disabled by default.
* Deal with two long lines flagged by prechecks/style.
* Try to satisfy prechecks/style.
* Try to satisfy flake8 rules wrt indentation of continuation lines.
* Now trying to satisfy "black reformatting".
* For "black" formatting really put that ugly comma at the end before
closing parentheses. Interesting.
* Support building against external-parallelio even w/o mpi, but select the
   external-parallelio dependency accordingly.
* Correct C compiler setting.
* Handle `pnetcdf` variant consistent with how `ParallelIO` does it. And
  also pass the `pnetcdf` variant down to the `external-parallelio`
  dependency if set.
* Long line formatting again.
* Simplify handling of tarball URL construction and update sha256
  checksums.
* Align version check with recommended self.spec.satisfies().
* Deprecate v8.4.0 which has a bug that can cause memory corruption, fixed
  in v8.4.1.
* Use double quotes vs single quotes as per style-check... although
  https://spack-tutorial.readthedocs.io/en/latest/tutorial_packaging.html#querying-spec-versions
  clearly shows it with single quotes.
			
			
This commit is contained in:
		| @@ -15,60 +15,71 @@ class Esmf(MakefilePackage): | |||||||
|     software infrastructure for building and coupling weather, climate, and |     software infrastructure for building and coupling weather, climate, and | ||||||
|     related Earth science applications. The ESMF defines an architecture for |     related Earth science applications. The ESMF defines an architecture for | ||||||
|     composing complex, coupled modeling systems and includes data structures |     composing complex, coupled modeling systems and includes data structures | ||||||
|     and utilities for developing individual models.""" |     and utilities for developing individual models. | ||||||
|  |     The National Unified Operational Prediction Capability (NUOPC) Layer | ||||||
|  |     defines a common model architecture to support interoperable ESMF components. | ||||||
|  |     The NUOPC Layer is included with the ESMF package.""" | ||||||
| 
 | 
 | ||||||
|     homepage = "https://www.earthsystemcog.org/projects/esmf/" |     homepage = "https://earthsystemmodeling.org/" | ||||||
|     url = "https://github.com/esmf-org/esmf/archive/ESMF_8_0_1.tar.gz" |     url = "https://github.com/esmf-org/esmf/archive/v8.4.1.tar.gz" | ||||||
|     git = "https://github.com/esmf-org/esmf.git" |     git = "https://github.com/esmf-org/esmf.git" | ||||||
| 
 | 
 | ||||||
|     maintainers("climbfuji", "jedwards4b", "AlexanderRichert-NOAA") |     maintainers("climbfuji", "jedwards4b", "AlexanderRichert-NOAA", "theurich", "uturuncoglu") | ||||||
| 
 | 
 | ||||||
|     # Develop is a special name for spack and is always considered the newest version |     # Develop is a special name for spack and is always considered the newest version | ||||||
|     version("develop", branch="develop") |     version("develop", branch="develop") | ||||||
|     # generate chksum with spack checksum esmf@x.y.z |     # generate chksum with spack checksum esmf@x.y.z | ||||||
|     version("8.4.1", sha256="1b54cee91aacaa9df400bd284614cbb0257e175f6f3ec9977a2d991ed8aa1af6") |     version("8.4.1", sha256="1b54cee91aacaa9df400bd284614cbb0257e175f6f3ec9977a2d991ed8aa1af6") | ||||||
|     version("8.4.0", sha256="28531810bf1ae78646cda6494a53d455d194400f19dccd13d6361871de42ed0f") |     version( | ||||||
|  |         "8.4.0", | ||||||
|  |         sha256="28531810bf1ae78646cda6494a53d455d194400f19dccd13d6361871de42ed0f", | ||||||
|  |         deprecated=True, | ||||||
|  |     ) | ||||||
|     version("8.3.1", sha256="6c39261e55dcdf9781cdfa344417b9606f7f961889d5ec626150f992f04f146d") |     version("8.3.1", sha256="6c39261e55dcdf9781cdfa344417b9606f7f961889d5ec626150f992f04f146d") | ||||||
|     version("8.3.0", sha256="0ff43ede83d1ac6beabd3d5e2a646f7574174b28a48d1b9f2c318a054ba268fd") |     version( | ||||||
|     version("8.3.0b09", commit="5b7e546c4b") |         "8.3.0", | ||||||
|     version("8.2.0", sha256="3693987aba2c8ae8af67a0e222bea4099a48afe09b8d3d334106f9d7fc311485") |         sha256="0ff43ede83d1ac6beabd3d5e2a646f7574174b28a48d1b9f2c318a054ba268fd", | ||||||
|     version("8.1.1", sha256="58c2e739356f21a1b32673aa17a713d3c4af9d45d572f4ba9168c357d586dc75") |         deprecated=True, | ||||||
|     version("8.0.1", sha256="9172fb73f3fe95c8188d889ee72fdadb4f978b1d969e1d8e401e8d106def1d84") |     ) | ||||||
|     version("8.0.0", sha256="051dca45f9803d7e415c0ea146df15ce487fb55f0fce18ca61d96d4dba0c8774") |     version("8.3.0b09", commit="5b7e546c4b", deprecated=True) | ||||||
|     version("7.1.0r", sha256="ae9a5edb8d40ae97a35cbd4bd00b77061f995c77c43d36334dbb95c18b00a889") |     version("8.2.0", sha256="27866c31fdb63c58e78211de970470ca02d274f5d4d6d97e94284d63b1c1d9e4") | ||||||
|  |     version("8.1.1", sha256="629690c7a488e84ac7252470349458d7aaa98b54c260f8b3911a2e2f3e713dd0") | ||||||
|  |     version( | ||||||
|  |         "8.1.0", | ||||||
|  |         sha256="226219ec61cace89f4678eece93188155d7cbb50a13ec4c9c93174ef3d58d7c0", | ||||||
|  |         deprecated=True, | ||||||
|  |     ) | ||||||
|  |     version("8.0.1", sha256="13ce2ca0ae622548c00f7bb18317fb100235ca8b7ddbfac7e201a339e8eb05a3") | ||||||
|  |     version( | ||||||
|  |         "8.0.0", | ||||||
|  |         sha256="4b7904fdc935710071c4aafb9370834d40c2ee06365a8b5845317be8f71bf51f", | ||||||
|  |         deprecated=True, | ||||||
|  |     ) | ||||||
|  |     version( | ||||||
|  |         "7.1.0r", | ||||||
|  |         sha256="e08f21544083dcbe162b472852e321f8df14f4f711f35508403d32df438367a7", | ||||||
|  |         deprecated=True, | ||||||
|  |     ) | ||||||
| 
 | 
 | ||||||
|     variant("mpi", default=True, description="Build with MPI support") |     variant("mpi", default=True, description="Build with MPI support") | ||||||
|     variant("external-lapack", default=False, description="Build with external LAPACK support") |     variant("external-lapack", default=False, description="Build with external LAPACK library") | ||||||
|     variant("netcdf", default=True, description="Build with NetCDF support") |     variant("netcdf", default=True, description="Build with NetCDF support") | ||||||
|     variant("pnetcdf", default=True, description="Build with pNetCDF support", when="+mpi") |     variant("pnetcdf", default=False, description="Build with pNetCDF support") | ||||||
|     variant("xerces", default=True, description="Build with Xerces support") |     variant("xerces", default=False, description="Build with Xerces support") | ||||||
|     variant( |     variant( | ||||||
|         "parallelio", |         "external-parallelio", | ||||||
|         default=True, |         default=True, | ||||||
|         description="Build with external parallelio library", |         description="Build with external parallelio library", | ||||||
|         when="@8.3:", |         when="@8.3.1:", | ||||||
|     ) |     ) | ||||||
|     variant( |     variant("debug", default=False, description="Build with debugging symbols and options enabled") | ||||||
|         "parallelio", |  | ||||||
|         default=False, |  | ||||||
|         description="Build with external parallelio library", |  | ||||||
|         when="@8.3.b09", |  | ||||||
|     ) |  | ||||||
|     variant("pio", default=True, description="Enable Internal ParallelIO support", when="@:8.2.99") |  | ||||||
|     variant( |  | ||||||
|         "pio", default=True, description="Enable Internal ParallelIO support", when="@8.3.0b09" |  | ||||||
|     ) |  | ||||||
|     variant("debug", default=False, description="Make a debuggable version of the library") |  | ||||||
|     variant("shared", default=True, description="Build shared library") |     variant("shared", default=True, description="Build shared library") | ||||||
|     # 'esmf_comm' and 'esmf_os' variants allow override values for their corresponding |     # 'esmf_os', 'esmf_comm', 'esmf_pio' variants allow override values for their corresponding | ||||||
|     # build environment variables. Documentation, including valid values, can be found at |     # build environment variables. Documentation, including valid values, can be found at | ||||||
|     # https://earthsystemmodeling.org/docs/release/latest/ESMF_usrdoc/node10.html#SECTION000105000000000000000 |     # https://earthsystemmodeling.org/docs/release/latest/ESMF_usrdoc/node10.html#SECTION000105000000000000000 | ||||||
|     variant("esmf_comm", default="auto", description="Override for ESMF_COMM variable") |  | ||||||
|     variant("esmf_os", default="auto", description="Override for ESMF_OS variable") |     variant("esmf_os", default="auto", description="Override for ESMF_OS variable") | ||||||
| 
 |     variant("esmf_comm", default="auto", description="Override for ESMF_COMM variable") | ||||||
|     # Required dependencies |     variant("esmf_pio", default="auto", description="Override for ESMF_PIO variable") | ||||||
|     depends_on("zlib") |  | ||||||
|     depends_on("libxml2") |  | ||||||
| 
 | 
 | ||||||
|     # Optional dependencies |     # Optional dependencies | ||||||
|     depends_on("mpi", when="+mpi") |     depends_on("mpi", when="+mpi") | ||||||
| @@ -77,7 +88,34 @@ class Esmf(MakefilePackage): | |||||||
|     depends_on("netcdf-fortran@3.6:", when="+netcdf") |     depends_on("netcdf-fortran@3.6:", when="+netcdf") | ||||||
|     depends_on("parallel-netcdf@1.2.0:", when="+pnetcdf") |     depends_on("parallel-netcdf@1.2.0:", when="+pnetcdf") | ||||||
|     depends_on("xerces-c@3.1.0:", when="+xerces") |     depends_on("xerces-c@3.1.0:", when="+xerces") | ||||||
|     depends_on("parallelio@2.5.8:", when="+parallelio") |     depends_on( | ||||||
|  |         "parallelio@2.5.7: +mpi+pnetcdf", when="@8.3.0:8.3.99+external-parallelio+mpi+pnetcdf" | ||||||
|  |     ) | ||||||
|  |     depends_on( | ||||||
|  |         "parallelio@2.5.7: +mpi~pnetcdf", when="@8.3.0:8.3.99+external-parallelio+mpi~pnetcdf" | ||||||
|  |     ) | ||||||
|  |     depends_on( | ||||||
|  |         "parallelio@2.5.7: ~mpi+pnetcdf", when="@8.3.0:8.3.99+external-parallelio~mpi+pnetcdf" | ||||||
|  |     ) | ||||||
|  |     depends_on( | ||||||
|  |         "parallelio@2.5.7: ~mpi~pnetcdf", when="@8.3.0:8.3.99+external-parallelio~mpi~pnetcdf" | ||||||
|  |     ) | ||||||
|  |     depends_on( | ||||||
|  |         "parallelio@2.5.9: +mpi+pnetcdf", when="@8.4.0:8.4.99+external-parallelio+mpi+pnetcdf" | ||||||
|  |     ) | ||||||
|  |     depends_on( | ||||||
|  |         "parallelio@2.5.9: +mpi~pnetcdf", when="@8.4.0:8.4.99+external-parallelio+mpi~pnetcdf" | ||||||
|  |     ) | ||||||
|  |     depends_on( | ||||||
|  |         "parallelio@2.5.9: ~mpi+pnetcdf", when="@8.4.0:8.4.99+external-parallelio~mpi+pnetcdf" | ||||||
|  |     ) | ||||||
|  |     depends_on( | ||||||
|  |         "parallelio@2.5.9: ~mpi~pnetcdf", when="@8.4.0:8.4.99+external-parallelio~mpi~pnetcdf" | ||||||
|  |     ) | ||||||
|  |     depends_on("parallelio@2.5.10: +mpi+pnetcdf", when="@8.5.0:+external-parallelio+mpi+pnetcdf") | ||||||
|  |     depends_on("parallelio@2.5.10: +mpi~pnetcdf", when="@8.5.0:+external-parallelio+mpi~pnetcdf") | ||||||
|  |     depends_on("parallelio@2.5.10: ~mpi+pnetcdf", when="@8.5.0:+external-parallelio~mpi+pnetcdf") | ||||||
|  |     depends_on("parallelio@2.5.10: ~mpi~pnetcdf", when="@8.5.0:+external-parallelio~mpi~pnetcdf") | ||||||
| 
 | 
 | ||||||
|     # Testing dependencies |     # Testing dependencies | ||||||
|     depends_on("perl", type="test") |     depends_on("perl", type="test") | ||||||
| @@ -117,15 +155,12 @@ def chmod_scripts(self): | |||||||
| 
 | 
 | ||||||
|     def url_for_version(self, version): |     def url_for_version(self, version): | ||||||
|         if version < Version("8.0.0"): |         if version < Version("8.0.0"): | ||||||
|             return "http://www.earthsystemmodeling.org/esmf_releases/public/ESMF_{0}/esmf_{0}_src.tar.gz".format( |             # Older ESMF releases had a custom tag format ESMF_x_y_z | ||||||
|                 version.underscored |  | ||||||
|             ) |  | ||||||
|         elif version < Version("8.2.1"): |  | ||||||
|             return "https://github.com/esmf-org/esmf/archive/ESMF_{0}.tar.gz".format( |             return "https://github.com/esmf-org/esmf/archive/ESMF_{0}.tar.gz".format( | ||||||
|                 version.underscored |                 version.underscored | ||||||
|             ) |             ) | ||||||
|         else: |         else: | ||||||
|             # Starting with ESMF 8.2.1 releases are now in the form vx.y.z |             # Starting with ESMF 8.0.0 releases are in the form vx.y.z | ||||||
|             return "https://github.com/esmf-org/esmf/archive/refs/tags/v{0}.tar.gz".format( |             return "https://github.com/esmf-org/esmf/archive/refs/tags/v{0}.tar.gz".format( | ||||||
|                 version.dotted |                 version.dotted | ||||||
|             ) |             ) | ||||||
| @@ -207,9 +242,11 @@ def setup_build_environment(self, env): | |||||||
| 
 | 
 | ||||||
|         if "+mpi" in spec: |         if "+mpi" in spec: | ||||||
|             env.set("ESMF_CXX", spec["mpi"].mpicxx) |             env.set("ESMF_CXX", spec["mpi"].mpicxx) | ||||||
|  |             env.set("ESMF_C", spec["mpi"].mpicc) | ||||||
|             env.set("ESMF_F90", spec["mpi"].mpifc) |             env.set("ESMF_F90", spec["mpi"].mpifc) | ||||||
|         else: |         else: | ||||||
|             env.set("ESMF_CXX", spack_cxx) |             env.set("ESMF_CXX", spack_cxx) | ||||||
|  |             env.set("ESMF_C", spack_cc) | ||||||
|             env.set("ESMF_F90", spack_fc) |             env.set("ESMF_F90", spack_fc) | ||||||
| 
 | 
 | ||||||
|         # This environment variable controls the build option. |         # This environment variable controls the build option. | ||||||
| @@ -220,7 +257,11 @@ def setup_build_environment(self, env): | |||||||
|             # Build an optimized version of the library. |             # Build an optimized version of the library. | ||||||
|             env.set("ESMF_BOPT", "O") |             env.set("ESMF_BOPT", "O") | ||||||
| 
 | 
 | ||||||
|         if self.compiler.name in ["gcc", "clang", "apple-clang"] and gfortran_major_version >= 10: |         if ( | ||||||
|  |             self.compiler.name in ["gcc", "clang", "apple-clang"] | ||||||
|  |             and gfortran_major_version >= 10 | ||||||
|  |             and self.spec.satisfies("@:8.2.99") | ||||||
|  |         ): | ||||||
|             env.set("ESMF_F90COMPILEOPTS", "-fallow-argument-mismatch") |             env.set("ESMF_F90COMPILEOPTS", "-fallow-argument-mismatch") | ||||||
| 
 | 
 | ||||||
|         ####### |         ####### | ||||||
| @@ -249,12 +290,10 @@ def setup_build_environment(self, env): | |||||||
|             elif "^mvapich2" in spec: |             elif "^mvapich2" in spec: | ||||||
|                 env.set("ESMF_COMM", "mvapich2") |                 env.set("ESMF_COMM", "mvapich2") | ||||||
|             elif "^mpich" in spec: |             elif "^mpich" in spec: | ||||||
|                 # esmf@7.0.1 does not include configs for mpich3, |                 if self.spec.satisfies("@:8.2.99"): | ||||||
|                 # so we start with the configs for mpich2: |                     env.set("ESMF_COMM", "mpich3") | ||||||
|                 env.set("ESMF_COMM", "mpich2") |                 else: | ||||||
|                 # The mpich 3 series split apart the Fortran and C bindings, |                     env.set("ESMF_COMM", "mpich") | ||||||
|                 # so we link the Fortran libraries when building C programs: |  | ||||||
|                 env.set("ESMF_CXXLINKLIBS", "-lmpifort") |  | ||||||
|             elif "^openmpi" in spec or "^hpcx-mpi" in spec: |             elif "^openmpi" in spec or "^hpcx-mpi" in spec: | ||||||
|                 env.set("ESMF_COMM", "openmpi") |                 env.set("ESMF_COMM", "openmpi") | ||||||
|             elif ( |             elif ( | ||||||
| @@ -320,20 +359,15 @@ def setup_build_environment(self, env): | |||||||
|         ############## |         ############## | ||||||
|         # ParallelIO # |         # ParallelIO # | ||||||
|         ############## |         ############## | ||||||
|         if "+parallelio" in spec: |         if "+external-parallelio" in spec: | ||||||
|             env.set("ESMF_PIO", "external") |             env.set("ESMF_PIO", "external") | ||||||
|             env.set("ESMF_PIO_LIBPATH", spec["parallelio"].prefix.lib) |             env.set("ESMF_PIO_LIBPATH", spec["parallelio"].prefix.lib) | ||||||
|             env.set("ESMF_PIO_INCLUDE", spec["parallelio"].prefix.include) |             env.set("ESMF_PIO_INCLUDE", spec["parallelio"].prefix.include) | ||||||
|         elif "+pio" in spec and "+mpi" in spec: | 
 | ||||||
|             # ESMF provides the ability to read and write data in both binary |         # Allow override of ESMF_PIO: | ||||||
|             # and NetCDF formats through ParallelIO (PIO), a third-party IO |         pio_variant = spec.variants["esmf_pio"].value | ||||||
|             # software library that is integrated in the ESMF library. |         if pio_variant != "auto": | ||||||
|             # PIO-dependent features will be enabled and will use the |             env.set("ESMF_PIO", pio_variant) | ||||||
|             # PIO library that is included and built with ESMF. |  | ||||||
|             env.set("ESMF_PIO", "internal") |  | ||||||
|         else: |  | ||||||
|             # Disables PIO-dependent code. |  | ||||||
|             env.set("ESMF_PIO", "OFF") |  | ||||||
| 
 | 
 | ||||||
|         ########## |         ########## | ||||||
|         # XERCES # |         # XERCES # | ||||||
| @@ -350,6 +384,10 @@ def setup_build_environment(self, env): | |||||||
|             # ESMF_XERCES_INCLUDE |             # ESMF_XERCES_INCLUDE | ||||||
|             # ESMF_XERCES_LIBPATH |             # ESMF_XERCES_LIBPATH | ||||||
| 
 | 
 | ||||||
|  |         ######################### | ||||||
|  |         # General build options # | ||||||
|  |         ######################### | ||||||
|  | 
 | ||||||
|         # Static-only option: |         # Static-only option: | ||||||
|         if "~shared" in spec: |         if "~shared" in spec: | ||||||
|             env.set("ESMF_SHARED_LIB_BUILD", "OFF") |             env.set("ESMF_SHARED_LIB_BUILD", "OFF") | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Gerhard Theurich
					Gerhard Theurich