blob: c9a4031fbb2e148addd469cb9edbfc9549eceae2 [file] [log] [blame]
José Fonsecac42e6252008-01-31 13:14:35 +09001#######################################################################
2# Top-level SConstruct
3
4import os
José Fonsecaf4192cb42008-01-31 14:21:49 +09005import os.path
José Fonsecac42e6252008-01-31 13:14:35 +09006import sys
José Fonseca67099cd2008-02-27 16:53:52 +09007import platform as _platform
José Fonsecac42e6252008-01-31 13:14:35 +09008
9
10#######################################################################
11# Configuration options
12#
13# For example, invoke scons as
14#
José Fonseca81b6a802008-02-06 14:36:50 +090015# scons debug=1 dri=0 machine=x86
José Fonsecac42e6252008-01-31 13:14:35 +090016#
17# to set configuration variables. Or you can write those options to a file
18# named config.py:
19#
20# # config.py
21# debug=1
22# dri=0
José Fonseca81b6a802008-02-06 14:36:50 +090023# machine='x86'
José Fonsecac42e6252008-01-31 13:14:35 +090024#
25# Invoke
26#
27# scons -h
28#
29# to get the full list of options. See scons manpage for more info.
30#
31
José Fonsecad710a7c2008-02-19 18:53:16 +090032platform_map = {
33 'linux2': 'linux',
34 'win32': 'winddk',
35}
José Fonseca67099cd2008-02-27 16:53:52 +090036default_platform = sys.platform
37default_platform = platform_map.get(default_platform, default_platform)
José Fonsecad710a7c2008-02-19 18:53:16 +090038
José Fonseca67099cd2008-02-27 16:53:52 +090039machine_map = {
40 'x86': 'x86',
41 'i386': 'x86',
42 'i486': 'x86',
43 'i586': 'x86',
44 'i686': 'x86',
45 'x86_64': 'x86_64',
46}
47if 'PROCESSOR_ARCHITECTURE' in os.environ:
48 default_machine = os.environ['PROCESSOR_ARCHITECTURE']
49else:
50 default_machine = _platform.machine()
51default_machine = machine_map.get(default_machine, 'generic')
José Fonseca58a3d7d2008-02-23 19:49:08 +090052
José Fonseca26c57d12008-02-23 00:46:40 +090053if default_platform in ('linux', 'freebsd', 'darwin'):
José Fonseca58a3d7d2008-02-23 19:49:08 +090054 default_statetrackers = 'mesa'
55 default_drivers = 'softpipe,failover,i915simple,i965simple'
56 default_winsys = 'xlib'
José Fonsecae70a4312008-02-24 16:43:07 +090057 default_dri = 'yes'
José Fonseca58a3d7d2008-02-23 19:49:08 +090058elif default_platform in ('winddk',):
59 default_statetrackers = 'none'
60 default_drivers = 'softpipe,i915simple'
61 default_winsys = 'none'
José Fonsecae70a4312008-02-24 16:43:07 +090062 default_dri = 'no'
José Fonseca26c57d12008-02-23 00:46:40 +090063else:
José Fonseca58a3d7d2008-02-23 19:49:08 +090064 default_drivers = 'all'
65 default_winsys = 'all'
José Fonsecae70a4312008-02-24 16:43:07 +090066 default_dri = 'no'
67
José Fonsecad710a7c2008-02-19 18:53:16 +090068
José Fonsecac42e6252008-01-31 13:14:35 +090069# TODO: auto-detect defaults
70opts = Options('config.py')
José Fonseca67099cd2008-02-27 16:53:52 +090071opts.Add(BoolOption('debug', 'build debug version', 'no'))
72opts.Add(EnumOption('machine', 'use machine-specific assembly code', default_machine,
73 allowed_values=('generic', 'x86', 'x86_64')))
José Fonseca26c57d12008-02-23 00:46:40 +090074opts.Add(EnumOption('platform', 'target platform', default_platform,
José Fonsecad710a7c2008-02-19 18:53:16 +090075 allowed_values=('linux', 'cell', 'winddk')))
José Fonseca58a3d7d2008-02-23 19:49:08 +090076opts.Add(ListOption('statetrackers', 'state_trackers to build', default_statetrackers,
José Fonseca26c57d12008-02-23 00:46:40 +090077 [
78 'mesa',
79 ],
80 ))
José Fonseca58a3d7d2008-02-23 19:49:08 +090081opts.Add(ListOption('drivers', 'pipe drivers to build', default_drivers,
82 [
83 'softpipe',
84 'failover',
85 'i915simple',
86 'i965simple',
87 'cell',
88 ],
89 ))
90opts.Add(ListOption('winsys', 'winsys drivers to build', default_winsys,
91 [
92 'xlib',
93 'intel',
94 ],
95 ))
96opts.Add(BoolOption('llvm', 'use LLVM', 'no'))
José Fonsecae70a4312008-02-24 16:43:07 +090097opts.Add(BoolOption('dri', 'build DRI drivers', default_dri))
José Fonsecac42e6252008-01-31 13:14:35 +090098
José Fonseca81b6a802008-02-06 14:36:50 +090099env = Environment(
100 options = opts,
101 ENV = os.environ)
José Fonsecac42e6252008-01-31 13:14:35 +0900102Help(opts.GenerateHelpText(env))
103
104# for debugging
105#print env.Dump()
106
José Fonsecac42e6252008-01-31 13:14:35 +0900107# replicate options values in local variables
108debug = env['debug']
109dri = env['dri']
José Fonsecae773a812008-02-19 10:50:39 +0900110llvm = env['llvm']
José Fonsecac42e6252008-01-31 13:14:35 +0900111machine = env['machine']
José Fonsecad710a7c2008-02-19 18:53:16 +0900112platform = env['platform']
José Fonsecac42e6252008-01-31 13:14:35 +0900113
114# derived options
115x86 = machine == 'x86'
José Fonsecad710a7c2008-02-19 18:53:16 +0900116gcc = platform in ('linux', 'freebsd', 'darwin')
117msvc = platform in ('win32', 'winddk')
José Fonsecac42e6252008-01-31 13:14:35 +0900118
119Export([
120 'debug',
121 'x86',
122 'dri',
José Fonsecae773a812008-02-19 10:50:39 +0900123 'llvm',
José Fonsecac42e6252008-01-31 13:14:35 +0900124 'platform',
125 'gcc',
126 'msvc',
127])
128
129
130#######################################################################
131# Environment setup
132#
José Fonsecad710a7c2008-02-19 18:53:16 +0900133# TODO: put the compiler specific settings in separate files
José Fonsecac42e6252008-01-31 13:14:35 +0900134# TODO: auto-detect as much as possible
135
José Fonsecad710a7c2008-02-19 18:53:16 +0900136
137if platform == 'winddk':
José Fonsecaefd33682008-02-25 14:46:53 +0900138 env.Tool('winddk', ['.'])
139
140 env.Append(CPPPATH = [
141 env['SDK_INC_PATH'],
142 env['DDK_INC_PATH'],
143 env['WDM_INC_PATH'],
144 env['CRT_INC_PATH'],
145 ])
José Fonsecad710a7c2008-02-19 18:53:16 +0900146
José Fonsecac42e6252008-01-31 13:14:35 +0900147# Optimization flags
148if gcc:
149 if debug:
150 env.Append(CFLAGS = '-O0 -g3')
151 env.Append(CXXFLAGS = '-O0 -g3')
152 else:
153 env.Append(CFLAGS = '-O3 -g3')
154 env.Append(CXXFLAGS = '-O3 -g3')
155
José Fonseca26c57d12008-02-23 00:46:40 +0900156 env.Append(CFLAGS = '-Wall -Wmissing-prototypes -Wno-long-long -ffast-math -pedantic')
José Fonsecac42e6252008-01-31 13:14:35 +0900157 env.Append(CXXFLAGS = '-Wall -pedantic')
158
159 # Be nice to Eclipse
160 env.Append(CFLAGS = '-fmessage-length=0')
161 env.Append(CXXFLAGS = '-fmessage-length=0')
162
José Fonsecac8b069c2008-02-25 17:55:45 +0900163if msvc:
164 env.Append(CFLAGS = '/W3')
165 if debug:
166 cflags = [
167 '/Od', # disable optimizations
168 '/Oy-', # disable frame pointer omission
José Fonsecac8b069c2008-02-25 17:55:45 +0900169 ]
170 else:
171 cflags = [
172 '/Ox', # maximum optimizations
173 '/Os', # favor code space
José Fonsecac8b069c2008-02-25 17:55:45 +0900174 ]
175 env.Append(CFLAGS = cflags)
176 env.Append(CXXFLAGS = cflags)
José Fonseca6d336582008-02-26 22:31:03 +0900177 # Put debugging information in a separate .pdb file for each object file as
178 # descrived in the scons manpage
179 env['CCPDBFLAGS'] = '/Zi /Fd${TARGET}.pdb'
José Fonsecac42e6252008-01-31 13:14:35 +0900180
José Fonseca00137962008-02-07 19:59:17 +0900181# Defines
José Fonsecac42e6252008-01-31 13:14:35 +0900182if debug:
José Fonsecac8b069c2008-02-25 17:55:45 +0900183 if gcc:
184 env.Append(CPPDEFINES = ['DEBUG'])
185 if msvc:
186 env.Append(CPPDEFINES = [
187 ('DBG', '1'),
188 ('DEBUG', '1'),
189 ('_DEBUG', '1'),
190 ])
José Fonsecac42e6252008-01-31 13:14:35 +0900191else:
192 env.Append(CPPDEFINES = ['NDEBUG'])
193
194
195# Includes
196env.Append(CPPPATH = [
197 '#/include',
José Fonseca33ceb672008-02-18 10:52:44 +0000198 '#/src/gallium/include',
199 '#/src/gallium/auxiliary',
200 '#/src/gallium/drivers',
José Fonsecac42e6252008-01-31 13:14:35 +0900201])
202
203
204# x86 assembly
205if x86:
206 env.Append(CPPDEFINES = [
207 'USE_X86_ASM',
208 'USE_MMX_ASM',
209 'USE_3DNOW_ASM',
210 'USE_SSE_ASM',
211 ])
212 if gcc:
213 env.Append(CFLAGS = '-m32')
214 env.Append(CXXFLAGS = '-m32')
215
José Fonsecac42e6252008-01-31 13:14:35 +0900216
José Fonseca00137962008-02-07 19:59:17 +0900217# Posix
218if platform in ('posix', 'linux', 'freebsd', 'darwin'):
219 env.Append(CPPDEFINES = [
220 '_POSIX_SOURCE',
221 ('_POSIX_C_SOURCE', '199309L'),
222 '_SVID_SOURCE',
223 '_BSD_SOURCE',
224 '_GNU_SOURCE',
225
226 'PTHREADS',
227 'HAVE_POSIX_MEMALIGN',
228 ])
229 env.Append(CPPPATH = ['/usr/X11R6/include'])
230 env.Append(LIBPATH = ['/usr/X11R6/lib'])
231 env.Append(LIBS = [
232 'm',
233 'pthread',
234 'expat',
235 'dl',
236 ])
237
José Fonsecac42e6252008-01-31 13:14:35 +0900238
239# DRI
240if dri:
241 env.ParseConfig('pkg-config --cflags --libs libdrm')
242 env.Append(CPPDEFINES = [
243 ('USE_EXTERNAL_DXTN_LIB', '1'),
244 'IN_DRI_DRIVER',
245 'GLX_DIRECT_RENDERING',
246 'GLX_INDIRECT_RENDERING',
247 ])
248
José Fonsecae773a812008-02-19 10:50:39 +0900249# LLVM
250if llvm:
251 # See also http://www.scons.org/wiki/UsingPkgConfig
252 env.ParseConfig('llvm-config --cflags --ldflags --libs')
253 env.Append(CPPDEFINES = ['MESA_LLVM'])
254 env.Append(CXXFLAGS = ['-Wno-long-long'])
255
256
José Fonsecac42e6252008-01-31 13:14:35 +0900257# libGL
José Fonsecae70a4312008-02-24 16:43:07 +0900258if platform not in ('winddk',):
José Fonsecac42e6252008-01-31 13:14:35 +0900259 env.Append(LIBS = [
260 'X11',
261 'Xext',
262 'Xxf86vm',
263 'Xdamage',
264 'Xfixes',
265 ])
266
267Export('env')
268
269
270#######################################################################
271# Convenience Library Builder
272# based on the stock StaticLibrary and SharedLibrary builders
273
274def createConvenienceLibBuilder(env):
275 """This is a utility function that creates the ConvenienceLibrary
276 Builder in an Environment if it is not there already.
277
278 If it is already there, we return the existing one.
279 """
280
281 try:
282 convenience_lib = env['BUILDERS']['ConvenienceLibrary']
283 except KeyError:
284 action_list = [ Action("$ARCOM", "$ARCOMSTR") ]
285 if env.Detect('ranlib'):
286 ranlib_action = Action("$RANLIBCOM", "$RANLIBCOMSTR")
287 action_list.append(ranlib_action)
288
289 convenience_lib = Builder(action = action_list,
290 emitter = '$LIBEMITTER',
291 prefix = '$LIBPREFIX',
292 suffix = '$LIBSUFFIX',
293 src_suffix = '$SHOBJSUFFIX',
294 src_builder = 'SharedObject')
295 env['BUILDERS']['ConvenienceLibrary'] = convenience_lib
296 env['BUILDERS']['Library'] = convenience_lib
297
298 return convenience_lib
299
300createConvenienceLibBuilder(env)
301
302
303#######################################################################
304# Invoke SConscripts
305
José Fonsecaf4192cb42008-01-31 14:21:49 +0900306# Put build output in a separate dir, which depends on the current configuration
307# See also http://www.scons.org/wiki/AdvancedBuildExample
308build_topdir = 'build'
309build_subdir = platform
310if dri:
311 build_subdir += "-dri"
José Fonsecae773a812008-02-19 10:50:39 +0900312if llvm:
313 build_subdir += "-llvm"
José Fonseca67099cd2008-02-27 16:53:52 +0900314if env['machine'] != 'generic':
315 build_subdir += '-' + env['machine']
José Fonsecaf4192cb42008-01-31 14:21:49 +0900316if debug:
317 build_subdir += "-debug"
318build_dir = os.path.join(build_topdir, build_subdir)
319
320# TODO: Build several variants at the same time?
321# http://www.scons.org/wiki/SimultaneousVariantBuilds
José Fonsecac42e6252008-01-31 13:14:35 +0900322
323SConscript(
José Fonseca33ceb672008-02-18 10:52:44 +0000324 'src/SConscript',
José Fonsecac42e6252008-01-31 13:14:35 +0900325 build_dir = build_dir,
326 duplicate = 0 # http://www.scons.org/doc/0.97/HTML/scons-user/x2261.html
327)