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.20.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', repr(conf
.env
['CCFLAGS']))
227 display_msg(conf
, 'C++ compiler flags', repr(conf
.env
['CXXFLAGS']))
229 if not conf
.env
['BUILD_GLADISH']:
231 display_line(conf
, "WARNING: The GUI frontend will not built", 'RED')
236 daemon
= bld
.new_task_gen('cc', 'program')
237 daemon
.target
= 'ladishd'
238 daemon
.includes
= "build/default" # XXX config.h version.h and other generated files
239 daemon
.uselib
= 'DBUS-1 UUID EXPAT'
240 daemon
.ver_header
= 'version.h'
241 daemon
.env
.append_value("LINKFLAGS", ["-lutil", "-ldl", "-Wl,-E"])
265 'studio_jack_conf.c',
270 'cmd_rename_studio.c',
272 'cmd_start_studio.c',
274 'cmd_unload_studio.c',
276 'cmd_change_app_state.c',
280 'cmd_save_project.c',
281 'cmd_unload_project.c',
282 'cmd_load_project.c',
290 daemon
.source
.append(os
.path
.join("daemon", source
))
299 daemon
.source
.append(os
.path
.join("proxies", source
))
309 daemon
.source
.append(os
.path
.join("dbus", source
))
314 daemon
.source
.append(os
.path
.join("common", source
))
316 # process dbus.service.in -> ladish.service
318 obj
= bld
.new_task_gen('subst')
319 obj
.source
= os
.path
.join('daemon', 'dbus.service.in')
320 obj
.target
= DBUS_NAME_BASE
+ '.service'
321 obj
.dict = {'dbus_object_path': DBUS_NAME_BASE
,
322 'daemon_bin_path': os
.path
.join(bld
.env
['PREFIX'], 'bin', daemon
.target
)}
323 obj
.install_path
= bld
.env
['DBUS_SERVICES_DIR'] + os
.path
.sep
324 obj
.fun
= misc
.subst_func
326 #####################################################
328 jmcore
= bld
.new_task_gen('cc', 'program')
329 jmcore
.target
= 'jmcore'
330 jmcore
.includes
= "build/default" # XXX config.h version.h and other generated files
331 jmcore
.uselib
= 'DBUS-1 JACK'
332 jmcore
.defines
= ['LOG_OUTPUT_STDOUT']
333 jmcore
.source
= ['jmcore.c']
343 jmcore
.source
.append(os
.path
.join("dbus", source
))
345 if bld
.env
['BUILD_LIBLASH']:
346 liblash
= bld
.new_task_gen('cc', 'shlib')
347 liblash
.includes
= "build/default" # XXX config.h version.h and other generated files
348 liblash
.uselib
= 'DBUS-1'
349 liblash
.target
= 'lash'
350 liblash
.vnum
= "1.1.1"
351 liblash
.defines
= ['LOG_OUTPUT_STDOUT']
352 liblash
.source
= [os
.path
.join("lash_compat", "liblash", 'lash.c')]
354 bld
.install_files('${PREFIX}/include/lash', 'lash_compat/liblash/lash/*.h')
356 # process lash-1.0.pc.in -> lash-1.0.pc
357 obj
= bld
.new_task_gen('subst')
358 obj
.source
= [os
.path
.join("lash_compat", 'lash-1.0.pc.in')]
359 obj
.target
= 'lash-1.0.pc'
360 obj
.dict = {'prefix': bld
.env
['PREFIX'],
361 'exec_prefix': bld
.env
['PREFIX'],
362 'libdir': bld
.env
['LIBDIR'],
363 'includedir': os
.path
.normpath(bld
.env
['PREFIX'] + '/include'),
365 obj
.install_path
= '${LIBDIR}/pkgconfig/'
366 obj
.fun
= misc
.subst_func
368 obj
= bld
.new_task_gen('subst')
369 obj
.source
= os
.path
.join('daemon', 'dbus.service.in')
370 obj
.target
= DBUS_NAME_BASE
+ '.jmcore.service'
371 obj
.dict = {'dbus_object_path': DBUS_NAME_BASE
+ ".jmcore",
372 'daemon_bin_path': os
.path
.join(bld
.env
['PREFIX'], 'bin', jmcore
.target
)}
373 obj
.install_path
= bld
.env
['DBUS_SERVICES_DIR'] + os
.path
.sep
374 obj
.fun
= misc
.subst_func
376 #####################################################
379 # pkgpyexec_LTLIBRARIES = _lash.la
380 # INCLUDES = $(PYTHON_INCLUDES)
381 # _lash_la_LDFLAGS = -module -avoid-version ../liblash/liblash.la
382 # _lash_la_SOURCES = lash.c lash.h lash_wrap.c
383 # pkgpyexec_SCRIPTS = lash.py
384 # CLEANFILES = lash_wrap.c lash.py lash.pyc zynjacku.defs
385 # EXTRA_DIST = test.py lash.i lash.py
386 # lash_wrap.c lash.py: lash.i lash.h
387 # swig -o lash_wrap.c -I$(top_srcdir) -python $(top_srcdir)/$(subdir)/lash.i
389 #####################################################
391 if bld
.env
['BUILD_GLADISH']:
392 gladish
= bld
.new_task_gen('cxx', 'program')
393 gladish
.features
.append('cc')
394 gladish
.target
= 'gladish'
395 gladish
.defines
= ['LOG_OUTPUT_STDOUT']
396 gladish
.includes
= "build/default" # XXX config.h version.h and other generated files
397 gladish
.uselib
= 'DBUS-1 DBUS-GLIB-1 FLOWCANVAS'
405 'load_project_dialog.c',
406 'save_project_dialog.c',
413 'create_room_dialog.c',
427 gladish
.source
.append(os
.path
.join("gui", source
))
434 'app_supervisor_proxy.c',
437 gladish
.source
.append(os
.path
.join("proxies", source
))
443 gladish
.source
.append(os
.path
.join("dbus", source
))
445 # GtkBuilder UI definitions (XML)
446 bld
.install_files(bld
.env
['DATA_DIR'], 'gui/gladish.ui')
448 bld
.install_files('${PREFIX}/bin', 'ladish_control', chmod
=0755)
450 # 'Desktop' file (menu entry, icon, etc)
451 bld
.install_files('${PREFIX}/share/applications/', 'gui/gladish.desktop', chmod
=0644)
454 icon_sizes
= ['16x16', '22x22', '24x24', '32x32', '48x48', '256x256']
455 for icon_size
in icon_sizes
:
456 bld
.path
.ant_glob('art/' + icon_size
+ '/apps/*.png')
457 bld
.install_files('${PREFIX}/share/icons/hicolor/' + icon_size
+ '/apps/', 'art/' + icon_size
+ '/apps/gladish.png')
460 for status
in ["down", "unloaded", "started", "stopped", "warning", "error"]:
461 status_images
.append("art/status_" + status
+ ".png")
463 bld
.install_files(bld
.env
['DATA_DIR'], status_images
)
464 bld
.install_files(bld
.env
['DATA_DIR'], "art/ladish-logo-128x128.png")
465 bld
.install_files(bld
.env
['DATA_DIR'], ["COPYING", "AUTHORS", "README", "NEWS"])
467 if bld
.env
['BUILD_DOXYGEN_DOCS'] == True:
468 html_docs_source_dir
= "build/default/html"
469 if Options
.commands
['clean']:
470 if os
.access(html_docs_source_dir
, os
.R_OK
):
471 Utils
.pprint('CYAN', "Removing doxygen generated documentation...")
472 shutil
.rmtree(html_docs_source_dir
)
473 Utils
.pprint('CYAN', "Removing doxygen generated documentation done.")
474 elif Options
.commands
['build']:
475 if not os
.access(html_docs_source_dir
, os
.R_OK
):
476 os
.popen("doxygen").read()
478 Utils
.pprint('CYAN', "doxygen documentation already built.")
481 source_root
= os
.path
.dirname(Utils
.g_module
.root_path
)
482 if 'relpath' in os
.path
.__all
__:
483 source_root
= os
.path
.relpath(source_root
)
485 paths
+= " " + os
.path
.join(source_root
, "common")
486 paths
+= " " + os
.path
.join(source_root
, "dbus")
487 paths
+= " " + os
.path
.join(source_root
, "proxies")
488 paths
+= " " + os
.path
.join(source_root
, "daemon")
489 paths
+= " " + os
.path
.join(source_root
, "gui")
490 paths
+= " " + os
.path
.join(source_root
, "example-apps")
491 paths
+= " " + os
.path
.join(source_root
, "lib")
492 paths
+= " " + os
.path
.join(source_root
, "lash_compat", "liblash")
493 paths
+= " " + os
.path
.join(source_root
, "lash_compat", "liblash", "lash")
497 '''build tag files for GNU global'''
498 cmd
= "find %s -mindepth 1 -maxdepth 1 -name '*.[ch]' -print | gtags --statistics -f -" % get_tags_dirs()
499 #print("Running: %s" % cmd)
503 '''build TAGS file using etags'''
504 cmd
= "find %s -mindepth 1 -maxdepth 1 -name '*.[ch]' -print | etags -" % get_tags_dirs()
505 #print("Running: %s" % cmd)
507 os
.system("stat -c '%y' TAGS")
510 #print repr(Options.options)
511 if Options
.options
.distnodeps
:
512 shutil
.rmtree('laditools')
513 shutil
.rmtree('flowcanvas')
514 shutil
.rmtree('jack2')
515 shutil
.rmtree('a2jmidid')
516 nodist_files
= ['.gitmodules', 'GTAGS', 'GRTAGS', 'GPATH', 'GSYMS'] # waf does not ignore these file
517 for nodist_file
in nodist_files
:
518 os
.remove(nodist_file
)
519 shutil
.copy('../build/default/version.h', "./")
522 from Constants
import RUN_ME
523 from TaskGen
import feature
, after
528 def process_git(self
):
529 if getattr(self
, 'ver_header', None):
530 tsk
= self
.create_task('git_ver')
531 tsk
.set_outputs(self
.path
.find_or_declare(self
.ver_header
))
534 header
= self
.outputs
[0].abspath(self
.env
)
535 if os
.access('../version.h', os
.R_OK
):
536 shutil
.copy('../version.h', header
)
537 data
= file(header
).read()
538 m
= re
.match(r
'^#define GIT_VERSION "([^"]*)"$', data
)
540 self
.ver
= m
.group(1)
541 Utils
.pprint('BLUE', "tarball from git revision " + self
.ver
)
546 if os
.access('../.git', os
.R_OK
):
547 self
.ver
= commands
.getoutput("LANG= git rev-parse HEAD").splitlines()[0]
548 if commands
.getoutput("LANG= git diff-index --name-only HEAD").splitlines():
551 Utils
.pprint('BLUE', "git revision " + self
.ver
)
555 fi
= open(header
, 'w')
556 fi
.write('#define GIT_VERSION "%s"\n' % self
.ver
)
559 cls
= Task
.task_type_from_func('git_ver', vars=[], func
=git_ver
, color
='BLUE', before
='cc')
563 cls
.runnable_status
= always
566 sg
= Utils
.h_list(self
.ver
)
567 node
= self
.outputs
[0]
568 variant
= node
.variant(self
.env
)
569 self
.generator
.bld
.node_sigs
[variant
][node
.id] = sg
570 cls
.post_run
= post_run