
* fix remaining flake8 errors * imports: sort imports everywhere in Spack We enabled import order checking in #23947, but fixing things manually drives people crazy. This used `spack style --fix --all` from #24071 to automatically sort everything in Spack so PR submitters won't have to deal with it. This should go in after #24071, as it assumes we're using `isort`, not `flake8-import-order` to order things. `isort` seems to be more flexible and allows `llnl` mports to be in their own group before `spack` ones, so this seems like a good switch.
158 lines
5.1 KiB
Python
158 lines
5.1 KiB
Python
# Copyright 2013-2021 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 glob
|
|
import os
|
|
|
|
import llnl.util.tty as tty
|
|
|
|
from spack import *
|
|
|
|
|
|
class GaussianSrc(Package):
|
|
"""Gaussian is a computer program for computational chemistry.
|
|
|
|
This Spack package builds Gaussian from source.
|
|
|
|
Needs post-install steps to make it run!
|
|
See package installation log for details."""
|
|
|
|
homepage = "http://www.gaussian.com/"
|
|
manual_download = True
|
|
|
|
maintainers = ['dev-zero']
|
|
|
|
version('16-C.01', sha256='c9eb73a9df5ca8705fcf2d7ce2d5f9aceb05ae663689f54c0a581c9d4d44fffb')
|
|
|
|
depends_on('tcsh', type='build')
|
|
|
|
# All compilers except for pgi are in conflict:
|
|
for __compiler in spack.compilers.supported_compilers():
|
|
if __compiler != 'pgi':
|
|
conflicts('%{0}'.format(__compiler),
|
|
msg='Gaussian can only be built with the PGI compiler')
|
|
|
|
patch('16-C.01-replace-deprecated-pgf77-with-pgfortran.patch', when='@16-C.01')
|
|
patch('16-C.01-fix-building-c-code-with-pgcc.patch', when='@16-C.01')
|
|
patch('16-C.01-fix-shebangs.patch', when='@16-C.01')
|
|
|
|
@property
|
|
def g_name(self):
|
|
return 'g{0}'.format(self.version.up_to(1))
|
|
|
|
@property
|
|
def g_root(self):
|
|
return self.prefix.join(self.g_name)
|
|
|
|
def url_for_version(self, version):
|
|
return "file://{0}/g{1}.tgz".format(os.getcwd(), version)
|
|
|
|
def install(self, spec, prefix):
|
|
# Spacks strips the single dir inside the tarball, but Gaussian
|
|
# needs it -> move them back
|
|
files = os.listdir()
|
|
mkdirp(self.g_name)
|
|
for f in files:
|
|
os.rename(f, join_path(self.g_name, f))
|
|
|
|
opts = ['all']
|
|
# if spec.satisfies('+cuda'):
|
|
# opts += [spec.variants['cuda_family'].value]
|
|
|
|
with working_dir(self.g_name):
|
|
# can only build with tcsh
|
|
tcsh = which('tcsh')
|
|
tcsh('-c', 'source ${0}root/{0}/bsd/{0}.login ;'
|
|
'./bsd/bld{0} {1}'.format(self.g_name, ' '.join(opts)))
|
|
|
|
install_tree('./bsd', self.g_root.bsd)
|
|
install_tree('./basis', self.g_root.basis)
|
|
install_tree('./doc', self.g_root.doc)
|
|
|
|
for exe in glob.glob('*.exe'):
|
|
install(exe, self.g_root)
|
|
|
|
exes = [
|
|
self.g_name,
|
|
'gauopt',
|
|
'gauoptl',
|
|
'ghelp',
|
|
'newzmat',
|
|
'testrt',
|
|
'cubegen',
|
|
'cubman',
|
|
'c8616',
|
|
'ham506',
|
|
'rwfdump',
|
|
'freqchk',
|
|
'freqmem',
|
|
'formchk',
|
|
'demofc',
|
|
'chkchk',
|
|
'solname',
|
|
'gautraj',
|
|
'copychk',
|
|
'pluck',
|
|
'rdmat',
|
|
'wrmat',
|
|
'unfchk',
|
|
'gdrgen',
|
|
'trajgen',
|
|
'mm',
|
|
'grate',
|
|
]
|
|
for exe in exes:
|
|
install(exe, self.g_root)
|
|
|
|
@run_after('install')
|
|
def caveats(self):
|
|
perm_script = 'spack_perms_fix.sh'
|
|
perm_script_path = join_path(self.spec.prefix, perm_script)
|
|
with open(perm_script_path, 'w') as f:
|
|
env = spack.tengine.make_environment(dirs=self.package_dir)
|
|
t = env.get_template(perm_script + '.j2')
|
|
f.write(t.render({'prefix': self.g_root}))
|
|
chmod = which('chmod')
|
|
chmod('0555', perm_script_path)
|
|
|
|
tty.warn("""
|
|
For a working Gaussian installation, all executable files can only be accessible by
|
|
the owner and the group but not the world.
|
|
|
|
We've installed a script that will make the necessary changes;
|
|
read through it and then execute it:
|
|
|
|
{0}
|
|
|
|
If you have to give others access, please customize the group membership of the package
|
|
files as documented here:
|
|
|
|
https://spack.readthedocs.io/en/latest/build_settings.html#package-permissions"""
|
|
.format(perm_script_path))
|
|
|
|
def setup_build_environment(self, env):
|
|
env.set('{0}root'.format(self.g_name), self.stage.source_path)
|
|
|
|
def setup_run_environment(self, env):
|
|
# defaults taken from G16's g16.profile
|
|
env.set('GAUSS_LFLAGS2', '--LindaOptions -s 10000000')
|
|
env.set('_DSM_BARRIER', 'SHM')
|
|
env.set('PGI_TERM', 'trace,abort')
|
|
|
|
env.set('{0}root'.format(self.g_name), self.prefix)
|
|
|
|
env.prepend_path('GAUSS_EXEDIR', self.g_root)
|
|
env.prepend_path('GAUSS_EXEDIR', self.g_root.bsd)
|
|
|
|
env.prepend_path('PATH', self.g_root)
|
|
env.prepend_path('PATH', self.g_root.bsd)
|
|
|
|
env.set('GAUSS_LEXEDIR', self.g_root.join('linda-exe'))
|
|
env.set('GAUSS_ARCHDIR', self.g_root.arch)
|
|
env.set('GAUSS_BSDDIR', self.g_root.bsd)
|
|
env.set('G{0}BASIS'.format(self.version.up_to(1)), self.g_root.basis)
|
|
|
|
env.prepend_path('LD_LIBRARY_PATH', self.g_root)
|
|
env.prepend_path('LD_LIBRARY_PATH', self.g_root.bsd)
|