2.50: svn merge https://svn.blender.org/svnroot/bf-blender/trunk/blender -r19323...
[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         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 = 'cp -R %s/release/ui %s/%s.app/Contents/MacOS/.blender/'%(bldroot,builddir,binary)
357         commands.getoutput(cmd)
358         cmd = 'chmod +x  %s/%s.app/Contents/MacOS/%s'%(builddir,binary, binary)
359         commands.getoutput(cmd)
360         cmd = 'find %s/%s.app -name .svn -prune -exec rm -rf {} \;'%(builddir, binary)
361         commands.getoutput(cmd)
362         cmd = 'find %s/%s.app -name .DS_Store -exec rm -rf {} \;'%(builddir, binary)
363         commands.getoutput(cmd)
364
365 #### END ACTION STUFF #########
366
367 def bsc(env, target, source):
368         
369         bd = os.path.dirname(target[0].abspath)
370         bscfile = '\"'+target[0].abspath+'\"'
371         bscpathcollect = '\"'+bd + os.sep + '*.sbr\"'
372         bscpathtmp = '\"'+bd + os.sep + 'bscmake.tmp\"'
373
374         os.system('dir /b/s '+bscpathcollect+' >'+bscpathtmp)
375
376         myfile = open(bscpathtmp[1:-1], 'r')
377         lines = myfile.readlines()
378         myfile.close()
379
380         newfile = open(bscpathtmp[1:-1], 'w')
381         for l in lines:
382                 newfile.write('\"'+l[:-1]+'\"\n')
383         newfile.close()
384                                 
385         os.system('bscmake /nologo /n /o'+bscfile+' @'+bscpathtmp)
386         os.system('del '+bscpathtmp)
387
388 class BlenderEnvironment(SConsEnvironment):
389
390         def BlenderRes(self=None, libname=None, source=None, libtype=['core'], priority=[100]):
391                 global libs
392                 if not self or not libname or not source:
393                         print bc.FAIL+'Cannot continue.  Missing argument for BlenderRes '+libname+bc.ENDC
394                         self.Exit()
395                 if self['OURPLATFORM'] not in ('win32-vc','win32-mingw','linuxcross', 'win64-vc'):
396                         print bc.FAIL+'BlenderRes is for windows only!'+bc.END
397                         self.Exit()
398                 
399                 print bc.HEADER+'Configuring resource '+bc.ENDC+bc.OKGREEN+libname+bc.ENDC
400                 lenv = self.Clone()
401                 res = lenv.RES('#'+root_build_dir+'lib/'+libname, source)
402                 
403                 SConsEnvironment.Default(self, res)
404                 resources.append(res)
405
406         def BlenderLib(self=None, libname=None, sources=None, includes=[], defines=[], libtype='common', priority = 100, compileflags=None, cc_compileflags=None, cxx_compileflags=None):          
407                 if not self or not libname or not sources:
408                         print bc.FAIL+'Cannot continue. Missing argument for BuildBlenderLib '+libname+bc.ENDC
409                         self.Exit()
410
411                 def list_substring(quickie, libname):
412                         for q in quickie:
413                                 if libname.find(q) != -1:
414                                         return True
415                         return False
416
417                 if list_substring(quickie, libname) or len(quickie)==0:
418                         if list_substring(quickdebug, libname):
419                                 print bc.HEADER+'Configuring library '+bc.ENDC+bc.OKGREEN+libname +bc.ENDC+bc.OKBLUE+ " (debug mode)" + bc.ENDC
420                         else:
421                                 print bc.HEADER+'Configuring library '+bc.ENDC+bc.OKGREEN+libname + bc.ENDC
422                         lenv = self.Clone()
423                         lenv.Append(CPPPATH=includes)
424                         lenv.Append(CPPDEFINES=defines)
425                         if lenv['BF_DEBUG'] or (libname in quickdebug):
426                                         lenv.Append(CFLAGS = lenv['BF_DEBUG_CFLAGS'])
427                                         lenv.Append(CCFLAGS = lenv['BF_DEBUG_CCFLAGS'])
428                                         lenv.Append(CXXFLAGS = lenv['BF_DEBUG_CXXFLAGS'])
429                         else:
430                                         lenv.Append(CFLAGS = lenv['REL_CFLAGS'])
431                                         lenv.Append(CCFLAGS = lenv['REL_CCFLAGS'])
432                                         lenv.Append(CXXFLAGS = lenv['REL_CXXFLAGS'])
433                         if lenv['BF_PROFILE']:
434                                         lenv.Append(CFLAGS = lenv['BF_PROFILE_CFLAGS'])
435                                         lenv.Append(CCFLAGS = lenv['BF_PROFILE_CCFLAGS'])
436                                         lenv.Append(CXXFLAGS = lenv['BF_PROFILE_CXXFLAGS'])
437                         if compileflags:
438                                 lenv.Replace(CFLAGS = compileflags)
439                         if cc_compileflags:
440                                 lenv.Replace(CCFLAGS = cc_compileflags)
441                         if cxx_compileflags:
442                                 lenv.Replace(CXXFLAGS = cxx_compileflags)
443                         lenv.Append(CFLAGS = lenv['C_WARN'])
444                         lenv.Append(CCFLAGS = lenv['CC_WARN'])
445                         lenv.Append(CXXFLAGS = lenv['CXX_WARN'])
446                         
447                         targetdir = root_build_dir+'lib/' + libname
448                         if not (root_build_dir[0]==os.sep or root_build_dir[1]==':'):
449                                 targetdir = '#'+targetdir
450                         lib = lenv.Library(target= targetdir, source=sources)
451                         SConsEnvironment.Default(self, lib) # we add to default target, because this way we get some kind of progress info during build
452                 else:
453                         print bc.WARNING+'Not building '+bc.ENDC+bc.OKGREEN+libname+bc.ENDC+' for '+bc.OKBLUE+'BF_QUICK'+bc.ENDC
454                 # note: libs is a global
455                 add_lib_to_dict(self, libs, libtype, libname, priority)
456
457         def BlenderProg(self=None, builddir=None, progname=None, sources=None, includes=None, libs=None, libpath=None, binarykind=''):
458                 print bc.HEADER+'Configuring program '+bc.ENDC+bc.OKGREEN+progname+bc.ENDC
459                 lenv = self.Clone()
460                 if lenv['OURPLATFORM'] in ('win32-vc', 'cygwin', 'win64-vc'):
461                         lenv.Append(LINKFLAGS = lenv['PLATFORM_LINKFLAGS'])
462                         if lenv['BF_DEBUG']:
463                                 lenv.Prepend(LINKFLAGS = ['/DEBUG','/PDB:'+progname+'.pdb'])
464                 if  lenv['OURPLATFORM']=='linux2':
465                         lenv.Append(LINKFLAGS = lenv['PLATFORM_LINKFLAGS'])
466                         if lenv['WITH_BF_PYTHON']:
467                                 lenv.Append(LINKFLAGS = lenv['BF_PYTHON_LINKFLAGS'])
468                 if  lenv['OURPLATFORM']=='sunos5':
469                         lenv.Append(LINKFLAGS = lenv['PLATFORM_LINKFLAGS'])
470                         if lenv['WITH_BF_PYTHON']:
471                                 lenv.Append(LINKFLAGS = lenv['BF_PYTHON_LINKFLAGS'])
472                         if lenv['CXX'].endswith('CC'):
473                                  lenv.Replace(LINK = '$CXX')
474                 if  lenv['OURPLATFORM']=='darwin':
475                         lenv.Append(LINKFLAGS = lenv['PLATFORM_LINKFLAGS'])
476                         if lenv['WITH_BF_PYTHON']:
477                                 lenv.Append(LINKFLAGS = lenv['BF_PYTHON_LINKFLAGS'])
478                         lenv.Append(LINKFLAGS = lenv['BF_OPENGL_LINKFLAGS'])
479                 if lenv['BF_PROFILE']:
480                         lenv.Append(LINKFLAGS = lenv['BF_PROFILE_LINKFLAGS'])
481                 lenv.Append(CPPPATH=includes)
482                 if root_build_dir[0]==os.sep or root_build_dir[1]==':':
483                         lenv.Append(LIBPATH=root_build_dir + '/lib')
484                 lenv.Append(LIBPATH=libpath)
485                 lenv.Append(LIBS=libs)
486                 if lenv['WITH_BF_QUICKTIME']:
487                          lenv.Append(LIBS = lenv['BF_QUICKTIME_LIB'])
488                          lenv.Append(LIBPATH = lenv['BF_QUICKTIME_LIBPATH'])
489                 prog = lenv.Program(target=builddir+'bin/'+progname, source=sources)
490                 if lenv['BF_DEBUG'] and lenv['OURPLATFORM'] in ('win32-vc', 'win64-vc') and lenv['BF_BSC']:
491                         f = lenv.File(progname + '.bsc', builddir)
492                         brs = lenv.Command(f, prog, [bsc])
493                         SConsEnvironment.Default(self, brs)
494                 SConsEnvironment.Default(self, prog)
495                 program_list.append(prog)
496                 if  lenv['OURPLATFORM']=='darwin':
497                         lenv['BINARYKIND'] = binarykind
498                         lenv.AddPostAction(prog,Action(AppIt,strfunction=my_appit_print))
499                 return prog
500
501         def Glob(lenv, pattern):
502                 path = string.replace(GetBuildPath(lenv,'SConscript'),'SConscript', '')
503                 files = []
504                 for i in glob.glob(path + pattern):
505                         files.append(string.replace(i, path, ''))
506                 return files