let command line args override the 'blenderlite' target
[blender.git] / SConstruct
1 #!/usr/bin/env python
2 # $Id$
3 # ***** BEGIN GPL 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.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software Foundation,
17 # Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18 #
19 # The Original Code is Copyright (C) 2006, Blender Foundation
20 # All rights reserved.
21 #
22 # The Original Code is: all of this file.
23 #
24 # Contributor(s): Nathan Letwory.
25 #
26 # ***** END GPL LICENSE BLOCK *****
27 #
28 # Main entry-point for the SCons building system
29 # Set up some custom actions and target/argument handling
30 # Then read all SConscripts and build
31
32 import sys
33 import os
34 import os.path
35 import string
36 import shutil
37 import glob
38 import re
39 from tempfile import mkdtemp
40
41 import tools.Blender
42 import tools.btools
43 import tools.bcolors
44
45 EnsureSConsVersion(1,0,0)
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                 # xxx commented out, as was supressing warnings under mingw..
119                 #if env:
120                 #       btools.SetupSpawn(env)
121 else:
122         env = BlenderEnvironment(ENV = os.environ)
123
124 if not env:
125         print "Could not create a build environment"
126         Exit()
127
128
129 cc = B.arguments.get('CC', None)
130 cxx = B.arguments.get('CXX', None)
131 if cc:
132         env['CC'] = cc
133 if cxx:
134         env['CXX'] = cxx
135
136 if env['CC'] in ['cl', 'cl.exe'] and sys.platform=='win32':
137         platform = 'win32-vc'
138 elif env['CC'] in ['gcc'] and sys.platform=='win32':
139         platform = 'win32-mingw'
140
141 env.SConscriptChdir(0)
142
143 crossbuild = B.arguments.get('BF_CROSS', None)
144 if crossbuild and platform!='win32':
145         platform = 'linuxcross'
146
147 env['OURPLATFORM'] = platform
148
149 configfile = 'config'+os.sep+platform+'-config.py'
150
151 if os.path.exists(configfile):
152         print B.bc.OKGREEN + "Using config file: " + B.bc.ENDC + configfile
153 else:
154         print B.bc.FAIL + configfile + " doesn't exist" + B.bc.ENDC
155
156 if crossbuild and env['PLATFORM'] != 'win32':
157         print B.bc.HEADER+"Preparing for crossbuild"+B.bc.ENDC
158         env.Tool('crossmingw', ['tools'])
159         # todo: determine proper libs/includes etc.
160         # Needed for gui programs, console programs should do without it
161         env.Append(LINKFLAGS=['-mwindows'])
162
163 userconfig = B.arguments.get('BF_CONFIG', 'user-config.py')
164 # first read platform config. B.arguments will override
165 optfiles = [configfile]
166 if os.path.exists(userconfig):
167         print B.bc.OKGREEN + "Using user-config file: " + B.bc.ENDC + userconfig
168         optfiles += [userconfig]
169 else:
170         print B.bc.WARNING + userconfig + " not found, no user overrides" + B.bc.ENDC
171
172 opts = btools.read_opts(optfiles, B.arguments)
173 opts.Update(env)
174
175 if not env['BF_FANCY']:
176         B.bc.disable()
177
178 SetOption('num_jobs', int(env['BF_NUMJOBS']))
179 print "Build with %d parallel jobs" % (GetOption('num_jobs'))
180
181 # disable elbeem (fluidsim) compilation?
182 if env['BF_NO_ELBEEM'] == 1:
183         env['CPPFLAGS'].append('-DDISABLE_ELBEEM')
184         env['CXXFLAGS'].append('-DDISABLE_ELBEEM')
185         env['CCFLAGS'].append('-DDISABLE_ELBEEM')
186
187 if env['WITH_BF_OPENMP'] == 1:
188                 if env['OURPLATFORM']=='win32-vc':
189                                 env['CCFLAGS'].append('/openmp')
190                                 env['CPPFLAGS'].append('/openmp')
191                                 env['CXXFLAGS'].append('/openmp')
192                 else:
193                         if env['CC'][-3:] == 'icc': # to be able to handle CC=/opt/bla/icc case
194                                 env.Append(LINKFLAGS=['-openmp', '-static-intel'])
195                                 env['CCFLAGS'].append('-openmp')
196                                 env['CPPFLAGS'].append('-openmp')
197                                 env['CXXFLAGS'].append('-openmp')
198                         else:
199                                 env.Append(CCFLAGS=['-fopenmp']) 
200                                 env.Append(CPPFLAGS=['-fopenmp'])
201                                 env.Append(CXXFLAGS=['-fopenmp'])
202                                 # env.Append(LINKFLAGS=['-fprofile-generate'])
203
204 #check for additional debug libnames
205
206 if env.has_key('BF_DEBUG_LIBS'):
207         B.quickdebug += env['BF_DEBUG_LIBS']
208
209 printdebug = B.arguments.get('BF_LISTDEBUG', 0)
210
211 # see if this linux distro has libalut
212
213 if env['OURPLATFORM'] == 'linux2' :
214         if env['WITH_BF_OPENAL']:
215                 mylib_test_source_file = """
216                 #include "AL/alut.h"
217                 int main(int argc, char **argv)
218                 {
219                         alutGetMajorVersion();
220                         return 0;
221                 }
222                 """
223
224                 def CheckFreeAlut(context,env):
225                         context.Message( B.bc.OKGREEN + "Linux platform detected:\n  checking for FreeAlut... " + B.bc.ENDC )
226                         env['LIBS'] = 'alut'
227                         result = context.TryLink(mylib_test_source_file, '.c')
228                         context.Result(result)
229                         return result
230
231                 env2 = env.Clone( LIBPATH = env['BF_OPENAL'] ) 
232                 sconf_temp = mkdtemp()
233                 conf = Configure( env2, {'CheckFreeAlut' : CheckFreeAlut}, sconf_temp, '/dev/null' )
234                 if conf.CheckFreeAlut( env2 ):
235                         env['BF_OPENAL_LIB'] += ' alut'
236                 del env2
237                 root = ''
238                 for root, dirs, files in os.walk(sconf_temp, topdown=False):
239                         for name in files:
240                                 os.remove(os.path.join(root, name))
241                         for name in dirs:
242                                 os.rmdir(os.path.join(root, name))
243                 if root: os.rmdir(root)
244
245 if len(B.quickdebug) > 0 and printdebug != 0:
246         print B.bc.OKGREEN + "Buildings these libs with debug symbols:" + B.bc.ENDC
247         for l in B.quickdebug:
248                 print "\t" + l
249
250 # remove stdc++ from LLIBS if we are building a statc linked CXXFLAGS
251 if env['WITH_BF_STATICCXX']:
252         if 'stdc++' in env['LLIBS']:
253                 env['LLIBS'].remove('stdc++')
254         else:
255                 print '\tcould not remove stdc++ library from LLIBS, WITH_BF_STATICCXX may not work for your platform'
256
257 # check target for blenderplayer. Set WITH_BF_PLAYER if found on cmdline
258 if 'blenderplayer' in B.targets:
259         env['WITH_BF_PLAYER'] = True
260
261 if 'blendernogame' in B.targets:
262         env['WITH_BF_GAMEENGINE'] = False
263
264 if 'blenderlite' in B.targets:
265         target_env_defs = {}
266         target_env_defs['WITH_BF_GAMEENGINE'] = False
267         target_env_defs['WITH_BF_OPENAL'] = False
268         target_env_defs['WITH_BF_OPENEXR'] = False
269         target_env_defs['WITH_BF_ICONV'] = False
270         target_env_defs['WITH_BF_INTERNATIONAL'] = False
271         target_env_defs['WITH_BF_OPENJPEG'] = False
272         target_env_defs['WITH_BF_FFMPEG'] = False
273         target_env_defs['WITH_BF_QUICKTIME'] = False
274         target_env_defs['WITH_BF_YAFRAY'] = False
275         target_env_defs['WITH_BF_REDCODE'] = False
276         target_env_defs['WITH_BF_FTGL'] = False
277         target_env_defs['WITH_BF_DDS'] = False
278         target_env_defs['WITH_BF_ZLIB'] = False
279         target_env_defs['WITH_BF_SDL'] = False
280         target_env_defs['WITH_BF_JPEG'] = False
281         target_env_defs['WITH_BF_PNG'] = False
282         target_env_defs['WITH_BF_ODE'] = False
283         target_env_defs['WITH_BF_BULLET'] = False
284         target_env_defs['WITH_BF_SOLID'] = False
285         target_env_defs['WITH_BF_BINRELOC'] = False
286         target_env_defs['BF_BUILDINFO'] = False
287         target_env_defs['BF_NO_ELBEEM'] = True
288         target_env_defs['WITH_BF_PYTHON'] = False
289         
290         # Merge blenderlite, let command line to override
291         for k,v in target_env_defs.iteritems():
292                 if k not in B.arguments:
293                         env[k] = v
294
295 # lastly we check for root_build_dir ( we should not do before, otherwise we might do wrong builddir
296 #B.root_build_dir = B.arguments.get('BF_BUILDDIR', '..'+os.sep+'build'+os.sep+platform+os.sep)
297 B.root_build_dir = env['BF_BUILDDIR']
298 B.doc_build_dir = env['BF_DOCDIR']
299 if not B.root_build_dir[-1]==os.sep:
300         B.root_build_dir += os.sep
301 if not B.doc_build_dir[-1]==os.sep:
302         B.doc_build_dir += os.sep
303         
304 # We do a shortcut for clean when no quicklist is given: just delete
305 # builddir without reading in SConscripts
306 do_clean = None
307 if 'clean' in B.targets:
308         do_clean = True
309
310 if not quickie and do_clean:
311         if os.path.exists(B.doc_build_dir):
312                 print B.bc.HEADER+'Cleaning doc dir...'+B.bc.ENDC
313                 dirs = os.listdir(B.doc_build_dir)
314                 for entry in dirs:
315                         if os.path.isdir(B.doc_build_dir + entry) == 1:
316                                 print "clean dir %s"%(B.doc_build_dir+entry)
317                                 shutil.rmtree(B.doc_build_dir+entry)
318                         else: # remove file
319                                 print "remove file %s"%(B.doc_build_dir+entry)
320                                 os.remove(B.root_build_dir+entry)
321         if os.path.exists(B.root_build_dir):
322                 print B.bc.HEADER+'Cleaning build dir...'+B.bc.ENDC
323                 dirs = os.listdir(B.root_build_dir)
324                 for entry in dirs:
325                         if os.path.isdir(B.root_build_dir + entry) == 1:
326                                 print "clean dir %s"%(B.root_build_dir+entry)
327                                 shutil.rmtree(B.root_build_dir+entry)
328                         else: # remove file
329                                 print "remove file %s"%(B.root_build_dir+entry)
330                                 os.remove(B.root_build_dir+entry)
331                 for confile in ['extern/ffmpeg/config.mak', 'extern/x264/config.mak',
332                                 'extern/xvidcore/build/generic/platform.inc', 'extern/ffmpeg/include']:
333                         if os.path.exists(confile):
334                                 print "clean file %s"%confile
335                                 if os.path.isdir(confile):
336                                         for root, dirs, files in os.walk(confile):
337                                                 for name in files:
338                                                         os.remove(os.path.join(root, name))
339                                 else:
340                                         os.remove(confile)
341                 print B.bc.OKGREEN+'...done'+B.bc.ENDC
342         else:
343                 print B.bc.HEADER+'Already Clean, nothing to do.'+B.bc.ENDC
344         Exit()
345
346 if not os.path.isdir ( B.root_build_dir):
347         os.makedirs ( B.root_build_dir )
348         os.makedirs ( B.root_build_dir + 'source' )
349         os.makedirs ( B.root_build_dir + 'intern' )
350         os.makedirs ( B.root_build_dir + 'extern' )
351         os.makedirs ( B.root_build_dir + 'lib' )
352         os.makedirs ( B.root_build_dir + 'bin' )
353 if not os.path.isdir(B.doc_build_dir):
354         os.makedirs ( B.doc_build_dir )
355
356 Help(opts.GenerateHelpText(env))
357
358 # default is new quieter output, but if you need to see the 
359 # commands, do 'scons BF_QUIET=0'
360 bf_quietoutput = B.arguments.get('BF_QUIET', '1')
361 if env['BF_QUIET']:
362         B.set_quiet_output(env)
363 else:
364         if toolset=='msvc':
365                 B.msvc_hack(env)
366
367 print B.bc.HEADER+'Building in '+B.bc.ENDC+B.root_build_dir
368 env.SConsignFile(B.root_build_dir+'scons-signatures')
369 B.init_lib_dict()
370
371 ##### END SETUP ##########
372
373 Export('env')
374
375 BuildDir(B.root_build_dir+'/intern', 'intern', duplicate=0)
376 SConscript(B.root_build_dir+'/intern/SConscript')
377 BuildDir(B.root_build_dir+'/extern', 'extern', duplicate=0)
378 SConscript(B.root_build_dir+'/extern/SConscript')
379 BuildDir(B.root_build_dir+'/source', 'source', duplicate=0)
380 SConscript(B.root_build_dir+'/source/SConscript')
381
382 # now that we have read all SConscripts, we know what
383 # libraries will be built. Create list of
384 # libraries to give as objects to linking phase
385 mainlist = []
386 for tp in B.possible_types:
387         if not tp == 'player' and not tp == 'player2':
388                 mainlist += B.create_blender_liblist(env, tp)
389
390 if B.arguments.get('BF_PRIORITYLIST', '0')=='1':
391         B.propose_priorities()
392
393 dobj = B.buildinfo(env, "dynamic") + B.resources
394 thestatlibs, thelibincs = B.setup_staticlibs(env)
395 thesyslibs = B.setup_syslibs(env)
396
397 if 'blender' in B.targets or not env['WITH_BF_NOBLENDER']:
398         env.BlenderProg(B.root_build_dir, "blender", dobj + mainlist + thestatlibs, [], thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blender')
399 if env['WITH_BF_PLAYER']:
400         playerlist = B.create_blender_liblist(env, 'player')
401         env.BlenderProg(B.root_build_dir, "blenderplayer", dobj + playerlist + thestatlibs, [], thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blenderplayer')
402
403 ##### Now define some targets
404
405
406 #------------ INSTALL
407
408 #-- binaries
409 blenderinstall = []
410 if  env['OURPLATFORM']=='darwin':
411         for prg in B.program_list:
412                 bundle = '%s.app' % prg[0]
413                 bundledir = os.path.dirname(bundle)
414                 for dp, dn, df in os.walk(bundle):
415                         if 'CVS' in dn:
416                                 dn.remove('CVS')
417                         if '.svn' in dn:
418                                 dn.remove('.svn')
419                         dir=env['BF_INSTALLDIR']+dp[len(bundledir):]
420                         source=[dp+os.sep+f for f in df]
421                         blenderinstall.append(env.Install(dir=dir,source=source))
422 else:
423         blenderinstall = env.Install(dir=env['BF_INSTALLDIR'], source=B.program_list)
424
425 #-- .blender
426 #- dont do .blender and scripts for darwin, it is already in the bundle
427 dotblendlist = []
428 dottargetlist = []
429 scriptinstall = []
430
431 if  env['OURPLATFORM']!='darwin':
432                 for dp, dn, df in os.walk('bin/.blender'):
433                         if 'CVS' in dn:
434                                 dn.remove('CVS')
435                         if '.svn' in dn:
436                                 dn.remove('.svn')
437                         
438                         for f in df:
439                                 if not env['WITH_BF_INTERNATIONAL']:
440                                         if 'locale' in dp:
441                                                 continue
442                                         if f == '.Blanguages':
443                                                 continue
444                                 if not env['WITH_BF_FREETYPE']:
445                                         if f.endswith('.ttf'):
446                                                 continue
447                                 
448                                 dotblendlist.append(os.path.join(dp, f))
449                                 dottargetlist.append(env['BF_INSTALLDIR']+dp[3:]+os.sep+f)
450
451                 dotblenderinstall = []
452                 for targetdir,srcfile in zip(dottargetlist, dotblendlist):
453                         td, tf = os.path.split(targetdir)
454                         dotblenderinstall.append(env.Install(dir=td, source=srcfile))
455                 
456                 if env['WITH_BF_PYTHON']:
457                         #-- .blender/scripts    
458                         scriptpath='release/scripts'
459                         for dp, dn, df in os.walk(scriptpath):
460                                 if 'CVS' in dn:
461                                         dn.remove('CVS')
462                                 if '.svn' in dn:
463                                         dn.remove('.svn')
464                                 dir=env['BF_INSTALLDIR']+'/.blender/scripts'+dp[len(scriptpath):]
465                                 source=[dp+os.sep+f for f in df]
466                                 scriptinstall.append(env.Install(dir=dir,source=source))
467
468 #-- icons
469 if env['OURPLATFORM']=='linux2':
470         iconlist = []
471         icontargetlist = []
472
473         for tp, tn, tf in os.walk('release/freedesktop/icons'):
474                 if 'CVS' in tn:
475                         tn.remove('CVS')
476                 if '.svn' in tn:
477                         tn.remove('.svn')
478                 for f in tf:
479                         print ">>>", env['BF_INSTALLDIR'], tp, f
480                         iconlist.append(tp+os.sep+f)
481                         icontargetlist.append(env['BF_INSTALLDIR']+tp[19:]+os.sep+f)
482
483         iconinstall = []
484         for targetdir,srcfile in zip(icontargetlist, iconlist):
485                 td, tf = os.path.split(targetdir)
486                 iconinstall.append(env.Install(dir=td, source=srcfile))
487
488 # dlls for linuxcross
489 # TODO - add more libs, for now this lets blenderlite run
490 if env['OURPLATFORM']=='linuxcross':
491         dir=env['BF_INSTALLDIR']
492         source = ['../lib/windows/pthreads/lib/pthreadGC2.dll']
493         scriptinstall.append(env.Install(dir=dir, source=source))
494
495 #-- plugins
496 pluglist = []
497 plugtargetlist = []
498 for tp, tn, tf in os.walk('release/plugins'):
499         if 'CVS' in tn:
500                 tn.remove('CVS')
501         if '.svn' in tn:
502                 tn.remove('.svn')
503         for f in tf:
504                 print ">>>", env['BF_INSTALLDIR'], tp, f
505                 pluglist.append(tp+os.sep+f)
506                 plugtargetlist.append(env['BF_INSTALLDIR']+tp[7:]+os.sep+f)
507
508 # header files for plugins
509 pluglist.append('source/blender/blenpluginapi/documentation.h')
510 plugtargetlist.append(env['BF_INSTALLDIR'] + os.sep + 'plugins' + os.sep + 'include' + os.sep +'documentation.h')
511 pluglist.append('source/blender/blenpluginapi/externdef.h')
512 plugtargetlist.append(env['BF_INSTALLDIR'] + os.sep + 'plugins' + os.sep + 'include' + os.sep +'externdef.h')
513 pluglist.append('source/blender/blenpluginapi/floatpatch.h')
514 plugtargetlist.append(env['BF_INSTALLDIR'] + os.sep + 'plugins' + os.sep + 'include' + os.sep +'floatpatch.h')
515 pluglist.append('source/blender/blenpluginapi/iff.h')
516 plugtargetlist.append(env['BF_INSTALLDIR'] + os.sep + 'plugins' + os.sep + 'include' + os.sep +'iff.h')
517 pluglist.append('source/blender/blenpluginapi/plugin.h')
518 plugtargetlist.append(env['BF_INSTALLDIR'] + os.sep + 'plugins' + os.sep + 'include' + os.sep +'plugin.h')
519 pluglist.append('source/blender/blenpluginapi/util.h')
520 plugtargetlist.append(env['BF_INSTALLDIR'] + os.sep + 'plugins' + os.sep + 'include' + os.sep +'util.h')
521 pluglist.append('source/blender/blenpluginapi/plugin.DEF')
522 plugtargetlist.append(env['BF_INSTALLDIR'] + os.sep + 'plugins' + os.sep + 'include' + os.sep + 'plugin.def')
523
524 plugininstall = []
525 for targetdir,srcfile in zip(plugtargetlist, pluglist):
526         td, tf = os.path.split(targetdir)
527         plugininstall.append(env.Install(dir=td, source=srcfile))
528
529 textlist = []
530 texttargetlist = []
531 for tp, tn, tf in os.walk('release/text'):
532         if 'CVS' in tn:
533                 tn.remove('CVS')
534         if '.svn' in tn:
535                 tn.remove('.svn')
536         for f in tf:
537                 textlist.append(tp+os.sep+f)
538
539 textinstall = env.Install(dir=env['BF_INSTALLDIR'], source=textlist)
540
541 if  env['OURPLATFORM']=='darwin':
542                 allinstall = [blenderinstall, plugininstall, textinstall]
543 elif env['OURPLATFORM']=='linux2':
544                 allinstall = [blenderinstall, dotblenderinstall, scriptinstall, plugininstall, textinstall, iconinstall]
545 else:
546                 allinstall = [blenderinstall, dotblenderinstall, scriptinstall, plugininstall, textinstall]
547
548 if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw'):
549         dllsources = ['${LCGDIR}/gettext/lib/gnu_gettext.dll',
550                                                 '${BF_PNG_LIBPATH}/libpng.dll',
551                                                 '${BF_ZLIB_LIBPATH}/zlib.dll',
552                                                 '${BF_TIFF_LIBPATH}/${BF_TIFF_LIB}.dll']
553         dllsources += ['${BF_PTHREADS_LIBPATH}/${BF_PTHREADS_LIB}.dll']
554         if env['WITH_BF_SDL']:
555                 dllsources.append('${BF_SDL_LIBPATH}/SDL.dll')
556         if env['WITH_BF_PYTHON']:
557                 dllsources.append('#release/windows/extra/python25.zip')
558                 dllsources.append('#release/windows/extra/zlib.pyd')
559                 if env['BF_DEBUG']:
560                         dllsources.append('${BF_PYTHON_LIBPATH}/${BF_PYTHON_LIB}_d.dll')
561                 else:
562                         dllsources.append('${BF_PYTHON_LIBPATH}/${BF_PYTHON_LIB}.dll')
563         if env['WITH_BF_ICONV']:
564                 dllsources += ['${BF_ICONV_LIBPATH}/iconv.dll']
565         if env['WITH_BF_FFMPEG']:
566                 dllsources += ['${LCGDIR}/ffmpeg/lib/avcodec-52.dll',
567                                                 '${LCGDIR}/ffmpeg/lib/avformat-52.dll',
568                                                 '${LCGDIR}/ffmpeg/lib/avdevice-52.dll',
569                                                 '${LCGDIR}/ffmpeg/lib/avutil-50.dll',
570                                                 '${LCGDIR}/ffmpeg/lib/libfaad-2.dll',
571                                                 '${LCGDIR}/ffmpeg/lib/libfaac-0.dll',
572                                                 '${LCGDIR}/ffmpeg/lib/libmp3lame-0.dll',
573                                                 '${LCGDIR}/ffmpeg/lib/libx264-67.dll',
574                                                 '${LCGDIR}/ffmpeg/lib/xvidcore.dll',
575                                                 '${LCGDIR}/ffmpeg/lib/swscale-0.dll']
576         windlls = env.Install(dir=env['BF_INSTALLDIR'], source = dllsources)
577         allinstall += windlls
578
579 installtarget = env.Alias('install', allinstall)
580 bininstalltarget = env.Alias('install-bin', blenderinstall)
581
582 nsisaction = env.Action(btools.NSIS_Installer, btools.NSIS_print)
583 nsiscmd = env.Command('nsisinstaller', None, nsisaction)
584 nsisalias = env.Alias('nsis', nsiscmd)
585
586 if 'blender' in B.targets:
587         blenderexe= env.Alias('blender', B.program_list)
588         Depends(blenderexe,installtarget)
589
590 if env['WITH_BF_PLAYER']:
591         blenderplayer = env.Alias('blenderplayer', B.program_list)
592         Depends(blenderplayer,installtarget)
593
594 if not env['WITH_BF_GAMEENGINE']:
595         blendernogame = env.Alias('blendernogame', B.program_list)
596         Depends(blendernogame,installtarget)
597
598 if 'blenderlite' in B.targets:
599         blenderlite = env.Alias('blenderlite', B.program_list)
600         Depends(blenderlite,installtarget)
601
602 Depends(nsiscmd, allinstall)
603
604 Default(B.program_list)
605
606 if not env['WITHOUT_BF_INSTALL']:
607                 Default(installtarget)
608
609 #------------ RELEASE
610 # TODO: zipup the installation
611
612 #------------ BLENDERPLAYER
613 # TODO: build stubs and link into blenderplayer
614
615 #------------ EPYDOC
616 if env['WITH_BF_DOCS']:
617         SConscript('source/blender/python/api2_2x/doc/SConscript')
618         SConscript('source/gameengine/PyDoc/SConscript')
619