root/trunk/libffado/SConstruct

Revision 1763, 22.1 kB (checked in by ppalmers, 14 years ago)

Merged revisions 1536,1541,1544-1546,1549,1554-1562,1571,1579-1581,1618,1632,1634-1635,1661,1677-1679,1703-1704,1715,1720-1723,1743-1745,1755 via svnmerge from
svn+ssh://ffadosvn@ffado.org/ffado/branches/libffado-2.0

Also fix remaining format string warnings.

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