10 from waflib
.Scripting
import Dist
12 parallel_debug
= False
16 DBUS_NAME_BASE
= 'org.ladish'
19 # these variables are mandatory ('/' are converted automatically)
23 from Logs
import pprint
25 def display_msg(conf
, msg
="", status
= None, color
= None):
27 conf
.msg(msg
, status
, color
)
31 def display_raw_text(conf
, text
, color
= 'NORMAL'):
32 pprint(color
, text
, sep
= '')
34 def display_line(conf
, text
, color
= 'NORMAL'):
35 pprint(color
, text
, sep
= os
.linesep
)
44 opt
.load('compiler_c')
45 opt
.load('compiler_cxx')
48 opt
.add_option('--enable-pkg-config-dbus-service-dir', action
='store_true', default
=False, help='force D-Bus service install dir to be one returned by pkg-config')
49 opt
.add_option('--enable-liblash', action
='store_true', default
=False, help='Build LASH compatibility library')
50 opt
.add_option('--enable-pylash', action
='store_true', default
=False, help='Build python bindings for LASH compatibility library')
51 opt
.add_option('--debug', action
='store_true', default
=False, dest
='debug', help="Build debuggable binaries")
52 opt
.add_option('--doxygen', action
='store_true', default
=False, help='Enable build of doxygen documentation')
53 opt
.add_option('--distnodeps', action
='store_true', default
=False, help="When creating distribution tarball, don't package git submodules")
54 opt
.add_option('--distname', type='string', default
=None, help="Name for the distribution tarball")
55 opt
.add_option('--distsuffix', type='string', default
="", help="String to append to the distribution tarball name")
56 opt
.add_option('--tagdist', action
='store_true', default
=False, help='Create of git tag for distname')
58 opt
.load('parallel_debug')
60 def add_cflag(conf
, flag
):
61 conf
.env
.append_unique('CXXFLAGS', flag
)
62 conf
.env
.append_unique('CFLAGS', flag
)
64 def add_linkflag(conf
, flag
):
65 conf
.env
.append_unique('LINKFLAGS', flag
)
67 def check_gcc_optimizations_enabled(flags
):
68 gcc_optimizations_enabled
= False
70 if len(flag
) < 2 or flag
[0] != '-' or flag
[1] != 'O':
73 gcc_optimizations_enabled
= True;
75 gcc_optimizations_enabled
= flag
[2] != '0';
76 return gcc_optimizations_enabled
78 def create_service_taskgen(bld
, target
, opath
, binary
):
80 features
= 'subst', # the feature 'subst' overrides the source/target processing
81 source
= os
.path
.join('daemon', 'dbus.service.in'), # list of string or nodes
82 target
= target
, # list of strings or nodes
83 install_path
= bld
.env
['DBUS_SERVICES_DIR'] + os
.path
.sep
,
84 # variables to use in the substitution
85 dbus_object_path
= opath
,
86 daemon_bin_path
= os
.path
.join(bld
.env
['PREFIX'], 'bin', binary
))
89 conf
.load('compiler_c')
90 conf
.load('compiler_cxx')
95 conf
.load('parallel_debug')
97 # dladdr() is used by daemon/sigsegv.c
98 # dlvsym() is used by the alsapid library
99 conf
.check_cc(msg
="Checking for libdl", lib
=['dl'], uselib_store
='DL')
101 # forkpty() is used by ladishd
102 conf
.check_cc(msg
="Checking for libutil", lib
=['util'], uselib_store
='UTIL')
107 errmsg
= "not installed, see http://jackaudio.org/",
108 args
= '--cflags --libs')
113 errmsg
= "not installed, see http://www.alsa-project.org/",
118 atleast_version
= '1.0.0',
120 errmsg
= "not installed, see http://dbus.freedesktop.org/",
121 args
= '--cflags --libs')
123 dbus_dir
= conf
.check_cfg(package
='dbus-1', args
='--variable=session_bus_services_dir', msg
="Retrieving D-Bus services dir")
127 dbus_dir
= dbus_dir
.strip()
128 conf
.env
['DBUS_SERVICES_DIR_REAL'] = dbus_dir
130 if Options
.options
.enable_pkg_config_dbus_service_dir
:
131 conf
.env
['DBUS_SERVICES_DIR'] = dbus_dir
133 conf
.env
['DBUS_SERVICES_DIR'] = os
.path
.join(os
.path
.normpath(conf
.env
['PREFIX']), 'share', 'dbus-1', 'services')
135 conf
.env
['LIBDIR'] = os
.path
.join(os
.path
.normpath(conf
.env
['PREFIX']), 'lib')
137 conf
.env
['BUILD_DOXYGEN_DOCS'] = Options
.options
.doxygen
142 errmsg
= "not installed, see http://e2fsprogs.sourceforge.net/",
143 args
= '--cflags --libs')
146 header_name
='expat.h',
148 errmsg
= "not installed, see http://expat.sourceforge.net/")
150 conf
.env
['LIB_EXPAT'] = ['expat']
154 if build_gui
and not conf
.check_cfg(
155 package
= 'glib-2.0',
157 errmsg
= "not installed, see http://www.gtk.org/",
158 args
= '--cflags --libs'):
161 if build_gui
and not conf
.check_cfg(
162 package
= 'dbus-glib-1',
164 errmsg
= "not installed, see http://dbus.freedesktop.org/",
165 args
= '--cflags --libs'):
168 if build_gui
and not conf
.check_cfg(
169 package
= 'gtk+-2.0',
171 atleast_version
= '2.20.0',
172 errmsg
= "not installed, see http://www.gtk.org/",
173 args
= '--cflags --libs'):
176 if build_gui
and not conf
.check_cfg(
177 package
= 'gtkmm-2.4',
179 atleast_version
= '2.10.0',
180 errmsg
= "not installed, see http://www.gtkmm.org",
181 args
= '--cflags --libs'):
184 if build_gui
and not conf
.check_cfg(
185 package
= 'libgnomecanvasmm-2.6',
187 atleast_version
= '2.6.0',
188 errmsg
= "not installed, see http://www.gtkmm.org",
189 args
= '--cflags --libs'):
192 #autowaf.check_pkg(conf, 'gtkmm-2.4', uselib_store='GLIBMM', atleast_version='2.10.0', mandatory=True)
193 #autowaf.check_pkg(conf, 'libgnomecanvasmm-2.6', uselib_store='GNOMECANVASMM', atleast_version='2.6.0', mandatory=True)
195 #autowaf.check_pkg(conf, 'libgvc', uselib_store='AGRAPH', atleast_version='2.8', mandatory=False)
198 # We need the boost headers package (e.g. libboost-dev)
199 # shared_ptr.hpp and weak_ptr.hpp
200 build_gui
= conf
.check_boost(
202 errmsg
="not found, see http://boost.org/")
204 conf
.env
['BUILD_GLADISH'] = build_gui
206 conf
.env
['BUILD_LIBLASH'] = Options
.options
.enable_liblash
207 conf
.env
['BUILD_PYLASH'] = Options
.options
.enable_pylash
208 if conf
.env
['BUILD_PYLASH'] and not conf
.env
['BUILD_LIBLASH']:
209 conf
.fatal("pylash build was requested but liblash was not")
210 conf
.env
['BUILD_PYLASH'] = False
211 if conf
.env
['BUILD_PYLASH']:
212 conf
.check_python_version()
213 conf
.check_python_headers()
215 add_cflag(conf
, '-fvisibility=hidden')
217 conf
.env
['BUILD_WERROR'] = not RELEASE
218 add_cflag(conf
, '-Wall')
219 # lash_wrap code is generated by swig and causes warnings
220 if not conf
.env
['BUILD_PYLASH']:
221 add_cflag(conf
, '-Wextra')
222 conf
.env
.append_unique('CXXFLAGS', '-Wno-unused-parameter') # the UNUSED() macro doesnt work for C++
223 if conf
.env
['BUILD_WERROR']:
224 add_cflag(conf
, '-Werror')
225 # for pre gcc-4.4, enable optimizations so use of uninitialized variables gets detected
227 is_gcc
= conf
.env
['CC_NAME'] == 'gcc'
230 for n
in conf
.env
['CC_VERSION']:
231 gcc_ver
.append(int(n
))
232 if gcc_ver
[0] < 4 or gcc_ver
[1] < 4:
233 #print "optimize force enable is required"
234 if not check_gcc_optimizations_enabled(conf
.env
['CFLAGS']):
235 if Options
.options
.debug
:
236 print "C optimization must be forced in order to enable -Wuninitialized"
237 print "However this will not be made because debug compilation is enabled"
239 print "C optimization forced in order to enable -Wuninitialized"
240 conf
.env
.append_unique('CFLAGS', "-O")
244 conf
.env
['BUILD_DEBUG'] = Options
.options
.debug
245 if conf
.env
['BUILD_DEBUG']:
246 add_cflag(conf
, '-g')
247 add_cflag(conf
, '-O0')
248 add_linkflag(conf
, '-g')
250 conf
.env
['DATA_DIR'] = os
.path
.normpath(os
.path
.join(conf
.env
['PREFIX'], 'share', APPNAME
))
251 conf
.env
['LOCALE_DIR'] = os
.path
.normpath(os
.path
.join(conf
.env
['PREFIX'], 'share', 'locale'))
253 # write some parts of the configure environment to the config.h file
254 conf
.define('DATA_DIR', conf
.env
['DATA_DIR'])
255 conf
.define('LOCALE_DIR', conf
.env
['LOCALE_DIR'])
256 conf
.define('PACKAGE_VERSION', VERSION
)
257 conf
.define('DBUS_NAME_BASE', DBUS_NAME_BASE
)
258 conf
.define('DBUS_BASE_PATH', '/' + DBUS_NAME_BASE
.replace('.', '/'))
259 conf
.define('BASE_NAME', APPNAME
)
260 conf
.define('_GNU_SOURCE', 1)
261 conf
.write_config_header('config.h')
265 display_msg(conf
, "==================")
266 version_msg
= APPNAME
+ "-" + VERSION
268 if os
.access('version.h', os
.R_OK
):
269 data
= file('version.h').read()
270 m
= re
.match(r
'^#define GIT_VERSION "([^"]*)"$', data
)
272 version_msg
+= " exported from " + m
.group(1)
273 elif os
.access('.git', os
.R_OK
):
274 version_msg
+= " git revision will checked and eventually updated during build"
276 display_msg(conf
, version_msg
)
279 display_msg(conf
, "Install prefix", conf
.env
['PREFIX'], 'CYAN')
281 display_msg(conf
, 'Build gladish', yesno(conf
.env
['BUILD_GLADISH']))
282 display_msg(conf
, 'Build liblash', yesno(Options
.options
.enable_liblash
))
283 display_msg(conf
, 'Build pylash', yesno(conf
.env
['BUILD_PYLASH']))
284 display_msg(conf
, 'Treat warnings as errors', yesno(conf
.env
['BUILD_WERROR']))
285 display_msg(conf
, 'Debuggable binaries', yesno(conf
.env
['BUILD_DEBUG']))
286 display_msg(conf
, 'Build doxygen documentation', yesno(conf
.env
['BUILD_DOXYGEN_DOCS']))
288 if conf
.env
['DBUS_SERVICES_DIR'] != conf
.env
['DBUS_SERVICES_DIR_REAL']:
290 display_line(conf
, "WARNING: D-Bus session services directory as reported by pkg-config is", 'RED')
291 display_raw_text(conf
, "WARNING:", 'RED')
292 display_line(conf
, conf
.env
['DBUS_SERVICES_DIR_REAL'], 'CYAN')
293 display_line(conf
, 'WARNING: but service file will be installed in', 'RED')
294 display_raw_text(conf
, "WARNING:", 'RED')
295 display_line(conf
, conf
.env
['DBUS_SERVICES_DIR'], 'CYAN')
296 display_line(conf
, 'WARNING: You may need to adjust your D-Bus configuration after installing ladish', 'RED')
297 display_line(conf
, 'WARNING: You can override dbus service install directory', 'RED')
298 display_line(conf
, 'WARNING: with --enable-pkg-config-dbus-service-dir option to this script', 'RED')
300 display_msg(conf
, 'C compiler flags', repr(conf
.env
['CFLAGS']))
301 display_msg(conf
, 'C++ compiler flags', repr(conf
.env
['CXXFLAGS']))
303 if not conf
.env
['BUILD_GLADISH']:
305 display_line(conf
, "WARNING: The GUI frontend will not built", 'RED')
310 bld
= self
.generator
.bld
311 header
= self
.outputs
[0].abspath()
312 if os
.access('./version.h', os
.R_OK
):
313 header
= os
.path
.join(os
.getcwd(), out
, "version.h")
314 shutil
.copy('./version.h', header
)
315 data
= file(header
).read()
316 m
= re
.match(r
'^#define GIT_VERSION "([^"]*)"$', data
)
318 self
.ver
= m
.group(1)
319 pprint('BLUE', "tarball from git revision " + self
.ver
)
324 if bld
.srcnode
.find_node('.git'):
325 self
.ver
= bld
.cmd_and_log("LANG= git rev-parse HEAD", quiet
=waflib
.Context
.BOTH
).splitlines()[0]
326 if bld
.cmd_and_log("LANG= git diff-index --name-only HEAD", quiet
=waflib
.Context
.BOTH
).splitlines():
329 pprint('BLUE', "git revision " + self
.ver
)
333 fi
= open(header
, 'w')
334 fi
.write('#define GIT_VERSION "%s"\n' % self
.ver
)
338 if not bld
.env
['DATA_DIR']:
339 raise "DATA_DIR is emtpy"
341 bld(rule
=git_ver
, target
='version.h', update_outputs
=True, always
=True, ext_out
=['.h'])
343 daemon
= bld
.program(source
= [], features
= 'c cprogram', includes
= [bld
.path
.get_bld()])
344 daemon
.target
= 'ladishd'
345 daemon
.uselib
= 'DBUS-1 UUID EXPAT DL UTIL'
346 daemon
.ver_header
= 'version.h'
347 # Make backtrace function lookup to work for functions in the executable itself
348 daemon
.env
.append_value("LINKFLAGS", ["-Wl,-E"])
350 daemon
.source
= ["string_constants.c"]
369 'studio_jack_conf.c',
375 'cmd_rename_studio.c',
377 'cmd_start_studio.c',
379 'cmd_unload_studio.c',
381 'cmd_change_app_state.c',
385 'cmd_save_project.c',
386 'cmd_unload_project.c',
387 'cmd_load_project.c',
400 daemon
.source
.append(os
.path
.join("daemon", source
))
409 "lash_client_proxy.c",
411 daemon
.source
.append(os
.path
.join("proxies", source
))
420 daemon
.source
.append(os
.path
.join("cdbus", source
))
428 daemon
.source
.append(os
.path
.join("common", source
))
430 daemon
.source
.append(os
.path
.join("alsapid", "helper.c"))
432 # process dbus.service.in -> ladish.service
433 create_service_taskgen(bld
, DBUS_NAME_BASE
+ '.service', DBUS_NAME_BASE
, daemon
.target
)
435 #####################################################
437 jmcore
= bld
.program(source
= [], features
= 'c cprogram', includes
= [bld
.path
.get_bld()])
438 jmcore
.target
= 'jmcore'
439 jmcore
.uselib
= 'DBUS-1 JACK'
440 jmcore
.defines
= ['LOG_OUTPUT_STDOUT']
441 jmcore
.source
= ['jmcore.c']
446 jmcore
.source
.append(os
.path
.join("common", source
))
455 jmcore
.source
.append(os
.path
.join("cdbus", source
))
457 create_service_taskgen(bld
, DBUS_NAME_BASE
+ '.jmcore.service', DBUS_NAME_BASE
+ ".jmcore", jmcore
.target
)
459 #####################################################
461 ladiconfd
= bld
.program(source
= [], features
= 'c cprogram', includes
= [bld
.path
.get_bld()])
462 ladiconfd
.target
= 'ladiconfd'
463 ladiconfd
.uselib
= 'DBUS-1'
464 ladiconfd
.defines
= ['LOG_OUTPUT_STDOUT']
465 ladiconfd
.source
= ['conf.c']
472 ladiconfd
.source
.append(os
.path
.join("common", source
))
481 ladiconfd
.source
.append(os
.path
.join("cdbus", source
))
483 create_service_taskgen(bld
, DBUS_NAME_BASE
+ '.conf.service', DBUS_NAME_BASE
+ ".conf", ladiconfd
.target
)
485 #####################################################
487 alsapid
= bld
.shlib(source
= [], features
= 'c cshlib', includes
= [bld
.path
.get_bld()])
488 alsapid
.uselib
= 'DL'
489 alsapid
.target
= 'alsapid'
494 alsapid
.source
.append(os
.path
.join("alsapid", source
))
496 #####################################################
498 if bld
.env
['BUILD_LIBLASH']:
499 liblash
= bld
.shlib(source
= [], features
= 'c cshlib', includes
= [bld
.path
.get_bld()])
500 liblash
.uselib
= 'DBUS-1'
501 liblash
.target
= 'lash'
502 liblash
.vnum
= "1.1.1"
503 liblash
.defines
= ['LOG_OUTPUT_STDOUT']
504 liblash
.source
= [os
.path
.join("lash_compat", "liblash", 'lash.c')]
511 liblash
.source
.append(os
.path
.join("common", source
))
519 liblash
.source
.append(os
.path
.join("cdbus", source
))
521 bld
.install_files('${PREFIX}/include/lash', bld
.path
.ant_glob('lash_compat/liblash/lash/*.h'))
523 # process lash-1.0.pc.in -> lash-1.0.pc
525 features
= 'subst', # the feature 'subst' overrides the source/target processing
526 source
= os
.path
.join("lash_compat", 'lash-1.0.pc.in'), # list of string or nodes
527 target
= 'lash-1.0.pc', # list of strings or nodes
528 install_path
= '${LIBDIR}/pkgconfig/',
529 # variables to use in the substitution
530 prefix
= bld
.env
['PREFIX'],
531 exec_prefix
= bld
.env
['PREFIX'],
532 libdir
= bld
.env
['LIBDIR'],
533 includedir
= os
.path
.normpath(bld
.env
['PREFIX'] + '/include'))
535 #####################################################
537 if bld
.env
['BUILD_PYLASH']:
538 pylash
= bld
.shlib(source
= [], features
= 'c cshlib pyext', includes
= ["lash_compat/liblash"])
539 pylash
.target
= '_lash'
541 pylash
.install_path
= '${PYTHONDIR}'
547 pylash
.source
.append(os
.path
.join("lash_compat", "pylash", source
))
549 bld
.install_files('${PYTHONDIR}', os
.path
.join("lash_compat", "pylash", "lash.py"))
551 #####################################################
553 if bld
.env
['BUILD_GLADISH']:
554 gladish
= bld
.program(source
= [], features
= 'c cxx cxxprogram', includes
= [bld
.path
.get_bld()])
555 gladish
.target
= 'gladish'
556 gladish
.defines
= ['LOG_OUTPUT_STDOUT']
557 gladish
.uselib
= 'DBUS-1 DBUS-GLIB-1 GTKMM-2.4 LIBGNOMECANVASMM-2.6 GTK+-2.0'
559 gladish
.source
= ["string_constants.c"]
563 'load_project_dialog.c',
564 'save_project_dialog.c',
565 'project_properties.c',
572 'create_room_dialog.c',
590 gladish
.source
.append(os
.path
.join("gui", source
))
601 gladish
.source
.append(os
.path
.join("gui", "flowcanvas", source
))
609 'app_supervisor_proxy.c',
613 gladish
.source
.append(os
.path
.join("proxies", source
))
619 gladish
.source
.append(os
.path
.join("cdbus", source
))
626 gladish
.source
.append(os
.path
.join("common", source
))
628 # GtkBuilder UI definitions (XML)
629 bld
.install_files('${DATA_DIR}', 'gui/gladish.ui')
631 bld
.install_files('${PREFIX}/bin', 'ladish_control', chmod
=0755)
633 # 'Desktop' file (menu entry, icon, etc)
634 bld
.install_files('${PREFIX}/share/applications/', 'gui/gladish.desktop', chmod
=0644)
637 icon_sizes
= ['16x16', '22x22', '24x24', '32x32', '48x48', '256x256']
638 for icon_size
in icon_sizes
:
639 bld
.path
.ant_glob('art/' + icon_size
+ '/apps/*.png')
640 bld
.install_files('${PREFIX}/share/icons/hicolor/' + icon_size
+ '/apps/', 'art/' + icon_size
+ '/apps/gladish.png')
643 for status
in ["down", "unloaded", "started", "stopped", "warning", "error"]:
644 status_images
.append("art/status_" + status
+ ".png")
646 bld
.install_files('${DATA_DIR}', status_images
)
647 bld
.install_files('${DATA_DIR}', "art/ladish-logo-128x128.png")
648 bld
.install_files('${DATA_DIR}', ["AUTHORS", "README", "NEWS"])
649 bld
.install_as('${DATA_DIR}/COPYING', "gpl2.txt")
651 if bld
.env
['BUILD_DOXYGEN_DOCS'] == True:
652 html_docs_source_dir
= "build/default/html"
653 if bld
.cmd
== 'clean':
654 if os
.access(html_docs_source_dir
, os
.R_OK
):
655 pprint('CYAN', "Removing doxygen generated documentation...")
656 shutil
.rmtree(html_docs_source_dir
)
657 pprint('CYAN', "Removing doxygen generated documentation done.")
658 elif bld
.cmd
== 'build':
659 if not os
.access(html_docs_source_dir
, os
.R_OK
):
660 os
.popen("doxygen").read()
662 pprint('CYAN', "doxygen documentation already built.")
664 bld(features
='intltool_po', appname
=APPNAME
, podir
='po', install_path
="${LOCALE_DIR}")
667 source_root
= os
.path
.dirname(Utils
.g_module
.root_path
)
668 if 'relpath' in os
.path
.__all
__:
669 source_root
= os
.path
.relpath(source_root
)
671 paths
+= " " + os
.path
.join(source_root
, "common")
672 paths
+= " " + os
.path
.join(source_root
, "cdbus")
673 paths
+= " " + os
.path
.join(source_root
, "proxies")
674 paths
+= " " + os
.path
.join(source_root
, "daemon")
675 paths
+= " " + os
.path
.join(source_root
, "gui")
676 paths
+= " " + os
.path
.join(source_root
, "example-apps")
677 paths
+= " " + os
.path
.join(source_root
, "lib")
678 paths
+= " " + os
.path
.join(source_root
, "lash_compat", "liblash")
679 paths
+= " " + os
.path
.join(source_root
, "lash_compat", "liblash", "lash")
683 '''build tag files for GNU global'''
684 cmd
= "find %s -mindepth 1 -maxdepth 1 -name '*.[ch]' -print | gtags --statistics -f -" % get_tags_dirs()
685 #print("Running: %s" % cmd)
689 '''build TAGS file using etags'''
690 cmd
= "find %s -mindepth 1 -maxdepth 1 -name '*.[ch]' -print | etags -" % get_tags_dirs()
691 #print("Running: %s" % cmd)
693 os
.system("stat -c '%y' TAGS")
695 class ladish_dist(waflib
.Scripting
.Dist
):
701 if Options
.options
.distname
:
702 self
.base_name
= Options
.options
.distname
705 self
.base_name
= self
.cmd_and_log("LANG= git describe --tags", quiet
=waflib
.Context
.BOTH
).splitlines()[0]
707 self
.base_name
= APPNAME
+ '-' + VERSION
708 self
.base_name
+= Options
.options
.distsuffix
710 #print self.base_name
712 if Options
.options
.distname
and Options
.options
.tagdist
:
713 ret
= self
.exec_command("LANG= git tag " + self
.base_name
)
715 raise waflib
.Errors
.WafError('git tag creation failed')
717 def get_base_name(self
):
718 return self
.base_name
721 excl
= Dist
.get_excl(self
)
723 excl
+= ' .gitmodules'
729 if Options
.options
.distnodeps
:
738 shutil
.copy('./build/version.h', "./")
740 super(ladish_dist
, self
).execute()
742 os
.remove("version.h")