A few more tweaks to get correct WINDDK compilation.
[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 import ntpath
124 escape = env['ESCAPE']
125 env.Tool('winddk', '.')
126 if 'BASEDIR' in os.environ:
127 WINDDK = os.environ['BASEDIR']
128 else:
129 WINDDK = "C:\\WINDDK\\3790.1830"
130 # NOTE: We need this elaborate construct to get the absolute paths and
131 # forward slashes to msvc unharmed when cross compiling from posix platforms
132 #env.Append(CPPFLAGS = [
133 # escape('/I' + ntpath.join(WINDDK, 'inc\\wxp')),
134 # escape('/I' + ntpath.join(WINDDK, 'inc\\ddk\\wxp')),
135 # escape('/I' + ntpath.join(WINDDK, 'inc\\ddk\\wdm\\wxp')),
136 # escape('/I' + ntpath.join(WINDDK, 'inc\\crt')),
137 #])
138
139 env.Append(CFLAGS = '/W3')
140 if debug:
141 env.Append(CPPDEFINES = [
142 ('DBG', '1'),
143 ('DEBUG', '1'),
144 ('_DEBUG', '1'),
145 ])
146 env.Append(CFLAGS = '/Od /Zi')
147 env.Append(CXXFLAGS = '/Od /Zi')
148
149
150 # Optimization flags
151 if gcc:
152 if debug:
153 env.Append(CFLAGS = '-O0 -g3')
154 env.Append(CXXFLAGS = '-O0 -g3')
155 else:
156 env.Append(CFLAGS = '-O3 -g3')
157 env.Append(CXXFLAGS = '-O3 -g3')
158
159 env.Append(CFLAGS = '-Wall -Wmissing-prototypes -Wno-long-long -ffast-math -pedantic')
160 env.Append(CXXFLAGS = '-Wall -pedantic')
161
162 # Be nice to Eclipse
163 env.Append(CFLAGS = '-fmessage-length=0')
164 env.Append(CXXFLAGS = '-fmessage-length=0')
165
166
167 # Defines
168 if debug:
169 env.Append(CPPDEFINES = ['DEBUG'])
170 else:
171 env.Append(CPPDEFINES = ['NDEBUG'])
172
173
174 # Includes
175 env.Append(CPPPATH = [
176 '#/include',
177 '#/src/gallium/include',
178 '#/src/gallium/auxiliary',
179 '#/src/gallium/drivers',
180 ])
181
182
183 # x86 assembly
184 if x86:
185 env.Append(CPPDEFINES = [
186 'USE_X86_ASM',
187 'USE_MMX_ASM',
188 'USE_3DNOW_ASM',
189 'USE_SSE_ASM',
190 ])
191 if gcc:
192 env.Append(CFLAGS = '-m32')
193 env.Append(CXXFLAGS = '-m32')
194
195
196 # Posix
197 if platform in ('posix', 'linux', 'freebsd', 'darwin'):
198 env.Append(CPPDEFINES = [
199 '_POSIX_SOURCE',
200 ('_POSIX_C_SOURCE', '199309L'),
201 '_SVID_SOURCE',
202 '_BSD_SOURCE',
203 '_GNU_SOURCE',
204
205 'PTHREADS',
206 'HAVE_POSIX_MEMALIGN',
207 ])
208 env.Append(CPPPATH = ['/usr/X11R6/include'])
209 env.Append(LIBPATH = ['/usr/X11R6/lib'])
210 env.Append(LIBS = [
211 'm',
212 'pthread',
213 'expat',
214 'dl',
215 ])
216
217
218 # DRI
219 if dri:
220 env.ParseConfig('pkg-config --cflags --libs libdrm')
221 env.Append(CPPDEFINES = [
222 ('USE_EXTERNAL_DXTN_LIB', '1'),
223 'IN_DRI_DRIVER',
224 'GLX_DIRECT_RENDERING',
225 'GLX_INDIRECT_RENDERING',
226 ])
227
228 # LLVM
229 if llvm:
230 # See also http://www.scons.org/wiki/UsingPkgConfig
231 env.ParseConfig('llvm-config --cflags --ldflags --libs')
232 env.Append(CPPDEFINES = ['MESA_LLVM'])
233 env.Append(CXXFLAGS = ['-Wno-long-long'])
234
235
236 # libGL
237 if platform not in ('winddk',):
238 env.Append(LIBS = [
239 'X11',
240 'Xext',
241 'Xxf86vm',
242 'Xdamage',
243 'Xfixes',
244 ])
245
246 Export('env')
247
248
249 #######################################################################
250 # Convenience Library Builder
251 # based on the stock StaticLibrary and SharedLibrary builders
252
253 def createConvenienceLibBuilder(env):
254 """This is a utility function that creates the ConvenienceLibrary
255 Builder in an Environment if it is not there already.
256
257 If it is already there, we return the existing one.
258 """
259
260 try:
261 convenience_lib = env['BUILDERS']['ConvenienceLibrary']
262 except KeyError:
263 action_list = [ Action("$ARCOM", "$ARCOMSTR") ]
264 if env.Detect('ranlib'):
265 ranlib_action = Action("$RANLIBCOM", "$RANLIBCOMSTR")
266 action_list.append(ranlib_action)
267
268 convenience_lib = Builder(action = action_list,
269 emitter = '$LIBEMITTER',
270 prefix = '$LIBPREFIX',
271 suffix = '$LIBSUFFIX',
272 src_suffix = '$SHOBJSUFFIX',
273 src_builder = 'SharedObject')
274 env['BUILDERS']['ConvenienceLibrary'] = convenience_lib
275 env['BUILDERS']['Library'] = convenience_lib
276
277 return convenience_lib
278
279 createConvenienceLibBuilder(env)
280
281
282 #######################################################################
283 # Invoke SConscripts
284
285 # Put build output in a separate dir, which depends on the current configuration
286 # See also http://www.scons.org/wiki/AdvancedBuildExample
287 build_topdir = 'build'
288 build_subdir = platform
289 if dri:
290 build_subdir += "-dri"
291 if llvm:
292 build_subdir += "-llvm"
293 if x86:
294 build_subdir += "-x86"
295 if debug:
296 build_subdir += "-debug"
297 build_dir = os.path.join(build_topdir, build_subdir)
298
299 # TODO: Build several variants at the same time?
300 # http://www.scons.org/wiki/SimultaneousVariantBuilds
301
302 SConscript(
303 'src/SConscript',
304 build_dir = build_dir,
305 duplicate = 0 # http://www.scons.org/doc/0.97/HTML/scons-user/x2261.html
306 )