axom conduit mfem build fixes (#17121)

* honor global compiler flags

* Honor debug variant when using global compiler flags

* Add cppflags to c/cxx flags, clarify flag handling
This commit is contained in:
Chris White 2020-06-17 10:43:47 -07:00 committed by GitHub
parent 03880f5413
commit 506f31b7a7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 91 additions and 18 deletions

View file

@ -65,10 +65,10 @@ class Axom(CMakePackage, CudaPackage):
# ----------------------------------------------------------------------- # -----------------------------------------------------------------------
# Variants # Variants
# ----------------------------------------------------------------------- # -----------------------------------------------------------------------
variant('debug', default=False, variant('debug', default=False,
description='Build debug instead of optimized version') description='Build debug instead of optimized version')
variant('fortran', default=True, description="Build with Fortran support") variant('fortran', default=True, description="Build with Fortran support")
variant("python", default=False, description="Build python support") variant("python", default=False, description="Build python support")
@ -77,16 +77,16 @@ class Axom(CMakePackage, CudaPackage):
variant("mfem", default=False, description="Build with mfem") variant("mfem", default=False, description="Build with mfem")
variant("hdf5", default=True, description="Build with hdf5") variant("hdf5", default=True, description="Build with hdf5")
variant("lua", default=False, description="Build with Lua") variant("lua", default=True, description="Build with Lua")
variant("scr", default=False, description="Build with SCR") variant("scr", default=False, description="Build with SCR")
variant("umpire", default=True, description="Build with umpire") variant("umpire", default=True, description="Build with umpire")
variant("raja", default=True, description="Build with raja") variant("raja", default=True, description="Build with raja")
variant("cub", default=True, variant("cub", default=True,
description="Build with RAJA's internal CUB support") description="Build with RAJA's internal CUB support")
varmsg = "Build development tools (such as Sphinx, Uncrustify, etc...)" varmsg = "Build development tools (such as Sphinx, Uncrustify, etc...)"
variant("devtools", default=False, description=varmsg) variant("devtools", default=False, description=varmsg)
# ----------------------------------------------------------------------- # -----------------------------------------------------------------------
# Dependencies # Dependencies
@ -124,7 +124,7 @@ class Axom(CMakePackage, CudaPackage):
depends_on('umpire cuda_arch={0}'.format(sm_), depends_on('umpire cuda_arch={0}'.format(sm_),
when='+umpire cuda_arch={0}'.format(sm_)) when='+umpire cuda_arch={0}'.format(sm_))
depends_on("mfem~mpi~hypre~metis~gzstream", when="+mfem") depends_on("mfem~mpi~hypre~metis~zlib", when="+mfem")
depends_on("python", when="+python") depends_on("python", when="+python")
@ -137,6 +137,12 @@ class Axom(CMakePackage, CudaPackage):
depends_on("py-shroud", when="+devtools") depends_on("py-shroud", when="+devtools")
depends_on("uncrustify@0.61", when="+devtools") depends_on("uncrustify@0.61", when="+devtools")
def flag_handler(self, name, flags):
if name in ('cflags', 'cxxflags', 'fflags'):
# the package manages these flags in another way
return (None, None, None)
return (flags, None, None)
def _get_sys_type(self, spec): def _get_sys_type(self, spec):
sys_type = spec.architecture sys_type = spec.architecture
# if on llnl systems, we can use the SYS_TYPE # if on llnl systems, we can use the SYS_TYPE
@ -210,6 +216,33 @@ def hostconfig(self, spec, prefix):
else: else:
cfg.write(cmake_cache_option("ENABLE_FORTRAN", False)) cfg.write(cmake_cache_option("ENABLE_FORTRAN", False))
# use global spack compiler flags
cppflags = ' '.join(spec.compiler_flags['cppflags'])
if cppflags:
# avoid always ending up with ' ' with no flags defined
cppflags += ' '
cflags = cppflags + ' '.join(spec.compiler_flags['cflags'])
if cflags:
cfg.write(cmake_cache_entry("CMAKE_C_FLAGS", cflags))
cxxflags = cppflags + ' '.join(spec.compiler_flags['cxxflags'])
if cxxflags:
cfg.write(cmake_cache_entry("CMAKE_CXX_FLAGS", cxxflags))
fflags = ' '.join(spec.compiler_flags['fflags'])
if fflags:
cfg.write(cmake_cache_entry("CMAKE_Fortran_FLAGS", fflags))
if ("gfortran" in f_compiler) and ("clang" in cpp_compiler):
libdir = pjoin(os.path.dirname(
os.path.dirname(cpp_compiler)), "lib")
flags = ""
for _libpath in [libdir, libdir + "64"]:
if os.path.exists(_libpath):
flags += " -Wl,-rpath,{0}".format(_libpath)
description = ("Adds a missing libstdc++ rpath")
if flags:
cfg.write(cmake_cache_entry("BLT_EXE_LINKER_FLAGS", flags,
description))
# TPL locations # TPL locations
cfg.write("#------------------{0}\n".format("-" * 60)) cfg.write("#------------------{0}\n".format("-" * 60))
cfg.write("# TPLs\n") cfg.write("# TPLs\n")
@ -433,9 +466,9 @@ def hostconfig(self, spec, prefix):
os.path.dirname(f_compiler)), "lib") os.path.dirname(f_compiler)), "lib")
description = ("Adds a missing rpath for libraries " description = ("Adds a missing rpath for libraries "
"associated with the fortran compiler") "associated with the fortran compiler")
linker_flags = "${BLT_EXE_LINKER_FLAGS} -Wl,-rpath," + libdir
cfg.write(cmake_cache_entry("BLT_EXE_LINKER_FLAGS", cfg.write(cmake_cache_entry("BLT_EXE_LINKER_FLAGS",
"-Wl,-rpath," + libdir, linker_flags, description))
description))
if "+cuda" in spec: if "+cuda" in spec:
cfg.write("#------------------{0}\n".format("-" * 60)) cfg.write("#------------------{0}\n".format("-" * 60))
@ -485,15 +518,6 @@ def hostconfig(self, spec, prefix):
cfg.write("# nvcc does not like gtest's 'pthreads' flag\n") cfg.write("# nvcc does not like gtest's 'pthreads' flag\n")
cfg.write(cmake_cache_option("gtest_disable_pthreads", True)) cfg.write(cmake_cache_option("gtest_disable_pthreads", True))
if ("gfortran" in f_compiler) and ("clang" in cpp_compiler):
clanglibdir = pjoin(os.path.dirname(
os.path.dirname(cpp_compiler)), "lib")
flags = "-Wl,-rpath,{0}".format(clanglibdir)
description = ("Adds a missing rpath for libraries "
"associated with the fortran compiler")
cfg.write(cmake_cache_entry("BLT_EXE_LINKER_FLAGS", flags,
description))
cfg.write("\n") cfg.write("\n")
cfg.close() cfg.close()
tty.info("Spack generated Axom host-config file: " + host_config_path) tty.info("Spack generated Axom host-config file: " + host_config_path)

