47f9b5389bbfbf206be85801324eab52eb7b4d8d
[profile/ivi/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 )