SConstruct 7.75 KB
Newer Older
1 2 3 4
#######################################################################
# Top-level SConstruct

import os
5
import os.path
6
import sys
7
import platform as _platform
8 9 10 11 12 13 14


#######################################################################
# Configuration options
#
# For example, invoke scons as 
#
15
#   scons debug=1 dri=0 machine=x86
16 17 18 19 20 21 22
#
# to set configuration variables. Or you can write those options to a file
# named config.py:
#
#   # config.py
#   debug=1
#   dri=0
23
#   machine='x86'
24 25 26 27 28 29 30 31
# 
# Invoke
#
#   scons -h
#
# to get the full list of options. See scons manpage for more info.
#  

32 33 34 35
platform_map = {
	'linux2': 'linux',
	'win32': 'winddk',
}
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
default_platform = sys.platform
default_platform = platform_map.get(default_platform, default_platform)

machine_map = {
	'x86': 'x86',
	'i386': 'x86',
	'i486': 'x86',
	'i586': 'x86',
	'i686': 'x86',
	'x86_64': 'x86_64',
}
if 'PROCESSOR_ARCHITECTURE' in os.environ:
	default_machine = os.environ['PROCESSOR_ARCHITECTURE']
else:
	default_machine = _platform.machine()
default_machine = machine_map.get(default_machine, 'generic')
José Fonseca's avatar
José Fonseca committed
52

53
if default_platform in ('linux', 'freebsd', 'darwin'):
José Fonseca's avatar
José Fonseca committed
54 55 56
	default_statetrackers = 'mesa'
	default_drivers = 'softpipe,failover,i915simple,i965simple'
	default_winsys = 'xlib'
57
	default_dri = 'yes'
José Fonseca's avatar
José Fonseca committed
58 59 60 61
elif default_platform in ('winddk',):
	default_statetrackers = 'none'
	default_drivers = 'softpipe,i915simple'
	default_winsys = 'none'
62
	default_dri = 'no'
63
else:
José Fonseca's avatar
José Fonseca committed
64 65
	default_drivers = 'all'
	default_winsys = 'all'
66 67
	default_dri = 'no'

68

69 70
# TODO: auto-detect defaults
opts = Options('config.py')
71 72 73
opts.Add(BoolOption('debug', 'build debug version', 'no'))
opts.Add(EnumOption('machine', 'use machine-specific assembly code', default_machine,
                     allowed_values=('generic', 'x86', 'x86_64')))
74
opts.Add(EnumOption('platform', 'target platform', default_platform,
75
                     allowed_values=('linux', 'cell', 'winddk')))
José Fonseca's avatar
José Fonseca committed
76
opts.Add(ListOption('statetrackers', 'state_trackers to build', default_statetrackers,
77 78 79 80
                     [
                     	'mesa', 
                     ],
                     ))
José Fonseca's avatar
José Fonseca committed
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
opts.Add(ListOption('drivers', 'pipe drivers to build', default_drivers,
                     [
                     	'softpipe', 
                     	'failover', 
                     	'i915simple', 
                     	'i965simple', 
                     	'cell',
                     ],
                     ))
opts.Add(ListOption('winsys', 'winsys drivers to build', default_winsys,
                     [
                     	'xlib', 
                     	'intel',
                     ],
                     ))
opts.Add(BoolOption('llvm', 'use LLVM', 'no'))
97
opts.Add(BoolOption('dri', 'build DRI drivers', default_dri))
98

99 100 101
env = Environment(
	options = opts, 
	ENV = os.environ)
102 103 104 105 106 107 108 109
Help(opts.GenerateHelpText(env))

# for debugging
#print env.Dump()

# replicate options values in local variables
debug = env['debug']
dri = env['dri']
110
llvm = env['llvm']
111
machine = env['machine']
112
platform = env['platform']
113 114 115

# derived options
x86 = machine == 'x86'
116 117
gcc = platform in ('linux', 'freebsd', 'darwin')
msvc = platform in ('win32', 'winddk')
118 119 120 121 122

Export([
	'debug', 
	'x86', 
	'dri', 
123
	'llvm',
124 125 126 127 128 129 130 131 132
	'platform',
	'gcc',
	'msvc',
])


#######################################################################
# Environment setup
#
133
# TODO: put the compiler specific settings in separate files
134 135
# TODO: auto-detect as much as possible

136 137

if platform == 'winddk':
José Fonseca's avatar
José Fonseca committed
138 139 140 141 142 143 144 145
	env.Tool('winddk', ['.'])
	
	env.Append(CPPPATH = [
		env['SDK_INC_PATH'],
		env['DDK_INC_PATH'],
		env['WDM_INC_PATH'],
		env['CRT_INC_PATH'],
	])
146

147 148 149 150 151 152 153 154 155
# Optimization flags
if gcc:
	if debug:
		env.Append(CFLAGS = '-O0 -g3')
		env.Append(CXXFLAGS = '-O0 -g3')
	else:
		env.Append(CFLAGS = '-O3 -g3')
		env.Append(CXXFLAGS = '-O3 -g3')

156
	env.Append(CFLAGS = '-Wall -Wmissing-prototypes -Wno-long-long -ffast-math -pedantic')
157 158 159 160 161 162
	env.Append(CXXFLAGS = '-Wall -pedantic')
	
	# Be nice to Eclipse
	env.Append(CFLAGS = '-fmessage-length=0')
	env.Append(CXXFLAGS = '-fmessage-length=0')

