Fix bug #22153 and #21609
[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(env, 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_OPENMP'] = False
272         target_env_defs['WITH_BF_ICONV'] = False
273         target_env_defs['WITH_BF_INTERNATIONAL'] = False
274         target_env_defs['WITH_BF_OPENJPEG'] = False
275         target_env_defs['WITH_BF_FFMPEG'] = False
276         target_env_defs['WITH_BF_QUICKTIME'] = False
277         target_env_defs['WITH_BF_REDCODE'] = False
278         target_env_defs['WITH_BF_DDS'] = False
279         target_env_defs['WITH_BF_ZLIB'] = False
280         target_env_defs['WITH_BF_SDL'] = False
281         target_env_defs['WITH_BF_JPEG'] = False
282         target_env_defs['WITH_BF_PNG'] = False
283         target_env_defs['WITH_BF_BULLET'] = False
284         target_env_defs['WITH_BF_BINRELOC'] = False
285         target_env_defs['BF_BUILDINFO'] = False
286         target_env_defs['BF_NO_ELBEEM'] = True
287         target_env_defs['WITH_BF_PYTHON'] = False
288         
289         # Merge blenderlite, let command line to override
290         for k,v in target_env_defs.iteritems():
291                 if k not in B.arguments:
292                         env[k] = v
293
294 # disable elbeem (fluidsim) compilation?
295 if env['BF_NO_ELBEEM'] == 1:
296         env['CPPFLAGS'].append('-DDISABLE_ELBEEM')
297         env['CXXFLAGS'].append('-DDISABLE_ELBEEM')
298         env['CCFLAGS'].append('-DDISABLE_ELBEEM')
299
300 if env['WITH_BF_SDL'] == False and env['OURPLATFORM'] in ('win32-vc', 'win32-ming', 'win64-vc'):
301         env['PLATFORM_LINKFLAGS'].remove('/ENTRY:mainCRTStartup')
302         env['PLATFORM_LINKFLAGS'].append('/ENTRY:main')
303
304 # lastly we check for root_build_dir ( we should not do before, otherwise we might do wrong builddir
305 B.root_build_dir = env['BF_BUILDDIR']
306 B.doc_build_dir = os.path.join(BLENDERPATH, 'doc')
307 if not B.root_build_dir[-1]==os.sep:
308         B.root_build_dir += os.sep
309 if not B.doc_build_dir[-1]==os.sep:
310         B.doc_build_dir += os.sep
311         
312 # We do a shortcut for clean when no quicklist is given: just delete
313 # builddir without reading in SConscripts
314 do_clean = None
315 if 'clean' in B.targets:
316         do_clean = True
317
318 if not quickie and do_clean:
319         if os.path.exists(B.doc_build_dir):
320                 print B.bc.HEADER+'Cleaning doc dir...'+B.bc.ENDC
321                 dirs = os.listdir(B.doc_build_dir)
322                 for entry in dirs:
323                         if os.path.isdir(B.doc_build_dir + entry) == 1:
324                                 print "clean dir %s"%(B.doc_build_dir+entry)
325                                 shutil.rmtree(B.doc_build_dir+entry)
326                         else: # remove file
327                                 print "remove file %s"%(B.doc_build_dir+entry)
328                                 os.remove(B.root_build_dir+entry)
329         if os.path.exists(B.root_build_dir):
330                 print B.bc.HEADER+'Cleaning build dir...'+B.bc.ENDC
331                 dirs = os.listdir(B.root_build_dir)
332                 for entry in dirs:
333                         if os.path.isdir(B.root_build_dir + entry) == 1:
334                                 print "clean dir %s"%(B.root_build_dir+entry)
335                                 shutil.rmtree(B.root_build_dir+entry)
336                         else: # remove file
337                                 print "remove file %s"%(B.root_build_dir+entry)
338                                 os.remove(B.root_build_dir+entry)
339                 for confile in ['extern/ffmpeg/config.mak', 'extern/x264/config.mak',
340                                 'extern/xvidcore/build/generic/platform.inc', 'extern/ffmpeg/include']:
341                         if os.path.exists(confile):
342                                 print "clean file %s"%confile
343                                 if os.path.isdir(confile):
344                                         for root, dirs, files in os.walk(confile):
345                                                 for name in files:
346                                                         os.remove(os.path.join(root, name))
347                                 else:
348                                         os.remove(confile)
349                 print B.bc.OKGREEN+'...done'+B.bc.ENDC
350         else:
351                 print B.bc.HEADER+'Already Clean, nothing to do.'+B.bc.ENDC
352         Exit()
353
354 if not os.path.isdir ( B.root_build_dir):
355         os.makedirs ( B.root_build_dir )
356         os.makedirs ( B.root_build_dir + 'source' )
357         os.makedirs ( B.root_build_dir + 'intern' )
358         os.makedirs ( B.root_build_dir + 'extern' )
359         os.makedirs ( B.root_build_dir + 'lib' )
360         os.makedirs ( B.root_build_dir + 'bin' )
361 if not os.path.isdir(B.doc_build_dir) and env['WITH_BF_DOCS']:
362         os.makedirs ( B.doc_build_dir )
363
364 Help(opts.GenerateHelpText(env))
365
366 # default is new quieter output, but if you need to see the 
367 # commands, do 'scons BF_QUIET=0'
368 bf_quietoutput = B.arguments.get('BF_QUIET', '1')
369 if env['BF_QUIET']:
370         B.set_quiet_output(env)
371 else:
372         if toolset=='msvc':
373                 B.msvc_hack(env)
374
375 print B.bc.HEADER+'Building in: ' + B.bc.ENDC + os.path.abspath(B.root_build_dir)
376 env.SConsignFile(B.root_build_dir+'scons-signatures')
377 B.init_lib_dict()
378
379 ##### END SETUP ##########
380
381 Export('env')
382
383 BuildDir(B.root_build_dir+'/intern', 'intern', duplicate=0)
384 SConscript(B.root_build_dir+'/intern/SConscript')
385 BuildDir(B.root_build_dir+'/extern', 'extern', duplicate=0)
386 SConscript(B.root_build_dir+'/extern/SConscript')
387 BuildDir(B.root_build_dir+'/source', 'source', duplicate=0)
388 SConscript(B.root_build_dir+'/source/SConscript')
389
390 # now that we have read all SConscripts, we know what
391 # libraries will be built. Create list of
392 # libraries to give as objects to linking phase
393 mainlist = []
394 for tp in B.possible_types:
395         if not tp == 'player':
396                 mainlist += B.create_blender_liblist(env, tp)
397
398 if B.arguments.get('BF_PRIORITYLIST', '0')=='1':
399         B.propose_priorities()
400
401 dobj = B.buildinfo(env, "dynamic") + B.resources
402 thestatlibs, thelibincs = B.setup_staticlibs(env)
403 thesyslibs = B.setup_syslibs(env)
404
405 if 'blender' in B.targets or not env['WITH_BF_NOBLENDER']:
406         env.BlenderProg(B.root_build_dir, "blender", dobj + mainlist + thestatlibs, [], thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blender')
407 if env['WITH_BF_PLAYER']:
408         playerlist = B.create_blender_liblist(env, 'player')
409         playerlist += B.create_blender_liblist(env, 'intern')
410         playerlist += B.create_blender_liblist(env, 'extern')
411         env.BlenderProg(B.root_build_dir, "blenderplayer", dobj + playerlist, [], thestatlibs + thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blenderplayer')
412
413 ##### Now define some targets
414
415
416 #------------ INSTALL
417
418 #-- binaries
419 blenderinstall = []
420 if  env['OURPLATFORM']=='darwin':
421         for prg in B.program_list:
422                 bundle = '%s.app' % prg[0]
423                 bundledir = os.path.dirname(bundle)
424                 for dp, dn, df in os.walk(bundle):
425                         if '.svn' in dn:
426                                 dn.remove('.svn')
427                         dir=env['BF_INSTALLDIR']+dp[len(bundledir):]
428                         source=[dp+os.sep+f for f in df]
429                         blenderinstall.append(env.Install(dir=dir,source=source))
430 else:
431         if env['WITH_BF_FHS']:  dir= os.path.join(env['BF_INSTALLDIR'], 'bin')
432         else:                                   dir= env['BF_INSTALLDIR']
433         
434         blenderinstall = env.Install(dir=dir, source=B.program_list)
435
436 #-- .blender
437 #- dont do .blender and scripts for darwin, it is already in the bundle
438 dotblendlist = []
439 dottargetlist = []
440 scriptinstall = []
441
442 if  env['OURPLATFORM']!='darwin':
443                 for dp, dn, df in os.walk('bin/.blender'):
444                         if '.svn' in dn:
445                                 dn.remove('.svn')
446                         
447                         for f in df:
448                                 if not env['WITH_BF_INTERNATIONAL']:
449                                         if 'locale' in dp:
450                                                 continue
451                                         if f == '.Blanguages':
452                                                 continue
453                                 if not env['WITH_BF_FREETYPE']:
454                                         if f.endswith('.ttf'):
455                                                 continue
456                                 
457                                 dotblendlist.append(os.path.join(dp, f))
458                                 if env['WITH_BF_FHS']:  dir= os.path.join(*([BLENDERPATH] + dp.split(os.sep)[2:]))      # skip bin/.blender
459                                 else:                                   dir= os.path.join(*([BLENDERPATH] + dp.split(os.sep)[1:]))      # skip bin
460                                 
461                                 dottargetlist.append(dir + os.sep + f)
462                                         
463
464                 dotblenderinstall = []
465                 for targetdir,srcfile in zip(dottargetlist, dotblendlist):
466                         td, tf = os.path.split(targetdir)
467                         dotblenderinstall.append(env.Install(dir=td, source=srcfile))
468                 
469                 if env['WITH_BF_PYTHON']:
470                         #-- .blender/scripts
471                         scriptpaths=['release/scripts']
472                         for scriptpath in scriptpaths:
473                                 for dp, dn, df in os.walk(scriptpath):
474                                         if '.svn' in dn:
475                                                 dn.remove('.svn')
476                                         
477                                         if env['WITH_BF_FHS']:          dir = BLENDERPATH
478                                         else:                                           dir = os.path.join(env['BF_INSTALLDIR'], '.blender')                            
479                                         dir += os.sep + os.path.basename(scriptpath) + dp[len(scriptpath):]
480                                         
481                                         source=[os.path.join(dp, f) for f in df if f[-3:]!='pyc']
482                                         scriptinstall.append(env.Install(dir=dir,source=source))
483
484 #-- icons
485 if env['OURPLATFORM']=='linux2':
486         iconlist = []
487         icontargetlist = []
488
489         for tp, tn, tf in os.walk('release/freedesktop/icons'):
490                 if '.svn' in tn:
491                         tn.remove('.svn')
492                 for f in tf:
493                         iconlist.append(os.path.join(tp, f))
494                         icontargetlist.append( os.path.join(*([BLENDERPATH] + tp.split(os.sep)[2:] + [f])) )
495
496         iconinstall = []
497         for targetdir,srcfile in zip(icontargetlist, iconlist):
498                 td, tf = os.path.split(targetdir)
499                 iconinstall.append(env.Install(dir=td, source=srcfile))
500
501 # dlls for linuxcross
502 # TODO - add more libs, for now this lets blenderlite run
503 if env['OURPLATFORM']=='linuxcross':
504         dir=env['BF_INSTALLDIR']
505         source = []
506
507         if env['WITH_BF_OPENMP']:
508                 source += ['../lib/windows/pthreads/lib/pthreadGC2.dll']
509
510         scriptinstall.append(env.Install(dir=dir, source=source))
511
512 #-- plugins
513 pluglist = []
514 plugtargetlist = []
515 for tp, tn, tf in os.walk('release/plugins'):
516         if '.svn' in tn:
517                 tn.remove('.svn')
518         df = tp[8:] # remove 'release/'
519         for f in tf:
520                 pluglist.append(os.path.join(tp, f))
521                 plugtargetlist.append( os.path.join(BLENDERPATH, df, f) )
522
523
524 # header files for plugins
525 pluglist.append('source/blender/blenpluginapi/documentation.h')
526 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'documentation.h'))
527 pluglist.append('source/blender/blenpluginapi/externdef.h')
528 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'externdef.h'))
529 pluglist.append('source/blender/blenpluginapi/floatpatch.h')
530 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'floatpatch.h'))
531 pluglist.append('source/blender/blenpluginapi/iff.h')
532 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'iff.h'))
533 pluglist.append('source/blender/blenpluginapi/plugin.h')
534 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'plugin.h'))
535 pluglist.append('source/blender/blenpluginapi/util.h')
536 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'util.h'))
537 pluglist.append('source/blender/blenpluginapi/plugin.DEF')
538 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'plugin.def'))
539
540 plugininstall = []
541 for targetdir,srcfile in zip(plugtargetlist, pluglist):
542         td, tf = os.path.split(targetdir)
543         plugininstall.append(env.Install(dir=td, source=srcfile))
544
545 textlist = []
546 texttargetlist = []
547 for tp, tn, tf in os.walk('release/text'):
548         if '.svn' in tn:
549                 tn.remove('.svn')
550         for f in tf:
551                 textlist.append(tp+os.sep+f)
552
553 textinstall = env.Install(dir=BLENDERPATH, source=textlist)
554
555 if  env['OURPLATFORM']=='darwin':
556                 allinstall = [blenderinstall, plugininstall, textinstall]
557 elif env['OURPLATFORM']=='linux2':
558                 allinstall = [blenderinstall, dotblenderinstall, scriptinstall, plugininstall, textinstall, iconinstall]
559 else:
560                 allinstall = [blenderinstall, dotblenderinstall, scriptinstall, plugininstall, textinstall]
561
562 if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'win64-vc', 'linuxcross'):
563         dllsources = []
564
565         if not env['OURPLATFORM'] in ('win32-mingw', 'win64-vc', 'linuxcross'):
566                 # For MinGW and linuxcross static linking will be used
567                 dllsources += ['${LCGDIR}/gettext/lib/gnu_gettext.dll']
568
569         #currently win64-vc doesn't appear to have libpng.dll
570         if env['OURPLATFORM'] != 'win64-vc':
571                 dllsources += ['${BF_PNG_LIBPATH}/libpng.dll']
572
573         dllsources += ['${BF_ZLIB_LIBPATH}/zlib.dll']
574         # Used when linking to libtiff was dynamic
575         # keep it here until compilation on all platform would be ok
576         # dllsources += ['${BF_TIFF_LIBPATH}/${BF_TIFF_LIB}.dll']
577
578         if env['OURPLATFORM'] != 'linuxcross':
579                 # pthreads library is already added
580                 dllsources += ['${BF_PTHREADS_LIBPATH}/${BF_PTHREADS_LIB}.dll']
581
582         if env['WITH_BF_SDL']:
583                 if env['OURPLATFORM'] == 'win64-vc':
584                         pass # we link statically already to SDL on win64
585                 else:
586                         dllsources.append('${BF_SDL_LIBPATH}/SDL.dll')
587
588         if env['WITH_BF_PYTHON']:
589                 if env['BF_DEBUG']:
590                         dllsources.append('${BF_PYTHON_LIBPATH}/${BF_PYTHON_DLL}_d.dll')
591                 else:
592                         dllsources.append('${BF_PYTHON_LIBPATH}/${BF_PYTHON_DLL}.dll')
593
594         if env['WITH_BF_ICONV']:
595                 if env['OURPLATFORM'] == 'win64-vc':
596                         pass # we link statically to iconv on win64
597                 elif not env['OURPLATFORM'] in ('win32-mingw', 'linuxcross'):
598                         #gettext for MinGW and cross-compilation is compiled staticly
599                         dllsources += ['${BF_ICONV_LIBPATH}/iconv.dll']
600
601         if env['WITH_BF_OPENAL']:
602                 dllsources.append('${LCGDIR}/openal/lib/OpenAL32.dll')
603                 dllsources.append('${LCGDIR}/openal/lib/wrap_oal.dll')
604
605         if env['WITH_BF_SNDFILE']:
606                 dllsources.append('${LCGDIR}/sndfile/lib/libsndfile-1.dll')
607
608         if env['WITH_BF_FFMPEG']:
609                 dllsources += ['${BF_FFMPEG_LIBPATH}/avcodec-52.dll',
610                                         '${BF_FFMPEG_LIBPATH}/avformat-52.dll',
611                                         '${BF_FFMPEG_LIBPATH}/avdevice-52.dll',
612                                         '${BF_FFMPEG_LIBPATH}/avutil-50.dll',
613                                         '${BF_FFMPEG_LIBPATH}/swscale-0.dll']
614
615         if env['WITH_BF_JACK']:
616                 dllsources += ['${LCGDIR}/jack/lib/libjack.dll']
617         windlls = env.Install(dir=env['BF_INSTALLDIR'], source = dllsources)
618         allinstall += windlls
619
620 installtarget = env.Alias('install', allinstall)
621 bininstalltarget = env.Alias('install-bin', blenderinstall)
622
623 nsisaction = env.Action(btools.NSIS_Installer, btools.NSIS_print)
624 nsiscmd = env.Command('nsisinstaller', None, nsisaction)
625 nsisalias = env.Alias('nsis', nsiscmd)
626
627 if 'blender' in B.targets:
628         blenderexe= env.Alias('blender', B.program_list)
629         Depends(blenderexe,installtarget)
630
631 if env['WITH_BF_PLAYER']:
632         blenderplayer = env.Alias('blenderplayer', B.program_list)
633         Depends(blenderplayer,installtarget)
634
635 if not env['WITH_BF_GAMEENGINE']:
636         blendernogame = env.Alias('blendernogame', B.program_list)
637         Depends(blendernogame,installtarget)
638
639 if 'blenderlite' in B.targets:
640         blenderlite = env.Alias('blenderlite', B.program_list)
641         Depends(blenderlite,installtarget)
642
643 Depends(nsiscmd, allinstall)
644
645 Default(B.program_list)
646
647 if not env['WITHOUT_BF_INSTALL']:
648                 Default(installtarget)
649
650 #------------ EPYDOC
651 if env['WITH_BF_DOCS']:
652     try:
653         import epydoc
654     except ImportError:
655         epydoc = None
656
657     if epydoc:
658         SConscript('source/gameengine/PyDoc/SConscript')
659     else:
660         print "No epydoc install detected, Python API and Gameengine API Docs will not be generated "
661
662