spack/var/spack/repos/builtin/packages/gaussian-src/package.py
Todd Gamblin 24c01d57cf
imports: sort imports everywhere in Spack (#24695)
* 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.
2021-07-08 22:12:30 +00:00

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)