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