merging trunk 17520:19093
[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         env['WITH_BF_GAMEENGINE'] = False
266         env['WITH_BF_OPENAL'] = False
267         env['WITH_BF_OPENEXR'] = False
268         env['WITH_BF_ICONV'] = False
269         env['WITH_BF_INTERNATIONAL'] = False
270         env['WITH_BF_OPENJPEG'] = False
271         env['WITH_BF_FFMPEG'] = False
272         env['WITH_BF_QUICKTIME'] = False
273         env['WITH_BF_YAFRAY'] = False
274         env['WITH_BF_REDCODE'] = False
275         env['WITH_BF_FTGL'] = False
276         env['WITH_BF_DDS'] = False
277         env['WITH_BF_ZLIB'] = False
278         env['WITH_BF_SDL'] = False
279         env['WITH_BF_JPEG'] = False
280         env['WITH_BF_PNG'] = False
281         env['WITH_BF_ODE'] = False
282         env['WITH_BF_BULLET'] = False
283         env['WITH_BF_BINRELOC'] = False
284         env['BF_BUILDINFO'] = False
285         env['BF_NO_ELBEEM'] = True
286         env['WITH_BF_PYTHON'] = False
287
288 # lastly we check for root_build_dir ( we should not do before, otherwise we might do wrong builddir
289 #B.root_build_dir = B.arguments.get('BF_BUILDDIR', '..'+os.sep+'build'+os.sep+platform+os.sep)
290 B.root_build_dir = env['BF_BUILDDIR']
291 B.doc_build_dir = env['BF_DOCDIR']
292 if not B.root_build_dir[-1]==os.sep:
293         B.root_build_dir += os.sep
294 if not B.doc_build_dir[-1]==os.sep:
295         B.doc_build_dir += os.sep
296         
297 # We do a shortcut for clean when no quicklist is given: just delete
298 # builddir without reading in SConscripts
299 do_clean = None
300 if 'clean' in B.targets:
301         do_clean = True
302
303 if not quickie and do_clean:
304         if os.path.exists(B.doc_build_dir):
305                 print B.bc.HEADER+'Cleaning doc dir...'+B.bc.ENDC
306                 dirs = os.listdir(B.doc_build_dir)
307                 for entry in dirs:
308                         if os.path.isdir(B.doc_build_dir + entry) == 1:
309                                 print "clean dir %s"%(B.doc_build_dir+entry)
310                                 shutil.rmtree(B.doc_build_dir+entry)
311                         else: # remove file
312                                 print "remove file %s"%(B.doc_build_dir+entry)
313                                 os.remove(B.root_build_dir+entry)
314         if os.path.exists(B.root_build_dir):
315                 print B.bc.HEADER+'Cleaning build dir...'+B.bc.ENDC
316                 dirs = os.listdir(B.root_build_dir)
317                 for entry in dirs:
318                         if os.path.isdir(B.root_build_dir + entry) == 1:
319                                 print "clean dir %s"%(B.root_build_dir+entry)
320                                 shutil.rmtree(B.root_build_dir+entry)
321                         else: # remove file
322                                 print "remove file %s"%(B.root_build_dir+entry)
323                                 os.remove(B.root_build_dir+entry)
324                 for confile in ['extern/ffmpeg/config.mak', 'extern/x264/config.mak',
325                                 'extern/xvidcore/build/generic/platform.inc', 'extern/ffmpeg/include']:
326                         if os.path.exists(confile):
327                                 print "clean file %s"%confile
328                                 if os.path.isdir(confile):
329                                         for root, dirs, files in os.walk(confile):
330                                                 for name in files:
331                                                         os.remove(os.path.join(root, name))
332                                 else:
333                                         os.remove(confile)
334                 print B.bc.OKGREEN+'...done'+B.bc.ENDC
335         else:
336                 print B.bc.HEADER+'Already Clean, nothing to do.'+B.bc.ENDC
337         Exit()
338
339 if not os.path.isdir ( B.root_build_dir):
340         os.makedirs ( B.root_build_dir )
341         os.makedirs ( B.root_build_dir + 'source' )
342         os.makedirs ( B.root_build_dir + 'intern' )
343         os.makedirs ( B.root_build_dir + 'extern' )
344         os.makedirs ( B.root_build_dir + 'lib' )
345         os.makedirs ( B.root_build_dir + 'bin' )
346 if not os.path.isdir(B.doc_build_dir):
347         os.makedirs ( B.doc_build_dir )
348
349 Help(opts.GenerateHelpText(env))
350
351 # default is new quieter output, but if you need to see the 
352 # commands, do 'scons BF_QUIET=0'
353 bf_quietoutput = B.arguments.get('BF_QUIET', '1')
354 if env['BF_QUIET']:
355         B.set_quiet_output(env)
356 else:
357         if toolset=='msvc':
358                 B.msvc_hack(env)
359
360 print B.bc.HEADER+'Building in '+B.bc.ENDC+B.root_build_dir
361 env.SConsignFile(B.root_build_dir+'scons-signatures')
362 B.init_lib_dict()
363
364 ##### END SETUP ##########
365
366 Export('env')
367
368 BuildDir(B.root_build_dir+'/intern', 'intern', duplicate=0)
369 SConscript(B.root_build_dir+'/intern/SConscript')
370 BuildDir(B.root_build_dir+'/extern', 'extern', duplicate=0)
371 SConscript(B.root_build_dir+'/extern/SConscript')
372 BuildDir(B.root_build_dir+'/source', 'source', duplicate=0)
373 SConscript(B.root_build_dir+'/source/SConscript')
374
375 # now that we have read all SConscripts, we know what
376 # libraries will be built. Create list of
377 # libraries to give as objects to linking phase
378 mainlist = []
379 for tp in B.possible_types:
380         if not tp == 'player' and not tp == 'player2':
381                 mainlist += B.create_blender_liblist(env, tp)
382
383 if B.arguments.get('BF_PRIORITYLIST', '0')=='1':
384         B.propose_priorities()
385
386 dobj = B.buildinfo(env, "dynamic") + B.resources
387 thestatlibs, thelibincs = B.setup_staticlibs(env)
388 thesyslibs = B.setup_syslibs(env)
389
390 if 'blender' in B.targets or not env['WITH_BF_NOBLENDER']:
391         env.BlenderProg(B.root_build_dir, "blender", dobj + mainlist + thestatlibs, [], thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blender')
392 if env['WITH_BF_PLAYER']:
393         playerlist = B.create_blender_liblist(env, 'player')
394         env.BlenderProg(B.root_build_dir, "blenderplayer", dobj + playerlist + thestatlibs, [], thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blenderplayer')
395
396 ##### Now define some targets
397
398
399 #------------ INSTALL
400
401 #-- binaries
402 blenderinstall = []
403 if  env['OURPLATFORM']=='darwin':
404         for prg in B.program_list:
405                 bundle = '%s.app' % prg[0]
406                 bundledir = os.path.dirname(bundle)
407                 for dp, dn, df in os.walk(bundle):
408                         if 'CVS' in dn:
409                                 dn.remove('CVS')
410                         if '.svn' in dn:
411                                 dn.remove('.svn')
412                         dir=env['BF_INSTALLDIR']+dp[len(bundledir):]
413                         source=[dp+os.sep+f for f in df]
414                         blenderinstall.append(env.Install(dir=dir,source=source))
415 else:
416         blenderinstall = env.Install(dir=env['BF_INSTALLDIR'], source=B.program_list)
417
418 #-- .blender
419 #- dont do .blender and scripts for darwin, it is already in the bundle
420 dotblendlist = []
421 dottargetlist = []
422 scriptinstall = []
423
424 if  env['OURPLATFORM']!='darwin':
425                 for dp, dn, df in os.walk('bin/.blender'):
426                         if 'CVS' in dn:
427                                 dn.remove('CVS')
428                         if '.svn' in dn:
429                                 dn.remove('.svn')
430                         
431                         for f in df:
432                                 if not env['WITH_BF_INTERNATIONAL']:
433                                         if 'locale' in dp:
434                                                 continue
435                                         if f == '.Blanguages':
436                                                 continue
437                                 if not env['WITH_BF_FREETYPE']:
438                                         if f.endswith('.ttf'):
439                                                 continue
440                                 
441                                 dotblendlist.append(os.path.join(dp, f))
442                                 dottargetlist.append(env['BF_INSTALLDIR']+dp[3:]+os.sep+f)
443
444                 dotblenderinstall = []
445                 for targetdir,srcfile in zip(dottargetlist, dotblendlist):
446                         td, tf = os.path.split(targetdir)
447                         dotblenderinstall.append(env.Install(dir=td, source=srcfile))
448                 
449                 if env['WITH_BF_PYTHON']:
450                         #-- .blender/scripts    
451                         scriptpath='release/scripts'
452                         for dp, dn, df in os.walk(scriptpath):
453                                 if 'CVS' in dn:
454                                         dn.remove('CVS')
455                                 if '.svn' in dn:
456                                         dn.remove('.svn')
457                                 dir=env['BF_INSTALLDIR']+'/.blender/scripts'+dp[len(scriptpath):]
458                                 source=[dp+os.sep+f for f in df]
459                                 scriptinstall.append(env.Install(dir=dir,source=source))
460
461 #-- icons
462 if env['OURPLATFORM']=='linux2':
463         iconlist = []
464         icontargetlist = []
465
466         for tp, tn, tf in os.walk('release/freedesktop/icons'):
467                 if 'CVS' in tn:
468                         tn.remove('CVS')
469                 if '.svn' in tn:
470                         tn.remove('.svn')
471                 for f in tf:
472                         print ">>>", env['BF_INSTALLDIR'], tp, f
473                         iconlist.append(tp+os.sep+f)
474                         icontargetlist.append(env['BF_INSTALLDIR']+tp[19:]+os.sep+f)
475
476         iconinstall = []
477         for targetdir,srcfile in zip(icontargetlist, iconlist):
478                 td, tf = os.path.split(targetdir)
479                 iconinstall.append(env.Install(dir=td, source=srcfile))
480
481 # dlls for linuxcross
482 # TODO - add more libs, for now this lets blenderlite run
483 if env['OURPLATFORM']=='linuxcross':
484         dir=env['BF_INSTALLDIR']
485         source = ['../lib/windows/pthreads/lib/pthreadGC2.dll']
486         scriptinstall.append(env.Install(dir=dir, source=source))
487
488 #-- plugins
489 pluglist = []
490 plugtargetlist = []
491 for tp, tn, tf in os.walk('release/plugins'):
492         if 'CVS' in tn:
493                 tn.remove('CVS')
494         if '.svn' in tn:
495                 tn.remove('.svn')
496         for f in tf:
497                 print ">>>", env['BF_INSTALLDIR'], tp, f
498                 pluglist.append(tp+os.sep+f)
499                 plugtargetlist.append(env['BF_INSTALLDIR']+tp[7:]+os.sep+f)
500
501 # header files for plugins
502 pluglist.append('source/blender/blenpluginapi/documentation.h')
503 plugtargetlist.append(env['BF_INSTALLDIR'] + os.sep + 'plugins' + os.sep + 'include' + os.sep +'documentation.h')
504 pluglist.append('source/blender/blenpluginapi/externdef.h')
505 plugtargetlist.append(env['BF_INSTALLDIR'] + os.sep + 'plugins' + os.sep + 'include' + os.sep +'externdef.h')
506 pluglist.append('source/blender/blenpluginapi/floatpatch.h')
507 plugtargetlist.append(env['BF_INSTALLDIR'] + os.sep + 'plugins' + os.sep + 'include' + os.sep +'floatpatch.h')
508 pluglist.append('source/blender/blenpluginapi/iff.h')
509 plugtargetlist.append(env['BF_INSTALLDIR'] + os.sep + 'plugins' + os.sep + 'include' + os.sep +'iff.h')
510 pluglist.append('source/blender/blenpluginapi/plugin.h')
511 plugtargetlist.append(env['BF_INSTALLDIR'] + os.sep + 'plugins' + os.sep + 'include' + os.sep +'plugin.h')
512 pluglist.append('source/blender/blenpluginapi/util.h')
513 plugtargetlist.append(env['BF_INSTALLDIR'] + os.sep + 'plugins' + os.sep + 'include' + os.sep +'util.h')
514 pluglist.append('source/blender/blenpluginapi/plugin.DEF')
515 plugtargetlist.append(env['BF_INSTALLDIR'] + os.sep + 'plugins' + os.sep + 'include' + os.sep + 'plugin.def')
516
517 plugininstall = []
518 for targetdir,srcfile in zip(plugtargetlist, pluglist):
519         td, tf = os.path.split(targetdir)
520         plugininstall.append(env.Install(dir=td, source=srcfile))
521
522 textlist = []
523 texttargetlist = []
524 for tp, tn, tf in os.walk('release/text'):
525         if 'CVS' in tn:
526                 tn.remove('CVS')
527         if '.svn' in tn:
528                 tn.remove('.svn')
529         for f in tf:
530                 textlist.append(tp+os.sep+f)
531
532 textinstall = env.Install(dir=env['BF_INSTALLDIR'], source=textlist)
533
534 if  env['OURPLATFORM']=='darwin':
535                 allinstall = [blenderinstall, plugininstall, textinstall]
536 elif env['OURPLATFORM']=='linux2':
537                 allinstall = [blenderinstall, dotblenderinstall, scriptinstall, plugininstall, textinstall, iconinstall]
538 else:
539                 allinstall = [blenderinstall, dotblenderinstall, scriptinstall, plugininstall, textinstall]
540
541 if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw'):
542         dllsources = ['${LCGDIR}/gettext/lib/gnu_gettext.dll',
543                                                 '${BF_PNG_LIBPATH}/libpng.dll',
544                                                 '${BF_ZLIB_LIBPATH}/zlib.dll',
545                                                 '${BF_TIFF_LIBPATH}/${BF_TIFF_LIB}.dll']
546         dllsources += ['${BF_PTHREADS_LIBPATH}/${BF_PTHREADS_LIB}.dll']
547         if env['WITH_BF_SDL']:
548                 dllsources.append('${BF_SDL_LIBPATH}/SDL.dll')
549         if env['WITH_BF_PYTHON']:
550                 dllsources.append('#release/windows/extra/python25.zip')
551                 dllsources.append('#release/windows/extra/zlib.pyd')
552                 if env['BF_DEBUG']:
553                         dllsources.append('${BF_PYTHON_LIBPATH}/${BF_PYTHON_LIB}_d.dll')
554                 else:
555                         dllsources.append('${BF_PYTHON_LIBPATH}/${BF_PYTHON_LIB}.dll')
556         if env['WITH_BF_ICONV']:
557                 dllsources += ['${BF_ICONV_LIBPATH}/iconv.dll']
558         if env['WITH_BF_FFMPEG']:
559                 dllsources += ['${LCGDIR}/ffmpeg/lib/avcodec-51.dll',
560                                                 '${LCGDIR}/ffmpeg/lib/avformat-52.dll',
561                                                 '${LCGDIR}/ffmpeg/lib/avdevice-52.dll',
562                                                 '${LCGDIR}/ffmpeg/lib/avutil-49.dll',
563                                                 '${LCGDIR}/ffmpeg/lib/libfaad-0.dll',
564                                                 '${LCGDIR}/ffmpeg/lib/libfaac-0.dll',
565                                                 '${LCGDIR}/ffmpeg/lib/libmp3lame-0.dll',
566                                                 '${LCGDIR}/ffmpeg/lib/libx264-59.dll',
567                                                 '${LCGDIR}/ffmpeg/lib/xvidcore.dll',
568                                                 '${LCGDIR}/ffmpeg/lib/swscale-0.dll']
569         windlls = env.Install(dir=env['BF_INSTALLDIR'], source = dllsources)
570         allinstall += windlls
571
572 installtarget = env.Alias('install', allinstall)
573 bininstalltarget = env.Alias('install-bin', blenderinstall)
574
575 nsisaction = env.Action(btools.NSIS_Installer, btools.NSIS_print)
576 nsiscmd = env.Command('nsisinstaller', None, nsisaction)
577 nsisalias = env.Alias('nsis', nsiscmd)
578
579 if 'blender' in B.targets:
580         blenderexe= env.Alias('blender', B.program_list)
581         Depends(blenderexe,installtarget)
582
583 if env['WITH_BF_PLAYER']:
584         blenderplayer = env.Alias('blenderplayer', B.program_list)
585         Depends(blenderplayer,installtarget)
586
587 if not env['WITH_BF_GAMEENGINE']:
588         blendernogame = env.Alias('blendernogame', B.program_list)
589         Depends(blendernogame,installtarget)
590
591 if 'blenderlite' in B.targets:
592         blenderlite = env.Alias('blenderlite', B.program_list)
593         Depends(blenderlite,installtarget)
594
595 Depends(nsiscmd, allinstall)
596
597 Default(B.program_list)
598
599 if not env['WITHOUT_BF_INSTALL']:
600                 Default(installtarget)
601
602 #------------ RELEASE
603 # TODO: zipup the installation
604
605 #------------ BLENDERPLAYER
606 # TODO: build stubs and link into blenderplayer
607
608 #------------ EPYDOC
609 if env['WITH_BF_DOCS']:
610         SConscript('source/blender/python/api2_2x/doc/SConscript')
611         SConscript('source/gameengine/PyDoc/SConscript')
612