Commit 2a9577c7217921ba6f62b1a67fb91f4c5c73129d

Authored by knodlseder
1 parent 39ec93c0

break down interface into modules

pyext/Makefile.am
@@ -5,38 +5,43 @@ @@ -5,38 +5,43 @@
5 5
6 if WITH_PYTHON 6 if WITH_PYTHON
7 7
8 -# Set SWIG interface filename  
9 -SWIG_INTERFACE = gammalib.i  
10 -  
11 -# Define the targets that should be built before anything else.  
12 -# These are honored by 'make all', 'make check' and 'make install'.  
13 -if HAVE_SWIG  
14 - BUILT_SOURCES = gammalib_wrap.cpp gammalib.py  
15 -endif  
16 -  
17 -# Set files to be removed in clean  
18 -if HAVE_SWIG  
19 - CLEANFILES = gammalib_wrap.cpp gammalib.py  
20 -endif  
21 -  
22 -# Set extra files to distribute  
23 -#EXTRA_DIST = runme.py  
24 -  
25 -# Set instrument specific SWIG options (those will be catched in gammalib.i) 8 +# Set instrument specific SWIG targets
26 if WITH_INST_MWL 9 if WITH_INST_MWL
27 - OPT_MWL = -DWITH_INST_MWL  
28 - INC_MWL = -I$(top_srcdir)/inst/mwl/pyext 10 + MWL_SWIG_TARGETS = $(top_srcdir)/inst/mwl/pyext/mwl_wrap.cpp \
  11 + $(top_srcdir)/inst/mwl/pyext/mwl.py
29 endif 12 endif
30 if WITH_INST_CTA 13 if WITH_INST_CTA
31 - OPT_CTA = -DWITH_INST_CTA  
32 - INC_CTA = -I$(top_srcdir)/inst/cta/pyext 14 + CTA_SWIG_TARGETS = $(top_srcdir)/inst/cta/pyext/cta_wrap.cpp \
  15 + $(top_srcdir)/inst/cta/pyext/cta.py
33 endif 16 endif
34 if WITH_INST_LAT 17 if WITH_INST_LAT
35 - OPT_LAT = -DWITH_INST_LAT  
36 - INC_LAT = -I$(top_srcdir)/inst/lat/pyext 18 + LAT_SWIG_TARGETS = $(top_srcdir)/inst/lat/pyext/lat_wrap.cpp \
  19 + $(top_srcdir)/inst/lat/pyext/lat.py
  20 +endif
  21 +INST_SWIG_TARGETS = $(MWL_SWIG_TARGETS) $(CTA_SWIG_TARGETS) $(LAT_SWIG_TARGETS)
  22 +
  23 +# Sources that are required for the build. All targets in the list will be built
  24 +# before anything. These are honored by 'make all', 'make check' and 'make install'.
  25 +# We use this here to make sure that all these targets are build by swig before we
  26 +# start compiling the Python modules.
  27 +BUILT_SOURCES = gammalib/app_wrap.cpp gammalib/app.py \
  28 + gammalib/fits_wrap.cpp gammalib/fits.py \
  29 + gammalib/linalg_wrap.cpp gammalib/linalg.py \
  30 + gammalib/model_wrap.cpp gammalib/model.py \
  31 + gammalib/numerics_wrap.cpp gammalib/numerics.py \
  32 + gammalib/obs_wrap.cpp gammalib/obs.py \
  33 + gammalib/opt_wrap.cpp gammalib/opt.py \
  34 + gammalib/sky_wrap.cpp gammalib/sky.py \
  35 + gammalib/support_wrap.cpp gammalib/support.py \
  36 + gammalib/xml_wrap.cpp gammalib/xml.py \
  37 + $(INST_SWIG_TARGETS)
  38 +
  39 +# Set files to be removed in clean. We remove only the SWIG interface files if swig
  40 +# is available to rebuild them.
  41 +if HAVE_SWIG
  42 + CLEAN_FILES = $(BUILT_SOURCES)
