12 DBUS_NAME_BASE
= 'org.ladish'
15 # these variables are mandatory ('/' are converted automatically)
19 def display_msg(conf
, msg
="", status
= None, color
= None):
21 conf
.check_message_1(msg
)
22 conf
.check_message_2(status
, color
)
24 Utils
.pprint('NORMAL', msg
)
26 def display_raw_text(conf
, text
, color
= 'NORMAL'):
27 Utils
.pprint(color
, text
, sep
= '')
29 def display_line(conf
, text
, color
= 'NORMAL'):
30 Utils
.pprint(color
, text
, sep
= os
.linesep
)
39 opt
.tool_options('compiler_cc')
40 opt
.tool_options('compiler_cxx')
41 opt
.tool_options('boost')
42 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')
43 opt
.add_option('--enable-liblash', action
='store_true', default
=False, help='Build LASH compatibility library')
44 opt
.add_option('--debug', action
='store_true', default
=False, dest
='debug', help="Build debuggable binaries")
45 opt
.add_option('--doxygen', action
='store_true', default
=False, help='Enable build of doxygen documentation')
46 opt
.add_option('--distnodeps', action
='store_true', default
=False, help="When creating distribution tarball, don't package git submodules")
48 def add_cflag(conf
, flag
):
49 conf
.env
.append_unique('CXXFLAGS', flag
)
50 conf
.env
.append_unique('CCFLAGS', flag
)
52 def add_linkflag(conf
, flag
):
53 conf
.env
.append_unique('LINKFLAGS', flag
)
55 def check_gcc_optimizations_enabled(flags
):
56 gcc_optimizations_enabled
= False
58 if len(flag
) < 2 or flag
[0] != '-' or flag
[1] != 'O':
61 gcc_optimizations_enabled
= True;
63 gcc_optimizations_enabled
= flag
[2] != '0';
64 return gcc_optimizations_enabled
67 conf
.check_tool('compiler_cc')
68 conf
.check_tool('compiler_cxx')
69 conf
.check_tool('boost')
74 errmsg
= "not installed, see http://jackaudio.org/",
75 args
= '--cflags --libs')
79 atleast_version
= '1.0.0',
81 errmsg
= "not installed, see http://dbus.freedesktop.org/",
82 args
= '--cflags --libs')
84 dbus_dir
= conf
.check_cfg(package
='dbus-1', args
='--variable=session_bus_services_dir', msg
="Retrieving D-Bus services dir")
88 dbus_dir
= dbus_dir
.strip()
89 conf
.env
['DBUS_SERVICES_DIR_REAL'] = dbus_dir
91 if Options
.options
.enable_pkg_config_dbus_service_dir
:
92 conf
.env
['DBUS_SERVICES_DIR'] = dbus_dir
94 conf
.env
['DBUS_SERVICES_DIR'] = os
.path
.join(os
.path
.normpath(conf
.env
['PREFIX']), 'share', 'dbus-1', 'services')
96 conf
.env
['LIBDIR'] = os
.path
.join(os
.path
.normpath(conf
.env
['PREFIX']), 'lib')
98 conf
.env
['BUILD_LIBLASH'] = Options
.options
.enable_liblash
99 conf
.env
['BUILD_DOXYGEN_DOCS'] = Options
.options
.doxygen
104 errmsg
= "not installed, see http://e2fsprogs.sourceforge.net/",
105 args
= '--cflags --libs')
108 header_name
='expat.h',
110 errmsg
= "not installed, see http://expat.sourceforge.net/")
112 conf
.env
['LIB_EXPAT'] = ['expat']
116 if build_gui
and not conf
.check_cfg(
117 package
= 'glib-2.0',
119 errmsg
= "not installed, see http://www.gtk.org/",
120 args
= '--cflags --libs'):
123 if build_gui
and not conf
.check_cfg(
124 package
= 'dbus-glib-1',
126 errmsg
= "not installed, see http://dbus.freedesktop.org/",
127 args
= '--cflags --libs'):
130 if build_gui
and not conf
.check_cfg(
131 package
= 'gtk+-2.0',
133 atleast_version
= '2.16.0',
134 errmsg
= "not installed, see http://www.gtk.org/",
135 args
= '--cflags --libs'):
138 if build_gui
and not conf
.check_cfg(
139 package
= 'flowcanvas',
141 atleast_version
= '0.6.4',
142 errmsg
= "not installed, see http://drobilla.net/software/flowcanvas/",
143 args
= '--cflags --libs'):
147 # We need the boost headers package (e.g. libboost-dev)
148 # shared_ptr.hpp and weak_ptr.hpp
149 build_gui
= conf
.check_boost(errmsg
="not found, see http://boost.org/")
151 conf
.env
['BUILD_GLADISH'] = build_gui
153 conf
.env
['BUILD_WERROR'] = not RELEASE
154 if conf
.env
['BUILD_WERROR']:
155 add_cflag(conf
, '-Wall')
156 add_cflag(conf
, '-Werror')
157 # for pre gcc-4.4, enable optimizations so use of uninitialized variables gets detected
159 is_gcc
= conf
.env
['CC_NAME'] == 'gcc'
162 for n
in conf
.env
['CC_VERSION']:
163 gcc_ver
.append(int(n
))
164 if gcc_ver
[0] < 4 or gcc_ver
[1] < 4:
165 #print "optimize force enable is required"
166 if not check_gcc_optimizations_enabled(conf
.env
['CCFLAGS']):
167 if Options
.options
.debug
:
168 print "C optimization must be forced in order to enable -Wuninitialized"
169 print "However this will not be made because debug compilation is enabled"
171 print "C optimization forced in order to enable -Wuninitialized"
172 conf
.env
.append_unique('CCFLAGS', "-O")
176 conf
.env
['BUILD_DEBUG'] = Options
.options
.debug
177 if conf
.env
['BUILD_DEBUG']:
178 add_cflag(conf
, '-g')
179 add_cflag(conf
, '-O0')
180 add_linkflag(conf
, '-g')
182 conf
.define('DATA_DIR', os
.path
.normpath(os
.path
.join(conf
.env
['PREFIX'], 'share', APPNAME
)))
183 conf
.define('PACKAGE_VERSION', VERSION
)
184 conf
.define('DBUS_NAME_BASE', DBUS_NAME_BASE
)
185 conf
.define('DBUS_BASE_PATH', '/' + DBUS_NAME_BASE
.replace('.', '/'))
186 conf
.define('BASE_NAME', APPNAME
)
187 conf
.define('_GNU_SOURCE', 1)
188 conf
.write_config_header('config.h')
192 display_msg(conf
, "==================")
193 version_msg
= APPNAME
+ "-" + VERSION
195 if os
.access('version.h', os
.R_OK
):
196 data
= file('version.h').read()
197 m
= re
.match(r
'^#define GIT_VERSION "([^"]*)"$', data
)
199 version_msg
+= " exported from " + m
.group(1)
200 elif os
.access('.git', os
.R_OK
):
201 version_msg
+= " git revision will checked and eventually updated during build"
203 display_msg(conf
, version_msg
)
206 display_msg(conf
, "Install prefix", conf
.env
['PREFIX'], 'CYAN')
208 display_msg(conf
, 'Build gladish', yesno(conf
.env
['BUILD_GLADISH']))
209 display_msg(conf
, 'Build liblash', yesno(Options
.options
.enable_liblash
))
210 display_msg(conf
, 'Treat warnings as errors', yesno(conf
.env
['BUILD_WERROR']))
211 display_msg(conf
, 'Debuggable binaries', yesno(conf
.env
['BUILD_DEBUG']))
212 display_msg(conf
, 'Build doxygen documentation', yesno(conf
.env
['BUILD_DOXYGEN_DOCS']))
214 if conf
.env
['DBUS_SERVICES_DIR'] != conf
.env
['DBUS_SERVICES_DIR_REAL']:
216 display_line(conf
, "WARNING: D-Bus session services directory as reported by pkg-config is", 'RED')
217 display_raw_text(conf
, "WARNING:", 'RED')
218 display_line(conf
, conf
.env
['DBUS_SERVICES_DIR_REAL'], 'CYAN')
219 display_line(conf
, 'WARNING: but service file will be installed in', 'RED')
220 display_raw_text(conf
, "WARNING:", 'RED')
221 display_line(conf
, conf
.env
['DBUS_SERVICES_DIR'], 'CYAN')
222 display_line(conf
, 'WARNING: You may need to adjust your D-Bus configuration after installing ladish', 'RED')
223 display_line(conf
, 'WARNING: You can override dbus service install directory', 'RED')
224 display_line(conf
, 'WARNING: with --enable-pkg-config-dbus-service-dir option to this script', 'RED')
226 display_msg(conf
, 'C compiler flags', conf
.env
['CCFLAGS'])
227 display_msg(conf
, 'C++ compiler flags', conf
.env
['CXXFLAGS'])
232 daemon
= bld
.new_task_gen('cc', 'program')
233 daemon
.target
= 'ladishd'
234 daemon
.includes
= "build/default" # XXX config.h version.h and other generated files
235 daemon
.uselib
= 'DBUS-1 UUID EXPAT'
236 daemon
.ver_header
= 'version.h'
237 daemon
.env
.append_value("LINKFLAGS", ["-lutil", "-ldl", "-Wl,-E"])
261 'studio_jack_conf.c',
266 'cmd_rename_studio.c',
268 'cmd_start_studio.c',
270 'cmd_unload_studio.c',
272 'cmd_change_app_state.c',
276 'cmd_save_project.c',
277 'cmd_unload_project.c',
278 'cmd_load_project.c',
286 daemon
.source
.append(os
.path
.join("daemon", source
))
295 daemon
.source
.append(os
.path
.join("proxies", source
))
305 daemon
.source
.append(os
.path
.join("dbus", source
))
310 daemon
.source
.append(os
.path
.join("common", source
))
312 # process dbus.service.in -> ladish.service
314 obj
= bld
.new_task_gen('subst')
315 obj
.source
= os
.path
.join('daemon', 'dbus.service.in')
316 obj
.target
= DBUS_NAME_BASE
+ '.service'
317 obj
.dict = {'dbus_object_path': DBUS_NAME_BASE
,
318 'daemon_bin_path': os
.path
.join(bld
.env
['PREFIX'], 'bin', daemon
.target
)}
319 obj
.install_path
= bld
.env
['DBUS_SERVICES_DIR'] + os
.path
.sep
320 obj
.fun
= misc
.subst_func
322 #####################################################
324 jmcore
= bld
.new_task_gen('cc', 'program')
325 jmcore
.target
= 'jmcore'
326 jmcore
.includes
= "build/default" # XXX config.h version.h and other generated files
327 jmcore
.uselib
= 'DBUS-1 JACK'
328 jmcore
.defines
= ['LOG_OUTPUT_STDOUT']
329 jmcore
.source
= ['jmcore.c']
339 jmcore
.source
.append(os
.path
.join("dbus", source
))
341 if bld
.env
['BUILD_LIBLASH']:
342 liblash
= bld
.new_task_gen('cc', 'shlib')
343 liblash
.includes
= "build/default" # XXX config.h version.h and other generated files
344 liblash
.uselib
= 'DBUS-1'
345 liblash
.target
= 'lash'
346 liblash
.vnum
= "1.1.1"
347 liblash
.defines
= ['LOG_OUTPUT_STDOUT']
348 liblash
.source
= [os
.path
.join("lash_compat", "liblash", 'lash.c')]
350 bld
.install_files('${PREFIX}/include/lash', 'lash_compat/liblash/lash/*.h')
352 # process lash-1.0.pc.in -> lash-1.0.pc
353 obj
= bld
.new_task_gen('subst')
354 obj
.source
= [os
.path
.join("lash_compat", 'lash-1.0.pc.in')]
355 obj
.target
= 'lash-1.0.pc'
356 obj
.dict = {'prefix': bld
.env
['PREFIX'],
357 'exec_prefix': bld
.env
['PREFIX'],
358 'libdir': bld
.env
['LIBDIR'],
359 'includedir': os
.path
.normpath(bld
.env
['PREFIX'] + '/include'),
361 obj
.install_path
= '${LIBDIR}/pkgconfig/'
362 obj
.fun
= misc
.subst_func
364 obj
= bld
.new_task_gen('subst')
365 obj
.source
= os
.path
.join('daemon', 'dbus.service.in')
366 obj
.target
= DBUS_NAME_BASE
+ '.jmcore.service'
367 obj
.dict = {'dbus_object_path': DBUS_NAME_BASE
+ ".jmcore",
368 'daemon_bin_path': os
.path
.join(bld
.env
['PREFIX'], 'bin', jmcore
.target
)}
369 obj
.install_path
= bld
.env
['DBUS_SERVICES_DIR'] + os
.path
.sep
370 obj
.fun
= misc
.subst_func
372 #####################################################
375 # pkgpyexec_LTLIBRARIES = _lash.la
376 # INCLUDES = $(PYTHON_INCLUDES)
377 # _lash_la_LDFLAGS = -module -avoid-version ../liblash/liblash.la
378 # _lash_la_SOURCES = lash.c lash.h lash_wrap.c
379 # pkgpyexec_SCRIPTS = lash.py
380 # CLEANFILES = lash_wrap.c lash.py lash.pyc zynjacku.defs
381 # EXTRA_DIST = test.py lash.i lash.py
382 # lash_wrap.c lash.py: lash.i lash.h
383 # swig -o lash_wrap.c -I$(top_srcdir) -python $(top_srcdir)/$(subdir)/lash.i
385 #####################################################
387 if bld
.env
['BUILD_GLADISH']:
388 gladish
= bld
.new_task_gen('cxx', 'program')
389 gladish
.features
.append('cc')
390 gladish
.target
= 'gladish'
391 gladish
.defines
= ['LOG_OUTPUT_STDOUT']
392 gladish
.includes
= "build/default" # XXX config.h version.h and other generated files
393 gladish
.uselib
= 'DBUS-1 DBUS-GLIB-1 FLOWCANVAS'
401 'load_project_dialog.c',
402 'save_project_dialog.c',
409 'create_room_dialog.c',
412 gladish
.source
.append(os
.path
.join("gui", source
))
419 'app_supervisor_proxy.c',
422 gladish
.source
.append(os
.path
.join("proxies", source
))
428 gladish
.source
.append(os
.path
.join("dbus", source
))
430 # GtkBuilder UI definitions (XML)
431 bld
.install_files(bld
.env
['DATA_DIR'], 'gui/gladish.ui')
433 bld
.install_files('${PREFIX}/bin', 'ladish_control', chmod
=0755)
435 # 'Desktop' file (menu entry, icon, etc)
436 bld
.install_files('${PREFIX}/share/applications/', 'gui/gladish.desktop', chmod
=0644)
439 icon_sizes
= ['16x16', '22x22', '24x24', '32x32', '48x48', '256x256']
440 for icon_size
in icon_sizes
:
441 bld
.install_files('${PREFIX}/share/icons/hicolor/' + icon_size
+ '/apps/', 'art/' + icon_size
+ '/apps/gladish.png')
444 for status
in ["down", "unloaded", "started", "stopped", "warning", "error"]:
445 status_images
.append("art/status_" + status
+ ".png")
447 bld
.install_files(bld
.env
['DATA_DIR'], status_images
)
448 bld
.install_files(bld
.env
['DATA_DIR'], "art/ladish-logo-128x128.png")
449 bld
.install_files(bld
.env
['DATA_DIR'], ["COPYING", "AUTHORS", "README", "NEWS"])
451 if bld
.env
['BUILD_DOXYGEN_DOCS'] == True:
452 html_docs_source_dir
= "build/default/html"
453 if Options
.commands
['clean']:
454 if os
.access(html_docs_source_dir
, os
.R_OK
):
455 Utils
.pprint('CYAN', "Removing doxygen generated documentation...")
456 shutil
.rmtree(html_docs_source_dir
)
457 Utils
.pprint('CYAN', "Removing doxygen generated documentation done.")
458 elif Options
.commands
['build']:
459 if not os
.access(html_docs_source_dir
, os
.R_OK
):
460 os
.popen("doxygen").read()
462 Utils
.pprint('CYAN', "doxygen documentation already built.")
465 source_root
= os
.path
.dirname(Utils
.g_module
.root_path
)
466 if 'relpath' in os
.path
.__all
__:
467 source_root
= os
.path
.relpath(source_root
)
469 paths
+= " " + os
.path
.join(source_root
, "common")
470 paths
+= " " + os
.path
.join(source_root
, "dbus")
471 paths
+= " " + os
.path
.join(source_root
, "proxies")
472 paths
+= " " + os
.path
.join(source_root
, "daemon")
473 paths
+= " " + os
.path
.join(source_root
, "gui")
474 paths
+= " " + os
.path
.join(source_root
, "example-apps")
475 paths
+= " " + os
.path
.join(source_root
, "lib")
476 paths
+= " " + os
.path
.join(source_root
, "lash_compat", "liblash")
477 paths
+= " " + os
.path
.join(source_root
, "lash_compat", "liblash", "lash")
481 '''build tag files for GNU global'''
482 cmd
= "find %s -mindepth 1 -maxdepth 1 -name '*.[ch]' -print | gtags --statistics -f -" % get_tags_dirs()
483 #print("Running: %s" % cmd)
487 '''build TAGS file using etags'''
488 cmd
= "find %s -mindepth 1 -maxdepth 1 -name '*.[ch]' -print | etags -" % get_tags_dirs()
489 #print("Running: %s" % cmd)
491 os
.system("stat -c '%y' TAGS")
494 #print repr(Options.options)
495 if Options
.options
.distnodeps
:
496 shutil
.rmtree('laditools')
497 shutil
.rmtree('flowcanvas')
498 shutil
.rmtree('jack2')
499 shutil
.rmtree('a2jmidid')
500 nodist_files
= ['.gitmodules', 'GTAGS', 'GRTAGS', 'GPATH', 'GSYMS'] # waf does not ignore these file
501 for nodist_file
in nodist_files
:
502 os
.remove(nodist_file
)
503 shutil
.copy('../build/default/version.h', "./")
506 from Constants
import RUN_ME
507 from TaskGen
import feature
, after
512 def process_git(self
):
513 if getattr(self
, 'ver_header', None):
514 tsk
= self
.create_task('git_ver')
515 tsk
.set_outputs(self
.path
.find_or_declare(self
.ver_header
))
518 header
= self
.outputs
[0].abspath(self
.env
)
519 if os
.access('../version.h', os
.R_OK
):
520 shutil
.copy('../version.h', header
)
521 data
= file(header
).read()
522 m
= re
.match(r
'^#define GIT_VERSION "([^"]*)"$', data
)
524 self
.ver
= m
.group(1)
525 Utils
.pprint('BLUE', "tarball from git revision " + self
.ver
)
530 if os
.access('../.git', os
.R_OK
):
531 self
.ver
= commands
.getoutput("LANG= git rev-parse HEAD").splitlines()[0]
532 if commands
.getoutput("LANG= git diff-index --name-only HEAD").splitlines():
535 Utils
.pprint('BLUE', "git revision " + self
.ver
)
539 fi
= open(header
, 'w')
540 fi
.write('#define GIT_VERSION "%s"\n' % self
.ver
)
543 cls
= Task
.task_type_from_func('git_ver', vars=[], func
=git_ver
, color
='BLUE', before
='cc')
547 cls
.runnable_status
= always
550 sg
= Utils
.h_list(self
.ver
)
551 node
= self
.outputs
[0]
552 variant
= node
.variant(self
.env
)
553 self
.generator
.bld
.node_sigs
[variant
][node
.id] = sg
554 cls
.post_run
= post_run