Show whether BF_DEBUG=1 or 0 in output.
[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 print B.bc.OKGREEN + "Build with debug symbols%s: %s" % (B.bc.ENDC, env['BF_DEBUG'])
205
206 # BLENDERPATH is a unix only option to enable typical style paths this is
207 # spesifically a data-dir, which is used a lot but cant replace BF_INSTALLDIR
208 # because the blender binary is installed in $BF_INSTALLDIR/bin/blender
209
210 if env['WITH_BF_FHS']:
211         BLENDERPATH = os.path.join(env['BF_INSTALLDIR'], 'share', 'blender', env['BF_VERSION'])
212 else:
213         BLENDERPATH = env['BF_INSTALLDIR']
214
215 if env['WITH_BF_OPENMP'] == 1:
216                 if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
217                                 env['CCFLAGS'].append('/openmp')
218                                 env['CPPFLAGS'].append('/openmp')
219                                 env['CXXFLAGS'].append('/openmp')
220                 else:
221                         if env['CC'].endswith('icc'): # to be able to handle CC=/opt/bla/icc case
222                                 env.Append(LINKFLAGS=['-openmp', '-static-intel'])
223                                 env['CCFLAGS'].append('-openmp')
224                                 env['CPPFLAGS'].append('-openmp')
225                                 env['CXXFLAGS'].append('-openmp')
226                         else:
227                                 env.Append(CCFLAGS=['-fopenmp']) 
228                                 env.Append(CPPFLAGS=['-fopenmp'])
229                                 env.Append(CXXFLAGS=['-fopenmp'])
230
231 if env['WITH_GHOST_COCOA'] == True:
232         env.Append(CFLAGS=['-DGHOST_COCOA']) 
233         env.Append(CXXFLAGS=['-DGHOST_COCOA'])
234         env.Append(CPPFLAGS=['-DGHOST_COCOA'])
235     
236 if env['USE_QTKIT'] == True:
237         env.Append(CFLAGS=['-DUSE_QTKIT']) 
238         env.Append(CXXFLAGS=['-DUSE_QTKIT'])
239         env.Append(CPPFLAGS=['-DUSE_QTKIT'])
240
241 #check for additional debug libnames
242
243 if env.has_key('BF_DEBUG_LIBS'):
244         B.quickdebug += env['BF_DEBUG_LIBS']
245
246 printdebug = B.arguments.get('BF_LISTDEBUG', 0)
247
248 if len(B.quickdebug) > 0 and printdebug != 0:
249         print B.bc.OKGREEN + "Buildings these libs with debug symbols:" + B.bc.ENDC
250         for l in B.quickdebug:
251                 print "\t" + l
252
253 # remove stdc++ from LLIBS if we are building a statc linked CXXFLAGS
254 if env['WITH_BF_STATICCXX']:
255         if 'stdc++' in env['LLIBS']:
256                 env['LLIBS'].remove('stdc++')
257         else:
258                 print '\tcould not remove stdc++ library from LLIBS, WITH_BF_STATICCXX may not work for your platform'
259
260 # check target for blenderplayer. Set WITH_BF_PLAYER if found on cmdline
261 if 'blenderplayer' in B.targets:
262         env['WITH_BF_PLAYER'] = True
263
264 if 'blendernogame' in B.targets:
265         env['WITH_BF_GAMEENGINE'] = False
266
267 if 'blenderlite' in B.targets:
268         target_env_defs = {}
269         target_env_defs['WITH_BF_GAMEENGINE'] = False
270         target_env_defs['WITH_BF_OPENAL'] = False
271         target_env_defs['WITH_BF_OPENEXR'] = False
272         target_env_defs['WITH_BF_OPENMP'] = False
273         target_env_defs['WITH_BF_ICONV'] = False
274         target_env_defs['WITH_BF_INTERNATIONAL'] = False
275         target_env_defs['WITH_BF_OPENJPEG'] = False
276         target_env_defs['WITH_BF_FFMPEG'] = False
277         target_env_defs['WITH_BF_QUICKTIME'] = False
278         target_env_defs['WITH_BF_REDCODE'] = False
279         target_env_defs['WITH_BF_DDS'] = False
280         target_env_defs['WITH_BF_ZLIB'] = False
281         target_env_defs['WITH_BF_SDL'] = False
282         target_env_defs['WITH_BF_JPEG'] = False
283         target_env_defs['WITH_BF_PNG'] = False
284         target_env_defs['WITH_BF_BULLET'] = False
285         target_env_defs['WITH_BF_BINRELOC'] = False
286         target_env_defs['BF_BUILDINFO'] = False
287         target_env_defs['BF_NO_ELBEEM'] = True
288         target_env_defs['WITH_BF_PYTHON'] = False
289         
290         # Merge blenderlite, let command line to override
291         for k,v in target_env_defs.iteritems():
292                 if k not in B.arguments:
293                         env[k] = v
294
295 # disable elbeem (fluidsim) compilation?
296 if env['BF_NO_ELBEEM'] == 1:
297         env['CPPFLAGS'].append('-DDISABLE_ELBEEM')
298         env['CXXFLAGS'].append('-DDISABLE_ELBEEM')
299         env['CCFLAGS'].append('-DDISABLE_ELBEEM')
300
301 if env['WITH_BF_SDL'] == False and env['OURPLATFORM'] in ('win32-vc', 'win32-ming', 'win64-vc'):
302         env['PLATFORM_LINKFLAGS'].remove('/ENTRY:mainCRTStartup')
303         env['PLATFORM_LINKFLAGS'].append('/ENTRY:main')
304
305 # lastly we check for root_build_dir ( we should not do before, otherwise we might do wrong builddir
306 B.root_build_dir = env['BF_BUILDDIR']
307 B.doc_build_dir = os.path.join(BLENDERPATH, 'doc')
308 if not B.root_build_dir[-1]==os.sep:
309         B.root_build_dir += os.sep
310 if not B.doc_build_dir[-1]==os.sep:
311         B.doc_build_dir += os.sep
312         
313 # We do a shortcut for clean when no quicklist is given: just delete
314 # builddir without reading in SConscripts
315 do_clean = None
316 if 'clean' in B.targets:
317         do_clean = True
318
319 if not quickie and do_clean:
320         if os.path.exists(B.doc_build_dir):
321                 print B.bc.HEADER+'Cleaning doc dir...'+B.bc.ENDC
322                 dirs = os.listdir(B.doc_build_dir)
323                 for entry in dirs:
324                         if os.path.isdir(B.doc_build_dir + entry) == 1:
325                                 print "clean dir %s"%(B.doc_build_dir+entry)
326                                 shutil.rmtree(B.doc_build_dir+entry)
327                         else: # remove file
328                                 print "remove file %s"%(B.doc_build_dir+entry)
329                                 os.remove(B.root_build_dir+entry)
330         if os.path.exists(B.root_build_dir):
331                 print B.bc.HEADER+'Cleaning build dir...'+B.bc.ENDC
332                 dirs = os.listdir(B.root_build_dir)
333                 for entry in dirs:
334                         if os.path.isdir(B.root_build_dir + entry) == 1:
335                                 print "clean dir %s"%(B.root_build_dir+entry)
336                                 shutil.rmtree(B.root_build_dir+entry)
337                         else: # remove file
338                                 print "remove file %s"%(B.root_build_dir+entry)
339                                 os.remove(B.root_build_dir+entry)
340                 for confile in ['extern/ffmpeg/config.mak', 'extern/x264/config.mak',
341                                 'extern/xvidcore/build/generic/platform.inc', 'extern/ffmpeg/include']:
342                         if os.path.exists(confile):
343                                 print "clean file %s"%confile
344                                 if os.path.isdir(confile):
345                                         for root, dirs, files in os.walk(confile):
346                                                 for name in files:
347                                                         os.remove(os.path.join(root, name))
348                                 else:
349                                         os.remove(confile)
350                 print B.bc.OKGREEN+'...done'+B.bc.ENDC
351         else:
352                 print B.bc.HEADER+'Already Clean, nothing to do.'+B.bc.ENDC
353         Exit()
354
355 if not os.path.isdir ( B.root_build_dir):
356         os.makedirs ( B.root_build_dir )
357         os.makedirs ( B.root_build_dir + 'source' )
358         os.makedirs ( B.root_build_dir + 'intern' )
359         os.makedirs ( B.root_build_dir + 'extern' )
360         os.makedirs ( B.root_build_dir + 'lib' )
361         os.makedirs ( B.root_build_dir + 'bin' )
362 if not os.path.isdir(B.doc_build_dir) and env['WITH_BF_DOCS']:
363         os.makedirs ( B.doc_build_dir )
364
365 Help(opts.GenerateHelpText(env))
366
367 # default is new quieter output, but if you need to see the 
368 # commands, do 'scons BF_QUIET=0'
369 bf_quietoutput = B.arguments.get('BF_QUIET', '1')
370 if env['BF_QUIET']:
371         B.set_quiet_output(env)
372 else:
373         if toolset=='msvc':
374                 B.msvc_hack(env)
375
376 print B.bc.HEADER+'Building in: ' + B.bc.ENDC + os.path.abspath(B.root_build_dir)
377 env.SConsignFile(B.root_build_dir+'scons-signatures')
378 B.init_lib_dict()
379
380 ##### END SETUP ##########
381
382 Export('env')
383
384 BuildDir(B.root_build_dir+'/intern', 'intern', duplicate=0)
385 SConscript(B.root_build_dir+'/intern/SConscript')
386 BuildDir(B.root_build_dir+'/extern', 'extern', duplicate=0)
387 SConscript(B.root_build_dir+'/extern/SConscript')
388 BuildDir(B.root_build_dir+'/source', 'source', duplicate=0)
389 SConscript(B.root_build_dir+'/source/SConscript')
390
391 # now that we have read all SConscripts, we know what
392 # libraries will be built. Create list of
393 # libraries to give as objects to linking phase
394 mainlist = []
395 for tp in B.possible_types:
396         if not tp == 'player':
397                 mainlist += B.create_blender_liblist(env, tp)
398
399 if B.arguments.get('BF_PRIORITYLIST', '0')=='1':
400         B.propose_priorities()
401
402 dobj = B.buildinfo(env, "dynamic") + B.resources
403 thestatlibs, thelibincs = B.setup_staticlibs(env)
404 thesyslibs = B.setup_syslibs(env)
405
406 if 'blender' in B.targets or not env['WITH_BF_NOBLENDER']:
407         env.BlenderProg(B.root_build_dir, "blender", dobj + mainlist + thestatlibs, [], thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blender')
408 if env['WITH_BF_PLAYER']:
409         playerlist = B.create_blender_liblist(env, 'player')
410         playerlist += B.create_blender_liblist(env, 'intern')
411         playerlist += B.create_blender_liblist(env, 'extern')
412         env.BlenderProg(B.root_build_dir, "blenderplayer", dobj + playerlist, [], thestatlibs + thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blenderplayer')
413
414 ##### Now define some targets
415
416
417 #------------ INSTALL
418
419 #-- binaries
420 blenderinstall = []
421 if  env['OURPLATFORM']=='darwin':
422         for prg in B.program_list:
423                 bundle = '%s.app' % prg[0]
424                 bundledir = os.path.dirname(bundle)
425                 for dp, dn, df in os.walk(bundle):
426                         if '.svn' in dn:
427                                 dn.remove('.svn')
428                         dir=env['BF_INSTALLDIR']+dp[len(bundledir):]
429                         source=[dp+os.sep+f for f in df]
430                         blenderinstall.append(env.Install(dir=dir,source=source))
431 else:
432         if env['WITH_BF_FHS']:  dir= os.path.join(env['BF_INSTALLDIR'], 'bin')
433         else:                                   dir= env['BF_INSTALLDIR']
434         
435         blenderinstall = env.Install(dir=dir, source=B.program_list)
436
437 #-- .blender
438 #- dont do .blender and scripts for darwin, it is already in the bundle
439 dotblendlist = []
440 dottargetlist = []
441 scriptinstall = []
442
443 if  env['OURPLATFORM']!='darwin':
444                 for dp, dn, df in os.walk('bin/.blender'):
445                         if '.svn' in dn:
446                                 dn.remove('.svn')
447                         
448                         for f in df:
449                                 if not env['WITH_BF_INTERNATIONAL']:
450                                         if 'locale' in dp:
451                                                 continue
452                                         if f == '.Blanguages':
453                                                 continue
454                                 if not env['WITH_BF_FREETYPE']:
455                                         if f.endswith('.ttf'):
456                                                 continue
457                                 
458                                 dotblendlist.append(os.path.join(dp, f))
459                                 if env['WITH_BF_FHS']:  dir= os.path.join(*([BLENDERPATH] + dp.split(os.sep)[2:]))      # skip bin/.blender
460                                 else:                                   dir= os.path.join(*([BLENDERPATH] + dp.split(os.sep)[1:]))      # skip bin
461                                 
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
574         dllsources += ['${BF_ZLIB_LIBPATH}/zlib.dll']
575         # Used when linking to libtiff was dynamic
576         # keep it here until compilation on all platform would be ok
577         # dllsources += ['${BF_TIFF_LIBPATH}/${BF_TIFF_LIB}.dll']
578
579         if env['OURPLATFORM'] != 'linuxcross':
580                 # pthreads library is already added
581                 dllsources += ['${BF_PTHREADS_LIBPATH}/${BF_PTHREADS_LIB}.dll']
582
583         if env['WITH_BF_SDL']:
584                 if env['OURPLATFORM'] == 'win64-vc':
585                         pass # we link statically already to SDL on win64
586                 else:
587                         dllsources.append('${BF_SDL_LIBPATH}/SDL.dll')
588
589         if env['WITH_BF_PYTHON']:
590                 if env['BF_DEBUG']:
591                         dllsources.append('${BF_PYTHON_LIBPATH}/${BF_PYTHON_DLL}_d.dll')
592                 else:
593                         dllsources.append('${BF_PYTHON_LIBPATH}/${BF_PYTHON_DLL}.dll')
594
595         if env['WITH_BF_ICONV']:
596                 if env['OURPLATFORM'] == 'win64-vc':
597                         pass # we link statically to iconv on win64
598                 elif not env['OURPLATFORM'] in ('win32-mingw', 'linuxcross'):
599                         #gettext for MinGW and cross-compilation is compiled staticly
600                         dllsources += ['${BF_ICONV_LIBPATH}/iconv.dll']
601
602         if env['WITH_BF_OPENAL']:
603                 dllsources.append('${LCGDIR}/openal/lib/OpenAL32.dll')
604                 dllsources.append('${LCGDIR}/openal/lib/wrap_oal.dll')
605
606         if env['WITH_BF_SNDFILE']:
607                 dllsources.append('${LCGDIR}/sndfile/lib/libsndfile-1.dll')
608
609         if env['WITH_BF_FFMPEG']:
610                 dllsources += ['${BF_FFMPEG_LIBPATH}/avcodec-52.dll',
611                                         '${BF_FFMPEG_LIBPATH}/avformat-52.dll',
612                                         '${BF_FFMPEG_LIBPATH}/avdevice-52.dll',
613                                         '${BF_FFMPEG_LIBPATH}/avutil-50.dll',
614                                         '${BF_FFMPEG_LIBPATH}/swscale-0.dll']
615
616         if env['WITH_BF_JACK']:
617                 dllsources += ['${LCGDIR}/jack/lib/libjack.dll']
618         windlls = env.Install(dir=env['BF_INSTALLDIR'], source = dllsources)
619         allinstall += windlls
620
621 installtarget = env.Alias('install', allinstall)
622 bininstalltarget = env.Alias('install-bin', blenderinstall)
623
624 nsisaction = env.Action(btools.NSIS_Installer, btools.NSIS_print)
625 nsiscmd = env.Command('nsisinstaller', None, nsisaction)
626 nsisalias = env.Alias('nsis', nsiscmd)
627
628 if 'blender' in B.targets:
629         blenderexe= env.Alias('blender', B.program_list)
630         Depends(blenderexe,installtarget)
631
632 if env['WITH_BF_PLAYER']:
633         blenderplayer = env.Alias('blenderplayer', B.program_list)
634         Depends(blenderplayer,installtarget)
635
636 if not env['WITH_BF_GAMEENGINE']:
637         blendernogame = env.Alias('blendernogame', B.program_list)
638         Depends(blendernogame,installtarget)
639
640 if 'blenderlite' in B.targets:
641         blenderlite = env.Alias('blenderlite', B.program_list)
642         Depends(blenderlite,installtarget)
643
644 Depends(nsiscmd, allinstall)
645
646 Default(B.program_list)
647
648 if not env['WITHOUT_BF_INSTALL']:
649                 Default(installtarget)
650
651 #------------ EPYDOC
652 if env['WITH_BF_DOCS']:
653     try:
654         import epydoc
655     except ImportError:
656         epydoc = None
657
658     if epydoc:
659         SConscript('source/gameengine/PyDoc/SConscript')
660     else:
661         print "No epydoc install detected, Python API and Gameengine API Docs will not be generated "
662
663