163 164 165 166 167 168 169 170 171 172 173 174 175 176
if msvc:
	env.Append(CFLAGS = '/W3')
	if debug:
		cflags = [
			'/Od', # disable optimizations
			'/Oy-', # disable frame pointer omission
		]
	else:
		cflags = [
			'/Ox', # maximum optimizations
			'/Os', # favor code space
		]
	env.Append(CFLAGS = cflags)
	env.Append(CXXFLAGS = cflags)
177 178 179
	# Put debugging information in a separate .pdb file for each object file as
	# descrived in the scons manpage
	env['CCPDBFLAGS'] = '/Zi /Fd${TARGET}.pdb'
180

181
# Defines
182
if debug:
183 184 185 186 187 188 189 190
	if gcc:
		env.Append(CPPDEFINES = ['DEBUG'])
	if msvc:
		env.Append(CPPDEFINES = [
			('DBG', '1'),
			('DEBUG', '1'),
			('_DEBUG', '1'),
		])
191 192 193 194 195 196 197
else:
	env.Append(CPPDEFINES = ['NDEBUG'])


# Includes
env.Append(CPPPATH = [
	'#/include',
198 199 200
	'#/src/gallium/include',
	'#/src/gallium/auxiliary',
	'#/src/gallium/drivers',
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
])


# x86 assembly
if x86:
	env.Append(CPPDEFINES = [
		'USE_X86_ASM', 
		'USE_MMX_ASM',
		'USE_3DNOW_ASM',
		'USE_SSE_ASM',
	])
	if gcc:	
		env.Append(CFLAGS = '-m32')
		env.Append(CXXFLAGS = '-m32')


217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
# Posix
if platform in ('posix', 'linux', 'freebsd', 'darwin'):
	env.Append(CPPDEFINES = [
		'_POSIX_SOURCE',
		('_POSIX_C_SOURCE', '199309L'), 
		'_SVID_SOURCE',
		'_BSD_SOURCE', 
		'_GNU_SOURCE',
		
		'PTHREADS',
		'HAVE_POSIX_MEMALIGN',
	])
	env.Append(CPPPATH = ['/usr/X11R6/include'])
	env.Append(LIBPATH = ['/usr/X11R6/lib'])
	env.Append(LIBS = [
		'm',
		'pthread',
		'expat',
		'dl',
	])

238 239 240 241 242 243 244 245 246 247 248

# DRI
if dri:
	env.ParseConfig('pkg-config --cflags --libs libdrm')
	env.Append(CPPDEFINES = [
		('USE_EXTERNAL_DXTN_LIB', '1'), 
		'IN_DRI_DRIVER',
		'GLX_DIRECT_RENDERING',
		'GLX_INDIRECT_RENDERING',
	])

249 250 251 252 253 254 255 256
# LLVM
if llvm:
	# See also http://www.scons.org/wiki/UsingPkgConfig
	env.ParseConfig('llvm-config --cflags --ldflags --libs')
	env.Append(CPPDEFINES = ['MESA_LLVM'])
	env.Append(CXXFLAGS = ['-Wno-long-long'])
	

257
# libGL
258
if platform not in ('winddk',):
259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305
	env.Append(LIBS = [
		'X11',
		'Xext',
		'Xxf86vm',
		'Xdamage',
		'Xfixes',
	])

Export('env')


#######################################################################
# Convenience Library Builder
# based on the stock StaticLibrary and SharedLibrary builders

def createConvenienceLibBuilder(env):
    """This is a utility function that creates the ConvenienceLibrary
    Builder in an Environment if it is not there already.

    If it is already there, we return the existing one.
    """

    try:
        convenience_lib = env['BUILDERS']['ConvenienceLibrary']
    except KeyError:
        action_list = [ Action("$ARCOM", "$ARCOMSTR") ]
        if env.Detect('ranlib'):
            ranlib_action = Action("$RANLIBCOM", "$RANLIBCOMSTR")
            action_list.append(ranlib_action)

        convenience_lib = Builder(action = action_list,
                                  emitter = '$LIBEMITTER',
                                  prefix = '$LIBPREFIX',
                                  suffix = '$LIBSUFFIX',
                                  src_suffix = '$SHOBJSUFFIX',
                                  src_builder = 'SharedObject')
        env['BUILDERS']['ConvenienceLibrary'] = convenience_lib
        env['BUILDERS']['Library'] = convenience_lib

    return convenience_lib

createConvenienceLibBuilder(env)


#######################################################################
# Invoke SConscripts

306 307 308 309 310 311
# Put build output in a separate dir, which depends on the current configuration
# See also http://www.scons.org/wiki/AdvancedBuildExample
build_topdir = 'build'
build_subdir = platform
if dri:
	build_subdir += "-dri"
312 313
if llvm:
	build_subdir += "-llvm"
314 315
if env['machine'] != 'generic':
	build_subdir += '-' + env['machine']
316 317 318 319 320 321
if debug:
	build_subdir += "-debug"
build_dir = os.path.join(build_topdir, build_subdir)

# TODO: Build several variants at the same time?
# http://www.scons.org/wiki/SimultaneousVariantBuilds
322 323

SConscript(
324
	'src/SConscript',
325 326 327
	build_dir = build_dir,
	duplicate = 0 # http://www.scons.org/doc/0.97/HTML/scons-user/x2261.html
)