Merge branch 'upstream-gallium-0.1' into darktama-gallium-0.1
[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 # TODO: auto-detect defaults
32 opts = Options('config.py')
33 opts.Add(BoolOption('debug', 'build debug version', False))
34 opts.Add(BoolOption('dri', 'build dri drivers', False))
35 opts.Add(EnumOption('machine', 'use machine-specific assembly code', 'x86',
36 allowed_values=('generic', 'x86', 'x86-64')))
37
38 env = Environment(
39 options = opts,
40 ENV = os.environ)
41 Help(opts.GenerateHelpText(env))
42
43 # for debugging
44 #print env.Dump()
45
46 if 0:
47 # platform will be typically 'posix' or 'win32'
48 platform = env['PLATFORM']
49 else:
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
56 debug = env['debug']
57 dri = env['dri']
58 machine = env['machine']
59
60 # derived options
61 x86 = machine == 'x86'
62 gcc = platform in ('posix', 'linux', 'freebsd', 'darwin')
63 msvc = platform == 'win32'
64
65 Export([
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
83 if 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
99 # Defines
100 if debug:
101 env.Append(CPPDEFINES = ['DEBUG'])
102 else:
103 env.Append(CPPDEFINES = ['NDEBUG'])
104
105
106 # Includes
107 env.Append(CPPPATH = [
108 '#/include',
109 '#/src/mesa',
110 '#/src/mesa/main',
111 '#/src/mesa/pipe',
112 ])
113
114
115 # x86 assembly
116 if x86:
117 env.Append(CPPDEFINES = [
118 'USE_X86_ASM',
119 'USE_MMX_ASM',
120 'USE_3DNOW_ASM',
121 'USE_SSE_ASM',
122 ])
123 if gcc:
124 env.Append(CFLAGS = '-m32')
125 env.Append(CXXFLAGS = '-m32')
126
127
128 # Posix
129 if platform in ('posix', 'linux', 'freebsd', 'darwin'):
130 env.Append(CPPDEFINES = [
131 '_POSIX_SOURCE',
132 ('_POSIX_C_SOURCE', '199309L'),
133 '_SVID_SOURCE',
134 '_BSD_SOURCE',
135 '_GNU_SOURCE',
136
137 'PTHREADS',
138 'HAVE_POSIX_MEMALIGN',
139 ])
140 env.Append(CPPPATH = ['/usr/X11R6/include'])
141 env.Append(LIBPATH = ['/usr/X11R6/lib'])
142 env.Append(LIBS = [
143 'm',
144 'pthread',
145 'expat',
146 'dl',
147 ])
148
149
150 # DRI
151 if dri:
152 env.ParseConfig('pkg-config --cflags --libs libdrm')
153 env.Append(CPPDEFINES = [
154 ('USE_EXTERNAL_DXTN_LIB', '1'),
155 'IN_DRI_DRIVER',
156 'GLX_DIRECT_RENDERING',
157 'GLX_INDIRECT_RENDERING',
158 ])
159
160 # libGL
161 if 1:
162 env.Append(LIBS = [
163 'X11',
164 'Xext',
165 'Xxf86vm',
166 'Xdamage',
167 'Xfixes',
168 ])
169
170 Export('env')
171
172
173 #######################################################################
174 # Convenience Library Builder
175 # based on the stock StaticLibrary and SharedLibrary builders
176
177 def createConvenienceLibBuilder(env):
178 """This is a utility function that creates the ConvenienceLibrary
179 Builder in an Environment if it is not there already.
180
181 If it is already there, we return the existing one.
182 """
183
184 try:
185 convenience_lib = env['BUILDERS']['ConvenienceLibrary']
186 except KeyError:
187 action_list = [ Action("$ARCOM", "$ARCOMSTR") ]
188 if env.Detect('ranlib'):
189 ranlib_action = Action("$RANLIBCOM", "$RANLIBCOMSTR")
190 action_list.append(ranlib_action)
191
192 convenience_lib = Builder(action = action_list,
193 emitter = '$LIBEMITTER',
194 prefix = '$LIBPREFIX',
195 suffix = '$LIBSUFFIX',
196 src_suffix = '$SHOBJSUFFIX',
197 src_builder = 'SharedObject')
198 env['BUILDERS']['ConvenienceLibrary'] = convenience_lib
199 env['BUILDERS']['Library'] = convenience_lib
200
201 return convenience_lib
202
203 createConvenienceLibBuilder(env)
204
205
206 #######################################################################
207 # Invoke SConscripts
208
209 # Put build output in a separate dir, which depends on the current configuration
210 # See also http://www.scons.org/wiki/AdvancedBuildExample
211 build_topdir = 'build'
212 build_subdir = platform
213 if dri:
214 build_subdir += "-dri"
215 if x86:
216 build_subdir += "-x86"
217 if debug:
218 build_subdir += "-debug"
219 build_dir = os.path.join(build_topdir, build_subdir)
220
221 # TODO: Build several variants at the same time?
222 # http://www.scons.org/wiki/SimultaneousVariantBuilds
223
224 SConscript(
225 'src/mesa/SConscript',
226 build_dir = build_dir,
227 duplicate = 0 # http://www.scons.org/doc/0.97/HTML/scons-user/x2261.html
228 )