~ubuntu-branches/ubuntu/feisty/python-numpy/feisty

« back to all changes in this revision

Viewing changes to numpy/distutils/core.py

  • Committer: Bazaar Package Importer
  • Author(s): Matthias Klose
  • Date: 2006-07-12 10:00:24 UTC
  • Revision ID: james.westby@ubuntu.com-20060712100024-5lw9q2yczlisqcrt
Tags: upstream-0.9.8
ImportĀ upstreamĀ versionĀ 0.9.8

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
import sys
 
3
from distutils.core import *
 
4
try:
 
5
    from setuptools import setup as old_setup
 
6
    # very old setuptools don't have this
 
7
    from setuptools.command import bdist_egg
 
8
    # easy_install imports math, it may be picked up from cwd
 
9
    from setuptools.command import develop, easy_install
 
10
    have_setuptools = 1
 
11
except ImportError:
 
12
    from distutils.core import setup as old_setup
 
13
    have_setuptools = 0
 
14
 
 
15
from numpy.distutils.extension import Extension
 
16
from numpy.distutils.command import config
 
17
from numpy.distutils.command import build
 
18
from numpy.distutils.command import build_py
 
19
from numpy.distutils.command import config_compiler
 
20
from numpy.distutils.command import build_ext
 
21
from numpy.distutils.command import build_clib
 
22
from numpy.distutils.command import build_src
 
23
from numpy.distutils.command import build_scripts
 
24
from numpy.distutils.command import sdist
 
25
from numpy.distutils.command import install_data
 
26
from numpy.distutils.command import install_headers
 
27
from numpy.distutils.command import install
 
28
from numpy.distutils.command import bdist_rpm
 
29
from numpy.distutils.misc_util import get_data_files, is_sequence, is_string
 
30
 
 
31
numpy_cmdclass = {'build':            build.build,
 
32
                  'build_src':        build_src.build_src,
 
33
                  'build_scripts':    build_scripts.build_scripts,
 
34
                  'config_fc':        config_compiler.config_fc,
 
35
                  'config':           config.config,
 
36
                  'build_ext':        build_ext.build_ext,
 
37
                  'build_py':         build_py.build_py,
 
38
                  'build_clib':       build_clib.build_clib,
 
39
                  'sdist':            sdist.sdist,
 
40
                  'install_data':     install_data.install_data,
 
41
                  'install_headers':  install_headers.install_headers,
 
42
                  'install':          install.install,
 
43
                  'bdist_rpm':        bdist_rpm.bdist_rpm,
 
44
                  }
 
45
if have_setuptools:
 
46
    from numpy.distutils.command import egg_info
 
47
    numpy_cmdclass['bdist_egg'] = bdist_egg.bdist_egg
 
48
    numpy_cmdclass['develop'] = develop.develop
 
49
    numpy_cmdclass['easy_install'] = easy_install.easy_install
 
50
    numpy_cmdclass['egg_info'] = egg_info.egg_info
 
51
 
 
52
def _dict_append(d, **kws):
 
53
    for k,v in kws.items():
 
54
        if not d.has_key(k):
 
55
            d[k] = v
 
56
            continue
 
57
        dv = d[k]
 
58
        if isinstance(dv, tuple):
 
59
            dv += tuple(v)
 
60
            continue
 
61
        if isinstance(dv, list):
 
62
            dv += list(v)
 
63
            continue
 
64
        if isinstance(dv, dict):
 
65
            _dict_append(dv, **v)
 
66
            continue
 
67
        if isinstance(dv, str):
 
68
            assert isinstance(v,str),`type(v)`
 
69
            d[k] = v
 
70
            continue
 
71
        raise TypeError,`type(dv)`
 
72
    return
 
73
 
 
74
def _command_line_ok(_cache=[]):
 
75
    """ Return True if command line does not contain any
 
76
    help or display requests.
 
77
    """
 
78
    if _cache:
 
79
        return _cache[0]
 
80
    ok = True
 
81
    display_opts = ['--'+n for n in Distribution.display_option_names]
 
82
    for o in Distribution.display_options:
 
83
        if o[1]:
 
84
            display_opts.append('-'+o[1])
 
85
    for arg in sys.argv:
 
86
        if arg.startswith('--help') or arg=='-h' or arg in display_opts:
 
87
            ok = False
 
88
            break
 
89
    _cache.append(ok)
 
90
    return ok
 
91
 
 
92
def _exit_interactive_session(_cache=[]):
 
93
    if _cache:
 
94
        return # been here
 
95
    _cache.append(1)
 
96
    print '-'*72
 
97
    raw_input('Press ENTER to close the interactive session..')
 
98
    print '='*72
 
99
 
 
100
def setup(**attr):
 
