gallium: Update scons instructions. Propagate user environment.
[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 # Defines
99 env.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
111 if debug:
112 env.Append(CPPDEFINES = ['DEBUG'])
113 else:
114 env.Append(CPPDEFINES = ['NDEBUG'])
115
116
117 # Includes
118 env.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
129 if 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
140 env.Append(LIBPATH = ['/usr/X11R6/lib'])
141
142 env.Append(LIBS = [
143 'm',
144 'pthread',
145 'expat',
146 'dl',
147 ])
148
149 # DRI
150 if 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
160 if 1:
161 env.Append(LIBS = [
162 'X11',
163 'Xext',
164 'Xxf86vm',
165 'Xdamage',
166 'Xfixes',
167 ])
168
169 Export('env')
170
171
172 #######################################################################
173 # Convenience Library Builder
174 # based on the stock StaticLibrary and SharedLibrary builders
175
176 def 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
202 createConvenienceLibBuilder(env)
203
204
205 #######################################################################
206 # Invoke SConscripts
207
208 # Put build output in a separate dir, which depends on the current configuration
209 # See also http://www.scons.org/wiki/AdvancedBuildExample
210 build_topdir = 'build'
211 build_subdir = platform
212 if dri:
213 build_subdir += "-dri"
214 if x86:
215 build_subdir += "-x86"
216 if debug:
217 build_subdir += "-debug"
218 build_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
222
223 SConscript(
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 )