SConstruct: including the #! line is unnecessary since this file is designed to be...
[ffado.git] / libffado / SConstruct
blob57bee86a41f867eeb7332ab3e2390aacb2f7e03d
1 # -*- coding: utf-8 -*-
3 # Copyright (C) 2007, 2008, 2010 Arnold Krille
4 # Copyright (C) 2007, 2008 Pieter Palmers
5 # Copyright (C) 2008, 2012 Jonathan Woithe
7 # This file is part of FFADO
8 # FFADO = Free Firewire (pro-)audio drivers for linux
10 # FFADO is based upon FreeBoB.
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.
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.
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/>.
26 FFADO_API_VERSION = "9"
27 FFADO_VERSION="2.1.9999"
29 from subprocess import Popen, PIPE
30 import os
31 import re
32 from string import Template
33 import imp
34 import distutils.sysconfig
36 if not os.path.isdir( "cache" ):
37 os.makedirs( "cache" )
39 opts = Variables( "cache/options.cache" )
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 PathVariable( "UDEVDIR", "Overwrite the directory where udev rules are installed to.", "/lib/udev/rules.d/", PathVariable.PathAccept ),
55 BoolVariable( "ENABLE_BEBOB", "Enable/Disable support for the BeBoB platform.", True ),
56 BoolVariable( "ENABLE_FIREWORKS", "Enable/Disable support for the ECHO Audio FireWorks platform.", True ),
57 BoolVariable( "ENABLE_OXFORD", "Enable/Disable support for the Oxford Semiconductor FW platform.", True ),
58 BoolVariable( "ENABLE_MOTU", "Enable/Disable support for the MOTU platform.", True ),
59 BoolVariable( "ENABLE_DICE", "Enable/Disable support for the TCAT DICE platform.", True ),
60 BoolVariable( "ENABLE_METRIC_HALO", "Enable/Disable support for the Metric Halo platform.", False ),
61 BoolVariable( "ENABLE_RME", "Enable/Disable support for the RME platform.", True ),
62 BoolVariable( "ENABLE_DIGIDESIGN", "Enable/Disable support for Digidesign interfaces.", 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', 'force'), ignorecase=2),
84 ## Load the builders in config
85 buildenv=os.environ
87 env = Environment( tools=['default','scanreplace','pyuic','pyuic4','dbus','doxygen','pkgconfig'], toolpath=['admin'], ENV = buildenv, options=opts )
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!
94 * Currentl value is '%s'
95 ''' % env['COMPILE_FLAGS']
96 env.MergeFlags(env['COMPILE_FLAGS'])
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"
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 ) )
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' )
117 CacheDir( 'cache/objects' )
119 opts.Save( 'cache/options.cache', env )
121 def ConfigGuess( context ):
122 context.Message( "Trying to find the system triple: " )
123 ret = os.popen( "/bin/sh admin/config.guess" ).read()[:-1]
124 context.Result( ret )
125 return ret
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]
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]
139 def CompilerCheck( context ):
140 context.Message( "Checking for a working C-compiler " )
141 ret = context.TryRun( """
142 #include <stdio.h>
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>
155 int main() {
156 std::cout << "Hello World!" << std::endl;
157 return 0;
158 }""", ".cpp" )[0]
159 context.Result( ret )
160 return ret
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
168 tests = {
169 "ConfigGuess" : ConfigGuess,
170 "CheckForApp" : CheckForApp,
171 "CheckForPyModule": CheckForPyModule,
172 "CompilerCheck" : CompilerCheck,
173 "CheckPKG" : CheckPKG,
175 tests.update( env['PKGCONFIG_TESTS'] )
176 tests.update( env['PYUIC_TESTS'] )
177 tests.update( env['PYUIC4_TESTS'] )
179 conf = Configure( env,
180 custom_tests = tests,
181 conf_dir = "cache/",
182 log_file = 'cache/config.log' )
184 version_re = re.compile(r'^(\d+)\.(\d+)\.(\d+)')
186 def VersionInt(vers):
187 match = version_re.match(vers)
188 if not match:
189 return -1
190 (maj, min, patch) = match.group(1, 2, 3)
191 # For now allow "min" to run up to 65535. "maj" and "patch" are
192 # restricted to 0-255.
193 return (int(maj) << 24) | (int(min) << 8) | int(patch)
195 def CheckJackdVer():
196 print 'Checking jackd version...',
197 ret = Popen("which jackd >/dev/null 2>&1 && jackd --version | tail -n 1 | cut -d ' ' -f 3", shell=True, stdout=PIPE).stdout.read()[:-1]
198 if (ret == ""):
199 print "not installed"
200 return -1
201 else:
202 print ret
203 return VersionInt(ret)
205 if env['SERIALIZE_USE_EXPAT']:
206 env['SERIALIZE_USE_EXPAT']=1
207 else:
208 env['SERIALIZE_USE_EXPAT']=0
210 if env['ENABLE_BOUNCE'] or env['ENABLE_ALL']:
211 env['REQUIRE_LIBAVC']=1
212 else:
213 env['REQUIRE_LIBAVC']=0
215 if not env.GetOption('clean'):
217 # Check for working gcc and g++ compilers and their environment.
219 if not conf.CompilerCheck():
220 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++."
221 Exit( 1 )
223 # Check for pkg-config before using pkg-config to check for other dependencies.
224 if not conf.CheckForPKGConfig():
225 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."
226 Exit( 1 )
229 # The following checks are for headers and libs and packages we need.
231 allpresent = 1;
232 # for cache-serialization.
233 if env['SERIALIZE_USE_EXPAT']:
234 allpresent &= conf.CheckHeader( "expat.h" )
235 allpresent &= conf.CheckLib( 'expat', 'XML_ExpatVersion', '#include <expat.h>' )
237 pkgs = {
238 'libraw1394' : '2.0.5',
239 'libiec61883' : '1.1.0',
240 'libconfig++' : '0'
243 if env['REQUIRE_LIBAVC']:
244 pkgs['libavc1394'] = '0.5.3'
246 if not env['SERIALIZE_USE_EXPAT']:
247 pkgs['libxml++-2.6'] = '2.13.0'
249 # Provide a way for users to compile newer libffado which will work
250 # against older jack installations which will not accept the new API
251 # version reported at runtime.
252 jackd_ver = CheckJackdVer()
253 if (jackd_ver != -1):
254 # If jackd is available, use the version number reported by it. This
255 # means users don't have to have jack development files present on
256 # their system for this to work.
257 have_jack = (jackd_ver >= VersionInt('0.0.0'))
258 good_jack1 = (jackd_ver < VersionInt('1.9.0')) and (jackd_ver >= VersionInt('0.122.0'))
259 good_jack2 = (jackd_ver >= VersionInt('1.9.9'))
260 else:
261 # Jackd is not runnable. Attempt to identify a version from
262 # pkgconfig on the off-chance jack details are available from there.
263 print "Will retry jack detection using pkg-config"
264 have_jack = conf.CheckPKG('jack >= 0.0.0')
265 good_jack1 = conf.CheckPKG('jack < 1.9.0') and conf.CheckPKG('jack >= 0.122.0')
266 good_jack2 = conf.CheckPKG('jack >= 1.9.9')
267 if env['ENABLE_SETBUFFERSIZE_API_VER'] == 'auto':
268 if not(have_jack):
269 print """
270 No Jack Audio Connection Kit (JACK) installed: assuming a FFADO
271 setbuffersize-compatible version will be used.
273 elif not(good_jack1 or good_jack2):
274 FFADO_API_VERSION="8"
275 print """
276 Installed Jack Audio Connection Kit (JACK) jack does not support FFADO
277 setbuffersize API: will report earlier API version at runtime. Consider
278 upgrading to jack1 >=0.122.0 or jack2 >=1.9.9 at some point, and then
279 recompile ffado to gain access to this added feature.
281 else:
282 print "Installed Jack Audio Connection Kit (JACK) supports FFADO setbuffersize API"
283 elif env['ENABLE_SETBUFFERSIZE_API_VER'] == 'true':
284 if (have_jack and not(good_jack1) and not(good_jack2)):
285 print """
286 SetBufferSize API version is enabled but no suitable version of Jack Audio
287 Connection Kit (JACK) has been found. The resulting FFADO would cause your
288 jackd to abort with "incompatible FFADO version". Please upgrade to
289 jack1 >=0.122.0 or jack2 >=1.9.9, or set ENABLE_SETBUFFERSIZE_API_VER to "auto"
290 or "false".
292 # Although it's not strictly an error, in almost every case that
293 # this occurs the user will want to know about it and fix the
294 # problem, so we exit so they're guaranteed of seeing the above
295 # message.
296 Exit( 1 )
297 else:
298 print "Will report SetBufferSize API version at runtime"
299 elif env['ENABLE_SETBUFFERSIZE_API_VER'] == 'force':
300 print "Will report SetBufferSize API version at runtime"
301 else:
302 FFADO_API_VERSION="8"
303 print "Will not report SetBufferSize API version at runtime"
305 for pkg in pkgs:
306 name2 = pkg.replace("+","").replace(".","").replace("-","").upper()
307 env['%s_FLAGS' % name2] = conf.GetPKGFlags( pkg, pkgs[pkg] )
308 #print '%s_FLAGS' % name2
309 if env['%s_FLAGS'%name2] == 0:
310 allpresent &= 0
312 if not allpresent:
313 print """
314 (At least) One of the dependencies is missing. I can't go on without it, please
315 install the needed packages for each of the lines saying "no".
316 (Remember to also install the *-devel packages!)
318 And remember to remove the cache with "rm -Rf .sconsign.dblite cache" so the
319 results above get rechecked.
321 Exit( 1 )
323 # Check for C99 lrint() and lrintf() functions used to convert from
324 # float to integer more efficiently via float_cast.h. If not
325 # present the standard slower methods will be used instead. This
326 # might not be the best way of testing for these but it's the only
327 # way which seems to work properly. CheckFunc() fails due to
328 # argument count problems.
329 if env.has_key( 'CFLAGS' ):
330 oldcf = env['CFLAGS']
331 else:
332 oldcf = ""
333 oldcf = env.Append(CFLAGS = '-std=c99')
334 if conf.CheckLibWithHeader( "m", "math.h", "c", "lrint(3.2);" ):
335 HAVE_LRINT = 1
336 else:
337 HAVE_LRINT = 0
338 if conf.CheckLibWithHeader( "m", "math.h", "c", "lrintf(3.2);" ):
339 HAVE_LRINTF = 1
340 else:
341 HAVE_LRINTF = 0
342 env['HAVE_LRINT'] = HAVE_LRINT;
343 env['HAVE_LRINTF'] = HAVE_LRINTF;
344 env.Replace(CFLAGS=oldcf)
347 # Optional checks follow:
350 # PyQT checks
351 build_mixer = False
352 if conf.CheckForApp( 'which pyuic4' ) and conf.CheckForPyModule( 'dbus' ) and conf.CheckForPyModule( 'PyQt4' ) and conf.CheckForPyModule( 'dbus.mainloop.qt' ):
353 env['PYUIC4'] = True
354 build_mixer = True
356 if conf.CheckForApp( 'xdg-desktop-menu --help' ):
357 env['XDG_TOOLS'] = True
358 else:
359 print """
360 I couldn't find the program 'xdg-desktop-menu'. Together with xdg-icon-resource
361 this is needed to add the fancy entry to your menu. But if the mixer will be
362 installed, you can start it by executing "ffado-mixer".
365 if not build_mixer and not env.GetOption('clean'):
366 print """
367 I couldn't find all the prerequisites ('pyuic4' and the python-modules 'dbus'
368 and 'PyQt4', the packages could be named like dbus-python and PyQt) to build the
369 mixer.
370 Therefor the qt4 mixer will not get installed.
374 # Optional pkg-config
376 pkgs = {
377 'alsa': '0',
378 'dbus-1': '1.0',
379 'dbus-c++-1' : '0',
381 for pkg in pkgs:
382 name2 = pkg.replace("+","").replace(".","").replace("-","").upper()
383 env['%s_FLAGS' % name2] = conf.GetPKGFlags( pkg, pkgs[pkg] )
385 if not env['DBUS1_FLAGS'] or not env['DBUSC1_FLAGS'] or not conf.CheckForApp('which dbusxx-xml2cpp'):
386 env['DBUS1_FLAGS'] = ""
387 env['DBUSC1_FLAGS'] = ""
388 print """
389 One of the dbus-headers, the dbus-c++-headers and/or the application
390 'dbusxx-xml2cpp' where not found. The dbus-server for ffado will therefore not
391 be built.
393 else:
394 # Get the directory where dbus stores the service-files
395 env['dbus_service_dir'] = conf.GetPKGVariable( 'dbus-1', 'session_bus_services_dir' ).strip()
396 # this is required to indicate that the DBUS version we use has support
397 # for platform dependent threading init functions
398 # this is true for DBUS >= 0.96 or so. Since we require >= 1.0 it is
399 # always true
400 env['DBUS1_FLAGS'] += " -DDBUS_HAS_THREADS_INIT_DEFAULT"
403 config_guess = conf.ConfigGuess()
405 env = conf.Finish()
407 if env['DEBUG']:
408 print "Doing a DEBUG build"
409 env.MergeFlags( "-DDEBUG -Wall -g" )
410 else:
411 env.MergeFlags( "-O2 -DNDEBUG" )
413 if env['PROFILE']:
414 print "Doing a PROFILE build"
415 env.MergeFlags( "-Wall -g" )
417 if env['PEDANTIC']:
418 env.MergeFlags( "-Werror" )
421 if env['ENABLE_ALL']:
422 env['ENABLE_BEBOB'] = True
423 env['ENABLE_FIREWORKS'] = True
424 env['ENABLE_OXFORD'] = True
425 env['ENABLE_MOTU'] = True
426 env['ENABLE_DICE'] = True
427 env['ENABLE_METRIC_HALO'] = True
428 env['ENABLE_RME'] = True
429 env['ENABLE_DIGIDESIGN'] = True
430 env['ENABLE_BOUNCE'] = True
433 env['BUILD_STATIC_LIB'] = False
434 if env['BUILD_STATIC_TOOLS']:
435 print "Building static versions of the tools..."
436 env['BUILD_STATIC_LIB'] = True
438 env['build_base']="#/"
441 # Get the DESTDIR (if wanted) from the commandline
443 env.destdir = ARGUMENTS.get( 'DESTDIR', "" )
446 # Uppercase variables are for usage in code, lowercase versions for usage in
447 # scons-files for installing.
449 env['BINDIR'] = Template( env['BINDIR'] ).safe_substitute( env )
450 env['LIBDIR'] = Template( env['LIBDIR'] ).safe_substitute( env )
451 env['INCLUDEDIR'] = Template( env['INCLUDEDIR'] ).safe_substitute( env )
452 env['SHAREDIR'] = Template( env['SHAREDIR'] ).safe_substitute( env )
453 env['UDEVDIR'] = Template( env['UDEVDIR'] ).safe_substitute( env )
454 env['prefix'] = Template( env.destdir + env['PREFIX'] ).safe_substitute( env )
455 env['bindir'] = Template( env.destdir + env['BINDIR'] ).safe_substitute( env )
456 env['libdir'] = Template( env.destdir + env['LIBDIR'] ).safe_substitute( env )
457 env['includedir'] = Template( env.destdir + env['INCLUDEDIR'] ).safe_substitute( env )
458 env['sharedir'] = Template( env.destdir + env['SHAREDIR'] ).safe_substitute( env )
459 env['mandir'] = Template( env.destdir + env['MANDIR'] ).safe_substitute( env )
460 env['pypkgdir'] = Template( env.destdir + env['PYPKGDIR'] ).safe_substitute( env )
461 env['udevdir'] = Template( env.destdir + env['UDEVDIR'] ).safe_substitute( env )
462 env['PYPKGDIR'] = Template( env['PYPKGDIR'] ).safe_substitute( env )
464 env.Command( target=env['sharedir'], source="", action=Mkdir( env['sharedir'] ) )
466 env.Alias( "install", env['libdir'] )
467 env.Alias( "install", env['includedir'] )
468 env.Alias( "install", env['sharedir'] )
469 env.Alias( "install", env['bindir'] )
470 env.Alias( "install", env['mandir'] )
471 if build_mixer:
472 env.Alias( "install", env['pypkgdir'] )
475 # shamelessly copied from the Ardour scons file
478 opt_flags = []
479 env['USE_SSE'] = 0
481 # guess at the platform, used to define compiler flags
483 config_cpu = 0
484 config_arch = 1
485 config_kernel = 2
486 config_os = 3
487 config = config_guess.split ("-")
489 needs_fPIC = False
491 # Autodetect
492 if env['DIST_TARGET'] == 'auto':
493 if re.search ("x86_64", config[config_cpu]) != None:
494 env['DIST_TARGET'] = 'x86_64'
495 elif re.search("i[0-5]86", config[config_cpu]) != None:
496 env['DIST_TARGET'] = 'i386'
497 elif re.search("i686", config[config_cpu]) != None:
498 env['DIST_TARGET'] = 'i686'
499 elif re.search("powerpc64", config[config_cpu]) != None:
500 env['DIST_TARGET'] = 'powerpc64'
501 elif re.search("powerpc", config[config_cpu]) != None:
502 env['DIST_TARGET'] = 'powerpc'
503 else:
504 env['DIST_TARGET'] = config[config_cpu]
505 print "Detected DIST_TARGET = " + env['DIST_TARGET']
507 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)):
509 build_host_supports_sse = 0
510 build_host_supports_sse2 = 0
511 build_host_supports_sse3 = 0
513 if config[config_kernel] == 'linux' :
515 if (env['DIST_TARGET'] == 'i686') or (env['DIST_TARGET'] == 'x86_64'):
517 flag_line = os.popen ("cat /proc/cpuinfo | grep '^flags'").read()[:-1]
518 x86_flags = flag_line.split (": ")[1:][0].split ()
520 if "mmx" in x86_flags:
521 opt_flags.append ("-mmmx")
522 if "sse" in x86_flags:
523 build_host_supports_sse = 1
524 if "sse2" in x86_flags:
525 build_host_supports_sse2 = 1
526 #if "sse3" in x86_flags:
527 #build_host_supports_sse3 = 1
528 if "3dnow" in x86_flags:
529 opt_flags.append ("-m3dnow")
531 if config[config_cpu] == "i586":
532 opt_flags.append ("-march=i586")
533 elif config[config_cpu] == "i686":
534 opt_flags.append ("-march=i686")
536 elif (env['DIST_TARGET'] == 'powerpc') or (env['DIST_TARGET'] == 'powerpc64'):
538 cpu_line = os.popen ("cat /proc/cpuinfo | grep '^cpu'").read()[:-1]
540 ppc_type = cpu_line.split (": ")[1]
541 if re.search ("altivec", ppc_type) != None:
542 opt_flags.append ("-maltivec")
543 opt_flags.append ("-mabi=altivec")
545 ppc_type = ppc_type.split (", ")[0]
546 if re.match ("74[0145][0578]A?", ppc_type) != None:
547 opt_flags.append ("-mcpu=7400")
548 opt_flags.append ("-mtune=7400")
549 elif re.match ("750", ppc_type) != None:
550 opt_flags.append ("-mcpu=750")
551 opt_flags.append ("-mtune=750")
552 elif re.match ("PPC970", ppc_type) != None:
553 opt_flags.append ("-mcpu=970")
554 opt_flags.append ("-mtune=970")
555 elif re.match ("Cell Broadband Engine", ppc_type) != None:
556 opt_flags.append ("-mcpu=cell")
557 opt_flags.append ("-mtune=cell")
559 if ((env['DIST_TARGET'] == 'i686') or (env['DIST_TARGET'] == 'x86_64')) \
560 and build_host_supports_sse and env['ENABLE_OPTIMIZATIONS']:
561 opt_flags.extend (["-msse", "-mfpmath=sse"])
562 env['USE_SSE'] = 1
564 if ((env['DIST_TARGET'] == 'i686') or (env['DIST_TARGET'] == 'x86_64')) \
565 and build_host_supports_sse2 and env['ENABLE_OPTIMIZATIONS']:
566 opt_flags.extend (["-msse2"])
567 env['USE_SSE2'] = 1
569 #if ((env['DIST_TARGET'] == 'i686') or (env['DIST_TARGET'] == 'x86_64')) \
570 #and build_host_supports_sse2 and env['ENABLE_OPTIMIZATIONS']:
571 #opt_flags.extend (["-msse3"])
572 #env['USE_SSE3'] = 1
574 # build for 64-bit userland?
575 if env['DIST_TARGET'] == "powerpc64":
576 print "Doing a 64-bit PowerPC build"
577 machineflags = { 'CXXFLAGS' : ['-m64'] }
578 env.MergeFlags( machineflags )
579 elif env['DIST_TARGET'] == "x86_64":
580 print "Doing a 64-bit x86 build"
581 machineflags = { 'CXXFLAGS' : ['-m64'] }
582 env.MergeFlags( machineflags )
583 needs_fPIC = True
584 else:
585 print "Doing a 32-bit build"
586 machineflags = { 'CXXFLAGS' : ['-m32'] }
587 env.MergeFlags( machineflags )
589 if needs_fPIC or ( env.has_key('COMPILE_FLAGS') and '-fPIC' in env['COMPILE_FLAGS'] ):
590 env.MergeFlags( "-fPIC" )
592 # end of processor-specific section
593 if env['ENABLE_OPTIMIZATIONS']:
594 opt_flags.extend (["-fomit-frame-pointer","-ffast-math","-funroll-loops"])
595 env.MergeFlags( opt_flags )
596 print "Doing an optimized build..."
598 env['REVISION'] = os.popen('svnversion .').read()[:-1]
599 # This may be as simple as '89' or as complex as '4123:4184M'.
600 # We'll just use the last bit.
601 env['REVISION'] = env['REVISION'].split(':')[-1]
603 # try to circumvent localized versions
604 if len(env['REVISION']) >= 5 and env['REVISION'][0:6] == 'export':
605 env['REVISION'] = ''
607 # avoid the 1.999.41- type of version for exported versions
608 if env['REVISION'] != '':
609 env['REVISIONSTRING'] = '-' + env['REVISION']
610 else:
611 env['REVISIONSTRING'] = ''
613 env['FFADO_API_VERSION'] = FFADO_API_VERSION
615 env['PACKAGE'] = "libffado"
616 env['VERSION'] = FFADO_VERSION
617 env['LIBVERSION'] = "1.0.0"
619 env['CONFIGDIR'] = "~/.ffado"
620 env['CACHEDIR'] = "~/.ffado"
622 env['USER_CONFIG_FILE'] = env['CONFIGDIR'] + "/configuration"
623 env['SYSTEM_CONFIG_FILE'] = env['SHAREDIR'] + "/configuration"
625 env['REGISTRATION_URL'] = "http://ffado.org/deviceregistration/register.php?action=register"
628 # To have the top_srcdir as the doxygen-script is used from auto*
630 env['top_srcdir'] = env.Dir( "." ).abspath
633 # Start building
635 env.ScanReplace( "config.h.in" )
636 env.ScanReplace( "config_debug.h.in" )
637 env.ScanReplace( "version.h.in" )
639 # ensure that the config.h is updated
640 env.Depends( "config.h", "SConstruct" )
641 env.Depends( "config.h", 'cache/options.cache' )
643 # update version.h whenever the version or SVN revision changes
644 env.Depends( "version.h", env.Value(env['REVISION']))
645 env.Depends( "version.h", env.Value(env['VERSION']))
647 env.Depends( "libffado.pc", "SConstruct" )
648 pkgconfig = env.ScanReplace( "libffado.pc.in" )
649 env.Install( env['libdir'] + '/pkgconfig', pkgconfig )
651 env.Install( env['sharedir'], 'configuration' )
653 subdirs=['src','libffado','support','doc']
654 if env['BUILD_TESTS']:
655 subdirs.append('tests')
657 env.SConscript( dirs=subdirs, exports="env" )
659 if 'debian' in COMMAND_LINE_TARGETS:
660 env.SConscript("deb/SConscript", exports="env")
662 # By default only src is built but all is cleaned
663 if not env.GetOption('clean'):
664 Default( 'src' )
665 Default( 'support' )
666 if env['BUILD_TESTS']:
667 Default( 'tests' )
670 # Deal with the DESTDIR vs. xdg-tools conflict (which is basicely that the
671 # xdg-tools can't deal with DESTDIR, so the packagers have to deal with this
672 # their own :-/
674 if len(env.destdir) > 0:
675 if not len( ARGUMENTS.get( "WILL_DEAL_WITH_XDG_MYSELF", "" ) ) > 0:
676 print """
677 WARNING!
678 You are using the (packagers) option DESTDIR to install this package to a
679 different place than the real prefix. As the xdg-tools can't cope with
680 that, the .desktop-files are not installed by this build, you have to
681 deal with them your own.
682 (And you have to look into the SConstruct to learn how to disable this
683 message.)
685 else:
687 def CleanAction( action ):
688 if env.GetOption( "clean" ):
689 env.Execute( action )
691 if env.has_key( 'XDG_TOOLS' ) and env.has_key( 'PYUIC4' ):
692 if not env.GetOption("clean"):
693 action = "install"
694 else:
695 action = "uninstall"
696 mixerdesktopaction = env.Action( "-xdg-desktop-menu %s support/xdg/ffado.org-ffadomixer.desktop" % action )
697 mixericonaction = env.Action( "-xdg-icon-resource %s --size 64 --novendor --context apps support/xdg/hi64-apps-ffado.png ffado" % action )
698 env.Command( "__xdgstuff1", None, mixerdesktopaction )
699 env.Command( "__xdgstuff2", None, mixericonaction )
700 env.Alias( "install", ["__xdgstuff1", "__xdgstuff2" ] )
701 CleanAction( mixerdesktopaction )
702 CleanAction( mixericonaction )
705 # Create a tags-file for easier emacs/vim-source-browsing
706 # I don't know if the dependency is right...
708 findcommand = "find . \( -path \"*.h\" -o -path \"*.cpp\" -o -path \"*.c\" \) \! -path \"*.svn*\" \! -path \"./doc*\" \! -path \"./cache*\""
709 env.Command( "tags", "", findcommand + " |xargs ctags" )
710 env.Command( "TAGS", "", findcommand + " |xargs etags" )
711 env.AlwaysBuild( "tags", "TAGS" )
712 if 'NoCache' in dir(env):
713 env.NoCache( "tags", "TAGS" )
715 # Another convinience target
716 if env.GetOption( "clean" ):
717 env.Execute( "rm cache/objects -Rf" )
720 # vim: ts=4 sw=4 et