Rearrange condition for pure midi plugins
[ardour.git] / gtk2_ardour / wscript
index 28a8ad5b5a900d33b8a2db51fec4af5060de07db..398bd57248829b1d12aee7d28f96a1e53d2c7e70 100644 (file)
@@ -3,17 +3,26 @@ from waflib.extras import autowaf as autowaf
 from waflib import Options, TaskGen
 import waflib.Logs as Logs, waflib.Utils as Utils
 import os
 from waflib import Options, TaskGen
 import waflib.Logs as Logs, waflib.Utils as Utils
 import os
+import shutil
 import sys
 import re
 import time
 from waflib.Task import Task
 import sys
 import re
 import time
 from waflib.Task import Task
-
-I18N_PACKAGE = 'gtk2_ardour3'
+from waflib.Tools import winres
+import subprocess
+import glob
+import copy
 
 # Mandatory variables
 top = '.'
 out = 'build'
 
 
 # Mandatory variables
 top = '.'
 out = 'build'
 
+from waflib import TaskGen
+@TaskGen.extension('.m')
+def m_hook(self, node):
+       """Alias .m files to be compiled the same as .c files, gcc will do the right thing."""
+       return self.create_compiled_task('c', node)
+
 path_prefix = 'gtk2_ardour/'
 
 gtk2_ardour_sources = [
 path_prefix = 'gtk2_ardour/'
 
 gtk2_ardour_sources = [
@@ -24,6 +33,11 @@ gtk2_ardour_sources = [
         'analysis_window.cc',
         'ardour_button.cc',
         'ardour_dialog.cc',
         'analysis_window.cc',
         'ardour_button.cc',
         'ardour_dialog.cc',
+        'ardour_display.cc',
+        'ardour_dropdown.cc',
+        'ardour_http.cc',
+        'ardour_knob.cc',
+        'ardour_spinner.cc',
         'ardour_ui.cc',
         'ardour_ui2.cc',
         'ardour_ui_dependents.cc',
         'ardour_ui.cc',
         'ardour_ui2.cc',
         'ardour_ui_dependents.cc',
@@ -47,16 +61,21 @@ gtk2_ardour_sources = [
         'bundle_manager.cc',
         'button_joiner.cc',
         'clock_group.cc',
         'bundle_manager.cc',
         'button_joiner.cc',
         'clock_group.cc',
+        'color_theme_manager.cc',
         'configinfo.cc',
         'control_point.cc',
         'control_point_dialog.cc',
         'configinfo.cc',
         'control_point.cc',
         'control_point_dialog.cc',
+        'control_slave_ui.cc',
+        'cursor_context.cc',
         'curvetest.cc',
         'debug.cc',
         'curvetest.cc',
         'debug.cc',
+        'duplicate_routes_dialog.cc',
         'edit_note_dialog.cc',
         'editing.cc',
         'editor.cc',
         'editor_actions.cc',
         'editor_audio_import.cc',
         'edit_note_dialog.cc',
         'editing.cc',
         'editor.cc',
         'editor_actions.cc',
         'editor_audio_import.cc',
+        'editor_pt_import.cc',
         'editor_audiotrack.cc',
         'editor_canvas.cc',
         'editor_canvas_events.cc',
         'editor_audiotrack.cc',
         'editor_canvas.cc',
         'editor_canvas_events.cc',
@@ -89,21 +108,22 @@ gtk2_ardour_sources = [
         'export_format_dialog.cc',
         'export_format_selector.cc',
         'export_preset_selector.cc',
         'export_format_dialog.cc',
         'export_format_selector.cc',
         'export_preset_selector.cc',
+        'export_report.cc',
         'export_timespan_selector.cc',
         'fft.cc',
         'fft_graph.cc',
         'fft_result.cc',
         'export_timespan_selector.cc',
         'fft.cc',
         'fft_graph.cc',
         'fft_result.cc',
+        'floating_text_entry.cc',
         'sfdb_freesound_mootcher.cc',
         'gain_meter.cc',
         'generic_pluginui.cc',
         'ghostregion.cc',
         'global_port_matrix.cc',
         'group_tabs.cc',
         'sfdb_freesound_mootcher.cc',
         'gain_meter.cc',
         'generic_pluginui.cc',
         'ghostregion.cc',
         'global_port_matrix.cc',
         'group_tabs.cc',
-        'gtk-custom-hruler.c',
-        'gtk-custom-ruler.c',
         'gtk_pianokeyboard.c',
         'gui_object.cc',
         'gtk_pianokeyboard.c',
         'gui_object.cc',
-        'insert_time_dialog.cc',
+        'insert_remove_time_dialog.cc',
+        'instrument_selector.cc',
         'interthread_progress_window.cc',
         'io_selector.cc',
         'hit.cc',
         'interthread_progress_window.cc',
         'io_selector.cc',
         'hit.cc',
@@ -113,6 +133,9 @@ gtk2_ardour_sources = [
         'led.cc',
         'level_meter.cc',
         'location_ui.cc',
         'led.cc',
         'level_meter.cc',
         'location_ui.cc',
+        'lua_script_manager.cc',
+        'luainstance.cc',
+        'luawindow.cc',
         'main.cc',
         'main_clock.cc',
         'marker.cc',
         'main.cc',
         'main_clock.cc',
         'marker.cc',
@@ -132,7 +155,6 @@ gtk2_ardour_sources = [
         'midi_velocity_dialog.cc',
         'missing_file_dialog.cc',
         'missing_plugin_dialog.cc',
         'midi_velocity_dialog.cc',
         'missing_file_dialog.cc',
         'missing_plugin_dialog.cc',
-        'mixer_actor.cc',
         'mixer_group_tabs.cc',
         'mixer_strip.cc',
         'mixer_ui.cc',
         'mixer_group_tabs.cc',
         'mixer_strip.cc',
         'mixer_ui.cc',
@@ -140,6 +162,7 @@ gtk2_ardour_sources = [
         'meter_strip.cc',
         'meter_patterns.cc',
         'monitor_section.cc',
         'meter_strip.cc',
         'meter_patterns.cc',
         'monitor_section.cc',
+        'monitor_selector.cc',
         'mono_panner.cc',
         'mono_panner_editor.cc',
         'mouse_cursors.cc',
         'mono_panner.cc',
         'mono_panner_editor.cc',
         'mouse_cursors.cc',
@@ -149,6 +172,7 @@ gtk2_ardour_sources = [
         'note.cc',
         'note_base.cc',
         'note_player.cc',
         'note.cc',
         'note_base.cc',
         'note_player.cc',
+        'note_select_dialog.cc',
         'nsm.cc',
         'nsmclient.cc',
         'option_editor.cc',
         'nsm.cc',
         'nsmclient.cc',
         'option_editor.cc',
@@ -162,6 +186,8 @@ gtk2_ardour_sources = [
         'pingback.cc',
         'playlist_selector.cc',
         'plugin_eq_gui.cc',
         'pingback.cc',
         'playlist_selector.cc',
         'plugin_eq_gui.cc',
+        'plugin_pin_dialog.cc',
+        'plugin_setup_dialog.cc',
         'plugin_selector.cc',
         'plugin_ui.cc',
         'port_group.cc',
         'plugin_selector.cc',
         'plugin_ui.cc',
         'port_group.cc',
@@ -193,8 +219,12 @@ gtk2_ardour_sources = [
         'route_processor_selection.cc',
         'route_time_axis.cc',
         'route_ui.cc',
         'route_processor_selection.cc',
         'route_time_axis.cc',
         'route_ui.cc',
+        'ruler_dialog.cc',
+        'save_as_dialog.cc',
         'search_path_option.cc',
         'search_path_option.cc',
+        'script_selector.cc',
         'selection.cc',
         'selection.cc',
+        'selection_memento.cc',
         'send_ui.cc',
         'session_dialog.cc',
         'session_import_dialog.cc',
         'send_ui.cc',
         'session_dialog.cc',
         'session_import_dialog.cc',
@@ -202,6 +232,7 @@ gtk2_ardour_sources = [
         'session_option_editor.cc',
         'sfdb_ui.cc',
         'shuttle_control.cc',
         'session_option_editor.cc',
         'sfdb_ui.cc',
         'shuttle_control.cc',
+        'soundcloud_export_selector.cc',
         'splash.cc',
         'speaker_dialog.cc',
         'startup.cc',
         'splash.cc',
         'speaker_dialog.cc',
         'startup.cc',
@@ -213,6 +244,7 @@ gtk2_ardour_sources = [
         'strip_silence_dialog.cc',
         'sys_ex.cc',
         'tape_region_view.cc',
         'strip_silence_dialog.cc',
         'sys_ex.cc',
         'tape_region_view.cc',
+        'tempo_curve.cc',
         'tempo_dialog.cc',
         'tempo_lines.cc',
         'theme_manager.cc',
         'tempo_dialog.cc',
         'tempo_lines.cc',
         'theme_manager.cc',
@@ -221,51 +253,80 @@ gtk2_ardour_sources = [
         'time_fx_dialog.cc',
         'time_info_box.cc',
         'time_selection.cc',
         'time_fx_dialog.cc',
         'time_info_box.cc',
         'time_selection.cc',
+        'timers.cc',
+        'tooltips.cc',
         'track_selection.cc',
         'track_view_list.cc',
         'track_selection.cc',
         'track_view_list.cc',
+        'transform_dialog.cc',
         'transpose_dialog.cc',
         'ui_config.cc',
         'utils.cc',
         'transpose_dialog.cc',
         'ui_config.cc',
         'utils.cc',
+        'vca_master_strip.cc',
         'verbose_cursor.cc',
         'verbose_cursor.cc',
-        'version.cc',
         'visibility_group.cc',
         'visibility_group.cc',
-        'volume_controller.cc',
         'window_manager.cc',
 # video-timeline related sources:
         'video_image_frame.cc',
         'add_video_dialog.cc',
         'editor_videotimeline.cc',
         'window_manager.cc',
 # video-timeline related sources:
         'video_image_frame.cc',
         'add_video_dialog.cc',
         'editor_videotimeline.cc',
+        'vca_time_axis.cc',
         'video_timeline.cc',
         'video_timeline.cc',
-        'system_exec.cc',
         'video_monitor.cc',
         'transcode_ffmpeg.cc',
         'transcode_video_dialog.cc',
         'video_server_dialog.cc',
         'utils_videotl.cc',
         'export_video_dialog.cc',
         'video_monitor.cc',
         'transcode_ffmpeg.cc',
         'transcode_video_dialog.cc',
         'video_server_dialog.cc',
         'utils_videotl.cc',
         'export_video_dialog.cc',
-        'export_video_infobox.cc'
+        'export_video_infobox.cc',
+        'video_tool_paths.cc'
 ]
 
 ]
 
+def enoify (major, minor):
+    # Code names based on
+    # https://en.wikipedia.org/wiki/Brian_Eno_discography
+    #
+    # sort Studio albums + Collaborative albums + Compilation albums by Month/Year.
+    # (no Singles, no EPs, no Video Albums, no Production)
+    if major == 3:
+        return "\\n\\\"E-No\\\""
+    elif major == 4:
+        if minor == 0:
+            return "\\n\\\"No Pussyfooting\\\""
+        elif minor == 1:
+            return "\\n\\\"Here Come the Warm Jets\\\""
+        elif minor == 2:
+            return "\\n\\\"Taking Tiger Mountain\\\""
+        elif minor == 3:
+            return "\\n\\\"Lady June's Linguistic Leprosy\\\""
+        elif minor == 4:
+            return "\\n\\\"Discreet Music\\\""
+        elif minor == 5:
+            return "\\n\\\"Another Green World\\\""
+        elif minor == 6:
+            return "\\n\\\"Evening Star\\\""
+        elif minor == 7:
+            return "\\n\\\"Cluster and Eno\\\""
+    elif major == 5:
+        if minor == 0:
+            return "\\n\\\"Before and After Science\\\""
+        elif minor == 1:
+            return "\\n\\\"After the Heat\\\""
+    return "\\\"\\\""
+
 def options(opt):
     autowaf.set_options(opt)
 
 def configure(conf):
     conf.load('misc')
     conf.load('compiler_cxx')
 def options(opt):
     autowaf.set_options(opt)
 
 def configure(conf):
     conf.load('misc')
     conf.load('compiler_cxx')
-    # we don't use hard-coded micro versions with ardour, so hard code it to zero
-    autowaf.build_version_files(
-        path_prefix + 'version.h',
-        path_prefix + 'version.cc',
-        'gtk2_ardour', conf.env['MAJOR'], conf.env['MINOR'], 0)
     autowaf.configure(conf)
 
     autowaf.configure(conf)
 
-    if re.search ("linux", sys.platform) != None:
-        autowaf.check_pkg(conf, 'alsa', uselib_store='ALSA')
-
     # TODO: Insert a sanity check for on OS X to ensure CoreAudio is present
 
     autowaf.check_pkg(conf, 'fftw3f', uselib_store='FFTW3F',
                       mandatory=True)
     # TODO: Insert a sanity check for on OS X to ensure CoreAudio is present
 
     autowaf.check_pkg(conf, 'fftw3f', uselib_store='FFTW3F',
                       mandatory=True)
+    autowaf.check_pkg(conf, 'fftw3f', uselib_store='FFTW35F',
+                      atleast_version='3.3.5', mandatory=False)
     autowaf.check_pkg(conf, 'flac', uselib_store='FLAC',
                       atleast_version='1.2.1')
     autowaf.check_pkg(conf, 'gthread-2.0', uselib_store='GTHREAD',
     autowaf.check_pkg(conf, 'flac', uselib_store='FLAC',
                       atleast_version='1.2.1')
     autowaf.check_pkg(conf, 'gthread-2.0', uselib_store='GTHREAD',
@@ -278,8 +339,32 @@ def configure(conf):
     autowaf.check_pkg(conf, 'x11', uselib_store='X11', atleast_version='1.1', mandatory=False)
     autowaf.check_pkg(conf, 'fontconfig', uselib_store='FONTCONFIG')
 
     autowaf.check_pkg(conf, 'x11', uselib_store='X11', atleast_version='1.1', mandatory=False)
     autowaf.check_pkg(conf, 'fontconfig', uselib_store='FONTCONFIG')
 
+
+    if sys.platform == 'darwin':
+        retval = conf.run_c_code (code='#include <AppKit/NSWindow.h>\n\
+        int main(void) { (void) NSWindowWillStartLiveResizeNotification; return 0; }\n',
+                                  env = conf.env.derive (),
+                                  features = [ 'c' ],
+                                  compiler = 'cc',
+                                  compile_filename='test.m',
+                                  mandatory = False,
+            )
+
+        if retval == 0:
+            autowaf.display_msg (conf, 'Checking for Cocoa live resizing constants', 'ok')
+            conf.define ('HAVE_COCOA_LIVE_RESIZING', 1)
+        else:
+            autowaf.display_msg (conf, 'Checking for Cocoa live resizing constants', 'too old - AU plugin windows will be fixed size')
+
     conf.write_config_header('gtk2ardour-config.h', remove=False)
 
     conf.write_config_header('gtk2ardour-config.h', remove=False)
 
+    bak = conf.env['define_key']
+    conf.define('VERSIONSTRING', str (conf.env['VERSION']))
+    conf.define('CODENAME', enoify(int(conf.env['MAJOR']), int(conf.env['MINOR'])))
+    conf.env['define_key'] = ['VERSIONSTRING', 'CODENAME' ]
+    conf.write_config_header('gtk2ardour-version.h')
+    conf.env['define_key'] = bak;
+
     # Boost headers
     autowaf.check_header(conf, 'cxx', 'boost/shared_ptr.hpp')
     autowaf.check_header(conf, 'cxx', 'boost/weak_ptr.hpp')
     # Boost headers
     autowaf.check_header(conf, 'cxx', 'boost/shared_ptr.hpp')
     autowaf.check_header(conf, 'cxx', 'boost/weak_ptr.hpp')
@@ -303,7 +388,7 @@ def _doPyp(infileName, deps = False):
     inLines = fd.readlines()
     if fd != sys.stdin:
         fd.close()
     inLines = fd.readlines()
     if fd != sys.stdin:
         fd.close()
-        
+
 
     for line in inLines:
         bits = re_spaces.split(line)
 
     for line in inLines:
         bits = re_spaces.split(line)
@@ -353,18 +438,52 @@ def build_color_scheme(path, prefix):
 def build(bld):
 
     VERSION = "%s.%s" % (bld.env['MAJOR'], bld.env['MINOR'])
 def build(bld):
 
     VERSION = "%s.%s" % (bld.env['MAJOR'], bld.env['MINOR'])
+    I18N_PACKAGE = 'gtk2_ardour' + bld.env['MAJOR']
 
 
-    if bld.is_defined('WINDOWS_VST_SUPPORT'):
+    # Tool to dump lua-bindings (of gtk2ardour + libs)
+    if re.search ("linux", sys.platform) != None and bld.env['LUABINDINGDOC']:
+        obj = bld (features = 'cxx c cxxprogram')
+        obj.install_path = None
+        obj.source    = list(gtk2_ardour_sources)
+        obj.target    = 'luadoc'
+        obj.includes  = ['.', '../libs']
+        obj.ldflags   = ['-no-undefined']
+        obj.use       = [
+                'libpbd',
+                'libardour',
+                'libardour_cp',
+                'libtimecode',
+                'libmidipp',
+                'libgtkmm2ext',
+                'libcanvas',
+                'libptformat',
+                ]
+        obj.defines = [
+                'NOMAIN',
+                'PACKAGE="' + I18N_PACKAGE + '"',
+                'DATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"',
+                'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
+                'LOCALEDIR="' + os.path.normpath(bld.env['LOCALEDIR']) + '"',
+                ]
+        obj.linkflags = ''
+        obj.uselib    = 'UUID FLAC FONTCONFIG GLIBMM GTHREAD GTK OGG CURL DL GTKMM CANVAS FFTW3F LO TAGLIB XML '
+        obj.source += [ 'luadoc.cc', 'bundle_env_linux.cc' ]
+        if bld.is_defined('HAVE_SUIL'):
+            obj.source += [ 'lv2_plugin_ui.cc' ]
+            obj.use += [ 'SUIL' ]
+        if bld.is_defined('LXVST_SUPPORT'):
+            obj.source += [ 'vst_plugin_ui.cc' ]
+            obj.source += [ 'linux_vst_gui_support.cc', 'lxvst_plugin_ui.cc' ]
+            obj.defines += [ 'LXVST_SUPPORT' ]
+            obj.use += [ 'X11' ]
+
+
+    if bld.is_defined('WINDOWS_VST_SUPPORT') and bld.env['build_target'] != 'mingw':
+        # Windows VST support w/wine
         # If we require VST support we build a stub main() and the FST library
         # here using winegcc, and link it to the GTK front-end library
         obj = bld (features = 'cxx c cxxprogram wine')
         # If we require VST support we build a stub main() and the FST library
         # here using winegcc, and link it to the GTK front-end library
         obj = bld (features = 'cxx c cxxprogram wine')
-        obj.source = (
-            '../libs/fst/fst.c',
-            '../libs/fst/fstinfofile.c',
-            '../libs/fst/vsti.c',
-            '../libs/fst/vstwin.c',
-            '../vst/winmain.c',
-            )
+        obj.source = ( '../libs/fst/vstwin.c', '../vst/winmain.c' )
         #
         # XXX do we really need to explicitly link to all of these for the wine executable?
         #
         #
         # XXX do we really need to explicitly link to all of these for the wine executable?
         #
@@ -376,27 +495,41 @@ def build(bld):
                              'libmidipp',
                              'libgtk2_ardour',
                              'libgtkmm2ext',
                              'libmidipp',
                              'libgtk2_ardour',
                              'libgtkmm2ext',
-                             'libcanvas'
+                             'libcanvas',
+                             'libptformat',
                              ]
                              ]
-        obj.target = 'ardour-' + bld.env['VERSION'] + '-vst.exe.so'
+        obj.target = 'ardour-' + str (bld.env['VERSION']) + '-vst.exe.so'
         obj.includes  = [ '../libs/fst', '.' ]
         obj.linkflags = ['-mwindows', '-Wl,--export-dynamic']
         obj.includes  = [ '../libs/fst', '.' ]
         obj.linkflags = ['-mwindows', '-Wl,--export-dynamic']
+        obj.linkflags += bld.env['LDFLAGS']
         obj.defines = ['_POSIX_SOURCE', 'USE_WS_PREFIX']
         obj.defines = ['_POSIX_SOURCE', 'USE_WS_PREFIX']
-        obj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3')
+        obj.install_path = bld.env['DLLDIR']
         # end of the wine executable
 
         # now the shared library containing the GTK GUI for ardour
         obj = bld (features = 'cxx c cxxshlib')
         # end of the wine executable
 
         # now the shared library containing the GTK GUI for ardour
         obj = bld (features = 'cxx c cxxshlib')
-        obj.source    = gtk2_ardour_sources
+        # operate on copy to avoid adding sources twice
+        obj.source    = list(gtk2_ardour_sources)
         obj.includes  = [ '../libs/fst', '.' ]
         obj.name      = 'libgtk2_ardour'
         obj.target    = 'gtk2_ardour'
         obj.includes  = [ '../libs/fst', '.' ]
         obj.name      = 'libgtk2_ardour'
         obj.target    = 'gtk2_ardour'
+        obj.cflags  = [ '-fPIC' ]
+
     else:
         # just the normal executable version of the GTK GUI
     else:
         # just the normal executable version of the GTK GUI
-        obj = bld (features = 'cxx c cxxprogram')
-        obj.source    = gtk2_ardour_sources
-        obj.target = 'ardour-' + bld.env['VERSION']
+        if bld.env['build_target'] == 'mingw':
+            obj = bld (features = 'cxx c cxxprogram winres')
+        else:
+            obj = bld (features = 'cxx c cxxprogram')
+        # operate on copy to avoid adding sources twice
+        obj.source    = list(gtk2_ardour_sources)
+        obj.target = 'ardour-' + str (bld.env['VERSION'])
         obj.includes = ['.']
         obj.includes = ['.']
+        obj.ldflags = ['-no-undefined']
+
+        if bld.is_defined('WINDOWS_VST_SUPPORT'):
+        # Windows VST support mingw
+            obj.includes += [ '../libs/fst' ]
 
     # at this point, "obj" refers to either the normal native executable
     # OR the shared library built for use with wine on linux.
 
     # at this point, "obj" refers to either the normal native executable
     # OR the shared library built for use with wine on linux.
@@ -408,45 +541,52 @@ def build(bld):
                      'libmidipp',
                      'libgtkmm2ext',
                      'libcanvas',
                      'libmidipp',
                      'libgtkmm2ext',
                      'libcanvas',
+                     'libptformat',
                      ]
 
                      ]
 
-    # continue with setup of obj, which could be a shared library
-    # or an executable.
-
-    obj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3')
-    obj.uselib       = 'UUID FLAC FONTCONFIG GLIBMM GTHREAD GTK OGG CURL DL'
-    obj.uselib       += ' GTKMM GNOMECANVASMM GNOMECANVAS FFTW3F'
-    obj.uselib       += ' AUDIOUNITS OSX GTKOSX LO '
-
-    if bld.is_defined('USE_EXTERNAL_LIBS'):
-        obj.uselib += ' TAGLIB'
-    else:
-        obj.use += ('libtaglib')
-    if sys.platform == 'darwin':
-        obj.uselib += ' AUDIOUNITS OSX GTKOSX'
-        obj.use    += ' libappleutility'
-    obj.defines     = [
+    obj.defines = [
         'PACKAGE="' + I18N_PACKAGE + '"',
         'PACKAGE="' + I18N_PACKAGE + '"',
-        'VERSIONSTRING="' + bld.env['VERSION'] + '"',
         'DATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"',
         'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
         'DATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"',
         'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
-        'LOCALEDIR="' + os.path.join(os.path.normpath(bld.env['DATADIR']), 'locale') + '"',
-        'PROGRAM_NAME="' + bld.env['PROGRAM_NAME'] + '"'
+        'LOCALEDIR="' + os.path.normpath(bld.env['LOCALEDIR']) + '"',
         ]
         ]
+    obj.install_path = bld.env['DLLDIR']
+    obj.linkflags    = ''
+    obj.uselib       = 'UUID FLAC FONTCONFIG GLIBMM GTHREAD GTK OGG CURL DL GTKMM CANVAS FFTW3F LO TAGLIB XML '
+
+    if sys.platform == 'darwin':
+        obj.uselib += ' AUDIOUNITS OSX '
+        obj.use    += ' libappleutility'
+        obj.source += [ 'cocoacarbon.mm', 'bundle_env_cocoa.cc' ]
+    elif bld.env['build_target'] == 'mingw':
+        obj.source += [ 'bundle_env_mingw.cc' ]
+        obj.source += [ 'windows_icon.rc' ]
+    else:
+        obj.source += [ 'bundle_env_linux.cc' ]
+
     obj.includes += ['../libs']
 
     obj.includes += ['../libs']
 
+    obj.use += 'libptformat'
+
+    if bld.env['build_target'] == 'mingw':
+        obj.linkflags += ' -mwindows'
+
     if bld.is_defined('HAVE_SUIL'):
         obj.source += [ 'lv2_plugin_ui.cc' ]
         obj.use += [ 'SUIL' ]
 
     if bld.is_defined('HAVE_SUIL'):
         obj.source += [ 'lv2_plugin_ui.cc' ]
         obj.use += [ 'SUIL' ]
 
+    if bld.is_defined('HAVE_FFTW35F') and bld.env['build_target'] != 'mingw':
+        bld.env['LIB_FFTW3F'] += ['fftw3f_threads']
+
     if bld.is_defined('NEED_INTL'):
     if bld.is_defined('NEED_INTL'):
-        obj.linkflags = ' -lintl'
+        obj.linkflags += ' -lintl'
 
     if bld.is_defined('WINDOWS_VST_SUPPORT'):
         obj.source += [ 'windows_vst_plugin_ui.cc' ]
         obj.defines += [ 'WINDOWS_VST_SUPPORT' ]
 
     if bld.is_defined('WINDOWS_VST_SUPPORT'):
         obj.source += [ 'windows_vst_plugin_ui.cc' ]
         obj.defines += [ 'WINDOWS_VST_SUPPORT' ]
-        obj.use += [ 'X11' ]
-        
+        if bld.env['build_target'] != 'mingw':
+            obj.use += [ 'X11' ]
+
     if bld.is_defined('LXVST_SUPPORT'):
         obj.source += [ 'linux_vst_gui_support.cc', 'lxvst_plugin_ui.cc' ]
         obj.defines += [ 'LXVST_SUPPORT' ]
     if bld.is_defined('LXVST_SUPPORT'):
         obj.source += [ 'linux_vst_gui_support.cc', 'lxvst_plugin_ui.cc' ]
         obj.defines += [ 'LXVST_SUPPORT' ]
@@ -454,13 +594,12 @@ def build(bld):
 
     if bld.is_defined('WINDOWS_VST_SUPPORT') or bld.is_defined('LXVST_SUPPORT'):
         obj.source += [ 'vst_plugin_ui.cc' ]
 
     if bld.is_defined('WINDOWS_VST_SUPPORT') or bld.is_defined('LXVST_SUPPORT'):
         obj.source += [ 'vst_plugin_ui.cc' ]
-        
+
     if bld.is_defined('PHONE_HOME'):
         obj.defines += [ 'PHONE_HOME' ]
 
     if bld.is_defined('HAVE_COREAUDIO'):
         TaskGen.task_gen.mappings['.mm'] = TaskGen.task_gen.mappings['.cc']
     if bld.is_defined('PHONE_HOME'):
         obj.defines += [ 'PHONE_HOME' ]
 
     if bld.is_defined('HAVE_COREAUDIO'):
         TaskGen.task_gen.mappings['.mm'] = TaskGen.task_gen.mappings['.cc']
-        obj.source += [ 'cocoacarbon.mm' ]
         obj.use += ' libappleutility '
 
     if bld.is_defined('AUDIOUNIT_SUPPORT'):
         obj.use += ' libappleutility '
 
     if bld.is_defined('AUDIOUNIT_SUPPORT'):
@@ -470,19 +609,19 @@ def build(bld):
 
     wrapper_subst_dict = {
             'INSTALL_PREFIX' : bld.env['PREFIX'],
 
     wrapper_subst_dict = {
             'INSTALL_PREFIX' : bld.env['PREFIX'],
-            'LIBDIR'         : os.path.normpath(bld.env['LIBDIR']),
+            'LIBDIR'         : os.path.normpath(bld.env['DLLDIR']),
             'DATADIR'        : os.path.normpath(bld.env['DATADIR']),
             'DATADIR'        : os.path.normpath(bld.env['DATADIR']),
-            'SYSCONFDIR'     : os.path.normpath(bld.env['SYSCONFDIR']),
+            'CONFDIR'        : os.path.normpath(bld.env['CONFDIR']),
             'LIBS'           : 'build/libs',
             'LIBS'           : 'build/libs',
-            'VERSION'        : bld.env['VERSION'],
-            'EXECUTABLE'     : 'build/gtk2_ardour/ardour-' + bld.env['VERSION']
+            'VERSION'        : str (bld.env['VERSION']),
+            'EXECUTABLE'     : 'build/gtk2_ardour/ardour-' + str (bld.env['VERSION'])
     }
 
     def set_subst_dict(obj, dict):
         for i in dict:
             setattr(obj, i, dict[i])
 
     }
 
     def set_subst_dict(obj, dict):
         for i in dict:
             setattr(obj, i, dict[i])
 
-    obj              = bld(features = 'subst', rule= 'chmod 0755 ${TGT}')
+    obj              = bld(features = 'subst')
     obj.source       = 'ardev_common.sh.in'
     obj.target       = 'ardev_common_waf.sh'
     obj.chmod        = Utils.O755
     obj.source       = 'ardev_common.sh.in'
     obj.target       = 'ardev_common_waf.sh'
     obj.chmod        = Utils.O755
@@ -491,7 +630,7 @@ def build(bld):
 
     obj              = bld(features = 'subst')
     obj.source       = 'ardour.sh.in'
 
     obj              = bld(features = 'subst')
     obj.source       = 'ardour.sh.in'
-    obj.target       = 'ardour3'
+    obj.target       = 'ardour' + str (bld.env['MAJOR'])
     obj.chmod        = Utils.O755
     obj.dict         = wrapper_subst_dict
     obj.install_path = bld.env['BINDIR']
     obj.chmod        = Utils.O755
     obj.dict         = wrapper_subst_dict
     obj.install_path = bld.env['BINDIR']
@@ -500,7 +639,7 @@ def build(bld):
     if bld.is_defined('WINDOWS_VST_SUPPORT'):
         obj              = bld(features = 'subst')
         obj.source       = '../vst/ardourvst.in'
     if bld.is_defined('WINDOWS_VST_SUPPORT'):
         obj              = bld(features = 'subst')
         obj.source       = '../vst/ardourvst.in'
-        obj.target       = 'ardourvst3'
+        obj.target       = 'ardourvst' + str (bld.env['MAJOR'])
         obj.chmod        = Utils.O755
         obj.dict         = wrapper_subst_dict
         obj.install_path = bld.env['BINDIR']
         obj.chmod        = Utils.O755
         obj.dict         = wrapper_subst_dict
         obj.install_path = bld.env['BINDIR']
@@ -508,13 +647,12 @@ def build(bld):
 
     # Font configuration
 
 
     # Font configuration
 
-    dark_rc_subst_dict = {}
-    light_rc_subst_dict = {}
+    font_subst_dict = {}
     font_sizes      = {}
     base_font       = ""
 
     # Set up font sizes
     font_sizes      = {}
     base_font       = ""
 
     # Set up font sizes
-    if bld.is_defined('GTKOSX'): # OS X fonts
+    if sys.platform == 'darwin':
         basefont = ""
         font_sizes = {
                 'SMALLER' : '9',
         basefont = ""
         font_sizes = {
                 'SMALLER' : '9',
@@ -527,9 +665,9 @@ def build(bld):
                 'HUGER' : '36',
                 'MASSIVE' : '60',
         }
                 'HUGER' : '36',
                 'MASSIVE' : '60',
         }
-        
+
         # There is no acceptable monospace font available on older versions of OS X
         # There is no acceptable monospace font available on older versions of OS X
-        # and no API on those versions to load TTF files that will work with 
+        # and no API on those versions to load TTF files that will work with
         # GTK/fontconfig/pango.
         #
         # In addition, the ArdourMono font gets clipped for some reason on OS X
         # GTK/fontconfig/pango.
         #
         # In addition, the ArdourMono font gets clipped for some reason on OS X
@@ -538,23 +676,25 @@ def build(bld):
         # so just use it.
         #
         font_names = {
         # so just use it.
         #
         font_names = {
-            'MONOSPACE' : 'Lucida Grande',
+            'MONOSPACE' : 'Monaco',
+            'CLOCKFONT' : 'Lucida Grande',
         }
     else: # Linux/X11 fonts
         basefont = '' # unspecified - use system defaults
         font_sizes = {
         }
     else: # Linux/X11 fonts
         basefont = '' # unspecified - use system defaults
         font_sizes = {
-                'SMALLER' : '8',
-                'SMALL' : '9',
-                'NORMAL' : '10',
-                'BIG' : '14',
-                'BIGGER' : '17',
-                'LARGE' : '18',
-                'LARGER' : '24',
-                'HUGER' : '34',
-                'MASSIVE' : '60',
+                'SMALLER' : '6',
+                'SMALL' : '7',
+                'NORMAL' : '8',
+                'BIG' : '11',
+                'BIGGER' : '13.5',
+                'LARGE' : '14.5',
+                'LARGER' : '19',
+                'HUGER' : '27',
+                'MASSIVE' : '48',
         }
         font_names = {
                 'MONOSPACE' : 'ArdourMono',
         }
         font_names = {
                 'MONOSPACE' : 'ArdourMono',
+                'CLOCKFONT' : 'ArdourMono',
         }
 
     # Set up font substitution dictionary
         }
 
     # Set up font substitution dictionary
@@ -568,154 +708,188 @@ def build(bld):
                 key = "_".join (['FONT',sizename])
                 fontstyle = " ".join ([basefont,points])
 
                 key = "_".join (['FONT',sizename])
                 fontstyle = " ".join ([basefont,points])
 
-            dark_rc_subst_dict[key] = fontstyle
-            light_rc_subst_dict[key] = fontstyle
+            font_subst_dict[key] = fontstyle
 
     # @FONT_SIZE_XXXX@
     for sizename,points in iter(font_sizes.items()):
             key = "_".join (['FONT_SIZE',sizename])
 
     # @FONT_SIZE_XXXX@
     for sizename,points in iter(font_sizes.items()):
             key = "_".join (['FONT_SIZE',sizename])
-            dark_rc_subst_dict[key] = points
-            light_rc_subst_dict[key] = points
+            font_subst_dict[key] = points
 
     # various font names, eg @BOLD_MONOSPACE@
     for font_sym,text in iter(font_names.items()):
         key = font_sym
 
     # various font names, eg @BOLD_MONOSPACE@
     for font_sym,text in iter(font_names.items()):
         key = font_sym
-        dark_rc_subst_dict[key] = text
-        light_rc_subst_dict[key] = text
-
-    # RC files
-    dark_rc_subst_dict['COLOR_SCHEME'] = build_color_scheme(
-        'gtk2_ardour/ardour3_ui_dark.rc.in', 'ARDOUR_DARK')
-    dark_rc_subst_dict['COLPREFIX'] = 'ARDOUR_DARK'
-    light_rc_subst_dict['COLOR_SCHEME'] = build_color_scheme(
-        'gtk2_ardour/ardour3_ui_light.rc.in', 'ARDOUR_LIGHT')
-    light_rc_subst_dict['COLPREFIX'] = 'ARDOUR_LIGHT'
-
-    obj              = bld(features = 'subst')
-    obj.source       = [ 'ardour3_ui_dark.rc.in' ]
-    obj.target       = 'ardour3_ui_dark.rc.pre'
-    obj.install_path = None
-    set_subst_dict(obj, dark_rc_subst_dict)
-
-    obj              = bld(features = 'subst')
-    obj.source       = [ 'ardour3_ui_light.rc.in' ]
-    obj.target       = 'ardour3_ui_light.rc.pre'
-    obj.install_path = None
-    set_subst_dict(obj, light_rc_subst_dict)
-
-    obj              = bld(features = 'subst')
-    obj.source       = [ 'ardour3_styles.rc.in' ]
-    obj.target       = 'ardour3_dark_styles.rc'
-    obj.install_path = None
-    set_subst_dict(obj, dark_rc_subst_dict)
+        font_subst_dict[key] = text
 
 
-    obj              = bld(features = 'subst')
-    obj.source       = [ 'ardour3_styles.rc.in' ]
-    obj.target       = 'ardour3_light_styles.rc'
-    obj.install_path = None
-    set_subst_dict(obj, light_rc_subst_dict)
+    # RC file
 
     obj              = bld(features = 'subst')
 
     obj              = bld(features = 'subst')
-    obj.source       = [ 'ardour3_fonts.rc.in' ]
-    obj.target       = 'ardour3_dark_fonts.rc'
-    obj.install_path = None
-    set_subst_dict(obj, dark_rc_subst_dict)
+    obj.source       = [ 'clearlooks.rc.in' ]
+    obj.target       = 'clearlooks.rc'
+    obj.install_path = bld.env['CONFDIR']
+    set_subst_dict(obj, font_subst_dict)
 
     obj              = bld(features = 'subst')
 
     obj              = bld(features = 'subst')
-    obj.source       = [ 'ardour3_fonts.rc.in' ]
-    obj.target       = 'ardour3_light_fonts.rc'
-    obj.install_path = None
-    set_subst_dict(obj, light_rc_subst_dict)
-
-    obj              = bld(rule = 'cp ${SRC} ${TGT}')
-    obj.source       = [ 'ardour3_widget_list.rc' ]
-    obj.target       = 'ardour3_widgets.rc'
-    obj.install_path = None
-
-    obj = bld (rule = include_processor)
-    obj.source = [ 'ardour3_ui_dark.rc.pre' ]
-    # find and add all ##include dependencies as sources
-    obj.source += _doPyp (bld.path.find_resource ('ardour3_ui_dark.rc.in').srcpath(), True)
-    obj.target = 'ardour3_ui_dark.rc'
-    obj.install_path = '${SYSCONFDIR}/ardour3'
-
-    obj = bld (rule = include_processor)
-    obj.source = [ 'ardour3_ui_light.rc.pre' ]
-    # find and add all ##include dependencies as sources
-    obj.source += _doPyp (bld.path.find_resource ('ardour3_ui_light.rc.in').srcpath(), True)
-    obj.target = 'ardour3_ui_light.rc'
-    obj.install_path = '${SYSCONFDIR}/ardour3'
+    obj.source       = [ 'default_ui_config.in' ]
+    obj.target       = 'default_ui_config'
+    obj.install_path = bld.env['CONFDIR']
+    set_subst_dict(obj, font_subst_dict)
 
     # Menus
     menus_argv = []
 
     # Menus
     menus_argv = []
-    if bld.is_defined('GTKOSX'):
-        menus_argv = [ '-E', '-P', '-DGTKOSX' ]
+    if sys.platform == 'darwin':
+        menus_argv = [ '-E', '-P', '-D__APPLE__', '-' ]
     else:
         menus_argv = [ '-E', '-P' ]
 
     else:
         menus_argv = [ '-E', '-P' ]
 
-    obj = bld(features = 'command-output')
-    obj.command = 'cpp'
-    obj.command_is_external = True
-    obj.no_inputs = True
-    obj.argv = menus_argv
-    obj.stdin = 'ardour.menus.in'
-    obj.stdout = 'ardour.menus'
-    obj.dep_vars = ['GTKOSX']
-    bld.install_files(os.path.join(bld.env['SYSCONFDIR'], 'ardour3'),
-                      'ardour.menus')
+    if bld.is_defined('PTFORMAT'):
+        menus_argv += [ '-DPTFORMAT' ]
+
+    # always build all versions of the menu definitions
+    # so that we can try them out with different program builds.
+    for program in [ 'ardour', 'trx' ]:
+        obj = bld(features = 'command-output')
+        obj.command = 'cpp'
+        obj.command_is_external = True
+        obj.no_inputs = True
+        obj.argv = menus_argv
+        obj.dep_vars = ['PTFORMAT', 'GTKOSX', 'WINDOWS']
+        obj.stdin = program + '.menus.in'
+        obj.stdout = program + '.menus'
+        bld.install_files (bld.env['CONFDIR'], program + '.menus')
+
+    # Freedesktop
+    freedesktop_subst_dict = {
+                    'ARDOUR_EXEC' : str (bld.env['lwrcase_dirname']),
+                    'ARDOUR_ICON' : str (bld.env['lwrcase_dirname']),
+                    'VERSION': str (bld.env['VERSION']),
+    }
 
 
-    # Keybindings
+    if bld.env['FREEDESKTOP']:
+        obj              = bld(features = 'subst')
+        obj.source       = 'ardour.desktop.in'
+        obj.target       = str (bld.env['lwrcase_dirname']) + '.desktop'
+        obj.chmod        = Utils.O644
+        obj.dict         = freedesktop_subst_dict
+        set_subst_dict(obj, freedesktop_subst_dict)
 
 
-    # 'SAE-de-keypad', 'SAE-de-nokeypad', 'SAE-us-keypad',
-    # 'SAE-us-nokeypad', 'ergonomic-us'
+        obj              = bld(features = 'subst')
+        obj.source       = 'ardour-mime-info.xml'
+        obj.target       = 'ardour.xml'
+        obj.chmod        = Utils.O644
+
+        # build appdata with translations
+        appdata_i18n_mo(bld)
+        appdata_i18n_xmlin(bld)
+        obj              = bld(features = 'subst')
+        obj.source       = 'ardour.appdata.xml.in'
+        obj.target       = str (bld.env['lwrcase_dirname']) + '.appdata.xml'
+        obj.chmod        = Utils.O644
+        obj.dict         = freedesktop_subst_dict
+        set_subst_dict(obj, freedesktop_subst_dict)
+
+    # Keybindings
 
 
-    for b in [ 'mnemonic-us' ] :
+    # NATIVE ARDOUR BINDING FILES
+    # explicitly state the use of perl here so that it works on windows too
+    # 
+    a_rule = 'perl ../tools/fmt-bindings --platform="%s" --winkey="%s" --accelmap ${SRC[0].abspath()} >${TGT}' % (sys.platform, bld.env['WINDOWS_KEY'] )
+    for b in [ 'ardour' ] :
         obj = bld(
         obj = bld(
-            target = b + '.bindings',
-            source = b + '.bindings.in',
-            rule = '../tools/fmt-bindings --platform="%s" --winkey="%s" --accelmap <${SRC} >${TGT}' % (sys.platform, bld.env['WINDOWS_KEY'] )
+            target = b + '.keys',
+            source = [ b + '.keys.in', 'mixer.bindings', 'processor_box.bindings', 'step_editing.bindings', 'monitor.bindings' ],
+            rule = a_rule
             )
             )
-        obj.install_path = os.path.join(bld.env['SYSCONFDIR'], 'ardour3')
+        obj.install_path = bld.env['CONFDIR']
+        
+    # Icons/Images
+    bld.install_files(os.path.join (bld.env['DATADIR'], 'icons'), bld.path.ant_glob('icons/*.png'))
+    bld.install_files(bld.env['DATADIR'], 'ArdourMono.ttf')
 
 
-    # not modified at present
-    bld.install_files(os.path.join(bld.env['SYSCONFDIR'], 'ardour3'),
-                      'step_editing.bindings')
-    bld.install_files(os.path.join(bld.env['SYSCONFDIR'], 'ardour3'),
-                      'mixer.bindings')
+    # Application/Product specific resources (icon, splash)
+    pgmname = Options.options.program_name;
+    bld.install_files(os.path.join(bld.env['DATADIR'], 'resources'), bld.path.ant_glob('resources/' + pgmname + '*'))
 
 
-    # Icons/Images
-    bld.install_files('${DATADIR}/ardour3/icons', bld.path.ant_glob('icons/*.png'))
-    bld.install_files('${DATADIR}/ardour3/pixmaps', bld.path.ant_glob('pixmaps/*.xpm'))
-    bld.install_files('${DATADIR}/ardour3', 'splash.png')
-    bld.install_files('${DATADIR}/ardour3', 'ArdourMono.ttf')
+    if bld.env['build_target'] == 'mingw':
+        # These icons need to overwrite the files already installed in the icons
+        # directory above. Do this in the external packaging scripts for now.
+        #bld.install_files(os.path.join (bld.env['DATADIR'], 'icons'), bld.path.ant_glob('icons/cursor_square/*.png'))
+        bld.install_files(os.path.join (bld.env['DATADIR'], 'icons'), 'icons/cursor_square/hotspots')
 
     # Default UI configuration
 
     # Default UI configuration
-    bld.install_files('${SYSCONFDIR}/ardour3', 'ardour3_ui_default.conf')
+    bld.install_files(bld.env['CONFDIR'], 'default_ui_config')
+    # Color Themes. Find each color file for this program only
+    # and install
+    bld.install_files (os.path.join(bld.env['DATADIR'], 'themes'), bld.path.ant_glob ('themes/*-' + Options.options.program_name.lower() + '.colors'));
 
     # Default export stuff
 
     # Default export stuff
-    bld.install_files('${SYSCONFDIR}/ardour3/export', bld.path.ant_glob('export/*.format'))
+    bld.install_files(os.path.join(bld.env['CONFDIR'], 'export'), bld.path.ant_glob('export/*.format'))
 
     # i18n
     if bld.is_defined('ENABLE_NLS'):
         mo_files = bld.path.ant_glob('po/*.mo')
         for mo in mo_files:
             lang = os.path.basename(mo.srcpath()).replace('.mo', '')
 
     # i18n
     if bld.is_defined('ENABLE_NLS'):
         mo_files = bld.path.ant_glob('po/*.mo')
         for mo in mo_files:
             lang = os.path.basename(mo.srcpath()).replace('.mo', '')
-            bld.install_as(os.path.join(bld.env['PREFIX'], 'share', 'locale',
-                                        lang, 'LC_MESSAGES', I18N_PACKAGE + '.mo'),
-                           mo)
+            bld.install_as (os.path.join(os.path.normpath(bld.env['LOCALEDIR']), lang, 'LC_MESSAGES', I18N_PACKAGE + '.mo'),
+                            mo)
 
 def i18n(bld):
 
 def i18n(bld):
-    autowaf.build_i18n(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,
-                       'Paul Davis')
+        I18N_PACKAGE = 'gtk2_ardour' + bld.env['MAJOR']
+        autowaf.build_i18n(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,
+                           'Paul Davis')
+        appdata_i18n_pot(bld)
+        appdata_i18n_po(bld)
 
 def i18n_pot(bld):
 
 def i18n_pot(bld):
-    autowaf.build_i18n_pot(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,
-                       'Paul Davis')
+        I18N_PACKAGE = 'gtk2_ardour' + bld.env['MAJOR']
+        autowaf.build_i18n_pot(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,
+                               'Paul Davis')
+        appdata_i18n_pot(bld)
 
 def i18n_po(bld):
 
 def i18n_po(bld):
-    autowaf.build_i18n_po(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,
-                       'Paul Davis')
+        I18N_PACKAGE = 'gtk2_ardour' + bld.env['MAJOR']
+        autowaf.build_i18n_po(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,
+                              'Paul Davis')
+        appdata_i18n_po(bld)
 
 def i18n_mo(bld):
 
 def i18n_mo(bld):
-    autowaf.build_i18n_mo(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,
-                       'Paul Davis')
+        I18N_PACKAGE = 'gtk2_ardour' + bld.env['MAJOR']
+        autowaf.build_i18n_mo(bld, top, 'gtk2_ardour', I18N_PACKAGE, gtk2_ardour_sources,
+                              'Paul Davis')
+
+def appdata_i18n_pot(bld):
+    potfile = os.path.join(bld.top_dir, 'gtk2_ardour', 'appdata',
+            'ardour.appdata.pot')
+    if bld.cmd == 'i18n_pot':
+        Logs.info('Generating pot file from Ardour appdata')
+        itsfile = os.path.join(bld.top_dir, 'tools', 'as-metainfo.its')
+        adsource = os.path.join(bld.top_dir, 'gtk2_ardour',
+                'ardour.appdata.xml.in.in')
+        Logs.info('Updating ' + potfile)
+        subprocess.call(('itstool', '-i', itsfile, '-o', potfile, adsource))
+    elif bld.cmd == 'clean' and os.path.exists(potfile):
+        Logs.info('Removing Ardour appdata pot file')
+        os.remove(potfile)
+
+def appdata_i18n_po(bld):
+    autowaf.build_i18n_po(bld, bld.top_dir, os.path.join(
+        'gtk2_ardour', 'appdata'), 'ardour.appdata', 'dummy', 'dummy')
+
+def appdata_i18n_mo(bld):
+    autowaf.build_i18n_mo(bld, bld.top_dir, os.path.join(
+        'gtk2_ardour', 'appdata'), 'ardour.appdata', 'dummy', 'dummy')
+
+def appdata_i18n_xmlin(bld):
+    adxmlinfile = os.path.join(bld.top_dir, 'gtk2_ardour',
+            'ardour.appdata.xml.in')
+    if bld.cmd == 'build':
+        itsfile = os.path.join(bld.top_dir, 'tools', 'as-metainfo.its')
+        adxmlininfile = os.path.join(bld.top_dir, 'gtk2_ardour',
+                'ardour.appdata.xml.in.in')
+        mo_glob = os.path.join(bld.top_dir, 'gtk2_ardour', 'appdata', 'po', '*.mo')
+        mo_files = glob.glob(mo_glob)
+        Logs.info('Generating ' + adxmlinfile)
+        subprocess.call(['itstool', '-i', itsfile, '-o', adxmlinfile,
+            '-j', adxmlininfile] + mo_files)
+    elif bld.cmd == 'clean' and os.path.exists(adxmlinfile):
+        Logs.info('Removing ' + adxmlinfile)
+        os.remove(adxmlinfile)