* More UI control tweaks
[blender-staging.git] / tools / Blender.py
1 #!/usr/bin/env python
2
3 """
4 tools.BlenderEnvironment
5
6 This environment builds on SCons.Script.SConscript.SConsEnvironment
7
8 * library repository
9 * custom printout
10 * wrapper functions
11
12 TODO: clean up and sanitise code - crosscheck with btools and SConstruct
13 to kill any code duplication
14
15 """
16
17 import os
18 import os.path
19 import string
20 import glob
21 import time
22 import sys
23
24 from SCons.Script.SConscript import SConsEnvironment
25 import SCons.Action
26 import SCons.Util
27 import SCons.Builder
28 import SCons.Tool
29 import bcolors
30 bc = bcolors.bcolors()
31
32 Split = SCons.Util.Split
33 Action = SCons.Action.Action
34 Builder = SCons.Builder.Builder
35 GetBuildPath = SConsEnvironment.GetBuildPath
36
37 # a few globals
38 root_build_dir = ''
39 doc_build_dir = ''
40 quickie = None # Anything else than None if BF_QUICK has been passed
41 quicklist = [] # The list of libraries/programs to compile during a quickie
42 program_list = [] # A list holding Nodes to final binaries, used to create installs
43 arguments = None
44 targets = None
45 resources = []
46
47 #some internals
48 blenderdeps = [] # don't manipulate this one outside this module!
49
50 ##### LIB STUFF ##########
51
52 possible_types = ['core'] # can be set in ie. SConstruct
53 libs = {}
54
55 def getresources():
56         return resources
57
58 def init_lib_dict():
59         for pt in possible_types:
60                 libs[pt] = {}
61
62 # helper func for add_lib_to_dict
63 def internal_lib_to_dict(dict = None, libtype = None, libname = None, priority = 100):
64         if not libname in dict[libtype]:
65                 done = None
66                 while not done:
67                         if dict[libtype].has_key(priority):
68                                 priority = priority + 1
69                         else:
70                                 done = True
71                 dict[libtype][priority] = libname
72
73 # libtype and priority can both be lists, for defining lib in multiple places
74 def add_lib_to_dict(env, dict = None, libtype = None, libname = None, priority = 100):
75         if not dict or not libtype or not libname:
76                 print "Passed wrong arg"
77                 env.Exit()
78
79         if type(libtype) is str and type(priority) is int:
80                 internal_lib_to_dict(dict, libtype, libname, priority)
81         elif type(libtype) is list and type(priority) is list:
82                 if len(libtype)==len(priority):
83                         for lt, p in zip(libtype, priority):
84                                 internal_lib_to_dict(dict, lt, libname, p)
85                 else:
86                         print "libtype and priority lists are unequal in length"
87                         env.Exit()
88         else:
89                 print "Wrong type combinations for libtype and priority. Only str and int or list and list"
90                 env.Exit()
91
92 def create_blender_liblist(lenv = None, libtype = None):
93         if not lenv or not libtype:
94                 print "missing arg"
95
96         lst = []
97         if libtype in possible_types:
98                 curlib = libs[libtype]
99                 sortlist = curlib.keys()
100                 sortlist.sort()
101                 for sk in sortlist:
102                         v = curlib[sk]
103                         target = os.path.abspath(os.getcwd() + os.sep + root_build_dir + 'lib' + os.sep +lenv['LIBPREFIX'] + v + lenv['LIBSUFFIX'])
104                         lst.append(target)
105
106         return lst
107
108 ## TODO: static linking
109 def setup_staticlibs(lenv):
110         statlibs = [
111                 #here libs for static linking
112         ]
113         libincs = [
114                 '/usr/lib',
115                 lenv['BF_OPENGL_LIBPATH'],
116                 lenv['BF_JPEG_LIBPATH'],
117                 lenv['BF_PNG_LIBPATH'],
118                 lenv['BF_ZLIB_LIBPATH'],
119                 lenv['BF_ICONV_LIBPATH']
120                 ]
121
122         if lenv['WITH_BF_PYTHON']:
123                 libincs += Split(lenv['BF_PYTHON_LIBPATH'])
124         if lenv['WITH_BF_SDL']:
125                 libincs += Split(lenv['BF_SDL_LIBPATH'])
126         if lenv['WITH_BF_FFMPEG']:
127                 libincs += Split(lenv['BF_FFMPEG_LIBPATH'])
128         if lenv['WITH_BF_STATICCXX']:
129                 statlibs += Split(lenv['BF_CXX_LIB_STATIC'])
130         if lenv['WITH_BF_OPENEXR']:
131                 libincs += Split(lenv['BF_OPENEXR_LIBPATH'])
132                 if lenv['WITH_BF_STATICOPENEXR']:
133                         statlibs += Split(lenv['BF_OPENEXR_LIB_STATIC'])
134         if lenv['WITH_BF_INTERNATIONAL']:
135                 libincs += Split(lenv['BF_GETTEXT_LIBPATH'])
136                 libincs += Split(lenv['BF_FREETYPE_LIBPATH'])
137         if lenv['WITH_BF_OPENAL']:
138                 libincs += Split(lenv['BF_OPENAL_LIBPATH'])
139                 if lenv['WITH_BF_STATICOPENAL']:
140                         statlibs += Split(lenv['BF_OPENAL_LIB_STATIC'])
141         if lenv['WITH_BF_STATICOPENGL']:
142                 statlibs += Split(lenv['BF_OPENGL_LIB_STATIC'])
143
144         if lenv['WITH_BF_PYTHON'] and lenv['WITH_BF_STATICPYTHON']:
145                 statlibs += Split(lenv['BF_PYTHON_LIB_STATIC'])
146
147         if lenv['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
148                 libincs += Split(lenv['BF_PTHREADS_LIBPATH'])
149
150         return statlibs, libincs
151
152 def setup_syslibs(lenv):
153         syslibs = [
154                 
155                 lenv['BF_JPEG_LIB'],
156                 lenv['BF_PNG_LIB'],
157                 lenv['BF_ZLIB_LIB']
158                 ]
159
160         if lenv['WITH_BF_PYTHON'] and not lenv['WITH_BF_STATICPYTHON']:
161                 if lenv['BF_DEBUG'] and lenv['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
162                         syslibs.append(lenv['BF_PYTHON_LIB']+'_d')
163                 else:
164                         syslibs.append(lenv['BF_PYTHON_LIB'])
165         if lenv['WITH_BF_INTERNATIONAL']:
166                 syslibs += Split(lenv['BF_FREETYPE_LIB'])
167                 syslibs += Split(lenv['BF_GETTEXT_LIB'])
168         if lenv['WITH_BF_OPENAL']:
169                 if not lenv['WITH_BF_STATICOPENAL']:
170                         syslibs += Split(lenv['BF_OPENAL_LIB'])
171         if lenv['WITH_BF_OPENMP'] and lenv['CC'] != 'icc':
172                 if lenv['CC'] == 'cl.exe':
173                         syslibs += ['vcomp']
174                 else:
175                         syslibs += ['gomp']
176         if lenv['WITH_BF_ICONV']:
177                 syslibs += Split(lenv['BF_ICONV_LIB'])
178         if lenv['WITH_BF_OPENEXR']:
179                 if not lenv['WITH_BF_STATICOPENEXR']:
180                         syslibs += Split(lenv['BF_OPENEXR_LIB'])
181         if lenv['WITH_BF_FFMPEG']:
182                 syslibs += Split(lenv['BF_FFMPEG_LIB'])
183                 if lenv['WITH_BF_OGG']:
184                         syslibs += Split(lenv['BF_OGG_LIB'])
185         if lenv['WITH_BF_SDL']:
186                 syslibs += Split(lenv['BF_SDL_LIB'])
187         if not lenv['WITH_BF_STATICOPENGL']:
188                 syslibs += Split(lenv['BF_OPENGL_LIB'])
189         if lenv['OURPLATFORM'] in ('win32-vc', 'win32-mingw','linuxcross', 'win64-vc'):
190                 syslibs += Split(lenv['BF_PTHREADS_LIB'])
191
192         syslibs += lenv['LLIBS']
193
194         return syslibs
195
196 def propose_priorities():
197         print bc.OKBLUE+"Priorities:"+bc.ENDC
198         for t in possible_types:
199                 print bc.OKGREEN+"\t"+t+bc.ENDC
200                 new_priority = 0
201                 curlib = libs[t]
202                 sortlist = curlib.keys()
203                 sortlist.sort()
204
205                 for sk in sortlist:
206                         v = curlib[sk]
207                         #for p,v in sorted(libs[t].iteritems()):
208                         print "\t\t",new_priority, v
209                         new_priority += 5
210
211 ## TODO: see if this can be made in an emitter
212 def buildinfo(lenv, build_type):
213         """
214         Generate a buildinfo object
215         """
216         build_date = time.strftime ("%Y-%m-%d")
217         build_time = time.strftime ("%H:%M:%S")
218         build_rev = os.popen('svnversion').read()[:-1] # remove \n
219
220         obj = []
221         if lenv['BF_BUILDINFO']:
222                 if sys.platform=='win32':
223                         build_info_file = open("source/creator/winbuildinfo.h", 'w')
224                         build_info_file.write("char *build_date=\"%s\";\n"%build_date)
225                         build_info_file.write("char *build_time=\"%s\";\n"%build_time)
226                         build_info_file.write("char *build_rev=\"%s\";\n"%build_rev)
227                         build_info_file.write("char *build_platform=\"win32\";\n")
228                         build_info_file.write("char *build_type=\"dynamic\";\n")
229                         build_info_file.close()
230                         lenv.Append (CPPDEFINES = ['NAN_BUILDINFO', 'BUILD_DATE'])
231                 else:
232                         lenv.Append (CPPDEFINES = ['BUILD_TIME=\'"%s"\''%(build_time),
233                                                                                 'BUILD_DATE=\'"%s"\''%(build_date),
234                                                                                 'BUILD_TYPE=\'"dynamic"\'',
235                                                                                 'BUILD_REV=\'"%s"\''%(build_rev),
236                                                                                 'NAN_BUILDINFO',
237                                                                                 'BUILD_PLATFORM=\'"%s"\''%(sys.platform)])
238                 obj = [lenv.Object (root_build_dir+'source/creator/%s_buildinfo'%build_type,
239                                                 [root_build_dir+'source/creator/buildinfo.c'])]
240         return obj
241
242 ##### END LIB STUFF ############
243
244 ##### ACTION STUFF #############
245
246 def my_compile_print(target, source, env):
247         a = '%s' % (source[0])
248         d, f = os.path.split(a)
249         return bc.OKBLUE+"Compiling"+bc.ENDC +" ==> '"+bc.OKGREEN+"%s" % (f) + "'"+bc.ENDC
250
251 def my_moc_print(target, source, env):
252         a = '%s' % (source[0])
253         d, f = os.path.split(a)
254         return bc.OKBLUE+"Creating MOC"+bc.ENDC+ " ==> '"+bc.OKGREEN+"%s" %(f) + "'"+bc.ENDC
255
256 def my_linking_print(target, source, env):
257         t = '%s' % (target[0])
258         d, f = os.path.split(t)
259         return bc.OKBLUE+"Linking library"+bc.ENDC +" ==> '"+bc.OKGREEN+"%s" % (f) + "'"+bc.ENDC
260
261 def my_program_print(target, source, env):
262         t = '%s' % (target[0])
263         d, f = os.path.split(t)
264         return bc.OKBLUE+"Linking program"+bc.ENDC +" ==> '"+bc.OKGREEN+"%s" % (f) + "'"+bc.ENDC
265
266 def msvc_hack(env):
267         static_lib = SCons.Tool.createStaticLibBuilder(env)
268         program = SCons.Tool.createProgBuilder(env)
269         
270         env['BUILDERS']['Library'] = static_lib
271         env['BUILDERS']['StaticLibrary'] = static_lib
272         env['BUILDERS']['Program'] = program
273                 
274 def set_quiet_output(env):
275         mycaction = Action("$CCCOM", strfunction=my_compile_print)
276         myshcaction = Action("$SHCCCOM", strfunction=my_compile_print)
277         mycppaction = Action("$CXXCOM", strfunction=my_compile_print)
278         myshcppaction = Action("$SHCXXCOM", strfunction=my_compile_print)
279         mylibaction = Action("$ARCOM", strfunction=my_linking_print)
280         mylinkaction = Action("$LINKCOM", strfunction=my_program_print)
281
282         static_ob, shared_ob = SCons.Tool.createObjBuilders(env)
283         static_ob.add_action('.c', mycaction)
284         static_ob.add_action('.cpp', mycppaction)
285         shared_ob.add_action('.c', myshcaction)
286         shared_ob.add_action('.cpp', myshcppaction)
287
288         static_lib = SCons.Builder.Builder(action = mylibaction,
289                                                                            emitter = '$LIBEMITTER',
290                                                                            prefix = '$LIBPREFIX',
291                                                                            suffix = '$LIBSUFFIX',
292                                                                            src_suffix = '$OBJSUFFIX',
293                                                                            src_builder = 'StaticObject')
294
295         program = SCons.Builder.Builder(action = mylinkaction,
296                                                                         emitter = '$PROGEMITTER',
297                                                                         prefix = '$PROGPREFIX',
298                                                                         suffix = '$PROGSUFFIX',
299                                                                         src_suffix = '$OBJSUFFIX',
300                                                                         src_builder = 'Object',
301                                                                         target_scanner = SCons.Defaults.ProgScan)
302
303         env['BUILDERS']['Object'] = static_ob
304         env['BUILDERS']['StaticObject'] = static_ob
305         env['BUILDERS']['StaticLibrary'] = static_lib
306         env['BUILDERS']['Library'] = static_lib
307         env['BUILDERS']['Program'] = program
308
309 def  my_appit_print(target, source, env):
310         a = '%s' % (target[0])
311         d, f = os.path.split(a)
312         return "making bundle for " + f
313
314 def AppIt(target=None, source=None, env=None):
315         import shutil
316         import commands
317         import os.path
318         
319         
320         a = '%s' % (target[0])
321         builddir, b = os.path.split(a)
322
323         bldroot = env.Dir('.').abspath
324         binary = env['BINARYKIND']
325          
326         if b=='verse':
327                 print bc.OKBLUE+"no bundle for verse"+bc.ENDC 
328                 return 0
329         
330         sourcedir = bldroot + '/source/darwin/%s.app'%binary
331         sourceinfo = bldroot + "/source/darwin/%s.app/Contents/Info.plist"%binary
332         targetinfo = builddir +'/' + "%s.app/Contents/Info.plist"%binary
333         cmd = builddir + '/' +'%s.app'%binary
334         
335         if os.path.isdir(cmd):
336                 shutil.rmtree(cmd)
337         shutil.copytree(sourcedir, cmd)
338         cmd = "cat %s | sed s/VERSION/`cat release/VERSION`/ | sed s/DATE/`date +'%%Y-%%b-%%d'`/ > %s"%(sourceinfo,targetinfo)
339         commands.getoutput(cmd)
340         cmd = 'cp %s/%s %s/%s.app/Contents/MacOS/%s'%(builddir, binary,builddir, binary, binary)
341         commands.getoutput(cmd)
342         cmd = 'mkdir %s/%s.app/Contents/MacOS/.blender/'%(builddir, binary)
343         print cmd
344         commands.getoutput(cmd)
345         cmd = builddir + '/%s.app/Contents/MacOS/.blender'%binary
346         shutil.copy(bldroot + '/bin/.blender/.bfont.ttf', cmd)
347         shutil.copy(bldroot + '/bin/.blender/.Blanguages', cmd)
348         cmd = 'cp -R %s/bin/.blender/locale %s/%s.app/Contents/Resources/'%(bldroot,builddir,binary)
349         commands.getoutput(cmd) 
350         cmd = 'cp -R %s/bin/.blender/locale %s/%s.app/Contents/MacOS/.blender/'%(bldroot,builddir,binary)
351         commands.getoutput(cmd) 
352         cmd = 'cp %s/bin/.blender/.Blanguages %s/%s.app/Contents/Resources/'%(bldroot,builddir,binary)
353         commands.getoutput(cmd) 
354         cmd = 'cp -R %s/release/scripts %s/%s.app/Contents/MacOS/.blender/'%(bldroot,builddir,binary)
355         commands.getoutput(cmd)
356         cmd = 'chmod +x  %s/%s.app/Contents/MacOS/%s'%(builddir,binary, binary)
357         commands.getoutput(cmd)
358         cmd = 'find %s/%s.app -name .svn -prune -exec rm -rf {} \;'%(builddir, binary)
359         commands.getoutput(cmd)
360         cmd = 'find %s/%s.app -name .DS_Store -exec rm -rf {} \;'%(builddir, binary)
361         commands.getoutput(cmd)
362
363 #### END ACTION STUFF #########
364
365 def bsc(env, target, source):
366         
367         bd = os.path.dirname(target[0].abspath)
368         bscfile = '\"'+target[0].abspath+'\"'
369         bscpathcollect = '\"'+bd + os.sep + '*.sbr\"'
370         bscpathtmp = '\"'+bd + os.sep + 'bscmake.tmp\"'
371
372         os.system('dir /b/s '+bscpathcollect+' >'+bscpathtmp)
373
374         myfile = open(bscpathtmp[1:-1], 'r')
375         lines = myfile.readlines()
376         myfile.close()
377
378         newfile = open(bscpathtmp[1:-1], 'w')
379         for l in lines:
380                 newfile.write('\"'+l[:-1]+'\"\n')
381         newfile.close()
382                                 
383         os.system('bscmake /nologo /n /o'+bscfile+' @'+bscpathtmp)
384         os.system('del '+bscpathtmp)
385
386 class BlenderEnvironment(SConsEnvironment):
387
388         def BlenderRes(self=None, libname=None, source=None, libtype=['core'], priority=[100]):
389                 global libs
390                 if not self or not libname or not source:
391                         print bc.FAIL+'Cannot continue.  Missing argument for BlenderRes '+libname+bc.ENDC
392                         self.Exit()
393                 if self['OURPLATFORM'] not in ('win32-vc','win32-mingw','linuxcross', 'win64-vc'):
394                         print bc.FAIL+'BlenderRes is for windows only!'+bc.END
395                         self.Exit()
396                 
397                 print bc.HEADER+'Configuring resource '+bc.ENDC+bc.OKGREEN+libname+bc.ENDC
398                 lenv = self.Clone()
399                 res = lenv.RES('#'+root_build_dir+'lib/'+libname, source)
400                 
401                 SConsEnvironment.Default(self, res)
402                 resources.append(res)
403
404         def BlenderLib(self=None, libname=None, sources=None, includes=[], defines=[], libtype='common', priority = 100, compileflags=None, cc_compileflags=None, cxx_compileflags=None):          
405                 if not self or not libname or not sources:
406                         print bc.FAIL+'Cannot continue. Missing argument for BuildBlenderLib '+libname+bc.ENDC
407                         self.Exit()
408
409                 def list_substring(quickie, libname):
410                         for q in quickie:
411                                 if libname.find(q) != -1:
412                                         return True
413                         return False
414
415                 if list_substring(quickie, libname) or len(quickie)==0:
416                         if list_substring(quickdebug, libname):
417                                 print bc.HEADER+'Configuring library '+bc.ENDC+bc.OKGREEN+libname +bc.ENDC+bc.OKBLUE+ " (debug mode)" + bc.ENDC
418                         else:
419                                 print bc.HEADER+'Configuring library '+bc.ENDC+bc.OKGREEN+libname + bc.ENDC
420                         lenv = self.Clone()
421                         lenv.Append(CPPPATH=includes)
422                         lenv.Append(CPPDEFINES=defines)
423                         if lenv['BF_DEBUG'] or (libname in quickdebug):
424                                         lenv.Append(CFLAGS = lenv['BF_DEBUG_CFLAGS'])
425                                         lenv.Append(CCFLAGS = lenv['BF_DEBUG_CCFLAGS'])
426                                         lenv.Append(CXXFLAGS = lenv['BF_DEBUG_CXXFLAGS'])
427                         else:
428                                         lenv.Append(CFLAGS = lenv['REL_CFLAGS'])
429                                         lenv.Append(CCFLAGS = lenv['REL_CCFLAGS'])
430                                         lenv.Append(CXXFLAGS = lenv['REL_CXXFLAGS'])
431                         if lenv['BF_PROFILE']:
432                                         lenv.Append(CFLAGS = lenv['BF_PROFILE_CFLAGS'])
433                                         lenv.Append(CCFLAGS = lenv['BF_PROFILE_CCFLAGS'])
434                                         lenv.Append(CXXFLAGS = lenv['BF_PROFILE_CXXFLAGS'])
435                         if compileflags:
436                                 lenv.Append(CFLAGS = compileflags)
437                         if cc_compileflags:
438                                 lenv.Append(CCFLAGS = cc_compileflags)
439                         if cxx_compileflags:
440                                 lenv.Append(CXXFLAGS = cxx_compileflags)
441                         lenv.Append(CFLAGS = lenv['C_WARN'])
442                         lenv.Append(CCFLAGS = lenv['CC_WARN'])
443                         lenv.Append(CXXFLAGS = lenv['CXX_WARN'])
444                         
445                         targetdir = root_build_dir+'lib/' + libname
446                         if not (root_build_dir[0]==os.sep or root_build_dir[1]==':'):
447                                 targetdir = '#'+targetdir
448                         lib = lenv.Library(target= targetdir, source=sources)
449                         SConsEnvironment.Default(self, lib) # we add to default target, because this way we get some kind of progress info during build
450                 else:
451                         print bc.WARNING+'Not building '+bc.ENDC+bc.OKGREEN+libname+bc.ENDC+' for '+bc.OKBLUE+'BF_QUICK'+bc.ENDC
452                 # note: libs is a global
453                 add_lib_to_dict(self, libs, libtype, libname, priority)
454
455         def BlenderProg(self=None, builddir=None, progname=None, sources=None, includes=None, libs=None, libpath=None, binarykind=''):
456                 print bc.HEADER+'Configuring program '+bc.ENDC+bc.OKGREEN+progname+bc.ENDC
457                 lenv = self.Clone()
458                 if lenv['OURPLATFORM'] in ('win32-vc', 'cygwin', 'win64-vc'):
459                         lenv.Append(LINKFLAGS = lenv['PLATFORM_LINKFLAGS'])
460                         if lenv['BF_DEBUG']:
461                                 lenv.Prepend(LINKFLAGS = ['/DEBUG','/PDB:'+progname+'.pdb'])
462                 if  lenv['OURPLATFORM']=='linux2':
463                         lenv.Append(LINKFLAGS = lenv['PLATFORM_LINKFLAGS'])
464                         if lenv['WITH_BF_PYTHON']:
465                                 lenv.Append(LINKFLAGS = lenv['BF_PYTHON_LINKFLAGS'])
466                 if  lenv['OURPLATFORM']=='sunos5':
467                         lenv.Append(LINKFLAGS = lenv['PLATFORM_LINKFLAGS'])
468                         if lenv['WITH_BF_PYTHON']:
469                                 lenv.Append(LINKFLAGS = lenv['BF_PYTHON_LINKFLAGS'])
470                         if lenv['CXX'].endswith('CC'):
471                                  lenv.Replace(LINK = '$CXX')
472                 if  lenv['OURPLATFORM']=='darwin':
473                         lenv.Append(LINKFLAGS = lenv['PLATFORM_LINKFLAGS'])
474                         if lenv['WITH_BF_PYTHON']:
475                                 lenv.Append(LINKFLAGS = lenv['BF_PYTHON_LINKFLAGS'])
476                         lenv.Append(LINKFLAGS = lenv['BF_OPENGL_LINKFLAGS'])
477                 if lenv['BF_PROFILE']:
478                         lenv.Append(LINKFLAGS = lenv['BF_PROFILE_LINKFLAGS'])
479                 lenv.Append(CPPPATH=includes)
480                 if root_build_dir[0]==os.sep or root_build_dir[1]==':':
481                         lenv.Append(LIBPATH=root_build_dir + '/lib')
482                 lenv.Append(LIBPATH=libpath)
483                 lenv.Append(LIBS=libs)
484                 if lenv['WITH_BF_QUICKTIME']:
485                          lenv.Append(LIBS = lenv['BF_QUICKTIME_LIB'])
486                          lenv.Append(LIBPATH = lenv['BF_QUICKTIME_LIBPATH'])
487                 prog = lenv.Program(target=builddir+'bin/'+progname, source=sources)
488                 if lenv['BF_DEBUG'] and lenv['OURPLATFORM'] in ('win32-vc', 'win64-vc') and lenv['BF_BSC']:
489                         f = lenv.File(progname + '.bsc', builddir)
490                         brs = lenv.Command(f, prog, [bsc])
491                         SConsEnvironment.Default(self, brs)
492                 SConsEnvironment.Default(self, prog)
493                 program_list.append(prog)
494                 if  lenv['OURPLATFORM']=='darwin':
495                         lenv['BINARYKIND'] = binarykind
496                         lenv.AddPostAction(prog,Action(AppIt,strfunction=my_appit_print))
497                 return prog
498
499         def Glob(lenv, pattern):
500                 path = string.replace(GetBuildPath(lenv,'SConscript'),'SConscript', '')
501                 files = []
502                 for i in glob.glob(path + pattern):
503                         files.append(string.replace(i, path, ''))
504                 return files