101
 
 
102
    if len(sys.argv)<=1:
 
103
        from interactive import interactive_sys_argv
 
104
        import atexit
 
105
        atexit.register(_exit_interactive_session)
 
106
        sys.argv[:] = interactive_sys_argv(sys.argv)
 
107
        if len(sys.argv)>1:
 
108
            return setup(**attr)
 
109
 
 
110
    cmdclass = numpy_cmdclass.copy()
 
111
 
 
112
    new_attr = attr.copy()
 
113
    if new_attr.has_key('cmdclass'):
 
114
        cmdclass.update(new_attr['cmdclass'])
 
115
    new_attr['cmdclass'] = cmdclass
 
116
 
 
117
    if new_attr.has_key('configuration'):
 
118
        # To avoid calling configuration if there are any errors
 
119
        # or help request in command in the line.
 
120
        configuration = new_attr.pop('configuration')
 
121
 
 
122
        import distutils.core
 
123
        old_dist = distutils.core._setup_distribution
 
124
        old_stop = distutils.core._setup_stop_after
 
125
        distutils.core._setup_distribution = None
 
126
        distutils.core._setup_stop_after = "commandline"
 
127
        try:
 
128
            dist = setup(**new_attr)
 
129
            distutils.core._setup_distribution = old_dist
 
130
            distutils.core._setup_stop_after = old_stop
 
131
        except Exception,msg:
 
132
            distutils.core._setup_distribution = old_dist
 
133
            distutils.core._setup_stop_after = old_stop
 
134
            raise msg
 
135
        if dist.help or not _command_line_ok():
 
136
            # probably displayed help, skip running any commands
 
137
            return dist
 
138
 
 
139
        # create setup dictionary and append to new_attr
 
140
        config = configuration()
 
141
        if hasattr(config,'todict'): config = config.todict()
 
142
        _dict_append(new_attr, **config)
 
143
 
 
144
    # Move extension source libraries to libraries
 
145
    libraries = []
 
146
    for ext in new_attr.get('ext_modules',[]):
 
147
        new_libraries = []
 
148
        for item in ext.libraries:
 
149
            if is_sequence(item):
 
150
                lib_name, build_info = item
 
151
                _check_append_ext_library(libraries, item)
 
152
                new_libraries.append(lib_name)
 
153
            elif is_string(item):
 
154
                new_libraries.append(item)
 
155
            else:
 
156
                raise TypeError("invalid description of extension module "
 
157
                                "library %r" % (item,))
 
158
        ext.libraries = new_libraries
 
159
    if libraries:
 
160
        if not new_attr.has_key('libraries'):
 
161
            new_attr['libraries'] = []
 
162
        for item in libraries:
 
163
            _check_append_library(new_attr['libraries'], item)
 
164
 
 
165
    # sources in ext_modules or libraries may contain header files
 
166
    if (new_attr.has_key('ext_modules') or new_attr.has_key('libraries')) \
 
167
       and not new_attr.has_key('headers'):
 
168
        new_attr['headers'] = []
 
169
 
 
170
    return old_setup(**new_attr)
 
171
 
 
172
def _check_append_library(libraries, item):
 
173
    import warnings
 
174
    for libitem in libraries:
 
175
        if is_sequence(libitem):
 
176
            if is_sequence(item):
 
177
                if item[0]==libitem[0]:
 
178
                    if item[1] is libitem[1]:
 
179
                        return
 
180
                    warnings.warn("[0] libraries list contains %r with"
 
181
                                  " different build_info" % (item[0],))
 
182
                    break
 
183
            else:
 
184
                if item==libitem[0]:
 
185
                    warnings.warn("[1] libraries list contains %r with"
 
186
                                  " no build_info" % (item[0],))
 
187
                    break
 
188
        else:
 
189
            if is_sequence(item):
 
190
                if item[0]==libitem:
 
191
                    warnings.warn("[2] libraries list contains %r with"
 
192
                                  " no build_info" % (item[0],))
 
193
                    break
 
194
            else:
 
195
                if item==libitem:
 
196
                    return
 
197
    libraries.append(item)
 
198
    return
 
199
 
 
200
def _check_append_ext_library(libraries, (lib_name,build_info)):
 
201
    import warnings
 
202
    for item in libraries:
 
203
        if is_sequence(item):
 
204
            if item[0]==lib_name:
 
205
                if item[1] is build_info:
 
206
                    return
 
207
                warnings.warn("[3] libraries list contains %r with"
 
208
                              " different build_info" % (lib_name,))
 
209
                break
 
210
        elif item==lib_name:
 
211
            warnings.warn("[4] libraries list contains %r with"
 
212
                          " no build_info" % (lib_name,))
 
213
            break
 
214
    libraries.append((lib_name,build_info))
 
215
    return