setup.py.in 6.41 KB
#############################################################################
# Disutils setup file for ctools Python extension module                    #
# ------------------------------------------------------------------------- #
# Copyright (C) 2011-2016 Juergen Knoedlseder                               #
# ------------------------------------------------------------------------- #
#                                                                           #
#  This program is free software: you can redistribute it and/or modify     #
#  it under the terms of the GNU General Public License as published by     #
#  the Free Software Foundation, either version 3 of the License, or        #
#  (at your option) any later version.                                      #
#                                                                           #
#  This program is distributed in the hope that it will be useful,          #
#  but WITHOUT ANY WARRANTY; without even the implied warranty of           #
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            #
#  GNU General Public License for more details.                             #
#                                                                           #
#  You should have received a copy of the GNU General Public License        #
#  along with this program.  If not, see <http://www.gnu.org/licenses/>.    #
#                                                                           #
#############################################################################
from distutils.core import setup, Extension
from distutils import sysconfig
import glob
import os
import sys

# Detect execution mode
is_build = True
if (len(sys.argv) >= 2):
    if (sys.argv[1] == 'install'):
        is_build = False
if is_build:
    sys.stdout.write("Python extension module building:\n")
else:
    sys.stdout.write("Python extension module installation:\n")

# Darwin MacPorts kluge: Remove -L/opt/local/lib path from LDSHARED as this
# overrides the GammaLib settings. Otherwise, MacPorts libraries would be
# used instead of the libraries selected by GammaLib
if sys.platform.lower().startswith("darwin"):
    
    # Get configuration variables
    cvars = sysconfig.get_config_vars()
    
    # Extract LDSHARED
    ldshared_old = cvars.get('LDSHARED')
    ldshared_new = ''
    ldshared_rm  = ''
    for option in ldshared_old.split(' '):
        if option.lstrip().find('-L/opt/local/lib') != 0:
            ldshared_new += option + ' '
        else:
            ldshared_rm += option + ' '
    if (len(ldshared_rm) > 0):
        sys.stdout.write("Removed following option(s) from LDSHARED: "+ldshared_rm+"\n")
    
    # Set LDSHARED
    cvars['LDSHARED'] = ldshared_new

# Set default include directories and data files
include_dirs         = ['@prefix@/include/gammalib']
install_files        = glob.glob('@top_srcdir@/pyext/*.i')
library_dirs         = ['../src/.libs']
runtime_library_dirs = ['../src/.libs']
libraries            = ['ctools','gamma']

# Add install directory to runtime library path
if os.path.exists('@prefix@/lib'):
    library_dirs.append('@prefix@/lib')
    runtime_library_dirs.append('@prefix@/lib')

# Add application include files. The method we use here is not very
# intelligent as it simple will add all names that start with 'ct'
# in the src directory. Once we added the ctools script we had to
# add an explicit filter to avoid appending those.
dirs = glob.glob('../src/ct*')
for dir in dirs:
    if len(dir) > 0 and 'ctools' not in dir:
        path = os.path.abspath(dir)
        include_dirs.append(path)
include_dirs.append(os.path.abspath('../src/support'))

# Add extra libraries
extra_libs = ('@PYTHON_EXTRA_LIBS@').split(',')
for extra_lib in extra_libs:
    if len(extra_lib) > 0:
        libraries.append(extra_lib)

# Get extra library paths
extra_lib_paths = ('@LDFLAGS@').split(' ')
for extra_lib_path in extra_lib_paths:
    if extra_lib_path.lstrip().find('-L') == 0:
        dir = extra_lib_path.lstrip().lstrip('-L')
        if len(dir) > 0:
            library_dirs.append(dir)
            runtime_library_dirs.append(dir)

# Get extra include directories
extra_include_dirs = ('@CPPFLAGS@').split(' ')
for extra_include_dir in extra_include_dirs:
    if extra_include_dir.lstrip().find('-I') == 0:
        dir = extra_include_dir.lstrip().lstrip('-I')
        if len(dir) > 0:
            include_dirs.append(dir)

# Set data files to install.
data_files=[('@prefix@/share/ctools/swig', install_files)]

# Optionally enable OpenMP
if '@OPENMP_TRUE@' != '#':
    extra_compile_args = ['@OPENMP_CXXFLAGS@']
    extra_link_args    = ['@OPENMP_CXXFLAGS@']
else:
    extra_compile_args = []
    extra_link_args    = []

# Append coverage CXXFLAGS
if len('@COVERAGE_CXXFLAGS@') > 0:
    extra_compile_args.append('@COVERAGE_CXXFLAGS@')
    extra_link_args.append('@COVERAGE_CXXFLAGS@')

# Optionally add link flag for El Capitan post-processing of modules
if '@IS_ELCAPITAN_TRUE@' != '#':
    extra_link_args.append('-headerpad_max_install_names')

# Setup
setup(name='@PACKAGE_NAME@',
      version='@PACKAGE_VERSION@',
      description='ctools Python module',
      author='Juergen Knoedlseder',
      author_email='@PACKAGE_BUGREPORT@',
      url='http://cta.irap.omp.eu/ctools/',
      py_modules=['ctools.tools'],
      ext_modules=[Extension('ctools._tools', ['ctools/tools_wrap.cpp'],
                             include_dirs=include_dirs,
                             library_dirs=library_dirs,
                             libraries=libraries,
                             runtime_library_dirs=runtime_library_dirs,
                             extra_compile_args=extra_compile_args,
                             extra_link_args=extra_link_args)],
      data_files=data_files,
      license="GNU GPL v3",
      long_description="CTA science analysis tools",
      platforms=["Linux", "Solaris", "Mac OS-X", "Unix", "BSD"],
      )

# Post-processing. A symbolic link is created to the directory containing the
# shared wrapper libraries so that we can add this directory to the PYTHONPATH
# for testing.
if is_build:
    try:
        os.chdir('build')
        os.remove('ctools')
        sys.stdout.write("Removed symbolic link build/ctools.\n")
    except:
        pass
    try:
        path = glob.glob('lib.*')
        os.symlink(path[0], 'ctools')
        sys.stdout.write("Created symbolic link build/ctools.\n")
    except:
        sys.stdout.write("WARNING: Failed to create symbolic link build/ctools.\n")