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
32 from string
import Template
34 import distutils
.sysconfig
36 if not os
.path
.isdir( "cache" ):
37 os
.makedirs( "cache" )
39 opts
= Variables( "cache/options.cache" )
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.\
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
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:
91 * Usage of additional flags is not supported by the ffado-devs.
94 * Currentl value is '%s'
95 ''' % env
['COMPILE_FLAGS']
96 env
.MergeFlags(env
['COMPILE_FLAGS'])
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
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.
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
)
127 def CheckForApp( context
, app
):
128 context
.Message( "Checking whether '" + app
+ "' executes " )
129 ret
= context
.TryAction( app
)
130 context
.Result( 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] )
139 def CompilerCheck( context
):
140 context
.Message( "Checking for a working C-compiler " )
141 ret
= context
.TryRun( """
145 printf( "Hello World!" );
148 context
.Result( ret
)
151 context
.Message( "Checking for a working C++-compiler " )
152 ret
= context
.TryRun( """
156 std::cout << "Hello World!" << std::endl;
159 context
.Result( 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
)
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
,
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
)
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
)
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]
199 print "not installed"
203 return VersionInt(ret
)
205 if env
['SERIALIZE_USE_EXPAT']:
206 env
['SERIALIZE_USE_EXPAT']=1
208 env
['SERIALIZE_USE_EXPAT']=0
210 if env
['ENABLE_BOUNCE'] or env
['ENABLE_ALL']:
211 env
['REQUIRE_LIBAVC']=1
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++."
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."
229 # The following checks are for headers and libs and packages we need.
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>' )
238 'libraw1394' : '2.0.5',
239 'libiec61883' : '1.1.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'))
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':
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"
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.
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
)):
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"
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
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"
302 FFADO_API_VERSION
="8"
303 print "Will not report SetBufferSize API version at runtime"
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:
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.
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']
333 oldcf
= env
.Append(CFLAGS
= '-std=c99')
334 if conf
.CheckLibWithHeader( "m", "math.h", "c", "lrint(3.2);" ):
338 if conf
.CheckLibWithHeader( "m", "math.h", "c", "lrintf(3.2);" ):
342 env
['HAVE_LRINT'] = HAVE_LRINT
;
343 env
['HAVE_LRINTF'] = HAVE_LRINTF
;
344 env
.Replace(CFLAGS
=oldcf
)
347 # Optional checks follow:
352 if conf
.CheckForApp( 'which pyuic4' ) and conf
.CheckForPyModule( 'dbus' ) and conf
.CheckForPyModule( 'PyQt4' ) and conf
.CheckForPyModule( 'dbus.mainloop.qt' ):
356 if conf
.CheckForApp( 'xdg-desktop-menu --help' ):
357 env
['XDG_TOOLS'] = True
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'):
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
370 Therefor the qt4 mixer will not get installed.
374 # Optional pkg-config
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'] = ""
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
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
400 env
['DBUS1_FLAGS'] += " -DDBUS_HAS_THREADS_INIT_DEFAULT"
403 config_guess
= conf
.ConfigGuess()
408 print "Doing a DEBUG build"
409 env
.MergeFlags( "-DDEBUG -Wall -g" )
411 env
.MergeFlags( "-O2 -DNDEBUG" )
414 print "Doing a PROFILE build"
415 env
.MergeFlags( "-Wall -g" )
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'] )
472 env
.Alias( "install", env
['pypkgdir'] )
475 # shamelessly copied from the Ardour scons file
481 # guess at the platform, used to define compiler flags
487 config
= config_guess
.split ("-")
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'
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"])
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"])
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"])
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
)
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':
607 # avoid the 1.999.41- type of version for exported versions
608 if env
['REVISION'] != '':
609 env
['REVISIONSTRING'] = '-' + env
['REVISION']
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
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'):
666 if env
['BUILD_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
674 if len(env
.destdir
) > 0:
675 if not len( ARGUMENTS
.get( "WILL_DEAL_WITH_XDG_MYSELF", "" ) ) > 0:
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
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"):
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" )