37 endif 43 endif
38 -INC_INST = $(INC_MWL) $(INC_CTA) $(INC_LAT)  
39 -OPT_INST = $(OPT_MWL) $(OPT_CTA) $(OPT_LAT) 44 +CLEANFILES = $(CLEAN_FILES)
40 45
41 all-local: build 46 all-local: build
42 47
@@ -45,19 +50,23 @@ all-local: build @@ -45,19 +50,23 @@ all-local: build
45 # of this specific directory. So we build one instance for checking, the other 50 # of this specific directory. So we build one instance for checking, the other
46 # for installation. If we could get the name built by distutils we could avoid 51 # for installation. If we could get the name built by distutils we could avoid
47 # this. 52 # this.
48 -build: gammalib_wrap.cpp gammalib.py  
49 - $(PYTHON_BUILD_PREFIX) $(PYTHON) setup.py build --build-platlib build  
50 - $(PYTHON_BUILD_PREFIX) $(PYTHON) setup.py build 53 +#$(PYTHON_BUILD_PREFIX) $(PYTHON) setup.py build_ext --build-platlib build
  54 +build: $(BUILT_SOURCES)
  55 + $(PYTHON_BUILD_PREFIX) $(PYTHON) setup.py build_ext
  56 +
  57 +# make check installs the gammalib extension for checking in the install directory
  58 +check-local:
  59 + $(PYTHON) setup.py install --home=install
51 60
52 install-exec-local: 61 install-exec-local:
53 $(PYTHON) setup.py install --prefix=$(prefix) 62 $(PYTHON) setup.py install --prefix=$(prefix)
54 63
55 clean-local: 64 clean-local:
56 - rm -rf build 65 + rm -rf build install
57 66
58 if HAVE_SWIG 67 if HAVE_SWIG
59 -gammalib_wrap.cpp gammalib.py: $(SWIG_INTERFACE)  
60 - $(SWIG) -c++ -python -Wall -I$(top_srcdir)/src $(INC_INST) $(OPT_INST) -o gammalib_wrap.cpp -outdir . $(srcdir)/$(SWIG_INTERFACE) 68 +%_wrap.cpp %.py: %.i
  69 + $(SWIG) -c++ -python -Wall -o $@ -outdir gammalib $<
61 endif # HAVE_SWIG 70 endif # HAVE_SWIG
62 71
63 endif # WITH_PYTHON 72 endif # WITH_PYTHON
pyext/setup.py.in
@@ -4,41 +4,27 @@ import glob @@ -4,41 +4,27 @@ import glob
4 import os 4 import os
5 import sys 5 import sys
6 6
7 -# Removes list of bad prefixes from list  
8 -def remove_prefixes(optlist, bad_prefixes):  
9 - for bad_prefix in bad_prefixes:  
10 - for i, flag in enumerate(optlist):  
11 - if flag.startswith(bad_prefix):  
12 - optlist.pop(i)  
13 - break  
14 - return optlist  
15 -  
16 -# Adjust compile options for darwin  
17 -#if sys.platform.lower().startswith("darwin"):  
18 -#  
19 -# # Remove some time consuming options  
20 -# cvars = sysconfig.get_config_vars()  
21 -# cflags = cvars.get('OPT')  
22 -# if cflags:  
23 -# cflags = remove_prefixes(cflags.split(),  
24 -# ['-g', '-O', '-Wstrict-prototypes', '-DNDEBUG'])  
25 -# cvars['OPT'] = str.join(' ', cflags)  
26 -# cvars['CFLAGS'] = cvars['BASECFLAGS'] + ' ' + cvars['OPT']  
27 -#  
28 -# # Remove -arch flags. This prevents building a fat library  
29 -# cvars['ARCHFLAGS'] = ''  
30 -#  
31 -# # Signal darwin compiler adjustments  
32 -# print 'Adjust default distutils compiler options for darwin.' 7 +# Define package name
  8 +pkg_name = 'gammalib'
  9 +
  10 +# Define core modules
  11 +core_modules = ['app', 'fits', 'linalg', 'model', 'numerics', \
  12 + 'obs', 'opt', 'sky', 'support', 'xml']
  13 +
  14 +# Check on test install
  15 +if (len(sys.argv) == 3):
  16 + if (sys.argv[2] == '--home=install'):
  17 + print "This install is for unit testing."
  18 +
33 19
34 # Set GammaLib library name. If we're about to make the test build then 20 # Set GammaLib library name. If we're about to make the test build then
35 # create a symbolic link to the static library to enforce static linking. 21 # create a symbolic link to the static library to enforce static linking.
36 # This is required on some system (such as Mac OS X) to avoid problems 22 # This is required on some system (such as Mac OS X) to avoid problems
37 # with finding the shared library during unit testing. 23 # with finding the shared library during unit testing.
38 libgamma='gamma' 24 libgamma='gamma'
39 -if (len(sys.argv) > 3):  
40 - if (sys.argv[3] == 'build'):  
41 - 25 +if (len(sys.argv) > 1):
  26 + if (1 == 1):
  27 +
