scons: Prefer MSVS 2003 (patch by Mark Mueller).
[mesa.git] / SConstruct
1 #######################################################################
2 # Top-level SConstruct
3
4 import os
5 import os.path
6 import 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 platform_map = {
32 'linux2': 'linux',
33 'win32': 'winddk',
34 }
35
36 default_platform = platform_map.get(sys.platform, sys.platform)
37
38 if default_platform in ('linux', 'freebsd', 'darwin'):
39 default_statetrackers = 'mesa'
40 default_drivers = 'softpipe,failover,i915simple,i965simple'
41 default_winsys = 'xlib'
42 default_dri = 'yes'
43 elif default_platform in ('winddk',):
44 default_statetrackers = 'none'
45 default_drivers = 'softpipe,i915simple'
46 default_winsys = 'none'
47 default_dri = 'no'
48 else:
49 default_drivers = 'all'
50 default_winsys = 'all'
51 default_dri = 'no'
52
53
54 # TODO: auto-detect defaults
55 opts = Options('config.py')
56 opts.Add(BoolOption('debug', 'build debug version', False))
57 opts.Add(EnumOption('machine', 'use machine-specific assembly code', 'x86',
58 allowed_values=('generic', 'x86', 'x86-64')))
59 opts.Add(EnumOption('platform', 'target platform', default_platform,
60 allowed_values=('linux', 'cell', 'winddk')))
61 opts.Add(ListOption('statetrackers', 'state_trackers to build', default_statetrackers,
62 [
63 'mesa',
64 ],
65 ))
66 opts.Add(ListOption('drivers', 'pipe drivers to build', default_drivers,
67 [
68 'softpipe',
69 'failover',
70 'i915simple',
71 'i965simple',
72 'cell',
73 ],
74 ))
75 opts.Add(ListOption('winsys', 'winsys drivers to build', default_winsys,
76 [
77 'xlib',
78 'intel',
79 ],
80 ))
81 opts.Add(BoolOption('llvm', 'use LLVM', 'no'))
82 opts.Add(BoolOption('dri', 'build DRI drivers', default_dri))
83
84 env = Environment(
85 options = opts,
86 ENV = os.environ)
87 Help(opts.GenerateHelpText(env))
88
89 # for debugging
90 #print env.Dump()
91
92 # replicate options values in local variables
93 debug = env['debug']
94 dri = env['dri']
95 llvm = env['llvm']
96 machine = env['machine']
97 platform = env['platform']
98
99 # derived options
100 x86 = machine == 'x86'
101 gcc = platform in ('linux', 'freebsd', 'darwin')
102 msvc = platform in ('win32', 'winddk')
103
104 Export([
105 'debug',
106 'x86',
107 'dri',
108 'llvm',
109 'platform',
110 'gcc',
111 'msvc',
112 ])
113
114
115 #######################################################################
116 # Environment setup
117 #
118 # TODO: put the compiler specific settings in separate files
119 # TODO: auto-detect as much as possible
120
121
122 if platform == 'winddk':
123 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 ])
131
132 # Optimization flags
133 if 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
141 env.Append(CFLAGS = '-Wall -Wmissing-prototypes -Wno-long-long -ffast-math -pedantic')
142 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
148 if msvc:
149 # Force msvc 7.1 (visual studio 2003) for windows builds.
150 # Eventually a way to override this would be nice.
151 # See also http://www.scons.org/wiki/MsvsMultipleVersions
152 env["MSVS"] = {"VERSION": "7.1"}
153 env["MSVS_VERSION"] = "7.1"
154 Tool("msvc")(env)
155
156 env.Append(CFLAGS = '/W3')
157 if debug:
158 cflags = [
159 '/Od', # disable optimizations
160 '/Oy-', # disable frame pointer omission
161 ]
162 else:
163 cflags = [
164 '/Ox', # maximum optimizations
165 '/Os', # favor code space
166 ]
167 env.Append(CFLAGS = cflags)
168 env.Append(CXXFLAGS = cflags)
169 # Put debugging information in a separate .pdb file for each object file as
170 # descrived in the scons manpage
171 env['CCPDBFLAGS'] = '/Zi /Fd${TARGET}.pdb'
172
173 # Defines
174 if debug:
175 if gcc:
176 env.Append(CPPDEFINES = ['DEBUG'])
177 if msvc:
178 env.Append(CPPDEFINES = [
179 ('DBG', '1'),
180 ('DEBUG', '1'),
181 ('_DEBUG', '1'),
182 ])
183 else:
184 env.Append(CPPDEFINES = ['NDEBUG'])
185
186
187 # Includes
188 env.Append(CPPPATH = [
189 '#/include',
190 '#/src/gallium/include',
191 '#/src/gallium/auxiliary',
192 '#/src/gallium/drivers',
193 ])
194
195
196 # x86 assembly
197 if x86:
198 env.Append(CPPDEFINES = [
199 'USE_X86_ASM',
200 'USE_MMX_ASM',
201 'USE_3DNOW_ASM',
202 'USE_SSE_ASM',
203 ])
204 if gcc:
205 env.Append(CFLAGS = '-m32')
206 env.Append(CXXFLAGS = '-m32')
207
208
209 # Posix
210 if platform in ('posix', 'linux', 'freebsd', 'darwin'):
211 env.Append(CPPDEFINES = [
212 '_POSIX_SOURCE',
213 ('_POSIX_C_SOURCE', '199309L'),
214 '_SVID_SOURCE',
215 '_BSD_SOURCE',
216 '_GNU_SOURCE',
217
218 'PTHREADS',
219 'HAVE_POSIX_MEMALIGN',
220 ])
221 env.Append(CPPPATH = ['/usr/X11R6/include'])
222 env.Append(LIBPATH = ['/usr/X11R6/lib'])
223 env.Append(LIBS = [
224 'm',
225 'pthread',
226 'expat',
227 'dl',
228 ])
229
230
231 # DRI
232 if dri:
233 env.ParseConfig('pkg-config --cflags --libs libdrm')
234 env.Append(CPPDEFINES = [
235 ('USE_EXTERNAL_DXTN_LIB', '1'),
236 'IN_DRI_DRIVER',
237 'GLX_DIRECT_RENDERING',
238 'GLX_INDIRECT_RENDERING',
239 ])
240
241 # LLVM
242 if llvm:
243 # See also http://www.scons.org/wiki/UsingPkgConfig
244 env.ParseConfig('llvm-config --cflags --ldflags --libs')
245 env.Append(CPPDEFINES = ['MESA_LLVM'])
246 env.Append(CXXFLAGS = ['-Wno-long-long'])
247
248
249 # libGL
250 if platform not in ('winddk',):
251 env.Append(LIBS = [
252 'X11',
253 'Xext',
254 'Xxf86vm',
255 'Xdamage',
256 'Xfixes',
257 ])
258
259 Export('env')
260
261
262 #######################################################################
263 # Convenience Library Builder
264 # based on the stock StaticLibrary and SharedLibrary builders
265
266 def createConvenienceLibBuilder(env):
267 """This is a utility function that creates the ConvenienceLibrary
268 Builder in an Environment if it is not there already.
269
270 If it is already there, we return the existing one.
271 """
272
273 try:
274 convenience_lib = env['BUILDERS']['ConvenienceLibrary']
275 except KeyError:
276 action_list = [ Action("$ARCOM", "$ARCOMSTR") ]
277 if env.Detect('ranlib'):
278 ranlib_action = Action("$RANLIBCOM", "$RANLIBCOMSTR")
279 action_list.append(ranlib_action)
280
281 convenience_lib = Builder(action = action_list,
282 emitter = '$LIBEMITTER',
283 prefix = '$LIBPREFIX',
284 suffix = '$LIBSUFFIX',
285 src_suffix = '$SHOBJSUFFIX',
286 src_builder = 'SharedObject')
287 env['BUILDERS']['ConvenienceLibrary'] = convenience_lib
288 env['BUILDERS']['Library'] = convenience_lib
289
290 return convenience_lib
291
292 createConvenienceLibBuilder(env)
293
294
295 #######################################################################
296 # Invoke SConscripts
297
298 # Put build output in a separate dir, which depends on the current configuration
299 # See also http://www.scons.org/wiki/AdvancedBuildExample
300 build_topdir = 'build'
301 build_subdir = platform
302 if dri:
303 build_subdir += "-dri"
304 if llvm:
305 build_subdir += "-llvm"
306 if x86:
307 build_subdir += "-x86"
308 if debug:
309 build_subdir += "-debug"
310 build_dir = os.path.join(build_topdir, build_subdir)
311
312 # TODO: Build several variants at the same time?
313 # http://www.scons.org/wiki/SimultaneousVariantBuilds
314
315 SConscript(
316 'src/SConscript',
317 build_dir = build_dir,
318 duplicate = 0 # http://www.scons.org/doc/0.97/HTML/scons-user/x2261.html
319 )