1e5f7dad39bb77c4d2261b37b422e8848df18193
[mesa.git] / common.py
1 #######################################################################
2 # Common SCons code
3
4 import os
5 import os.path
6 import sys
7 import platform as _platform
8
9
10 #######################################################################
11 # Defaults
12
13 _platform_map = {
14 'linux2': 'linux',
15 'win32': 'winddk',
16 }
17
18 default_platform = sys.platform
19 default_platform = _platform_map.get(default_platform, default_platform)
20
21 _machine_map = {
22 'x86': 'x86',
23 'i386': 'x86',
24 'i486': 'x86',
25 'i586': 'x86',
26 'i686': 'x86',
27 'x86_64': 'x86_64',
28 }
29 if 'PROCESSOR_ARCHITECTURE' in os.environ:
30 default_machine = os.environ['PROCESSOR_ARCHITECTURE']
31 else:
32 default_machine = _platform.machine()
33 default_machine = _machine_map.get(default_machine, 'generic')
34
35 if default_platform in ('linux', 'freebsd', 'darwin'):
36 default_dri = 'yes'
37 elif default_platform in ('winddk',):
38 default_dri = 'no'
39 else:
40 default_dri = 'no'
41
42
43 #######################################################################
44 # Common options
45
46 def AddOptions(opts):
47 from SCons.Options.BoolOption import BoolOption
48 from SCons.Options.EnumOption import EnumOption
49 opts.Add(BoolOption('debug', 'build debug version', 'no'))
50 opts.Add(EnumOption('machine', 'use machine-specific assembly code', default_machine,
51 allowed_values=('generic', 'x86', 'x86_64')))
52 opts.Add(EnumOption('platform', 'target platform', default_platform,
53 allowed_values=('linux', 'cell', 'winddk')))
54 opts.Add(BoolOption('llvm', 'use LLVM', 'no'))
55 opts.Add(BoolOption('dri', 'build DRI drivers', default_dri))
56
57
58 #######################################################################
59 # Convenience Library Builder
60 # based on the stock StaticLibrary and SharedLibrary builders
61
62 import SCons.Action
63 import SCons.Builder
64
65 def createConvenienceLibBuilder(env):
66 """This is a utility function that creates the ConvenienceLibrary
67 Builder in an Environment if it is not there already.
68
69 If it is already there, we return the existing one.
70 """
71
72 try:
73 convenience_lib = env['BUILDERS']['ConvenienceLibrary']
74 except KeyError:
75 action_list = [ SCons.Action.Action("$ARCOM", "$ARCOMSTR") ]
76 if env.Detect('ranlib'):
77 ranlib_action = SCons.Action.Action("$RANLIBCOM", "$RANLIBCOMSTR")
78 action_list.append(ranlib_action)
79
80 convenience_lib = SCons.Builder.Builder(action = action_list,
81 emitter = '$LIBEMITTER',
82 prefix = '$LIBPREFIX',
83 suffix = '$LIBSUFFIX',
84 src_suffix = '$SHOBJSUFFIX',
85 src_builder = 'SharedObject')
86 env['BUILDERS']['ConvenienceLibrary'] = convenience_lib
87 env['BUILDERS']['Library'] = convenience_lib
88
89 return convenience_lib
90
91
92 #######################################################################
93 # Build
94
95 def make_build_dir(env):
96 # Put build output in a separate dir, which depends on the current configuration
97 # See also http://www.scons.org/wiki/AdvancedBuildExample
98 build_topdir = 'build'
99 build_subdir = env['platform']
100 if env['dri']:
101 build_subdir += "-dri"
102 if env['llvm']:
103 build_subdir += "-llvm"
104 if env['machine'] != 'generic':
105 build_subdir += '-' + env['machine']
106 if env['debug']:
107 build_subdir += "-debug"
108 build_dir = os.path.join(build_topdir, build_subdir)
109 # Place the .sconsign file on the builddir too, to avoid issues with different scons
110 # versions building the same source file
111 env.SConsignFile(os.path.join(build_dir, '.sconsign'))
112 return build_dir
113