diff options
Diffstat (limited to 'var')
-rw-r--r-- | var/spack/repos/builtin/packages/hdf-eos5/package.py | 22 | ||||
-rw-r--r-- | var/spack/repos/builtin/packages/ncl/package.py | 77 |
2 files changed, 80 insertions, 19 deletions
diff --git a/var/spack/repos/builtin/packages/hdf-eos5/package.py b/var/spack/repos/builtin/packages/hdf-eos5/package.py index fd0d6147ef..d459ccb0f2 100644 --- a/var/spack/repos/builtin/packages/hdf-eos5/package.py +++ b/var/spack/repos/builtin/packages/hdf-eos5/package.py @@ -4,6 +4,7 @@ # SPDX-License-Identifier: (Apache-2.0 OR MIT) import sys +from os import chmod from spack.package import * @@ -77,15 +78,24 @@ class HdfEos5(AutotoolsPackage): "version/checksum not found in version_list".format(version) ) + @run_before("configure") + def fix_configure(self): + # spack patches the configure file unless autoconf is run, + # and this fails because configure has the wrong permissions (644) + if not self.force_autoreconf: + chmod(join_path(self.stage.source_path, "configure"), 0o755) + + # The configure script as written really wants you to use h5cc. This causes + # problems because h5cc differs when HDF5 is built with autotools vs cmake, + # and we lose all nice flags from the Spack wrappers. These filter operations + # allow use to use the Spack wrappers again. + with keep_modification_time("configure"): + filter_file(r"$CC -show &> /dev/null", "true", "configure", string=True) + filter_file(r"CC=./$SZIP_CC", "", "configure", string=True) + def configure_args(self): extra_args = [] - # Package really wants h5cc to be used - if self.spec["mpi"]: - extra_args.append("CC={0}/bin/h5pcc -Df2cFortran".format(self.spec["hdf5"].prefix)) - else: - extra_args.append("CC={0}/bin/h5cc -Df2cFortran".format(self.spec["hdf5"].prefix)) - # We always build PIC code extra_args.append("--with-pic") # We always enable installation of include directories diff --git a/var/spack/repos/builtin/packages/ncl/package.py b/var/spack/repos/builtin/packages/ncl/package.py index 143cd32359..b41ddaef1c 100644 --- a/var/spack/repos/builtin/packages/ncl/package.py +++ b/var/spack/repos/builtin/packages/ncl/package.py @@ -58,11 +58,17 @@ class Ncl(Package): # http://www.ncl.ucar.edu/Download/build_from_src.shtml variant("hdf4", default=False, description="Enable HDF4 support.") + variant("hdf-eos2", default=False, when="+hdf4", description="Enable HDF-EOS2 support.") + variant("hdf-eos5", default=False, description="Enable HDF-EOS5 support.") variant("gdal", default=False, description="Enable GDAL support.") variant("triangle", default=True, description="Enable Triangle support.") variant("udunits2", default=True, description="Enable UDUNITS-2 support.") variant("openmp", default=True, description="Enable OpenMP support.") variant("grib", default=True, description="Enable GRIB support.") + variant("eemd", default=False, description="Enable EEMD support.") + + # The following variant is typically set for little-endian targets + variant("byteswapped", default=True, description="Use byteswapped mode for binary data.") # Non-optional dependencies according to the manual: depends_on("jpeg") @@ -107,9 +113,12 @@ class Ncl(Package): # Some of the optional dependencies according to the manual: depends_on("hdf", when="+hdf4") + depends_on("hdf-eos2", when="+hdf-eos2") + depends_on("hdf-eos5", when="+hdf-eos5") depends_on("gdal@:2.4", when="+gdal") depends_on("udunits", when="+udunits2") - depends_on("jasper@2.0.32", when="+grib") + depends_on("jasper@:2", when="+grib") + depends_on("gsl", when="+eemd") # We need src files of triangle to appear in ncl's src tree if we want # triangle's features. @@ -154,14 +163,45 @@ class Ncl(Package): if "ncl" not in exes: raise RuntimeError("Installation failed (ncl executable was not created)") + # NCL provides compiler wrappers, but they make assumptions that Spack build + # will not conform to. This section edits the wrappers to fix them. + c_wrappers = ["ncargcc", "nhlcc"] + f77_wrappers = ["ncargf77", "nhlf77"] + f90_wrappers = ["ncargf90", "nhlf90"] + lib_paths = [] + + for dep in spec.dependencies(deptype="link"): + lib_paths.append(spec[dep.name].prefix.lib) + + with working_dir(spec.prefix.bin): + # Change NCARG compiler wrappers to use real compiler, not Spack wrappers + for wrapper in c_wrappers: + filter_file(spack_cc, self.compiler.cc, wrapper) + for wrapper in f77_wrappers: + filter_file(spack_f77, self.compiler.f77, wrapper) + for wrapper in f90_wrappers: + filter_file(spack_fc, self.compiler.fc, wrapper) + + # Make library reference and corrections to wrappers + for wrapper in c_wrappers + f77_wrappers + f90_wrappers: + filter_file( + "^(set syslibdir[ ]*=).*", + r'\1 "{}"'.format(" ".join(["-L{}".format(p) for p in lib_paths])), + wrapper, + ) + filter_file("^(set cairolib[ ]*=).*", r'\1 "-lcairo -lfreetype"', wrapper) + def setup_run_environment(self, env): env.set("NCARG_ROOT", self.spec.prefix) - env.set("ESMFBINDIR", self.spec["esmf"].prefix.bin) + + # We cannot rely on Spack knowledge of esmf when NCL is an external + if not self.spec.external: + env.set("ESMFBINDIR", self.spec["esmf"].prefix.bin) def prepare_site_config(self): - fc_flags = [] - cc_flags = [] - c2f_flags = [] + fc_flags = [self.compiler.fc_pic_flag] + cc_flags = [self.compiler.cc_pic_flag] + c2f_flags = [self.compiler.cc_pic_flag] if "+openmp" in self.spec: fc_flags.append(self.compiler.openmp_flag) @@ -196,6 +236,9 @@ class Ncl(Package): f.writelines( [ "#define HdfDefines\n", + "#define StdDefines -DByteSwapped\n#define ByteSwapped\n" + if self.spec.satisfies("+byteswapped") + else "", "#define CppCommand '/usr/bin/env cpp -traditional'\n", "#define CCompiler {0}\n".format(spack_cc), "#define FCompiler {0}\n".format(spack_fc), @@ -280,17 +323,17 @@ class Ncl(Package): # Build GDAL support (optional) into NCL? "y\n" if "+gdal" in self.spec else "n\n", # Build EEMD support (optional) into NCL? - "n\n", + "y\n" if "+eemd" in self.spec else "n\n", # Build Udunits-2 support (optional) into NCL? "y\n" if "+udunits2" in self.spec else "n\n", # Build Vis5d+ support (optional) into NCL? "n\n", # Build HDF-EOS2 support (optional) into NCL? - "n\n", + "y\n" if "+hdf-eos2" in self.spec else "n\n", # Build HDF5 support (optional) into NCL? "y\n", # Build HDF-EOS5 support (optional) into NCL? - "n\n", + "y\n" if "+hdf-eos5" in self.spec else "n\n", # Build GRIB2 support (optional) into NCL? "y\n" if self.spec.satisfies("+grib") else "n\n", # Enter local library search path(s) : @@ -300,7 +343,7 @@ class Ncl(Package): + " " + self.spec["bzip2"].prefix.lib + ( - (" " + self.spec["jasper"].prefix.lib64) + (" " + self.spec["jasper"].libs.directories[0]) if self.spec.satisfies("+grib") else "" ) @@ -326,11 +369,16 @@ class Ncl(Package): if self.spec.satisfies("^hdf+external-xdr") and not self.spec["hdf"].satisfies("^libc"): hdf4 = self.spec["hdf"] + replace_str = hdf4["rpc"].libs.link_flags + + if self.spec.satisfies("^hdf+szip"): + search_str = "#define HDFlib.*" + else: + search_str = "#define IncSearch.*" + replace_str = "\n#define HDFlib {} {}".format(hdf4.libs.link_flags, replace_str) filter_file( - "(#define HDFlib.*)", - r"\1 {}".format(hdf4["rpc"].libs.link_flags), - "config/Site.local", + "({})".format(search_str), r"\1 " + "{}".format(replace_str), "config/Site.local" ) def prepare_src_tree(self): @@ -351,7 +399,10 @@ class Ncl(Package): @when("+grib") def patch(self): - filter_file("image.inmem_=1;", "", "external/g2clib-1.6.0/enc_jpeg2000.c") + # Newer versions of libjasper do not provide the inmem property + if self.spec.satisfies("^jasper@2"): + filter_file("image.inmem_=1;", "", "external/g2clib-1.6.0/enc_jpeg2000.c") + filter_file("SUBDIRS = ", "SUBDIRS = g2clib-1.6.0 ", "external/yMakefile") filter_file( "INC=.*", |