blob: 042019539531e4676221ef9bab570625d365bc9a [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
36platform = platform_map.get(sys.platform, sys.platform)
37
José Fonsecac42e6252008-01-31 13:14:35 +090038# TODO: auto-detect defaults
39opts = Options('config.py')
40opts.Add(BoolOption('debug', 'build debug version', False))
41opts.Add(BoolOption('dri', 'build dri drivers', False))
José Fonsecae773a812008-02-19 10:50:39 +090042opts.Add(BoolOption('llvm', 'use llvm', False))
José Fonsecac42e6252008-01-31 13:14:35 +090043opts.Add(EnumOption('machine', 'use machine-specific assembly code', 'x86',
44 allowed_values=('generic', 'x86', 'x86-64')))
José Fonsecad710a7c2008-02-19 18:53:16 +090045opts.Add(EnumOption('platform', 'target platform', platform,
46 allowed_values=('linux', 'cell', 'winddk')))
José Fonsecac42e6252008-01-31 13:14:35 +090047
José Fonseca81b6a802008-02-06 14:36:50 +090048env = Environment(
49 options = opts,
50 ENV = os.environ)
José Fonsecac42e6252008-01-31 13:14:35 +090051Help(opts.GenerateHelpText(env))
52
53# for debugging
54#print env.Dump()
55
José Fonsecac42e6252008-01-31 13:14:35 +090056# replicate options values in local variables
57debug = env['debug']
58dri = env['dri']
José Fonsecae773a812008-02-19 10:50:39 +090059llvm = env['llvm']
José Fonsecac42e6252008-01-31 13:14:35 +090060machine = env['machine']
José Fonsecad710a7c2008-02-19 18:53:16 +090061platform = env['platform']
José Fonsecac42e6252008-01-31 13:14:35 +090062
63# derived options
64x86 = machine == 'x86'
José Fonsecad710a7c2008-02-19 18:53:16 +090065gcc = platform in ('linux', 'freebsd', 'darwin')
66msvc = platform in ('win32', 'winddk')
José Fonsecac42e6252008-01-31 13:14:35 +090067
68Export([
69 'debug',
70 'x86',
71 'dri',
José Fonsecae773a812008-02-19 10:50:39 +090072 'llvm',
José Fonsecac42e6252008-01-31 13:14:35 +090073 'platform',
74 'gcc',
75 'msvc',
76])
77
78
79#######################################################################
80# Environment setup
81#
José Fonsecad710a7c2008-02-19 18:53:16 +090082# TODO: put the compiler specific settings in separate files
José Fonsecac42e6252008-01-31 13:14:35 +090083# TODO: auto-detect as much as possible
84
José Fonsecad710a7c2008-02-19 18:53:16 +090085
86if platform == 'winddk':
87 import ntpath
88 escape = env['ESCAPE']
89 env.Tool('msvc')
90 if 'BASEDIR' in os.environ:
91 WINDDK = os.environ['BASEDIR']
92 else:
93 WINDDK = "C:\\WINDDK\\3790.1830"
94 # NOTE: We need this elaborate construct to get the absolute paths and
95 # forward slashes to msvc unharmed when cross compiling from posix platforms
96 env.Append(CPPFLAGS = [
97 escape('/I' + ntpath.join(WINDDK, 'inc\\ddk\\wxp')),
98 escape('/I' + ntpath.join(WINDDK, 'inc\\ddk\\wdm\\wxp')),
99 escape('/I' + ntpath.join(WINDDK, 'inc\\crt')),
100 ])
101 env.Append(CPPDEFINES = [
102 ('i386', '1'),
103 ])
104 if debug:
105 env.Append(CPPDEFINES = ['DBG'])
106
107
José Fonsecac42e6252008-01-31 13:14:35 +0900108# Optimization flags
109if gcc:
110 if debug:
111 env.Append(CFLAGS = '-O0 -g3')
112 env.Append(CXXFLAGS = '-O0 -g3')
113 else:
114 env.Append(CFLAGS = '-O3 -g3')
115 env.Append(CXXFLAGS = '-O3 -g3')
116
117 env.Append(CFLAGS = '-Wall -Wmissing-prototypes -std=c99 -ffast-math -pedantic')
118 env.Append(CXXFLAGS = '-Wall -pedantic')
119
120 # Be nice to Eclipse
121 env.Append(CFLAGS = '-fmessage-length=0')
122 env.Append(CXXFLAGS = '-fmessage-length=0')
123
José Fonsecac42e6252008-01-31 13:14:35 +0900124
José Fonseca00137962008-02-07 19:59:17 +0900125# Defines
José Fonsecac42e6252008-01-31 13:14:35 +0900126if debug:
127 env.Append(CPPDEFINES = ['DEBUG'])
128else:
129 env.Append(CPPDEFINES = ['NDEBUG'])
130
131
132# Includes
133env.Append(CPPPATH = [
134 '#/include',
José Fonseca33ceb672008-02-18 10:52:44 +0000135 '#/src/gallium/include',
136 '#/src/gallium/auxiliary',
137 '#/src/gallium/drivers',
José Fonsecac42e6252008-01-31 13:14:35 +0900138])
139
140
141# x86 assembly
142if x86:
143 env.Append(CPPDEFINES = [
144 'USE_X86_ASM',
145 'USE_MMX_ASM',
146 'USE_3DNOW_ASM',
147 'USE_SSE_ASM',
148 ])
149 if gcc:
150 env.Append(CFLAGS = '-m32')
151 env.Append(CXXFLAGS = '-m32')
152
José Fonsecac42e6252008-01-31 13:14:35 +0900153
José Fonseca00137962008-02-07 19:59:17 +0900154# Posix
155if platform in ('posix', 'linux', 'freebsd', 'darwin'):
156 env.Append(CPPDEFINES = [
157 '_POSIX_SOURCE',
158 ('_POSIX_C_SOURCE', '199309L'),
159 '_SVID_SOURCE',
160 '_BSD_SOURCE',
161 '_GNU_SOURCE',
162
163 'PTHREADS',
164 'HAVE_POSIX_MEMALIGN',
165 ])
166 env.Append(CPPPATH = ['/usr/X11R6/include'])
167 env.Append(LIBPATH = ['/usr/X11R6/lib'])
168 env.Append(LIBS = [
169 'm',
170 'pthread',
171 'expat',
172 'dl',
173 ])
174
José Fonsecac42e6252008-01-31 13:14:35 +0900175
176# DRI
177if dri:
178 env.ParseConfig('pkg-config --cflags --libs libdrm')
179 env.Append(CPPDEFINES = [
180 ('USE_EXTERNAL_DXTN_LIB', '1'),
181 'IN_DRI_DRIVER',
182 'GLX_DIRECT_RENDERING',
183 'GLX_INDIRECT_RENDERING',
184 ])
185
José Fonsecae773a812008-02-19 10:50:39 +0900186# LLVM
187if llvm:
188 # See also http://www.scons.org/wiki/UsingPkgConfig
189 env.ParseConfig('llvm-config --cflags --ldflags --libs')
190 env.Append(CPPDEFINES = ['MESA_LLVM'])
191 env.Append(CXXFLAGS = ['-Wno-long-long'])
192
193
José Fonsecac42e6252008-01-31 13:14:35 +0900194# libGL
195if 1:
196 env.Append(LIBS = [
197 'X11',
198 'Xext',
199 'Xxf86vm',
200 'Xdamage',
201 'Xfixes',
202 ])
203
204Export('env')
205
206
207#######################################################################
208# Convenience Library Builder
209# based on the stock StaticLibrary and SharedLibrary builders
210
211def createConvenienceLibBuilder(env):
212 """This is a utility function that creates the ConvenienceLibrary
213 Builder in an Environment if it is not there already.
214
215 If it is already there, we return the existing one.
216 """
217
218 try:
219 convenience_lib = env['BUILDERS']['ConvenienceLibrary']
220 except KeyError:
221 action_list = [ Action("$ARCOM", "$ARCOMSTR") ]
222 if env.Detect('ranlib'):
223 ranlib_action = Action("$RANLIBCOM", "$RANLIBCOMSTR")
224 action_list.append(ranlib_action)
225
226 convenience_lib = Builder(action = action_list,
227 emitter = '$LIBEMITTER',
228 prefix = '$LIBPREFIX',
229 suffix = '$LIBSUFFIX',
230 src_suffix = '$SHOBJSUFFIX',
231 src_builder = 'SharedObject')
232 env['BUILDERS']['ConvenienceLibrary'] = convenience_lib
233 env['BUILDERS']['Library'] = convenience_lib
234
235 return convenience_lib
236
237createConvenienceLibBuilder(env)
238
239
240#######################################################################
241# Invoke SConscripts
242
José Fonsecaf4192cb42008-01-31 14:21:49 +0900243# Put build output in a separate dir, which depends on the current configuration
244# See also http://www.scons.org/wiki/AdvancedBuildExample
245build_topdir = 'build'
246build_subdir = platform
247if dri:
248 build_subdir += "-dri"
José Fonsecae773a812008-02-19 10:50:39 +0900249if llvm:
250 build_subdir += "-llvm"
José Fonsecaf4192cb42008-01-31 14:21:49 +0900251if x86:
252 build_subdir += "-x86"
253if debug:
254 build_subdir += "-debug"
255build_dir = os.path.join(build_topdir, build_subdir)
256
257# TODO: Build several variants at the same time?
258# http://www.scons.org/wiki/SimultaneousVariantBuilds
José Fonsecac42e6252008-01-31 13:14:35 +0900259
260SConscript(
José Fonseca33ceb672008-02-18 10:52:44 +0000261 'src/SConscript',
José Fonsecac42e6252008-01-31 13:14:35 +0900262 build_dir = build_dir,
263 duplicate = 0 # http://www.scons.org/doc/0.97/HTML/scons-user/x2261.html
264)