Patch [#22339] File/installation paths changes
[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 datafileslist = []
441 datafilestargetlist = []
442 dottargetlist = []
443 scriptinstall = []
444
445 if  env['OURPLATFORM']!='darwin':
446                 for dp, dn, df in os.walk('bin/.blender'):
447                         if '.svn' in dn:
448                                 dn.remove('.svn')
449                         
450                         for f in df:
451                                 if not env['WITH_BF_INTERNATIONAL']:
452                                         if 'locale' in dp:
453                                                 continue
454                                         if f == '.Blanguages':
455                                                 continue
456                                 if not env['WITH_BF_FREETYPE']:
457                                         if f.endswith('.ttf'):
458                                                 continue
459                                 
460                                 if 'locale' in dp:
461                                         datafileslist.append(os.path.join(dp,f))
462                                         if env['WITH_BF_FHS']:  dir= os.path.join(*([BLENDERPATH] + ['datafiles'] + dp.split(os.sep)[2:]))      # skip bin/.blender
463                                         else:                                   dir= os.path.join(*([BLENDERPATH] + ['.blender'] + ['datafiles'] + dp.split(os.sep)[1:]))       # skip bin
464                                         datafilestargetlist.append(dir + os.sep + f)
465
466                                 else:
467                                         dotblendlist.append(os.path.join(dp, f))
468                                         if env['WITH_BF_FHS']:  dir= os.path.join(*([BLENDERPATH] + ['config'] + dp.split(os.sep)[2:])) # skip bin/.blender
469                                         else:                                   dir= os.path.join(*([BLENDERPATH] + ['.blender'] + ['config'] + dp.split(os.sep)[1:]))  # skip bin
470                                         
471                                         dottargetlist.append(dir + os.sep + f)
472                                         
473                 dotblenderinstall = []
474                 for targetdir,srcfile in zip(dottargetlist, dotblendlist):
475                         td, tf = os.path.split(targetdir)
476                         dotblenderinstall.append(env.Install(dir=td, source=srcfile))
477                 for targetdir,srcfile in zip(datafilestargetlist, datafileslist):
478                         td, tf = os.path.split(targetdir)
479                         dotblenderinstall.append(env.Install(dir=td, source=srcfile))
480                 
481                 if env['WITH_BF_PYTHON']:
482                         #-- .blender/scripts
483                         scriptpaths=['release/scripts']
484                         for scriptpath in scriptpaths:
485                                 for dp, dn, df in os.walk(scriptpath):
486                                         if '.svn' in dn:
487                                                 dn.remove('.svn')
488                                         
489                                         if env['WITH_BF_FHS']:          dir = BLENDERPATH
490                                         else:                                           dir = os.path.join(env['BF_INSTALLDIR'], '.blender')                            
491                                         dir += os.sep + os.path.basename(scriptpath) + dp[len(scriptpath):]
492                                         
493                                         source=[os.path.join(dp, f) for f in df if f[-3:]!='pyc']
494                                         scriptinstall.append(env.Install(dir=dir,source=source))
495
496 #-- icons
497 if env['OURPLATFORM']=='linux2':
498         iconlist = []
499         icontargetlist = []
500
501         for tp, tn, tf in os.walk('release/freedesktop/icons'):
502                 if '.svn' in tn:
503                         tn.remove('.svn')
504                 for f in tf:
505                         iconlist.append(os.path.join(tp, f))
506                         icontargetlist.append( os.path.join(*([BLENDERPATH] + tp.split(os.sep)[2:] + [f])) )
507
508         iconinstall = []
509         for targetdir,srcfile in zip(icontargetlist, iconlist):
510                 td, tf = os.path.split(targetdir)
511                 iconinstall.append(env.Install(dir=td, source=srcfile))
512
513 # dlls for linuxcross
514 # TODO - add more libs, for now this lets blenderlite run
515 if env['OURPLATFORM']=='linuxcross':
516         dir=env['BF_INSTALLDIR']
517         source = []
518
519         if env['WITH_BF_OPENMP']:
520                 source += ['../lib/windows/pthreads/lib/pthreadGC2.dll']
521
522         scriptinstall.append(env.Install(dir=dir, source=source))
523
524 #-- plugins
525 pluglist = []
526 plugtargetlist = []
527 for tp, tn, tf in os.walk('release/plugins'):
528         if '.svn' in tn:
529                 tn.remove('.svn')
530         df = tp[8:] # remove 'release/'
531         for f in tf:
532                 pluglist.append(os.path.join(tp, f))
533                 plugtargetlist.append( os.path.join(BLENDERPATH, df, f) )
534
535
536 # header files for plugins
537 pluglist.append('source/blender/blenpluginapi/documentation.h')
538 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'documentation.h'))
539 pluglist.append('source/blender/blenpluginapi/externdef.h')
540 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'externdef.h'))
541 pluglist.append('source/blender/blenpluginapi/floatpatch.h')
542 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'floatpatch.h'))
543 pluglist.append('source/blender/blenpluginapi/iff.h')
544 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'iff.h'))
545 pluglist.append('source/blender/blenpluginapi/plugin.h')
546 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'plugin.h'))
547 pluglist.append('source/blender/blenpluginapi/util.h')
548 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'util.h'))
549 pluglist.append('source/blender/blenpluginapi/plugin.DEF')
550 plugtargetlist.append(os.path.join(BLENDERPATH, 'plugins', 'include', 'plugin.def'))
551
552 plugininstall = []
553 for targetdir,srcfile in zip(plugtargetlist, pluglist):
554         td, tf = os.path.split(targetdir)
555         plugininstall.append(env.Install(dir=td, source=srcfile))
556
557 textlist = []
558 texttargetlist = []
559 for tp, tn, tf in os.walk('release/text'):
560         if '.svn' in tn:
561                 tn.remove('.svn')
562         for f in tf:
563                 textlist.append(tp+os.sep+f)
564
565 textinstall = env.Install(dir=BLENDERPATH, source=textlist)
566
567 if  env['OURPLATFORM']=='darwin':
568                 allinstall = [blenderinstall, plugininstall, textinstall]
569 elif env['OURPLATFORM']=='linux2':
570                 allinstall = [blenderinstall, dotblenderinstall, scriptinstall, plugininstall, textinstall, iconinstall]
571 else:
572                 allinstall = [blenderinstall, dotblenderinstall, scriptinstall, plugininstall, textinstall]
573
574 if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'win64-vc', 'linuxcross'):
575         dllsources = []
576
577         if not env['OURPLATFORM'] in ('win32-mingw', 'win64-vc', 'linuxcross'):
578                 # For MinGW and linuxcross static linking will be used
579                 dllsources += ['${LCGDIR}/gettext/lib/gnu_gettext.dll']
580
581         #currently win64-vc doesn't appear to have libpng.dll
582         if env['OURPLATFORM'] != 'win64-vc':
583                 dllsources += ['${BF_PNG_LIBPATH}/libpng.dll']
584
585         dllsources += ['${BF_ZLIB_LIBPATH}/zlib.dll']
586         # Used when linking to libtiff was dynamic
587         # keep it here until compilation on all platform would be ok
588         # dllsources += ['${BF_TIFF_LIBPATH}/${BF_TIFF_LIB}.dll']
589
590         if env['OURPLATFORM'] != 'linuxcross':
591                 # pthreads library is already added
592                 dllsources += ['${BF_PTHREADS_LIBPATH}/${BF_PTHREADS_LIB}.dll']
593
594         if env['WITH_BF_SDL']:
595                 if env['OURPLATFORM'] == 'win64-vc':
596                         pass # we link statically already to SDL on win64
597                 else:
598                         dllsources.append('${BF_SDL_LIBPATH}/SDL.dll')
599
600         if env['WITH_BF_PYTHON']:
601                 if env['BF_DEBUG']:
602                         dllsources.append('${BF_PYTHON_LIBPATH}/${BF_PYTHON_DLL}_d.dll')
603                 else:
604                         dllsources.append('${BF_PYTHON_LIBPATH}/${BF_PYTHON_DLL}.dll')
605
606         if env['WITH_BF_ICONV']:
607                 if env['OURPLATFORM'] == 'win64-vc':
608                         pass # we link statically to iconv on win64
609                 elif not env['OURPLATFORM'] in ('win32-mingw', 'linuxcross'):
610                         #gettext for MinGW and cross-compilation is compiled staticly
611                         dllsources += ['${BF_ICONV_LIBPATH}/iconv.dll']
612
613         if env['WITH_BF_OPENAL']:
614                 dllsources.append('${LCGDIR}/openal/lib/OpenAL32.dll')
615                 dllsources.append('${LCGDIR}/openal/lib/wrap_oal.dll')
616
617         if env['WITH_BF_SNDFILE']:
618                 dllsources.append('${LCGDIR}/sndfile/lib/libsndfile-1.dll')
619
620         if env['WITH_BF_FFMPEG']:
621                 dllsources += ['${BF_FFMPEG_LIBPATH}/avcodec-52.dll',
622                                         '${BF_FFMPEG_LIBPATH}/avformat-52.dll',
623                                         '${BF_FFMPEG_LIBPATH}/avdevice-52.dll',
624                                         '${BF_FFMPEG_LIBPATH}/avutil-50.dll',
625                                         '${BF_FFMPEG_LIBPATH}/swscale-0.dll']
626
627         if env['WITH_BF_JACK']:
628                 dllsources += ['${LCGDIR}/jack/lib/libjack.dll']
629         windlls = env.Install(dir=env['BF_INSTALLDIR'], source = dllsources)
630         allinstall += windlls
631
632 installtarget = env.Alias('install', allinstall)
633 bininstalltarget = env.Alias('install-bin', blenderinstall)
634
635 nsisaction = env.Action(btools.NSIS_Installer, btools.NSIS_print)
636 nsiscmd = env.Command('nsisinstaller', None, nsisaction)
637 nsisalias = env.Alias('nsis', nsiscmd)
638
639 if 'blender' in B.targets:
640         blenderexe= env.Alias('blender', B.program_list)
641         Depends(blenderexe,installtarget)
642
643 if env['WITH_BF_PLAYER']:
644         blenderplayer = env.Alias('blenderplayer', B.program_list)
645         Depends(blenderplayer,installtarget)
646
647 if not env['WITH_BF_GAMEENGINE']:
648         blendernogame = env.Alias('blendernogame', B.program_list)
649         Depends(blendernogame,installtarget)
650
651 if 'blenderlite' in B.targets:
652         blenderlite = env.Alias('blenderlite', B.program_list)
653         Depends(blenderlite,installtarget)
654
655 Depends(nsiscmd, allinstall)
656
657 Default(B.program_list)
658
659 if not env['WITHOUT_BF_INSTALL']:
660                 Default(installtarget)
661
662 #------------ EPYDOC
663 if env['WITH_BF_DOCS']:
664     try:
665         import epydoc
666     except ImportError:
667         epydoc = None
668
669     if epydoc:
670         SConscript('source/gameengine/PyDoc/SConscript')
671     else:
672         print "No epydoc install detected, Python API and Gameengine API Docs will not be generated "
673
674