#

"""
setup.py: Used for building python wrappers for Simbios' OpenMM library.
"""
__author__ = "Randall J. Radmer"
__version__ = "1.0"
__doc__="""General setup script."""


import os, sys, platform
from distutils.core import setup

MAJOR_VERSION_NUM='0'
MINOR_VERSION_NUM='5'

def doSetup(major_version_num=MAJOR_VERSION_NUM,
            minor_version_num=MINOR_VERSION_NUM):
    from distutils.core import Extension
    setupKeywords = {}
    setupKeywords["name"]              = "simtk"
    setupKeywords["version"]           = "%s.%s" % (major_version_num, minor_version_num)
    setupKeywords["author"]            = "Randall J. Radmer"
    setupKeywords["author_email"]      = "radmer@stanford.edu"
    setupKeywords["license"]           = "Python Software Foundation License (BSD-like)"
    setupKeywords["url"]               = "https://simtk.org/home/pyopenmm"
    setupKeywords["download_url"]      = "https://simtk.org/home/pyopenmm"
    setupKeywords["packages"]          = ["simtk",
                                          "simtk.utils",
                                          "simtk.utils.amber"]
    if os.path.isdir('simtk/nast'):
        setupKeywords["packages"].append("simtk.nast")
    setupKeywords["data_files"]        = []
    setupKeywords["platforms"]         = ["Linux", "Mac OS X", "Windows"]
    setupKeywords["description"]       = "Python wrapper for OpenMM (a C++ MD package)"
    setupKeywords["long_description"]  = \
    """OpenMM is a library which provides tools for modern molecular
    modeling simulation. As a library it can be hooked into any code,
    allowing that code to do molecular modeling with minimal extra
    coding (https://simtk.org/home/openmm).  This Python module
    gives access to the OpenMM API.
    """
    
    include_dirs=['include/openmmapi/include',
                  'include/olla/include']
    define_macros = [('MAJOR_VERSION', major_version_num),
                     ('MINOR_VERSION', minor_version_num)]
    vmdimd_libraries = []
    ldLibraryPath = os.getenv('LD_LIBRARY_PATH')
    if sys.platform == "win32":
        library_dirs=['lib/win']
        cuda_lib_dir="lib/win/gpu_lib/cuda_lib"
        user_home = os.getenv('USERPROFILE')
        vmdimd_libraries.append('wsock32')
        define_macros.append( ('WIN32', None) )
        define_macros.append( ('_WINDOWS', None) )
        define_macros.append( (' _MSC_VER', None) )
	define_macros.append( ('OPENMM_BUILDING_STATIC_LIBRARY', None) )
    else:
        if sys.platform == 'darwin':
            library_dirs=['lib/osx']
            cuda_lib_dir="lib/osx/gpu_lib/cuda_lib"
        else:
            if platform.architecture()[0]=='32bit':
                library_dirs=['lib/linux']
                cuda_lib_dir="lib/linux/gpu_lib/cuda_lib"
            elif platform.architecture()[0]=='64bit':
                library_dirs=['lib/linux64']
                cuda_lib_dir="lib/linux64/gpu_lib/cuda_lib"
            else:
                raise Exception, "Error: %s platforms are not currently supported" % platform.architecture()

        if ldLibraryPath:
            for item in ldLibraryPath.split(":"):
                if item: 
                    library_dirs.append(item)
        user_home = os.getenv('HOME')

    #libraries = ['OpenMM_static_d']
    libraries = ['OpenMM_static']
    setupKeywords["ext_modules"] = [
                                    Extension(name = "simtk._openmm",
                                              sources = ["src/swig_openmm/openmm_wrap.cxx"],
                                              include_dirs = include_dirs[:],
                                              define_macros = define_macros[:],
                                              library_dirs = library_dirs[:],
                                              libraries = libraries[:],
                                              ),
                                    Extension(name = "simtk.utils._vmdimd_raw",
                                              sources = ["src/vmdimd/vmdimd_raw_wrap.c",
                                                         "src/vmdimd/imd.c",
                                                         "src/vmdimd/vmdsock.c"],
                                              include_dirs = ["utils/vmdimd"],
                                              libraries = vmdimd_libraries,
                                              ),
                                    Extension(name = "simtk.utils.rmsd",
                                              sources = ["simtk/utils/rmsd/rmsd_wrap.c",
                                                         "simtk/utils/rmsd/rmsd.c"],
                                              include_dirs = ["simtk/utils/rmsd"],
                                              )
                                    ]

    if ldLibraryPath and os.path.isdir(cuda_lib_dir):
        include_dirs.append('include/platforms/cuda/include')
        define_macros.append( ("USE_CUDA_PLATFORM", None) )
        library_dirs.append(cuda_lib_dir)
        #libraries.extend(['OpenMMCuda_static_d',
        libraries.extend(['OpenMMCuda_static',
                          'cudpp',
                          'cutil',
                          'cudart'])

        setupKeywords["ext_modules"].append(Extension(name = "simtk._openmm_cuda",
                                                      sources = ["src/swig_openmm/openmm_cuda_wrap.cxx"],
                                                      include_dirs = include_dirs,
                                                      define_macros = define_macros,
                                                      library_dirs = library_dirs,
                                                      libraries = libraries,
                                                      ))


    return setupKeywords
    

if __name__ == '__main__':
    if sys.version_info[:2] < (2, 5):
        sys.stdout.write("ERROR: OpenMM-Python requires Python 2.5 or better.  Exiting!\n")
        sys.exit(1)
    setupKeywords=doSetup()
    setup(**setupKeywords)

