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',
237 'track_selection.cc',
238 'track_view_list.cc',
239 'transform_dialog.cc',
240 'transpose_dialog.cc',
244 'visibility_group.cc',
245 'volume_controller.cc',
247 # video-timeline related sources:
248 'video_image_frame.cc',
249 'add_video_dialog.cc',
250 'editor_videotimeline.cc',
253 'transcode_ffmpeg.cc',
254 'transcode_video_dialog.cc',
255 'video_server_dialog.cc',
257 'export_video_dialog.cc',
258 'export_video_infobox.cc',
259 'video_tool_paths.cc'
262 def enoify (major, minor):
264 return "\\n\\\"E-No\\\""
267 return "\\n\\\"No Pussyfooting\\\""
269 return "\\n\\\"Here Come the Warm Jets\\\""
271 return "\\n\\\"Taking Tiger Mountain\\\""
273 return "\\n\\\"Lady June's Linguistic Leprosy\\\""
275 return "\\n\\\"Discreet Music\\\""
277 return "\\n\\\"Another Green World\\\""
279 return "\\n\\\"Evening Star\\\""
283 autowaf.set_options(opt)
287 conf.load('compiler_cxx')
288 autowaf.configure(conf)
290 # TODO: Insert a sanity check for on OS X to ensure CoreAudio is present
292 autowaf.check_pkg(conf, 'fftw3f', uselib_store='FFTW3F',
294 autowaf.check_pkg(conf, 'flac', uselib_store='FLAC',
295 atleast_version='1.2.1')
296 autowaf.check_pkg(conf, 'gthread-2.0', uselib_store='GTHREAD',
297 atleast_version='2.10.1')
298 autowaf.check_pkg(conf, 'gtk+-2.0', uselib_store='GTK',
299 atleast_version='2.18')
300 autowaf.check_pkg(conf, 'gtkmm-2.4', uselib_store='GTKMM',
301 atleast_version='2.18')
302 autowaf.check_pkg(conf, 'ogg', uselib_store='OGG', atleast_version='1.1.2')
303 autowaf.check_pkg(conf, 'x11', uselib_store='X11', atleast_version='1.1', mandatory=False)
304 autowaf.check_pkg(conf, 'fontconfig', uselib_store='FONTCONFIG')
306 conf.write_config_header('gtk2ardour-config.h', remove=False)
308 bak = conf.env['define_key']
309 conf.define('VERSIONSTRING', str (conf.env['VERSION']))
310 conf.define('CODENAME', enoify(int(conf.env['MAJOR']), int(conf.env['MINOR'])))
311 conf.env['define_key'] = ['VERSIONSTRING', 'CODENAME' ]
312 conf.write_config_header('gtk2ardour-version.h')
313 conf.env['define_key'] = bak;
316 autowaf.check_header(conf, 'cxx', 'boost/shared_ptr.hpp')
317 autowaf.check_header(conf, 'cxx', 'boost/weak_ptr.hpp')
319 # Add a waf `feature' to allow compilation of things using winegcc
320 from waflib.TaskGen import feature
322 def set_winegcc(self):
323 self.env.LINK_CXX = self.env.LINK_CC = 'wineg++'
324 self.env.CC = 'winegcc'
326 def _doPyp(infileName, deps = False):
329 re_spaces = re.compile("\s+")
331 if infileName == '-':
334 fd = open(infileName)
335 inLines = fd.readlines()
341 bits = re_spaces.split(line)
342 if bits[0] == '##include':
347 # assume included file comes from same place as source file
348 incName = os.path.join (os.path.dirname (infileName), incName);
349 outStr += _doPyp(incName)
360 def include_processor(task):
361 infileName = task.inputs[0].srcpath()
362 outfileName = os.path.join(out, task.outputs[0].bldpath())
363 fdOut = open (outfileName, "w")
364 fdOut.write (_doPyp(infileName))
368 def build_color_scheme(path, prefix):
372 if re.search ('^#@color', line):
373 line.strip() # remove newline
375 if len(color_scheme):
377 color_scheme += prefix
379 color_scheme += words[1]
381 color_scheme += words[2]
387 VERSION = "%s.%s" % (bld.env['MAJOR'], bld.env['MINOR'])
388 I18N_PACKAGE = 'gtk2_ardour' + bld.env['MAJOR']
390 if bld.is_defined('WINDOWS_VST_SUPPORT') and bld.env['build_target'] != 'mingw':
391 # Windows VST support w/wine
392 # If we require VST support we build a stub main() and the FST library
393 # here using winegcc, and link it to the GTK front-end library
394 obj = bld (features = 'cxx c cxxprogram wine')
395 obj.source = ( '../libs/fst/vstwin.c', '../vst/winmain.c' )
397 # XXX do we really need to explicitly link to all of these for the wine executable?
399 obj.use = [ 'libpbd',
410 obj.target = 'ardour-' + str (bld.env['VERSION']) + '-vst.exe.so'
411 obj.includes = [ '../libs/fst', '.' ]
412 obj.linkflags = ['-mwindows', '-Wl,--export-dynamic']
413 obj.linkflags += bld.env['LDFLAGS']
414 obj.defines = ['_POSIX_SOURCE', 'USE_WS_PREFIX']
415 obj.install_path = bld.env['DLLDIR']
416 # end of the wine executable
418 # now the shared library containing the GTK GUI for ardour
419 obj = bld (features = 'cxx c cxxshlib')
420 obj.source = gtk2_ardour_sources
421 obj.includes = [ '../libs/fst', '.' ]
422 obj.name = 'libgtk2_ardour'
423 obj.target = 'gtk2_ardour'
426 # just the normal executable version of the GTK GUI
427 if bld.env['build_target'] == 'mingw':
428 obj = bld (features = 'cxx c cxxprogram winres')
430 obj = bld (features = 'cxx c cxxprogram')
431 obj.source = gtk2_ardour_sources
432 obj.target = 'ardour-' + str (bld.env['VERSION'])
434 obj.ldflags = ['-no-undefined']
436 if bld.is_defined('WINDOWS_VST_SUPPORT'):
437 # Windows VST support mingw
438 obj.includes += [ '../libs/fst' ]
440 # at this point, "obj" refers to either the normal native executable
441 # OR the shared library built for use with wine on linux.
443 obj.use = [ 'libpbd',
454 'PACKAGE="' + I18N_PACKAGE + '"',
455 'DATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"',
456 'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
457 'LOCALEDIR="' + os.path.normpath(bld.env['LOCALEDIR']) + '"',
459 obj.install_path = bld.env['DLLDIR']
460 obj.uselib = 'UUID FLAC FONTCONFIG GLIBMM GTHREAD GTK OGG CURL DL'
461 obj.uselib += ' GTKMM CANVAS FFTW3F'
462 obj.uselib += ' AUDIOUNITS OSX GTKOSX LO '
463 obj.uselib += ' TAGLIB '
465 if sys.platform == 'darwin':
466 obj.uselib += ' AUDIOUNITS OSX GTKOSX'
467 obj.use += ' libappleutility'
468 obj.source += [ 'cocoacarbon.mm', 'bundle_env_cocoa.cc' ]
469 elif bld.env['build_target'] == 'mingw':
470 obj.source += [ 'bundle_env_mingw.cc' ]
471 obj.source += [ 'windows_icon.rc' ]
473 obj.source += [ 'bundle_env_linux.cc' ]
475 obj.includes += ['../libs']
477 obj.use += 'libptformat'
479 if bld.env['build_target'] == 'mingw':
480 obj.linkflags = ['-mwindows']
482 if bld.is_defined('HAVE_SUIL'):
483 obj.source += [ 'lv2_plugin_ui.cc' ]
484 obj.use += [ 'SUIL' ]
486 if bld.is_defined('NEED_INTL'):
487 obj.linkflags = ' -lintl'
489 if bld.is_defined('WINDOWS_VST_SUPPORT'):
490 obj.source += [ 'windows_vst_plugin_ui.cc' ]
491 obj.defines += [ 'WINDOWS_VST_SUPPORT' ]
492 if bld.env['build_target'] != 'mingw':
495 if bld.is_defined('LXVST_SUPPORT'):
496 obj.source += [ 'linux_vst_gui_support.cc', 'lxvst_plugin_ui.cc' ]
497 obj.defines += [ 'LXVST_SUPPORT' ]
500 if bld.is_defined('WINDOWS_VST_SUPPORT') or bld.is_defined('LXVST_SUPPORT'):
501 obj.source += [ 'vst_plugin_ui.cc' ]
503 if bld.is_defined('PHONE_HOME'):
504 obj.defines += [ 'PHONE_HOME' ]
506 if bld.is_defined('HAVE_COREAUDIO'):
507 TaskGen.task_gen.mappings['.mm'] = TaskGen.task_gen.mappings['.cc']
508 obj.use += ' libappleutility '
510 if bld.is_defined('AUDIOUNIT_SUPPORT'):
511 obj.source += [ 'au_pluginui.mm' ]
515 wrapper_subst_dict = {
516 'INSTALL_PREFIX' : bld.env['PREFIX'],
517 'LIBDIR' : os.path.normpath(bld.env['DLLDIR']),
518 'DATADIR' : os.path.normpath(bld.env['DATADIR']),
519 'CONFDIR' : os.path.normpath(bld.env['CONFDIR']),
520 'LIBS' : 'build/libs',
521 'VERSION' : str (bld.env['VERSION']),
522 'EXECUTABLE' : 'build/gtk2_ardour/ardour-' + str (bld.env['VERSION'])
525 def set_subst_dict(obj, dict):
527 setattr(obj, i, dict[i])
529 obj = bld(features = 'subst')
530 obj.source = 'ardev_common.sh.in'
531 obj.target = 'ardev_common_waf.sh'
532 obj.chmod = Utils.O755
533 obj.dict = wrapper_subst_dict
534 set_subst_dict(obj, wrapper_subst_dict)
536 obj = bld(features = 'subst')
537 obj.source = 'ardour.sh.in'
538 obj.target = 'ardour' + str (bld.env['MAJOR'])
539 obj.chmod = Utils.O755
540 obj.dict = wrapper_subst_dict
541 obj.install_path = bld.env['BINDIR']
542 set_subst_dict(obj, wrapper_subst_dict)
544 if bld.is_defined('WINDOWS_VST_SUPPORT'):
545 obj = bld(features = 'subst')
546 obj.source = '../vst/ardourvst.in'
547 obj.target = 'ardourvst' + str (bld.env['MAJOR'])
548 obj.chmod = Utils.O755
549 obj.dict = wrapper_subst_dict
550 obj.install_path = bld.env['BINDIR']
551 set_subst_dict(obj, wrapper_subst_dict)
560 if bld.is_defined('GTKOSX'): # OS X fonts
574 # There is no acceptable monospace font available on older versions of OS X
575 # and no API on those versions to load TTF files that will work with
576 # GTK/fontconfig/pango.
578 # In addition, the ArdourMono font gets clipped for some reason on OS X
580 # Moreover, Lucida Grande just seems to work even though it is not monospace
584 'MONOSPACE' : 'Monaco',
585 'CLOCKFONT' : 'Lucida Grande',
587 else: # Linux/X11 fonts
588 basefont = '' # unspecified - use system defaults
601 'MONOSPACE' : 'ArdourMono',
602 'CLOCKFONT' : 'ArdourMono',
605 # Set up font substitution dictionary
607 for style in ['', 'BOLD', 'ITALIC']:
608 for sizename,points in iter(font_sizes.items()):
610 key = "_".join (['FONT',style,sizename])
611 fontstyle = " ".join ([basefont,style.lower(),points])
613 key = "_".join (['FONT',sizename])
614 fontstyle = " ".join ([basefont,points])
616 font_subst_dict[key] = fontstyle
619 for sizename,points in iter(font_sizes.items()):
620 key = "_".join (['FONT_SIZE',sizename])
621 font_subst_dict[key] = points
623 # various font names, eg @BOLD_MONOSPACE@
624 for font_sym,text in iter(font_names.items()):
626 font_subst_dict[key] = text
630 obj = bld(features = 'subst')
631 obj.source = [ 'clearlooks.rc.in' ]
632 obj.target = 'clearlooks.rc'
633 obj.install_path = bld.env['CONFDIR']
634 set_subst_dict(obj, font_subst_dict)
636 obj = bld(features = 'subst')
637 obj.source = [ 'default_ui_config.in' ]
638 obj.target = 'default_ui_config'
639 obj.install_path = bld.env['CONFDIR']
640 set_subst_dict(obj, font_subst_dict)
644 if bld.is_defined('GTKOSX'):
645 menus_argv = [ '-E', '-P', '-DGTKOSX' ]
647 menus_argv = [ '-E', '-P' ]
649 if bld.is_defined('PTFORMAT'):
650 menus_argv += [ '-DPTFORMAT' ]
652 # always build all versions of the menu definitions
653 # so that we can try them out with different program builds.
654 for program in [ 'ardour', 'trx' ]:
655 obj = bld(features = 'command-output')
657 obj.command_is_external = True
659 obj.argv = menus_argv
660 obj.dep_vars = ['PTFORMAT', 'GTKOSX', 'WINDOWS']
661 obj.stdin = program + '.menus.in'
662 obj.stdout = program + '.menus'
663 bld.install_files (bld.env['CONFDIR'], program + '.menus')
667 # 'SAE-de-keypad', 'SAE-de-nokeypad', 'SAE-us-keypad',
668 # 'SAE-us-nokeypad', 'ergonomic-us'
671 # explicitly state the use of perl here so that it works on windows too
673 a_rule = 'perl ../tools/fmt-bindings --platform="%s" --winkey="%s" --accelmap <${SRC} >${TGT}' % (sys.platform, bld.env['WINDOWS_KEY'] )
674 for b in [ 'mnemonic-us' ] :
676 target = b + '.bindings',
677 source = b + '.bindings.in',
680 obj.install_path = bld.env['CONFDIR']
682 # not modified at present
683 bld.install_files(bld.env['CONFDIR'], 'dark.colors')
684 bld.install_files(bld.env['CONFDIR'], 'step_editing.bindings')
685 bld.install_files(bld.env['CONFDIR'], 'mixer.bindings')
688 bld.install_files(os.path.join (bld.env['DATADIR'], 'icons'), bld.path.ant_glob('icons/*.png'))
689 bld.install_files(os.path.join (bld.env['DATADIR'], 'pixmaps'), bld.path.ant_glob('pixmaps/*.xpm'))
690 bld.install_files(bld.env['DATADIR'], 'splash.png')
691 bld.install_files(bld.env['DATADIR'], 'small-splash.png')
692 bld.install_files(bld.env['DATADIR'], 'ArdourMono.ttf')
694 if bld.env['build_target'] == 'mingw':
695 # These icons need to overwrite the files already installed in the icons
696 # directory above. Do this in the external packaging scripts for now.
697 #bld.install_files(os.path.join (bld.env['DATADIR'], 'icons'), bld.path.ant_glob('icons/cursor_square/*.png'))
698 bld.install_files(os.path.join (bld.env['DATADIR'], 'icons'), 'icons/cursor_square/hotspots')
700 # Default UI configuration
701 bld.install_files(bld.env['CONFDIR'], 'default_ui_config')
703 bld.install_files(bld.env['CONFDIR'], 'dark.colors')
705 # Default export stuff
706 bld.install_files(os.path.join(bld.env['CONFDIR'], 'export'), bld.path.ant_glob('export/*.format'))
709 if bld.is_defined('ENABLE_NLS'):
710 mo_files = bld.path.ant_glob('po/*.mo')
712 lang = os.path.basename(mo.srcpath()).replace('.mo', '')
713 bld.install_as (os.path.join(os.path.normpath(bld.env['LOCALEDIR']), lang, 'LC_MESSAGES', I18N_PACKAGE + '.mo'),
717 I18N_PACKAGE = 'gtk2_ardour' + bld.env['MAJOR']
718 autowaf.build_i18n(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,
722 I18N_PACKAGE = 'gtk2_ardour' + bld.env['MAJOR']
723 autowaf.build_i18n_pot(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,
727 I18N_PACKAGE = 'gtk2_ardour' + bld.env['MAJOR']
728 autowaf.build_i18n_po(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,
732 I18N_PACKAGE = 'gtk2_ardour' + bld.env['MAJOR']
733 autowaf.build_i18n_mo(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,