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