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