root/trunk/libffado/SConstruct

Revision 2113, 24.9 kB (checked in by adi, 12 years ago)

Don't abort on ENABLE_SETBUFFERSIZE_API_VER=true

Power to the people. If they ask for APIv9, they get APIv9. Reserve the
"I know what's good for you" attitude to the 'auto' case.

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     have_jack = conf.CheckPKG('jack >= 0.0.0')
232     good_jack1 = conf.CheckPKG('jack < 1.9.0') and conf.CheckPKG('jack >= 0.122.0')
233     good_jack2 = conf.CheckPKG('jack >= 1.9.9')
234     if env['ENABLE_SETBUFFERSIZE_API_VER'] == 'auto':
235         if not(have_jack):
236             print """
237 No jack installed: assuming a FFADO setbuffersize-compatible version will be
238 used.
239 """
240         elif not(good_jack1 or good_jack2):
241             FFADO_API_VERSION="8"
242             print """
243 Installed jack does not support FFADO setbuffersize API: will report earlier
244 API version at runtime.  Consider upgrading to jack1 >=0.122.0 or
245 jack2 >=1.9.9 at some point, and then recompile ffado to gain access to this
246 added feature.
247 """
248         else:
249             print "Installed jack supports FFADO setbuffersize API"
250     elif env['ENABLE_SETBUFFERSIZE_API_VER'] == 'true':
251         if (have_jack and not(good_jack1) and not(good_jack2)):
252             print """
253 SetBufferSize API version is enabled but no suitable version of jack has been
254 found.  The resulting FFADO would cause your jackd to abort with "incompatible
255 FFADO version".  Please upgrade to jack1 >=0.122.0 or jack2 >=1.9.9, or set
256 ENABLE_SETBUFFERSIZE_API_VER to "auto" or "false".
257 """
258         else:
259             print "Will report SetBufferSize API version at runtime"
260     else:
261         FFADO_API_VERSION="8"
262         print "Will not report SetBufferSize API version at runtime"
263
264     for pkg in pkgs:
265         name2 = pkg.replace("+","").replace(".","").replace("-","").upper()
266         env['%s_FLAGS' % name2] = conf.GetPKGFlags( pkg, pkgs[pkg] )
267         #print '%s_FLAGS' % name2
268         if env['%s_FLAGS'%name2] == 0:
269             allpresent &= 0
270
271     if not allpresent:
272         print """
273 (At least) One of the dependencies is missing. I can't go on without it, please
274 install the needed packages for each of the lines saying "no".
275 (Remember to also install the *-devel packages!)
276
277 And remember to remove the cache with "rm -Rf .sconsign.dblite cache" so the
278 results above get rechecked.
279 """
280         Exit( 1 )
281
282     # Check for C99 lrint() and lrintf() functions used to convert from
283     # float to integer more efficiently via float_cast.h.  If not
284     # present the standard slower methods will be used instead.  This
285     # might not be the best way of testing for these but it's the only
286     # way which seems to work properly.  CheckFunc() fails due to
287     # argument count problems.
288     if env.has_key( 'CFLAGS' ):
289         oldcf = env['CFLAGS']
290     else:
291         oldcf = ""
292     oldcf = env.Append(CFLAGS = '-std=c99')
293     if conf.CheckLibWithHeader( "m", "math.h", "c", "lrint(3.2);" ):
294         HAVE_LRINT = 1
295     else:
296         HAVE_LRINT = 0
297     if conf.CheckLibWithHeader( "m", "math.h", "c", "lrintf(3.2);" ):
298         HAVE_LRINTF = 1
299     else:
300         HAVE_LRINTF = 0
301     env['HAVE_LRINT'] = HAVE_LRINT;
302     env['HAVE_LRINTF'] = HAVE_LRINTF;
303     env.Replace(CFLAGS=oldcf)
304
305 #
306 # Optional checks follow:
307 #
308
309 # PyQT checks
310 build_mixer = False
311 if conf.CheckForApp( 'which pyuic4' ) and conf.CheckForPyModule( 'dbus' ) and conf.CheckForPyModule( 'PyQt4' ) and conf.CheckForPyModule( 'dbus.mainloop.qt' ):
312     env['PYUIC4'] = True
313     build_mixer = True
314
315 if conf.CheckForApp( 'xdg-desktop-menu --help' ):
316     env['XDG_TOOLS'] = True
317 else:
318     print """
319 I couldn't find the program 'xdg-desktop-menu'. Together with xdg-icon-resource
320 this is needed to add the fancy entry to your menu. But if the mixer will be
321 installed, you can start it by executing "ffado-mixer".
322 """
323
324 if not build_mixer and not env.GetOption('clean'):
325     print """
326 I couldn't find all the prerequisites ('pyuic4' and the python-modules 'dbus'
327 and 'PyQt4', the packages could be named like dbus-python and PyQt) to build the
328 mixer.
329 Therefor the qt4 mixer will not get installed.
330 """
331
332 #
333 # Optional pkg-config
334 #
335 pkgs = {
336     'alsa': '0',
337     'dbus-1': '1.0',
338     'dbus-c++-1' : '0',
339     }
340 for pkg in pkgs:
341     name2 = pkg.replace("+","").replace(".","").replace("-","").upper()
342     env['%s_FLAGS' % name2] = conf.GetPKGFlags( pkg, pkgs[pkg] )
343
344 if not env['DBUS1_FLAGS'] or not env['DBUSC1_FLAGS'] or not conf.CheckForApp('which dbusxx-xml2cpp'):
345     env['DBUS1_FLAGS'] = ""
346     env['DBUSC1_FLAGS'] = ""
347     print """
348 One of the dbus-headers, the dbus-c++-headers and/or the application
349 'dbusxx-xml2cpp' where not found. The dbus-server for ffado will therefore not
350 be built.
351 """
352 else:
353     # Get the directory where dbus stores the service-files
354     env['dbus_service_dir'] = conf.GetPKGVariable( 'dbus-1', 'session_bus_services_dir' ).strip()
355     # this is required to indicate that the DBUS version we use has support
356     # for platform dependent threading init functions
357     # this is true for DBUS >= 0.96 or so. Since we require >= 1.0 it is
358     # always true
359     env['DBUS1_FLAGS'] += " -DDBUS_HAS_THREADS_INIT_DEFAULT"
360
361
362 config_guess = conf.ConfigGuess()
363
364 env = conf.Finish()
365
366 if env['DEBUG']:
367     print "Doing a DEBUG build"
368     env.MergeFlags( "-DDEBUG -Wall -g" )
369 else:
370     env.MergeFlags( "-O2 -DNDEBUG" )
371
372 if env['PROFILE']:
373     print "Doing a PROFILE build"
374     env.MergeFlags( "-Wall -g" )
375
376 if env['PEDANTIC']:
377     env.MergeFlags( "-Werror" )
378
379
380 if env['ENABLE_ALL']:
381     env['ENABLE_BEBOB'] = True
382     env['ENABLE_FIREWORKS'] = True
383     env['ENABLE_OXFORD'] = True
384     env['ENABLE_MOTU'] = True
385     env['ENABLE_DICE'] = True
386     env['ENABLE_METRIC_HALO'] = True
387     env['ENABLE_RME'] = True
388     env['ENABLE_DIGIDESIGN'] = True
389     env['ENABLE_BOUNCE'] = True
390     env['ENABLE_MAUDIO'] = True
391
392
393 env['BUILD_STATIC_LIB'] = False
394 if env['BUILD_STATIC_TOOLS']:
395     print "Building static versions of the tools..."
396     env['BUILD_STATIC_LIB'] = True
397
398 env['build_base']="#/"
399
400 #
401 # Get the DESTDIR (if wanted) from the commandline
402 #
403 env.destdir = ARGUMENTS.get( 'DESTDIR', "" )
404
405 #
406 # Uppercase variables are for usage in code, lowercase versions for usage in
407 # scons-files for installing.
408 #
409 env['BINDIR'] = Template( env['BINDIR'] ).safe_substitute( env )
410 env['LIBDIR'] = Template( env['LIBDIR'] ).safe_substitute( env )
411 env['INCLUDEDIR'] = Template( env['INCLUDEDIR'] ).safe_substitute( env )
412 env['SHAREDIR'] = Template( env['SHAREDIR'] ).safe_substitute( env )
413 env['prefix'] = Template( env.destdir + env['PREFIX'] ).safe_substitute( env )
414 env['bindir'] = Template( env.destdir + env['BINDIR'] ).safe_substitute( env )
415 env['libdir'] = Template( env.destdir + env['LIBDIR'] ).safe_substitute( env )
416 env['includedir'] = Template( env.destdir + env['INCLUDEDIR'] ).safe_substitute( env )
417 env['sharedir'] = Template( env.destdir + env['SHAREDIR'] ).safe_substitute( env )
418 env['mandir'] = Template( env.destdir + env['MANDIR'] ).safe_substitute( env )
419 env['pypkgdir'] = Template( env.destdir + env['PYPKGDIR'] ).safe_substitute( env )
420 env['PYPKGDIR'] = Template( env['PYPKGDIR'] ).safe_substitute( env )
421
422 env.Command( target=env['sharedir'], source="", action=Mkdir( env['sharedir'] ) )
423
424 env.Alias( "install", env['libdir'] )
425 env.Alias( "install", env['includedir'] )
426 env.Alias( "install", env['sharedir'] )
427 env.Alias( "install", env['bindir'] )
428 env.Alias( "install", env['mandir'] )
429 if build_mixer:
430     env.Alias( "install", env['pypkgdir'] )
431
432 #
433 # shamelessly copied from the Ardour scons file
434 #
435
436 opt_flags = []
437 env['USE_SSE'] = 0
438
439 # guess at the platform, used to define compiler flags
440
441 config_cpu = 0
442 config_arch = 1
443 config_kernel = 2
444 config_os = 3
445 config = config_guess.split ("-")
446
447 needs_fPIC = False
448
449 # Autodetect
450 if env['DIST_TARGET'] == 'auto':
451     if re.search ("x86_64", config[config_cpu]) != None:
452         env['DIST_TARGET'] = 'x86_64'
453     elif re.search("i[0-5]86", config[config_cpu]) != None:
454         env['DIST_TARGET'] = 'i386'
455     elif re.search("i686", config[config_cpu]) != None:
456         env['DIST_TARGET'] = 'i686'
457     elif re.search("powerpc64", config[config_cpu]) != None:
458         env['DIST_TARGET'] = 'powerpc64'
459     elif re.search("powerpc", config[config_cpu]) != None:
460         env['DIST_TARGET'] = 'powerpc'
461     else:
462         env['DIST_TARGET'] = config[config_cpu]
463     print "Detected DIST_TARGET = " + env['DIST_TARGET']
464
465 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)):
466    
467     build_host_supports_sse = 0
468     build_host_supports_sse2 = 0
469     build_host_supports_sse3 = 0
470
471     if config[config_kernel] == 'linux' :
472        
473         if (env['DIST_TARGET'] == 'i686') or (env['DIST_TARGET'] == 'x86_64'):
474            
475             flag_line = os.popen ("cat /proc/cpuinfo | grep '^flags'").read()[:-1]
476             x86_flags = flag_line.split (": ")[1:][0].split ()
477            
478             if "mmx" in x86_flags:
479                 opt_flags.append ("-mmmx")
480             if "sse" in x86_flags:
481                 build_host_supports_sse = 1
482             if "sse2" in x86_flags:
483                 build_host_supports_sse2 = 1
484             #if "sse3" in x86_flags:
485                 #build_host_supports_sse3 = 1
486             if "3dnow" in x86_flags:
487                 opt_flags.append ("-m3dnow")
488            
489             if config[config_cpu] == "i586":
490                 opt_flags.append ("-march=i586")
491             elif config[config_cpu] == "i686":
492                 opt_flags.append ("-march=i686")
493
494         elif (env['DIST_TARGET'] == 'powerpc') or (env['DIST_TARGET'] == 'powerpc64'):
495
496             cpu_line = os.popen ("cat /proc/cpuinfo | grep '^cpu'").read()[:-1]
497
498             ppc_type = cpu_line.split (": ")[1]
499             if re.search ("altivec", ppc_type) != None:
500                 opt_flags.append ("-maltivec")
501                 opt_flags.append ("-mabi=altivec")
502
503             ppc_type = ppc_type.split (", ")[0]
504             if re.match ("74[0145][0578]A?", ppc_type) != None:
505                 opt_flags.append ("-mcpu=7400")
506                 opt_flags.append ("-mtune=7400")
507             elif re.match ("750", ppc_type) != None:
508                 opt_flags.append ("-mcpu=750")
509                 opt_flags.append ("-mtune=750")
510             elif re.match ("PPC970", ppc_type) != None:
511                 opt_flags.append ("-mcpu=970")
512                 opt_flags.append ("-mtune=970")
513             elif re.match ("Cell Broadband Engine", ppc_type) != None:
514                 opt_flags.append ("-mcpu=cell")
515                 opt_flags.append ("-mtune=cell")
516
517     if ((env['DIST_TARGET'] == 'i686') or (env['DIST_TARGET'] == 'x86_64')) \
518        and build_host_supports_sse and env['ENABLE_OPTIMIZATIONS']:
519         opt_flags.extend (["-msse", "-mfpmath=sse"])
520         env['USE_SSE'] = 1
521
522     if ((env['DIST_TARGET'] == 'i686') or (env['DIST_TARGET'] == 'x86_64')) \
523        and build_host_supports_sse2 and env['ENABLE_OPTIMIZATIONS']:
524         opt_flags.extend (["-msse2"])
525         env['USE_SSE2'] = 1
526
527     #if ((env['DIST_TARGET'] == 'i686') or (env['DIST_TARGET'] == 'x86_64')) \
528        #and build_host_supports_sse2 and env['ENABLE_OPTIMIZATIONS']:
529         #opt_flags.extend (["-msse3"])
530         #env['USE_SSE3'] = 1
531
532     # build for 64-bit userland?
533     if env['DIST_TARGET'] == "powerpc64":
534         print "Doing a 64-bit PowerPC build"
535         env.MergeFlags( "-m64" )
536     elif env['DIST_TARGET'] == "x86_64":
537         print "Doing a 64-bit x86 build"
538         env.MergeFlags( "-m64" )
539         needs_fPIC = True
540     else:
541         print "Doing a 32-bit build"
542         env.MergeFlags( "-m32" )
543
544 if needs_fPIC or ( env.has_key('COMPILE_FLAGS') and '-fPIC' in env['COMPILE_FLAGS'] ):
545     env.MergeFlags( "-fPIC" )
546
547 # end of processor-specific section
548 if env['ENABLE_OPTIMIZATIONS']:
549     opt_flags.extend (["-fomit-frame-pointer","-ffast-math","-funroll-loops"])
550     env.MergeFlags( opt_flags )
551     print "Doing an optimized build..."
552
553 env['REVISION'] = os.popen('svnversion .').read()[:-1]
554 # This may be as simple as '89' or as complex as '4123:4184M'.
555 # We'll just use the last bit.
556 env['REVISION'] = env['REVISION'].split(':')[-1]
557
558 # try to circumvent localized versions
559 if len(env['REVISION']) >= 5 and env['REVISION'][0:6] == 'export':
560     env['REVISION'] = ''
561
562 # avoid the 1.999.41- type of version for exported versions
563 if env['REVISION'] != '':
564         env['REVISIONSTRING'] = '-' + env['REVISION']
565 else:
566         env['REVISIONSTRING'] = ''
567
568 env['FFADO_API_VERSION'] = FFADO_API_VERSION
569
570 env['PACKAGE'] = "libffado"
571 env['VERSION'] = FFADO_VERSION
572 env['LIBVERSION'] = "1.0.0"
573
574 env['CONFIGDIR'] = "~/.ffado"
575 env['CACHEDIR'] = "~/.ffado"
576
577 env['USER_CONFIG_FILE'] = env['CONFIGDIR'] + "/configuration"
578 env['SYSTEM_CONFIG_FILE'] = env['SHAREDIR'] + "/configuration"
579
580 env['REGISTRATION_URL'] = "http://ffado.org/deviceregistration/register.php?action=register"
581
582 #
583 # To have the top_srcdir as the doxygen-script is used from auto*
584 #
585 env['top_srcdir'] = env.Dir( "." ).abspath
586
587 #
588 # Start building
589 #
590 env.ScanReplace( "config.h.in" )
591 env.ScanReplace( "config_debug.h.in" )
592 env.ScanReplace( "version.h.in" )
593
594 # ensure that the config.h is updated
595 env.Depends( "config.h", "SConstruct" )
596 env.Depends( "config.h", 'cache/options.cache' )
597
598 # update version.h whenever the version or SVN revision changes
599 env.Depends( "version.h", env.Value(env['REVISION']))
600 env.Depends( "version.h", env.Value(env['VERSION']))
601
602 env.Depends( "libffado.pc", "SConstruct" )
603 pkgconfig = env.ScanReplace( "libffado.pc.in" )
604 env.Install( env['libdir'] + '/pkgconfig', pkgconfig )
605
606 env.Install( env['sharedir'], 'configuration' )
607
608 subdirs=['src','libffado','support','doc']
609 if env['BUILD_TESTS']:
610     subdirs.append('tests')
611
612 env.SConscript( dirs=subdirs, exports="env" )
613
614 if 'debian' in COMMAND_LINE_TARGETS:
615     env.SConscript("deb/SConscript", exports="env")
616
617 # By default only src is built but all is cleaned
618 if not env.GetOption('clean'):
619     Default( 'src' )
620     Default( 'support' )
621     if env['BUILD_TESTS']:
622         Default( 'tests' )
623
624 #
625 # Deal with the DESTDIR vs. xdg-tools conflict (which is basicely that the
626 # xdg-tools can't deal with DESTDIR, so the packagers have to deal with this
627 # their own :-/
628 #
629 if len(env.destdir) > 0:
630     if not len( ARGUMENTS.get( "WILL_DEAL_WITH_XDG_MYSELF", "" ) ) > 0:
631         print """
632 WARNING!
633 You are using the (packagers) option DESTDIR to install this package to a
634 different place than the real prefix. As the xdg-tools can't cope with
635 that, the .desktop-files are not installed by this build, you have to
636 deal with them your own.
637 (And you have to look into the SConstruct to learn how to disable this
638 message.)
639 """
640 else:
641
642     def CleanAction( action ):
643         if env.GetOption( "clean" ):
644             env.Execute( action )
645
646     if env.has_key( 'XDG_TOOLS' ) and env.has_key( 'PYUIC4' ):
647         if not env.GetOption("clean"):
648             action = "install"
649         else:
650             action = "uninstall"
651         mixerdesktopaction = env.Action( "-xdg-desktop-menu %s support/xdg/ffado.org-ffadomixer.desktop" % action )
652         mixericonaction = env.Action( "-xdg-icon-resource %s --size 64 --novendor --context apps support/xdg/hi64-apps-ffado.png ffado" % action )
653         env.Command( "__xdgstuff1", None, mixerdesktopaction )
654         env.Command( "__xdgstuff2", None, mixericonaction )
655         env.Alias( "install", ["__xdgstuff1", "__xdgstuff2" ] )
656         CleanAction( mixerdesktopaction )
657         CleanAction( mixericonaction )
658
659 #
660 # Create a tags-file for easier emacs/vim-source-browsing
661 #  I don't know if the dependency is right...
662 #
663 findcommand = "find . \( -path \"*.h\" -o -path \"*.cpp\" -o -path \"*.c\" \) \! -path \"*.svn*\" \! -path \"./doc*\" \! -path \"./cache*\""
664 env.Command( "tags", "", findcommand + " |xargs ctags" )
665 env.Command( "TAGS", "", findcommand + " |xargs etags" )
666 env.AlwaysBuild( "tags", "TAGS" )
667 if 'NoCache' in dir(env):
668     env.NoCache( "tags", "TAGS" )
669
670 # Another convinience target
671 if env.GetOption( "clean" ):
672     env.Execute( "rm cache/objects -Rf" )
673
674 #
675 # vim: ts=4 sw=4 et
Note: See TracBrowser for help on using the browser.