source: sasview/setup.py @ 7d32aaf

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalccostrafo411magnetic_scattrelease-4.1.1release-4.1.2release-4.2.2release_4.0.1ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since 7d32aaf was 25f223b, checked in by krzywon, 10 years ago

Modified setup.py to look for defaults.json instead of defaults.xml when
loading the data loader Registry.

  • Property mode set to 100644
File size: 14.6 KB
Line 
1"""
2    Setup for SasView
3    #TODO: Add checks to see that all the dependencies are on the system
4"""
5import sys
6import os
7from setuptools import setup, Extension
8from distutils.command.build_ext import build_ext
9from distutils.core import Command
10
11try:
12    from numpy.distutils.misc_util import get_numpy_include_dirs
13    NUMPY_INC = get_numpy_include_dirs()[0]
14except:
15    try:
16        import numpy
17        NUMPY_INC = os.path.join(os.path.split(numpy.__file__)[0], 
18                                 "core","include")
19    except:
20        msg = "\nNumpy is needed to build SasView. "
21        print msg, "Try easy_install numpy.\n  %s" % str(sys.exc_value)
22        sys.exit(0)
23
24# Manage version number ######################################
25import sasview
26VERSION = sasview.__version__
27##############################################################
28
29package_dir = {}
30package_data = {}
31packages = []
32ext_modules = []
33
34# Remove all files that should be updated by this setup
35# We do this here because application updates these files from .sasview
36# except when there is no such file
37# Todo : make this list generic
38plugin_model_list = ['polynominal5.py', 'sph_bessel_jn.py', 
39                     'sum_Ap1_1_Ap2.py', 'sum_p1_p2.py', 
40                     'testmodel_2.py', 'testmodel.py',
41                     'polynominal5.pyc', 'sph_bessel_jn.pyc', 
42                     'sum_Ap1_1_Ap2.pyc', 'sum_p1_p2.pyc', 
43                     'testmodel_2.pyc', 'testmodel.pyc', 'plugins.log']
44sas_dir = os.path.join(os.path.expanduser("~"),'.sasview')
45if os.path.isdir(sas_dir):
46    f_path = os.path.join(sas_dir, "sasview.log")
47    if os.path.isfile(f_path):
48        os.remove(f_path)
49    f_path = os.path.join(sas_dir, "serialized_cat.json")
50    if os.path.isfile(f_path):
51        os.remove(f_path)
52    f_path = os.path.join(sas_dir, 'config', "custom_config.py")
53    if os.path.isfile(f_path):
54        os.remove(f_path)
55    f_path = os.path.join(sas_dir, 'plugin_models')
56    if os.path.isdir(f_path):
57        for f in os.listdir(f_path): 
58            if f in plugin_model_list:
59                file_path =  os.path.join(f_path, f)
60                os.remove(file_path)
61                   
62# 'sys.maxsize' and 64bit: Not supported for python2.5
63is_64bits = False
64if sys.version_info >= (2, 6):
65    is_64bits = sys.maxsize > 2**32
66   
67enable_openmp = False
68
69if sys.platform =='darwin':
70    if not is_64bits:
71        # Disable OpenMP
72        enable_openmp = False
73    else:
74        # Newer versions of Darwin don't support openmp
75        try:
76            darwin_ver = int(os.uname()[2].split('.')[0])
77            if darwin_ver >= 12:
78                enable_openmp = False
79        except:
80            print "PROBLEM determining Darwin version"
81
82# Options to enable OpenMP
83copt =  {'msvc': ['/openmp'],
84         'mingw32' : ['-fopenmp'],
85         'unix' : ['-fopenmp']}
86lopt =  {'msvc': ['/MANIFEST'],
87         'mingw32' : ['-fopenmp'],
88         'unix' : ['-lgomp']}
89
90# Platform-specific link options
91platform_lopt = {'msvc' : ['/MANIFEST']}
92platform_copt = {}
93
94# Set copts to get compile working on OS X >= 10.9 using clang
95if sys.platform =='darwin':
96    try:
97        darwin_ver = int(os.uname()[2].split('.')[0])
98        if darwin_ver >= 13:
99            platform_copt = {'unix' : ['-Wno-error=unused-command-line-argument-hard-error-in-future']}
100    except:
101        print "PROBLEM determining Darwin version"
102
103class DisableOpenMPCommand(Command):
104    description = "The version of MinGW that comes with Anaconda does not come with OpenMP :( "\
105                  "This commands means we can turn off compiling with OpenMP for this or any "\
106                  "other reason."
107    user_options = []
108
109    def initialize_options(self):
110        self.cwd = None
111
112    def finalize_options(self):
113        self.cwd = os.getcwd()
114        global enable_openmp
115        enable_openmp = False
116
117    def run(self):
118        pass
119
120class build_ext_subclass( build_ext ):
121    def build_extensions(self):
122        # Get 64-bitness
123        c = self.compiler.compiler_type
124        print "Compiling with %s (64bit=%s)" % (c, str(is_64bits))
125       
126        # OpenMP build options
127        if enable_openmp:
128            if copt.has_key(c):
129                for e in self.extensions:
130                    e.extra_compile_args = copt[ c ]
131            if lopt.has_key(c):
132                for e in self.extensions:
133                    e.extra_link_args = lopt[ c ]
134                   
135        # Platform-specific build options
136        if platform_lopt.has_key(c):
137            for e in self.extensions:
138                e.extra_link_args = platform_lopt[ c ]
139
140        if platform_copt.has_key(c):
141            for e in self.extensions:
142                e.extra_compile_args = platform_copt[ c ]
143
144
145        build_ext.build_extensions(self)
146
147class BuildSphinxCommand(Command):
148    description = "Build Sphinx documentation."
149    user_options = []
150
151    def initialize_options(self):
152        self.cwd = None
153
154    def finalize_options(self):
155        self.cwd = os.getcwd()
156
157    def run(self):
158        sys.path.append("docs/sphinx-docs")
159        import build_sphinx
160
161        build_sphinx.clean()
162        build_sphinx.retrieve_user_docs()
163        build_sphinx.apidoc()
164        build_sphinx.build()
165
166# sas module
167package_dir["sas"] = os.path.join("src", "sas")
168packages.append("sas")
169
170# sas.invariant
171package_dir["sas.invariant"] = os.path.join("src", "sas", "invariant")
172packages.extend(["sas.invariant"])
173
174# sas.guiframe
175guiframe_path = os.path.join("src", "sas", "guiframe")
176package_dir["sas.guiframe"] = guiframe_path
177package_dir["sas.guiframe.local_perspectives"] = os.path.join(os.path.join(guiframe_path, "local_perspectives"))
178package_data["sas.guiframe"] = ['images/*', 'media/*']
179packages.extend(["sas.guiframe", "sas.guiframe.local_perspectives"])
180# build local plugin
181for d in os.listdir(os.path.join(guiframe_path, "local_perspectives")):
182    if d not in ['.svn','__init__.py', '__init__.pyc']:
183        package_name = "sas.guiframe.local_perspectives." + d
184        packages.append(package_name)
185        package_dir[package_name] = os.path.join(guiframe_path, "local_perspectives", d)
186
187# sas.dataloader
188package_dir["sas.dataloader"] = os.path.join("src", "sas", "dataloader")
189package_data["sas.dataloader.readers"] = ['defaults.json','schema/*.xsd']
190packages.extend(["sas.dataloader","sas.dataloader.readers","sas.dataloader.readers.schema"])
191
192# sas.calculator
193package_dir["sas.calculator"] =os.path.join("src", "sas", "calculator")
194packages.extend(["sas.calculator"])
195   
196# sas.pr
197numpy_incl_path = os.path.join(NUMPY_INC, "numpy")
198srcdir  = os.path.join("src", "sas", "pr", "c_extensions")
199package_dir["sas.pr.core"] = srcdir
200package_dir["sas.pr"] = os.path.join("src","sas", "pr")
201packages.extend(["sas.pr","sas.pr.core"])
202ext_modules.append( Extension("sas.pr.core.pr_inversion",
203                              sources = [os.path.join(srcdir, "Cinvertor.c"),
204                                         os.path.join(srcdir, "invertor.c"),
205                                         ],
206                              include_dirs=[numpy_incl_path],
207                              ) )
208       
209# sas.fit (park integration)
210package_dir["sas.fit"] = os.path.join("src", "sas", "fit")
211packages.append("sas.fit")
212
213# Perspectives
214package_dir["sas.perspectives"] = os.path.join("src", "sas", "perspectives")
215package_dir["sas.perspectives.pr"] = os.path.join("src", "sas", "perspectives", "pr")
216packages.extend(["sas.perspectives","sas.perspectives.pr"])
217package_data["sas.perspectives.pr"] = ['images/*']
218
219package_dir["sas.perspectives.invariant"] = os.path.join("src", "sas", "perspectives", "invariant")
220packages.extend(["sas.perspectives.invariant"])
221package_data['sas.perspectives.invariant'] = [os.path.join("media",'*')]
222
223package_dir["sas.perspectives.fitting"] = os.path.join("src", "sas", "perspectives", "fitting")
224package_dir["sas.perspectives.fitting.plugin_models"] = os.path.join("src", "sas", "perspectives", "fitting", "plugin_models")
225packages.extend(["sas.perspectives.fitting", 
226                 "sas.perspectives.fitting.plugin_models"])
227package_data['sas.perspectives.fitting'] = ['media/*','plugin_models/*']
228
229packages.extend(["sas.perspectives", "sas.perspectives.calculator"])   
230package_data['sas.perspectives.calculator'] = ['images/*', 'media/*']
231   
232# Data util
233package_dir["data_util"] = os.path.join("src", "sas", "data_util")
234packages.append("sas.data_util")
235
236# Plottools
237package_dir["sas.plottools"] = os.path.join("src", "sas", "plottools")
238packages.append("sas.plottools")
239
240# Park 1.2.1
241package_dir["park"]="park-1.2.1/park"
242packages.extend(["park"])
243package_data["park"] = ['park-1.2.1/*.txt', 'park-1.2.1/park.epydoc']
244ext_modules.append( Extension("park._modeling",
245                              sources = [ os.path.join("park-1.2.1", 
246                                                "park", "lib", "modeling.cc"),
247                                         os.path.join("park-1.2.1", 
248                                                "park", "lib", "resolution.c"),
249                                         ],
250                              ) )
251
252# sas models
253includedir  = os.path.join("src", "sas", "models", "include")
254igordir = os.path.join("src", "sas", "models", "c_extension", "libigor")
255cephes_dir = os.path.join("src", "sas", "models", "c_extension", "cephes")
256c_model_dir = os.path.join("src", "sas", "models", "c_extension", "c_models")
257smear_dir  = os.path.join("src", "sas", "models", "c_extension", "c_smearer")
258gen_dir  = os.path.join("src", "sas", "models", "c_extension", "c_gen")
259wrapper_dir  = os.path.join("src", "sas", "models", "c_extension", "python_wrapper", "generated")
260model_dir = os.path.join("src", "sas","models")
261
262if os.path.isdir(wrapper_dir):
263    for file in os.listdir(wrapper_dir): 
264        file_path =  os.path.join(wrapper_dir, file)
265        os.remove(file_path)
266else:
267    os.makedirs(wrapper_dir)
268sys.path.append(os.path.join("src", "sas", "models", "c_extension", "python_wrapper"))
269from wrapping import generate_wrappers
270generate_wrappers(header_dir = includedir, 
271                  output_dir = model_dir,
272                  c_wrapper_dir = wrapper_dir)
273
274IGNORED_FILES = [".svn"]
275if not os.name=='nt':
276    IGNORED_FILES.extend(["gamma_win.c","winFuncs.c"])
277
278EXTENSIONS = [".c", ".cpp"]
279
280def append_file(file_list, dir_path):
281    """
282    Add sources file to sources
283    """
284    for f in os.listdir(dir_path):
285        if os.path.isfile(os.path.join(dir_path, f)):
286            _, ext = os.path.splitext(f)
287            if ext.lower() in EXTENSIONS and f not in IGNORED_FILES:
288                file_list.append(os.path.join(dir_path, f)) 
289        elif os.path.isdir(os.path.join(dir_path, f)) and \
290                not f.startswith("."):
291            sub_dir = os.path.join(dir_path, f)
292            for new_f in os.listdir(sub_dir):
293                if os.path.isfile(os.path.join(sub_dir, new_f)):
294                    _, ext = os.path.splitext(new_f)
295                    if ext.lower() in EXTENSIONS and\
296                         new_f not in IGNORED_FILES:
297                        file_list.append(os.path.join(sub_dir, new_f)) 
298       
299model_sources = []
300append_file(file_list=model_sources, dir_path=igordir)
301append_file(file_list=model_sources, dir_path=c_model_dir)
302append_file(file_list=model_sources, dir_path=wrapper_dir)
303
304smear_sources = []
305append_file(file_list=smear_sources, dir_path=smear_dir)
306       
307package_dir["sas.models"] = model_dir
308package_dir["sas.models.sas_extension"] = os.path.join("src", "sas", "models", "sas_extension")
309package_data['sas.models'] = [os.path.join('media', "*.*")]
310package_data['sas.models'] += [os.path.join('media','img', "*.*")]
311packages.extend(["sas.models","sas.models.sas_extension"])
312   
313smearer_sources = [os.path.join(smear_dir, "smearer.cpp"),
314                  os.path.join(smear_dir, "smearer_module.cpp")]
315geni_sources = [os.path.join(gen_dir, "sld2i_module.cpp")]
316if os.name=='nt':
317    smearer_sources.append(os.path.join(igordir, "winFuncs.c"))
318    geni_sources.append(os.path.join(igordir, "winFuncs.c"))
319
320c_models = [ 
321    Extension("sas.models.sas_extension.c_models",
322        sources=model_sources,                 
323        include_dirs=[
324            igordir, includedir, c_model_dir, numpy_incl_path, cephes_dir
325        ],
326    ),
327
328    # Smearer extension
329    Extension("sas.models.sas_extension.smearer",
330        sources = smearer_sources,
331        include_dirs=[igordir,  smear_dir, numpy_incl_path],
332    ),
333                   
334    Extension("sas.models.sas_extension.smearer2d_helper",
335        sources = [
336            os.path.join(smear_dir, "smearer2d_helper_module.cpp"),
337            os.path.join(smear_dir, "smearer2d_helper.cpp"),
338            os.path.join(igordir, "winFuncs.c"),
339        ],
340        include_dirs=[smear_dir, numpy_incl_path],
341    ),
342                   
343    Extension("sas.models.sas_extension.sld2i",
344        sources = [
345            os.path.join(gen_dir, "sld2i_module.cpp"),
346            os.path.join(gen_dir, "sld2i.cpp"),
347            os.path.join(c_model_dir, "libfunc.c"),
348            os.path.join(c_model_dir, "librefl.c"),
349            os.path.join(igordir, "winFuncs.c"),
350        ],
351        include_dirs=[gen_dir, includedir,  c_model_dir, numpy_incl_path],
352    ),
353]
354
355# Comment out the following to avoid rebuilding all the models
356ext_modules.extend(c_models)
357
358# SasView
359
360package_dir["sas.sasview"] = "sasview"
361package_data['sas.sasview'] = ['images/*', 'media/*', 'test/*', 
362                                 'default_categories.json']
363packages.append("sas.sasview")
364
365required = [
366    'bumps>=0.7.5.4', 'periodictable>=1.3.1', 'pyparsing<2.0.0',
367
368    # 'lxml>=2.2.2',
369    'lxml', 
370
371    ## The following dependecies won't install automatically, so assume them
372    ## The numbers should be bumped up for matplotlib and wxPython as well.
373    # 'numpy>=1.4.1', 'scipy>=0.7.2', 'matplotlib>=0.99.1.1',
374    # 'wxPython>=2.8.11', 'pil',
375    ]
376
377if os.name=='nt':
378    required.extend(['html5lib', 'reportlab'])
379else:
380    required.extend(['pil'])
381   
382# Set up SasView   
383setup(
384    name="sasview",
385    version = VERSION,
386    description = "SasView application",
387    author = "University of Tennessee",
388    author_email = "sansdanse@gmail.com",
389    url = "http://sasview.org",
390    license = "PSF",
391    keywords = "small-angle x-ray and neutron scattering analysis",
392    download_url = "https://sourceforge.net/projects/sansviewproject/files/",
393    package_dir = package_dir,
394    packages = packages,
395    package_data = package_data,
396    ext_modules = ext_modules,
397    install_requires = required,
398    zip_safe = False,
399    entry_points = {
400                    'console_scripts':[
401                                       "sasview = sas.sasview.sasview:run",
402                                       ]
403                    },
404    cmdclass = {'build_ext': build_ext_subclass,
405                'docs': BuildSphinxCommand,
406                'disable_openmp': DisableOpenMPCommand}
407    )   
Note: See TracBrowser for help on using the repository browser.