View file

@ -147,6 +147,12 @@ class Conduit(Package):
# build phases used by this package # build phases used by this package
phases = ["configure", "build", "install"] phases = ["configure", "build", "install"]
def flag_handler(self, name, flags):
if name in ('cflags', 'cxxflags', 'fflags'):
# the package manages these flags in another way
return (None, None, None)
return (flags, None, None)
def setup_build_environment(self, env): def setup_build_environment(self, env):
env.set('CTEST_OUTPUT_ON_FAILURE', '1') env.set('CTEST_OUTPUT_ON_FAILURE', '1')
@ -350,6 +356,33 @@ def create_host_config(self, spec, prefix, py_site_pkgs_dir=None):
else: else:
cfg.write(cmake_cache_entry("BUILD_SHARED_LIBS", "OFF")) cfg.write(cmake_cache_entry("BUILD_SHARED_LIBS", "OFF"))
# use global spack compiler flags
cppflags = ' '.join(spec.compiler_flags['cppflags'])
if cppflags:
# avoid always ending up with ' ' with no flags defined
cppflags += ' '
cflags = cppflags + ' '.join(spec.compiler_flags['cflags'])
if cflags:
cfg.write(cmake_cache_entry("CMAKE_C_FLAGS", cflags))
cxxflags = cppflags + ' '.join(spec.compiler_flags['cxxflags'])
if cxxflags:
cfg.write(cmake_cache_entry("CMAKE_CXX_FLAGS", cxxflags))
fflags = ' '.join(spec.compiler_flags['fflags'])
if fflags:
cfg.write(cmake_cache_entry("CMAKE_Fortran_FLAGS", fflags))
if ("gfortran" in f_compiler) and ("clang" in cpp_compiler):
libdir = os.path.join(os.path.dirname(
os.path.dirname(f_compiler)), "lib")
flags = ""
for _libpath in [libdir, libdir + "64"]:
if os.path.exists(_libpath):
flags += " -Wl,-rpath,{0}".format(_libpath)
description = ("Adds a missing libstdc++ rpath")
if flags:
cfg.write(cmake_cache_entry("BLT_EXE_LINKER_FLAGS", flags,
description))
####################### #######################
# Unit Tests # Unit Tests
####################### #######################
@ -380,7 +413,8 @@ def create_host_config(self, spec, prefix, py_site_pkgs_dir=None):
# Grab lib directory for the current fortran compiler # Grab lib directory for the current fortran compiler
libdir = os.path.join(os.path.dirname( libdir = os.path.join(os.path.dirname(
os.path.dirname(f_compiler)), "lib") os.path.dirname(f_compiler)), "lib")
flags = "-lstdc++ -Wl,-rpath," + libdir flags = "${BLT_EXE_LINKER_FLAGS} -lstdc++ "
flags += "-Wl,-rpath,{0} -Wl,-rpath,{0}64".format(libdir)
cfg.write(cmake_cache_entry("BLT_EXE_LINKER_FLAGS", cfg.write(cmake_cache_entry("BLT_EXE_LINKER_FLAGS",
flags)) flags))

View file

@ -366,6 +366,21 @@ def find_optional_library(name, prefix):
cxxflags = spec.compiler_flags['cxxflags'] cxxflags = spec.compiler_flags['cxxflags']
if cxxflags: if cxxflags:
# Add opt/debug flags if they are not present in global cxx flags
opt_flag_found = any(f in self.compiler.opt_flags
for f in cxxflags)
debug_flag_found = any(f in self.compiler.debug_flags
for f in cxxflags)
if '+debug' in spec:
if not debug_flag_found:
cxxflags.append('-g')
if not opt_flag_found:
cxxflags.append('-O0')
else:
if not opt_flag_found:
cxxflags.append('-O2')
cxxflags = [(xcompiler + flag) for flag in cxxflags] cxxflags = [(xcompiler + flag) for flag in cxxflags]
if '+cuda' in spec: if '+cuda' in spec:
cxxflags += [ cxxflags += [