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