#!/usr/bin/env python from waflib.extras import autowaf as autowaf from waflib import Options, TaskGen import waflib.Logs as Logs, waflib.Utils as Utils import os import sys import re import time from waflib.Task import Task # Version of this package (even if built as a child) MAJOR = '3' MINOR = '0' MICRO = '0' GTK2_ARDOUR_VERSION = "%s.%s.%s" % (MAJOR, MINOR, MICRO) # Variables for 'waf dist' APPNAME = 'gtk2_ardour' VERSION = GTK2_ARDOUR_VERSION # Mandatory variables top = '.' out = 'build' path_prefix = 'gtk2_ardour/' gtk2_ardour_sources = [ 'about.cc', 'actions.cc', 'add_midi_cc_track_dialog.cc', 'add_route_dialog.cc', 'ambiguous_file_dialog.cc', 'analysis_window.cc', 'ardour_button.cc', 'ardour_dialog.cc', 'ardour_ui.cc', 'ardour_ui2.cc', 'ardour_ui_dependents.cc', 'ardour_ui_dialogs.cc', 'ardour_ui_ed.cc', 'ardour_ui_mixer.cc', 'ardour_ui_options.cc', 'audio_clock.cc', 'audio_region_editor.cc', 'audio_region_view.cc', 'audio_streamview.cc', 'audio_time_axis.cc', 'automation_controller.cc', 'automation_line.cc', 'automation_region_view.cc', 'automation_streamview.cc', 'automation_time_axis.cc', 'axis_view.cc', 'bundle_manager.cc', 'cairo_widget.cc', 'canvas-flag.cc', 'canvas-hit.cc', 'canvas-note-event.cc', 'canvas-note.cc', 'canvas_patch_change.cc', 'canvas-simpleline.c', 'canvas-simplerect.c', 'canvas-sysex.cc', 'canvas-waveview.c', 'clock_group.cc', 'configinfo.cc', 'control_point.cc', 'control_point_dialog.cc', 'crossfade_edit.cc', 'crossfade_view.cc', 'curvetest.cc', 'debug.cc', 'diamond.cc', 'edit_note_dialog.cc', 'editing.cc', 'editor.cc', 'editor_actions.cc', 'editor_audio_import.cc', 'editor_audiotrack.cc', 'editor_canvas.cc', 'editor_canvas_events.cc', 'editor_component.cc', 'editor_cursors.cc', 'editor_drag.cc', 'editor_route_groups.cc', 'editor_export_audio.cc', 'editor_group_tabs.cc', 'editor_keys.cc', 'editor_locations.cc', 'editor_markers.cc', 'editor_mixer.cc', 'editor_mouse.cc', 'editor_nudge.cc', 'editor_ops.cc', 'editor_regions.cc', 'editor_routes.cc', 'editor_rulers.cc', 'editor_scrub.cc', 'editor_selection.cc', 'editor_snapshots.cc', 'editor_summary.cc', 'editor_tempodisplay.cc', 'editor_timefx.cc', 'engine_dialog.cc', 'enums.cc', 'export_channel_selector.cc', 'export_dialog.cc', 'export_file_notebook.cc', 'export_filename_selector.cc', 'export_format_dialog.cc', 'export_format_selector.cc', 'export_preset_selector.cc', 'export_timespan_selector.cc', 'fft.cc', 'fft_graph.cc', 'fft_result.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', 'insert_time_dialog.cc', 'interthread_progress_window.cc', 'io_selector.cc', 'keyboard.cc', 'keyeditor.cc', 'latency_gui.cc', 'led.cc', 'level_meter.cc', 'lineset.cc', 'location_ui.cc', 'main.cc', 'marker.cc', 'midi_automation_line.cc', 'midi_channel_dialog.cc', 'midi_channel_selector.cc', 'midi_cut_buffer.cc', 'midi_list_editor.cc', 'midi_port_dialog.cc', 'midi_region_view.cc', 'midi_scroomer.cc', 'midi_streamview.cc', 'midi_time_axis.cc', 'midi_tracer.cc', 'missing_file_dialog.cc', 'missing_plugin_dialog.cc', 'mixer_actor.cc', 'mixer_group_tabs.cc', 'mixer_strip.cc', 'mixer_ui.cc', 'monitor_section.cc', 'mono_panner.cc', 'mouse_cursors.cc', 'nag.cc', 'new_plugin_preset_dialog.cc', 'normalize_dialog.cc', 'note_player.cc', 'option_editor.cc', 'opts.cc', 'panner2d.cc', 'panner_ui.cc', 'piano_roll_header.cc', 'playlist_selector.cc', 'plugin_eq_gui.cc', 'plugin_selector.cc', 'plugin_ui.cc', 'port_group.cc', 'port_insert_ui.cc', 'port_matrix.cc', 'port_matrix_body.cc', 'port_matrix_column_labels.cc', 'port_matrix_component.cc', 'port_matrix_grid.cc', 'port_matrix_labels.cc', 'port_matrix_row_labels.cc', 'processor_box.cc', 'patch_change_dialog.cc', 'progress_reporter.cc', 'prompter.cc', 'public_editor.cc', 'quantize_dialog.cc', 'rc_option_editor.cc', 'region_editor.cc', 'region_gain_line.cc', 'region_layering_order_editor.cc', 'region_selection.cc', 'region_view.cc', 'return_ui.cc', 'rhythm_ferret.cc', 'route_group_dialog.cc', 'route_group_menu.cc', 'route_params_ui.cc', 'route_processor_selection.cc', 'route_time_axis.cc', 'route_ui.cc', 'search_path_option.cc', 'selection.cc', 'send_ui.cc', 'session_import_dialog.cc', 'session_metadata_dialog.cc', 'session_option_editor.cc', 'sfdb_ui.cc', 'shuttle_control.cc', 'simpleline.cc', 'simplerect.cc', 'splash.cc', 'speaker_dialog.cc', 'startup.cc', 'step_editor.cc', 'step_entry.cc', 'stereo_panner.cc', 'streamview.cc', 'strip_silence_dialog.cc', 'tape_region_view.cc', 'tempo_dialog.cc', 'tempo_lines.cc', 'theme_manager.cc', 'time_axis_view.cc', 'time_axis_view_item.cc', 'time_fx_dialog.cc', 'time_info_box.cc', 'time_selection.cc', 'track_selection.cc', 'track_view_list.cc', 'transpose_dialog.cc', 'ui_config.cc', 'utils.cc', 'verbose_cursor.cc', 'version.cc', 'visibility_group.cc', 'volume_controller.cc', 'waveview.cc', 'window_proxy.cc' ] def options(opt): autowaf.set_options(opt) def configure(conf): conf.load('misc') conf.load('compiler_cxx') autowaf.build_version_files( path_prefix + 'version.h', path_prefix + 'version.cc', 'gtk2_ardour', MAJOR, MINOR, MICRO) 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, 'flac', uselib_store='FLAC', atleast_version='1.2.1') autowaf.check_pkg(conf, 'gthread-2.0', uselib_store='GTHREAD', atleast_version='2.10.1') autowaf.check_pkg(conf, 'gtk+-2.0', uselib_store='GTK', atleast_version='2.18') autowaf.check_pkg(conf, 'gtkmm-2.4', uselib_store='GTKMM', atleast_version='2.18') autowaf.check_pkg(conf, 'libgnomecanvas-2.0', uselib_store='GNOMECANVAS', atleast_version='2.30') autowaf.check_pkg(conf, 'libgnomecanvasmm-2.6', uselib_store='GNOMECANVASMM', atleast_version='2.16') autowaf.check_pkg(conf, 'ogg', uselib_store='OGG', atleast_version='1.1.2') conf.write_config_header('gtk2ardour-config.h', remove=False) # Boost headers autowaf.check_header(conf, 'cxx', 'boost/shared_ptr.hpp') autowaf.check_header(conf, 'cxx', 'boost/weak_ptr.hpp') # Add a waf `feature' to allow compilation of things using winegcc from waflib.TaskGen import feature @feature("wine") def set_winegcc(self): self.env.LINK_CXX = self.env.LINK_CC = 'wineg++' self.env.CC = 'winegcc' def _doPyp(infileName, deps = False): outStr = '' out = [] re_spaces = re.compile("\s+") if infileName == '-': fd = sys.stdin else: fd = open(infileName) inLines = fd.readlines() if fd != sys.stdin: fd.close() for line in inLines: bits = re_spaces.split(line) if bits[0] == '##include': incName = bits[1] if (deps): out += [ incName ] else: # assume included file comes from same place as source file incName = os.path.join (os.path.dirname (infileName), incName); outStr += _doPyp(incName) else: if not deps: outStr += line # done if deps: return out else: return outStr def include_processor(task): infileName = task.inputs[0].srcpath() outfileName = os.path.join(out, task.outputs[0].bldpath()) fdOut = open (outfileName, "w") fdOut.write (_doPyp(infileName)) fdOut.close () def build_color_scheme(path, prefix): f = open (path, 'r') color_scheme = '' for line in f: if re.search ('^#@color', line): line.strip() # remove newline words = line.split() if len(color_scheme): color_scheme += ';' color_scheme += prefix color_scheme += '_' color_scheme += words[1] color_scheme += ':' color_scheme += words[2] f.close() return color_scheme def build(bld): # GTK front-end; if we're using VST we build this as a shared library, # otherwise it's a normal executabale if bld.is_defined('VST_SUPPORT'): obj = bld(features = 'cxx c cxxshlib') else: obj = bld(features = 'cxx c cxxprogram') obj.includes = ['.'] obj.source = gtk2_ardour_sources obj.name = 'gtk2_ardour' obj.linkflags = [] if bld.is_defined('VST_SUPPORT'): obj.target = 'gtk2_ardour' obj.includes += ['../libs/fst'] else: obj.target = 'ardour-3.0' obj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3') obj.uselib = 'UUID FLAC GLIBMM GTHREAD GTK OGG ALSA CURL DL' obj.uselib += ' GTKMM GNOMECANVASMM GNOMECANVAS ' obj.uselib += ' AUDIOUNITS OSX GTKOSX ' obj.use = [ 'libpbd', 'libmidipp', 'libtaglib', 'libardour', 'libardour_cp', 'libgtkmm2ext', 'libtaglib' ] if sys.platform == 'darwin': obj.use += ' libappleutility' obj.defines = [ 'PACKAGE="gtk2_ardour"', 'VERSIONSTRING="' + bld.env['VERSION'] + '"', 'DATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"', 'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"', 'MODULE_DIR="' + os.path.normpath(bld.env['LIBDIR']) + '"', 'LOCALEDIR="' + os.path.join(os.path.normpath(bld.env['DATADIR']), 'locale') + '"', 'PROGRAM_NAME="' + bld.env['PROGRAM_NAME'] + '"' ] obj.includes += ['../libs'] if bld.is_defined('HAVE_SUIL'): obj.source += [ 'lv2_plugin_ui.cc' ] obj.uselib += ' SUIL ' if bld.is_defined('FREESOUND'): obj.source += [ 'sfdb_freesound_mootcher.cc' ] if bld.is_defined('VST_SUPPORT'): obj.source += [ 'vst_pluginui.cc' ] obj.defines += [ 'VST_SUPPORT' ] bld.env.append ('LINKFLAGS', '-lX11') if bld.is_defined('LXVST_SUPPORT'): obj.source += [ 'lxvst_pluginui.cc' ] obj.defines += [ 'LXVST_SUPPORT' ] obj.linkflags += [ '-lX11' ] 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', 'au_pluginui.mm' ] obj.use += ' libappleutility ' if bld.is_defined('VST_SUPPORT'): # 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.includes = '../libs/fst' obj.target = 'ardour-3.0-vst' obj.linkflags += ['-mwindows', '-Wl,--export-dynamic', '-lpthread'] obj.defines = ['_POSIX_SOURCE', 'USE_WS_PREFIX'] obj.uselib = 'ALSA' obj.use = ['libpbd','libmidipp','libtaglib','libardour', 'libardour_cp','libgtkmm2ext','libtaglib', 'gtk2_ardour'] # Wrappers wrapper_subst_dict = { 'INSTALL_PREFIX' : bld.env['PREFIX'], 'LIBDIR' : os.path.normpath(bld.env['LIBDIR']), 'LIBS' : 'build/libs', 'VERSION' : '3.0', 'EXECUTABLE' : 'build/gtk2_ardour/ardour-3.0' } def set_subst_dict(obj, dict): for i in dict: setattr(obj, i, dict[i]) obj = bld(features = 'subst', rule= 'chmod 0755 ${TGT}') obj.source = 'ardev_common.sh.in' obj.target = 'ardev_common_waf.sh' obj.chmod = Utils.O755 obj.dict = wrapper_subst_dict set_subst_dict(obj, wrapper_subst_dict) obj = bld(features = 'subst') obj.source = 'ardour.sh.in' obj.target = 'ardour3' obj.chmod = Utils.O755 obj.dict = wrapper_subst_dict obj.install_path = bld.env['BINDIR'] set_subst_dict(obj, wrapper_subst_dict) # Font configuration dark_rc_subst_dict = {} light_rc_subst_dict = {} font_sizes = {} base_font = "" # Set up font sizes if bld.is_defined('GTKOSX'): # OS X fonts basefont = "Lucida Grande" font_sizes = { 'TINY' : '7', 'SMALLER' : '9', 'SMALL' : '10', 'NORMAL' : '11', 'BIG' : '12', 'BIGGER' : '14', 'LARGE' : '18', 'LARGER' : '28', 'HUGER' : '36', 'MASSIVE' : '60' } else: # Linux/X11 fonts basefont = '' # unspecified - use system defaults font_sizes = { 'TINY' : '6', 'SMALLER' : '8', 'SMALL' : '9', 'NORMAL' : '10', 'BIG' : '14', 'BIGGER' : '16', 'LARGE' : '18', 'LARGER' : '24', 'HUGER' : '34', 'MASSIVE' : '60' } # Set up font substitution dictionary # @FONT_XXXX@ for style in ['', 'BOLD', 'ITALIC']: for sizename,points in iter(font_sizes.items()): if (len (style)): key = "_".join (['FONT',style,sizename]) fontstyle = " ".join ([basefont,style.lower(),points]) else: key = "_".join (['FONT',sizename]) fontstyle = " ".join ([basefont,points]) dark_rc_subst_dict[key] = fontstyle light_rc_subst_dict[key] = fontstyle # @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 # 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) 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) 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 = 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' # Menus menus_argv = [] if bld.is_defined('GTKOSX'): menus_argv = [ '-E', '-P', '-DGTKOSX' ] 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' bld.install_files(os.path.join(bld.env['SYSCONFDIR'], 'ardour3'), 'ardour.menus') # Keybindings # 'SAE-de-keypad', 'SAE-de-nokeypad', 'SAE-us-keypad', # 'SAE-us-nokeypad', 'ergonomic-us' for b in [ 'mnemonic-us' ] : 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'] ) ) obj.install_path = os.path.join(bld.env['SYSCONFDIR'], 'ardour3') # not modified at present bld.install_files(os.path.join(bld.env['SYSCONFDIR'], 'ardour3'), 'step_editing.bindings') # 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') # Default UI configuration bld.install_files('${SYSCONFDIR}/ardour3', 'ardour3_ui_default.conf') # Generic widget style mappings bld.install_files('${SYSCONFDIR}/ardour3', 'ardour3_widgets.rc') # Default export stuff bld.install_files('${SYSCONFDIR}/ardour3/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', '') bld.install_as(os.path.join(bld.env['PREFIX'], 'share', 'locale', lang, 'LC_MESSAGES', APPNAME + '.mo'), mo) def i18n(bld): autowaf.build_i18n(bld, top, 'gtk2_ardour', APPNAME, gtk2_ardour_sources, 'Paul Davis')