root/trunk/libffado/SConstruct

Revision 2104, 24.8 kB (checked in by jwoithe, 11 years ago)

Allow the FFADO API reported at runtime to be downgraded to the pre-setbuffersize version (8). This will permit newer FFADO snapshots to be run on a system with a jack which predates the setbuffersize API version (9). The resulting FFADO will continue to work if jack is subsequently upgraded, but dynamic setbuffersize support will require FFADO be recompiled.

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