42 # Remove any existing symbolic link to libgamma.a. This will 28 # Remove any existing symbolic link to libgamma.a. This will
43 # prevent any exception in creating the symbolic link due to 29 # prevent any exception in creating the symbolic link due to
44 # an already existing link. 30 # an already existing link.
@@ -58,16 +44,17 @@ if (len(sys.argv) &gt; 3): @@ -58,16 +44,17 @@ if (len(sys.argv) &gt; 3):
58 print 'WARNING: Failed to create symbolic link to static library. Link dynamically.' 44 print 'WARNING: Failed to create symbolic link to static library. Link dynamically.'
59 45
60 # Set default include directories and data files 46 # Set default include directories and data files
61 -include_dirs = ['@top_srcdir@/include']  
62 -data_files = glob.glob('@top_srcdir@/pyext/*.i')  
63 -library_dirs = ['../src/.libs']  
64 -libraries = [libgamma] 47 +include_dirs = ['@top_srcdir@/include']
  48 +data_files = glob.glob('@top_srcdir@/pyext/*.i')
  49 +library_dirs = ['../src/.libs']
  50 +libraries = [libgamma]
65 51
66 # Set default runtime library directories 52 # Set default runtime library directories
67 if os.path.exists('@prefix@/lib'): 53 if os.path.exists('@prefix@/lib'):
68 runtime_library_dirs = ['@prefix@/lib'] 54 runtime_library_dirs = ['@prefix@/lib']
69 else: 55 else:
70 runtime_library_dirs = [] 56 runtime_library_dirs = []
  57 +runtime_library_dirs = []
71 58
72 # Add cfitsio library only if available 59 # Add cfitsio library only if available
73 if '@WITH_CFITSIO_TRUE@' != '#': 60 if '@WITH_CFITSIO_TRUE@' != '#':
@@ -89,7 +76,7 @@ for extra_lib in extra_libs: @@ -89,7 +76,7 @@ for extra_lib in extra_libs:
89 # Get extra library paths 76 # Get extra library paths
90 extra_lib_paths = ('@LDFLAGS@').split(' ') 77 extra_lib_paths = ('@LDFLAGS@').split(' ')
91 for extra_lib_path in extra_lib_paths: 78 for extra_lib_path in extra_lib_paths:
92 - if extra_lib_path.lstrip().find('-L') == 0: 79 + if extra_lib_path.lstrip().find('-L') == 0:
93 dir = extra_lib_path.lstrip().lstrip('-L') 80 dir = extra_lib_path.lstrip().lstrip('-L')
94 if len(dir) > 0: 81 if len(dir) > 0:
95 library_dirs.append(dir) 82 library_dirs.append(dir)
@@ -98,37 +85,79 @@ for extra_lib_path in extra_lib_paths: @@ -98,37 +85,79 @@ for extra_lib_path in extra_lib_paths:
98 # Get extra include directories 85 # Get extra include directories
99 extra_inc_paths = ('@CPPFLAGS@').split(' ') 86 extra_inc_paths = ('@CPPFLAGS@').split(' ')
100 for extra_inc_path in extra_inc_paths: 87 for extra_inc_path in extra_inc_paths:
101 - if extra_inc_path.lstrip().find('-I') == 0: 88 + if extra_inc_path.lstrip().find('-I') == 0:
102 dir = extra_inc_path.lstrip().lstrip('-I') 89 dir = extra_inc_path.lstrip().lstrip('-I')
103 if len(dir) > 0: 90 if len(dir) > 0:
104 include_dirs.append(dir) 91 include_dirs.append(dir)
105 92
106 -# Add instrument specific include directories and data files 93 +# Add definitions for instrument specific modules
  94 +inst_modules = []
