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')
94 conf
.load('parallel_debug')
96 # dladdr() is used by daemon/sigsegv.c
97 # dlvsym() is used by the alsapid library
98 conf
.check_cc(msg
="Checking for libdl", lib
=['dl'], uselib_store
='DL')
100 # forkpty() is used by ladishd
101 conf
.check_cc(msg
="Checking for libutil", lib
=['util'], uselib_store
='UTIL')
106 errmsg
= "not installed, see http://jackaudio.org/",
107 args
= '--cflags --libs')
111 atleast_version
= '1.0.0',
113 errmsg
= "not installed, see http://dbus.freedesktop.org/",
114 args
= '--cflags --libs')
116 dbus_dir
= conf
.check_cfg(package
='dbus-1', args
='--variable=session_bus_services_dir', msg
="Retrieving D-Bus services dir")
120 dbus_dir
= dbus_dir
.strip()
121 conf
.env
['DBUS_SERVICES_DIR_REAL'] = dbus_dir
123 if Options
.options
.enable_pkg_config_dbus_service_dir
:
124 conf
.env
['DBUS_SERVICES_DIR'] = dbus_dir
126 conf
.env
['DBUS_SERVICES_DIR'] = os
.path
.join(os
.path
.normpath(conf
.env
['PREFIX']), 'share', 'dbus-1', 'services')
128 conf
.env
['LIBDIR'] = os
.path
.join(os
.path
.normpath(conf
.env
['PREFIX']), 'lib')
130 conf
.env
['BUILD_DOXYGEN_DOCS'] = Options
.options
.doxygen
135 errmsg
= "not installed, see http://e2fsprogs.sourceforge.net/",
136 args
= '--cflags --libs')
139 header_name
='expat.h',
141 errmsg
= "not installed, see http://expat.sourceforge.net/")
143 conf
.env
['LIB_EXPAT'] = ['expat']
147 if build_gui
and not conf
.check_cfg(
148 package
= 'glib-2.0',
150 errmsg
= "not installed, see http://www.gtk.org/",
151 args
= '--cflags --libs'):
154 if build_gui
and not conf
.check_cfg(
155 package
= 'dbus-glib-1',
157 errmsg
= "not installed, see http://dbus.freedesktop.org/",
158 args
= '--cflags --libs'):
161 if build_gui
and not conf
.check_cfg(
162 package
= 'gtk+-2.0',
164 atleast_version
= '2.20.0',
165 errmsg
= "not installed, see http://www.gtk.org/",
166 args
= '--cflags --libs'):
169 if build_gui
and not conf
.check_cfg(
170 package
= 'flowcanvas',
172 atleast_version
= '0.6.4',
173 errmsg
= "not installed, see http://drobilla.net/software/flowcanvas/",
174 args
= '--cflags --libs'):
178 # We need the boost headers package (e.g. libboost-dev)
179 # shared_ptr.hpp and weak_ptr.hpp
180 build_gui
= conf
.check_boost(errmsg
="not found, see http://boost.org/")
182 conf
.env
['BUILD_GLADISH'] = build_gui
184 conf
.env
['BUILD_LIBLASH'] = Options
.options
.enable_liblash
185 conf
.env
['BUILD_PYLASH'] = Options
.options
.enable_pylash
186 if conf
.env
['BUILD_PYLASH'] and not conf
.env
['BUILD_LIBLASH']:
187 conf
.fatal("pylash build was requested but liblash was not")
188 conf
.env
['BUILD_PYLASH'] = False
189 if conf
.env
['BUILD_PYLASH']:
190 conf
.check_python_version()
191 conf
.check_python_headers()
193 conf
.env
['BUILD_WERROR'] = not RELEASE
194 if conf
.env
['BUILD_WERROR']:
195 add_cflag(conf
, '-Wall')
196 add_cflag(conf
, '-Werror')
197 # for pre gcc-4.4, enable optimizations so use of uninitialized variables gets detected
199 is_gcc
= conf
.env
['CC_NAME'] == 'gcc'
202 for n
in conf
.env
['CC_VERSION']:
203 gcc_ver
.append(int(n
))
204 if gcc_ver
[0] < 4 or gcc_ver
[1] < 4:
205 #print "optimize force enable is required"
206 if not check_gcc_optimizations_enabled(conf
.env
['CFLAGS']):
207 if Options
.options
.debug
:
208 print "C optimization must be forced in order to enable -Wuninitialized"
209 print "However this will not be made because debug compilation is enabled"
211 print "C optimization forced in order to enable -Wuninitialized"
212 conf
.env
.append_unique('CFLAGS', "-O")
216 conf
.env
['BUILD_DEBUG'] = Options
.options
.debug
217 if conf
.env
['BUILD_DEBUG']:
218 add_cflag(conf
, '-g')
219 add_cflag(conf
, '-O0')
220 add_linkflag(conf
, '-g')
222 conf
.env
['DATA_DIR'] = os
.path
.normpath(os
.path
.join(conf
.env
['PREFIX'], 'share', APPNAME
))
224 # write some parts of the configure environment to the config.h file
225 conf
.define('DATA_DIR', conf
.env
['DATA_DIR'])
226 conf
.define('PACKAGE_VERSION', VERSION
)
227 conf
.define('DBUS_NAME_BASE', DBUS_NAME_BASE
)
228 conf
.define('DBUS_BASE_PATH', '/' + DBUS_NAME_BASE
.replace('.', '/'))
229 conf
.define('BASE_NAME', APPNAME
)
230 conf
.define('_GNU_SOURCE', 1)
231 conf
.write_config_header('config.h')
235 display_msg(conf
, "==================")
236 version_msg
= APPNAME
+ "-" + VERSION
238 if os
.access('version.h', os
.R_OK
):
239 data
= file('version.h').read()
240 m
= re
.match(r
'^#define GIT_VERSION "([^"]*)"$', data
)
242 version_msg
+= " exported from " + m
.group(1)
243 elif os
.access('.git', os
.R_OK
):
244 version_msg
+= " git revision will checked and eventually updated during build"
246 display_msg(conf
, version_msg
)
249 display_msg(conf
, "Install prefix", conf
.env
['PREFIX'], 'CYAN')
251 display_msg(conf
, 'Build gladish', yesno(conf
.env
['BUILD_GLADISH']))
252 display_msg(conf
, 'Build liblash', yesno(Options
.options
.enable_liblash
))
253 display_msg(conf
, 'Build pylash', yesno(conf
.env
['BUILD_PYLASH']))
254 display_msg(conf
, 'Treat warnings as errors', yesno(conf
.env
['BUILD_WERROR']))
255 display_msg(conf
, 'Debuggable binaries', yesno(conf
.env
['BUILD_DEBUG']))
256 display_msg(conf
, 'Build doxygen documentation', yesno(conf
.env
['BUILD_DOXYGEN_DOCS']))
258 if conf
.env
['DBUS_SERVICES_DIR'] != conf
.env
['DBUS_SERVICES_DIR_REAL']:
260 display_line(conf
, "WARNING: D-Bus session services directory as reported by pkg-config is", 'RED')
261 display_raw_text(conf
, "WARNING:", 'RED')
262 display_line(conf
, conf
.env
['DBUS_SERVICES_DIR_REAL'], 'CYAN')
263 display_line(conf
, 'WARNING: but service file will be installed in', 'RED')
264 display_raw_text(conf
, "WARNING:", 'RED')
265 display_line(conf
, conf
.env
['DBUS_SERVICES_DIR'], 'CYAN')
266 display_line(conf
, 'WARNING: You may need to adjust your D-Bus configuration after installing ladish', 'RED')
267 display_line(conf
, 'WARNING: You can override dbus service install directory', 'RED')
268 display_line(conf
, 'WARNING: with --enable-pkg-config-dbus-service-dir option to this script', 'RED')
270 display_msg(conf
, 'C compiler flags', repr(conf
.env
['CFLAGS']))
271 display_msg(conf
, 'C++ compiler flags', repr(conf
.env
['CXXFLAGS']))
273 if not conf
.env
['BUILD_GLADISH']:
275 display_line(conf
, "WARNING: The GUI frontend will not built", 'RED')
280 bld
= self
.generator
.bld
281 header
= self
.outputs
[0].abspath()
282 if os
.access('./version.h', os
.R_OK
):
283 header
= os
.path
.join(os
.getcwd(), out
, "version.h")
284 shutil
.copy('./version.h', header
)
285 data
= file(header
).read()
286 m
= re
.match(r
'^#define GIT_VERSION "([^"]*)"$', data
)
288 self
.ver
= m
.group(1)
289 pprint('BLUE', "tarball from git revision " + self
.ver
)
294 if bld
.srcnode
.find_node('.git'):
295 self
.ver
= bld
.cmd_and_log("LANG= git rev-parse HEAD", quiet
=waflib
.Context
.BOTH
).splitlines()[0]
296 if bld
.cmd_and_log("LANG= git diff-index --name-only HEAD", quiet
=waflib
.Context
.BOTH
).splitlines():
299 pprint('BLUE', "git revision " + self
.ver
)
303 fi
= open(header
, 'w')
304 fi
.write('#define GIT_VERSION "%s"\n' % self
.ver
)
308 if not bld
.env
['DATA_DIR']:
309 raise "DATA_DIR is emtpy"
311 bld(rule
=git_ver
, target
='version.h', update_outputs
=True, always
=True, ext_out
=['.h'])
313 daemon
= bld
.program(source
= [], features
= 'c cprogram', includes
= [bld
.path
.get_bld()])
314 daemon
.target
= 'ladishd'
315 daemon
.uselib
= 'DBUS-1 UUID EXPAT DL UTIL'
316 daemon
.ver_header
= 'version.h'
317 # Make backtrace function lookup to work for functions in the executable itself
318 daemon
.env
.append_value("LINKFLAGS", ["-Wl,-E"])
337 'studio_jack_conf.c',
343 'cmd_rename_studio.c',
345 'cmd_start_studio.c',
347 'cmd_unload_studio.c',
349 'cmd_change_app_state.c',
353 'cmd_save_project.c',
354 'cmd_unload_project.c',
355 'cmd_load_project.c',
365 daemon
.source
.append(os
.path
.join("daemon", source
))
375 daemon
.source
.append(os
.path
.join("proxies", source
))
385 daemon
.source
.append(os
.path
.join("dbus", source
))
392 daemon
.source
.append(os
.path
.join("common", source
))
394 daemon
.source
.append(os
.path
.join("alsapid", "helper.c"))
396 # process dbus.service.in -> ladish.service
397 create_service_taskgen(bld
, DBUS_NAME_BASE
+ '.service', DBUS_NAME_BASE
, daemon
.target
)
399 #####################################################
401 jmcore
= bld
.program(source
= [], features
= 'c cprogram', includes
= [bld
.path
.get_bld()])
402 jmcore
.target
= 'jmcore'
403 jmcore
.uselib
= 'DBUS-1 JACK'
404 jmcore
.defines
= ['LOG_OUTPUT_STDOUT']
405 jmcore
.source
= ['jmcore.c']
415 jmcore
.source
.append(os
.path
.join("dbus", source
))
417 create_service_taskgen(bld
, DBUS_NAME_BASE
+ '.jmcore.service', DBUS_NAME_BASE
+ ".jmcore", jmcore
.target
)
419 #####################################################
421 ladiconfd
= bld
.program(source
= [], features
= 'c cprogram', includes
= [bld
.path
.get_bld()])
422 ladiconfd
.target
= 'ladiconfd'
423 ladiconfd
.uselib
= 'DBUS-1'
424 ladiconfd
.defines
= ['LOG_OUTPUT_STDOUT']
425 ladiconfd
.source
= ['conf.c']
431 ladiconfd
.source
.append(os
.path
.join("common", source
))
441 ladiconfd
.source
.append(os
.path
.join("dbus", source
))
443 create_service_taskgen(bld
, DBUS_NAME_BASE
+ '.conf.service', DBUS_NAME_BASE
+ ".conf", ladiconfd
.target
)
445 #####################################################
447 bld
.shlib(source
= [os
.path
.join("alsapid", 'lib.c'), os
.path
.join("alsapid", "helper.c")], target
= 'alsapid', uselib
= 'DL')
449 #####################################################
451 if bld
.env
['BUILD_LIBLASH']:
452 liblash
= bld
.shlib(source
= [], features
= 'c cshlib', includes
= [bld
.path
.get_bld()])
453 liblash
.uselib
= 'DBUS-1'
454 liblash
.target
= 'lash'
455 liblash
.vnum
= "1.1.1"
456 liblash
.defines
= ['LOG_OUTPUT_STDOUT']
457 liblash
.source
= [os
.path
.join("lash_compat", "liblash", 'lash.c'), os
.path
.join("common", "catdup.c")]
459 bld
.install_files('${PREFIX}/include/lash', bld
.path
.ant_glob('lash_compat/liblash/lash/*.h'))
461 # process lash-1.0.pc.in -> lash-1.0.pc
463 features
= 'subst', # the feature 'subst' overrides the source/target processing
464 source
= os
.path
.join("lash_compat", 'lash-1.0.pc.in'), # list of string or nodes
465 target
= 'lash-1.0.pc', # list of strings or nodes
466 install_path
= '${LIBDIR}/pkgconfig/',
467 # variables to use in the substitution
468 prefix
= bld
.env
['PREFIX'],
469 exec_prefix
= bld
.env
['PREFIX'],
470 libdir
= bld
.env
['LIBDIR'],
471 includedir
= os
.path
.normpath(bld
.env
['PREFIX'] + '/include'))
473 #####################################################
475 if bld
.env
['BUILD_PYLASH']:
476 pylash
= bld
.shlib(source
= [], features
= 'c cshlib pyext', includes
= ["lash_compat/liblash"])
477 pylash
.target
= '_lash'
479 pylash
.install_path
= '${PYTHONDIR}'
485 pylash
.source
.append(os
.path
.join("lash_compat", "pylash", source
))
487 bld
.install_files('${PYTHONDIR}', os
.path
.join("lash_compat", "pylash", "lash.py"))
489 #####################################################
491 if bld
.env
['BUILD_GLADISH']:
492 gladish
= bld
.program(source
= [], features
= 'c cxx cxxprogram', includes
= [bld
.path
.get_bld()])
493 gladish
.target
= 'gladish'
494 gladish
.defines
= ['LOG_OUTPUT_STDOUT']
495 gladish
.uselib
= 'DBUS-1 DBUS-GLIB-1 FLOWCANVAS'
501 'load_project_dialog.c',
502 'save_project_dialog.c',
503 'project_properties.c',
510 'create_room_dialog.c',
528 gladish
.source
.append(os
.path
.join("gui", source
))
535 'app_supervisor_proxy.c',
539 gladish
.source
.append(os
.path
.join("proxies", source
))
545 gladish
.source
.append(os
.path
.join("dbus", source
))
551 gladish
.source
.append(os
.path
.join("common", source
))
553 # GtkBuilder UI definitions (XML)
554 bld
.install_files('${DATA_DIR}', 'gui/gladish.ui')
557 bld
.install_files('${DATA_DIR}/help', 'gui/help/default.txt')
559 bld
.install_files('${PREFIX}/bin', 'ladish_control', chmod
=0755)
561 # 'Desktop' file (menu entry, icon, etc)
562 bld
.install_files('${PREFIX}/share/applications/', 'gui/gladish.desktop', chmod
=0644)
565 icon_sizes
= ['16x16', '22x22', '24x24', '32x32', '48x48', '256x256']
566 for icon_size
in icon_sizes
:
567 bld
.path
.ant_glob('art/' + icon_size
+ '/apps/*.png')
568 bld
.install_files('${PREFIX}/share/icons/hicolor/' + icon_size
+ '/apps/', 'art/' + icon_size
+ '/apps/gladish.png')
571 for status
in ["down", "unloaded", "started", "stopped", "warning", "error"]:
572 status_images
.append("art/status_" + status
+ ".png")
574 bld
.install_files('${DATA_DIR}', status_images
)
575 bld
.install_files('${DATA_DIR}', "art/ladish-logo-128x128.png")
576 bld
.install_files('${DATA_DIR}', ["COPYING", "AUTHORS", "README", "NEWS"])
578 if bld
.env
['BUILD_DOXYGEN_DOCS'] == True:
579 html_docs_source_dir
= "build/default/html"
580 if bld
.cmd
== 'clean':
581 if os
.access(html_docs_source_dir
, os
.R_OK
):
582 pprint('CYAN', "Removing doxygen generated documentation...")
583 shutil
.rmtree(html_docs_source_dir
)
584 pprint('CYAN', "Removing doxygen generated documentation done.")
585 elif bld
.cmd
== 'build':
586 if not os
.access(html_docs_source_dir
, os
.R_OK
):
587 os
.popen("doxygen").read()
589 pprint('CYAN', "doxygen documentation already built.")
592 # TODO: Rewrite using waf functionality
593 po_list
= os
.listdir('./po')
594 if po_list
.__len
__() > 0:
595 for po_list_item
in po_list
:
596 item
= po_list_item
.rsplit('.', 1)
598 pprint('CYAN', "Preparing translation '"+item
[0]+"'")
599 os
.system("msgfmt ./po/"+po_list_item
+" -o ./po/"+item
[0]+".mo")
600 bld
.install_as(('${PREFIX}/share/locale/'+item
[0]+'/LC_MESSAGES/gladish.mo'), ('./po/'+item
[0]+".mo"))
603 source_root
= os
.path
.dirname(Utils
.g_module
.root_path
)
604 if 'relpath' in os
.path
.__all
__:
605 source_root
= os
.path
.relpath(source_root
)
607 paths
+= " " + os
.path
.join(source_root
, "common")
608 paths
+= " " + os
.path
.join(source_root
, "dbus")
609 paths
+= " " + os
.path
.join(source_root
, "proxies")
610 paths
+= " " + os
.path
.join(source_root
, "daemon")
611 paths
+= " " + os
.path
.join(source_root
, "gui")
612 paths
+= " " + os
.path
.join(source_root
, "example-apps")
613 paths
+= " " + os
.path
.join(source_root
, "lib")
614 paths
+= " " + os
.path
.join(source_root
, "lash_compat", "liblash")
615 paths
+= " " + os
.path
.join(source_root
, "lash_compat", "liblash", "lash")
619 '''build tag files for GNU global'''
620 cmd
= "find %s -mindepth 1 -maxdepth 1 -name '*.[ch]' -print | gtags --statistics -f -" % get_tags_dirs()
621 #print("Running: %s" % cmd)
625 '''build TAGS file using etags'''
626 cmd
= "find %s -mindepth 1 -maxdepth 1 -name '*.[ch]' -print | etags -" % get_tags_dirs()
627 #print("Running: %s" % cmd)
629 os
.system("stat -c '%y' TAGS")
631 class ladish_dist(waflib
.Scripting
.Dist
):
637 if Options
.options
.distname
:
638 self
.base_name
= Options
.options
.distname
641 self
.base_name
= self
.cmd_and_log("LANG= git describe --tags", quiet
=waflib
.Context
.BOTH
).splitlines()[0]
643 self
.base_name
= APPNAME
+ '-' + VERSION
644 self
.base_name
+= Options
.options
.distsuffix
646 #print self.base_name
648 if Options
.options
.distname
and Options
.options
.tagdist
:
649 ret
= self
.exec_command("LANG= git tag " + self
.base_name
)
651 raise waflib
.Errors
.WafError('git tag creation failed')
653 def get_base_name(self
):
654 return self
.base_name
657 excl
= Dist
.get_excl(self
)
659 excl
+= ' .gitmodules'
665 if Options
.options
.distnodeps
:
667 excl
+= ' flowcanvas'
675 shutil
.copy('./build/version.h', "./")
677 super(ladish_dist
, self
).execute()
679 os
.remove("version.h")