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         Exit()
350
351 if not os.path.isdir ( B.root_build_dir):
352         os.makedirs ( B.root_build_dir )
353         os.makedirs ( B.root_build_dir + 'source' )
354         os.makedirs ( B.root_build_dir + 'intern' )
355         os.makedirs ( B.root_build_dir + 'extern' )
356         os.makedirs ( B.root_build_dir + 'lib' )
357         os.makedirs ( B.root_build_dir + 'bin' )
358 if not os.path.isdir(B.doc_build_dir) and env['WITH_BF_DOCS']:
359         os.makedirs ( B.doc_build_dir )
360
361 Help(opts.GenerateHelpText(env))
362
363 # default is new quieter output, but if you need to see the 
364 # commands, do 'scons BF_QUIET=0'
365 bf_quietoutput = B.arguments.get('BF_QUIET', '1')
366 if env['BF_QUIET']:
367         B.set_quiet_output(env)
368 else:
369         if toolset=='msvc':
370                 B.msvc_hack(env)
371
372 print B.bc.HEADER+'Building in: ' + B.bc.ENDC + os.path.abspath(B.root_build_dir)
373 env.SConsignFile(B.root_build_dir+'scons-signatures')
374 B.init_lib_dict()
375
376 ##### END SETUP ##########
377
378 Export('env')
379
380 BuildDir(B.root_build_dir+'/intern', 'intern', duplicate=0)
381 SConscript(B.root_build_dir+'/intern/SConscript')
382 BuildDir(B.root_build_dir+'/extern', 'extern', duplicate=0)
383 SConscript(B.root_build_dir+'/extern/SConscript')
384 BuildDir(B.root_build_dir+'/source', 'source', duplicate=0)
385 SConscript(B.root_build_dir+'/source/SConscript')
386
387 # now that we have read all SConscripts, we know what
388 # libraries will be built. Create list of
389 # libraries to give as objects to linking phase
390 mainlist = []
391 for tp in B.possible_types:
392         if not tp == 'player':
393                 mainlist += B.create_blender_liblist(env, tp)
394
395 if B.arguments.get('BF_PRIORITYLIST', '0')=='1':
396         B.propose_priorities()
397
398 dobj = B.buildinfo(env, "dynamic") + B.resources
399 thestatlibs, thelibincs = B.setup_staticlibs(env)
400 thesyslibs = B.setup_syslibs(env)
401
402 if 'blender' in B.targets or not env['WITH_BF_NOBLENDER']:
403         env.BlenderProg(B.root_build_dir, "blender", dobj + mainlist + thestatlibs, [], thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blender')
404 if env['WITH_BF_PLAYER']:
405         playerlist = B.create_blender_liblist(env, 'player')
406         playerlist += B.create_blender_liblist(env, 'intern')
407         playerlist += B.create_blender_liblist(env, 'extern')
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 '.svn' in dn:
423                                 dn.remove('.svn')
424                         dir=env['BF_INSTALLDIR']+dp[len(bundledir):]
425                         source=[dp+os.sep+f for f in df]
426                         blenderinstall.append(env.Install(dir=dir,source=source))
427 else:
428         if env['WITH_BF_FHS']:  dir= os.path.join(env['BF_INSTALLDIR'], 'bin')
429         else:                                   dir= env['BF_INSTALLDIR']
430         
431         blenderinstall = env.Install(dir=dir, source=B.program_list)
432
433 #-- .blender
434 #- dont do .blender and scripts for darwin, it is already in the bundle
435 dotblendlist = []
436 dottargetlist = []
437 scriptinstall = []
438
439 if  env['OURPLATFORM']!='darwin':
440                 for dp, dn, df in os.walk('bin/.blender'):
441                         if '.svn' in dn:
442                                 dn.remove('.svn')
443                         
444                         for f in df:
445                                 if not env['WITH_BF_INTERNATIONAL']:
446                                         if 'locale' in dp:
447                                                 continue
448                                         if f == '.Blanguages':
449                                                 continue
450                                 if not env['WITH_BF_FREETYPE']:
451                                         if f.endswith('.ttf'):
452                                                 continue
453                                 
454                                 dotblendlist.append(os.path.join(dp, f))
455                                 if env['WITH_BF_FHS']:  dir= os.path.join(*([BLENDERPATH] + dp.split(os.sep)[2:]))      # skip bin/.blender
456                                 else:                                   dir= os.path.join(*([BLENDERPATH] + dp.split(os.sep)[1:]))      # skip bin
457                                 
458                                 # print dir+ os.sep + f
459                                 print dir
460                                 dottargetlist.append(dir + os.sep + f)
461                                         
462
463                 dotblenderinstall = []
464                 for targetdir,srcfile in zip(dottargetlist, dotblendlist):
465                         td, tf = os.path.split(targetdir)
466                         dotblenderinstall.append(env.Install(dir=td, source=srcfile))
467                 
468                 if env['WITH_BF_PYTHON']:
469                         #-- .blender/scripts
470                         scriptpaths=['release/scripts']
471                         for scriptpath in scriptpaths:
472                                 for dp, dn, df in os.walk(scriptpath):
473                                         if '.svn' in dn:
474                                                 dn.remove('.svn')
475                                         
476                                         if env['WITH_BF_FHS']:          dir = BLENDERPATH
477                                         else:                                           dir = os.path.join(env['BF_INSTALLDIR'], '.blender')                            
478                                         dir += os.sep + os.path.basename(scriptpath) + dp[len(scriptpath):]
479                                         
480                                         source=[os.path.join(dp, f) for f in df if f[-3:]!='pyc']
481                                         scriptinstall.append(env.Install(dir=dir,source=source))
482
483 #-- icons
484 if env['OURPLATFORM']=='linux2':
485         iconlist = []
486         icontargetlist = []
487
488         for tp, tn, tf in os.walk('release/freedesktop/icons'):
489                 if '.svn' in tn:
490                         tn.remove('.svn')
491                 for f in tf:
492                         iconlist.append(os.path.join(tp, f))
493                         icontargetlist.append( os.path.join(*([BLENDERPATH] + tp.split(os.sep)[2:] + [f])) )
494
495         iconinstall = []
496         for targetdir,srcfile in zip(icontargetlist, iconlist):
497                 td, tf = os.path.split(targetdir)
498                 iconinstall.append(env.Install(dir=td, source=srcfile))
499
500 # dlls for linuxcross
501 # TODO - add more libs, for now this lets blenderlite run
502 if env['OURPLATFORM']=='linuxcross':
503         dir=env['BF_INSTALLDIR']
504         source = []
505
506         if env['WITH_BF_OPENMP']:
507                 source += ['../lib/windows/pthreads/lib/pthreadGC2.dll']
508
509         scriptinstall.append(env.Install(dir=dir, source=source))
510
511 #-- plugins
512 pluglist = []
513 plugtargetlist = []
514 for tp, tn, tf in os.walk('release/plugins'):
515         if '.svn' in tn:
516                 tn.remove('.svn')
517         df = tp[8:] # remove 'release/'
518         for f in tf:
519                 pluglist.append(os.path.join(tp, f))
520                 plugtargetlist.append( os.path.join(BLENDERPATH, df, f) )
521
522
523 # header files for plugins
524 pluglist.append('source/blender/blenpluginapi/documentation.h')
525 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'documentation.h'))
526 pluglist.append('source/blender/blenpluginapi/externdef.h')
527 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'externdef.h'))
528 pluglist.append('source/blender/blenpluginapi/floatpatch.h')
529 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'floatpatch.h'))
530 pluglist.append('source/blender/blenpluginapi/iff.h')
531 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'iff.h'))
532 pluglist.append('source/blender/blenpluginapi/plugin.h')
533 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'plugin.h'))
534 pluglist.append('source/blender/blenpluginapi/util.h')
535 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'util.h'))
536 pluglist.append('source/blender/blenpluginapi/plugin.DEF')
537 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'plugin.def'))
538
539 plugininstall = []
540 for targetdir,srcfile in zip(plugtargetlist, pluglist):
541         td, tf = os.path.split(targetdir)
542         plugininstall.append(env.Install(dir=td, source=srcfile))
543
544 textlist = []
545 texttargetlist = []
546 for tp, tn, tf in os.walk('release/text'):
547         if '.svn' in tn:
548                 tn.remove('.svn')
549         for f in tf:
550                 textlist.append(tp+os.sep+f)
551
552 textinstall = env.Install(dir=BLENDERPATH, source=textlist)
553
554 if  env['OURPLATFORM']=='darwin':
555                 allinstall = [blenderinstall, plugininstall, textinstall]
556 elif env['OURPLATFORM']=='linux2':
557                 allinstall = [blenderinstall, dotblenderinstall, scriptinstall, plugininstall, textinstall, iconinstall]
558 else:
559                 allinstall = [blenderinstall, dotblenderinstall, scriptinstall, plugininstall, textinstall]
560
561 if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'win64-vc', 'linuxcross'):
562         dllsources = []
563
564         if not env['OURPLATFORM'] in ('win32-mingw', 'win64-vc', 'linuxcross'):
565                 # For MinGW and linuxcross static linking will be used
566                 dllsources += ['${LCGDIR}/gettext/lib/gnu_gettext.dll']
567
568         #currently win64-vc doesn't appear to have libpng.dll
569         if env['OURPLATFORM'] != 'win64-vc':
570                 dllsources += ['${BF_PNG_LIBPATH}/libpng.dll',
571                                 '${BF_ZLIB_LIBPATH}/zlib.dll']
572
573         dllsources += ['${BF_TIFF_LIBPATH}/${BF_TIFF_LIB}.dll']
574
575         if env['OURPLATFORM'] != 'linuxcross':
576                 # pthreads library is already added
577                 dllsources += ['${BF_PTHREADS_LIBPATH}/${BF_PTHREADS_LIB}.dll']
578
579         if env['WITH_BF_SDL']:
580                 if env['OURPLATFORM'] == 'win64-vc':
581                         pass # we link statically already to SDL on win64
582                 else:
583                         dllsources.append('${BF_SDL_LIBPATH}/SDL.dll')
584
585         if env['WITH_BF_PYTHON']:
586                 if env['BF_DEBUG']:
587                         dllsources.append('${BF_PYTHON_LIBPATH}/${BF_PYTHON_DLL}_d.dll')
588                 else:
589                         dllsources.append('${BF_PYTHON_LIBPATH}/${BF_PYTHON_DLL}.dll')
590
591         if env['WITH_BF_ICONV']:
592                 if env['OURPLATFORM'] == 'win64-vc':
593                         pass # we link statically to iconv on win64
594                 elif not env['OURPLATFORM'] in ('win32-mingw', 'linuxcross'):
595                         #gettext for MinGW and cross-compilation is compiled staticly
596                         dllsources += ['${BF_ICONV_LIBPATH}/iconv.dll']
597
598         if env['WITH_BF_OPENAL']:
599                 dllsources.append('${LCGDIR}/openal/lib/OpenAL32.dll')
600                 dllsources.append('${LCGDIR}/openal/lib/wrap_oal.dll')
601
602         if env['WITH_BF_SNDFILE']:
603                 dllsources.append('${LCGDIR}/sndfile/lib/libsndfile-1.dll')
604
605         if env['WITH_BF_FFMPEG']:
606                 dllsources += ['${BF_FFMPEG_LIBPATH}/avcodec-52.dll',
607                                         '${BF_FFMPEG_LIBPATH}/avformat-52.dll',
608                                         '${BF_FFMPEG_LIBPATH}/avdevice-52.dll',
609                                         '${BF_FFMPEG_LIBPATH}/avutil-50.dll',
610                                         '${BF_FFMPEG_LIBPATH}/swscale-0.dll']
611
612         if env['WITH_BF_JACK']:
613                 dllsources += ['${LCGDIR}/jack/lib/libjack.dll']
614         windlls = env.Install(dir=env['BF_INSTALLDIR'], source = dllsources)
615         allinstall += windlls
616
617 installtarget = env.Alias('install', allinstall)
618 bininstalltarget = env.Alias('install-bin', blenderinstall)
619
620 nsisaction = env.Action(btools.NSIS_Installer, btools.NSIS_print)
621 nsiscmd = env.Command('nsisinstaller', None, nsisaction)
622 nsisalias = env.Alias('nsis', nsiscmd)
623
624 if 'blender' in B.targets:
625         blenderexe= env.Alias('blender', B.program_list)
626         Depends(blenderexe,installtarget)
627
628 if env['WITH_BF_PLAYER']:
629         blenderplayer = env.Alias('blenderplayer', B.program_list)
630         Depends(blenderplayer,installtarget)
631
632 if not env['WITH_BF_GAMEENGINE']:
633         blendernogame = env.Alias('blendernogame', B.program_list)
634         Depends(blendernogame,installtarget)
635
636 if 'blenderlite' in B.targets:
637         blenderlite = env.Alias('blenderlite', B.program_list)
638         Depends(blenderlite,installtarget)
639
640 Depends(nsiscmd, allinstall)
641
642 Default(B.program_list)
643
644 if not env['WITHOUT_BF_INSTALL']:
645                 Default(installtarget)
646
647 #------------ EPYDOC
648 if env['WITH_BF_DOCS']:
649     try:
650         import epydoc
651     except ImportError:
652         epydoc = None
653
654     if epydoc:
655         SConscript('source/gameengine/PyDoc/SConscript')
656     else:
657         print "No epydoc install detected, Python API and Gameengine API Docs will not be generated "
658
659