sst-core: fix linkage against ncurses, zlib, and HDF5 (#49152)

* sst-core: fix for > 14.0.0 requiring ncurses

* sst-core: backport fix for curses detection

* sst-core: ensure HDF5 is ignored if not specified

* sst-core: HDF5 integration is via C++

* sst-core: switch to with_or_without for configure

* sst-core: switch to enable_or_disable for configure

* sst-core: control memory pools and debug output with variants
This commit is contained in:
Eric Berquist 2025-03-24 15:45:12 -04:00 committed by GitHub
parent e3bb0d77bc
commit fd7dcf3a3f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 155 additions and 27 deletions

View File

@ -0,0 +1,116 @@
commit a4dbc4ae575dc9bf6f6cac42d011a1ac0d496aa8
Author: Eric Berquist <727571+berquist@users.noreply.github.com>
Date: 2024-07-29 09:25:13 AM (Mon, 29 Jul 2024 09:25:13 -0600)
ncurses detection fixes (#1110)
* may have ncursesw6-config but not ncurses6-config
* go back to hardcoded lib checks
* fix using --with-ncurses
* avoid bad default usage of AC_CHECK_LIB
* add curses variables to sst.conf
* unset CURSES_CPPFLAGS and CURSES_LIBS if they're actually wrong
diff --git config/sst_check_curses.m4 config/sst_check_curses.m4
index 47699427..1dbe0dcf 100644
--- config/sst_check_curses.m4
+++ config/sst_check_curses.m4
@@ -1,25 +1,34 @@
+dnl -*- mode: autoconf; -*-
+
AC_DEFUN([SST_CHECK_CURSES],
[
sst_check_curses_happy="yes"
- AC_ARG_WITH([curses],
+ AC_ARG_WITH([ncurses],
[AS_HELP_STRING([--with-ncurses@<:@=DIR or EXEC@:>@],
[Use ncurses library found in DIR or associated with the ncursesN-config utility specified by EXEC])])
- AS_IF([test "$with_curses" = "no"], [sst_check_curses_happy="no"])
+ AS_IF([test "$with_ncurses" = "no"], [sst_check_curses_happy="no"])
NCURSES_CONFIG_EXE="no"
dnl check if user provided a specific ncursesN-config
- AS_IF([test ! -d "$with_curses"],
- [AS_IF([test -x "$with_curses"],
- [NCURSES_CONFIG_EXE=$with_curses])])
+ AS_IF([test ! -d "$with_ncurses"],
+ [AS_IF([test -x "$with_ncurses"],
+ [NCURSES_CONFIG_EXE=$with_ncurses])])
dnl test ncursesN-config
AS_IF([test $NCURSES_CONFIG_EXE = "no"],
- [AS_IF([test -n "$with_curses"],
- [AC_PATH_PROGS([NCURSES_CONFIG_EXE], ["ncurses6-config" "ncurses5.4-config" "ncurses5-config"], ["no"], ["$with_curses/bin"])],
- [AC_PATH_PROGS([NCURSES_CONFIG_EXE], ["ncurses6-config" "ncurses5.4-config" "ncurses5-config"], ["no"])])])
+ [AS_IF([test -n "$with_ncurses"],
+ [AC_PATH_PROGS([NCURSES_CONFIG_EXE],
+ ["ncurses6-config" "ncursesw6-config" "ncurses5.4-config" "ncurses5-config"],
+ ["no"], ["$with_ncurses/bin"])],
+ [AC_PATH_PROGS([NCURSES_CONFIG_EXE],
+ ["ncurses6-config" "ncursesw6-config" "ncurses5.4-config" "ncurses5-config"],
+ ["no"])])])
+
+ AC_MSG_CHECKING([ncurses config binary exists])
+ AC_MSG_RESULT([$NCURSES_CONFIG_EXE])
dnl don't continue if ncursesN-config can't be found rather than look for the
dnl specific libraries
@@ -44,10 +53,27 @@ AC_DEFUN([SST_CHECK_CURSES],
CPPFLAGS="$CPPFLAGS $CURSES_CPPFLAGS"
LDFLAGS="$LDFLAGS $CURSES_LIBS"
- dnl Check that the specific header exists and that the config-provided lib locations are correct.
+ dnl Check that the specific header exists and that plausible lib
+ dnl locations are correct.
AC_LANG_PUSH([C++])
AC_CHECK_HEADER([ncurses.h], [], [sst_check_curses_happy="no"])
- AC_SEARCH_LIBS([initscr], [$CURSES_LIBS], [], [sst_check_curses_happy="no"])
+ dnl We cannot check that the config-provided lib names are
+ dnl correct, since those are not available at macro expansion
+ dnl time. This is only necessary for platforms where libs are
+ dnl reported but are broken or don't actually exist.
+ dnl
+ dnl If nothing is specified for `action-if-found`, the library
+ dnl will be added to LIBS, which is not correct for our use case.
+ curses_check_lib_tmp=""
+ AS_IF([test "$sst_check_curses_happy" != "no"],
+ [AC_CHECK_LIB([ncursesw], [initscr], [curses_check_lib_tmp="ncursesw is valid"],
+ [AC_CHECK_LIB([ncurses], [initscr], [curses_check_lib_tmp="ncurses is valid"],
+ [AC_CHECK_LIB([curses], [initscr], [curses_check_lib_tmp="curses is valid"],
+ [sst_check_curses_happy="no"
+ CURSES_CPPFLAGS=""
+ CURSES_LIBS=""
+ ])])])
+ ])
AC_LANG_POP([C++])
CPPFLAGS="$CPPFLAGS_saved"
@@ -63,6 +89,6 @@ AC_DEFUN([SST_CHECK_CURSES],
AC_MSG_CHECKING([for curses library])
AC_MSG_RESULT([$sst_check_curses_happy])
- AS_IF([test "$sst_check_curses_happy" = "no" -a ! -z "$with_curses" -a "$with_curses" != "no"], [$3])
+ AS_IF([test "$sst_check_curses_happy" = "no" -a ! -z "$with_ncurses" -a "$with_ncurses" != "no"], [$3])
AS_IF([test "$sst_check_curses_happy" = "yes"], [$1], [$2])
])
diff --git src/sst/sst.conf src/sst/sst.conf
index 13adb002..c30afb0b 100644
--- src/sst/sst.conf
+++ src/sst/sst.conf
@@ -30,6 +30,8 @@ PYTHON_VERSION3=@PYTHON_VERSION3@
LIBZ_CPPFLAGS=@LIBZ_CPPFLAGS@
LIBZ_LDFLAGS=@LIBZ_LDFLAGS@
LIBZ_LIBS=@LIBZ_LIBS@
+CURSES_CPPFLAGS=@CURSES_CPPFLAGS@
+CURSES_LIBS=@CURSES_LIBS@
ELEMENT_CXXFLAGS=@SST_EXPORT_CXXFLAGS@ @SST_ELEMENT_FPIC_FLAGS@ -DHAVE_CONFIG_H -I@prefix@/include
ELEMENT_LDFLAGS=-shared -fno-common -Wl,-undefined -Wl,dynamic_lookup
pkgconfig=@prefix@/lib/pkgconfig/SST-@PACKAGE_VERSION@.pc

View File

@ -61,10 +61,16 @@ class SstCore(AutotoolsPackage):
variant( variant(
"curses", "curses",
default=True, default=True,
when="@develop,master", when="@develop,master,14.0.0:",
description="Build support for interactive sst-info", description="Build support for interactive sst-info",
) )
variant("mempools", default=True, description="Use memory pools")
variant(
"debug",
default=False,
description="Enable additional debug output from core and components",
)
variant("trackevents", default=False, description="Enable event and activity tracking") variant("trackevents", default=False, description="Enable event and activity tracking")
variant( variant(
"trackperf", "trackperf",
@ -77,37 +83,44 @@ class SstCore(AutotoolsPackage):
depends_on("python@:3.11", type=("build", "run", "link")) depends_on("python@:3.11", type=("build", "run", "link"))
depends_on("mpi", when="+pdes_mpi") depends_on("mpi", when="+pdes_mpi")
depends_on("zoltan", when="+zoltan") depends_on("zoltan", when="+zoltan")
depends_on("hdf5", when="+hdf5") depends_on("hdf5 +cxx", when="+hdf5")
depends_on("zlib-api", when="+zlib") depends_on("zlib-api", when="+zlib")
depends_on("gettext") depends_on("gettext")
depends_on("ncurses", when="+curses") depends_on("ncurses", when="+curses", type=("build", "link"))
for version_name in ("master", "develop"): with when("@develop,master,14.0.0"):
depends_on("autoconf@1.68:", type="build", when="@{}".format(version_name)) depends_on("autoconf@1.68:", type="build")
depends_on("automake@1.11.1:", type="build", when="@{}".format(version_name)) depends_on("automake@1.11.1:", type="build")
depends_on("libtool@1.2.4:", type="build", when="@{}".format(version_name)) depends_on("libtool@1.2.4:", type="build")
depends_on("m4", type="build", when="@{}".format(version_name)) depends_on("m4", type="build")
# Backport of https://github.com/sstsimulator/sst-core/pull/1110
with when("@14.0.0"):
patch("1110-ncurses_detection.patch", level=0)
# force out-of-source builds # force out-of-source builds
build_directory = "spack-build" build_directory = "spack-build"
@when("@develop,master") # 14.0.0 could theoretically be avoided here, but introducing the patch
# (even with autogen changes) causes file created/modified time problems
# that cannot be easily circumvented with `touch`.
@when("@develop,master,14.0.0")
def autoreconf(self, spec, prefix): def autoreconf(self, spec, prefix):
bash = which("bash") bash = which("bash")
bash("autogen.sh") bash("autogen.sh")
def configure_args(self): def configure_args(self):
args = [] args = []
if "+zoltan" in self.spec: args.extend(self.with_or_without("zoltan", activation_value="prefix"))
args.append("--with-zoltan=%s" % self.spec["zoltan"].prefix) args.extend(self.with_or_without("hdf5", activation_value="prefix"))
if "+hdf5" in self.spec: args.extend(
args.append("--with-hdf5=%s" % self.spec["hdf5"].prefix) self.with_or_without(
if "+zlib" in self.spec: "libz", activation_value=lambda _: self.spec["zlib-api"].prefix, variant="zlib"
args.append("--with-zlib=%s" % self.spec["zlib-api"].prefix) )
if "+curses" in self.spec: )
args.append("--with-curses={}".format(self.spec["ncurses"].prefix)) args.extend(self.with_or_without("ncurses", activation_value="prefix", variant="curses"))
if "+pdes_mpi" in self.spec: if self.spec.satisfies("+pdes_mpi"):
args.append("--enable-mpi") args.append("--enable-mpi")
env["CC"] = self.spec["mpi"].mpicc env["CC"] = self.spec["mpi"].mpicc
env["CXX"] = self.spec["mpi"].mpicxx env["CXX"] = self.spec["mpi"].mpicxx
@ -116,16 +129,15 @@ def configure_args(self):
else: else:
args.append("--disable-mpi") args.append("--disable-mpi")
if "+trackevents" in self.spec: args.extend(self.enable_or_disable("mem-pools", variant="mempools"))
args.append("--enable-event-tracking") args.extend(self.enable_or_disable("debug"))
if "+trackperf" in self.spec: args.extend(self.enable_or_disable("event-tracking", variant="trackevents"))
args.append("--enable-perf-tracking") args.extend(self.enable_or_disable("perf-tracking", variant="trackperf"))
if "+preview" in self.spec: args.extend(self.enable_or_disable("preview-build", variant="preview"))
args.append("--enable-preview-build") args.extend(self.enable_or_disable("profile"))
if "+profile" in self.spec:
args.append("--enable-profile")
args.append("--with-python=%s" % self.spec["python"].prefix) # Required, so no need for with_or_without
args.append(f"--with-python={self.spec['python'].prefix}")
return args return args
def patch(self): def patch(self):