107 if '@WITH_INST_MWL_TRUE@' != '#': 95 if '@WITH_INST_MWL_TRUE@' != '#':
108 print "Include multi-wavelength interface in gammalib Python bindings." 96 print "Include multi-wavelength interface in gammalib Python bindings."
109 - include_dirs.append('@top_srcdir@/inst/mwl/include')  
110 - data_files.extend(glob.glob('@top_srcdir@/inst/mwl/pyext/*.i')) 97 + inst_modules.append('mwl')
111 if '@WITH_INST_CTA_TRUE@' != '#': 98 if '@WITH_INST_CTA_TRUE@' != '#':
112 print "Include CTA instrument interface in gammalib Python bindings." 99 print "Include CTA instrument interface in gammalib Python bindings."
113 - include_dirs.append('@top_srcdir@/inst/cta/include')  
114 - data_files.extend(glob.glob('@top_srcdir@/inst/cta/pyext/*.i')) 100 + inst_modules.append('cta')
115 if '@WITH_INST_LAT_TRUE@' != '#': 101 if '@WITH_INST_LAT_TRUE@' != '#':
116 print "Include Fermi/LAT instrument interface in gammalib Python bindings." 102 print "Include Fermi/LAT instrument interface in gammalib Python bindings."
117 - include_dirs.append('@top_srcdir@/inst/lat/include')  
118 - data_files.extend(glob.glob('@top_srcdir@/inst/lat/pyext/*.i')) 103 + inst_modules.append('lat')
  104 +
  105 +# Set extension definition for core modules
  106 +ext_modules = []
  107 +py_modules = []
  108 +for module in core_modules:
  109 +
  110 + # Define module
  111 + ext_module = Extension('_'+module, [pkg_name+'/'+module+'_wrap.cpp'], \
  112 + include_dirs=include_dirs, \
  113 + libraries=libraries,
  114 + library_dirs=library_dirs,
  115 + runtime_library_dirs=runtime_library_dirs)
  116 + ext_modules.append(ext_module)
  117 + py_modules.append(pkg_name+'.'+module)
  118 +
  119 +# Set extension definition for instrument dependent modules
  120 +for module in inst_modules:
  121 +
  122 + # Define paths
  123 + pyext_path = '@top_srcdir@/inst/'+module+'/pyext'
  124 + include_path = '@top_srcdir@/inst/'+module+'/include'
  125 +
  126 + # Set include directories for module
  127 + include_inst_dirs = include_dirs
  128 + include_inst_dirs.append(include_path)
  129 +
  130 + # Add SWIG files to data_files
  131 + data_files.extend(glob.glob(pyext_path+'/*.i'))
  132 +
  133 + # Define module
  134 + ext_module = Extension('_'+module, [pyext_path+'/'+module+'_wrap.cpp'], \
  135 + include_dirs=include_dirs, \
  136 + libraries=libraries,
  137 + library_dirs=library_dirs,
  138 + runtime_library_dirs=runtime_library_dirs)
  139 + ext_modules.append(ext_module)
  140 + py_modules.append(pkg_name+'.'+module)
  141 +
  142 +# Create gammalib/__init__.py file
  143 +file = open(pkg_name+'/__init__.py', 'w')
  144 +for module in core_modules:
  145 + file.write('from '+module+' import *\n')
  146 +for module in inst_modules:
  147 + file.write('from '+module+' import *\n')
  148 +file.close()
  149 +
119 150
120 # Setup 151 # Setup
121 setup(name='@PACKAGE_NAME@', 152 setup(name='@PACKAGE_NAME@',
122 version='@PACKAGE_VERSION@', 153 version='@PACKAGE_VERSION@',
123 description='gammalib Python bindings', 154 description='gammalib Python bindings',
124 - author='Jurgen Knodlseder', 155 + author='Juergen Knoedlseder',
125 author_email='@PACKAGE_BUGREPORT@', 156 author_email='@PACKAGE_BUGREPORT@',
126 url='http://gammalib.sourceforge.net/', 157 url='http://gammalib.sourceforge.net/',
127 - py_modules=['gammalib'],  
128 - ext_modules=[Extension('_gammalib', ['gammalib_wrap.cpp'],  
129 - include_dirs=include_dirs,  
130 - library_dirs=library_dirs,  
131 - libraries=libraries,  
132 - runtime_library_dirs=runtime_library_dirs)],  
133 - data_files=[('@prefix@/share/gammalib/swig', data_files)],  
134 - ) 158 + packages=[pkg_name],
  159 + ext_package=pkg_name,
  160 + ext_modules=ext_modules,
  161 + py_modules=py_modules,
  162 + )
  163 +#data_files=[('@prefix@/share/gammalib/swig', data_files)],