openmpi: get rid of implicit system dependencies (#16758)

* openmpi: get rid of implicit system dependencies

* Python 2 compatibility.

* Rename pbspro to openpbs and revert packages.yaml.

* Remove virtual package 'sendmail'.
This commit is contained in:
Sergey Kosukhin 2020-05-26 02:14:47 +02:00 committed by GitHub
parent 3c36a7caab
commit 15d2883abe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 553 additions and 84 deletions

View File

@ -0,0 +1,22 @@
# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
from spack import *
class Libical(CMakePackage):
"""Libical - an implementation of iCalendar protocols and data formats."""
homepage = "https://github.com/libical/libical"
url = "https://github.com/libical/libical/archive/v3.0.8.tar.gz"
version('3.0.8', sha256='09fecacaf75ba5a242159e3a9758a5446b5ce4d0ab684f98a7040864e1d1286f')
depends_on('cmake@3.11.0:', type='build')
depends_on('perl', type='build')
depends_on('icu4c')
def cmake_args(self):
return ['-DENABLE_GTK_DOC=OFF']

View File

@ -10,7 +10,10 @@
class Lsf(Package):
"""IBM Platform LSF is a batch scheduler for HPC environments"""
homepage = "https://www.ibm.com/marketplace/hpc-workload-management"
homepage = "https://www.ibm.com/products/hpc-workload-management"
has_code = False
version('10.1')
# LSF needs to be added as an external package to SPACK. For this, the
# config file packages.yaml needs to be adjusted:
@ -21,4 +24,6 @@ class Lsf(Package):
# buildable: False
def install(self, spec, prefix):
raise InstallError('LSF is not installable; it is vendor supplied')
raise InstallError(
self.spec.format('{name} is not installable, you need to specify '
'it as an external package in packages.yaml'))

View File

@ -0,0 +1,30 @@
# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
from spack import *
class Mxm(Package):
"""Mellanox Messaging Accelerator (MXM) provides enhancements to parallel
communication libraries by fully utilizing the underlying networking
infrastructure provided by Mellanox HCA/switch hardware."""
homepage = 'https://www.mellanox.com/products/mxm'
has_code = False
version('3.6.3104')
# MXM needs to be added as an external package to SPACK. For this, the
# config file packages.yaml needs to be adjusted:
# mxm:
# version: [3.6.3104]
# paths:
# mxm@3.6.3104: /opt/mellanox/mxm (path to your MXM installation)
# buildable: False
def install(self, spec, prefix):
raise InstallError(
self.spec.format('{name} is not installable, you need to specify '
'it as an external package in packages.yaml'))

View File

@ -9,54 +9,6 @@
import llnl.util.tty as tty
def _verbs_dir():
"""Try to find the directory where the OpenFabrics verbs package is
installed. Return None if not found.
"""
try:
# Try to locate Verbs by looking for a utility in the path
ibv_devices = which("ibv_devices")
# Run it (silently) to ensure it works
ibv_devices(output=str, error=str)
# Get path to executable
path = ibv_devices.exe[0]
# Remove executable name and "bin" directory
path = os.path.dirname(path)
path = os.path.dirname(path)
# There's usually no "/include" on Unix; use "/usr/include" instead
if path == "/":
path = "/usr"
return path
except TypeError:
return None
except ProcessError:
return None
def _mxm_dir():
"""Look for default directory where the Mellanox package is
installed. Return None if not found.
"""
# Only using default directory; make this more flexible in the future
path = "/opt/mellanox/mxm"
if os.path.isdir(path):
return path
else:
return None
def _tm_dir():
"""Look for default directory where the PBS/TM package is
installed. Return None if not found.
"""
# /opt/pbs from PBS 18+; make this more flexible in the future
paths_list = ("/opt/pbs", )
for path in paths_list:
if os.path.isdir(path) and os.path.isfile(path + "/include/tm.h"):
return path
return None
class Openmpi(AutotoolsPackage):
"""An open source Message Passing Interface implementation.
@ -276,6 +228,8 @@ class Openmpi(AutotoolsPackage):
depends_on('m4', type='build', when='@develop')
depends_on('perl', type='build', when='@develop')
depends_on('pkgconfig', type='build')
depends_on('hwloc')
# ompi@:3.0.0 doesn't support newer hwloc releases:
# "configure: error: OMPI does not currently support hwloc v2 API"
@ -288,13 +242,18 @@ class Openmpi(AutotoolsPackage):
depends_on('sqlite', when='+sqlite3@:1.11')
depends_on('zlib', when='@3.0.0:')
depends_on('valgrind~mpi', when='+memchecker')
depends_on('ucx', when='fabrics=ucx')
depends_on('ucx +thread_multiple', when='fabrics=ucx +thread_multiple')
depends_on('ucx +thread_multiple', when='@3.0.0: fabrics=ucx')
depends_on('libfabric', when='fabrics=libfabric')
depends_on('mxm', when='fabrics=mxm')
depends_on('binutils+libiberty', when='fabrics=mxm')
depends_on('rdma-core', when='fabrics=verbs')
depends_on('slurm', when='schedulers=slurm')
depends_on('lsf', when='schedulers=lsf')
depends_on('binutils+libiberty', when='fabrics=mxm')
depends_on('openpbs', when='schedulers=tm')
conflicts('+cuda', when='@:1.6') # CUDA support was added in 1.7
conflicts('fabrics=psm2', when='@:1.8') # PSM2 support was added in 1.10.0
@ -359,43 +318,17 @@ def setup_dependent_package(self, module, dependent_spec):
]
def with_or_without_verbs(self, activated):
# Up through version 1.6, this option was previously named
# --with-openib
opt = 'openib'
# In version 1.7, it was renamed to be --with-verbs
if self.spec.satisfies('@1.7:'):
opt = 'verbs'
# If the option has not been activated return
# --without-openib or --without-verbs
# Up through version 1.6, this option was named --with-openib.
# In version 1.7, it was renamed to be --with-verbs.
opt = 'verbs' if self.spec.satisfies('@1.7:') else 'openib'
if not activated:
return '--without-{0}'.format(opt)
line = '--with-{0}'.format(opt)
path = _verbs_dir()
if (path is not None) and (path not in ('/usr', '/usr/local')):
line += '={0}'.format(path)
return line
def with_or_without_mxm(self, activated):
opt = 'mxm'
# If the option has not been activated return --without-mxm
if not activated:
return '--without-{0}'.format(opt)
line = '--with-{0}'.format(opt)
path = _mxm_dir()
if path is not None:
line += '={0}'.format(path)
return line
return '--with-{0}={1}'.format(opt, self.spec['rdma-core'].prefix)
def with_or_without_tm(self, activated):
opt = 'tm'
# If the option has not been activated return --without-tm
if not activated:
return '--without-{0}'.format(opt)
line = '--with-{0}'.format(opt)
path = _tm_dir()
if path is not None:
line += '={0}'.format(path)
return line
return '--without-tm'
return '--with-tm={0}'.format(self.spec['openpbs'].prefix)
@run_before('autoreconf')
def die_without_fortran(self):
@ -471,7 +404,8 @@ def configure_args(self):
# Fabrics
if 'fabrics=auto' not in spec:
config_args.extend(self.with_or_without('fabrics'))
config_args.extend(self.with_or_without('fabrics',
activation_value='prefix'))
# The wrappers fail to automatically link libfabric. This will cause
# undefined references unless we add the appropriate flags.
if 'fabrics=libfabric' in spec:

View File

@ -0,0 +1,52 @@
--- a/m4/pbs_systemd_unitdir.m4
+++ b/m4/pbs_systemd_unitdir.m4
@@ -39,14 +39,19 @@
AC_DEFUN([PBS_AC_SYSTEMD_UNITDIR],
[
AC_MSG_CHECKING([system/machine type for systemd unit dir])
- systemd_dir="/usr/lib/systemd/system"
- AS_IF([test -r "/etc/os-release"],
- [system_type=$( cat /etc/os-release | awk -F'=' '/^ID=/' | cut -d "=" -f 2 )
- AS_IF([test "x$system_type" = "xubuntu" -o "x$system_type" = "xdebian"],
- [systemd_dir="/lib/systemd/system"])
- ]
- )
- _unitdir=$systemd_dir
+dnl systemd_dir="/usr/lib/systemd/system"
+dnl AS_IF([test -r "/etc/os-release"],
+dnl [system_type=$( cat /etc/os-release | awk -F'=' '/^ID=/' | cut -d "=" -f 2 )
+dnl AS_IF([test "x$system_type" = "xubuntu" -o "x$system_type" = "xdebian"],
+dnl [systemd_dir="/lib/systemd/system"])
+dnl ]
+dnl )
+dnl _unitdir=$systemd_dir
+ _save_prefix=$prefix; _save_exec_prefix=$exec_prefix
+ test "x$prefix" = xNONE && prefix=$ac_default_prefix
+ test "x$exec_prefix" = xNONE && exec_prefix=$prefix
+ eval "_unitdir=$libdir/systemd/system"
+ prefix=$_save_prefix; exec_prefix=$_save_exec_prefix
AC_MSG_RESULT([$_unitdir])
AC_SUBST([_unitdir])
])
--- a/src/cmds/scripts/Makefile.am
+++ b/src/cmds/scripts/Makefile.am
@@ -67,7 +67,7 @@ dist_pythonlib_PYTHON = \
pbs_bootcheck.py \
pbs_topologyinfo.py
-sysprofiledir = /etc/profile.d
+sysprofiledir = $(sysconfdir)
dist_sysprofile_DATA = \
pbs.csh \
--- a/test/fw/Makefile.am
+++ b/test/fw/Makefile.am
@@ -59,7 +59,7 @@ ptlpkg_pylib_pluginsdir = $(ptlpkg_pylib_utilsdir)/plugins
dist_ptlpkg_pylib_plugins_PYTHON = $(wildcard $(srcdir)/ptl/utils/plugins/*.py)
-sysprofiledir = /etc/profile.d
+sysprofiledir = $(sysconfdir)
dist_sysprofile_DATA = \
ptl.csh \

View File

@ -0,0 +1,21 @@
--- a/configure.ac
+++ b/configure.ac
@@ -83,10 +83,6 @@ AC_CHECK_LIB([c], [ruserok],
[],
AC_CHECK_LIB(socket, ruserok)
)
-AC_CHECK_LIB([c], [crypt],
- [],
- AC_CHECK_LIB(crypt, crypt)
-)
AC_CHECK_LIB([c], [posix_openpt],
AC_DEFINE([HAVE_POSIX_OPENPT], [], [Defined whe posix_openpt is available])
)
@@ -125,7 +121,6 @@ AC_CHECK_HEADERS([ \
arpa/inet.h \
asm/types.h \
assert.h \
- crypt.h \
ctype.h \
dirent.h \
dlfcn.h \

View File

@ -0,0 +1,94 @@
# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import llnl.util.tty as tty
from spack import *
class Openpbs(AutotoolsPackage):
"""PBS Professional software optimizes job scheduling and workload
management in high-performance computing (HPC) environments - clusters,
clouds, and supercomputers - improving system efficiency and people's
productivity."""
# TODO: update the description and the homepage url once the renaming is
# finished: http://community.pbspro.org/t/openpbs-and-version-20-0/2075
homepage = "https://www.pbspro.org"
url = "https://github.com/openpbs/openpbs/archive/v19.1.3.tar.gz"
version('19.1.3', sha256='6e9d2614f839ff3d91d0ace3de04752b7c075da60c72fe6def76437aa05c9857')
depends_on('autoconf', type='build')
depends_on('automake', type='build')
depends_on('libtool', type='build')
depends_on('m4', type='build')
depends_on('flex', type='build')
depends_on('bison', type='build')
depends_on('perl', type='build')
depends_on('ssmtp', type=('build', 'run'))
depends_on('xauth', type=('build', 'run'))
depends_on('python@2.6:2.7', type=('build', 'link', 'run'))
depends_on('libx11')
depends_on('libice')
depends_on('libsm')
depends_on('openssl')
depends_on('postgresql')
depends_on('expat')
depends_on('libedit')
depends_on('ncurses')
depends_on('hwloc@:1')
depends_on('libical')
depends_on('swig')
depends_on('tcl')
depends_on('tk')
depends_on('zlib')
# The configure script cannot properly handle dependencies in non-system
# directories.
patch('with_lib.patch')
# The package does not really depend on libcrypt but links to it. We
# eliminate this redundant dependency to avoid linking to a system library.
patch('no_crypt.patch')
# Fix installation directories.
patch('install.patch')
# Link to the dynamic library of Python instead of the static one.
patch('python.patch')
def autoreconf(self, spec, prefix):
Executable('./autogen.sh')()
def configure_args(self):
return [
'--x-includes=%s' % self.spec['libx11'].prefix.include,
'--x-libraries=%s' % self.spec['libx11'].prefix.lib,
'--with-pbs-server-home=%s' % self.spec.prefix.var.spool.pbs,
'--with-database-dir=%s' % self.spec['postgresql'].prefix,
'--with-pbs-conf-file=%s' % self.spec.prefix.etc.join('pbs.conf'),
'--with-expat=%s' % self.spec['expat'].prefix,
'--with-editline=%s' % self.spec['libedit'].prefix,
'--with-hwloc=%s' % self.spec['hwloc'].prefix,
'--with-libical=%s' % self.spec['libical'].prefix,
'--with-sendmail=%s' % self.spec['ssmtp'].prefix.sbin.sendmail,
'--with-swig=%s' % self.spec['swig'].prefix,
'--with-tcl=%s' % self.spec['tcl'].prefix,
# The argument --with-tk is introduced with with_lib.patch
'--with-tk=%s' % self.spec['tk'].prefix,
'--with-xauth=xauth',
'--with-libz=%s' % self.spec['zlib'].prefix]
@run_after('install')
def post_install(self):
# Calling the postinstall script requires root privileges
# Executable(self.prefix.libexec.pbs_postinstall)()
tty.warn(self.spec.format(
'To finalize the installation of {name}, you need to run '
'"{prefix}/libexec/pbs_postinstall" with root privileges'))

View File

@ -0,0 +1,11 @@
--- a/buildutils/python-autoconf.py
+++ b/buildutils/python-autoconf.py
@@ -70,7 +70,7 @@ if py_stdlibdir:
else:
py_stdlibdir_real = "%s/lib" % (sysconfig.PREFIX,)
-py_lib_configdir = get_py_config_var('LIBPL')
+py_lib_configdir = '' # get_py_config_var('LIBPL')
if py_lib_configdir:
py_lib_configdir=py_lib_configdir.replace(py_stdlibdir,py_stdlibdir_real)

View File

@ -0,0 +1,231 @@
--- a/m4/with_database_dir.m4
+++ b/m4/with_database_dir.m4
@@ -56,20 +56,11 @@ AC_DEFUN([PBS_AC_WITH_DATABASE_DIR],
AS_IF([test -r "$database_dir/include/postgresql/libpq-fe.h"],
[database_inc="-I$database_dir/include/postgresql"],
AC_MSG_ERROR([Database headers not found.]))))
- AS_IF([test "$database_dir" = "/usr"],
- # Using system installed PostgreSQL
- AS_IF([test -r "/usr/lib64/libpq.so" -o -r "/usr/lib/libpq.so" -o -r "/usr/lib/x86_64-linux-gnu/libpq.so"],
- [database_lib="-lpq"],
- AC_MSG_ERROR([PBS database shared object library not found.])),
- # Using developer installed PostgreSQL
- AS_IF([test -r "$database_dir/lib64/libpq.a"],
- [database_lib="$database_dir/lib64/libpq.a"],
- AS_IF([test -r "$database_dir/lib/libpq.a"],
- [database_lib="$database_dir/lib/libpq.a"],
- AC_MSG_ERROR([PBS database library not found.])
- )
- )
- )
+ AS_IF([test -r "$database_dir/lib64/libpq.so"],
+ [database_lib="-L$database_dir/lib64 -lpq"],
+ [test -r "$database_dir/lib/libpq.so"],
+ [database_lib="-L$database_dir/lib -lpq"],
+ AC_MSG_ERROR([PBS database shared object library not found.]))
AC_MSG_RESULT([$database_dir])
AC_SUBST([database_dir])
AC_SUBST([database_inc])
--- a/m4/with_editline.m4
+++ b/m4/with_editline.m4
@@ -52,31 +52,12 @@ AC_DEFUN([PBS_AC_WITH_EDITLINE],
AS_IF([test "$editline_dir" != "/usr"],
[editline_inc="-I$editline_dir/include"]),
AC_MSG_ERROR([editline headers not found.]))
- AS_IF([test "$editline_dir" = "/usr"],
- # Using system installed editline
- AS_IF([test -r /usr/lib64/libedit.so],
- [editline_lib="-ledit"],
- AS_IF([test -r /usr/lib/libedit.so],
- [editline_lib="-ledit"],
- AS_IF([test -r /usr/lib/x86_64-linux-gnu/libedit.so],
- [editline_lib="-ledit"],
- AC_MSG_ERROR([editline shared object library not found.])))),
- # Using developer installed editline
- AS_IF([test -r "${editline_dir}/lib64/libedit.a"],
- [editline_lib="${editline_dir}/lib64/libedit.a"],
- AS_IF([test -r "${editline_dir}/lib/libedit.a"],
- [editline_lib="${editline_dir}/lib/libedit.a"],
- AC_MSG_ERROR([editline library not found.])
- )
- )
- )
+ AS_IF([test -r "$editline_dir/lib64/libedit.so"],
+ [editline_lib="-L$editline_dir/lib64 -ledit"],
+ [test -r "$editline_dir/lib/libedit.so"],
+ [editline_lib="-L$editline_dir/lib -ledit"],
+ AC_MSG_ERROR([editline shared object library not found.]))
AC_MSG_RESULT([$editline_dir])
- AC_CHECK_LIB([ncurses], [tgetent],
- [curses_lib="-lncurses"],
- AC_CHECK_LIB([curses], [tgetent],
- [curses_lib="-lcurses"],
- AC_MSG_ERROR([curses library not found.])))
- [editline_lib="$editline_lib $curses_lib"]
AC_SUBST(editline_inc)
AC_SUBST(editline_lib)
AC_DEFINE([QMGR_HAVE_HIST], [], [Defined when editline is available])
--- a/m4/with_expat.m4
+++ b/m4/with_expat.m4
@@ -52,20 +52,11 @@ AC_DEFUN([PBS_AC_WITH_EXPAT],
AS_IF([test "$expat_dir" != "/usr"],
[expat_inc="-I$expat_dir/include"]),
AC_MSG_ERROR([expat headers not found.]))
- AS_IF([test "$expat_dir" = "/usr"],
- # Using system installed expat
- AS_IF([test -r "/usr/lib64/libexpat.so" -o -r "/usr/lib/libexpat.so" -o -r "/usr/lib/x86_64-linux-gnu/libexpat.so"],
- [expat_lib="-lexpat"],
- AC_MSG_ERROR([expat shared object library not found.])),
- # Using developer installed expat
- AS_IF([test -r "${expat_dir}/lib64/libexpat.a"],
- [expat_lib="${expat_dir}/lib64/libexpat.a"],
- AS_IF([test -r "${expat_dir}/lib/libexpat.a"],
- [expat_lib="${expat_dir}/lib/libexpat.a"],
- AC_MSG_ERROR([expat library not found.])
- )
- )
- )
+ AS_IF([test -r "$expat_dir/lib64/libexpat.so"],
+ [expat_lib="-L$expat_dir/lib64 -lexpat"],
+ [test -r "$expat_dir/lib/libexpat.so"],
+ [expat_lib="-L$expat_dir/lib -lexpat"],
+ AC_MSG_ERROR([expat shared object library not found.]))
AC_MSG_RESULT([$expat_dir])
AC_SUBST(expat_inc)
AC_SUBST(expat_lib)
--- a/m4/with_hwloc.m4
+++ b/m4/with_hwloc.m4
@@ -56,28 +56,12 @@ AC_DEFUN([PBS_AC_WITH_HWLOC],
[hwloc_inc="-I$hwloc_dir/include"]),
AC_MSG_ERROR([hwloc headers not found.])
)
- AS_IF([test "$hwloc_dir" = "/usr"],
- # Using system installed hwloc
- AS_IF([test -r "/usr/lib64/libhwloc.so" -o -r "/usr/lib/libhwloc.so" -o -r "/usr/lib/x86_64-linux-gnu/libhwloc.so"],
- [hwloc_lib="-lhwloc"],
- AC_MSG_ERROR([hwloc shared object library not found.])
- ),
- # Using developer installed hwloc
- AS_IF([test -r "${hwloc_dir}/lib64/libhwloc_embedded.a"],
- [hwloc_lib="${hwloc_dir}/lib64/libhwloc_embedded.a"],
- AS_IF([test -r "${hwloc_dir}/lib/libhwloc_embedded.a"],
- [hwloc_lib="${hwloc_dir}/lib/libhwloc_embedded.a"],
- AC_MSG_ERROR([hwloc library not found.])
- )
- )
- )
+ AS_IF([test -r "$hwloc_dir/lib64/libhwloc.so"],
+ [hwloc_lib="-L$hwloc_dir/lib64 -lhwloc"],
+ [test -r "$hwloc_dir/lib/libhwloc.so"],
+ [hwloc_lib="-L$hwloc_dir/lib -lhwloc"],
+ AC_MSG_ERROR([hwloc shared object library not found.]))
AC_MSG_RESULT([$hwloc_dir])
- AS_CASE([x$target_os],
- [xlinux*],
- AC_CHECK_LIB([numa], [mbind], [hwloc_lib="$hwloc_lib -lnuma"])
- AC_CHECK_LIB([udev], [udev_new], [hwloc_lib="$hwloc_lib -ludev"])
- AC_CHECK_LIB([pciaccess], [pci_system_init], [hwloc_lib="$hwloc_lib -lpciaccess"])
- )
AC_SUBST(hwloc_flags)
AC_SUBST(hwloc_inc)
AC_SUBST(hwloc_lib)
--- a/m4/with_libical.m4
+++ b/m4/with_libical.m4
@@ -59,23 +59,13 @@ AC_DEFUN([PBS_AC_WITH_LIBICAL],
AS_IF([test $libical_version -gt 1],
AC_DEFINE([LIBICAL_API2], [], [Defined when libical version >= 2])
)
- AS_IF([test "$libical_dir" = "/usr"],
- dnl Using system installed libical
- libical_inc=""
- AS_IF([test -r "/usr/lib64/libical.so" -o -r "/usr/lib/libical.so" -o -r "/usr/lib/x86_64-linux-gnu/libical.so"],
- [libical_lib="-lical"],
- AC_MSG_ERROR([libical shared object library not found.])
- ),
- dnl Using developer installed libical
- libical_inc="-I$libical_include"
- AS_IF([test -r "${libical_dir}/lib64/libical.a"],
- [libical_lib="${libical_dir}/lib64/libical.a"],
- AS_IF([test -r "${libical_dir}/lib/libical.a"],
- [libical_lib="${libical_dir}/lib/libical.a"],
- AC_MSG_ERROR([ical library not found.])
- )
- )
- )
+ AS_IF([test "$libical_dir" != "/usr"],
+ [libical_inc="-I$libical_include"])
+ AS_IF([test -r "$libical_dir/lib64/libical.so"],
+ [libical_lib="-L$libical_dir/lib64 -lical"],
+ [test -r "$libical_dir/lib/libical.so"],
+ [libical_lib="-L$libical_dir/lib -lical"],
+ AC_MSG_ERROR([libical shared object library not found.]))
AC_MSG_RESULT([$libical_dir])
AC_SUBST(libical_inc)
AC_SUBST(libical_lib)
--- a/m4/with_tcl.m4
+++ b/m4/with_tcl.m4
@@ -52,9 +52,7 @@ AC_DEFUN([PBS_AC_WITH_TCL],
[. "$tcl_dir/lib64/tclConfig.sh"],
AS_IF([test -r "$tcl_dir/lib/tclConfig.sh"],
[. "$tcl_dir/lib/tclConfig.sh"],
- AS_IF([test -r "$tcl_dir/lib/x86_64-linux-gnu/tclConfig.sh"],
- [. "$tcl_dir/lib/x86_64-linux-gnu/tclConfig.sh"],
- AC_MSG_ERROR([tclConfig.sh not found]))))
+ AC_MSG_ERROR([tclConfig.sh not found])))
AC_MSG_RESULT([$tcl_dir])
AC_MSG_CHECKING([for Tcl version])
AS_IF([test "x$TCL_VERSION" = "x"],
@@ -62,32 +60,34 @@ AC_DEFUN([PBS_AC_WITH_TCL],
AC_MSG_RESULT([$TCL_VERSION])
[tcl_version="$TCL_VERSION"]
AC_SUBST(tcl_version)
+
+ AC_ARG_WITH([tk],
+ AS_HELP_STRING([--with-tk=DIR],
+ [Specify the directory where Tk is installed.]
+ )
+ )
+ AS_IF([test "x$with_tk" != "x"],
+ tk_dir=["$with_tk"],
+ tk_dir=["/usr"]
+ )
AC_MSG_CHECKING([for Tk])
- AS_IF([test -r "$tcl_dir/lib64/tkConfig.sh"],
- [. "$tcl_dir/lib64/tkConfig.sh"],
- AS_IF([test -r "$tcl_dir/lib/tkConfig.sh"],
- [. "$tcl_dir/lib/tkConfig.sh"],
- AS_IF([test -r "$tcl_dir/lib/x86_64-linux-gnu/tkConfig.sh"],
- [. "$tcl_dir/lib/x86_64-linux-gnu/tkConfig.sh"],
- AC_MSG_ERROR([tkConfig.sh not found]))))
- AC_MSG_RESULT([$tcl_dir])
+ AS_IF([test -r "$tk_dir/lib64/tkConfig.sh"],
+ [. "$tk_dir/lib64/tkConfig.sh"],
+ AS_IF([test -r "$tk_dir/lib/tkConfig.sh"],
+ [. "$tk_dir/lib/tkConfig.sh"],
+ AC_MSG_ERROR([tkConfig.sh not found])))
+ AC_MSG_RESULT([$tk_dir])
AC_MSG_CHECKING([for Tk version])
AS_IF([test "x$TK_VERSION" = "x"],
AC_MSG_ERROR([Could not determine Tk version]))
AC_MSG_RESULT([$TK_VERSION])
[tk_version="$TK_VERSION"]
AC_SUBST(tk_version)
- AS_IF([test x$TCL_INCLUDE_SPEC = x],
- # Using developer installed tcl
- [tcl_inc="-I$tcl_dir/include"]
- [tcl_lib="$tcl_dir/lib/libtcl$TCL_VERSION.a $TCL_LIBS"]
- [tk_inc="-I$tcl_dir/include"]
- [tk_lib="$tcl_dir/lib/libtcl$TCL_VERSION.a $tcl_dir/lib/libtk$TK_VERSION.a $TK_LIBS"],
- # Using system installed tcl
- [tcl_inc="$TCL_INCLUDE_SPEC"]
- [tcl_lib="$TCL_LIB_SPEC $TCL_LIBS"]
- [tk_inc="$TK_INCLUDE_SPEC"]
- [tk_lib=`echo "$TCL_LIB_SPEC $TK_LIB_SPEC $TK_LIBS" | ${SED} -e 's/-lXss //'`])
+
+ tcl_inc="$TCL_INCLUDE_SPEC"
+ tcl_lib="$TCL_LIB_SPEC $TCL_LIBS"
+ tk_inc="$TK_INCLUDE_SPEC"
+ tk_lib=`echo "$TCL_LIB_SPEC $TK_LIB_SPEC $TK_LIBS" | ${SED} -e 's/-lXss //'`
AC_SUBST(tcl_inc)
AC_SUBST(tcl_lib)
AC_SUBST(tk_inc)

View File

@ -0,0 +1,11 @@
--- a/Makefile.in
+++ b/Makefile.in
@@ -61,7 +61,7 @@ install-sendmail: install
$(LN_S) ssmtp $(bindir)/sendmail
$(INSTALL) -d -m 755 $(libexecdir)
$(RM) $(libexecdir)/sendmail
- $(LN_S) sendmail /lib/sendmail
+ $(LN_S) $(bindir)/sendmail $(libexecdir)/sendmail
$(RM) $(mandir)/sendmail.8
$(LN_S) ssmtp.8 $(mandir)/sendmail.8

View File

@ -0,0 +1,58 @@
# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
from spack import *
class Ssmtp(AutotoolsPackage):
"""A program that replaces sendmail on workstations that should send their
mail via the departmental mailhub from which they pick up their mail."""
homepage = "https://salsa.debian.org/debian/ssmtp"
url = "http://deb.debian.org/debian/pool/main/s/ssmtp/ssmtp_2.64.orig.tar.bz2"
version('2.64', sha256='22c37dc90c871e8e052b2cab0ad219d010fa938608cd66b21c8f3c759046fa36')
variant('ssl', default=True,
description='Enable support for secure connection to mail server')
variant('inet6', default=True,
description='Enable support for IPv6 transport')
variant('md5auth', default=True,
description='Enable support for MD5 authentication')
depends_on('libnsl')
depends_on('openssl', when='+ssl')
patch('install.patch')
@when('+ssl')
def setup_build_environment(self, env):
# The configure script is generated with a very old version of
# autoconf, which cannot accept LIBS as a command-line argument
env.set('LIBS', self.spec['openssl'].libs.link_flags)
def configure_args(self):
args = self.enable_or_disable('ssl')
args += self.enable_or_disable('inet6')
args += self.enable_or_disable('md5auth')
return args
def install(self, spec, prefix):
install_answers = [
# Please enter the mail name of your system.
# This is the hostname portion of the address to be shown
# on outgoing news and mail messages headers.
# The default is your system's host name.
#
# Mail name [system.host.name]:
'\n',
# Please enter the SMTP port number [25]:
'\n'
]
install_answers_filename = 'spack-install.in'
with working_dir(self.build_directory):
with open(install_answers_filename, 'w') as f:
f.writelines(install_answers)
make('install-sendmail', input=install_answers_filename)