root/branches/libffado-2.0/SConstruct

Revision 1371, 21.0 kB (checked in by ppalmers, 12 years ago)

* implement our own code to do FCP transactions. the code from libavc had too much side-effects.
* remove libavc1394 as a dependency
* set the SPLIT_TIMEOUT value for the host controller such that late responses by the DM1x00 based devices are not discarded. Should fix the issues with FA-101 discovery. (re:
#155, #162)

Line 
1 #! /usr/bin/python
2 #
3 # Copyright (C) 2007-2008 Arnold Krille
4 # Copyright (C) 2007-2008 Pieter Palmers
5 # Copyright (C) 2008 Jonathan Woithe
6 #
7 # This file is part of FFADO
8 # FFADO = Free Firewire (pro-)audio drivers for linux
9 #
10 # FFADO is based upon FreeBoB.
11 #
12 # This program is free software: you can redistribute it and/or modify
13 # it under the terms of the GNU General Public License as published by
14 # the Free Software Foundation, either version 2 of the License, or
15 # (at your option) version 3 of the License.
16 #
17 # This program is distributed in the hope that it will be useful,
18 # but WITHOUT ANY WARRANTY; without even the implied warranty of
19 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 # GNU General Public License for more details.
21 #
22 # You should have received a copy of the GNU General Public License
23 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
24 #
25
26 FFADO_API_VERSION="8"
27 FFADO_VERSION="1.999.37"
28
29 import os
30 import re
31 from string import Template
32 import imp
33
34 build_dir = ARGUMENTS.get('BUILDDIR', "")
35 if build_dir:
36         build_base=build_dir+'/'
37         if not os.path.isdir( build_base ):
38                 os.makedirs( build_base )
39         print "Building into: " + build_base
40 else:
41         build_base=''
42
43 destdir = ARGUMENTS.get( 'DESTDIR', "" )
44
45 if not os.path.isdir( "cache" ):
46         os.makedirs( "cache" )
47
48 opts = Options( "cache/"+build_base+"options.cache" )
49
50 #
51 # If this is just to display a help-text for the variable used via ARGUMENTS, then its wrong...
52 opts.Add( "BUILDDIR", "Path to place the built files in", "")
53
54 opts.AddOptions(
55         BoolOption( "DEBUG", """\
56 Toggle debug-build. DEBUG means \"-g -Wall\" and more, otherwise we will use
57   \"-O2\" to optimise.""", True ),
58         BoolOption( "PROFILE", "Build with symbols and other profiling info", False ),
59         PathOption( "PREFIX", "The prefix where ffado will be installed to.", "/usr/local", PathOption.PathAccept ),
60         PathOption( "BINDIR", "Overwrite the directory where apps are installed to.", "$PREFIX/bin", PathOption.PathAccept ),
61         PathOption( "LIBDIR", "Overwrite the directory where libs are installed to.", "$PREFIX/lib", PathOption.PathAccept ),
62         PathOption( "INCLUDEDIR", "Overwrite the directory where headers are installed to.", "$PREFIX/include", PathOption.PathAccept ),
63         PathOption( "SHAREDIR", "Overwrite the directory where misc shared files are installed to.", "$PREFIX/share/libffado", PathOption.PathAccept ),
64         BoolOption( "ENABLE_BEBOB", "Enable/Disable the bebob part.", True ),
65         BoolOption( "ENABLE_FIREWORKS", "Enable/Disable the ECHO Audio FireWorks AV/C part.", True ),
66         BoolOption( "ENABLE_MOTU", "Enable/Disable the MOTU part.", True ),
67         BoolOption( "ENABLE_GENERICAVC", """\
68 Enable/Disable the the generic avc part (mainly used by apple).
69   Note that disabling this option might be overwritten by other devices needing
70   this code.""", False ),
71         BoolOption( "ENABLE_ALL", "Enable/Disable support for all devices.", False ),
72         BoolOption( "SERIALIZE_USE_EXPAT", "Use libexpat for XML serialization.", False ),
73         BoolOption( "BUILD_TESTS", """\
74 Build the tests in their directory. As some contain quite some functionality,
75   this is on by default.
76   If you just want to use ffado with jack without the tools, you can disable this.\
77 """, True ),
78     BoolOption( "BUILD_STATIC_TOOLS", "Build a statically linked version of the FFADO tools.", False ),
79     EnumOption('DIST_TARGET', 'Build target for cross compiling packagers', 'auto', allowed_values=('auto', 'i386', 'i686', 'x86_64', 'powerpc', 'powerpc64', 'none' ), ignorecase=2),
80     BoolOption( "ENABLE_OPTIMIZATIONS", "Enable optimizations and the use of processor specific extentions (MMX/SSE/...).", False ),
81
82         )
83
84 ## Load the builders in config
85 buildenv=os.environ
86 vars_to_check = [
87         'PATH',
88         'PKG_CONFIG_PATH',
89         'LD_LIBRARY_PATH',
90         'XDG_CONFIG_DIRS',
91         'XDG_DATA_DIRS',
92         'HOME',
93 ]
94 for var in vars_to_check:
95         if os.environ.has_key(var):
96                 buildenv[var]=os.environ[var]
97         else:
98                 buildenv[var]=''
99
100 env = Environment( tools=['default','scanreplace','pyuic','pyuic4','dbus','doxygen','pkgconfig'], toolpath=['admin'], ENV = buildenv, options=opts )
101
102 if os.environ.has_key('CC'):
103         env['CC'] = os.environ['CC']
104 if os.environ.has_key('CXX'):
105         env['CXX'] = os.environ['CXX']
106
107 # grab OS CFLAGS / CCFLAGS
108 env['OS_CFLAGS']=[]
109 if os.environ.has_key('CFLAGS'):
110         env['OS_CFLAGS'] = os.environ['CFLAGS']
111 env['OS_CCFLAGS']=[]
112 if os.environ.has_key('CCFLAGS'):
113         env['OS_CCFLAGS'] = os.environ['CCFLAGS']
114
115 Help( """
116 For building ffado you can set different options as listed below. You have to
117 specify them only once, scons will save the last value you used and re-use
118 that.
119 To really undo your settings and return to the factory defaults, remove the
120 "cache"-folder and the file ".sconsign.dblite" from this directory.
121 For example with: "rm -Rf .sconsign.dblite cache"
122
123 Note that this is a development version! Don't complain if its not working!
124 See www.ffado.org for stable releases.
125 """ )
126 Help( opts.GenerateHelpText( env ) )
127
128 # make sure the necessary dirs exist
129 if not os.path.isdir( "cache/" + build_base ):
130         os.makedirs( "cache/" + build_base )
131 if not os.path.isdir( 'cache/objects' ):
132         os.makedirs( 'cache/objects' )
133
134 CacheDir( 'cache/objects' )
135
136 opts.Save( 'cache/' + build_base + "options.cache", env )
137
138 def ConfigGuess( context ):
139         context.Message( "Trying to find the system triple: " )
140         ret = os.popen( "admin/config.guess" ).read()[:-1]
141         context.Result( ret )
142         return ret
143
144 def CheckForApp( context, app ):
145         context.Message( "Checking whether '" + app + "' executes " )
146         ret = context.TryAction( app )
147         context.Result( ret[0] )
148         return ret[0]
149
150 def CheckForPyModule( context, module ):
151         context.Message( "Checking for the python module '" + module + "' " )
152         ret = True
153         try:
154                 imp.find_module( module )
155         except ImportError:
156                 ret = False
157         context.Result( ret )
158         return ret
159
160 def CompilerCheck( context ):
161         context.Message( "Checking for a working C-compiler " )
162         ret = context.TryLink( """
163 #include <stdlib.h>
164
165 int main() {
166         printf( "Hello World!" );
167         return 0;
168 }""", '.c' )
169         context.Result( ret )
170         if ret == 0:
171                 return False;
172         context.Message( "Checking for a working C++-compiler " )
173         ret = context.TryLink( """
174 #include <iostream>
175
176 int main() {
177         std::cout << "Hello World!" << std::endl;
178         return 0;
179 }""", ".cpp" )
180         context.Result( ret )
181         return ret
182
183 tests = {
184         "ConfigGuess" : ConfigGuess,
185         "CheckForApp" : CheckForApp,
186         "CheckForPyModule": CheckForPyModule,
187         "CompilerCheck" : CompilerCheck,
188 }
189 tests.update( env['PKGCONFIG_TESTS'] )
190 tests.update( env['PYUIC_TESTS'] )
191 tests.update( env['PYUIC4_TESTS'] )
192
193 conf = Configure( env,
194         custom_tests = tests,
195         conf_dir = "cache/" + build_base,
196         log_file = "cache/" + build_base + 'config.log' )
197
198 if env['SERIALIZE_USE_EXPAT']:
199         env['SERIALIZE_USE_EXPAT']=1
200 else:
201         env['SERIALIZE_USE_EXPAT']=0
202
203 if not env.GetOption('clean'):
204 #       #
205 #       # Check if the environment can actually compile c-files by checking for a
206 #       # header shipped with gcc.
207 #       #
208 #       if not conf.CheckHeader( "stdio.h", language="C" ):
209 #               print "It seems as if stdio.h is missing. This probably means that your build environment is broken, please make sure you have a working c-compiler and libstdc installed and usable."
210 #               Exit( 1 )
211 #       #
212 #       # ... and do the same with a c++-header. Because some distributions have
213 #       # distinct packages for gcc and g++.
214 #       #
215 #       if not conf.CheckHeader( "iostream", language="C++" ):
216 #               print "It seems as if iostream is missing. This probably means that your build environment is broken, please make sure you have a working c++-compiler installed and usable."
217 #               Exit( 1 )
218
219         #
220         # Seems as if the above tests don't really work. This one should do the trick!?
221         #
222         if not conf.CompilerCheck():
223                 print "It seems as if your system isn't even able to compile any C-/C++-programs. Probably you don't have gcc and g++ installed. Compiling a package from source without a working compiler is very hard to do, please install the needed packages (Hint: on *ubuntu you need both gcc- and g++-packages installed)."
224                 Exit( 1 )
225
226         #
227         # The following checks are for headers and libs and packages we need.
228         #
229         allpresent = 1;
230         # for DBUS C++ bindings
231         allpresent &= conf.CheckHeader( "expat.h" )
232         allpresent &= conf.CheckLib( 'expat', 'XML_ExpatVersion', '#include <expat.h>' )
233        
234         allpresent &= conf.CheckForPKGConfig();
235
236         pkgs = {
237                 'libraw1394' : '1.3.0',
238                 'libiec61883' : '1.1.0',
239                 'dbus-1' : '1.0',
240                 }
241         if not env['SERIALIZE_USE_EXPAT']:
242                 pkgs['libxml++-2.6'] = '2.13.0'
243
244         for pkg in pkgs:
245                 name2 = pkg.replace("+","").replace(".","").replace("-","").upper()
246                 env['%s_FLAGS' % name2] = conf.GetPKGFlags( pkg, pkgs[pkg] )
247                 if env['%s_FLAGS'%name2] == 0:
248                         allpresent &= 0
249
250         if not allpresent:
251                 print """
252 (At least) One of the dependencies is missing. I can't go on without it, please
253 install the needed packages for each of the lines saying "no".
254 (Remember to also install the *-devel packages!)
255
256 And remember to remove the cache with "rm -Rf .sconsign.dblite cache" so the
257 results above get rechecked.
258 """
259                 Exit( 1 )
260
261         # Check for C99 lrint() and lrintf() functions used to convert from
262         # float to integer more efficiently via float_cast.h.  If not
263         # present the standard slower methods will be used instead.  This
264         # might not be the best way of testing for these but it's the only
265         # way which seems to work properly.  CheckFunc() fails due to
266         # argument count problems.
267         if env.has_key( 'CFLAGS' ):
268                 oldcf = env['CFLAGS']
269         else:
270                 oldcf = ""
271         oldcf = env.Append(CFLAGS = '-std=c99')
272         if conf.CheckLibWithHeader( "m", "math.h", "c", "lrint(3.2);" ):
273                 HAVE_LRINT = 1
274         else:
275                 HAVE_LRINT = 0
276         if conf.CheckLibWithHeader( "m", "math.h", "c", "lrintf(3.2);" ):
277                 HAVE_LRINTF = 1
278         else:
279                 HAVE_LRINTF = 0
280         env['HAVE_LRINT'] = HAVE_LRINT;
281         env['HAVE_LRINTF'] = HAVE_LRINTF;
282         env.Replace(CFLAGS=oldcf)
283
284         #
285         # Optional checks follow:
286         #
287
288         # PyQT checks
289         build_mixer = False
290         if conf.CheckForApp( "which pyuic4" ) and conf.CheckForPyModule( 'dbus' ) and conf.CheckForPyModule( 'PyQt4' ):
291                 env['PYUIC4'] = True
292                 build_mixer = True
293        
294                 if conf.CheckForApp( "xdg-desktop-menu --help" ):
295                         env['XDG_TOOLS'] = True
296                 else:
297                         print """
298         I couldn't find the program 'xdg-desktop-menu'. Together with xdg-icon-resource
299         this is needed to add the fancy entry to your menu. But the mixer will be installed, you can start it by executing "ffadomixer".
300         """
301         elif conf.CheckForApp( "which pyuic" ) and conf.CheckForPyModule( 'dbus' ) and conf.CheckForPyModule( 'qt' ):
302                 env['PYUIC'] = True
303                 build_mixer = True
304        
305                 if conf.CheckForApp( "xdg-desktop-menu --help" ):
306                         env['XDG_TOOLS'] = True
307                 else:
308                         print """
309         I couldn't find the program 'xdg-desktop-menu'. Together with xdg-icon-resource
310         this is needed to add the fancy entry to your menu. But the mixer will be installed, you can start it by executing "ffadomixer".
311         """
312        
313         if not build_mixer:
314                 print """
315         I couldn't find all the prerequisites ('pyuic' / 'pyuic4' and the python-modules 'dbus' and
316         'qt', the packages could be named like dbus-python and PyQt) to build the mixer.
317         Therefor the mixer won't get installed.
318         """
319
320 config_guess = conf.ConfigGuess()
321
322 env = conf.Finish()
323
324 if env['DEBUG']:
325         print "Doing a DEBUG build"
326         # -Werror could be added to, which would force the devs to really remove all the warnings :-)
327         env.AppendUnique( CCFLAGS=["-DDEBUG","-Wall","-g"] )
328         env.AppendUnique( CFLAGS=["-DDEBUG","-Wall","-g"] )
329 else:
330         env.AppendUnique( CCFLAGS=["-O2","-DNDEBUG"] )
331         env.AppendUnique( CFLAGS=["-O2","-DNDEBUG"] )
332
333 if env['PROFILE']:
334         print "Doing a PROFILE build"
335         # -Werror could be added to, which would force the devs to really remove all the warnings :-)
336         env.AppendUnique( CCFLAGS=["-Wall","-g"] )
337         env.AppendUnique( CFLAGS=["-Wall","-g"] )
338
339
340 # this is required to indicate that the DBUS version we use has support
341 # for platform dependent threading init functions
342 # this is true for DBUS >= 0.96 or so. Since we require >= 1.0 it is
343 # always true
344 env.AppendUnique( CCFLAGS=["-DDBUS_HAS_THREADS_INIT_DEFAULT"] )
345
346 if env['ENABLE_ALL']:
347         env['ENABLE_BEBOB'] = True
348         env['ENABLE_FIREWORKS'] = True
349         env['ENABLE_MOTU'] = True
350
351 if env['ENABLE_BEBOB'] or env['ENABLE_FIREWORKS']:
352         env['ENABLE_GENERICAVC'] = True
353
354 env['BUILD_STATIC_LIB'] = False
355 if env['BUILD_STATIC_TOOLS']:
356     print "Building static versions of the tools..."
357     env['BUILD_STATIC_LIB'] = True
358
359 if build_base:
360         env['build_base']="#/"+build_base
361 else:
362         env['build_base']="#/"
363
364 #
365 # Uppercase variables are for usage in code, lowercase versions for usage in
366 # scons-files for installing.
367 #
368 env['BINDIR'] = Template( env['BINDIR'] ).safe_substitute( env )
369 env['LIBDIR'] = Template( env['LIBDIR'] ).safe_substitute( env )
370 env['INCLUDEDIR'] = Template( env['INCLUDEDIR'] ).safe_substitute( env )
371 env['SHAREDIR'] = Template( env['SHAREDIR'] ).safe_substitute( env )
372 env['bindir'] = Template( destdir + env['BINDIR'] ).safe_substitute( env )
373 env['libdir'] = Template( destdir + env['LIBDIR'] ).safe_substitute( env )
374 env['includedir'] = Template( destdir + env['INCLUDEDIR'] ).safe_substitute( env )
375 env['sharedir'] = Template( destdir + env['SHAREDIR'] ).safe_substitute( env )
376
377 env.Command( target=env['sharedir'], source="", action=Mkdir( env['sharedir'] ) )
378
379 env.Alias( "install", env['libdir'] )
380 env.Alias( "install", env['includedir'] )
381 env.Alias( "install", env['sharedir'] )
382 env.Alias( "install", env['bindir'] )
383
384 #
385 # shamelessly copied from the Ardour scons file
386 #
387
388 opt_flags = []
389 env['USE_SSE'] = 0
390
391 # guess at the platform, used to define compiler flags
392
393 config_cpu = 0
394 config_arch = 1
395 config_kernel = 2
396 config_os = 3
397 config = config_guess.split ("-")
398
399 needs_fPIC = False
400
401 # Autodetect
402 if env['DIST_TARGET'] == 'auto':
403     if re.search ("x86_64", config[config_cpu]) != None:
404         env['DIST_TARGET'] = 'x86_64'
405     elif re.search("i[0-5]86", config[config_cpu]) != None:
406         env['DIST_TARGET'] = 'i386'
407     elif re.search("powerpc64", config[config_cpu]) != None:
408         env['DIST_TARGET'] = 'powerpc64'
409     elif re.search("powerpc", config[config_cpu]) != None:
410         env['DIST_TARGET'] = 'powerpc'
411     else:
412         env['DIST_TARGET'] = 'i686'
413     print "Detected DIST_TARGET = " + env['DIST_TARGET']
414
415 if ((re.search ("i[0-9]86", config[config_cpu]) != None) or (re.search ("x86_64", config[config_cpu]) != None) or (re.search ("powerpc", config[config_cpu]) != None)):
416    
417     build_host_supports_sse = 0
418     build_host_supports_sse2 = 0
419     build_host_supports_sse3 = 0
420
421     if config[config_kernel] == 'linux' :
422        
423         if (env['DIST_TARGET'] == 'i686') or (env['DIST_TARGET'] == 'x86_64'):
424            
425             flag_line = os.popen ("cat /proc/cpuinfo | grep '^flags'").read()[:-1]
426             x86_flags = flag_line.split (": ")[1:][0].split ()
427            
428             if "mmx" in x86_flags:
429                 opt_flags.append ("-mmmx")
430             if "sse" in x86_flags:
431                 build_host_supports_sse = 1
432             if "sse2" in x86_flags:
433                 build_host_supports_sse2 = 1
434             #if "sse3" in x86_flags:
435                 #build_host_supports_sse3 = 1
436             if "3dnow" in x86_flags:
437                 opt_flags.append ("-m3dnow")
438            
439             if config[config_cpu] == "i586":
440                 opt_flags.append ("-march=i586")
441             elif config[config_cpu] == "i686":
442                 opt_flags.append ("-march=i686")
443
444         elif (env['DIST_TARGET'] == 'powerpc') or (env['DIST_TARGET'] == 'powerpc64'):
445
446             cpu_line = os.popen ("cat /proc/cpuinfo | grep '^cpu'").read()[:-1]
447
448             ppc_type = cpu_line.split (": ")[1]
449             if re.search ("altivec", ppc_type) != None:
450                 opt_flags.append ("-maltivec")
451                 opt_flags.append ("-mabi=altivec")
452
453             ppc_type = ppc_type.split (", ")[0]
454             if re.match ("74[0145][0578]A?", ppc_type) != None:
455                 opt_flags.append ("-mcpu=7400")
456                 opt_flags.append ("-mtune=7400")
457             elif re.match ("750", ppc_type) != None:
458                 opt_flags.append ("-mcpu=750")
459                 opt_flags.append ("-mtune=750")
460             elif re.match ("PPC970", ppc_type) != None:
461                 opt_flags.append ("-mcpu=970")
462                 opt_flags.append ("-mtune=970")
463             elif re.match ("Cell Broadband Engine", ppc_type) != None:
464                 opt_flags.append ("-mcpu=cell")
465                 opt_flags.append ("-mtune=cell")
466
467     if ((env['DIST_TARGET'] == 'i686') or (env['DIST_TARGET'] == 'x86_64')) \
468        and build_host_supports_sse and env['ENABLE_OPTIMIZATIONS']:
469         opt_flags.extend (["-msse", "-mfpmath=sse"])
470         env['USE_SSE'] = 1
471
472     if ((env['DIST_TARGET'] == 'i686') or (env['DIST_TARGET'] == 'x86_64')) \
473        and build_host_supports_sse2 and env['ENABLE_OPTIMIZATIONS']:
474         opt_flags.extend (["-msse2"])
475         env['USE_SSE2'] = 1
476
477     #if ((env['DIST_TARGET'] == 'i686') or (env['DIST_TARGET'] == 'x86_64')) \
478        #and build_host_supports_sse2 and env['ENABLE_OPTIMIZATIONS']:
479         #opt_flags.extend (["-msse3"])
480         #env['USE_SSE3'] = 1
481
482     # build for 64-bit userland?
483     if env['DIST_TARGET'] == "powerpc64":
484         print "Doing a 64-bit PowerPC build"
485         env.AppendUnique( CCFLAGS=["-m64"] )
486         env.AppendUnique( CFLAGS=["-m64"] )
487     elif env['DIST_TARGET'] == "x86_64":
488         print "Doing a 64-bit x86 build"
489         env.AppendUnique( CCFLAGS=["-m64"] )
490         env.AppendUnique( CFLAGS=["-m64"] )
491         needs_fPIC = True
492     else:
493         print "Doing a 32-bit build"
494         env.AppendUnique( CCFLAGS=["-m32"] )
495         env.AppendUnique( CFLAGS=["-m32"] )
496
497 if needs_fPIC or '-fPIC' in env['OS_CFLAGS']:
498     env.AppendUnique( CFLAGS=["-fPIC"] )
499 if needs_fPIC or '-fPIC' in env['OS_CCFLAGS']:
500     env.AppendUnique( CCFLAGS=["-fPIC"] )
501
502 # end of processor-specific section
503 if env['ENABLE_OPTIMIZATIONS']:
504     opt_flags.extend (["-fomit-frame-pointer","-ffast-math","-funroll-loops"])
505     env.AppendUnique( CCFLAGS=opt_flags )
506     env.AppendUnique( CFLAGS=opt_flags )
507     print "Doing an optimized build..."
508
509 env['REVISION'] = os.popen('svnversion .').read()[:-1]
510 # This may be as simple as '89' or as complex as '4123:4184M'.
511 # We'll just use the last bit.
512 env['REVISION'] = env['REVISION'].split(':')[-1]
513
514 # try to circumvent localized versions
515 if len(env['REVISION']) >= 5 and env['REVISION'][0:6] == 'export':
516         env['REVISION'] = ''
517
518 env['FFADO_API_VERSION']=FFADO_API_VERSION
519
520 env['PACKAGE'] = "libffado"
521 env['VERSION'] = FFADO_VERSION
522 env['LIBVERSION'] = "1.0.0"
523
524 env['CONFIGDIR'] = "~/.ffado"
525 env['CACHEDIR'] = "~/.ffado"
526
527 env['USER_CONFIG_FILE'] = env['CONFIGDIR'] + "/configuration"
528 env['SYSTEM_CONFIG_FILE'] = env['sharedir'] + "/configuration"
529
530 env['REGISTRATION_URL'] = "http://ffado.org/deviceregistration/register.php?action=register"
531
532 #
533 # To have the top_srcdir as the doxygen-script is used from auto*
534 #
535 env['top_srcdir'] = env.Dir( "." ).abspath
536
537 #
538 # Start building
539 #
540 env.ScanReplace( "config.h.in" )
541 # ensure that the config.h is updated with the version
542
543 env.Depends( "config.h", "SConstruct" )
544 env.Depends( "config.h", 'cache/' + build_base + "options.cache" )
545
546 # update config.h whenever the SVN revision changes
547 env.Depends( "config.h", env.Value(env['REVISION']))
548
549 env.Depends( "libffado.pc", "SConstruct" )
550 pkgconfig = env.ScanReplace( "libffado.pc.in" )
551 env.Install( env['libdir'] + '/pkgconfig', pkgconfig )
552
553 env.Install( env['sharedir'], 'configuration' )
554
555 subdirs=['external','src','libffado','tests','support','doc']
556 if build_base:
557         env.SConscript( dirs=subdirs, exports="env", build_dir=build_base+subdir )
558 else:
559         env.SConscript( dirs=subdirs, exports="env" )
560
561 # By default only src is built but all is cleaned
562 if not env.GetOption('clean'):
563     Default( 'src' )
564     Default( 'support' )
565     if env['BUILD_TESTS']:
566         Default( 'tests' )
567
568 #
569 # Deal with the DESTDIR vs. xdg-tools conflict (which is basicely that the
570 # xdg-tools can't deal with DESTDIR, so the packagers have to deal with this
571 # their own :-/
572 #
573 if len(destdir) > 0:
574         if not len( ARGUMENTS.get( "WILL_DEAL_WITH_XDG_MYSELF", "" ) ) > 0:
575                 print """
576 WARNING!
577 You are using the (packagers) option DESTDIR to install this package to a
578 different place than the real prefix. As the xdg-tools can't cope with
579 that, the .desktop-files are not installed by this build, you have to
580 deal with them your own.
581 (And you have to look into the SConstruct to learn how to disable this
582 message.)
583 """
584 else:
585
586         def CleanAction( action ):
587                 if env.GetOption( "clean" ):
588                         env.Execute( action )
589
590         if env.has_key( 'XDG_TOOLS' ) and env.has_key( 'PYUIC' ):
591                 if not env.GetOption("clean"):
592                         action = "install"
593                 else:
594                         action = "uninstall"
595                 mixerdesktopaction = env.Action( "xdg-desktop-menu %s support/xdg/ffado.org-ffadomixer.desktop" % action )
596                 mixericonaction = env.Action( "xdg-icon-resource %s --size 64 --context apps support/xdg/hi64-apps-ffado.png" % action )
597                 env.Command( "__xdgstuff1", None, mixerdesktopaction )
598                 env.Command( "__xdgstuff2", None, mixericonaction )
599                 env.Alias( "install", ["__xdgstuff1", "__xdgstuff2" ] )
600                 CleanAction( mixerdesktopaction )
601                 CleanAction( mixericonaction )
602
603 #
604 # Create a tags-file for easier emacs/vim-source-browsing
605 #  I don't know if the dependency is right...
606 #
607 findcommand = "find . \( -path \"*.h\" -o -path \"*.cpp\" -o -path \"*.c\" \) \! -path \"*.svn*\" \! -path \"./doc*\" \! -path \"./cache*\""
608 env.Command( "tags", "", findcommand + " |xargs ctags" )
609 env.Command( "TAGS", "", findcommand + " |xargs etags" )
610 env.AlwaysBuild( "tags", "TAGS" )
611 if 'NoCache' in dir(env):
612     env.NoCache( "tags", "TAGS" )
613
Note: See TracBrowser for help on using the browser.