updates to conduit to add hostcfg and use cmake base (#22233)

This commit is contained in:
Cyrus Harrison 2021-03-18 18:44:29 -07:00 committed by GitHub
parent 4f1a76a0d1
commit 4df1f62fd3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -27,7 +27,7 @@ def cmake_cache_entry(name, value, vtype=None):
return 'set({0} "{1}" CACHE {2} "")\n\n'.format(name, value, vtype)
class Conduit(Package):
class Conduit(CMakePackage):
"""Conduit is an open source project from Lawrence Livermore National
Laboratory that provides an intuitive model for describing hierarchical
scientific data in C++, C, Fortran, and Python. It is used for data
@ -90,8 +90,8 @@ class Conduit(Package):
#######################
# CMake
#######################
# cmake 3.8.2 or newer
depends_on("cmake@3.8.2:", type='build')
# cmake 3.14.1 or newer
depends_on("cmake@3.14.1:", type='build')
#######################
# Python
@ -108,7 +108,7 @@ class Conduit(Package):
###############
# HDF5
###############
# TODO: cxx variant is disabled due to build issue Cyrus
# Note: cxx variant is disabled due to build issue Cyrus
# experienced on BGQ. When on, the static build tries
# to link against shared libs.
#
@ -137,7 +137,10 @@ class Conduit(Package):
#######################
# ZFP
#######################
depends_on("zfp", when="+zfp")
depends_on("zfp bsws=8", when="+zfp")
# hdf5 zfp plugin when both hdf5 and zfp are on
depends_on("h5z-zfp~fortran", when="+hdf5+zfp")
#######################
# MPI
@ -155,8 +158,10 @@ class Conduit(Package):
# Cmake will support fj compiler and this patch will be removed
patch('fj_flags.patch', when='%fj')
###################################
# build phases used by this package
phases = ["configure", "build", "install"]
###################################
phases = ['hostconfig', 'cmake', 'build', 'install']
def flag_handler(self, name, flags):
if name in ('cflags', 'cxxflags', 'fflags'):
@ -184,42 +189,16 @@ def url_for_version(self, version):
return "https://github.com/LLNL/conduit/releases/download/v{0}/conduit-v{1}-src-with-blt.tar.gz".format(v, v)
return url
def configure(self, spec, prefix):
"""
Configure Conduit.
"""
with working_dir('spack-build', create=True):
py_site_pkgs_dir = None
if "+python" in spec:
py_site_pkgs_dir = site_packages_dir
####################################################################
# Note: cmake, build, and install stages are handled by CMakePackage
####################################################################
host_cfg_fname = self.create_host_config(spec,
prefix,
py_site_pkgs_dir)
# save this filename for
# other package recipe steps to access
self.host_cfg_fname = host_cfg_fname
cmake_args = []
# if we have a static build, we need to avoid any of
# spack's default cmake settings related to rpaths
# (see: https://github.com/spack/spack/issues/2658)
if "+shared" in spec:
cmake_args.extend(std_cmake_args)
else:
for arg in std_cmake_args:
if arg.count("RPATH") == 0:
cmake_args.append(arg)
cmake_args.extend(["-C", host_cfg_fname, "../src"])
print("Configuring Conduit...")
cmake(*cmake_args)
def build(self, spec, prefix):
"""
Build Conduit.
"""
with working_dir('spack-build'):
print("Building Conduit...")
make()
# provide cmake args (pass host config as cmake cache file)
def cmake_args(self):
host_config = self._get_host_config_path(self.spec)
options = []
options.extend(['-C', host_config, "../spack-src/src/"])
return options
@run_after('build')
@on_package_attributes(run_tests=True)
@ -228,16 +207,6 @@ def build_test(self):
print("Running Conduit Unit Tests...")
make("test")
def install(self, spec, prefix):
"""
Install Conduit.
"""
with working_dir('spack-build'):
make("install")
# install copy of host config for provenance
print("Installing Conduit CMake Host Config File...")
install(self.host_cfg_fname, prefix)
@run_after('install')
@on_package_attributes(run_tests=True)
def check_install(self):
@ -275,24 +244,30 @@ def check_install(self):
example = Executable('./conduit_example')
example()
def create_host_config(self, spec, prefix, py_site_pkgs_dir=None):
def _get_host_config_path(self, spec):
sys_type = spec.architecture
# 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())
dest_dir = spec.prefix
host_config_path = os.path.abspath(join_path(dest_dir,
host_config_path))
return host_config_path
def hostconfig(self, spec, prefix):
"""
This method creates a 'host-config' file that specifies
all of the options used to configure and build conduit.
For more details about 'host-config' files see:
http://software.llnl.gov/conduit/building.html
Note:
The `py_site_pkgs_dir` arg exists to allow a package that
subclasses this package provide a specific site packages
dir when calling this function. `py_site_pkgs_dir` should
be an absolute path or `None`.
This is necessary because the spack `site_packages_dir`
var will not exist in the base class. For more details
on this issue see: https://github.com/spack/spack/issues/6261
"""
if not os.path.isdir(spec.prefix):
os.mkdir(spec.prefix)
#######################
# Compiler Info
@ -308,8 +283,7 @@ def create_host_config(self, spec, prefix, py_site_pkgs_dir=None):
f_compiler = env["SPACK_FC"]
#######################################################################
# By directly fetching the names of the actual compilers we appear
# to doing something evil here, but this is necessary to create a
# Directly fetch the names of the actual compilers to create a
# 'host config' file that works outside of the spack install env.
#######################################################################
@ -326,9 +300,9 @@ def create_host_config(self, spec, prefix, py_site_pkgs_dir=None):
##############################################
cmake_exe = spec['cmake'].command.path
host_cfg_fname = "%s-%s-%s-conduit.cmake" % (socket.gethostname(),
sys_type,
spec.compiler)
# get hostconfig name
host_cfg_fname = self._get_host_config_path(spec)
cfg = open(host_cfg_fname, "w")
cfg.write("##################################\n")
@ -448,10 +422,6 @@ def create_host_config(self, spec, prefix, py_site_pkgs_dir=None):
cfg.write("# python from spack \n")
cfg.write(cmake_cache_entry("PYTHON_EXECUTABLE",
spec['python'].command.path))
# only set dest python site packages dir if passed
if py_site_pkgs_dir:
cfg.write(cmake_cache_entry("PYTHON_MODULE_INSTALL_PREFIX",
py_site_pkgs_dir))
else:
cfg.write(cmake_cache_entry("ENABLE_PYTHON", "OFF"))
@ -535,6 +505,17 @@ def create_host_config(self, spec, prefix, py_site_pkgs_dir=None):
else:
cfg.write("# hdf5 not built by spack \n")
#######################
# h5z-zfp
#######################
cfg.write("# h5z-zfp from spack \n")
if "+hdf5+zfp" in spec:
cfg.write(cmake_cache_entry("H5ZZFP_DIR", spec['h5z-zfp'].prefix))
else:
cfg.write("# h5z-zfp not built by spack \n")
#######################
# Silo
#######################
@ -564,4 +545,3 @@ def create_host_config(self, spec, prefix, py_site_pkgs_dir=None):
host_cfg_fname = os.path.abspath(host_cfg_fname)
tty.info("spack generated conduit host-config file: " + host_cfg_fname)
return host_cfg_fname