scons build systems
[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 platform as pltfrm
33
34 # Need a better way to do this. Automagical maybe is not the best thing, maybe it is.
35 if pltfrm.architecture()[0] == '64bit':
36         bitness = 64
37 else:
38         bitness = 32
39
40 import sys
41 import os
42 import os.path
43 import string
44 import shutil
45 import glob
46 import re
47 from tempfile import mkdtemp
48
49 import tools.Blender
50 import tools.btools
51 import tools.bcolors
52
53 EnsureSConsVersion(1,0,0)
54
55 BlenderEnvironment = tools.Blender.BlenderEnvironment
56 btools = tools.btools
57 B = tools.Blender
58
59 ### globals ###
60 platform = sys.platform
61 quickie = None
62 quickdebug = 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         if bitness==64 and platform=='win32':
128                 env = BlenderEnvironment(ENV = os.environ, MSVS_ARCH='amd64')
129         else:
130                 env = BlenderEnvironment(ENV = os.environ)
131
132 if not env:
133         print "Could not create a build environment"
134         Exit()
135
136
137 cc = B.arguments.get('CC', None)
138 cxx = B.arguments.get('CXX', None)
139 if cc:
140         env['CC'] = cc
141 if cxx:
142         env['CXX'] = cxx
143
144 if env['CC'] in ['cl', 'cl.exe'] and sys.platform=='win32':
145         if bitness == 64:
146                 platform = 'win64-vc'
147         else:
148                 platform = 'win32-vc'
149 elif env['CC'] in ['gcc'] and sys.platform=='win32':
150         platform = 'win32-mingw'
151
152 env.SConscriptChdir(0)
153
154 crossbuild = B.arguments.get('BF_CROSS', None)
155 if crossbuild and platform not in ('win32-vc', 'win64-vc'):
156         platform = 'linuxcross'
157
158 env['OURPLATFORM'] = platform
159
160 configfile = 'config'+os.sep+platform+'-config.py'
161
162 if os.path.exists(configfile):
163         print B.bc.OKGREEN + "Using config file: " + B.bc.ENDC + configfile
164 else:
165         print B.bc.FAIL + configfile + " doesn't exist" + B.bc.ENDC
166
167 if crossbuild and env['PLATFORM'] != 'win32':
168         print B.bc.HEADER+"Preparing for crossbuild"+B.bc.ENDC
169         env.Tool('crossmingw', ['tools'])
170         # todo: determine proper libs/includes etc.
171         # Needed for gui programs, console programs should do without it
172
173         # Now we don't need this option to have console window
174         # env.Append(LINKFLAGS=['-mwindows'])
175
176 userconfig = B.arguments.get('BF_CONFIG', 'user-config.py')
177 # first read platform config. B.arguments will override
178 optfiles = [configfile]
179 if os.path.exists(userconfig):
180         print B.bc.OKGREEN + "Using user-config file: " + B.bc.ENDC + userconfig
181         optfiles += [userconfig]
182 else:
183         print B.bc.WARNING + userconfig + " not found, no user overrides" + B.bc.ENDC
184
185 opts = btools.read_opts(optfiles, B.arguments)
186 opts.Update(env)
187
188 if not env['BF_FANCY']:
189         B.bc.disable()
190
191
192 # remove install dir so old and new files are not mixed.
193 # NOTE: only do the scripts directory for now, otherwise is too disruptive for developers
194 # TODO: perhaps we need an option (off by default) to not do this altogether...
195 if not env['WITHOUT_BF_INSTALL'] and not env['WITHOUT_BF_OVERWRITE_INSTALL']:
196         scriptsDir = env['BF_INSTALLDIR'] + os.sep + '.blender' + os.sep + 'scripts'
197         if os.path.isdir(scriptsDir):
198                 print B.bc.OKGREEN + "Clearing installation directory%s: %s" % (B.bc.ENDC, os.path.abspath(scriptsDir))
199                 shutil.rmtree(scriptsDir)
200
201
202 SetOption('num_jobs', int(env['BF_NUMJOBS']))
203 print B.bc.OKGREEN + "Build with parallel jobs%s: %s" % (B.bc.ENDC, GetOption('num_jobs'))
204
205 # BLENDERPATH is a unix only option to enable typical style paths this is
206 # spesifically a data-dir, which is used a lot but cant replace BF_INSTALLDIR
207 # because the blender binary is installed in $BF_INSTALLDIR/bin/blender
208
209 if env['WITH_BF_FHS']:
210         BLENDERPATH = os.path.join(env['BF_INSTALLDIR'], 'share', 'blender', env['BF_VERSION'])
211 else:
212         BLENDERPATH = env['BF_INSTALLDIR']
213
214 if env['WITH_BF_OPENMP'] == 1:
215                 if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
216                                 env['CCFLAGS'].append('/openmp')
217                                 env['CPPFLAGS'].append('/openmp')
218                                 env['CXXFLAGS'].append('/openmp')
219                 else:
220                         if env['CC'].endswith('icc'): # to be able to handle CC=/opt/bla/icc case
221                                 env.Append(LINKFLAGS=['-openmp', '-static-intel'])
222                                 env['CCFLAGS'].append('-openmp')
223                                 env['CPPFLAGS'].append('-openmp')
224                                 env['CXXFLAGS'].append('-openmp')
225                         else:
226                                 env.Append(CCFLAGS=['-fopenmp']) 
227                                 env.Append(CPPFLAGS=['-fopenmp'])
228                                 env.Append(CXXFLAGS=['-fopenmp'])
229
230 if env['WITH_GHOST_COCOA'] == True:
231         env.Append(CFLAGS=['-DGHOST_COCOA']) 
232         env.Append(CXXFLAGS=['-DGHOST_COCOA'])
233         env.Append(CPPFLAGS=['-DGHOST_COCOA'])
234     
235 if env['USE_QTKIT'] == True:
236         env.Append(CFLAGS=['-DUSE_QTKIT']) 
237         env.Append(CXXFLAGS=['-DUSE_QTKIT'])
238         env.Append(CPPFLAGS=['-DUSE_QTKIT'])
239
240 #check for additional debug libnames
241
242 if env.has_key('BF_DEBUG_LIBS'):
243         B.quickdebug += env['BF_DEBUG_LIBS']
244
245 printdebug = B.arguments.get('BF_LISTDEBUG', 0)
246
247 if len(B.quickdebug) > 0 and printdebug != 0:
248         print B.bc.OKGREEN + "Buildings these libs with debug symbols:" + B.bc.ENDC
249         for l in B.quickdebug:
250                 print "\t" + l
251
252 # remove stdc++ from LLIBS if we are building a statc linked CXXFLAGS
253 if env['WITH_BF_STATICCXX']:
254         if 'stdc++' in env['LLIBS']:
255                 env['LLIBS'].remove('stdc++')
256         else:
257                 print '\tcould not remove stdc++ library from LLIBS, WITH_BF_STATICCXX may not work for your platform'
258
259 # check target for blenderplayer. Set WITH_BF_PLAYER if found on cmdline
260 if 'blenderplayer' in B.targets:
261         env['WITH_BF_PLAYER'] = True
262
263 if 'blendernogame' in B.targets:
264         env['WITH_BF_GAMEENGINE'] = False
265
266 if 'blenderlite' in B.targets:
267         target_env_defs = {}
268         target_env_defs['WITH_BF_GAMEENGINE'] = False
269         target_env_defs['WITH_BF_OPENAL'] = False
270         target_env_defs['WITH_BF_OPENEXR'] = False
271         target_env_defs['WITH_BF_ICONV'] = False
272         target_env_defs['WITH_BF_INTERNATIONAL'] = False
273         target_env_defs['WITH_BF_OPENJPEG'] = False
274         target_env_defs['WITH_BF_FFMPEG'] = False
275         target_env_defs['WITH_BF_QUICKTIME'] = False
276         target_env_defs['WITH_BF_REDCODE'] = 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_BULLET'] = False
283         target_env_defs['WITH_BF_BINRELOC'] = False
284         target_env_defs['BF_BUILDINFO'] = False
285         target_env_defs['BF_NO_ELBEEM'] = True
286         target_env_defs['WITH_BF_PYTHON'] = False
287         
288         # Merge blenderlite, let command line to override
289         for k,v in target_env_defs.iteritems():
290                 if k not in B.arguments:
291                         env[k] = v
292
293 # disable elbeem (fluidsim) compilation?
294 if env['BF_NO_ELBEEM'] == 1:
295         env['CPPFLAGS'].append('-DDISABLE_ELBEEM')
296         env['CXXFLAGS'].append('-DDISABLE_ELBEEM')
297         env['CCFLAGS'].append('-DDISABLE_ELBEEM')
298
299 if env['WITH_BF_SDL'] == False and env['OURPLATFORM'] in ('win32-vc', 'win32-ming', 'win64-vc'):
300         env['PLATFORM_LINKFLAGS'].remove('/ENTRY:mainCRTStartup')
301         env['PLATFORM_LINKFLAGS'].append('/ENTRY:main')
302
303 # lastly we check for root_build_dir ( we should not do before, otherwise we might do wrong builddir
304 B.root_build_dir = env['BF_BUILDDIR']
305 B.doc_build_dir = os.path.join(BLENDERPATH, 'doc')
306 if not B.root_build_dir[-1]==os.sep:
307         B.root_build_dir += os.sep
308 if not B.doc_build_dir[-1]==os.sep:
309         B.doc_build_dir += os.sep
310         
311 # We do a shortcut for clean when no quicklist is given: just delete
312 # builddir without reading in SConscripts
313 do_clean = None
314 if 'clean' in B.targets:
315         do_clean = True
316
317 if not quickie and do_clean:
318         if os.path.exists(B.doc_build_dir):
319                 print B.bc.HEADER+'Cleaning doc dir...'+B.bc.ENDC
320                 dirs = os.listdir(B.doc_build_dir)
321                 for entry in dirs:
322                         if os.path.isdir(B.doc_build_dir + entry) == 1:
323                                 print "clean dir %s"%(B.doc_build_dir+entry)
324                                 shutil.rmtree(B.doc_build_dir+entry)
325                         else: # remove file
326                                 print "remove file %s"%(B.doc_build_dir+entry)
327                                 os.remove(B.root_build_dir+entry)
328         if os.path.exists(B.root_build_dir):
329                 print B.bc.HEADER+'Cleaning build dir...'+B.bc.ENDC
330                 dirs = os.listdir(B.root_build_dir)
331                 for entry in dirs:
332                         if os.path.isdir(B.root_build_dir + entry) == 1:
333                                 print "clean dir %s"%(B.root_build_dir+entry)
334                                 shutil.rmtree(B.root_build_dir+entry)
335                         else: # remove file
336                                 print "remove file %s"%(B.root_build_dir+entry)
337                                 os.remove(B.root_build_dir+entry)
338                 for confile in ['extern/ffmpeg/config.mak', 'extern/x264/config.mak',
339                                 'extern/xvidcore/build/generic/platform.inc', 'extern/ffmpeg/include']:
340                         if os.path.exists(confile):
341                                 print "clean file %s"%confile
342                                 if os.path.isdir(confile):
343                                         for root, dirs, files in os.walk(confile):
344                                                 for name in files:
345                                                         os.remove(os.path.join(root, name))
346                                 else:
347                                         os.remove(confile)
348                 print B.bc.OKGREEN+'...done'+B.bc.ENDC
349         else:
350                 print B.bc.HEADER+'Already Clean, nothing to do.'+B.bc.ENDC
351         Exit()
352
353 if not os.path.isdir ( B.root_build_dir):
354         os.makedirs ( B.root_build_dir )
355         os.makedirs ( B.root_build_dir + 'source' )
356         os.makedirs ( B.root_build_dir + 'intern' )
357         os.makedirs ( B.root_build_dir + 'extern' )
358         os.makedirs ( B.root_build_dir + 'lib' )
359         os.makedirs ( B.root_build_dir + 'bin' )
360 if not os.path.isdir(B.doc_build_dir) and env['WITH_BF_DOCS']:
361         os.makedirs ( B.doc_build_dir )
362
363 Help(opts.GenerateHelpText(env))
364
365 # default is new quieter output, but if you need to see the 
366 # commands, do 'scons BF_QUIET=0'
367 bf_quietoutput = B.arguments.get('BF_QUIET', '1')
368 if env['BF_QUIET']:
369         B.set_quiet_output(env)
370 else:
371         if toolset=='msvc':
372                 B.msvc_hack(env)
373
374 print B.bc.HEADER+'Building in: ' + B.bc.ENDC + os.path.abspath(B.root_build_dir)
375 env.SConsignFile(B.root_build_dir+'scons-signatures')
376 B.init_lib_dict()
377
378 ##### END SETUP ##########
379
380 Export('env')
381
382 BuildDir(B.root_build_dir+'/intern', 'intern', duplicate=0)
383 SConscript(B.root_build_dir+'/intern/SConscript')
384 BuildDir(B.root_build_dir+'/extern', 'extern', duplicate=0)
385 SConscript(B.root_build_dir+'/extern/SConscript')
386 BuildDir(B.root_build_dir+'/source', 'source', duplicate=0)
387 SConscript(B.root_build_dir+'/source/SConscript')
388
389 # now that we have read all SConscripts, we know what
390 # libraries will be built. Create list of
391 # libraries to give as objects to linking phase
392 mainlist = []
393 for tp in B.possible_types:
394         if not tp == 'player':
395                 mainlist += B.create_blender_liblist(env, tp)
396
397 if B.arguments.get('BF_PRIORITYLIST', '0')=='1':
398         B.propose_priorities()
399
400 dobj = B.buildinfo(env, "dynamic") + B.resources
401 thestatlibs, thelibincs = B.setup_staticlibs(env)
402 thesyslibs = B.setup_syslibs(env)
403
404 if 'blender' in B.targets or not env['WITH_BF_NOBLENDER']:
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         playerlist += B.create_blender_liblist(env, 'intern')
409         playerlist += B.create_blender_liblist(env, 'extern')
410         env.BlenderProg(B.root_build_dir, "blenderplayer", dobj + playerlist, [], thestatlibs + thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blenderplayer')
411
412 ##### Now define some targets
413
414
415 #------------ INSTALL
416
417 #-- binaries
418 blenderinstall = []
419 if  env['OURPLATFORM']=='darwin':
420         for prg in B.program_list:
421                 bundle = '%s.app' % prg[0]
422                 bundledir = os.path.dirname(bundle)
423                 for dp, dn, df in os.walk(bundle):
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         if env['WITH_BF_FHS']:  dir= os.path.join(env['BF_INSTALLDIR'], 'bin')
431         else:                                   dir= env['BF_INSTALLDIR']
432         
433         blenderinstall = env.Install(dir=dir, source=B.program_list)
434
435 #-- .blender
436 #- dont do .blender and scripts for darwin, it is already in the bundle
437 dotblendlist = []
438 dottargetlist = []
439 scriptinstall = []
440
441 if  env['OURPLATFORM']!='darwin':
442                 for dp, dn, df in os.walk('bin/.blender'):
443                         if '.svn' in dn:
444                                 dn.remove('.svn')
445                         
446                         for f in df:
447                                 if not env['WITH_BF_INTERNATIONAL']:
448                                         if 'locale' in dp:
449                                                 continue
450                                         if f == '.Blanguages':
451                                                 continue
452                                 if not env['WITH_BF_FREETYPE']:
453                                         if f.endswith('.ttf'):
454                                                 continue
455                                 
456                                 dotblendlist.append(os.path.join(dp, f))
457                                 if env['WITH_BF_FHS']:  dir= os.path.join(*([BLENDERPATH] + dp.split(os.sep)[2:]))      # skip bin/.blender
458                                 else:                                   dir= os.path.join(*([BLENDERPATH] + dp.split(os.sep)[1:]))      # skip bin
459                                 
460                                 # print dir+ os.sep + f
461                                 print dir
462                                 dottargetlist.append(dir + os.sep + f)
463                                         
464
465                 dotblenderinstall = []
466                 for targetdir,srcfile in zip(dottargetlist, dotblendlist):
467                         td, tf = os.path.split(targetdir)
468                         dotblenderinstall.append(env.Install(dir=td, source=srcfile))
469                 
470                 if env['WITH_BF_PYTHON']:
471                         #-- .blender/scripts
472                         scriptpaths=['release/scripts']
473                         for scriptpath in scriptpaths:
474                                 for dp, dn, df in os.walk(scriptpath):
475                                         if '.svn' in dn:
476                                                 dn.remove('.svn')
477                                         
478                                         if env['WITH_BF_FHS']:          dir = BLENDERPATH
479                                         else:                                           dir = os.path.join(env['BF_INSTALLDIR'], '.blender')                            
480                                         dir += os.sep + os.path.basename(scriptpath) + dp[len(scriptpath):]
481                                         
482                                         source=[os.path.join(dp, f) for f in df if f[-3:]!='pyc']
483                                         scriptinstall.append(env.Install(dir=dir,source=source))
484
485 #-- icons
486 if env['OURPLATFORM']=='linux2':
487         iconlist = []
488         icontargetlist = []
489
490         for tp, tn, tf in os.walk('release/freedesktop/icons'):
491                 if '.svn' in tn:
492                         tn.remove('.svn')
493                 for f in tf:
494                         iconlist.append(os.path.join(tp, f))
495                         icontargetlist.append( os.path.join(*([BLENDERPATH] + tp.split(os.sep)[2:] + [f])) )
496
497         iconinstall = []
498         for targetdir,srcfile in zip(icontargetlist, iconlist):
499                 td, tf = os.path.split(targetdir)
500                 iconinstall.append(env.Install(dir=td, source=srcfile))
501
502 # dlls for linuxcross
503 # TODO - add more libs, for now this lets blenderlite run
504 if env['OURPLATFORM']=='linuxcross':
505         dir=env['BF_INSTALLDIR']
506         source = []
507
508         if env['WITH_BF_OPENMP']:
509                 source += ['../lib/windows/pthreads/lib/pthreadGC2.dll']
510
511         scriptinstall.append(env.Install(dir=dir, source=source))
512
513 #-- plugins
514 pluglist = []
515 plugtargetlist = []
516 for tp, tn, tf in os.walk('release/plugins'):
517         if '.svn' in tn:
518                 tn.remove('.svn')
519         df = tp[8:] # remove 'release/'
520         for f in tf:
521                 pluglist.append(os.path.join(tp, f))
522                 plugtargetlist.append( os.path.join(BLENDERPATH, df, f) )
523
524
525 # header files for plugins
526 pluglist.append('source/blender/blenpluginapi/documentation.h')
527 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'documentation.h'))
528 pluglist.append('source/blender/blenpluginapi/externdef.h')
529 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'externdef.h'))
530 pluglist.append('source/blender/blenpluginapi/floatpatch.h')
531 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'floatpatch.h'))
532 pluglist.append('source/blender/blenpluginapi/iff.h')
533 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'iff.h'))
534 pluglist.append('source/blender/blenpluginapi/plugin.h')
535 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'plugin.h'))
536 pluglist.append('source/blender/blenpluginapi/util.h')
537 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'util.h'))
538 pluglist.append('source/blender/blenpluginapi/plugin.DEF')
539 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'plugin.def'))
540
541 plugininstall = []
542 for targetdir,srcfile in zip(plugtargetlist, pluglist):
543         td, tf = os.path.split(targetdir)
544         plugininstall.append(env.Install(dir=td, source=srcfile))
545
546 textlist = []
547 texttargetlist = []
548 for tp, tn, tf in os.walk('release/text'):
549         if '.svn' in tn:
550                 tn.remove('.svn')
551         for f in tf:
552                 textlist.append(tp+os.sep+f)
553
554 textinstall = env.Install(dir=BLENDERPATH, source=textlist)
555
556 if  env['OURPLATFORM']=='darwin':
557                 allinstall = [blenderinstall, plugininstall, textinstall]
558 elif env['OURPLATFORM']=='linux2':
559                 allinstall = [blenderinstall, dotblenderinstall, scriptinstall, plugininstall, textinstall, iconinstall]
560 else:
561                 allinstall = [blenderinstall, dotblenderinstall, scriptinstall, plugininstall, textinstall]
562
563 if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'win64-vc', 'linuxcross'):
564         dllsources = []
565
566         if not env['OURPLATFORM'] in ('win32-mingw', 'win64-vc', 'linuxcross'):
567                 # For MinGW and linuxcross static linking will be used
568                 dllsources += ['${LCGDIR}/gettext/lib/gnu_gettext.dll']
569
570         #currently win64-vc doesn't appear to have libpng.dll
571         if env['OURPLATFORM'] != 'win64-vc':
572                 dllsources += ['${BF_PNG_LIBPATH}/libpng.dll',
573                                 '${BF_ZLIB_LIBPATH}/zlib.dll']
574
575         dllsources += ['${BF_TIFF_LIBPATH}/${BF_TIFF_LIB}.dll']
576
577         if env['OURPLATFORM'] != 'linuxcross':
578                 # pthreads library is already added
579                 dllsources += ['${BF_PTHREADS_LIBPATH}/${BF_PTHREADS_LIB}.dll']
580
581         if env['WITH_BF_SDL']:
582                 if env['OURPLATFORM'] == 'win64-vc':
583                         pass # we link statically already to SDL on win64
584                 else:
585                         dllsources.append('${BF_SDL_LIBPATH}/SDL.dll')
586
587         if env['WITH_BF_PYTHON']:
588                 if env['BF_DEBUG']:
589                         dllsources.append('${BF_PYTHON_LIBPATH}/${BF_PYTHON_DLL}_d.dll')
590                 else:
591                         dllsources.append('${BF_PYTHON_LIBPATH}/${BF_PYTHON_DLL}.dll')
592
593         if env['WITH_BF_ICONV']:
594                 if env['OURPLATFORM'] == 'win64-vc':
595                         pass # we link statically to iconv on win64
596                 elif not env['OURPLATFORM'] in ('win32-mingw', 'linuxcross'):
597                         #gettext for MinGW and cross-compilation is compiled staticly
598                         dllsources += ['${BF_ICONV_LIBPATH}/iconv.dll']
599
600         if env['WITH_BF_OPENAL']:
601                 dllsources.append('${LCGDIR}/openal/lib/OpenAL32.dll')
602                 dllsources.append('${LCGDIR}/openal/lib/wrap_oal.dll')
603
604         if env['WITH_BF_SNDFILE']:
605                 dllsources.append('${LCGDIR}/sndfile/lib/libsndfile-1.dll')
606
607         if env['WITH_BF_FFMPEG']:
608                 dllsources += ['${BF_FFMPEG_LIBPATH}/avcodec-52.dll',
609                                         '${BF_FFMPEG_LIBPATH}/avformat-52.dll',
610                                         '${BF_FFMPEG_LIBPATH}/avdevice-52.dll',
611                                         '${BF_FFMPEG_LIBPATH}/avutil-50.dll',
612                                         '${BF_FFMPEG_LIBPATH}/swscale-0.dll']
613
614         if env['WITH_BF_JACK']:
615                 dllsources += ['${LCGDIR}/jack/lib/libjack.dll']
616         windlls = env.Install(dir=env['BF_INSTALLDIR'], source = dllsources)
617         allinstall += windlls
618
619 installtarget = env.Alias('install', allinstall)
620 bininstalltarget = env.Alias('install-bin', blenderinstall)
621
622 nsisaction = env.Action(btools.NSIS_Installer, btools.NSIS_print)
623 nsiscmd = env.Command('nsisinstaller', None, nsisaction)
624 nsisalias = env.Alias('nsis', nsiscmd)
625
626 if 'blender' in B.targets:
627         blenderexe= env.Alias('blender', B.program_list)
628         Depends(blenderexe,installtarget)
629
630 if env['WITH_BF_PLAYER']:
631         blenderplayer = env.Alias('blenderplayer', B.program_list)
632         Depends(blenderplayer,installtarget)
633
634 if not env['WITH_BF_GAMEENGINE']:
635         blendernogame = env.Alias('blendernogame', B.program_list)
636         Depends(blendernogame,installtarget)
637
638 if 'blenderlite' in B.targets:
639         blenderlite = env.Alias('blenderlite', B.program_list)
640         Depends(blenderlite,installtarget)
641
642 Depends(nsiscmd, allinstall)
643
644 Default(B.program_list)
645
646 if not env['WITHOUT_BF_INSTALL']:
647                 Default(installtarget)
648
649 #------------ EPYDOC
650 if env['WITH_BF_DOCS']:
651     try:
652         import epydoc
653     except ImportError:
654         epydoc = None
655
656     if epydoc:
657         SConscript('source/gameengine/PyDoc/SConscript')
658     else:
659         print "No epydoc install detected, Python API and Gameengine API Docs will not be generated "
660
661