Tizen 2.0 Release
[profile/ivi/osmesa.git] / scons / gallium.py
1 """gallium
2
3 Frontend-tool for Gallium3D architecture.
4
5 """
6
7 #
8 # Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
9 # All Rights Reserved.
10 #
11 # Permission is hereby granted, free of charge, to any person obtaining a
12 # copy of this software and associated documentation files (the
13 # "Software"), to deal in the Software without restriction, including
14 # without limitation the rights to use, copy, modify, merge, publish,
15 # distribute, sub license, and/or sell copies of the Software, and to
16 # permit persons to whom the Software is furnished to do so, subject to
17 # the following conditions:
18 #
19 # The above copyright notice and this permission notice (including the
20 # next paragraph) shall be included in all copies or substantial portions
21 # of the Software.
22 #
23 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24 # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
26 # IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
27 # ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
28 # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
29 # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 #
31
32
33 import distutils.version
34 import os
35 import os.path
36 import re
37 import subprocess
38 import platform as _platform
39
40 import SCons.Action
41 import SCons.Builder
42 import SCons.Scanner
43
44
45 def symlink(target, source, env):
46     target = str(target[0])
47     source = str(source[0])
48     if os.path.islink(target) or os.path.exists(target):
49         os.remove(target)
50     os.symlink(os.path.basename(source), target)
51
52 def install(env, source, subdir):
53     target_dir = os.path.join(env.Dir('#.').srcnode().abspath, env['build_dir'], subdir)
54     return env.Install(target_dir, source)
55
56 def install_program(env, source):
57     return install(env, source, 'bin')
58
59 def install_shared_library(env, sources, version = ()):
60     targets = []
61     install_dir = os.path.join(env.Dir('#.').srcnode().abspath, env['build_dir'])
62     version = tuple(map(str, version))
63     if env['SHLIBSUFFIX'] == '.dll':
64         dlls = env.FindIxes(sources, 'SHLIBPREFIX', 'SHLIBSUFFIX')
65         targets += install(env, dlls, 'bin')
66         libs = env.FindIxes(sources, 'LIBPREFIX', 'LIBSUFFIX')
67         targets += install(env, libs, 'lib')
68     else:
69         for source in sources:
70             target_dir =  os.path.join(install_dir, 'lib')
71             target_name = '.'.join((str(source),) + version)
72             last = env.InstallAs(os.path.join(target_dir, target_name), source)
73             targets += last
74             while len(version):
75                 version = version[:-1]
76                 target_name = '.'.join((str(source),) + version)
77                 action = SCons.Action.Action(symlink, "  Symlinking $TARGET ...")
78                 last = env.Command(os.path.join(target_dir, target_name), last, action) 
79                 targets += last
80     return targets
81
82
83 def createInstallMethods(env):
84     env.AddMethod(install_program, 'InstallProgram')
85     env.AddMethod(install_shared_library, 'InstallSharedLibrary')
86
87
88 def num_jobs():
89     try:
90         return int(os.environ['NUMBER_OF_PROCESSORS'])
91     except (ValueError, KeyError):
92         pass
93
94     try:
95         return os.sysconf('SC_NPROCESSORS_ONLN')
96     except (ValueError, OSError, AttributeError):
97         pass
98
99     try:
100         return int(os.popen2("sysctl -n hw.ncpu")[1].read())
101     except ValueError:
102         pass
103
104     return 1
105
106
107 def pkg_config_modules(env, name, modules):
108     '''Simple wrapper for pkg-config.'''
109
110     env[name] = False
111
112     if env['platform'] == 'windows':
113         return
114
115     if not env.Detect('pkg-config'):
116         return
117
118     if subprocess.call(["pkg-config", "--exists", ' '.join(modules)]) != 0:
119         return
120
121     # Put -I and -L flags directly into the environment, as these don't affect
122     # the compilation of targets that do not use them
123     try:
124         env.ParseConfig('pkg-config --cflags-only-I --libs-only-L ' + ' '.join(modules))
125     except OSError:
126         return
127
128     # Other flags may affect the compilation of unrelated targets, so store
129     # them with a prefix, (e.g., XXX_CFLAGS, XXX_LIBS, etc)
130     try:
131         flags = env.ParseFlags('!pkg-config --cflags-only-other --libs-only-l --libs-only-other ' + ' '.join(modules))
132     except OSError:
133         return
134     prefix = name.upper() + '_'
135     for flag_name, flag_value in flags.iteritems():
136         env[prefix + flag_name] = flag_value
137
138     env[name] = True
139
140
141
142 def generate(env):
143     """Common environment generation code"""
144
145     # Tell tools which machine to compile for
146     env['TARGET_ARCH'] = env['machine']
147     env['MSVS_ARCH'] = env['machine']
148
149     # Toolchain
150     platform = env['platform']
151     if env['toolchain'] == 'default':
152         if platform == 'winddk':
153             env['toolchain'] = 'winddk'
154         elif platform == 'wince':
155             env['toolchain'] = 'wcesdk'
156     env.Tool(env['toolchain'])
157
158     # Allow override compiler and specify additional flags from environment
159     if os.environ.has_key('CC'):
160         env['CC'] = os.environ['CC']
161         # Update CCVERSION to match
162         pipe = SCons.Action._subproc(env, [env['CC'], '--version'],
163                                      stdin = 'devnull',
164                                      stderr = 'devnull',
165                                      stdout = subprocess.PIPE)
166         if pipe.wait() == 0:
167             line = pipe.stdout.readline()
168             match = re.search(r'[0-9]+(\.[0-9]+)+', line)
169             if match:
170                 env['CCVERSION'] = match.group(0)
171     if os.environ.has_key('CFLAGS'):
172         env['CCFLAGS'] += SCons.Util.CLVar(os.environ['CFLAGS'])
173     if os.environ.has_key('CXX'):
174         env['CXX'] = os.environ['CXX']
175     if os.environ.has_key('CXXFLAGS'):
176         env['CXXFLAGS'] += SCons.Util.CLVar(os.environ['CXXFLAGS'])
177     if os.environ.has_key('LDFLAGS'):
178         env['LINKFLAGS'] += SCons.Util.CLVar(os.environ['LDFLAGS'])
179
180     env['gcc'] = 'gcc' in os.path.basename(env['CC']).split('-')
181     env['msvc'] = env['CC'] == 'cl'
182
183     if env['msvc'] and env['toolchain'] == 'default' and env['machine'] == 'x86_64':
184         # MSVC x64 support is broken in earlier versions of scons
185         env.EnsurePythonVersion(2, 0)
186
187     # shortcuts
188     machine = env['machine']
189     platform = env['platform']
190     x86 = env['machine'] == 'x86'
191     ppc = env['machine'] == 'ppc'
192     gcc = env['gcc']
193     msvc = env['msvc']
194
195     # Determine whether we are cross compiling; in particular, whether we need
196     # to compile code generators with a different compiler as the target code.
197     host_platform = _platform.system().lower()
198     if host_platform.startswith('cygwin'):
199         host_platform = 'cygwin'
200     host_machine = os.environ.get('PROCESSOR_ARCHITEW6432', os.environ.get('PROCESSOR_ARCHITECTURE', _platform.machine()))
201     host_machine = {
202         'x86': 'x86',
203         'i386': 'x86',
204         'i486': 'x86',
205         'i586': 'x86',
206         'i686': 'x86',
207         'ppc' : 'ppc',
208         'AMD64': 'x86_64',
209         'x86_64': 'x86_64',
210     }.get(host_machine, 'generic')
211     env['crosscompile'] = platform != host_platform
212     if machine == 'x86_64' and host_machine != 'x86_64':
213         env['crosscompile'] = True
214     env['hostonly'] = False
215
216     # Backwards compatability with the debug= profile= options
217     if env['build'] == 'debug':
218         if not env['debug']:
219             print 'scons: warning: debug option is deprecated and will be removed eventually; use instead'
220             print
221             print ' scons build=release'
222             print
223             env['build'] = 'release'
224         if env['profile']:
225             print 'scons: warning: profile option is deprecated and will be removed eventually; use instead'
226             print
227             print ' scons build=profile'
228             print
229             env['build'] = 'profile'
230     if False:
231         # Enforce SConscripts to use the new build variable
232         env.popitem('debug')
233         env.popitem('profile')
234     else:
235         # Backwards portability with older sconscripts
236         if env['build'] in ('debug', 'checked'):
237             env['debug'] = True
238             env['profile'] = False
239         if env['build'] == 'profile':
240             env['debug'] = False
241             env['profile'] = True
242         if env['build'] == 'release':
243             env['debug'] = False
244             env['profile'] = False
245
246     # Put build output in a separate dir, which depends on the current
247     # configuration. See also http://www.scons.org/wiki/AdvancedBuildExample
248     build_topdir = 'build'
249     build_subdir = env['platform']
250     if env['embedded']:
251         build_subdir =  'embedded-' + build_subdir
252     if env['machine'] != 'generic':
253         build_subdir += '-' + env['machine']
254     if env['build'] != 'release':
255         build_subdir += '-' +  env['build']
256     build_dir = os.path.join(build_topdir, build_subdir)
257     # Place the .sconsign file in the build dir too, to avoid issues with
258     # different scons versions building the same source file
259     env['build_dir'] = build_dir
260     env.SConsignFile(os.path.join(build_dir, '.sconsign'))
261     if 'SCONS_CACHE_DIR' in os.environ:
262         print 'scons: Using build cache in %s.' % (os.environ['SCONS_CACHE_DIR'],)
263         env.CacheDir(os.environ['SCONS_CACHE_DIR'])
264     env['CONFIGUREDIR'] = os.path.join(build_dir, 'conf')
265     env['CONFIGURELOG'] = os.path.join(os.path.abspath(build_dir), 'config.log')
266
267     # Parallel build
268     if env.GetOption('num_jobs') <= 1:
269         env.SetOption('num_jobs', num_jobs())
270
271     env.Decider('MD5-timestamp')
272     env.SetOption('max_drift', 60)
273
274     # C preprocessor options
275     cppdefines = []
276     if env['build'] in ('debug', 'checked'):
277         cppdefines += ['DEBUG']
278     else:
279         cppdefines += ['NDEBUG']
280     if env['build'] == 'profile':
281         cppdefines += ['PROFILE']
282     if env['platform'] in ('posix', 'linux', 'freebsd', 'darwin'):
283         cppdefines += [
284             '_POSIX_SOURCE',
285             ('_POSIX_C_SOURCE', '199309L'),
286             '_SVID_SOURCE',
287             '_BSD_SOURCE',
288             '_GNU_SOURCE',
289             'PTHREADS',
290             'HAVE_POSIX_MEMALIGN',
291         ]
292     if env['platform'] == 'darwin':
293         cppdefines += ['_DARWIN_C_SOURCE']
294     if platform == 'windows':
295         cppdefines += [
296             'WIN32',
297             '_WINDOWS',
298             #'_UNICODE',
299             #'UNICODE',
300             # http://msdn.microsoft.com/en-us/library/aa383745.aspx
301             ('_WIN32_WINNT', '0x0601'),
302             ('WINVER', '0x0601'),
303         ]
304         if msvc and env['toolchain'] != 'winddk':
305             cppdefines += [
306                 'VC_EXTRALEAN',
307                 '_USE_MATH_DEFINES',
308                 '_CRT_SECURE_NO_WARNINGS',
309                 '_CRT_SECURE_NO_DEPRECATE',
310                 '_SCL_SECURE_NO_WARNINGS',
311                 '_SCL_SECURE_NO_DEPRECATE',
312             ]
313         if env['build'] in ('debug', 'checked'):
314             cppdefines += ['_DEBUG']
315     if env['toolchain'] == 'winddk':
316         # Mimic WINDDK's builtin flags. See also:
317         # - WINDDK's bin/makefile.new i386mk.inc for more info.
318         # - buildchk_wxp_x86.log files, generated by the WINDDK's build
319         # - http://alter.org.ua/docs/nt_kernel/vc8_proj/
320         if machine == 'x86':
321             cppdefines += ['_X86_', 'i386']
322         if machine == 'x86_64':
323             cppdefines += ['_AMD64_', 'AMD64']
324     if platform == 'winddk':
325         cppdefines += [
326             'STD_CALL',
327             ('CONDITION_HANDLING', '1'),
328             ('NT_INST', '0'),
329             ('WIN32', '100'),
330             ('_NT1X_', '100'),
331             ('WINNT', '1'),
332             ('_WIN32_WINNT', '0x0501'), # minimum required OS version
333             ('WINVER', '0x0501'),
334             ('_WIN32_IE', '0x0603'),
335             ('WIN32_LEAN_AND_MEAN', '1'),
336             ('DEVL', '1'),
337             ('__BUILDMACHINE__', 'WinDDK'),
338             ('FPO', '0'),
339         ]
340         if env['build'] in ('debug', 'checked'):
341             cppdefines += [('DBG', 1)]
342     if platform == 'wince':
343         cppdefines += [
344             '_CRT_SECURE_NO_DEPRECATE',
345             '_USE_32BIT_TIME_T',
346             'UNICODE',
347             '_UNICODE',
348             ('UNDER_CE', '600'),
349             ('_WIN32_WCE', '0x600'),
350             'WINCEOEM',
351             'WINCEINTERNAL',
352             'WIN32',
353             'STRICT',
354             'x86',
355             '_X86_',
356             'INTERNATIONAL',
357             ('INTLMSG_CODEPAGE', '1252'),
358         ]
359     if platform == 'windows':
360         cppdefines += ['PIPE_SUBSYSTEM_WINDOWS_USER']
361     if platform == 'winddk':
362         cppdefines += ['PIPE_SUBSYSTEM_WINDOWS_DISPLAY']
363     if platform == 'wince':
364         cppdefines += ['PIPE_SUBSYSTEM_WINDOWS_CE']
365         cppdefines += ['PIPE_SUBSYSTEM_WINDOWS_CE_OGL']
366     if env['embedded']:
367         cppdefines += ['PIPE_SUBSYSTEM_EMBEDDED']
368     env.Append(CPPDEFINES = cppdefines)
369
370     # C compiler options
371     cflags = [] # C
372     cxxflags = [] # C++
373     ccflags = [] # C & C++
374     if gcc:
375         ccversion = env['CCVERSION']
376         if env['build'] == 'debug':
377             ccflags += ['-O0']
378         elif ccversion.startswith('4.2.'):
379             # gcc 4.2.x optimizer is broken
380             print "warning: gcc 4.2.x optimizer is broken -- disabling optimizations"
381             ccflags += ['-O0']
382         else:
383             ccflags += ['-O3']
384         ccflags += ['-g3']
385         if env['build'] in ('checked', 'profile'):
386             # See http://code.google.com/p/jrfonseca/wiki/Gprof2Dot#Which_options_should_I_pass_to_gcc_when_compiling_for_profiling?
387             ccflags += [
388                 '-fno-omit-frame-pointer',
389                 '-fno-optimize-sibling-calls',
390             ]
391         if env['machine'] == 'x86':
392             ccflags += [
393                 '-m32',
394                 #'-march=pentium4',
395             ]
396             if distutils.version.LooseVersion(ccversion) >= distutils.version.LooseVersion('4.2') \
397                and (platform != 'windows' or env['build'] == 'debug' or True):
398                 # NOTE: We need to ensure stack is realigned given that we
399                 # produce shared objects, and have no control over the stack
400                 # alignment policy of the application. Therefore we need
401                 # -mstackrealign ore -mincoming-stack-boundary=2.
402                 #
403                 # XXX: -O and -mstackrealign causes stack corruption on MinGW
404                 #
405                 # XXX: We could have SSE without -mstackrealign if we always used
406                 # __attribute__((force_align_arg_pointer)), but that's not
407                 # always the case.
408                 ccflags += [
409                     '-mstackrealign', # ensure stack is aligned
410                     '-mmmx', '-msse', '-msse2', # enable SIMD intrinsics
411                     #'-mfpmath=sse',
412                 ]
413             if platform in ['windows', 'darwin']:
414                 # Workaround http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37216
415                 ccflags += ['-fno-common']
416         if env['machine'] == 'x86_64':
417             ccflags += ['-m64']
418             if platform == 'darwin':
419                 ccflags += ['-fno-common']
420         if env['platform'] != 'windows':
421             ccflags += ['-fvisibility=hidden']
422         # See also:
423         # - http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
424         ccflags += [
425             '-Wall',
426             '-Wno-long-long',
427             '-ffast-math',
428             '-fmessage-length=0', # be nice to Eclipse
429         ]
430         cflags += [
431             '-Wmissing-prototypes',
432             '-std=gnu99',
433         ]
434         if distutils.version.LooseVersion(ccversion) >= distutils.version.LooseVersion('4.0'):
435             ccflags += [
436                 '-Wmissing-field-initializers',
437             ]
438         if distutils.version.LooseVersion(ccversion) >= distutils.version.LooseVersion('4.2'):
439             ccflags += [
440                 '-Werror=pointer-arith',
441             ]
442             cflags += [
443                 '-Werror=declaration-after-statement',
444             ]
445     if msvc:
446         # See also:
447         # - http://msdn.microsoft.com/en-us/library/19z1t1wy.aspx
448         # - cl /?
449         if env['build'] == 'debug':
450             ccflags += [
451               '/Od', # disable optimizations
452               '/Oi', # enable intrinsic functions
453               '/Oy-', # disable frame pointer omission
454             ]
455         else:
456             ccflags += [
457                 '/O2', # optimize for speed
458             ]
459         if env['build'] == 'release':
460             ccflags += [
461                 '/GL', # enable whole program optimization
462             ]
463         else:
464             ccflags += [
465                 '/GL-', # disable whole program optimization
466             ]
467         ccflags += [
468             '/fp:fast', # fast floating point 
469             '/W3', # warning level
470             #'/Wp64', # enable 64 bit porting warnings
471         ]
472         if env['machine'] == 'x86':
473             ccflags += [
474                 #'/arch:SSE2', # use the SSE2 instructions
475             ]
476         if platform == 'windows':
477             ccflags += [
478                 # TODO
479             ]
480         if platform == 'winddk':
481             ccflags += [
482                 '/Zl', # omit default library name in .OBJ
483                 '/Zp8', # 8bytes struct member alignment
484                 '/Gy', # separate functions for linker
485                 '/Gm-', # disable minimal rebuild
486                 '/WX', # treat warnings as errors
487                 '/Gz', # __stdcall Calling convention
488                 '/GX-', # disable C++ EH
489                 '/GR-', # disable C++ RTTI
490                 '/GF', # enable read-only string pooling
491                 '/G6', # optimize for PPro, P-II, P-III
492                 '/Ze', # enable extensions
493                 '/Gi-', # disable incremental compilation
494                 '/QIfdiv-', # disable Pentium FDIV fix
495                 '/hotpatch', # prepares an image for hotpatching.
496                 #'/Z7', #enable old-style debug info
497             ]
498         if platform == 'wince':
499             # See also C:\WINCE600\public\common\oak\misc\makefile.def
500             ccflags += [
501                 '/Zl', # omit default library name in .OBJ
502                 '/GF', # enable read-only string pooling
503                 '/GR-', # disable C++ RTTI
504                 '/GS', # enable security checks
505                 # Allow disabling language conformance to maintain backward compat
506                 #'/Zc:wchar_t-', # don't force wchar_t as native type, instead of typedef
507                 #'/Zc:forScope-', # don't enforce Standard C++ for scoping rules
508                 #'/wd4867',
509                 #'/wd4430',
510                 #'/MT',
511                 #'/U_MT',
512             ]
513         # Automatic pdb generation
514         # See http://scons.tigris.org/issues/show_bug.cgi?id=1656
515         env.EnsureSConsVersion(0, 98, 0)
516         env['PDB'] = '${TARGET.base}.pdb'
517     env.Append(CCFLAGS = ccflags)
518     env.Append(CFLAGS = cflags)
519     env.Append(CXXFLAGS = cxxflags)
520
521     if env['platform'] == 'windows' and msvc:
522         # Choose the appropriate MSVC CRT
523         # http://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx
524         if env['build'] in ('debug', 'checked'):
525             env.Append(CCFLAGS = ['/MTd'])
526             env.Append(SHCCFLAGS = ['/LDd'])
527         else:
528             env.Append(CCFLAGS = ['/MT'])
529             env.Append(SHCCFLAGS = ['/LD'])
530     
531     # Assembler options
532     if gcc:
533         if env['machine'] == 'x86':
534             env.Append(ASFLAGS = ['-m32'])
535         if env['machine'] == 'x86_64':
536             env.Append(ASFLAGS = ['-m64'])
537
538     # Linker options
539     linkflags = []
540     shlinkflags = []
541     if gcc:
542         if env['machine'] == 'x86':
543             linkflags += ['-m32']
544         if env['machine'] == 'x86_64':
545             linkflags += ['-m64']
546         if env['platform'] not in ('darwin'):
547             shlinkflags += [
548                 '-Wl,-Bsymbolic',
549             ]
550         # Handle circular dependencies in the libraries
551         if env['platform'] in ('darwin'):
552             pass
553         else:
554             env['_LIBFLAGS'] = '-Wl,--start-group ' + env['_LIBFLAGS'] + ' -Wl,--end-group'
555     if msvc:
556         if env['build'] == 'release':
557             # enable Link-time Code Generation
558             linkflags += ['/LTCG']
559             env.Append(ARFLAGS = ['/LTCG'])
560     if platform == 'windows' and msvc:
561         # See also:
562         # - http://msdn2.microsoft.com/en-us/library/y0zzbyt4.aspx
563         linkflags += [
564             '/fixed:no',
565             '/incremental:no',
566         ]
567     if platform == 'winddk':
568         linkflags += [
569             '/merge:_PAGE=PAGE',
570             '/merge:_TEXT=.text',
571             '/section:INIT,d',
572             '/opt:ref',
573             '/opt:icf',
574             '/ignore:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221',
575             '/incremental:no',
576             '/fullbuild',
577             '/release',
578             '/nodefaultlib',
579             '/wx',
580             '/debug',
581             '/debugtype:cv',
582             '/version:5.1',
583             '/osversion:5.1',
584             '/functionpadmin:5',
585             '/safeseh',
586             '/pdbcompress',
587             '/stack:0x40000,0x1000',
588             '/driver',
589             '/align:0x80',
590             '/subsystem:native,5.01',
591             '/base:0x10000',
592
593             '/entry:DrvEnableDriver',
594         ]
595         if env['build'] != 'release':
596             linkflags += [
597                 '/MAP', # http://msdn.microsoft.com/en-us/library/k7xkk3e2.aspx
598             ]
599     if platform == 'wince':
600         linkflags += [
601             '/nodefaultlib',
602             #'/incremental:no',
603             #'/fullbuild',
604             '/entry:_DllMainCRTStartup',
605         ]
606     env.Append(LINKFLAGS = linkflags)
607     env.Append(SHLINKFLAGS = shlinkflags)
608
609     # We have C++ in several libraries, so always link with the C++ compiler
610     if env['gcc']:
611         env['LINK'] = env['CXX']
612
613     # Default libs
614     libs = []
615     if env['platform'] in ('posix', 'linux', 'freebsd', 'darwin'):
616         libs += ['m', 'pthread', 'dl']
617     env.Append(LIBS = libs)
618
619     # Load tools
620     env.Tool('lex')
621     env.Tool('yacc')
622     if env['llvm']:
623         env.Tool('llvm')
624     
625     pkg_config_modules(env, 'x11', ['x11', 'xext'])
626     pkg_config_modules(env, 'drm', ['libdrm'])
627     pkg_config_modules(env, 'drm_intel', ['libdrm_intel'])
628     pkg_config_modules(env, 'drm_radeon', ['libdrm_radeon'])
629     pkg_config_modules(env, 'xorg', ['xorg-server'])
630     pkg_config_modules(env, 'kms', ['libkms'])
631
632     env['dri'] = env['x11'] and env['drm']
633
634     # Custom builders and methods
635     env.Tool('custom')
636     createInstallMethods(env)
637
638     # for debugging
639     #print env.Dump()
640
641
642 def exists(env):
643     return 1