8fab44d557658f5f7593a072d3815a2506167778
[blender.git] / SConstruct
1 #!/usr/bin/env python
2 # $Id$
3 # ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
4 #
5 # This program is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU General Public License
7 # as published by the Free Software Foundation; either version 2
8 # of the License, or (at your option) any later version. The Blender
9 # Foundation also sells licenses for use in proprietary software under
10 # the Blender License.  See http://www.blender.org/BL/ for information
11 # about this.
12 #
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 # GNU General Public License for more details.
17 #
18 # You should have received a copy of the GNU General Public License
19 # along with this program; if not, write to the Free Software Foundation,
20 # Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21 #
22 # The Original Code is Copyright (C) 2006, Blender Foundation
23 # All rights reserved.
24 #
25 # The Original Code is: all of this file.
26 #
27 # Contributor(s): Nathan Letwory.
28 #
29 # ***** END GPL/BL DUAL LICENSE BLOCK *****
30 #
31 # Main entry-point for the SCons building system
32 # Set up some custom actions and target/argument handling
33 # Then read all SConscripts and build
34
35 import sys
36 import os
37 import os.path
38 import string
39 import shutil
40 import glob
41 import re
42
43 import tools.Blender
44 import tools.btools
45 import tools.bcolors
46
47 BlenderEnvironment = tools.Blender.BlenderEnvironment
48 btools = tools.btools
49 B = tools.Blender
50
51 ### globals ###
52 platform = sys.platform
53 quickie = None
54 quickdebug = None
55 nsis_build = None
56
57 ##### BEGIN SETUP #####
58
59 B.possible_types = ['core', 'common', 'blender', 'intern',
60                     'international', 'game', 'game2',
61                     'player', 'player2', 'system']
62
63 B.binarykind = ['blender' , 'blenderplayer']
64 ##################################
65 # target and argument validation #
66 ##################################
67 # XX cheating for BF_FANCY, we check for BF_FANCY before args are validated
68 use_color = ARGUMENTS.get('BF_FANCY', '1')
69 if platform=='win32':
70     use_color = None
71
72 if not use_color=='1':
73     B.bc.disable()
74
75 # arguments
76 print B.bc.HEADER+'Command-line arguments'+B.bc.ENDC
77 B.arguments = btools.validate_arguments(ARGUMENTS, B.bc)
78 btools.print_arguments(B.arguments, B.bc)
79
80 # targets
81 print B.bc.HEADER+'Command-line targets'+B.bc.ENDC
82 B.targets = btools.validate_targets(COMMAND_LINE_TARGETS, B.bc)
83 btools.print_targets(B.targets, B.bc)
84
85 ##########################
86 # setting up environment #
87 ##########################
88
89 # handling cmd line arguments & config file
90
91 # first check cmdline for toolset and we create env to work on
92 quickie = B.arguments.get('BF_QUICK', None)
93 quickdebug = B.arguments.get('BF_QUICKDEBUG', None)
94
95 if quickdebug:
96     B.quickdebug=string.split(quickdebug, ',')
97 else:
98     B.quickdebug=[]
99
100 if quickie:
101     B.quickie=string.split(quickie,',')
102 else:
103     B.quickie=[]
104     
105 toolset = B.arguments.get('BF_TOOLSET', None)
106 if toolset:
107     print "Using " + toolset
108     if toolset=='mstoolkit':
109         env = BlenderEnvironment(ENV = os.environ)
110         env.Tool('mstoolkit', ['tools'])
111     else:
112         env = BlenderEnvironment(tools=[toolset], ENV = os.environ)
113 else:
114     env = BlenderEnvironment(ENV = os.environ)
115
116 if not env:
117     print "Could not create a build environment"
118     Exit()
119
120 env.SConscriptChdir(0)
121 cc = B.arguments.get('CC', None)
122 cxx = B.arguments.get('CXX', None)
123 if cc:
124     env['CC'] = cc
125 if cxx:
126     env['CXX'] = cxx
127
128 if env['CC'] in ['cl', 'cl.exe'] and sys.platform=='win32':
129     platform = 'win32-vc'
130 elif env['CC'] in ['gcc'] and sys.platform=='win32':
131     platform = 'win32-mingw'
132
133 # Fix me!
134 #if platform == 'win32-mingw':
135 if 0:
136     try:
137         import win32file
138         import win32event
139         import win32process
140         import win32security
141         import string
142
143         slash= re.compile(r"\\")
144
145         def myesc(b):
146             if b[0]!= "-":
147                 b = slash.sub(r"\\\\", b[1:-1])
148                 return "\"" + b + "\""
149             else:
150                 return b
151
152         def my_spawn(sh, escape, cmd, args, spawnenv):
153             for var in spawnenv:
154                 spawnenv[var] = spawnenv[var].encode('ascii', 'replace')
155
156             sAttrs = win32security.SECURITY_ATTRIBUTES()
157             StartupInfo = win32process.STARTUPINFO()
158             if cmd=='ar' and args[1]=='r':
159                 args[1] = '-r'
160             newargs = string.join(map(myesc, args[1:]), ' ')
161             cmdline = cmd + " " + newargs
162
163             # check for any special operating system commands
164             if cmd == 'del':
165                 for arg in args[1:]:
166                     win32file.DeleteFile(arg)
167                 exit_code = 0
168             else:
169                 # otherwise execute the command.
170                 hProcess, hThread, dwPid, dwTid = win32process.CreateProcess(None, cmdline, None, None, 1, 0, spawnenv, None, StartupInfo)
171                 win32event.WaitForSingleObject(hProcess, win32event.INFINITE)
172                 exit_code = win32process.GetExitCodeProcess(hProcess)
173                 win32file.CloseHandle(hProcess);
174                 win32file.CloseHandle(hThread);
175             return exit_code
176
177         env['SPAWN'] = my_spawn
178     except:
179         print "install win32all from http://sourceforge.net/project/showfiles.php?group_id=78018"
180
181 crossbuild = B.arguments.get('BF_CROSS', None)
182 if crossbuild and platform!='win32':
183     platform = 'linuxcross'
184
185 env['OURPLATFORM'] = platform
186
187 configfile = B.arguments.get('BF_CONFIG', 'config'+os.sep+platform+'-config.py')
188
189 if os.path.exists(configfile):
190     print B.bc.OKGREEN + "Using config file: " + B.bc.ENDC + configfile
191 else:
192     print B.bc.FAIL + configfile + " doesn't exist" + B.bc.ENDC
193
194 if crossbuild and env['PLATFORM'] != 'win32':
195     print B.bc.HEADER+"Preparing for crossbuild"+B.bc.ENDC
196     env.Tool('crossmingw', ['tools'])
197     # todo: determine proper libs/includes etc.
198     # Needed for gui programs, console programs should do without it
199     env.Append(LINKFLAGS=['-mwindows'])
200
201 # first read platform config. B.arguments will override
202 optfiles = [configfile]
203 if os.path.exists('user-config.py'):
204     print B.bc.OKGREEN + "Using config file: " + B.bc.ENDC + 'user-config.py'
205     optfiles += ['user-config.py']
206 else:
207     print B.bc.WARNING + 'user-config.py' + " not found, no user overrides" + B.bc.ENDC
208
209 opts = btools.read_opts(optfiles, B.arguments)
210 opts.Update(env)
211
212 # disable elbeem (fluidsim) compilation?
213 if env['BF_NO_ELBEEM'] == 1:
214     env['CPPFLAGS'].append('-DDISABLE_ELBEEM')
215     env['CXXFLAGS'].append('-DDISABLE_ELBEEM')
216     env['CCFLAGS'].append('-DDISABLE_ELBEEM')
217
218 #check for additional debug libnames
219
220 if env.has_key('BF_DEBUG_LIBS'):
221     B.quickdebug += env['BF_DEBUG_LIBS']
222
223 printdebug = B.arguments.get('BF_LISTDEBUG', 0)
224
225 # see if this linux distro has libalut
226
227 if env['OURPLATFORM'] == 'linux2' :
228     if env['WITH_BF_OPENAL']:
229         mylib_test_source_file = """
230         #include "AL/alut.h"
231         int main(int argc, char **argv)
232         {
233             alutGetMajorVersion();
234             return 0;
235         }
236         """
237
238         def CheckFreeAlut(context,env):
239             context.Message( B.bc.OKGREEN + "Linux platform detected:\n  checking for FreeAlut... " + B.bc.ENDC )
240             env['LIBS'] = 'alut'
241             result = context.TryLink(mylib_test_source_file, '.c')
242             context.Result(result)
243             return result
244
245         env2 = env.Copy( LIBPATH = env['BF_OPENAL'] ) 
246         conf = Configure( env2, {'CheckFreeAlut' : CheckFreeAlut}, '.sconf_temp', '/dev/null' )
247         if conf.CheckFreeAlut( env2 ):
248             env['BF_OPENAL_LIB'] += ' alut'
249         del env2
250         for root, dirs, files in os.walk('.sconf_temp', topdown=False):
251             for name in files:
252                 os.remove(os.path.join(root, name))
253             for name in dirs:
254                 os.rmdir(os.path.join(root, name))
255         os.rmdir(root)
256
257 if len(B.quickdebug) > 0 and printdebug != 0:
258     print B.bc.OKGREEN + "Buildings these libs with debug symbols:" + B.bc.ENDC
259     for l in B.quickdebug:
260         print "\t" + l
261
262 # check target for blenderplayer. Set WITH_BF_PLAYER if found on cmdline
263 if 'blenderplayer' in B.targets:
264     env['WITH_BF_PLAYER'] = True
265
266 if 'blendernogame' in B.targets:
267     env['WITH_BF_GAMEENGINE'] = False
268
269 # lastly we check for root_build_dir ( we should not do before, otherwise we might do wrong builddir
270 #B.root_build_dir = B.arguments.get('BF_BUILDDIR', '..'+os.sep+'build'+os.sep+platform+os.sep)
271 B.root_build_dir = env['BF_BUILDDIR']
272 env['BUILDDIR'] = B.root_build_dir
273 if not B.root_build_dir[-1]==os.sep:
274     B.root_build_dir += os.sep
275     
276 def NSIS_Installer():
277
278     if env['OURPLATFORM'] != 'win32-vc' and env['OURPLATFORM'] != 'win32-mingw':
279         print "NSIS installer is only available on Windows."
280         Exit()
281         
282     install_base_dir = os.getcwd() + "\\"
283
284     os.chdir("release")
285     v = open("VERSION")
286     version = v.read()[:-1]
287     shortver = version.split('.')[0] + version.split('.')[1]
288     v.close()
289
290     #### change to suit install dir ####
291     inst_dir = install_base_dir + env['BF_INSTALLDIR']
292
293     os.chdir("windows/installer")
294
295     ns = open("00.sconsblender.nsi","r")
296
297     ns_cnt = str(ns.read())
298     ns.close()
299
300     # do root
301     rootlist = []
302     rootdir = os.listdir(inst_dir+"\\")
303     for rootitem in rootdir:
304         if os.path.isdir(inst_dir+"\\"+ rootitem) == 0:
305             rootlist.append("File " + inst_dir + "\\" + rootitem)
306     rootstring = string.join(rootlist, "\n  ")
307     rootstring += "\n\n"
308     ns_cnt = string.replace(ns_cnt, "[ROOTDIRCONTS]", rootstring)
309
310     # do delete items
311     delrootlist = []
312     for rootitem in rootdir:
313         if os.path.isdir(inst_dir + rootitem) == 0:
314             delrootlist.append("Delete $INSTDIR\\" + rootitem)
315     delrootstring = string.join(delrootlist, "\n ")
316     delrootstring += "\n"
317     ns_cnt = string.replace(ns_cnt, "[DELROOTDIRCONTS]", delrootstring)
318
319     # do scripts
320     scriptlist = []
321     scriptpath = "%s%s" % (inst_dir, "\\.blender\\scripts")
322     scriptdir = os.listdir(scriptpath)
323     for scriptitem in scriptdir:
324         scriptfile = "%s\\%s" % (scriptpath, scriptitem)
325         if os.path.isdir(scriptfile) == 0:
326             scriptlist.append("File %s" % scriptfile)
327     scriptstring = string.join(scriptlist, "\n  ")
328     scriptstring += "\n\n"
329     ns_cnt = string.replace(ns_cnt, "[SCRIPTCONTS]", scriptstring)
330
331     # do scripts\bpymodules
332     bpymodlist = []
333     bpymodpath = "%s%s" % (inst_dir, "\\.blender\\scripts\\bpymodules")
334     bpymoddir = os.listdir(bpymodpath)
335
336     for bpymoditem in bpymoddir:
337         bpymodfile = "%s\\%s" % (bpymodpath, bpymoditem)
338         if os.path.isdir(bpymodfile) == 0:
339             bpymodlist.append("File %s" % bpymodfile)
340     bpymodstring = string.join(bpymodlist, "\n  ")
341     bpymodstring += "\n\n"
342     ns_cnt = string.replace(ns_cnt, "[SCRIPTMODCONTS]", bpymodstring)
343
344     # do scripts\bpymodules\colladaimex
345     colladalist = []
346     bpymodpath = "%s%s" % (inst_dir, "\\.blender\\scripts\\bpymodules\\ColladaImEx")
347     bpymoddir = os.listdir(bpymodpath)
348
349     for bpymoditem in bpymoddir:
350         bpymodfile = "%s\\%s" % (bpymodpath, bpymoditem)
351         if os.path.isdir(bpymodfile) == 0:
352             colladalist.append("File %s" % bpymodfile)
353     bpymodstring = string.join(colladalist, "\n  ")
354     bpymodstring += "\n\n"
355     ns_cnt = string.replace(ns_cnt, "[SCRIPTMODCOLLADACONT]", bpymodstring)
356
357     # do scripts\bpydata
358     bpydatalist = []
359     bpydatapath = "%s%s" % (inst_dir, "\\.blender\\scripts\\bpydata")
360     bpydatadir = os.listdir(bpydatapath)
361     for bpydataitem in bpydatadir:
362         bpydatafile = "%s\\%s" % (bpydatapath, bpydataitem)
363         if os.path.isdir(bpydatafile) == 0:
364             bpydatalist.append("File %s" % bpydatafile)
365     bpydatastring = string.join(bpydatalist, "\n  ")
366     bpydatastring += "\n\n"
367     ns_cnt = string.replace(ns_cnt, "[SCRIPTDATACONTS]", bpydatastring)
368
369     # do plugins\include
370     plugincludelist = []
371     plugincludepath = "%s%s" % (inst_dir, "\\plugins\\include")
372     plugincludedir = os.listdir(plugincludepath)
373     for plugincludeitem in plugincludedir:
374         plugincludefile = "%s\\%s" % (plugincludepath, plugincludeitem)
375         if os.path.isdir(plugincludefile) == 0:
376             if plugincludefile.find('.h') or plugincludefile.find('.DEF'):
377                 plugincludelist.append("File %s" % plugincludefile)
378     plugincludestring = string.join(plugincludelist, "\n  ")
379     plugincludestring += "\n\n"
380     ns_cnt = string.replace(ns_cnt, "[PLUGINCONTS]", plugincludestring)
381
382     # do scripts\bpydata\config
383     cfglist = []
384     cfgpath = "%s%s" % (inst_dir, "\\.blender\\scripts\\bpydata\\config")
385     cfgdir = os.listdir(cfgpath)
386     for cfgitem in cfgdir:
387         cfgfile = "%s\\%s" % (cfgpath, cfgitem)
388         if os.path.isdir(cfgfile) == 0:
389             cfglist.append("File %s" % cfgfile)
390     cfgstring = string.join(cfglist, "\n  ")
391     cfgstring += "\n\n"
392     ns_cnt = string.replace(ns_cnt, "[SCRIPTDATACFGCONTS]", cfgstring)
393
394     # do dotblender
395     dotblendlist = []
396     dotblenddir = os.listdir(inst_dir+"\\.blender")
397     for dotblenditem in dotblenddir:
398         if os.path.isdir(inst_dir + "\\.blender\\" + dotblenditem) == 0:
399             dotblendlist.append("File " + inst_dir + "\\.blender\\" + dotblenditem)
400     dotblendstring = string.join(dotblendlist, "\n  ")
401     dotblendstring += "\n\n"
402     ns_cnt = string.replace(ns_cnt, "[DOTBLENDERCONTS]", dotblendstring)
403
404     # do language files
405     langlist = []
406     langfiles = []
407     langdir = os.listdir(inst_dir + "\\.blender\\locale")
408     for langitem in langdir:
409         if os.path.isdir(inst_dir + "\\.blender\\locale\\" + langitem) == 1:
410             langfiles.append("SetOutPath $BLENDERHOME\\.blender\\locale\\" + langitem + "\\LC_MESSAGES")
411             langfiles.append("File " + inst_dir + "\\.blender\\locale\\" + langitem + "\\LC_MESSAGES\\blender.mo")
412     langstring = string.join(langfiles, "\n  ")
413     langstring += "\n\n"
414     ns_cnt = string.replace(ns_cnt, "[LANGUAGECONTS]", langstring)
415
416     # var replacements
417     ns_cnt = string.replace(ns_cnt, "DISTDIR", inst_dir+"\\")
418     ns_cnt = string.replace(ns_cnt, "SHORTVER", shortver)
419     ns_cnt = string.replace(ns_cnt, "VERSION", version)
420
421     new_nsis = open("00.blender_tmp.nsi", 'w')
422     new_nsis.write(ns_cnt)
423     new_nsis.close()
424
425     sys.stdout = os.popen("makensis 00.blender_tmp.nsi", 'w')
426     
427 nsis_build = None
428 if 'nsis' in B.targets:
429     NSIS_Installer()
430     Exit()
431
432 # We do a shortcut for clean when no quicklist is given: just delete
433 # builddir without reading in SConscripts
434 do_clean = None
435 if 'clean' in B.targets:
436     do_clean = True
437
438 if not quickie and do_clean:
439     print B.bc.HEADER+'Cleaning...'+B.bc.ENDC
440     dirs = os.listdir(B.root_build_dir)
441     for dir in dirs:
442         if os.path.isdir(B.root_build_dir + dir) == 1:
443             print "clean dir %s"%(B.root_build_dir+dir)
444             shutil.rmtree(B.root_build_dir+dir)
445     print B.bc.OKGREEN+'...done'+B.bc.ENDC
446     Exit()
447
448 if not os.path.isdir ( B.root_build_dir):
449     os.makedirs ( B.root_build_dir )
450     os.makedirs ( B.root_build_dir + 'source' )
451     os.makedirs ( B.root_build_dir + 'intern' )
452     os.makedirs ( B.root_build_dir + 'extern' )
453     os.makedirs ( B.root_build_dir + 'lib' )
454     os.makedirs ( B.root_build_dir + 'bin' )
455
456 Help(opts.GenerateHelpText(env))
457
458 # default is new quieter output, but if you need to see the 
459 # commands, do 'scons BF_QUIET=0'
460 bf_quietoutput = B.arguments.get('BF_QUIET', '1')
461 if bf_quietoutput=='1':
462     B.set_quiet_output(env)
463 else:
464     if toolset=='msvc':
465         B.msvc_hack(env)
466
467 print B.bc.HEADER+'Building in '+B.bc.ENDC+B.root_build_dir
468 env.SConsignFile(B.root_build_dir+'scons-signatures')
469 B.init_lib_dict()
470
471 ##### END SETUP ##########
472
473 Export('env')
474 #Export('root_build_dir') # this one is still needed for makesdna
475 ##TODO: improve makesdna usage
476
477 BuildDir(B.root_build_dir+'/intern', 'intern', duplicate=0)
478 SConscript(B.root_build_dir+'/intern/SConscript')
479 BuildDir(B.root_build_dir+'/extern', 'extern', duplicate=0)
480 SConscript(B.root_build_dir+'/extern/SConscript')
481 BuildDir(B.root_build_dir+'/source', 'source', duplicate=0)
482 SConscript(B.root_build_dir+'/source/SConscript')
483
484 # now that we have read all SConscripts, we know what
485 # libraries will be built. Create list of
486 # libraries to give as objects to linking phase
487 mainlist = []
488 for tp in B.possible_types:
489     if not tp == 'player' and not tp == 'player2':
490         mainlist += B.create_blender_liblist(env, tp)
491
492 if B.arguments.get('BF_PRIORITYLIST', '0')=='1':
493     B.propose_priorities()
494
495 dobj = B.buildinfo(env, "dynamic") + B.resources
496 thestatlibs, thelibincs = B.setup_staticlibs(env)
497 thesyslibs = B.setup_syslibs(env)
498
499 env.BlenderProg(B.root_build_dir, "blender", dobj + mainlist + thestatlibs, [], thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blender')
500 if env['WITH_BF_PLAYER']:
501     playerlist = B.create_blender_liblist(env, 'player')
502     env.BlenderProg(B.root_build_dir, "blenderplayer", dobj + playerlist + thestatlibs, [], thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blenderplayer')
503
504 ##### Now define some targets
505
506
507 #------------ INSTALL
508
509 #-- binaries
510 blenderinstall = []
511 if  env['OURPLATFORM']=='darwin':
512     for prg in B.program_list:
513         bundle = '%s.app' % prg[0]
514         bundledir = os.path.dirname(bundle)
515         for dp, dn, df in os.walk(bundle):
516             if 'CVS' in dn:
517                 dn.remove('CVS')
518             if '.svn' in dn:
519                 dn.remove('.svn')
520             dir=env['BF_INSTALLDIR']+dp[len(bundledir):]
521             source=[dp+os.sep+f for f in df]
522             blenderinstall.append(env.Install(dir=dir,source=source))
523 else:
524     blenderinstall = env.Install(dir=env['BF_INSTALLDIR'], source=B.program_list)
525
526 #-- .blender
527 dotblendlist = []
528 dottargetlist = []
529 for dp, dn, df in os.walk('bin/.blender'):
530     if 'CVS' in dn:
531         dn.remove('CVS')
532     if '.svn' in dn:
533         dn.remove('.svn')
534     for f in df:
535         dotblendlist.append(dp+os.sep+f)
536         dottargetlist.append(env['BF_INSTALLDIR']+dp[3:]+os.sep+f)
537
538 dotblenderinstall = []
539 for targetdir,srcfile in zip(dottargetlist, dotblendlist):
540     td, tf = os.path.split(targetdir)
541     dotblenderinstall.append(env.Install(dir=td, source=srcfile))
542
543 #-- .blender/scripts
544 scriptinstall = []
545 scriptpath='release/scripts'
546 for dp, dn, df in os.walk(scriptpath):
547     if 'CVS' in dn:
548         dn.remove('CVS')
549     if '.svn' in dn:
550         dn.remove('.svn')
551     dir=env['BF_INSTALLDIR']+'/.blender/scripts'+dp[len(scriptpath):]
552     source=[dp+os.sep+f for f in df]
553     scriptinstall.append(env.Install(dir=dir,source=source))
554
555 #-- plugins
556 pluglist = []
557 plugtargetlist = []
558 for tp, tn, tf in os.walk('release/plugins'):
559     if 'CVS' in tn:
560         tn.remove('CVS')
561     if '.svn' in dn:
562         dn.remove('.svn')
563     for f in tf:
564         pluglist.append(tp+os.sep+f)
565         plugtargetlist.append(env['BF_INSTALLDIR']+tp[7:]+os.sep+f)
566
567 plugininstall = []
568 for targetdir,srcfile in zip(plugtargetlist, pluglist):
569     td, tf = os.path.split(targetdir)
570     plugininstall.append(env.Install(dir=td, source=srcfile))
571
572 textlist = []
573 texttargetlist = []
574 for tp, tn, tf in os.walk('release/text'):
575     if 'CVS' in tn:
576         tn.remove('CVS')
577     if '.svn' in tn:
578         tn.remove('.svn')
579     for f in tf:
580         textlist.append(tp+os.sep+f)
581
582 textinstall = env.Install(dir=env['BF_INSTALLDIR'], source=textlist)
583
584 allinstall = [blenderinstall, dotblenderinstall, scriptinstall, plugininstall, textinstall]
585
586 if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw'):
587     dllsources = ['${LCGDIR}/gettext/lib/gnu_gettext.dll',
588                         '${LCGDIR}/png/lib/libpng.dll',
589 #                        '#release/windows/extra/python24.zip',
590 #                        '#release/windows/extra/zlib.pyd',
591                         '${LCGDIR}/sdl/lib/SDL.dll',
592                         '${LCGDIR}/zlib/lib/zlib.dll',
593                         '${LCGDIR}/tiff/lib/libtiff.dll']
594     if env['BF_DEBUG']:
595         dllsources.append('${LCGDIR}/python/lib/${BF_PYTHON_LIB}.dll')
596     else:
597         dllsources.append('${LCGDIR}/python/lib/${BF_PYTHON_LIB}.dll')
598     if env['OURPLATFORM'] == 'win32-mingw':
599         dllsources += ['${LCGDIR}/pthreads/lib/pthreadGC2.dll']
600     else:
601         dllsources += ['${LCGDIR}/pthreads/lib/pthreadVC2.dll']
602     if env['WITH_BF_ICONV']:
603         dllsources += ['${LCGDIR}/iconv/lib/iconv.dll']
604     if env['WITH_BF_FFMPEG']:
605         dllsources += ['${LCGDIR}/ffmpeg/lib/avcodec-51.dll',
606                         '${LCGDIR}/ffmpeg/lib/avformat-51.dll',
607                         '${LCGDIR}/ffmpeg/lib/avutil-49.dll']
608     windlls = env.Install(dir=env['BF_INSTALLDIR'], source = dllsources)
609     allinstall += windlls
610
611 installtarget = env.Alias('install', allinstall)
612 bininstalltarget = env.Alias('install-bin', blenderinstall)
613
614 if env['WITH_BF_PLAYER']:
615     blenderplayer = env.Alias('blenderplayer', B.program_list)
616     Depends(blenderplayer,installtarget)
617
618 if not env['WITH_BF_GAMEENGINE']:
619     blendernogame = env.Alias('blendernogame', B.program_list)
620     Depends(blendernogame,installtarget)
621
622 Default(B.program_list)
623 Default(installtarget)
624
625 #------------ RELEASE
626 # TODO: zipup the installation
627
628 #------------ BLENDERPLAYER
629 # TODO: build stubs and link into blenderplayer
630
631 #------------ EPYDOC
632 # TODO: run epydoc
633