blob: 47f9b5389bbfbf206be85801324eab52eb7b4d8d [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
98# Defines
99env.Append(CPPDEFINES = [
100 '_POSIX_SOURCE',
101 ('_POSIX_C_SOURCE', '199309L'),
102 '_SVID_SOURCE',
103 '_BSD_SOURCE',
104 '_GNU_SOURCE',
105
106 'PTHREADS',
107 'HAVE_ALIAS',
108 'HAVE_POSIX_MEMALIGN',
109])
110
111if debug:
112 env.Append(CPPDEFINES = ['DEBUG'])
113else:
114 env.Append(CPPDEFINES = ['NDEBUG'])
115
116
117# Includes
118env.Append(CPPPATH = [
119 '#/include',
120 '#/src/mesa',
121 '#/src/mesa/main',
122 '#/src/mesa/pipe',
123
124 '/usr/X11R6/include',
125])
126
127
128# x86 assembly
129if x86:
130 env.Append(CPPDEFINES = [
131 'USE_X86_ASM',
132 'USE_MMX_ASM',
133 'USE_3DNOW_ASM',
134 'USE_SSE_ASM',
135 ])
136 if gcc:
137 env.Append(CFLAGS = '-m32')
138 env.Append(CXXFLAGS = '-m32')
139
140env.Append(LIBPATH = ['/usr/X11R6/lib'])
141
142env.Append(LIBS = [
143 'm',
144 'pthread',
145 'expat',
146 'dl',
147])
148
149# DRI
150if dri:
151 env.ParseConfig('pkg-config --cflags --libs libdrm')
152 env.Append(CPPDEFINES = [
153 ('USE_EXTERNAL_DXTN_LIB', '1'),
154 'IN_DRI_DRIVER',
155 'GLX_DIRECT_RENDERING',
156 'GLX_INDIRECT_RENDERING',
157 ])
158
159# libGL
160if 1:
161 env.Append(LIBS = [
162 'X11',
163 'Xext',
164 'Xxf86vm',
165 'Xdamage',
166 'Xfixes',
167 ])
168
169Export('env')
170
171
172#######################################################################
173# Convenience Library Builder
174# based on the stock StaticLibrary and SharedLibrary builders
175
176def createConvenienceLibBuilder(env):
177 """This is a utility function that creates the ConvenienceLibrary
178 Builder in an Environment if it is not there already.
179
180 If it is already there, we return the existing one.
181 """
182
183 try:
184 convenience_lib = env['BUILDERS']['ConvenienceLibrary']
185 except KeyError:
186 action_list = [ Action("$ARCOM", "$ARCOMSTR") ]
187 if env.Detect('ranlib'):
188 ranlib_action = Action("$RANLIBCOM", "$RANLIBCOMSTR")
189 action_list.append(ranlib_action)
190
191 convenience_lib = Builder(action = action_list,
192 emitter = '$LIBEMITTER',
193 prefix = '$LIBPREFIX',
194 suffix = '$LIBSUFFIX',
195 src_suffix = '$SHOBJSUFFIX',
196 src_builder = 'SharedObject')
197 env['BUILDERS']['ConvenienceLibrary'] = convenience_lib
198 env['BUILDERS']['Library'] = convenience_lib
199
200 return convenience_lib
201
202createConvenienceLibBuilder(env)
203
204
205#######################################################################
206# Invoke SConscripts
207
José Fonsecaf4192cb42008-01-31 14:21:49 +0900208# Put build output in a separate dir, which depends on the current configuration
209# See also http://www.scons.org/wiki/AdvancedBuildExample
210build_topdir = 'build'
211build_subdir = platform
212if dri:
213 build_subdir += "-dri"
214if x86:
215 build_subdir += "-x86"
216if debug:
217 build_subdir += "-debug"
218build_dir = os.path.join(build_topdir, build_subdir)
219
220# TODO: Build several variants at the same time?
221# http://www.scons.org/wiki/SimultaneousVariantBuilds
José Fonsecac42e6252008-01-31 13:14:35 +0900222
223SConscript(
224 'src/mesa/SConscript',
225 build_dir = build_dir,
226 duplicate = 0 # http://www.scons.org/doc/0.97/HTML/scons-user/x2261.html
227)