blob: 4fb51f2e6dfd1fffd2a9100212e1cd1502bf348b [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
31# TODO: auto-detect defaults
32opts = Options('config.py')
33opts.Add(BoolOption('debug', 'build debug version', False))
34opts.Add(BoolOption('dri', 'build dri drivers', False))
35opts.Add(EnumOption('machine', 'use machine-specific assembly code', 'x86',
36 allowed_values=('generic', 'x86', 'x86-64')))
37
José Fonseca81b6a802008-02-06 14:36:50 +090038env = Environment(
39 options = opts,
40 ENV = os.environ)
José Fonsecac42e6252008-01-31 13:14:35 +090041Help(opts.GenerateHelpText(env))
42
43# for debugging
44#print env.Dump()
45
José Fonsecaf4192cb42008-01-31 14:21:49 +090046if 0:
José Fonsecac42e6252008-01-31 13:14:35 +090047 # platform will be typically 'posix' or 'win32'
48 platform = env['PLATFORM']
49else:
50 # platform will be one of 'linux', 'freebsd', 'win32', 'darwin', etc.
51 platform = sys.platform
52 if platform == 'linux2':
53 platform = 'linux'
54
55# replicate options values in local variables
56debug = env['debug']
57dri = env['dri']
58machine = env['machine']
59
60# derived options
61x86 = machine == 'x86'
José Fonsecaf4192cb42008-01-31 14:21:49 +090062gcc = platform in ('posix', 'linux', 'freebsd', 'darwin')
José Fonsecac42e6252008-01-31 13:14:35 +090063msvc = platform == 'win32'
64
65Export([
66 'debug',
67 'x86',
68 'dri',
69 'platform',
70 'gcc',
71 'msvc',
72])
73
74
75#######################################################################
76# Environment setup
77#
78# TODO: put the compiler specific settings in seperate files
79# TODO: auto-detect as much as possible
80
81
82# Optimization flags
83if gcc:
84 if debug:
85 env.Append(CFLAGS = '-O0 -g3')
86 env.Append(CXXFLAGS = '-O0 -g3')
87 else:
88 env.Append(CFLAGS = '-O3 -g3')
89 env.Append(CXXFLAGS = '-O3 -g3')
90
91 env.Append(CFLAGS = '-Wall -Wmissing-prototypes -std=c99 -ffast-math -pedantic')
92 env.Append(CXXFLAGS = '-Wall -pedantic')
93
94 # Be nice to Eclipse
95 env.Append(CFLAGS = '-fmessage-length=0')
96 env.Append(CXXFLAGS = '-fmessage-length=0')
97
José Fonsecac42e6252008-01-31 13:14:35 +090098
José Fonseca00137962008-02-07 19:59:17 +090099# Defines
José Fonsecac42e6252008-01-31 13:14:35 +0900100if debug:
101 env.Append(CPPDEFINES = ['DEBUG'])
102else:
103 env.Append(CPPDEFINES = ['NDEBUG'])
104
105
106# Includes
107env.Append(CPPPATH = [
108 '#/include',
109 '#/src/mesa',
110 '#/src/mesa/main',
José Fonseca33ceb672008-02-18 10:52:44 +0000111 '#/src/gallium/include',
112 '#/src/gallium/auxiliary',
113 '#/src/gallium/drivers',
José Fonsecac42e6252008-01-31 13:14:35 +0900114])
115
116
117# x86 assembly
118if x86:
119 env.Append(CPPDEFINES = [
120 'USE_X86_ASM',
121 'USE_MMX_ASM',
122 'USE_3DNOW_ASM',
123 'USE_SSE_ASM',
124 ])
125 if gcc:
126 env.Append(CFLAGS = '-m32')
127 env.Append(CXXFLAGS = '-m32')
128
José Fonsecac42e6252008-01-31 13:14:35 +0900129
José Fonseca00137962008-02-07 19:59:17 +0900130# Posix
131if platform in ('posix', 'linux', 'freebsd', 'darwin'):
132 env.Append(CPPDEFINES = [
133 '_POSIX_SOURCE',
134 ('_POSIX_C_SOURCE', '199309L'),
135 '_SVID_SOURCE',
136 '_BSD_SOURCE',
137 '_GNU_SOURCE',
138
139 'PTHREADS',
140 'HAVE_POSIX_MEMALIGN',
141 ])
142 env.Append(CPPPATH = ['/usr/X11R6/include'])
143 env.Append(LIBPATH = ['/usr/X11R6/lib'])
144 env.Append(LIBS = [
145 'm',
146 'pthread',
147 'expat',
148 'dl',
149 ])
150
José Fonsecac42e6252008-01-31 13:14:35 +0900151
152# DRI
153if dri:
154 env.ParseConfig('pkg-config --cflags --libs libdrm')
155 env.Append(CPPDEFINES = [
156 ('USE_EXTERNAL_DXTN_LIB', '1'),
157 'IN_DRI_DRIVER',
158 'GLX_DIRECT_RENDERING',
159 'GLX_INDIRECT_RENDERING',
160 ])
161
162# libGL
163if 1:
164 env.Append(LIBS = [
165 'X11',
166 'Xext',
167 'Xxf86vm',
168 'Xdamage',
169 'Xfixes',
170 ])
171
172Export('env')
173
174
175#######################################################################
176# Convenience Library Builder
177# based on the stock StaticLibrary and SharedLibrary builders
178
179def createConvenienceLibBuilder(env):
180 """This is a utility function that creates the ConvenienceLibrary
181 Builder in an Environment if it is not there already.
182
183 If it is already there, we return the existing one.
184 """
185
186 try:
187 convenience_lib = env['BUILDERS']['ConvenienceLibrary']
188 except KeyError:
189 action_list = [ Action("$ARCOM", "$ARCOMSTR") ]
190 if env.Detect('ranlib'):
191 ranlib_action = Action("$RANLIBCOM", "$RANLIBCOMSTR")
192 action_list.append(ranlib_action)
193
194 convenience_lib = Builder(action = action_list,
195 emitter = '$LIBEMITTER',
196 prefix = '$LIBPREFIX',
197 suffix = '$LIBSUFFIX',
198 src_suffix = '$SHOBJSUFFIX',
199 src_builder = 'SharedObject')
200 env['BUILDERS']['ConvenienceLibrary'] = convenience_lib
201 env['BUILDERS']['Library'] = convenience_lib
202
203 return convenience_lib
204
205createConvenienceLibBuilder(env)
206
207
208#######################################################################
209# Invoke SConscripts
210
José Fonsecaf4192cb42008-01-31 14:21:49 +0900211# Put build output in a separate dir, which depends on the current configuration
212# See also http://www.scons.org/wiki/AdvancedBuildExample
213build_topdir = 'build'
214build_subdir = platform
215if dri:
216 build_subdir += "-dri"
217if x86:
218 build_subdir += "-x86"
219if debug:
220 build_subdir += "-debug"
221build_dir = os.path.join(build_topdir, build_subdir)
222
223# TODO: Build several variants at the same time?
224# http://www.scons.org/wiki/SimultaneousVariantBuilds
José Fonsecac42e6252008-01-31 13:14:35 +0900225
226SConscript(
José Fonseca33ceb672008-02-18 10:52:44 +0000227 'src/SConscript',
José Fonsecac42e6252008-01-31 13:14:35 +0900228 build_dir = build_dir,
229 duplicate = 0 # http://www.scons.org/doc/0.97/HTML/scons-user/x2261.html
230)