source: anuga_core/SConstruct @ 3752

Last change on this file since 3752 was 3752, checked in by duncan, 18 years ago

change to reflect file movement

File size: 7.1 KB
Line 
1import os
2import sys
3import py_compile
4
5# Function to build a .pyc from a .py
6def build_pyc(target, source, env):
7    python = sys.executable
8    command = "import py_compile; py_compile.compile('%s', doraise=True)"
9    if sys.platform == 'win32':
10        command %= str(source[0]).replace('\\', '\\\\')
11    else:
12        command %= str(source[0])
13    rv = os.system('%s -c "%s"' % (python, command))
14    if not rv == 0:
15        raise SyntaxError, "Could not compile %s" % str(source[0])
16    return None
17
18# Function to build a .pyo from a .py
19def build_pyo(target, source, env):
20    python = sys.executable
21    command = "import py_compile; py_compile.compile('%s', doraise=True)"
22    if sys.platform == 'win32':
23        command %= str(source[0]).replace('\\', '\\\\')
24    else:
25        command %= str(source[0])
26    options = '-' + 'O' * env['OPTIMISATION_LEVEL']
27    rv = os.system('%s %s -c "%s"' % (python, options, command))
28    if not rv == 0:
29        raise SyntaxError, "Could not compile %s" % str(source[0])
30    return None
31
32# Create the builders
33pyc_builder = Builder(action = build_pyc,
34                      suffix = '.pyc',
35                      src_suffix = '.py')
36pyo_builder = Builder(action = build_pyo,
37                      suffix = '.pyo',
38                      src_suffix = '.py')
39
40# Read in build options
41opts = Options('build_options.py')
42opts.Add('GCCFLAGS', 'Flags passed to GCC')
43opts.Add('MSVCFLAGS', 'Flags passed to the MSVC compiler')
44opts.Add('METIS_DIR', 'Location of the metis directory relative to the pymetis directory')
45opts.Add('OPTIMISATION_LEVEL', 'Optimisation level for the building of .pyo files. Must be 1 or 2')
46
47# Windows' site packages are in a different location to those on Linux
48if sys.platform == 'win32':
49    opts.Add(PathOption('PREFIX',
50                        'Location to install compiled sources',
51                        os.path.join(sys.exec_prefix, 'lib', 'site-packages')))
52else:
53    opts.Add(PathOption('PREFIX',
54                        'Location to install compiled sources',
55                        os.path.join(sys.exec_prefix, 'lib', 'python' + sys.version[:3], 'site-packages')))
56
57opts.Add(BoolOption('INSTALL_PYTHON_SOURCE',
58                    'Install the .py files as well as the .pyc/.pyo files',
59                    0))
60
61env = Environment(options = opts)
62env.Append(BUILDERS={'Pyc' : pyc_builder,
63                     'Pyo' : pyo_builder})
64
65Help(opts.GenerateHelpText(env))
66
67if not (env['OPTIMISATION_LEVEL'] == 1 or env['OPTIMISATION_LEVEL'] == 2):
68    raise ValueError, "OPTIMISATION_LEVEL must be between 1 and 2 inclusive"
69
70# Where to find the Python.h
71if sys.platform == 'win32':
72    # Prefer MinGW over MSVC
73    Tool('mingw')(env)
74   
75    python_include = os.path.join(sys.exec_prefix, 'include')
76    # Windows installs need to be told the lib path and the python library name
77    # else it won't work right.
78    python_libdir = os.path.join(sys.exec_prefix, 'libs')
79    env.Append(LIBPATH=[python_libdir])
80    python_libname = 'python%d%d' % (sys.version_info[0:2])
81    env.Append(LIBS=[python_libname])
82else:
83    python_include = os.path.join(sys.exec_prefix, 'include', 'python' + sys.version[:3])
84   
85# Check existence of Python.h
86headerfile = python_include + os.sep + 'Python.h'
87try:
88    open(headerfile, 'r')
89except:
90    raise """Did not find Python header file %s.
91    Make sure files for Python C-extensions are installed.
92    In debian linux, for example, you need to install a
93    package called something like python2.3-dev""" %headerfile
94
95env.Append(CPPPATH=[python_include])
96
97# Set appropriate CCFLAGS for the compiler.
98if env['CC'] == 'gcc':
99    env.Append(CCFLAGS=['${GCCFLAGS}'])
100elif env['CC'] == 'cl':
101    env.Append(CCFLAGS=['${MSVCFLAGS}'])
102
103# Suppress the "lib" prefix on built files
104env['SHLIBPREFIX'] = ""
105
106anuga_root = os.path.join('source', 'anuga')
107install_root = os.path.join(env['PREFIX'], 'anuga')
108
109# Build .pyc and .pyo files of every .py in here and below.
110files = []
111#dirs = filter(os.path.isdir, os.listdir('.'))
112#Only build the source/anuga directory for now
113dirs = [anuga_root]
114while(dirs != []):
115    dirs += filter(os.path.isdir, map(lambda x : os.path.join(dirs[0], x), os.listdir(dirs[0])))
116    files += filter(lambda x : x[-3:] == '.py', map(lambda x : os.path.join(dirs[0], x), os.listdir(dirs[0])))
117    dirs = dirs[1:]
118for x in files:
119    env.Pyc(x + 'c', x)
120    env.Pyo(x + 'o', x)
121    # We have to cut the first character off the result of os.path.dirname(x).replace('anuga_core, '')
122    # or else we will start taking paths relative to the root directory.
123    instdir = os.path.join(env['PREFIX'], os.path.dirname(x).replace('source', '')[1:])
124    env.Install(instdir, x + 'c')
125    env.Install(instdir, x + 'o')
126    if env['INSTALL_PYTHON_SOURCE']:
127        env.Install(instdir, x)
128
129# Define the install target
130env.Alias('install', '${PREFIX}')
131
132# Mesh_engine
133mesh_env = env.Copy()
134mesh_env.Append(CPPDEFINES=[('TRILIBRARY', 1), ('NO_TIMER', 1)])
135
136mesh_dir = os.path.join(anuga_root, 'mesh_engine')
137mesh_install_dir = os.path.join(install_root, 'mesh_engine')
138
139triang = mesh_env.SharedLibrary(os.path.join(mesh_dir, 'triang'), map(lambda s: os.path.join(mesh_dir, s), ['triangle.c', 'triang.c']))
140triangle = mesh_env.SharedLibrary(os.path.join(mesh_dir, 'triangle'), map(lambda s: os.path.join(mesh_dir, s), ['triangle.c']))
141env.Install(mesh_install_dir, triang)
142env.Install(mesh_install_dir, triangle)
143
144# Utilities
145util_dir = os.path.join(anuga_root, 'utilities')
146util_install_dir = os.path.join(install_root, 'utilities')
147
148env.Install(util_install_dir, env.SharedLibrary(os.path.join(util_dir, 'polygon_ext'),
149                                                map(lambda s: os.path.join(util_dir, s), ['polygon_ext.c'])))
150env.Install(util_install_dir, env.SharedLibrary(os.path.join(util_dir, 'util_ext'),
151                                                map(lambda s: os.path.join(util_dir, s), ['util_ext.c'])))
152env.Install(util_install_dir, env.SharedLibrary(os.path.join(util_dir, 'sparse_ext'),
153                                                map(lambda s: os.path.join(util_dir, s), ['sparse_ext.c'])))
154
155# Abstract_2d_finite_volumes
156a2fv_env = env.Copy()
157a2fv_env.Append(CPPPATH=[os.path.join('#', anuga_root, 'utilities')])
158
159a2fv_dir = os.path.join(anuga_root, 'abstract_2d_finite_volumes')
160
161a2fv_install_dir = os.path.join(install_root, 'abstract_2d_finite_volumes')
162
163env.Install(a2fv_install_dir, a2fv_env.SharedLibrary(os.path.join(a2fv_dir, 'quantity_ext'),
164                                                     map(lambda s: os.path.join(a2fv_dir, s), ['quantity_ext.c'])))
165
166# Shallow_water
167sw_env = env.Copy()
168sw_env.Append(CPPPATH=[os.path.join('#', anuga_root, 'utilities')])
169
170sw_dir = os.path.join(anuga_root, 'shallow_water')
171sw_install_dir = os.path.join(install_root, 'shallow_water')
172
173env.Install(sw_install_dir, sw_env.SharedLibrary(os.path.join(sw_dir, 'shallow_water_ext'),
174                                                 map(lambda s: os.path.join(sw_dir, s), ['shallow_water_ext.c'])))
175env.Install(a2fv_install_dir, sw_env.SharedLibrary(os.path.join(sw_dir, 'shallow_water_kinetic'),
176                                                     map(lambda s: os.path.join(sw_dir, s), ['shallow_water_kinetic_ext.c'])))
Note: See TracBrowser for help on using the repository browser.