You need to sign in or sign up before continuing.
setup.py 4.84 KB
Newer Older
1 2
import os
import sys
3
try:
4
    if '--no-setuptools' in sys.argv:
5
        sys.argv.remove('--no-setuptools')
6
        raise ImportError() # Don't import setuptools...
7 8 9 10 11 12 13 14 15 16 17
    from setuptools import setup, Extension
    kws = dict(entry_points={
            'console_scripts' : ['parmed = parmed.scripts:clapp'],
            'gui_scripts' : ['xparmed = parmed.scripts:guiapp']}
    )
except ImportError:
    from distutils.core import setup, Extension
    kws = {'scripts' : [os.path.join('scripts', 'parmed'),
                        os.path.join('scripts', 'xparmed')]
    }

18
if sys.version_info < (2, 7):
19 20 21
    sys.stderr.write('You must have at least Python 2.7 for ParmEd to work '
                     'correctly.\n')
    sys.exit(0)
22

23 24 25
is_pypy = '__pypy__' in sys.builtin_module_names

if sys.platform == 'darwin' and not is_pypy:
26 27 28 29 30 31 32
    # You *need* to use clang and clang++ for ParmEd extensions on a Mac;
    # Anaconda does annoying stuff that breaks this, since their distutils
    # automatically tries to use "gcc", which would conflict with the MacPorts
    # gcc... sigh.
    os.environ['CXX'] = 'clang++'
    os.environ['CC'] = 'clang'

Jason Swails's avatar
Jason Swails committed
33
# parmed package and all its subpackages
34 35 36 37
packages = ['parmed', 'parmed.amber', 'parmed.modeller',
            'parmed.tinker', 'parmed.unit', 'parmed.amber.mdin',
            'parmed.charmm', 'parmed.formats.pdbx', 'parmed.rosetta',
            'parmed.formats', 'parmed.utils.fortranformat', 'parmed.openmm',
38
            'parmed.utils', 'parmed.gromacs', 'parmed.tools', 'parmed.namd',
39
            'parmed.tools.gui', 'parmed.tools.simulations']
40

41
# Optimized readparm
42 43 44 45 46
sources = [os.path.join('src', '_rdparm.cpp'),
           os.path.join('src', 'readparm.cpp')]
depends = [os.path.join('src', 'CompatabilityMacros.h'),
           os.path.join('src', 'readparm.h')]
include_dirs = [os.path.join(os.path.abspath('.'), 'src')]
47

48 49 50 51 52
extensions = [Extension('parmed.amber._rdparm',
                        sources=sources,
                        include_dirs=include_dirs,
                        depends=depends)
]
53

54
if __name__ == '__main__':
55

56
    import shutil
57
    import parmed
58

59 60 61
    # See if we have the Python development headers.  If not, don't build the
    # optimized prmtop parser extension
    from distutils import sysconfig
62
    if not is_pypy and not os.path.exists(
63
            os.path.join(sysconfig.get_config_vars()['INCLUDEPY'], 'Python.h')):
64 65
        extensions = []

66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
    # Delete old versions with old names of scripts and packages (chemistry and
    # ParmedTools for packages, parmed.py and xparmed.py for scripts)
    def deldir(folder):
        try:
            shutil.rmtree(folder)
        except OSError:
            sys.stderr.write(
                    'Could not remove old package %s; you should make sure\n'
                      'this is completely removed in order to make sure you\n'
                      'do not accidentally use the old version of ParmEd\n' %
                      folder
            )
    def delfile(file):
        try:
            os.unlink(file)
        except OSError:
            sys.stderr.write(
                    'Could not remove old script %s; you should make sure\n'
                      'this is completely removed in order to make sure you\n'
                      'do not accidentally use the old version of ParmEd\n' %
                      file
            )

89 90 91 92 93
    for folder in sys.path:
        folder = os.path.realpath(os.path.abspath(folder))
        if folder == os.path.realpath(os.path.abspath('.')): continue
        chem = os.path.join(folder, 'chemistry')
        pmdtools = os.path.join(folder, 'ParmedTools')
94 95
        pmd = os.path.join(folder, 'parmed.py')
        xpmd = os.path.join(folder, 'xparmed.py')
96 97
        pmdc = os.path.join(folder, 'parmed.pyc')
        xpmdc = os.path.join(folder, 'xparmed.pyc')
98 99 100 101
        if os.path.isdir(chem): deldir(chem)
        if os.path.isdir(pmdtools): deldir(pmdtools)
        if os.path.exists(pmd): delfile(pmd)
        if os.path.exists(xpmd): delfile(xpmd)
102 103
        if os.path.exists(pmdc): delfile(pmdc)
        if os.path.exists(xpmdc): delfile(xpmdc)
104 105 106 107

    for folder in os.getenv('PATH').split(os.pathsep):
        pmd = os.path.join(folder, 'parmed.py')
        xpmd = os.path.join(folder, 'xparmed.py')
108 109
        pmdc = os.path.join(folder, 'parmed.pyc')
        xpmdc = os.path.join(folder, 'xparmed.pyc')
110 111
        if os.path.exists(pmd): delfile(pmd)
        if os.path.exists(xpmd): delfile(xpmd)
112 113
        if os.path.exists(pmdc): delfile(pmdc)
        if os.path.exists(xpmdc): delfile(xpmdc)
114

Jason Swails's avatar
Jason Swails committed
115
    setup(name='ParmEd',
116
          version=parmed.__version__,
Jason Swails's avatar
Jason Swails committed
117 118 119 120
          description='Amber parameter file editor',
          author='Jason Swails',
          author_email='jason.swails -at- gmail.com',
          url='http://jswails.wikidot.com/parmed',
121
          license='LGPL (or GPL if released with AmberTools)',
Jason Swails's avatar
Jason Swails committed
122 123
          packages=packages,
          ext_modules=extensions,
124
          **kws
125
    )