Cloth Buttons:
[blender.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         libincs += Split(lenv['BF_FREETYPE_LIBPATH'])
123         if lenv['WITH_BF_PYTHON']:
124                 libincs += Split(lenv['BF_PYTHON_LIBPATH'])
125         if lenv['WITH_BF_SDL']:
126                 libincs += Split(lenv['BF_SDL_LIBPATH'])
127         if lenv['WITH_BF_FFMPEG']:
128                 libincs += Split(lenv['BF_FFMPEG_LIBPATH'])
129         if lenv['WITH_BF_STATICCXX']:
130                 statlibs += Split(lenv['BF_CXX_LIB_STATIC'])
131         if lenv['WITH_BF_OPENEXR']:
132                 libincs += Split(lenv['BF_OPENEXR_LIBPATH'])
133                 if lenv['WITH_BF_STATICOPENEXR']:
134                         statlibs += Split(lenv['BF_OPENEXR_LIB_STATIC'])
135         if lenv['WITH_BF_INTERNATIONAL']:
136                 libincs += Split(lenv['BF_GETTEXT_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         syslibs += Split(lenv['BF_FREETYPE_LIB'])
161         if lenv['WITH_BF_PYTHON'] and not lenv['WITH_BF_STATICPYTHON']:
162                 if lenv['BF_DEBUG'] and lenv['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
163                         syslibs.append(lenv['BF_PYTHON_LIB']+'_d')
164                 else:
165                         syslibs.append(lenv['BF_PYTHON_LIB'])
166         if lenv['WITH_BF_INTERNATIONAL']:
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         if lenv['WITH_BF_LCMS']:
192                 syslibs.append(lenv['BF_LCMS_LIB'])
193
194
195         syslibs += lenv['LLIBS']
196
197         return syslibs
198
199 def propose_priorities():
200         print bc.OKBLUE+"Priorities:"+bc.ENDC
201         for t in possible_types:
202                 print bc.OKGREEN+"\t"+t+bc.ENDC
203                 new_priority = 0
204                 curlib = libs[t]
205                 sortlist = curlib.keys()
206                 sortlist.sort()
207
208                 for sk in sortlist:
209                         v = curlib[sk]
210                         #for p,v in sorted(libs[t].iteritems()):
211                         print "\t\t",new_priority, v
212                         new_priority += 5
213
214 ## TODO: see if this can be made in an emitter
215 def buildinfo(lenv, build_type):
216         """
217         Generate a buildinfo object
218         """
219         build_date = time.strftime ("%Y-%m-%d")
220         build_time = time.strftime ("%H:%M:%S")
221         build_rev = os.popen('svnversion').read()[:-1] # remove \n
222
223         obj = []
224         if lenv['BF_BUILDINFO']:
225                 if sys.platform=='win32':
226                         build_info_file = open("source/creator/winbuildinfo.h", 'w')
227                         build_info_file.write("char *build_date=\"%s\";\n"%build_date)
228                         build_info_file.write("char *build_time=\"%s\";\n"%build_time)
229                         build_info_file.write("char *build_rev=\"%s\";\n"%build_rev)
230                         build_info_file.write("char *build_platform=\"win32\";\n")
231                         build_info_file.write("char *build_type=\"dynamic\";\n")
232                         build_info_file.close()
233                         lenv.Append (CPPDEFINES = ['NAN_BUILDINFO', 'BUILD_DATE'])
234                 else:
235                         lenv.Append (CPPDEFINES = ['BUILD_TIME=\'"%s"\''%(build_time),
236                                                                                 'BUILD_DATE=\'"%s"\''%(build_date),
237                                                                                 'BUILD_TYPE=\'"dynamic"\'',
238                                                                                 'BUILD_REV=\'"%s"\''%(build_rev),
239                                                                                 'NAN_BUILDINFO',
240                                                                                 'BUILD_PLATFORM=\'"%s"\''%(sys.platform)])
241                 obj = [lenv.Object (root_build_dir+'source/creator/%s_buildinfo'%build_type,
242                                                 [root_build_dir+'source/creator/buildinfo.c'])]
243         return obj
244
245 ##### END LIB STUFF ############
246
247 ##### ACTION STUFF #############
248
249 def my_compile_print(target, source, env):
250         a = '%s' % (source[0])
251         d, f = os.path.split(a)
252         return bc.OKBLUE+"Compiling"+bc.ENDC +" ==> '"+bc.OKGREEN+"%s" % (f) + "'"+bc.ENDC
253
254 def my_moc_print(target, source, env):
255         a = '%s' % (source[0])
256         d, f = os.path.split(a)
257         return bc.OKBLUE+"Creating MOC"+bc.ENDC+ " ==> '"+bc.OKGREEN+"%s" %(f) + "'"+bc.ENDC
258
259 def my_linking_print(target, source, env):
260         t = '%s' % (target[0])
261         d, f = os.path.split(t)
262         return bc.OKBLUE+"Linking library"+bc.ENDC +" ==> '"+bc.OKGREEN+"%s" % (f) + "'"+bc.ENDC
263
264 def my_program_print(target, source, env):
265         t = '%s' % (target[0])
266         d, f = os.path.split(t)
267         return bc.OKBLUE+"Linking program"+bc.ENDC +" ==> '"+bc.OKGREEN+"%s" % (f) + "'"+bc.ENDC
268
269 def msvc_hack(env):
270         static_lib = SCons.Tool.createStaticLibBuilder(env)
271         program = SCons.Tool.createProgBuilder(env)
272         
273         env['BUILDERS']['Library'] = static_lib
274         env['BUILDERS']['StaticLibrary'] = static_lib
275         env['BUILDERS']['Program'] = program
276                 
277 def set_quiet_output(env):
278         mycaction = Action("$CCCOM", strfunction=my_compile_print)
279         myshcaction = Action("$SHCCCOM", strfunction=my_compile_print)
280         mycppaction = Action("$CXXCOM", strfunction=my_compile_print)
281         myshcppaction = Action("$SHCXXCOM", strfunction=my_compile_print)
282         mylibaction = Action("$ARCOM", strfunction=my_linking_print)
283         mylinkaction = Action("$LINKCOM", strfunction=my_program_print)
284
285         static_ob, shared_ob = SCons.Tool.createObjBuilders(env)
286         static_ob.add_action('.c', mycaction)
287         static_ob.add_action('.cpp', mycppaction)
288         shared_ob.add_action('.c', myshcaction)
289         shared_ob.add_action('.cpp', myshcppaction)
290
291         static_lib = SCons.Builder.Builder(action = mylibaction,
292                                                                            emitter = '$LIBEMITTER',
293                                                                            prefix = '$LIBPREFIX',
294                                                                            suffix = '$LIBSUFFIX',
295                                                                            src_suffix = '$OBJSUFFIX',
296                                                                            src_builder = 'StaticObject')
297
298         program = SCons.Builder.Builder(action = mylinkaction,
299                                                                         emitter = '$PROGEMITTER',
300                                                                         prefix = '$PROGPREFIX',
301                                                                         suffix = '$PROGSUFFIX',
302                                                                         src_suffix = '$OBJSUFFIX',
303                                                                         src_builder = 'Object',
304                                                                         target_scanner = SCons.Defaults.ProgScan)
305
306         env['BUILDERS']['Object'] = static_ob
307         env['BUILDERS']['StaticObject'] = static_ob
308         env['BUILDERS']['StaticLibrary'] = static_lib
309         env['BUILDERS']['Library'] = static_lib
310         env['BUILDERS']['Program'] = program
311
312 def  my_appit_print(target, source, env):
313         a = '%s' % (target[0])
314         d, f = os.path.split(a)
315         return "making bundle for " + f
316
317 def AppIt(target=None, source=None, env=None):
318         import shutil
319         import commands
320         import os.path
321         
322         
323         a = '%s' % (target[0])
324         builddir, b = os.path.split(a)
325
326         bldroot = env.Dir('.').abspath
327         binary = env['BINARYKIND']
328          
329         if b=='verse':
330                 print bc.OKBLUE+"no bundle for verse"+bc.ENDC 
331                 return 0
332         
333         sourcedir = bldroot + '/source/darwin/%s.app'%binary
334         sourceinfo = bldroot + "/source/darwin/%s.app/Contents/Info.plist"%binary
335         targetinfo = builddir +'/' + "%s.app/Contents/Info.plist"%binary
336         cmd = builddir + '/' +'%s.app'%binary
337         
338         if os.path.isdir(cmd):
339                 shutil.rmtree(cmd)
340         shutil.copytree(sourcedir, cmd)
341         cmd = "cat %s | sed s/VERSION/`cat release/VERSION`/ | sed s/DATE/`date +'%%Y-%%b-%%d'`/ > %s"%(sourceinfo,targetinfo)
342         commands.getoutput(cmd)
343         cmd = 'cp %s/%s %s/%s.app/Contents/MacOS/%s'%(builddir, binary,builddir, binary, binary)
344         commands.getoutput(cmd)
345         cmd = 'mkdir %s/%s.app/Contents/MacOS/.blender/'%(builddir, binary)
346         print cmd
347         commands.getoutput(cmd)
348         cmd = builddir + '/%s.app/Contents/MacOS/.blender'%binary
349         shutil.copy(bldroot + '/bin/.blender/.bfont.ttf', cmd)
350         shutil.copy(bldroot + '/bin/.blender/.Blanguages', cmd)
351         cmd = 'cp -R %s/bin/.blender/locale %s/%s.app/Contents/Resources/'%(bldroot,builddir,binary)
352         commands.getoutput(cmd) 
353         cmd = 'cp -R %s/bin/.blender/locale %s/%s.app/Contents/MacOS/.blender/'%(bldroot,builddir,binary)
354         commands.getoutput(cmd) 
355         cmd = 'cp %s/bin/.blender/.Blanguages %s/%s.app/Contents/Resources/'%(bldroot,builddir,binary)
356         commands.getoutput(cmd) 
357         cmd = 'cp -R %s/release/scripts %s/%s.app/Contents/MacOS/.blender/'%(bldroot,builddir,binary)
358         commands.getoutput(cmd)
359         cmd = 'cp -R %s/release/ui %s/%s.app/Contents/MacOS/.blender/'%(bldroot,builddir,binary)
360         commands.getoutput(cmd)
361         cmd = 'chmod +x  %s/%s.app/Contents/MacOS/%s'%(builddir,binary, binary)
362         commands.getoutput(cmd)
363         cmd = 'find %s/%s.app -name .svn -prune -exec rm -rf {} \;'%(builddir, binary)
364         commands.getoutput(cmd)
365         cmd = 'find %s/%s.app -name .DS_Store -exec rm -rf {} \;'%(builddir, binary)
366         commands.getoutput(cmd)
367
368 #### END ACTION STUFF #########
369
370 def bsc(env, target, source):
371         
372         bd = os.path.dirname(target[0].abspath)
373         bscfile = '\"'+target[0].abspath+'\"'
374         bscpathcollect = '\"'+bd + os.sep + '*.sbr\"'
375         bscpathtmp = '\"'+bd + os.sep + 'bscmake.tmp\"'
376
377         os.system('dir /b/s '+bscpathcollect+' >'+bscpathtmp)
378
379         myfile = open(bscpathtmp[1:-1], 'r')
380         lines = myfile.readlines()
381         myfile.close()
382
383         newfile = open(bscpathtmp[1:-1], 'w')
384         for l in lines:
385                 newfile.write('\"'+l[:-1]+'\"\n')
386         newfile.close()
387                                 
388         os.system('bscmake /nologo /n /o'+bscfile+' @'+bscpathtmp)
389         os.system('del '+bscpathtmp)
390
391 class BlenderEnvironment(SConsEnvironment):
392
393         def BlenderRes(self=None, libname=None, source=None, libtype=['core'], priority=[100]):
394                 global libs
395                 if not self or not libname or not source:
396                         print bc.FAIL+'Cannot continue.  Missing argument for BlenderRes '+libname+bc.ENDC
397                         self.Exit()
398                 if self['OURPLATFORM'] not in ('win32-vc','win32-mingw','linuxcross', 'win64-vc'):
399                         print bc.FAIL+'BlenderRes is for windows only!'+bc.END
400                         self.Exit()
401                 
402                 print bc.HEADER+'Configuring resource '+bc.ENDC+bc.OKGREEN+libname+bc.ENDC
403                 lenv = self.Clone()
404                 res = lenv.RES('#'+root_build_dir+'lib/'+libname, source)
405                 
406                 SConsEnvironment.Default(self, res)
407                 resources.append(res)
408
409         def BlenderLib(self=None, libname=None, sources=None, includes=[], defines=[], libtype='common', priority = 100, compileflags=None, cc_compileflags=None, cxx_compileflags=None):          
410                 if not self or not libname or not sources:
411                         print bc.FAIL+'Cannot continue. Missing argument for BuildBlenderLib '+libname+bc.ENDC
412                         self.Exit()
413
414                 def list_substring(quickie, libname):
415                         for q in quickie:
416                                 if libname.find(q) != -1:
417                                         return True
418                         return False
419
420                 if list_substring(quickie, libname) or len(quickie)==0:
421                         if list_substring(quickdebug, libname):
422                                 print bc.HEADER+'Configuring library '+bc.ENDC+bc.OKGREEN+libname +bc.ENDC+bc.OKBLUE+ " (debug mode)" + bc.ENDC
423                         else:
424                                 print bc.HEADER+'Configuring library '+bc.ENDC+bc.OKGREEN+libname + bc.ENDC
425                         lenv = self.Clone()
426                         lenv.Append(CPPPATH=includes)
427                         lenv.Append(CPPDEFINES=defines)
428                         if lenv['BF_DEBUG'] or (libname in quickdebug):
429                                         lenv.Append(CFLAGS = lenv['BF_DEBUG_CFLAGS'])
430                                         lenv.Append(CCFLAGS = lenv['BF_DEBUG_CCFLAGS'])
431                                         lenv.Append(CXXFLAGS = lenv['BF_DEBUG_CXXFLAGS'])
432                         else:
433                                         lenv.Append(CFLAGS = lenv['REL_CFLAGS'])
434                                         lenv.Append(CCFLAGS = lenv['REL_CCFLAGS'])
435                                         lenv.Append(CXXFLAGS = lenv['REL_CXXFLAGS'])
436                         if lenv['BF_PROFILE']:
437                                         lenv.Append(CFLAGS = lenv['BF_PROFILE_CFLAGS'])
438                                         lenv.Append(CCFLAGS = lenv['BF_PROFILE_CCFLAGS'])
439                                         lenv.Append(CXXFLAGS = lenv['BF_PROFILE_CXXFLAGS'])
440                         if compileflags:
441                                 lenv.Replace(CFLAGS = compileflags)
442                         if cc_compileflags:
443                                 lenv.Replace(CCFLAGS = cc_compileflags)
444                         if cxx_compileflags:
445                                 lenv.Replace(CXXFLAGS = cxx_compileflags)
446                         lenv.Append(CFLAGS = lenv['C_WARN'])
447                         lenv.Append(CCFLAGS = lenv['CC_WARN'])
448                         lenv.Append(CXXFLAGS = lenv['CXX_WARN'])
449                         
450                         targetdir = root_build_dir+'lib/' + libname
451                         if not (root_build_dir[0]==os.sep or root_build_dir[1]==':'):
452                                 targetdir = '#'+targetdir
453                         lib = lenv.Library(target= targetdir, source=sources)
454                         SConsEnvironment.Default(self, lib) # we add to default target, because this way we get some kind of progress info during build
455                 else:
456                         print bc.WARNING+'Not building '+bc.ENDC+bc.OKGREEN+libname+bc.ENDC+' for '+bc.OKBLUE+'BF_QUICK'+bc.ENDC
457                 # note: libs is a global
458                 add_lib_to_dict(self, libs, libtype, libname, priority)
459
460         def BlenderProg(self=None, builddir=None, progname=None, sources=None, includes=None, libs=None, libpath=None, binarykind=''):
461                 print bc.HEADER+'Configuring program '+bc.ENDC+bc.OKGREEN+progname+bc.ENDC
462                 lenv = self.Clone()
463                 if lenv['OURPLATFORM'] in ('win32-vc', 'cygwin', 'win64-vc'):
464                         lenv.Append(LINKFLAGS = lenv['PLATFORM_LINKFLAGS'])
465                         if lenv['BF_DEBUG']:
466                                 lenv.Prepend(LINKFLAGS = ['/DEBUG','/PDB:'+progname+'.pdb'])
467                 if  lenv['OURPLATFORM']=='linux2':
468                         lenv.Append(LINKFLAGS = lenv['PLATFORM_LINKFLAGS'])
469                         if lenv['WITH_BF_PYTHON']:
470                                 lenv.Append(LINKFLAGS = lenv['BF_PYTHON_LINKFLAGS'])
471                 if  lenv['OURPLATFORM']=='sunos5':
472                         lenv.Append(LINKFLAGS = lenv['PLATFORM_LINKFLAGS'])
473                         if lenv['WITH_BF_PYTHON']:
474                                 lenv.Append(LINKFLAGS = lenv['BF_PYTHON_LINKFLAGS'])
475                         if lenv['CXX'].endswith('CC'):
476                                  lenv.Replace(LINK = '$CXX')
477                 if  lenv['OURPLATFORM']=='darwin':
478                         lenv.Append(LINKFLAGS = lenv['PLATFORM_LINKFLAGS'])
479                         if lenv['WITH_BF_PYTHON']:
480                                 lenv.Append(LINKFLAGS = lenv['BF_PYTHON_LINKFLAGS'])
481                         lenv.Append(LINKFLAGS = lenv['BF_OPENGL_LINKFLAGS'])
482                 if lenv['BF_PROFILE']:
483                         lenv.Append(LINKFLAGS = lenv['BF_PROFILE_LINKFLAGS'])
484                 lenv.Append(CPPPATH=includes)
485                 if root_build_dir[0]==os.sep or root_build_dir[1]==':':
486                         lenv.Append(LIBPATH=root_build_dir + '/lib')
487                 lenv.Append(LIBPATH=libpath)
488                 lenv.Append(LIBS=libs)
489                 if lenv['WITH_BF_QUICKTIME']:
490                          lenv.Append(LIBS = lenv['BF_QUICKTIME_LIB'])
491                          lenv.Append(LIBPATH = lenv['BF_QUICKTIME_LIBPATH'])
492                 prog = lenv.Program(target=builddir+'bin/'+progname, source=sources)
493                 if lenv['BF_DEBUG'] and lenv['OURPLATFORM'] in ('win32-vc', 'win64-vc') and lenv['BF_BSC']:
494                         f = lenv.File(progname + '.bsc', builddir)
495                         brs = lenv.Command(f, prog, [bsc])
496                         SConsEnvironment.Default(self, brs)
497                 SConsEnvironment.Default(self, prog)
498                 program_list.append(prog)
499                 if  lenv['OURPLATFORM']=='darwin':
500                         lenv['BINARYKIND'] = binarykind
501                         lenv.AddPostAction(prog,Action(AppIt,strfunction=my_appit_print))
502                 return prog
503
504         def Glob(lenv, pattern):
505                 path = string.replace(GetBuildPath(lenv,'SConscript'),'SConscript', '')
506                 files = []
507                 for i in glob.glob(path + pattern):
508                         files.append(string.replace(i, path, ''))
509                 return files