SConstruct revision 687a8b96ef13658bbe779d0011ce1144844f1972
1#######################################################################
2# Top-level SConstruct
3
4import os
5import os.path
6import sys
7
8
9#######################################################################
10# Configuration options
11#
12# For example, invoke scons as 
13#
14#   scons debug=1 dri=0 machine=x86
15#
16# to set configuration variables. Or you can write those options to a file
17# named config.py:
18#
19#   # config.py
20#   debug=1
21#   dri=0
22#   machine='x86'
23# 
24# Invoke
25#
26#   scons -h
27#
28# to get the full list of options. See scons manpage for more info.
29#  
30
31# TODO: auto-detect defaults
32opts = Options('config.py')
33opts.Add(BoolOption('debug', 'build debug version', False))
34opts.Add(BoolOption('dri', 'build dri drivers', False))
35opts.Add(EnumOption('machine', 'use machine-specific assembly code', 'x86',
36                     allowed_values=('generic', 'x86', 'x86-64')))
37
38env = Environment(
39	options = opts, 
40	ENV = os.environ)
41Help(opts.GenerateHelpText(env))
42
43# for debugging
44#print env.Dump()
45
46if 0:
47	# platform will be typically 'posix' or 'win32' 
48	platform = env['PLATFORM']
49else:
50	# platform will be one of 'linux', 'freebsd', 'win32', 'darwin', etc.
51	platform = sys.platform
52	if platform == 'linux2':
53		platform = 'linux' 
54
55# replicate options values in local variables
56debug = env['debug']
57dri = env['dri']
58machine = env['machine']
59
60# derived options
61x86 = machine == 'x86'
62gcc = platform in ('posix', 'linux', 'freebsd', 'darwin')
63msvc = platform == 'win32'
64
65Export([
66	'debug', 
67	'x86', 
68	'dri', 
69	'platform',
70	'gcc',
71	'msvc',
72])
73
74
75#######################################################################
76# Environment setup
77#
78# TODO: put the compiler specific settings in seperate files
79# TODO: auto-detect as much as possible
80
81         
82# Optimization flags
83if gcc:
84	if debug:
85		env.Append(CFLAGS = '-O0 -g3')
86		env.Append(CXXFLAGS = '-O0 -g3')
87	else:
88		env.Append(CFLAGS = '-O3 -g3')
89		env.Append(CXXFLAGS = '-O3 -g3')
90
91	env.Append(CFLAGS = '-Wall -Wmissing-prototypes -std=c99 -ffast-math -pedantic')
92	env.Append(CXXFLAGS = '-Wall -pedantic')
93	
94	# Be nice to Eclipse
95	env.Append(CFLAGS = '-fmessage-length=0')
96	env.Append(CXXFLAGS = '-fmessage-length=0')
97
98
99# Defines
100if debug:
101	env.Append(CPPDEFINES = ['DEBUG'])
102else:
103	env.Append(CPPDEFINES = ['NDEBUG'])
104
105
106# Includes
107env.Append(CPPPATH = [
108	'#/include',
109	'#/src/mesa',
110	'#/src/mesa/main',
111	'#/src/gallium/include',
112	'#/src/gallium/auxiliary',
113	'#/src/gallium/drivers',
114])
115
116
117# x86 assembly
118if x86:
119	env.Append(CPPDEFINES = [
120		'USE_X86_ASM', 
121		'USE_MMX_ASM',
122		'USE_3DNOW_ASM',
123		'USE_SSE_ASM',
124	])
125	if gcc:	
126		env.Append(CFLAGS = '-m32')
127		env.Append(CXXFLAGS = '-m32')
128
129
130# Posix
131if platform in ('posix', 'linux', 'freebsd', 'darwin'):
132	env.Append(CPPDEFINES = [
133		'_POSIX_SOURCE',
134		('_POSIX_C_SOURCE', '199309L'), 
135		'_SVID_SOURCE',
136		'_BSD_SOURCE', 
137		'_GNU_SOURCE',
138		
139		'PTHREADS',
140		'HAVE_POSIX_MEMALIGN',
141	])
142	env.Append(CPPPATH = ['/usr/X11R6/include'])
143	env.Append(LIBPATH = ['/usr/X11R6/lib'])
144	env.Append(LIBS = [
145		'm',
146		'pthread',
147		'expat',
148		'dl',
149	])
150
151
152# DRI
153if dri:
154	env.ParseConfig('pkg-config --cflags --libs libdrm')
155	env.Append(CPPDEFINES = [
156		('USE_EXTERNAL_DXTN_LIB', '1'), 
157		'IN_DRI_DRIVER',
158		'GLX_DIRECT_RENDERING',
159		'GLX_INDIRECT_RENDERING',
160	])
161
162# libGL
163if 1:
164	env.Append(LIBS = [
165		'X11',
166		'Xext',
167		'Xxf86vm',
168		'Xdamage',
169		'Xfixes',
170	])
171
172Export('env')
173
174
175#######################################################################
176# Convenience Library Builder
177# based on the stock StaticLibrary and SharedLibrary builders
178
179def createConvenienceLibBuilder(env):
180    """This is a utility function that creates the ConvenienceLibrary
181    Builder in an Environment if it is not there already.
182
183    If it is already there, we return the existing one.
184    """
185
186    try:
187        convenience_lib = env['BUILDERS']['ConvenienceLibrary']
188    except KeyError:
189        action_list = [ Action("$ARCOM", "$ARCOMSTR") ]
190        if env.Detect('ranlib'):
191            ranlib_action = Action("$RANLIBCOM", "$RANLIBCOMSTR")
192            action_list.append(ranlib_action)
193
194        convenience_lib = Builder(action = action_list,
195                                  emitter = '$LIBEMITTER',
196                                  prefix = '$LIBPREFIX',
197                                  suffix = '$LIBSUFFIX',
198                                  src_suffix = '$SHOBJSUFFIX',
199                                  src_builder = 'SharedObject')
200        env['BUILDERS']['ConvenienceLibrary'] = convenience_lib
201        env['BUILDERS']['Library'] = convenience_lib
202
203    return convenience_lib
204
205createConvenienceLibBuilder(env)
206
207
208#######################################################################
209# Invoke SConscripts
210
211# Put build output in a separate dir, which depends on the current configuration
212# See also http://www.scons.org/wiki/AdvancedBuildExample
213build_topdir = 'build'
214build_subdir = platform
215if dri:
216	build_subdir += "-dri"
217if x86:
218	build_subdir += "-x86"
219if debug:
220	build_subdir += "-debug"
221build_dir = os.path.join(build_topdir, build_subdir)
222
223# TODO: Build several variants at the same time?
224# http://www.scons.org/wiki/SimultaneousVariantBuilds
225
226SConscript(
227	'src/SConscript',
228	build_dir = build_dir,
229	duplicate = 0 # http://www.scons.org/doc/0.97/HTML/scons-user/x2261.html
230)
231