daemon: what for 3 seconds before stopping server
[ladish.git] / wscript
blob5ded2f0c1f53c1afa3dc136bc0de3ae3d40d235a
1 #! /usr/bin/env python
2 # encoding: utf-8
4 import os
5 import Options
6 import Utils
7 import shutil
8 import re
10 APPNAME='ladish'
11 VERSION='0.2'
12 DBUS_NAME_BASE = 'org.ladish'
14 # these variables are mandatory ('/' are converted automatically)
15 srcdir = '.'
16 blddir = 'build'
18 def display_msg(conf, msg="", status = None, color = None):
19 if status:
20 conf.check_message_1(msg)
21 conf.check_message_2(status, color)
22 else:
23 Utils.pprint('NORMAL', msg)
25 def display_raw_text(conf, text, color = 'NORMAL'):
26 Utils.pprint(color, text, sep = '')
28 def display_line(conf, text, color = 'NORMAL'):
29 Utils.pprint(color, text, sep = os.linesep)
31 def yesno(bool):
32 if bool:
33 return "yes"
34 else:
35 return "no"
37 def set_options(opt):
38 opt.tool_options('compiler_cc')
39 opt.tool_options('compiler_cxx')
40 opt.tool_options('boost')
41 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')
42 opt.add_option('--enable-liblash', action='store_true', default=False, help='Build LASH compatibility library')
44 def add_cflag(conf, flag):
45 conf.env.append_unique('CXXFLAGS', flag)
46 conf.env.append_unique('CCFLAGS', flag)
48 def configure(conf):
49 conf.check_tool('compiler_cc')
50 conf.check_tool('compiler_cxx')
51 conf.check_tool('boost')
53 conf.check_cfg(
54 package = 'dbus-1',
55 atleast_version = '1.0.0',
56 mandatory = True,
57 errmsg = "not installed, see http://dbus.freedesktop.org/",
58 args = '--cflags --libs')
60 dbus_dir = conf.check_cfg(package='dbus-1', args='--variable=session_bus_services_dir', msg="Retrieving D-Bus services dir")
61 if not dbus_dir:
62 return
64 dbus_dir = dbus_dir.strip()
65 conf.env['DBUS_SERVICES_DIR_REAL'] = dbus_dir
67 if Options.options.enable_pkg_config_dbus_service_dir:
68 conf.env['DBUS_SERVICES_DIR'] = dbus_dir
69 else:
70 conf.env['DBUS_SERVICES_DIR'] = os.path.join(os.path.normpath(conf.env['PREFIX']), 'share', 'dbus-1', 'services')
72 conf.env['BUILD_LIBLASH'] = Options.options.enable_liblash
74 conf.check_cfg(
75 package = 'uuid',
76 mandatory = True,
77 errmsg = "not installed, see http://e2fsprogs.sourceforge.net/",
78 args = '--cflags --libs')
80 conf.check(
81 header_name='expat.h',
82 mandatory = True,
83 errmsg = "not installed, see http://expat.sourceforge.net/")
85 conf.env['LIB_EXPAT'] = ['expat']
87 build_gui = True
89 if build_gui and not conf.check_cfg(
90 package = 'glib-2.0',
91 mandatory = False,
92 errmsg = "not installed, see http://www.gtk.org/",
93 args = '--cflags --libs'):
94 build_gui = False
96 if build_gui and not conf.check_cfg(
97 package = 'dbus-glib-1',
98 mandatory = False,
99 errmsg = "not installed, see http://dbus.freedesktop.org/",
100 args = '--cflags --libs'):
101 build_gui = False
103 if build_gui and not conf.check_cfg(
104 package = 'gtk+-2.0',
105 mandatory = False,
106 errmsg = "not installed, see http://www.gtk.org/",
107 args = '--cflags --libs'):
108 build_gui = False
110 if build_gui and not conf.check_cfg(
111 package = 'libglade-2.0',
112 mandatory = False,
113 errmsg = "not installed, see http://ftp.gnome.org/pub/GNOME/sources/libglade/",
114 args = '--cflags --libs'):
115 build_gui = False
117 if build_gui and not conf.check_cfg(
118 package = 'flowcanvas',
119 mandatory = False,
120 atleast_version = '0.5.3',
121 errmsg = "not installed, see http://drobilla.net/software/flowcanvas/",
122 args = '--cflags --libs'):
123 build_gui = False
125 if build_gui:
126 # We need the boost headers package (e.g. libboost-dev)
127 # shared_ptr.hpp and weak_ptr.hpp
128 build_gui = conf.check_boost(errmsg="not found, see http://boost.org/")
130 conf.env['BUILD_GLADISH'] = build_gui
132 add_cflag(conf, '-g')
133 add_cflag(conf, '-Wall')
134 add_cflag(conf, '-Werror')
136 conf.define('DATA_DIR', os.path.normpath(os.path.join(conf.env['PREFIX'], 'share', APPNAME)))
137 conf.define('PACKAGE_VERSION', VERSION)
138 conf.define('DBUS_NAME_BASE', DBUS_NAME_BASE)
139 conf.define('DBUS_BASE_PATH', '/' + DBUS_NAME_BASE.replace('.', '/'))
140 conf.define('BASE_NAME', APPNAME)
141 conf.define('_GNU_SOURCE', 1)
142 conf.write_config_header('config.h')
144 display_msg(conf)
146 display_msg(conf, "==================")
147 version_msg = APPNAME + "-" + VERSION
149 if os.access('version.h', os.R_OK):
150 data = file('version.h').read()
151 m = re.match(r'^#define GIT_VERSION "([^"]*)"$', data)
152 if m != None:
153 version_msg += " exported from " + m.group(1)
154 elif os.access('.git', os.R_OK):
155 version_msg += " git revision will checked and eventually updated during build"
157 display_msg(conf, version_msg)
159 display_msg(conf)
160 display_msg(conf, "Install prefix", conf.env['PREFIX'], 'CYAN')
162 display_msg(conf, 'Build gladish', yesno(conf.env['BUILD_GLADISH']))
163 display_msg(conf, 'Build liblash', yesno(Options.options.enable_liblash))
165 if conf.env['DBUS_SERVICES_DIR'] != conf.env['DBUS_SERVICES_DIR_REAL']:
166 display_msg(conf)
167 display_line(conf, "WARNING: D-Bus session services directory as reported by pkg-config is", 'RED')
168 display_raw_text(conf, "WARNING:", 'RED')
169 display_line(conf, conf.env['DBUS_SERVICES_DIR_REAL'], 'CYAN')
170 display_line(conf, 'WARNING: but service file will be installed in', 'RED')
171 display_raw_text(conf, "WARNING:", 'RED')
172 display_line(conf, conf.env['DBUS_SERVICES_DIR'], 'CYAN')
173 display_line(conf, 'WARNING: You may need to adjust your D-Bus configuration after installing ladish', 'RED')
174 display_line(conf, 'WARNING: You can override dbus service install directory', 'RED')
175 display_line(conf, 'WARNING: with --enable-pkg-config-dbus-service-dir option to this script', 'RED')
177 display_msg(conf)
179 def build(bld):
180 daemon = bld.new_task_gen('cc', 'program')
181 daemon.target = 'ladishd'
182 daemon.includes = "build/default" # XXX config.h version.h and other generated files
183 daemon.uselib = 'DBUS-1 UUID EXPAT'
184 daemon.ver_header = 'version.h'
185 daemon.env.append_value("LINKFLAGS", ["-lutil", "-ldl", "-Wl,-E"])
187 daemon.source = [
188 'jack_proxy.c',
189 'graph_proxy.c',
190 'catdup.c',
193 for source in [
194 'main.c',
195 'loader.c',
196 'log.c',
197 'dirhelpers.c',
198 'sigsegv.c',
199 'proctitle.c',
200 'appdb.c',
201 'procfs.c',
202 'control.c',
203 'studio.c',
204 'graph.c',
205 'client.c',
206 'port.c',
207 'virtualizer.c',
208 'dict.c',
209 'graph_dict.c',
210 'escape.c',
211 'studio_jack_conf.c',
212 'cmd_load_studio.c',
213 'cmd_new_studio.c',
214 'cmd_rename_studio.c',
215 'cmd_save_studio.c',
216 'cmd_start_studio.c',
217 'cmd_stop_studio.c',
218 'cmd_unload_studio.c',
219 'cmd_exit.c',
220 'cqueue.c',
221 'app_supervisor.c',
223 daemon.source.append(os.path.join("daemon", source))
225 for source in [
226 'signal.c',
227 'method.c',
228 'error.c',
229 'object_path.c',
230 'interface.c',
231 'helpers.c',
233 daemon.source.append(os.path.join("dbus", source))
235 daemon.source.append(os.path.join("common", "safety.c"))
237 # process name.arnaudov.nedko.ladish.service.in -> name.arnaudov.nedko.ladish.service
238 import misc
239 obj = bld.new_task_gen('subst')
240 obj.source = os.path.join('daemon', 'dbus.service.in')
241 obj.target = DBUS_NAME_BASE + '.service'
242 obj.dict = {'dbus_object_path': DBUS_NAME_BASE,
243 'daemon_bin_path': os.path.join(bld.env['PREFIX'], 'bin', daemon.target)}
244 obj.install_path = bld.env['DBUS_SERVICES_DIR'] + os.path.sep
245 obj.fun = misc.subst_func
247 if bld.env['BUILD_LIBLASH']:
248 liblash = bld.new_task_gen('cc', 'shlib')
249 liblash.includes = "build/default" # XXX config.h version.h and other generated files
250 liblash.uselib = 'DBUS-1'
251 liblash.target = 'lash'
252 liblash.vnum = "1.1.1"
253 liblash.defines = ['LOG_OUTPUT_STDOUT']
254 liblash.source = [os.path.join("lash_compat", "liblash", 'lash.c')]
256 # pkgpyexec_LTLIBRARIES = _lash.la
257 # INCLUDES = $(PYTHON_INCLUDES)
258 # _lash_la_LDFLAGS = -module -avoid-version ../liblash/liblash.la
259 # _lash_la_SOURCES = lash.c lash.h lash_wrap.c
260 # pkgpyexec_SCRIPTS = lash.py
261 # CLEANFILES = lash_wrap.c lash.py lash.pyc zynjacku.defs
262 # EXTRA_DIST = test.py lash.i lash.py
263 # lash_wrap.c lash.py: lash.i lash.h
264 # swig -o lash_wrap.c -I$(top_srcdir) -python $(top_srcdir)/$(subdir)/lash.i
266 #####################################################
267 # gladish
268 if bld.env['BUILD_GLADISH']:
269 gladish = bld.new_task_gen('cxx', 'program')
270 gladish.features.append('cc')
271 gladish.target = 'gladish'
272 gladish.defines = ['LOG_OUTPUT_STDOUT']
273 gladish.includes = "build/default" # XXX config.h version.h and other generated files
274 gladish.uselib = 'DBUS-1 DBUS-GLIB-1 LIBGLADE-2.0 FLOWCANVAS'
276 gladish.source = [
277 'jack_proxy.c',
278 'graph_proxy.c',
279 'studio_proxy.c',
280 'catdup.c',
283 for source in [
284 'main.c',
285 #'lash_client.cpp',
286 #'lash_proxy.cpp',
287 #'load_projects_dialog.cpp',
288 #'project.cpp',
289 'world_tree.c',
290 'graph_view.c',
291 #'project_properties.cpp',
292 #'session.cpp',
293 #'a2j_proxy.cpp',
294 'dbus_helpers.c',
295 'canvas.cpp',
296 'graph_canvas.c',
297 'glade.c',
298 'control_proxy.c',
299 'app_supervisor_proxy.c',
300 'ask_dialog.c',
302 gladish.source.append(os.path.join("gui", source))
304 for source in [
305 'method.c',
306 'helpers.c',
308 gladish.source.append(os.path.join("dbus", source))
310 # Glade UI definitions (XML)
311 bld.install_files(bld.env['DATA_DIR'], 'gui/gui.glade')
313 bld.install_files('${PREFIX}/bin', 'ladish_control', chmod=0755)
315 # 'Desktop' file (menu entry, icon, etc)
316 #obj = bld.create_obj('subst')
317 #obj.source = 'patchage.desktop.in'
318 #obj.target = 'patchage.desktop'
319 #obj.dict = {
320 # 'BINDIR' : bld.env()['BINDIR'],
321 # 'APP_INSTALL_NAME' : bld.env()['APP_INSTALL_NAME'],
322 # 'APP_HUMAN_NAME' : bld.env()['APP_HUMAN_NAME'],
324 #install_as(os.path.normpath(bld.env()['DATADIR'] + 'applications/'), bld.env()['APP_INSTALL_NAME'] + '.desktop', 'build/default/patchage.desktop')
326 # Icons
328 # Installation layout (with /usr prefix)
329 # /usr/bin/patchage
330 # /usr/share/applications/patchage.desktop
331 # /usr/share/icons/hicolor/16x16/apps/patchage.png
332 # /usr/share/icons/hicolor/22x22/apps/patchage.png
333 # /usr/share/icons/hicolor/24x24/apps/patchage.png
334 # /usr/share/icons/hicolor/32x32/apps/patchage.png
335 # /usr/share/icons/hicolor/48x48/apps/patchage.png
336 # /usr/share/icons/hicolor/scalable/apps/patchage.svg
337 # /usr/share/patchage/patchage.glade
339 # icon cache is updated using:
340 # gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
342 # Dave disabled this, ask why before removing this
343 #install_as(os.path.normpath(bld.env()['PREFIX'] + '/share/icons/hicolor/scalable/apps/'), bld.env()['APP_INSTALL_NAME'] + '.svg', 'icons/scalable/patchage.svg')
345 #icon_sizes = ['16x16', '22x22', '24x24', '32x32', '48x48']
346 #for icon_size in icon_sizes:
347 # install_as(os.path.normpath(bld.env()['DATADIR'] + '/icons/hicolor/' + icon_size + '/apps/'), bld.env()['APP_INSTALL_NAME'] + '.png', 'icons/' + icon_size + '/patchage.png')
349 def dist_hook():
350 shutil.copy('../build/default/version.h', "./")
352 import commands
353 from Constants import RUN_ME
354 from TaskGen import feature, after
355 import Task, Utils
357 @feature('cc')
358 @after('apply_core')
359 def process_git(self):
360 if getattr(self, 'ver_header', None):
361 tsk = self.create_task('git_ver')
362 tsk.set_outputs(self.path.find_or_declare(self.ver_header))
364 def git_ver(self):
365 header = self.outputs[0].abspath(self.env)
366 if os.access('../version.h', os.R_OK):
367 shutil.copy('../version.h', header)
368 data = file(header).read()
369 m = re.match(r'^#define GIT_VERSION "([^"]*)"$', data)
370 if m != None:
371 self.ver = m.group(1)
372 Utils.pprint('BLUE', "tarball from git revision " + self.ver)
373 else:
374 self.ver = "tarball"
375 return
377 if os.access('../.git', os.R_OK):
378 self.ver = commands.getoutput("LANG= git rev-parse HEAD").splitlines()[0]
379 if commands.getoutput("LANG= git diff-index --name-only HEAD").splitlines():
380 self.ver += "-dirty"
382 Utils.pprint('BLUE', "git revision " + self.ver)
383 else:
384 self.ver = "unknown"
386 fi = open(header, 'w')
387 fi.write('#define GIT_VERSION "%s"\n' % self.ver)
388 fi.close()
390 cls = Task.task_type_from_func('git_ver', vars=[], func=git_ver, color='BLUE', before='cc')
392 def always(self):
393 return RUN_ME
394 cls.runnable_status = always
396 def post_run(self):
397 sg = Utils.h_list(self.ver)
398 node = self.outputs[0]
399 variant = node.variant(self.env)
400 self.generator.bld.node_sigs[variant][node.id] = sg
401 cls.post_run = post_run