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