2 from waflib.extras import autowaf as autowaf
3 from waflib import Options, TaskGen
4 import waflib.Logs as Logs, waflib.Utils as Utils
10 from waflib.Task import Task
11 from waflib.Tools import winres
17 path_prefix = 'gtk2_ardour/'
19 gtk2_ardour_sources = [
22 'add_route_dialog.cc',
23 'ambiguous_file_dialog.cc',
32 'ardour_ui_dependents.cc',
33 'ardour_ui_dialogs.cc',
36 'ardour_ui_options.cc',
39 'audio_region_editor.cc',
40 'audio_region_view.cc',
41 'audio_streamview.cc',
43 'automation_controller.cc',
45 'automation_region_view.cc',
46 'automation_streamview.cc',
47 'automation_time_axis.cc',
49 'big_clock_window.cc',
55 'control_point_dialog.cc',
59 'edit_note_dialog.cc',
63 'editor_audio_import.cc',
64 'editor_pt_import.cc',
65 'editor_audiotrack.cc',
67 'editor_canvas_events.cc',
68 'editor_component.cc',
71 'editor_route_groups.cc',
72 'editor_export_audio.cc',
73 'editor_group_tabs.cc',
75 'editor_locations.cc',
83 'editor_selection.cc',
84 'editor_snapshots.cc',
86 'editor_tempodisplay.cc',
90 'export_channel_selector.cc',
92 'export_file_notebook.cc',
93 'export_filename_selector.cc',
94 'export_format_dialog.cc',
95 'export_format_selector.cc',
96 'export_preset_selector.cc',
97 'export_timespan_selector.cc',
101 'floating_text_entry.cc',
102 'sfdb_freesound_mootcher.cc',
104 'generic_pluginui.cc',
106 'global_port_matrix.cc',
108 'gtk_pianokeyboard.c',
110 'insert_remove_time_dialog.cc',
111 'instrument_selector.cc',
112 'interthread_progress_window.cc',
124 'midi_automation_line.cc',
125 'midi_channel_dialog.cc',
126 'midi_channel_selector.cc',
127 'midi_cut_buffer.cc',
128 'midi_export_dialog.cc',
129 'midi_list_editor.cc',
130 'midi_port_dialog.cc',
131 'midi_region_view.cc',
134 'midi_streamview.cc',
137 'midi_velocity_dialog.cc',
138 'missing_file_dialog.cc',
139 'missing_plugin_dialog.cc',
141 'mixer_group_tabs.cc',
147 'monitor_section.cc',
148 'monitor_selector.cc',
150 'mono_panner_editor.cc',
153 'new_plugin_preset_dialog.cc',
154 'normalize_dialog.cc',
158 'note_select_dialog.cc',
165 'panner_interface.cc',
168 'piano_roll_header.cc',
170 'playlist_selector.cc',
172 'plugin_selector.cc',
177 'port_matrix_body.cc',
178 'port_matrix_column_labels.cc',
179 'port_matrix_component.cc',
180 'port_matrix_grid.cc',
181 'port_matrix_labels.cc',
182 'port_matrix_row_labels.cc',
184 'patch_change_dialog.cc',
185 'progress_reporter.cc',
188 'quantize_dialog.cc',
189 'rc_option_editor.cc',
191 'region_gain_line.cc',
192 'region_layering_order_editor.cc',
193 'region_selection.cc',
197 'route_group_dialog.cc',
198 'route_group_menu.cc',
199 'route_params_ui.cc',
200 'route_processor_selection.cc',
201 'route_time_axis.cc',
205 'search_path_option.cc',
207 'selection_memento.cc',
210 'session_import_dialog.cc',
211 'session_metadata_dialog.cc',
212 'session_option_editor.cc',
214 'shuttle_control.cc',
215 'soundcloud_export_selector.cc',
222 'stereo_panner_editor.cc',
224 'strip_silence_dialog.cc',
226 'tape_region_view.cc',
231 'time_axis_view_item.cc',
236 'track_selection.cc',
237 'track_view_list.cc',
238 'transform_dialog.cc',
239 'transpose_dialog.cc',
243 'visibility_group.cc',
244 'volume_controller.cc',
246 # video-timeline related sources:
247 'video_image_frame.cc',
248 'add_video_dialog.cc',
249 'editor_videotimeline.cc',
252 'transcode_ffmpeg.cc',
253 'transcode_video_dialog.cc',
254 'video_server_dialog.cc',
256 'export_video_dialog.cc',
257 'export_video_infobox.cc',
258 'video_tool_paths.cc'
261 def enoify (major, minor):
263 return "\\n\\\"E-No\\\""
266 return "\\n\\\"No Pussyfooting\\\""
268 return "\\n\\\"Here Come the Warm Jets\\\""
270 return "\\n\\\"Taking Tiger Mountain\\\""
272 return "\\n\\\"Lady June's Linguistic Leprosy\\\""
274 return "\\n\\\"Discreet Music\\\""
276 return "\\n\\\"Another Green World\\\""
278 return "\\n\\\"Evening Star\\\""
282 autowaf.set_options(opt)
286 conf.load('compiler_cxx')
287 autowaf.configure(conf)
289 # TODO: Insert a sanity check for on OS X to ensure CoreAudio is present
291 autowaf.check_pkg(conf, 'fftw3f', uselib_store='FFTW3F',
293 autowaf.check_pkg(conf, 'flac', uselib_store='FLAC',
294 atleast_version='1.2.1')
295 autowaf.check_pkg(conf, 'gthread-2.0', uselib_store='GTHREAD',
296 atleast_version='2.10.1')
297 autowaf.check_pkg(conf, 'gtk+-2.0', uselib_store='GTK',
298 atleast_version='2.18')
299 autowaf.check_pkg(conf, 'gtkmm-2.4', uselib_store='GTKMM',
300 atleast_version='2.18')
301 autowaf.check_pkg(conf, 'ogg', uselib_store='OGG', atleast_version='1.1.2')
302 autowaf.check_pkg(conf, 'x11', uselib_store='X11', atleast_version='1.1', mandatory=False)
303 autowaf.check_pkg(conf, 'fontconfig', uselib_store='FONTCONFIG')
305 conf.write_config_header('gtk2ardour-config.h', remove=False)
307 bak = conf.env['define_key']
308 conf.define('VERSIONSTRING', str (conf.env['VERSION']))
309 conf.define('CODENAME', enoify(int(conf.env['MAJOR']), int(conf.env['MINOR'])))
310 conf.env['define_key'] = ['VERSIONSTRING', 'CODENAME' ]
311 conf.write_config_header('gtk2ardour-version.h')
312 conf.env['define_key'] = bak;
315 autowaf.check_header(conf, 'cxx', 'boost/shared_ptr.hpp')
316 autowaf.check_header(conf, 'cxx', 'boost/weak_ptr.hpp')
318 # Add a waf `feature' to allow compilation of things using winegcc
319 from waflib.TaskGen import feature
321 def set_winegcc(self):
322 self.env.LINK_CXX = self.env.LINK_CC = 'wineg++'
323 self.env.CC = 'winegcc'
325 def _doPyp(infileName, deps = False):
328 re_spaces = re.compile("\s+")
330 if infileName == '-':
333 fd = open(infileName)
334 inLines = fd.readlines()
340 bits = re_spaces.split(line)
341 if bits[0] == '##include':
346 # assume included file comes from same place as source file
347 incName = os.path.join (os.path.dirname (infileName), incName);
348 outStr += _doPyp(incName)
359 def include_processor(task):
360 infileName = task.inputs[0].srcpath()
361 outfileName = os.path.join(out, task.outputs[0].bldpath())
362 fdOut = open (outfileName, "w")
363 fdOut.write (_doPyp(infileName))
367 def build_color_scheme(path, prefix):
371 if re.search ('^#@color', line):
372 line.strip() # remove newline
374 if len(color_scheme):
376 color_scheme += prefix
378 color_scheme += words[1]
380 color_scheme += words[2]
386 VERSION = "%s.%s" % (bld.env['MAJOR'], bld.env['MINOR'])
387 I18N_PACKAGE = 'gtk2_ardour' + bld.env['MAJOR']
389 if bld.is_defined('WINDOWS_VST_SUPPORT') and bld.env['build_target'] != 'mingw':
390 # Windows VST support w/wine
391 # If we require VST support we build a stub main() and the FST library
392 # here using winegcc, and link it to the GTK front-end library
393 obj = bld (features = 'cxx c cxxprogram wine')
394 obj.source = ( '../libs/fst/vstwin.c', '../vst/winmain.c' )
396 # XXX do we really need to explicitly link to all of these for the wine executable?
398 obj.use = [ 'libpbd',
409 obj.target = 'ardour-' + str (bld.env['VERSION']) + '-vst.exe.so'
410 obj.includes = [ '../libs/fst', '.' ]
411 obj.linkflags = ['-mwindows', '-Wl,--export-dynamic']
412 obj.linkflags += bld.env['LDFLAGS']
413 obj.defines = ['_POSIX_SOURCE', 'USE_WS_PREFIX']
414 obj.install_path = bld.env['DLLDIR']
415 # end of the wine executable
417 # now the shared library containing the GTK GUI for ardour
418 obj = bld (features = 'cxx c cxxshlib')
419 obj.source = gtk2_ardour_sources
420 obj.includes = [ '../libs/fst', '.' ]
421 obj.name = 'libgtk2_ardour'
422 obj.target = 'gtk2_ardour'
425 # just the normal executable version of the GTK GUI
426 if bld.env['build_target'] == 'mingw':
427 obj = bld (features = 'cxx c cxxprogram winres')
429 obj = bld (features = 'cxx c cxxprogram')
430 obj.source = gtk2_ardour_sources
431 obj.target = 'ardour-' + str (bld.env['VERSION'])
433 obj.ldflags = ['-no-undefined']
435 if bld.is_defined('WINDOWS_VST_SUPPORT'):
436 # Windows VST support mingw
437 obj.includes += [ '../libs/fst' ]
439 # at this point, "obj" refers to either the normal native executable
440 # OR the shared library built for use with wine on linux.
442 obj.use = [ 'libpbd',
453 'PACKAGE="' + I18N_PACKAGE + '"',
454 'DATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"',
455 'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
456 'LOCALEDIR="' + os.path.normpath(bld.env['LOCALEDIR']) + '"',
458 obj.install_path = bld.env['DLLDIR']
459 obj.uselib = 'UUID FLAC FONTCONFIG GLIBMM GTHREAD GTK OGG CURL DL'
460 obj.uselib += ' GTKMM CANVAS FFTW3F'
461 obj.uselib += ' AUDIOUNITS OSX GTKOSX LO '
462 obj.uselib += ' TAGLIB '
464 if sys.platform == 'darwin':
465 obj.uselib += ' AUDIOUNITS OSX GTKOSX'
466 obj.use += ' libappleutility'
467 obj.source += [ 'cocoacarbon.mm', 'bundle_env_cocoa.cc' ]
468 elif bld.env['build_target'] == 'mingw':
469 obj.source += [ 'bundle_env_mingw.cc' ]
470 obj.source += [ 'windows_icon.rc' ]
472 obj.source += [ 'bundle_env_linux.cc' ]
474 obj.includes += ['../libs']
476 obj.use += 'libptformat'
478 if bld.env['build_target'] == 'mingw':
479 obj.linkflags = ['-mwindows']
481 if bld.is_defined('HAVE_SUIL'):
482 obj.source += [ 'lv2_plugin_ui.cc' ]
483 obj.use += [ 'SUIL' ]
485 if bld.is_defined('NEED_INTL'):
486 obj.linkflags = ' -lintl'
488 if bld.is_defined('WINDOWS_VST_SUPPORT'):
489 obj.source += [ 'windows_vst_plugin_ui.cc' ]
490 obj.defines += [ 'WINDOWS_VST_SUPPORT' ]
491 if bld.env['build_target'] != 'mingw':
494 if bld.is_defined('LXVST_SUPPORT'):
495 obj.source += [ 'linux_vst_gui_support.cc', 'lxvst_plugin_ui.cc' ]
496 obj.defines += [ 'LXVST_SUPPORT' ]
499 if bld.is_defined('WINDOWS_VST_SUPPORT') or bld.is_defined('LXVST_SUPPORT'):
500 obj.source += [ 'vst_plugin_ui.cc' ]
502 if bld.is_defined('PHONE_HOME'):
503 obj.defines += [ 'PHONE_HOME' ]
505 if bld.is_defined('HAVE_COREAUDIO'):
506 TaskGen.task_gen.mappings['.mm'] = TaskGen.task_gen.mappings['.cc']
507 obj.use += ' libappleutility '
509 if bld.is_defined('AUDIOUNIT_SUPPORT'):
510 obj.source += [ 'au_pluginui.mm' ]
514 wrapper_subst_dict = {
515 'INSTALL_PREFIX' : bld.env['PREFIX'],
516 'LIBDIR' : os.path.normpath(bld.env['DLLDIR']),
517 'DATADIR' : os.path.normpath(bld.env['DATADIR']),
518 'CONFDIR' : os.path.normpath(bld.env['CONFDIR']),
519 'LIBS' : 'build/libs',
520 'VERSION' : str (bld.env['VERSION']),
521 'EXECUTABLE' : 'build/gtk2_ardour/ardour-' + str (bld.env['VERSION'])
524 def set_subst_dict(obj, dict):
526 setattr(obj, i, dict[i])
528 obj = bld(features = 'subst')
529 obj.source = 'ardev_common.sh.in'
530 obj.target = 'ardev_common_waf.sh'
531 obj.chmod = Utils.O755
532 obj.dict = wrapper_subst_dict
533 set_subst_dict(obj, wrapper_subst_dict)
535 obj = bld(features = 'subst')
536 obj.source = 'ardour.sh.in'
537 obj.target = 'ardour' + str (bld.env['MAJOR'])
538 obj.chmod = Utils.O755
539 obj.dict = wrapper_subst_dict
540 obj.install_path = bld.env['BINDIR']
541 set_subst_dict(obj, wrapper_subst_dict)
543 if bld.is_defined('WINDOWS_VST_SUPPORT'):
544 obj = bld(features = 'subst')
545 obj.source = '../vst/ardourvst.in'
546 obj.target = 'ardourvst' + str (bld.env['MAJOR'])
547 obj.chmod = Utils.O755
548 obj.dict = wrapper_subst_dict
549 obj.install_path = bld.env['BINDIR']
550 set_subst_dict(obj, wrapper_subst_dict)
559 if bld.is_defined('GTKOSX'): # OS X fonts
573 # There is no acceptable monospace font available on older versions of OS X
574 # and no API on those versions to load TTF files that will work with
575 # GTK/fontconfig/pango.
577 # In addition, the ArdourMono font gets clipped for some reason on OS X
579 # Moreover, Lucida Grande just seems to work even though it is not monospace
583 'MONOSPACE' : 'Monaco',
584 'CLOCKFONT' : 'Lucida Grande',
586 else: # Linux/X11 fonts
587 basefont = '' # unspecified - use system defaults
600 'MONOSPACE' : 'ArdourMono',
601 'CLOCKFONT' : 'ArdourMono',
604 # Set up font substitution dictionary
606 for style in ['', 'BOLD', 'ITALIC']:
607 for sizename,points in iter(font_sizes.items()):
609 key = "_".join (['FONT',style,sizename])
610 fontstyle = " ".join ([basefont,style.lower(),points])
612 key = "_".join (['FONT',sizename])
613 fontstyle = " ".join ([basefont,points])
615 font_subst_dict[key] = fontstyle
618 for sizename,points in iter(font_sizes.items()):
619 key = "_".join (['FONT_SIZE',sizename])
620 font_subst_dict[key] = points
622 # various font names, eg @BOLD_MONOSPACE@
623 for font_sym,text in iter(font_names.items()):
625 font_subst_dict[key] = text
629 obj = bld(features = 'subst')
630 obj.source = [ 'clearlooks.rc.in' ]
631 obj.target = 'clearlooks.rc'
632 obj.install_path = bld.env['CONFDIR']
633 set_subst_dict(obj, font_subst_dict)
635 obj = bld(features = 'subst')
636 obj.source = [ 'default_ui_config.in' ]
637 obj.target = 'default_ui_config'
638 obj.install_path = bld.env['CONFDIR']
639 set_subst_dict(obj, font_subst_dict)
643 if bld.is_defined('GTKOSX'):
644 menus_argv = [ '-E', '-P', '-DGTKOSX' ]
646 menus_argv = [ '-E', '-P' ]
648 if bld.is_defined('PTFORMAT'):
649 menus_argv += [ '-DPTFORMAT' ]
651 # always build all versions of the menu definitions
652 # so that we can try them out with different program builds.
653 for program in [ 'ardour', 'trx' ]:
654 obj = bld(features = 'command-output')
656 obj.command_is_external = True
658 obj.argv = menus_argv
659 obj.dep_vars = ['PTFORMAT', 'GTKOSX', 'WINDOWS']
660 obj.stdin = program + '.menus.in'
661 obj.stdout = program + '.menus'
662 bld.install_files (bld.env['CONFDIR'], program + '.menus')
666 # 'SAE-de-keypad', 'SAE-de-nokeypad', 'SAE-us-keypad',
667 # 'SAE-us-nokeypad', 'ergonomic-us'
670 # explicitly state the use of perl here so that it works on windows too
672 a_rule = 'perl ../tools/fmt-bindings --platform="%s" --winkey="%s" --accelmap <${SRC} >${TGT}' % (sys.platform, bld.env['WINDOWS_KEY'] )
673 for b in [ 'mnemonic-us' ] :
675 target = b + '.bindings',
676 source = b + '.bindings.in',
679 obj.install_path = bld.env['CONFDIR']
681 # not modified at present
682 bld.install_files(bld.env['CONFDIR'], 'dark.colors')
683 bld.install_files(bld.env['CONFDIR'], 'step_editing.bindings')
684 bld.install_files(bld.env['CONFDIR'], 'mixer.bindings')
687 bld.install_files(os.path.join (bld.env['DATADIR'], 'icons'), bld.path.ant_glob('icons/*.png'))
688 bld.install_files(os.path.join (bld.env['DATADIR'], 'pixmaps'), bld.path.ant_glob('pixmaps/*.xpm'))
689 bld.install_files(bld.env['DATADIR'], 'splash.png')
690 bld.install_files(bld.env['DATADIR'], 'small-splash.png')
691 bld.install_files(bld.env['DATADIR'], 'ArdourMono.ttf')
693 # Default UI configuration
694 bld.install_files(bld.env['CONFDIR'], 'default_ui_config')
696 bld.install_files(bld.env['CONFDIR'], 'dark.colors')
698 # Default export stuff
699 bld.install_files(os.path.join(bld.env['CONFDIR'], 'export'), bld.path.ant_glob('export/*.format'))
702 if bld.is_defined('ENABLE_NLS'):
703 mo_files = bld.path.ant_glob('po/*.mo')
705 lang = os.path.basename(mo.srcpath()).replace('.mo', '')
706 bld.install_as (os.path.join(os.path.normpath(bld.env['LOCALEDIR']), lang, 'LC_MESSAGES', I18N_PACKAGE + '.mo'),
710 I18N_PACKAGE = 'gtk2_ardour' + bld.env['MAJOR']
711 autowaf.build_i18n(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,
715 I18N_PACKAGE = 'gtk2_ardour' + bld.env['MAJOR']
716 autowaf.build_i18n_pot(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,
720 I18N_PACKAGE = 'gtk2_ardour' + bld.env['MAJOR']
721 autowaf.build_i18n_po(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,
725 I18N_PACKAGE = 'gtk2_ardour' + bld.env['MAJOR']
726 autowaf.build_i18n_mo(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,