Commit 2a9577c7217921ba6f62b1a67fb91f4c5c73129d
1 parent
39ec93c0
break down interface into modules
Showing
2 changed files
with
121 additions
and
83 deletions
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) > 3): | @@ -58,16 +44,17 @@ if (len(sys.argv) > 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)], |