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
|
######################################################################
# setup script for the Python wrapper of ODE
######################################################################
from distutils.core import setup, Extension
import distutils.sysconfig
import shutil, os, os.path, sys, glob
from stat import *
# Include directories
INC_DIRS = []
# Library directories
LIB_DIRS = []
# Libraries to link with
LIBS = []
# Additional compiler arguments
CC_ARGS = []
# Additional linker arguments
LINK_ARGS = []
# If your version of ODE was compiled with OPCODE (trimesh support) enabled,
# this should be set to True.
TRIMESH_ENABLE = True
######################################################################
# Windows specific settings
######################################################################
if sys.platform=="win32":
ODE_BASE = r"insert_your_path_here"
INC_DIRS += [os.path.join(ODE_BASE, "include")]
LIB_DIRS += [os.path.join(ODE_BASE, "lib", "releaselib")]
LIBS += ["ode", "user32"] # user32 because of the MessageBox() call
CC_ARGS += ["/ML"]
LINK_ARGS += ["/NODEFAULTLIB:LIBCMT"]
######################################################################
# Linux (and other) specific settings
######################################################################
else:
for base in ["/usr", "/usr/local", "/opt/local"]:
INC_DIRS += [os.path.join(base, "include")]
LIB_DIRS += [os.path.join(base, "lib")]
LIBS += ["ode", "stdc++"]
######################################################################
######################################################################
######################################################################
def info(msg):
"""Output an info message.
"""
print "INFO:",msg
def warning(msg):
"""Output a warning message.
"""
print "WARNING:",msg
def error(msg, errorcode=1):
"""Output an error message and abort.
"""
print "ERROR:",msg
sys.exit(errorcode)
# Generate the C source file (if necessary)
def generate(name, trimesh_support):
"""Run Pyrex to generate the extension module source code.
"""
# 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:
info("Updating %s"%pyrex_out)
print cmd
err = os.system(cmd)
break
else:
info("%s is up to date"%pyrex_out)
err = 0
else:
info("Creating %s"%pyrex_out)
print cmd
err = os.system(cmd)
# Check if calling pyrex produced an error
if err!=0:
error("An error occured while generating the C source file.", err)
######################################################################
# Check if ode.h can be found
# (if it is not found it might not be an error because it may be located
# in any of the include paths that are built into the compiler)
num = 0
for path in INC_DIRS:
ode_h = os.path.join(path, "ode", "ode.h")
if os.path.exists(ode_h):
info("<ode/ode.h> found in %s"%path)
num += 1
if num==0:
warning("<ode/ode.h> not found. You may have to adjust INC_DIRS.")
elif num>1:
warning("ode.h was found more than once. Make sure the header and lib matches.")
# Generate all possible source code versions so that they can be
# packaged with the source archive and a user doesn't require Pyrex
generate('ode_trimesh.c', True)
generate('ode_notrimesh.c', False)
if (TRIMESH_ENABLE):
info("Installing with trimesh support.")
install = 'ode_trimesh.c'
else:
info("INFO: Installing without trimesh support.")
install = 'ode_notrimesh.c'
# Compile the module
setup(name = "PyODE",
version = "1.2.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
,extra_link_args=LINK_ARGS)
])
|