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