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