File: setup.py

package info (click to toggle)
pyode 1.1.0-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 2,884 kB
  • ctags: 3,058
  • sloc: python: 2,449; makefile: 76; sh: 33
file content (184 lines) | stat: -rw-r--r-- 5,515 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
######################################################################
# setup script for the Python wrapper of ODE
######################################################################

# Note: ODE itself must already be compiled

# Set to the base of your ODE installation.
#ODE_BASE = '../ode'

# Set to True or False to force trimesh support to be enabled or disabled.
#TRIMESH_SUPPORT_OVERRIDE = True

######################################################################

from distutils.core import setup, Extension
import distutils.sysconfig
import shutil, os, os.path, sys, glob
from stat import *

# Windows?
if sys.platform=="win32":

    try:
        base = ODE_BASE
    except NameError:
        ODE_BASE = "../ode_single_trimesh"
        #ODE_BASE = "../ode_double_notrimesh"
    
    INC_DIRS = [os.path.join(ODE_BASE, "include")]
    LIB_DIRS = [os.path.join(ODE_BASE, "lib")]
    LIBS     = ["ode", "user32"]  # user32 because of the MessageBox() call
    CC_ARGS  = ["/ML"]

# Linux (and other)
else:

    try:
        base = ODE_BASE
    except NameError:
        ODE_BASE = "../ode"

    INC_DIRS = [os.path.join(ODE_BASE, "include")]
    LIB_DIRS = [os.path.join(ODE_BASE, "lib")]
    LIBS     = ["ode", "stdc++"]
    CC_ARGS  = []

######################################################################

def readODEConfig():
    config = {}
    
    filename = os.path.normpath(os.path.join(ODE_BASE, "config", "user-settings"))
    print 'Reading ODE configuration "%s"...' % filename

    try:
        f = file(filename)
    except IOError, e:
        print "ERROR:", e
        raise RuntimeError
        
    for line in f.readlines():
        s = line.strip()

        # remove comments
        i = s.find('#')
        if (i != -1):
            s = s[:i]

        if (s == ''):
            continue

        s = s.upper()

        a = s.split('=')
        if (len(a) == 2):
            k, v = a
            config[k] = v

    return config

######################################################################

# Determine the precision setting (SINGLE or DOUBLE?)
#try:
#    precisionfile = "_precision.pyx"
#    precision = determinePrecision()
#    print "Precision:",precision
#    print 'Creating file "%s"...'%precisionfile
#    f = file(precisionfile, "wt")
#    f.write("# This file was automatically generated by the setup script\n\n")
#    f.write('cdef extern from "ode/ode.h":\n')
#    f.write('    # Define the basic floating point type used in ODE\n')
#    f.write('    ctypedef %s dReal\n'%{"SINGLE":"float", "DOUBLE":"double"}[precision])
#    f.close()
#except RuntimeError:
#    print "Aborting!"
#    sys.exit()




# Generate the C source file (if necessary)
def generate(name, trimesh_support):
    # Generate the trimesh_switch file
    
    f = file("_trimesh_switch.pyx", "wt")
    print >>f, '# This file was generated by the setup script and is included in ode.pyx.\n'
    if (trimesh_support):
        print >>f, 'include "trimeshdata.pyx"'
        print >>f, 'include "trimesh.pyx"'
    else:
        print >>f, 'include "trimesh_dummy.pyx"'
    f.close()
    
    cmd = "pyrexc -o %s -I. -Isrc src/ode.pyx" % name
    pyrex_out = name

    # Check if the pyrex output is still up to date or if it has to be generated
    # (ode.c will be updated if any of the *.pyx files in the directory "src"
    # is newer than ode.c)
    if os.access(pyrex_out, os.F_OK):
        ctime = os.stat(pyrex_out)[ST_MTIME]
        for pyx in glob.glob("src/*.pyx"):
            pytime = os.stat(pyx)[ST_MTIME]
            if pytime>ctime:
                print "Updating",pyrex_out
                print cmd
                err = os.system(cmd)
                break
        else:
            print pyrex_out,"is up to date"
            err = 0
    else:
        print "Creating",pyrex_out
        print cmd
        err = os.system(cmd)

    # Check if calling pyrex produced an error
    if err!=0:
        print "An error occured while generating the C source file."
        sys.exit(err)

# Check if the ODE_BASE path does exist
if not os.path.exists(ODE_BASE):
    print """This Python ODE wrapper assumes that you have a compiled version of
the ODE library already somewhere on your system. The path to the ODE
distribution has to be set in the setup script via the variable
ODE_BASE. Currently it points to "%s".
However, that path does not exist. So please change the variable inside the
script so that it points to the actual location of the ODE directory."""%ODE_BASE
    sys.exit()

config = readODEConfig()

generate('ode_trimesh.c', True)
generate('ode_notrimesh.c', False)

try:
    wrap_trimesh = TRIMESH_SUPPORT_OVERRIDE
except NameError, e:
    wrap_trimesh = config.get('OPCODE_DIRECTORY', '')

if (wrap_trimesh):
    print "Installing with trimesh support."
    install = 'ode_trimesh.c'
else:
    print "Installing without trimesh support."
    install = 'ode_notrimesh.c'

# Compile the module
setup(name = "PyODE",
      version = "1.1.0",
      description = "Python wrapper for the Open Dynamics Engine",
      author = "see file AUTHORS",
      author_email = "timothy@stranex.com",
      license = "BSD or LGPL",
      url = "http://pyode.sourceforge.net/",
      packages = ["xode"],
      ext_modules = [Extension("ode", [install]
                     ,libraries=LIBS
                     ,include_dirs=INC_DIRS
                     ,library_dirs=LIB_DIRS
                     ,extra_compile_args=CC_ARGS)                   
                    ])