blob: e4926f29b61af2e3c67c2b784dba6997d875976c [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
7
8
9#######################################################################
10# Configuration options
11#
12# For example, invoke scons as
13#
José Fonseca81b6a802008-02-06 14:36:50 +090014# scons debug=1 dri=0 machine=x86
José Fonsecac42e6252008-01-31 13:14:35 +090015#
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
José Fonseca81b6a802008-02-06 14:36:50 +090022# machine='x86'
José Fonsecac42e6252008-01-31 13:14:35 +090023#
24# Invoke
25#
26# scons -h
27#
28# to get the full list of options. See scons manpage for more info.
29#
30
José Fonsecad710a7c2008-02-19 18:53:16 +090031platform_map = {
32 'linux2': 'linux',
33 'win32': 'winddk',
34}
35
José Fonseca26c57d12008-02-23 00:46:40 +090036default_platform = platform_map.get(sys.platform, sys.platform)
José Fonseca58a3d7d2008-02-23 19:49:08 +090037
José Fonseca26c57d12008-02-23 00:46:40 +090038if default_platform in ('linux', 'freebsd', 'darwin'):
José Fonseca58a3d7d2008-02-23 19:49:08 +090039 default_statetrackers = 'mesa'
40 default_drivers = 'softpipe,failover,i915simple,i965simple'
41 default_winsys = 'xlib'
José Fonsecae70a4312008-02-24 16:43:07 +090042 default_dri = 'yes'
José Fonseca58a3d7d2008-02-23 19:49:08 +090043elif default_platform in ('winddk',):
44 default_statetrackers = 'none'
45 default_drivers = 'softpipe,i915simple'
46 default_winsys = 'none'
José Fonsecae70a4312008-02-24 16:43:07 +090047 default_dri = 'no'
José Fonseca26c57d12008-02-23 00:46:40 +090048else:
José Fonseca58a3d7d2008-02-23 19:49:08 +090049 default_drivers = 'all'
50 default_winsys = 'all'
José Fonsecae70a4312008-02-24 16:43:07 +090051 default_dri = 'no'
52
José Fonsecad710a7c2008-02-19 18:53:16 +090053
José Fonsecac42e6252008-01-31 13:14:35 +090054# TODO: auto-detect defaults
55opts = Options('config.py')
56opts.Add(BoolOption('debug', 'build debug version', False))
José Fonsecac42e6252008-01-31 13:14:35 +090057opts.Add(EnumOption('machine', 'use machine-specific assembly code', 'x86',
58 allowed_values=('generic', 'x86', 'x86-64')))
José Fonseca26c57d12008-02-23 00:46:40 +090059opts.Add(EnumOption('platform', 'target platform', default_platform,
José Fonsecad710a7c2008-02-19 18:53:16 +090060 allowed_values=('linux', 'cell', 'winddk')))
José Fonseca58a3d7d2008-02-23 19:49:08 +090061opts.Add(ListOption('statetrackers', 'state_trackers to build', default_statetrackers,
José Fonseca26c57d12008-02-23 00:46:40 +090062 [
63 'mesa',
64 ],
65 ))
José Fonseca58a3d7d2008-02-23 19:49:08 +090066opts.Add(ListOption('drivers', 'pipe drivers to build', default_drivers,
67 [
68 'softpipe',
69 'failover',
70 'i915simple',
71 'i965simple',
72 'cell',
73 ],
74 ))
75opts.Add(ListOption('winsys', 'winsys drivers to build', default_winsys,
76 [
77 'xlib',
78 'intel',
79 ],
80 ))
81opts.Add(BoolOption('llvm', 'use LLVM', 'no'))
José Fonsecae70a4312008-02-24 16:43:07 +090082opts.Add(BoolOption('dri', 'build DRI drivers', default_dri))
José Fonsecac42e6252008-01-31 13:14:35 +090083
José Fonseca81b6a802008-02-06 14:36:50 +090084env = Environment(
85 options = opts,
86 ENV = os.environ)
José Fonsecac42e6252008-01-31 13:14:35 +090087Help(opts.GenerateHelpText(env))
88
89# for debugging
90#print env.Dump()
91
José Fonsecac42e6252008-01-31 13:14:35 +090092# replicate options values in local variables
93debug = env['debug']
94dri = env['dri']
José Fonsecae773a812008-02-19 10:50:39 +090095llvm = env['llvm']
José Fonsecac42e6252008-01-31 13:14:35 +090096machine = env['machine']
José Fonsecad710a7c2008-02-19 18:53:16 +090097platform = env['platform']
José Fonsecac42e6252008-01-31 13:14:35 +090098
99# derived options
100x86 = machine == 'x86'
José Fonsecad710a7c2008-02-19 18:53:16 +0900101gcc = platform in ('linux', 'freebsd', 'darwin')
102msvc = platform in ('win32', 'winddk')
José Fonsecac42e6252008-01-31 13:14:35 +0900103
104Export([
105 'debug',
106 'x86',
107 'dri',
José Fonsecae773a812008-02-19 10:50:39 +0900108 'llvm',
José Fonsecac42e6252008-01-31 13:14:35 +0900109 'platform',
110 'gcc',
111 'msvc',
112])
113
114
115#######################################################################
116# Environment setup
117#
José Fonsecad710a7c2008-02-19 18:53:16 +0900118# TODO: put the compiler specific settings in separate files
José Fonsecac42e6252008-01-31 13:14:35 +0900119# TODO: auto-detect as much as possible
120
José Fonsecad710a7c2008-02-19 18:53:16 +0900121
122if platform == 'winddk':
José Fonsecaefd33682008-02-25 14:46:53 +0900123 env.Tool('winddk', ['.'])
124
125 env.Append(CPPPATH = [
126 env['SDK_INC_PATH'],
127 env['DDK_INC_PATH'],
128 env['WDM_INC_PATH'],
129 env['CRT_INC_PATH'],
130 ])
José Fonsecad710a7c2008-02-19 18:53:16 +0900131
José Fonsecac42e6252008-01-31 13:14:35 +0900132# Optimization flags
133if gcc:
134 if debug:
135 env.Append(CFLAGS = '-O0 -g3')
136 env.Append(CXXFLAGS = '-O0 -g3')
137 else:
138 env.Append(CFLAGS = '-O3 -g3')
139 env.Append(CXXFLAGS = '-O3 -g3')
140
José Fonseca26c57d12008-02-23 00:46:40 +0900141 env.Append(CFLAGS = '-Wall -Wmissing-prototypes -Wno-long-long -ffast-math -pedantic')
José Fonsecac42e6252008-01-31 13:14:35 +0900142 env.Append(CXXFLAGS = '-Wall -pedantic')
143
144 # Be nice to Eclipse
145 env.Append(CFLAGS = '-fmessage-length=0')
146 env.Append(CXXFLAGS = '-fmessage-length=0')
147
José Fonsecac8b069c2008-02-25 17:55:45 +0900148if msvc:
149 env.Append(CFLAGS = '/W3')
150 if debug:
151 cflags = [
152 '/Od', # disable optimizations
153 '/Oy-', # disable frame pointer omission
154 '/Zi', # enable enable debugging information
155 ]
156 else:
157 cflags = [
158 '/Ox', # maximum optimizations
159 '/Os', # favor code space
160 '/Zi', # enable enable debugging information
161 ]
162 env.Append(CFLAGS = cflags)
163 env.Append(CXXFLAGS = cflags)
164
José Fonsecac42e6252008-01-31 13:14:35 +0900165
José Fonseca00137962008-02-07 19:59:17 +0900166# Defines
José Fonsecac42e6252008-01-31 13:14:35 +0900167if debug:
José Fonsecac8b069c2008-02-25 17:55:45 +0900168 if gcc:
169 env.Append(CPPDEFINES = ['DEBUG'])
170 if msvc:
171 env.Append(CPPDEFINES = [
172 ('DBG', '1'),
173 ('DEBUG', '1'),
174 ('_DEBUG', '1'),
175 ])
José Fonsecac42e6252008-01-31 13:14:35 +0900176else:
177 env.Append(CPPDEFINES = ['NDEBUG'])
178
179
180# Includes
181env.Append(CPPPATH = [
182 '#/include',
José Fonseca33ceb672008-02-18 10:52:44 +0000183 '#/src/gallium/include',
184 '#/src/gallium/auxiliary',
185 '#/src/gallium/drivers',
José Fonsecac42e6252008-01-31 13:14:35 +0900186])
187
188
189# x86 assembly
190if x86:
191 env.Append(CPPDEFINES = [
192 'USE_X86_ASM',
193 'USE_MMX_ASM',
194 'USE_3DNOW_ASM',
195 'USE_SSE_ASM',
196 ])
197 if gcc:
198 env.Append(CFLAGS = '-m32')
199 env.Append(CXXFLAGS = '-m32')
200
José Fonsecac42e6252008-01-31 13:14:35 +0900201
José Fonseca00137962008-02-07 19:59:17 +0900202# Posix
203if platform in ('posix', 'linux', 'freebsd', 'darwin'):
204 env.Append(CPPDEFINES = [
205 '_POSIX_SOURCE',
206 ('_POSIX_C_SOURCE', '199309L'),
207 '_SVID_SOURCE',
208 '_BSD_SOURCE',
209 '_GNU_SOURCE',
210
211 'PTHREADS',
212 'HAVE_POSIX_MEMALIGN',
213 ])
214 env.Append(CPPPATH = ['/usr/X11R6/include'])
215 env.Append(LIBPATH = ['/usr/X11R6/lib'])
216 env.Append(LIBS = [
217 'm',
218 'pthread',
219 'expat',
220 'dl',
221 ])
222
José Fonsecac42e6252008-01-31 13:14:35 +0900223
224# DRI
225if dri:
226 env.ParseConfig('pkg-config --cflags --libs libdrm')
227 env.Append(CPPDEFINES = [
228 ('USE_EXTERNAL_DXTN_LIB', '1'),
229 'IN_DRI_DRIVER',
230 'GLX_DIRECT_RENDERING',
231 'GLX_INDIRECT_RENDERING',
232 ])
233
José Fonsecae773a812008-02-19 10:50:39 +0900234# LLVM
235if llvm:
236 # See also http://www.scons.org/wiki/UsingPkgConfig
237 env.ParseConfig('llvm-config --cflags --ldflags --libs')
238 env.Append(CPPDEFINES = ['MESA_LLVM'])
239 env.Append(CXXFLAGS = ['-Wno-long-long'])
240
241
José Fonsecac42e6252008-01-31 13:14:35 +0900242# libGL
José Fonsecae70a4312008-02-24 16:43:07 +0900243if platform not in ('winddk',):
José Fonsecac42e6252008-01-31 13:14:35 +0900244 env.Append(LIBS = [
245 'X11',
246 'Xext',
247 'Xxf86vm',
248 'Xdamage',
249 'Xfixes',
250 ])
251
252Export('env')
253
254
255#######################################################################
256# Convenience Library Builder
257# based on the stock StaticLibrary and SharedLibrary builders
258
259def createConvenienceLibBuilder(env):
260 """This is a utility function that creates the ConvenienceLibrary
261 Builder in an Environment if it is not there already.
262
263 If it is already there, we return the existing one.
264 """
265
266 try:
267 convenience_lib = env['BUILDERS']['ConvenienceLibrary']
268 except KeyError:
269 action_list = [ Action("$ARCOM", "$ARCOMSTR") ]
270 if env.Detect('ranlib'):
271 ranlib_action = Action("$RANLIBCOM", "$RANLIBCOMSTR")
272 action_list.append(ranlib_action)
273
274 convenience_lib = Builder(action = action_list,
275 emitter = '$LIBEMITTER',
276 prefix = '$LIBPREFIX',
277 suffix = '$LIBSUFFIX',
278 src_suffix = '$SHOBJSUFFIX',
279 src_builder = 'SharedObject')
280 env['BUILDERS']['ConvenienceLibrary'] = convenience_lib
281 env['BUILDERS']['Library'] = convenience_lib
282
283 return convenience_lib
284
285createConvenienceLibBuilder(env)
286
287
288#######################################################################
289# Invoke SConscripts
290
José Fonsecaf4192cb42008-01-31 14:21:49 +0900291# Put build output in a separate dir, which depends on the current configuration
292# See also http://www.scons.org/wiki/AdvancedBuildExample
293build_topdir = 'build'
294build_subdir = platform
295if dri:
296 build_subdir += "-dri"
José Fonsecae773a812008-02-19 10:50:39 +0900297if llvm:
298 build_subdir += "-llvm"
José Fonsecaf4192cb42008-01-31 14:21:49 +0900299if x86:
300 build_subdir += "-x86"
301if debug:
302 build_subdir += "-debug"
303build_dir = os.path.join(build_topdir, build_subdir)
304
305# TODO: Build several variants at the same time?
306# http://www.scons.org/wiki/SimultaneousVariantBuilds
José Fonsecac42e6252008-01-31 13:14:35 +0900307
308SConscript(
José Fonseca33ceb672008-02-18 10:52:44 +0000309 'src/SConscript',
José Fonsecac42e6252008-01-31 13:14:35 +0900310 build_dir = build_dir,
311 duplicate = 0 # http://www.scons.org/doc/0.97/HTML/scons-user/x2261.html
312)