From 948e5f2d3d69195802fa824c1808d578489c0f15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20M=C3=BCller?= Date: Sat, 25 Jan 2020 23:42:49 +0100 Subject: [PATCH] ardour: python3-/out-of-tree-build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Andreas Müller --- ...-flags-that-cause-trouble-for-cross-.patch | 21 +- ...rinsics-if-available-for-mixing-func.patch | 0 ...e-meter-redraws-for-inactive-meters-.patch | 0 ...e-meter-redraws-for-inactive-meters-.patch | 0 ...h-s-API-changes-introduced-with-2.0..patch | 0 ...-fmt-binding-in-out-of-tree-building.patch | 37 + .../ardour/{files => ardour5}/ardour5.desktop | 0 .../0001-Towards-waf-python-2-3-support.patch | 859 ++++++++++++++++++ .../0002-Update-waf-to-v2.0.19.patch | 99 ++ ...n-default-compiler-to-prefer-gcc-if-.patch | 31 + ...to-build-package-scripts-for-new-waf.patch | 128 +++ ...-all-channels-warning-to-info-part-2.patch | 25 + ....x-subst-feature-uses-obj-attributes.patch | 114 +++ ...07-a-comp.lv2-wscript-sync-to-master.patch | 55 ++ .../ardour/ardour5/waf-backport/waf | 172 ++++ recipes-musicians/ardour/ardour5_git.bb | 25 +- 16 files changed, 1553 insertions(+), 13 deletions(-) rename recipes-musicians/ardour/{files => ardour5}/0001-remove-all-build-flags-that-cause-trouble-for-cross-.patch (83%) rename recipes-musicians/ardour/{files => ardour5}/0002-Use-ARM-NEON-intrinsics-if-available-for-mixing-func.patch (100%) rename recipes-musicians/ardour/{files => ardour5}/0003-Prevent-excessive-meter-redraws-for-inactive-meters-.patch (100%) rename recipes-musicians/ardour/{files => ardour5}/0004-Prevent-excessive-meter-redraws-for-inactive-meters-.patch (100%) rename recipes-musicians/ardour/{files => ardour5}/0005-Follow-fluidsynth-s-API-changes-introduced-with-2.0..patch (100%) create mode 100644 recipes-musicians/ardour/ardour5/0006-Find-fmt-binding-in-out-of-tree-building.patch rename recipes-musicians/ardour/{files => ardour5}/ardour5.desktop (100%) create mode 100644 recipes-musicians/ardour/ardour5/waf-backport/0001-Towards-waf-python-2-3-support.patch create mode 100644 recipes-musicians/ardour/ardour5/waf-backport/0002-Update-waf-to-v2.0.19.patch create mode 100644 recipes-musicians/ardour/ardour5/waf-backport/0003-Change-waf-darwin-default-compiler-to-prefer-gcc-if-.patch create mode 100644 recipes-musicians/ardour/ardour5/waf-backport/0004-Tweaks-to-build-package-scripts-for-new-waf.patch create mode 100644 recipes-musicians/ardour/ardour5/waf-backport/0005-Downgrade-using-all-channels-warning-to-info-part-2.patch create mode 100644 recipes-musicians/ardour/ardour5/waf-backport/0006-Update-waf2.x-subst-feature-uses-obj-attributes.patch create mode 100644 recipes-musicians/ardour/ardour5/waf-backport/0007-a-comp.lv2-wscript-sync-to-master.patch create mode 100755 recipes-musicians/ardour/ardour5/waf-backport/waf diff --git a/recipes-musicians/ardour/files/0001-remove-all-build-flags-that-cause-trouble-for-cross-.patch b/recipes-musicians/ardour/ardour5/0001-remove-all-build-flags-that-cause-trouble-for-cross-.patch similarity index 83% rename from recipes-musicians/ardour/files/0001-remove-all-build-flags-that-cause-trouble-for-cross-.patch rename to recipes-musicians/ardour/ardour5/0001-remove-all-build-flags-that-cause-trouble-for-cross-.patch index c07b3d4..edad8eb 100644 --- a/recipes-musicians/ardour/files/0001-remove-all-build-flags-that-cause-trouble-for-cross-.patch +++ b/recipes-musicians/ardour/ardour5/0001-remove-all-build-flags-that-cause-trouble-for-cross-.patch @@ -10,12 +10,14 @@ Content-Transfer-Encoding: 8bit Upstream-Status: Inappropriate [cross specific] Signed-off-by: Andreas Müller + --- - tools/autowaf.py | 1 + - wscript | 26 - + tools/autowaf.py | 1 + + wscript | 26 -------------------------- + 2 files changed, 1 insertion(+), 26 deletions(-) diff --git a/tools/autowaf.py b/tools/autowaf.py -index f82b80a..626e951 100644 +index 375dc5909..bb7714335 100644 --- a/tools/autowaf.py +++ b/tools/autowaf.py @@ -93,6 +93,7 @@ def copyfile (task): @@ -27,10 +29,10 @@ index f82b80a..626e951 100644 if sys.platform == "darwin": includes = '/opt/local/include' diff --git a/wscript b/wscript -index a7dd5e2..35acc51 100644 +index 9fd84bb2c..d4178cb36 100644 --- a/wscript +++ b/wscript -@@ -440,31 +440,6 @@ int main() { return 0; }''', +@@ -476,31 +476,6 @@ int main() { return 0; }''', compiler_flags.append ("-DARCH_X86") @@ -62,14 +64,11 @@ index a7dd5e2..35acc51 100644 if (conf.env['build_target'] == 'mingw'): if (re.search ("(x86_64|AMD64)", cpu) != None): -@@ -965,7 +940,6 @@ def configure(conf): - else: - conf.check_cc(function_name='dlopen', header_name='dlfcn.h', lib='dl', uselib_store='DL') +@@ -1034,7 +1009,6 @@ def configure(conf): + fragment = "#include \n int main(void) { dlopen (\"\", 0); return 0;}\n", + linkflags='-ldl', uselib_store='DL', execute = False) conf.check_cxx(fragment = "#include \nint main(void) { return (BOOST_VERSION >= 103900 ? 0 : 1); }\n", - execute = "1", mandatory = True, msg = 'Checking for boost library >= 1.39', okmsg = 'ok', --- -2.9.3 - diff --git a/recipes-musicians/ardour/files/0002-Use-ARM-NEON-intrinsics-if-available-for-mixing-func.patch b/recipes-musicians/ardour/ardour5/0002-Use-ARM-NEON-intrinsics-if-available-for-mixing-func.patch similarity index 100% rename from recipes-musicians/ardour/files/0002-Use-ARM-NEON-intrinsics-if-available-for-mixing-func.patch rename to recipes-musicians/ardour/ardour5/0002-Use-ARM-NEON-intrinsics-if-available-for-mixing-func.patch diff --git a/recipes-musicians/ardour/files/0003-Prevent-excessive-meter-redraws-for-inactive-meters-.patch b/recipes-musicians/ardour/ardour5/0003-Prevent-excessive-meter-redraws-for-inactive-meters-.patch similarity index 100% rename from recipes-musicians/ardour/files/0003-Prevent-excessive-meter-redraws-for-inactive-meters-.patch rename to recipes-musicians/ardour/ardour5/0003-Prevent-excessive-meter-redraws-for-inactive-meters-.patch diff --git a/recipes-musicians/ardour/files/0004-Prevent-excessive-meter-redraws-for-inactive-meters-.patch b/recipes-musicians/ardour/ardour5/0004-Prevent-excessive-meter-redraws-for-inactive-meters-.patch similarity index 100% rename from recipes-musicians/ardour/files/0004-Prevent-excessive-meter-redraws-for-inactive-meters-.patch rename to recipes-musicians/ardour/ardour5/0004-Prevent-excessive-meter-redraws-for-inactive-meters-.patch diff --git a/recipes-musicians/ardour/files/0005-Follow-fluidsynth-s-API-changes-introduced-with-2.0..patch b/recipes-musicians/ardour/ardour5/0005-Follow-fluidsynth-s-API-changes-introduced-with-2.0..patch similarity index 100% rename from recipes-musicians/ardour/files/0005-Follow-fluidsynth-s-API-changes-introduced-with-2.0..patch rename to recipes-musicians/ardour/ardour5/0005-Follow-fluidsynth-s-API-changes-introduced-with-2.0..patch diff --git a/recipes-musicians/ardour/ardour5/0006-Find-fmt-binding-in-out-of-tree-building.patch b/recipes-musicians/ardour/ardour5/0006-Find-fmt-binding-in-out-of-tree-building.patch new file mode 100644 index 0000000..61c23ab --- /dev/null +++ b/recipes-musicians/ardour/ardour5/0006-Find-fmt-binding-in-out-of-tree-building.patch @@ -0,0 +1,37 @@ +From de5b65e6e5c558237fbdcfb4c6a284bc17a6054e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Andreas=20M=C3=BCller?= +Date: Sat, 25 Jan 2020 22:11:56 +0100 +Subject: [PATCH] Find fmt-binding in out-of-tree building +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Andreas Müller +--- + gtk2_ardour/wscript | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/gtk2_ardour/wscript b/gtk2_ardour/wscript +index beb5b196b8..ed1d5631dd 100644 +--- a/gtk2_ardour/wscript ++++ b/gtk2_ardour/wscript +@@ -1,6 +1,6 @@ + #!/usr/bin/env python + from waflib.extras import autowaf as autowaf +-from waflib import Options, TaskGen ++from waflib import Options, TaskGen, Context + import waflib.Logs as Logs, waflib.Utils as Utils + import os + import shutil +@@ -852,7 +852,7 @@ def build(bld): + # 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'] ) ++ a_rule = 'perl %s/tools/fmt-bindings --platform="%s" --winkey="%s" --accelmap ${SRC[0].abspath()} >${TGT}' % (Context.top_dir, sys.platform, bld.env['WINDOWS_KEY'] ) + for b in [ 'ardour' ] : + obj = bld( + target = b + '.keys', +-- +2.21.0 + diff --git a/recipes-musicians/ardour/files/ardour5.desktop b/recipes-musicians/ardour/ardour5/ardour5.desktop similarity index 100% rename from recipes-musicians/ardour/files/ardour5.desktop rename to recipes-musicians/ardour/ardour5/ardour5.desktop diff --git a/recipes-musicians/ardour/ardour5/waf-backport/0001-Towards-waf-python-2-3-support.patch b/recipes-musicians/ardour/ardour5/waf-backport/0001-Towards-waf-python-2-3-support.patch new file mode 100644 index 0000000..e057ca7 --- /dev/null +++ b/recipes-musicians/ardour/ardour5/waf-backport/0001-Towards-waf-python-2-3-support.patch @@ -0,0 +1,859 @@ +From 2e9ac80e998bc79d5ef9029415008198b22168dc Mon Sep 17 00:00:00 2001 +From: David Runge +Date: Mon, 20 Jan 2020 23:08:11 +0100 +Subject: [PATCH 1/8] Towards waf python 2+3 support + +Upstream-Status: Backport [1] + +[1] https://github.com/Ardour/ardour/commit/2e9ac80e998bc79d5ef9029415008198b22168dc + +--- + gtk2_ardour/wscript | 32 +- + libs/ardour/wscript | 2 +- + libs/pbd/wscript | 17 +- + libs/plugins/a-comp.lv2/wscript | 13 +- + libs/plugins/a-delay.lv2/wscript | 14 +- + libs/plugins/a-eq.lv2/wscript | 14 +- + libs/plugins/a-fluidsynth.lv2/wscript | 16 +- + libs/plugins/a-reverb.lv2/wscript | 14 +- + libs/plugins/reasonablesynth.lv2/wscript | 14 +- + libs/ptformat/wscript | 1 + + libs/surfaces/osc/wscript | 2 +- + libs/surfaces/push2/wscript | 24 +- + libs/surfaces/wiimote/wscript | 2 +- + libs/widgets/wscript | 2 +- + session_utils/wscript | 2 +- + tools/bb/wscript | 15 +- + tools/luadevel/wscript | 2 +- + tools/misc.py | 355 +++++++++++++++++++++++ + wscript | 10 +- + 19 files changed, 457 insertions(+), 94 deletions(-) + create mode 100644 tools/misc.py + +diff --git a/gtk2_ardour/wscript b/gtk2_ardour/wscript +index d3824a0a63..beb5b196b8 100644 +--- a/gtk2_ardour/wscript ++++ b/gtk2_ardour/wscript +@@ -369,20 +369,15 @@ def configure(conf): + + + if sys.platform == 'darwin': +- retval = conf.run_c_code (code='#include \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.check( ++ msg ='Checking for Cocoa live resizing constants', ++ fragment = '#include \n int main(void) { (void) NSWindowWillStartLiveResizeNotification; return 0; }\n', ++ define_name = 'HAVE_COCOA_LIVE_RESIZING', ++ uselib_store = 'COCOA_LIVE_RESIZING', ++ compiler = 'cc', ++ compile_filename = 'test.m', ++ execute = True, ++ mandatory = False) + + conf.write_config_header('gtk2ardour-config.h', remove=False) + +@@ -475,7 +470,6 @@ def build(bld): + obj.source = list(gtk2_ardour_sources) + obj.target = 'luadoc' + obj.includes = ['.', '../libs'] +- obj.ldflags = ['-no-undefined'] + obj.use = [ + 'libpbd', + 'libardour', +@@ -515,7 +509,6 @@ def build(bld): + # obj.source = [ 'ardour_button.cc', 'ui_config.cc', 'tooltips.cc' ] + # obj.target = 'canvas_test' + # obj.includes = ['.', '../libs'] +-# obj.ldflags = ['-no-undefined'] + # obj.use = [ + # 'libpbd', + # 'libardour', +@@ -586,9 +579,8 @@ def build(bld): + 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.ldflags = ['-no-undefined'] ++ obj.target = 'ardour-' + str (bld.env['VERSION']) ++ obj.includes = ['.'] + + if bld.is_defined('WINDOWS_VST_SUPPORT'): + # Windows VST support mingw +@@ -617,7 +609,7 @@ def build(bld): + ] + 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 ' ++ obj.uselib = 'UUID FLAC FONTCONFIG GLIBMM GTHREAD GTK OGG CURL DL GTKMM CANVAS FFTW3F LO TAGLIB XML LILV' + + if sys.platform == 'darwin': + obj.uselib += ' AUDIOUNITS OSX ' +diff --git a/libs/ardour/wscript b/libs/ardour/wscript +index 7148a26042..8a65daaaf0 100644 +--- a/libs/ardour/wscript ++++ b/libs/ardour/wscript +@@ -474,7 +474,7 @@ def build(bld): + avx_cxxflags = list(bld.env['CXXFLAGS']) + avx_cxxflags.append (bld.env['compiler_flags_dict']['avx']) + avx_cxxflags.append (bld.env['compiler_flags_dict']['pic']) +- bld(features = 'cxx', ++ bld(features = 'cxx cxxstlib asm', + source = avx_sources, + cxxflags = avx_cxxflags, + includes = [ '.' ], +diff --git a/libs/pbd/wscript b/libs/pbd/wscript +index 29d82edcb4..8dffb71dd7 100644 +--- a/libs/pbd/wscript ++++ b/libs/pbd/wscript +@@ -108,12 +108,21 @@ def configure(conf): + autowaf.check_pkg(conf, 'glibmm-2.4', uselib_store='GLIBMM', atleast_version='2.32.0', mandatory=True) + autowaf.check_pkg(conf, 'giomm-2.4', uselib_store='GIOMM', atleast_version='2.2', mandatory=True) + +- conf.check(function_name='getmntent', header_name='mntent.h', define_name='HAVE_GETMNTENT',mandatory=False) + conf.check(header_name='execinfo.h', define_name='HAVE_EXECINFO',mandatory=False) + conf.check(header_name='unistd.h', define_name='HAVE_UNISTD',mandatory=False) + if not Options.options.ppc: +- conf.check_cc(function_name='posix_memalign', header_name='stdlib.h', cflags='-D_XOPEN_SOURCE=600', define_name='HAVE_POSIX_MEMALIGN', mandatory=False) +- conf.check(function_name='localtime_r', header_name='time.h', define_name='HAVE_LOCALTIME_R',mandatory=False) ++ conf.check_cc( ++ msg="Checking for function 'posix_memalign' in stdlib.h", ++ fragment = "#define _XOPEN_SOURCE 600\n #include \n int main(void) { return posix_memalign (0, 64, 1); }\n", ++ define_name='HAVE_POSIX_MEMALIGN', execute = False, mandatory=False) ++ conf.check_cc( ++ msg="Checking for function 'getmntent' in mntent.h", ++ fragment = "#include \n int main(void) { return (int)getmntent(0); }\n", ++ define_name='HAVE_GETMNTENT', execute = False, mandatory=False) ++ conf.check_cc( ++ msg="Checking for function 'localtime_r' in time.h", ++ fragment = "#include \n int main(void) { return localtime_r(NULL, NULL); }\n", ++ define_name='HAVE_LOCALTIME_R', execute = False, mandatory=False) + + # Boost headers + autowaf.check_header(conf, 'cxx', 'boost/shared_ptr.hpp') +@@ -161,7 +170,7 @@ def build(bld): + obj.includes = ['.'] + obj.name = 'libpbd' + obj.target = 'pbd' +- obj.uselib = 'GLIBMM SIGCPP XML UUID SNDFILE GIOMM ARCHIVE CURL' ++ obj.uselib = 'GLIBMM SIGCPP XML UUID SNDFILE GIOMM ARCHIVE CURL XML' + if sys.platform == 'darwin': + TaskGen.task_gen.mappings['.mm'] = TaskGen.task_gen.mappings['.cc'] + if 'cocoa_open_uri.mm' not in obj.source: +diff --git a/libs/plugins/a-comp.lv2/wscript b/libs/plugins/a-comp.lv2/wscript +index f0ebb1d33d..99d7bb03f1 100644 +--- a/libs/plugins/a-comp.lv2/wscript ++++ b/libs/plugins/a-comp.lv2/wscript +@@ -25,15 +25,16 @@ def build(bld): + module_pat = re.sub('^lib', '', bld.env.cshlib_PATTERN) + module_ext = module_pat[module_pat.rfind('.'):] + +- if bld.is_defined ('HAVE_LV2'): ++ if bld.is_defined('HAVE_LV2'): + # Build RDF files + for i in ['manifest.ttl', 'a-comp.ttl', 'a-comp#stereo.ttl', 'presets.ttl']: + bld(features = 'subst', +- source = i + '.in', +- target = '../../LV2/%s/%s' % (bundle, i), +- install_path = '${LV2DIR}/%s' % bundle, +- chmod = Utils.O644, +- LIB_EXT = module_ext) ++ obj = bld(features='subst') ++ obj.source = i + '.in' ++ obj.target = '../../LV2/%s/%s' % (bundle, i) ++ obj.install_path = '${LV2DIR}/%s' % bundle ++ obj.chmod = Utils.O644 ++ obj.dict = {'LIB_EXT': module_ext} + + # Build plugin library + obj = bld(features = 'c cshlib', +diff --git a/libs/plugins/a-delay.lv2/wscript b/libs/plugins/a-delay.lv2/wscript +index 666ef0d5ab..2af05ff137 100644 +--- a/libs/plugins/a-delay.lv2/wscript ++++ b/libs/plugins/a-delay.lv2/wscript +@@ -25,15 +25,15 @@ def build(bld): + module_pat = re.sub('^lib', '', bld.env.cshlib_PATTERN) + module_ext = module_pat[module_pat.rfind('.'):] + +- if bld.is_defined ('HAVE_LV2'): ++ if bld.is_defined('HAVE_LV2'): + # Build RDF files + for i in ['manifest.ttl', 'a-delay.ttl', 'presets.ttl']: +- bld(features = 'subst', +- source = i + '.in', +- target = '../../LV2/%s/%s' % (bundle, i), +- install_path = '${LV2DIR}/%s' % bundle, +- chmod = Utils.O644, +- LIB_EXT = module_ext) ++ obj = bld(features='subst') ++ obj.source = i + '.in' ++ obj.target = '../../LV2/%s/%s' % (bundle, i) ++ obj.install_path = '${LV2DIR}/%s' % bundle ++ obj.chmod = Utils.O644 ++ obj.dict = {'LIB_EXT': module_ext} + + # Build plugin library + obj = bld(features = 'c cshlib', +diff --git a/libs/plugins/a-eq.lv2/wscript b/libs/plugins/a-eq.lv2/wscript +index 0610ba2eea..e36a804f7f 100644 +--- a/libs/plugins/a-eq.lv2/wscript ++++ b/libs/plugins/a-eq.lv2/wscript +@@ -25,15 +25,15 @@ def build(bld): + module_pat = re.sub('^lib', '', bld.env.cshlib_PATTERN) + module_ext = module_pat[module_pat.rfind('.'):] + +- if bld.is_defined ('HAVE_LV2'): ++ if bld.is_defined('HAVE_LV2'): + # Build RDF files + for i in ['manifest.ttl', 'a-eq.ttl']: +- bld(features = 'subst', +- source = i + '.in', +- target = '../../LV2/%s/%s' % (bundle, i), +- install_path = '${LV2DIR}/%s' % bundle, +- chmod = Utils.O644, +- LIB_EXT = module_ext) ++ obj = bld(features='subst') ++ obj.source = i + '.in' ++ obj.target = '../../LV2/%s/%s' % (bundle, i) ++ obj.install_path = '${LV2DIR}/%s' % bundle ++ obj.chmod = Utils.O644 ++ obj.dict = {'LIB_EXT': module_ext} + + # Build plugin library + obj = bld(features = 'c cshlib', +diff --git a/libs/plugins/a-fluidsynth.lv2/wscript b/libs/plugins/a-fluidsynth.lv2/wscript +index af6fcf08a8..3a093259d6 100644 +--- a/libs/plugins/a-fluidsynth.lv2/wscript ++++ b/libs/plugins/a-fluidsynth.lv2/wscript +@@ -24,15 +24,15 @@ def build(bld): + module_pat = re.sub('^lib', '', bld.env.cshlib_PATTERN) + module_ext = module_pat[module_pat.rfind('.'):] + +- if bld.is_defined ('HAVE_LV2'): ++ if bld.is_defined('HAVE_LV2'): + # Build RDF files + for i in ['manifest.ttl', 'a-fluidsynth.ttl']: +- bld(features = 'subst', +- source = i + '.in', +- target = '../../LV2/%s/%s' % (bundle, i), +- install_path = '${LV2DIR}/%s' % bundle, +- chmod = Utils.O644, +- LIB_EXT = module_ext) ++ obj = bld(features='subst') ++ obj.source = i + '.in' ++ obj.target = '../../LV2/%s/%s' % (bundle, i) ++ obj.install_path = '${LV2DIR}/%s' % bundle ++ obj.chmod = Utils.O644 ++ obj.dict = {'LIB_EXT': module_ext} + + # Build plugin library + obj = bld(features = 'cxx cshlib', +@@ -42,7 +42,7 @@ def build(bld): + includes = [ '../../ardour' ], + target = '../../LV2/%s/a-fluidsynth' % bundle, + install_path = '${LV2DIR}/%s' % bundle, +- uselib = ['LIBFLUIDSYNTH'], ++ uselib = ['LIBFLUIDSYNTH', 'GLIB'], + use = ['LV2_1_0_0'] + ) + +diff --git a/libs/plugins/a-reverb.lv2/wscript b/libs/plugins/a-reverb.lv2/wscript +index 35601f2179..3eb5ce10bc 100644 +--- a/libs/plugins/a-reverb.lv2/wscript ++++ b/libs/plugins/a-reverb.lv2/wscript +@@ -24,15 +24,15 @@ def build(bld): + module_pat = re.sub('^lib', '', bld.env.cshlib_PATTERN) + module_ext = module_pat[module_pat.rfind('.'):] + +- if bld.is_defined ('HAVE_LV2'): ++ if bld.is_defined('HAVE_LV2'): + # Build RDF files + for i in ['manifest.ttl', 'a-reverb.ttl']: +- bld(features = 'subst', +- source = i + '.in', +- target = '../../LV2/%s/%s' % (bundle, i), +- install_path = '${LV2DIR}/%s' % bundle, +- chmod = Utils.O644, +- LIB_EXT = module_ext) ++ obj = bld(features='subst') ++ obj.source = i + '.in' ++ obj.target = '../../LV2/%s/%s' % (bundle, i) ++ obj.install_path = '${LV2DIR}/%s' % bundle ++ obj.chmod = Utils.O644 ++ obj.dict = {'LIB_EXT': module_ext} + + # Build plugin library + obj = bld(features = 'c cshlib', +diff --git a/libs/plugins/reasonablesynth.lv2/wscript b/libs/plugins/reasonablesynth.lv2/wscript +index cedda4c308..0eb5c55a04 100644 +--- a/libs/plugins/reasonablesynth.lv2/wscript ++++ b/libs/plugins/reasonablesynth.lv2/wscript +@@ -24,15 +24,15 @@ def build(bld): + module_pat = re.sub('^lib', '', bld.env.cshlib_PATTERN) + module_ext = module_pat[module_pat.rfind('.'):] + +- if bld.is_defined ('HAVE_LV2'): ++ if bld.is_defined('HAVE_LV2'): + # Build RDF files + for i in ['manifest.ttl', 'reasonablesynth.ttl']: +- bld(features = 'subst', +- source = i + '.in', +- target = '../../LV2/%s/%s' % (bundle, i), +- install_path = '${LV2DIR}/%s' % bundle, +- chmod = Utils.O644, +- LIB_EXT = module_ext) ++ obj = bld(features='subst') ++ obj.source = i + '.in' ++ obj.target = '../../LV2/%s/%s' % (bundle, i) ++ obj.install_path = '${LV2DIR}/%s' % bundle ++ obj.chmod = Utils.O644 ++ obj.dict = {'LIB_EXT': module_ext} + + # Build plugin library + obj = bld(features = 'c cshlib', +diff --git a/libs/ptformat/wscript b/libs/ptformat/wscript +index 4d381234fe..8dc9ff7430 100644 +--- a/libs/ptformat/wscript ++++ b/libs/ptformat/wscript +@@ -35,6 +35,7 @@ def build(bld): + obj.name = 'libptformat' + obj.target = 'ptformat' + obj.use = 'libardour' ++ obj.uselib = 'GLIBMM' + autowaf.ensure_visible_symbols (obj, True) + obj.vnum = LIBPTFORMAT_LIB_VERSION + obj.install_path = bld.env['LIBDIR'] +diff --git a/libs/surfaces/osc/wscript b/libs/surfaces/osc/wscript +index 4d0dba6750..5bbe7d3946 100644 +--- a/libs/surfaces/osc/wscript ++++ b/libs/surfaces/osc/wscript +@@ -30,7 +30,7 @@ def build(bld): + obj.includes = ['.', './osc'] + obj.name = 'libardour_osc' + obj.target = 'ardour_osc' +- obj.uselib = 'LO GTKMM GTK GDK' ++ obj.uselib = 'LO GTKMM GTK GDK XML' + obj.use = 'libardour libardour_cp libgtkmm2ext libpbd' + obj.install_path = os.path.join(bld.env['LIBDIR'], 'surfaces') + +diff --git a/libs/surfaces/push2/wscript b/libs/surfaces/push2/wscript +index 9c75f9d69f..f7a5134153 100644 +--- a/libs/surfaces/push2/wscript ++++ b/libs/surfaces/push2/wscript +@@ -21,28 +21,28 @@ def build(bld): + push2.cc + buttons.cc + canvas.cc +- interface.cc ++ interface.cc + midi_byte_array.cc + leds.cc + level_meter.cc +- gui.cc +- knob.cc +- layout.cc +- menu.cc +- mix.cc +- scale.cc +- splash.cc +- track_mix.cc +- utils.cc ++ gui.cc ++ knob.cc ++ layout.cc ++ menu.cc ++ mix.cc ++ scale.cc ++ splash.cc ++ track_mix.cc ++ utils.cc + ''' + obj.export_includes = ['.'] + obj.defines = [ 'PACKAGE="ardour_push2"' ] + obj.defines += [ 'ARDOURSURFACE_DLL_EXPORTS' ] + obj.defines += [ 'VERSIONSTRING="' + bld.env['VERSION'] + '"' ] +- obj.includes = [ '.', './push2'] ++ obj.includes = ['.', './push2'] + obj.name = 'libardour_push2' + obj.target = 'ardour_push2' +- obj.uselib = 'CAIROMM PANGOMM USB GTKMM SIGCPP' ++ obj.uselib = 'CAIROMM PANGOMM USB GTKMM SIGCPP XML' + obj.use = 'libardour libardour_cp libgtkmm2ext libpbd libevoral libcanvas libtimecode' + obj.install_path = os.path.join(bld.env['LIBDIR'], 'surfaces') + +diff --git a/libs/surfaces/wiimote/wscript b/libs/surfaces/wiimote/wscript +index 03d01635a1..d38296f37f 100644 +--- a/libs/surfaces/wiimote/wscript ++++ b/libs/surfaces/wiimote/wscript +@@ -24,7 +24,7 @@ def build(bld): + obj.includes = ['.', '../libs'] + obj.name = 'libardour_wiimote' + obj.target = 'ardour_wiimote' +- obj.uselib = 'GTKMM CWIID' ++ obj.uselib = 'GTKMM CWIID XML' + obj.use = 'libardour libardour_cp libgtkmm2ext' + obj.install_path = os.path.join(bld.env['LIBDIR'], 'surfaces') + +diff --git a/libs/widgets/wscript b/libs/widgets/wscript +index 0559abe4dc..2216c38348 100644 +--- a/libs/widgets/wscript ++++ b/libs/widgets/wscript +@@ -76,7 +76,7 @@ def build(bld): + obj.defines = [ ] + + obj.export_includes = ['.'] +- obj.includes = ['.'] ++ obj.includes = ['.'] + bld.env['INCLUDES_GLIB'] + obj.uselib = 'SIGCPP CAIROMM GTKMM BOOST XML' + obj.use = [ 'libpbd', 'libgtkmm2ext' ] + obj.name = 'libwidgets' +diff --git a/session_utils/wscript b/session_utils/wscript +index 5fe9445426..a98694f3d6 100644 +--- a/session_utils/wscript ++++ b/session_utils/wscript +@@ -86,7 +86,7 @@ def build(bld): + utils = bld.path.ant_glob('*.cc', excl=['example.cc', 'common.cc']) + + for util in utils: +- fn = str(util)[:-3] ++ fn = os.path.splitext(os.path.basename(str(util)))[0] + build_ardour_util(bld, fn) + if bld.env['build_target'] != 'mingw': + bld.symlink_as(bld.env['BINDIR'] + '/' + pgmprefix + "-" + fn, bld.env['LIBDIR'] + '/utils/ardour-util.sh') +diff --git a/tools/bb/wscript b/tools/bb/wscript +index e419fa2465..3e9fd8d2d7 100644 +--- a/tools/bb/wscript ++++ b/tools/bb/wscript +@@ -12,14 +12,13 @@ def configure(ctx): + pass + + def build(bld): +- obj = bld (features = 'cxx c cxxprogram') +- obj.install_path = None +- obj.source = [ 'bb.cc', 'gui.cc', 'misc.cc' ] +- obj.target = 'bb' +- obj.includes = ['.', '../libs'] +- obj.ldflags = ['-no-undefined'] +- obj.use = [ 'libardour', 'libevoral', ] +- obj.uselib = ' JACK GTKMM ' ++ obj = bld (features = 'cxx c cxxprogram') ++ obj.install_path = None ++ obj.source = [ 'bb.cc', 'gui.cc', 'misc.cc' ] ++ obj.target = 'bb' ++ obj.includes = ['.', '../libs'] ++ obj.use = [ 'libardour', 'libevoral', ] ++ obj.uselib = 'JACK GTKMM XML' + + wrapper_subst_dict = { + 'INSTALL_PREFIX' : bld.env['PREFIX'], +diff --git a/tools/luadevel/wscript b/tools/luadevel/wscript +index 3190380091..03889c72d7 100755 +--- a/tools/luadevel/wscript ++++ b/tools/luadevel/wscript +@@ -18,7 +18,7 @@ def options(opt): + def configure(conf): + conf.load('misc') + conf.load('compiler_cxx') +- conf.check_cc(function_name='readline', ++ conf.check_cc( + header_name='stdio.h readline/readline.h', + lib='readline', + uselib_store='READLINE', +diff --git a/tools/misc.py b/tools/misc.py +new file mode 100644 +index 0000000000..b82cdb63ba +--- /dev/null ++++ b/tools/misc.py +@@ -0,0 +1,355 @@ ++#!/usr/bin/env python ++# encoding: utf-8 ++# Thomas Nagy, 2006-2010 (ita) ++ ++""" ++This tool is totally deprecated ++ ++Try using: ++ .pc.in files for .pc files ++ the feature intltool_in - see demos/intltool ++ make-like rules ++""" ++ ++import shutil, re, os ++from waflib import TaskGen, Node, Task, Utils, Build, Errors ++from waflib.TaskGen import feature, after_method, before_method ++from waflib.Logs import debug ++ ++def copy_attrs(orig, dest, names, only_if_set=False): ++ """ ++ copy class attributes from an object to another ++ """ ++ for a in Utils.to_list(names): ++ u = getattr(orig, a, ()) ++ if u or not only_if_set: ++ setattr(dest, a, u) ++ ++def copy_func(tsk): ++ "Make a file copy. This might be used to make other kinds of file processing (even calling a compiler is possible)" ++ env = tsk.env ++ infile = tsk.inputs[0].abspath() ++ outfile = tsk.outputs[0].abspath() ++ try: ++ shutil.copy2(infile, outfile) ++ except (OSError, IOError): ++ return 1 ++ else: ++ if tsk.chmod: os.chmod(outfile, tsk.chmod) ++ return 0 ++ ++def action_process_file_func(tsk): ++ "Ask the function attached to the task to process it" ++ if not tsk.fun: raise Errors.WafError('task must have a function attached to it for copy_func to work!') ++ return tsk.fun(tsk) ++ ++@feature('cmd') ++def apply_cmd(self): ++ "call a command everytime" ++ if not self.fun: raise Errors.WafError('cmdobj needs a function!') ++ tsk = Task.TaskBase() ++ tsk.fun = self.fun ++ tsk.env = self.env ++ self.tasks.append(tsk) ++ tsk.install_path = self.install_path ++ ++@feature('copy') ++@before_method('process_source') ++def apply_copy(self): ++ Utils.def_attrs(self, fun=copy_func) ++ self.default_install_path = 0 ++ ++ lst = self.to_list(self.source) ++ self.meths.remove('process_source') ++ ++ for filename in lst: ++ node = self.path.find_resource(filename) ++ if not node: raise Errors.WafError('cannot find input file %s for processing' % filename) ++ ++ target = self.target ++ if not target or len(lst)>1: target = node.name ++ ++ # TODO the file path may be incorrect ++ newnode = self.path.find_or_declare(target) ++ ++ tsk = self.create_task('copy', node, newnode) ++ tsk.fun = self.fun ++ tsk.chmod = getattr(self, 'chmod', Utils.O644) ++ ++ if not tsk.env: ++ tsk.debug() ++ raise Errors.WafError('task without an environment') ++ ++#################### ++## command-output #### ++#################### ++ ++class cmd_arg(object): ++ """command-output arguments for representing files or folders""" ++ def __init__(self, name, template='%s'): ++ self.name = name ++ self.template = template ++ self.node = None ++ ++class input_file(cmd_arg): ++ def find_node(self, base_path): ++ assert isinstance(base_path, Node.Node) ++ self.node = base_path.find_resource(self.name) ++ if self.node is None: ++ raise Errors.WafError("Input file %s not found in " % (self.name, base_path)) ++ ++ def get_path(self, env, absolute): ++ if absolute: ++ return self.template % self.node.abspath() ++ else: ++ return self.template % self.node.srcpath() ++ ++class output_file(cmd_arg): ++ def find_node(self, base_path): ++ assert isinstance(base_path, Node.Node) ++ self.node = base_path.find_or_declare(self.name) ++ if self.node is None: ++ raise Errors.WafError("Output file %s not found in " % (self.name, base_path)) ++ ++ def get_path(self, env, absolute): ++ if absolute: ++ return self.template % self.node.abspath() ++ else: ++ return self.template % self.node.bldpath() ++ ++class cmd_dir_arg(cmd_arg): ++ def find_node(self, base_path): ++ assert isinstance(base_path, Node.Node) ++ self.node = base_path.find_dir(self.name) ++ if self.node is None: ++ raise Errors.WafError("Directory %s not found in " % (self.name, base_path)) ++ ++class input_dir(cmd_dir_arg): ++ def get_path(self, dummy_env, dummy_absolute): ++ return self.template % self.node.abspath() ++ ++class output_dir(cmd_dir_arg): ++ def get_path(self, env, dummy_absolute): ++ return self.template % self.node.abspath() ++ ++ ++class command_output(Task.Task): ++ color = "BLUE" ++ def __init__(self, env, command, command_node, command_args, stdin, stdout, cwd, os_env, stderr): ++ Task.Task.__init__(self, env=env) ++ assert isinstance(command, (str, Node.Node)) ++ self.command = command ++ self.command_args = command_args ++ self.stdin = stdin ++ self.stdout = stdout ++ self.cwd = cwd ++ self.os_env = os_env ++ self.stderr = stderr ++ ++ if command_node is not None: self.dep_nodes = [command_node] ++ self.dep_vars = [] # additional environment variables to look ++ ++ def run(self): ++ task = self ++ #assert len(task.inputs) > 0 ++ ++ def input_path(node, template): ++ if task.cwd is None: ++ return template % node.bldpath() ++ else: ++ return template % node.abspath() ++ def output_path(node, template): ++ fun = node.abspath ++ if task.cwd is None: fun = node.bldpath ++ return template % fun() ++ ++ if isinstance(task.command, Node.Node): ++ argv = [input_path(task.command, '%s')] ++ else: ++ argv = [task.command] ++ ++ for arg in task.command_args: ++ if isinstance(arg, str): ++ argv.append(arg) ++ else: ++ assert isinstance(arg, cmd_arg) ++ argv.append(arg.get_path(task.env, (task.cwd is not None))) ++ ++ if task.stdin: ++ stdin = open(input_path(task.stdin, '%s')) ++ else: ++ stdin = None ++ ++ if task.stdout: ++ stdout = open(output_path(task.stdout, '%s'), "w") ++ else: ++ stdout = None ++ ++ if task.stderr: ++ stderr = open(output_path(task.stderr, '%s'), "w") ++ else: ++ stderr = None ++ ++ if task.cwd is None: ++ cwd = ('None (actually %r)' % os.getcwd()) ++ else: ++ cwd = repr(task.cwd) ++ debug("command-output: cwd=%s, stdin=%r, stdout=%r, argv=%r" % ++ (cwd, stdin, stdout, argv)) ++ ++ if task.os_env is None: ++ os_env = os.environ ++ else: ++ os_env = task.os_env ++ command = Utils.subprocess.Popen(argv, stdin=stdin, stdout=stdout, stderr=stderr, cwd=task.cwd, env=os_env) ++ return command.wait() ++ ++@feature('command-output') ++def init_cmd_output(self): ++ Utils.def_attrs(self, ++ stdin = None, ++ stdout = None, ++ stderr = None, ++ # the command to execute ++ command = None, ++ ++ # whether it is an external command; otherwise it is assumed ++ # to be an executable binary or script that lives in the ++ # source or build tree. ++ command_is_external = False, ++ ++ # extra parameters (argv) to pass to the command (excluding ++ # the command itself) ++ argv = [], ++ ++ # dependencies to other objects -> this is probably not what you want (ita) ++ # values must be 'task_gen' instances (not names!) ++ dependencies = [], ++ ++ # dependencies on env variable contents ++ dep_vars = [], ++ ++ # input files that are implicit, i.e. they are not ++ # stdin, nor are they mentioned explicitly in argv ++ hidden_inputs = [], ++ ++ # output files that are implicit, i.e. they are not ++ # stdout, nor are they mentioned explicitly in argv ++ hidden_outputs = [], ++ ++ # change the subprocess to this cwd (must use obj.input_dir() or output_dir() here) ++ cwd = None, ++ ++ # OS environment variables to pass to the subprocess ++ # if None, use the default environment variables unchanged ++ os_env = None) ++ ++@feature('command-output') ++@after_method('init_cmd_output') ++def apply_cmd_output(self): ++ if self.command is None: ++ raise Errors.WafError("command-output missing command") ++ if self.command_is_external: ++ cmd = self.command ++ cmd_node = None ++ else: ++ cmd_node = self.path.find_resource(self.command) ++ assert cmd_node is not None, ('''Could not find command '%s' in source tree. ++Hint: if this is an external command, ++use command_is_external=True''') % (self.command,) ++ cmd = cmd_node ++ ++ if self.cwd is None: ++ cwd = None ++ else: ++ assert isinstance(cwd, CmdDirArg) ++ self.cwd.find_node(self.path) ++ ++ args = [] ++ inputs = [] ++ outputs = [] ++ ++ for arg in self.argv: ++ if isinstance(arg, cmd_arg): ++ arg.find_node(self.path) ++ if isinstance(arg, input_file): ++ inputs.append(arg.node) ++ if isinstance(arg, output_file): ++ outputs.append(arg.node) ++ ++ if self.stdout is None: ++ stdout = None ++ else: ++ assert isinstance(self.stdout, str) ++ stdout = self.path.find_or_declare(self.stdout) ++ if stdout is None: ++ raise Errors.WafError("File %s not found" % (self.stdout,)) ++ outputs.append(stdout) ++ ++ if self.stderr is None: ++ stderr = None ++ else: ++ assert isinstance(self.stderr, str) ++ stderr = self.path.find_or_declare(self.stderr) ++ if stderr is None: ++ raise Errors.WafError("File %s not found" % (self.stderr,)) ++ outputs.append(stderr) ++ ++ if self.stdin is None: ++ stdin = None ++ else: ++ assert isinstance(self.stdin, str) ++ stdin = self.path.find_resource(self.stdin) ++ if stdin is None: ++ raise Errors.WafError("File %s not found" % (self.stdin,)) ++ inputs.append(stdin) ++ ++ for hidden_input in self.to_list(self.hidden_inputs): ++ node = self.path.find_resource(hidden_input) ++ if node is None: ++ raise Errors.WafError("File %s not found in dir %s" % (hidden_input, self.path)) ++ inputs.append(node) ++ ++ for hidden_output in self.to_list(self.hidden_outputs): ++ node = self.path.find_or_declare(hidden_output) ++ if node is None: ++ raise Errors.WafError("File %s not found in dir %s" % (hidden_output, self.path)) ++ outputs.append(node) ++ ++ if not (inputs or getattr(self, 'no_inputs', None)): ++ raise Errors.WafError('command-output objects must have at least one input file or give self.no_inputs') ++ if not (outputs or getattr(self, 'no_outputs', None)): ++ raise Errors.WafError('command-output objects must have at least one output file or give self.no_outputs') ++ ++ cwd = self.bld.variant_dir ++ task = command_output(self.env, cmd, cmd_node, self.argv, stdin, stdout, cwd, self.os_env, stderr) ++ task.generator = self ++ copy_attrs(self, task, 'before after ext_in ext_out', only_if_set=True) ++ self.tasks.append(task) ++ ++ task.inputs = inputs ++ task.outputs = outputs ++ task.dep_vars = self.to_list(self.dep_vars) ++ ++ for dep in self.dependencies: ++ assert dep is not self ++ dep.post() ++ for dep_task in dep.tasks: ++ task.set_run_after(dep_task) ++ ++ if not task.inputs: ++ # the case for svnversion, always run, and update the output nodes ++ task.runnable_status = type(Task.TaskBase.run)(runnable_status, task, task.__class__) # always run ++ task.post_run = type(Task.TaskBase.run)(post_run, task, task.__class__) ++ ++ # TODO the case with no outputs? ++ ++def post_run(self): ++ for x in self.outputs: ++ x.sig = Utils.h_file(x.abspath()) ++ ++def runnable_status(self): ++ return self.RUN_ME ++ ++Task.task_factory('copy', vars=[], func=action_process_file_func) ++ +diff --git a/wscript b/wscript +index 4b5acb0ad7..f5d1b28e56 100644 +--- a/wscript ++++ b/wscript +@@ -1011,9 +1011,15 @@ def configure(conf): + if Options.options.dist_target != 'mingw': + if Options.options.dist_target != 'msvc' and re.search ("openbsd", sys.platform) == None: + if re.search ("freebsd", sys.platform) != None: +- conf.check_cc(function_name='dlopen', header_name='dlfcn.h', uselib_store='DL') ++ conf.check_cc( ++ msg="Checking for function 'dlopen' in dlfcn.h", ++ fragment = "#include \n int main(void) { dlopen (\"\", 0); return 0;}\n", ++ uselib_store='DL', execute = False) + else: +- conf.check_cc(function_name='dlopen', header_name='dlfcn.h', lib='dl', uselib_store='DL') ++ conf.check_cc( ++ msg="Checking for function 'dlopen' in dlfcn.h", ++ fragment = "#include \n int main(void) { dlopen (\"\", 0); return 0;}\n", ++ linkflags='-ldl', uselib_store='DL', execute = False) + conf.check_cxx(fragment = "#include \nint main(void) { return (BOOST_VERSION >= 103900 ? 0 : 1); }\n", + execute = "1", + mandatory = True, +-- +2.21.0 + diff --git a/recipes-musicians/ardour/ardour5/waf-backport/0002-Update-waf-to-v2.0.19.patch b/recipes-musicians/ardour/ardour5/waf-backport/0002-Update-waf-to-v2.0.19.patch new file mode 100644 index 0000000..87b3f9a --- /dev/null +++ b/recipes-musicians/ardour/ardour5/waf-backport/0002-Update-waf-to-v2.0.19.patch @@ -0,0 +1,99 @@ +From 19603d075f7013453c79711a646301df694c7b03 Mon Sep 17 00:00:00 2001 +From: Robin Gareus +Date: Mon, 20 Jan 2020 23:08:55 +0100 +Subject: [PATCH 2/8] Update waf to v2.0.19 + +For oe: +* Removed waf: we cannot patch binary files. Recipe ships waf +* tools/misc.py was added from master in previous patch so no adjustment here + +Upstream-Status: Backport [1] + +[1] https://github.com/Ardour/ardour/commit/19603d075f7013453c79711a646301df694c7b03 +--- + doc/updating_waf.txt | 25 +++++++++++------- + tools/autowaf.py | 11 ++++---- + tools/waf-str.patch | 11 ++++++++ + 4 files changed, 31 insertions(+), 77 deletions(-) + create mode 100644 tools/waf-str.patch + +diff --git a/doc/updating_waf.txt b/doc/updating_waf.txt +index 69c1225d63..0c192d4489 100644 +--- a/doc/updating_waf.txt ++++ b/doc/updating_waf.txt +@@ -1,15 +1,20 @@ +-Download waf (https://waf.io/) +- +-autowaf.py is present in the tools directory of the Ardour source code. +-a patch for C++11/clang can be found in tools/waflib.patch (needed for waf 1.8.19) +- +-Current waf is build as follows; ++# Download waf (https://waf.io/) ++# ++# autowaf.py and misc.py are present in the tools directory of the Ardour source code. ++# - waf-str.patch is needed for py2/py3 compatible install_dir: ++# * in py2 paths are byte-arrays and would need to be converted using .encode("utf-8") ++# (otherwise waf expands them /t/o/p/a/t/h/s/l/i/k/e/t/h/i/s) ++# * however py3 cannot handled encoded arrays: ++# (TypeError: cannot use a string pattern on a bytes-like object) ++# ++# Current waf is build as follows: + + ARDOURSRC=`pwd` + cd /tmp +-curl https://waf.io/waf-1.6.11.tar.bz2 | tar xj +-cd waf-1.6.11 ++curl https://waf.io/waf-2.0.19.tar.bz2 | tar xj ++cd waf-2.0.19 ++ ++patch -p1 < $ARDOURSRC/tools/waf-str.patch + +-patch -p1 < $ARDOURSRC/tools/waflib.patch +-./waf-light -v --make-waf --tools=misc,doxygen,$ARDOURSRC/tools/autowaf.py --prelude='' ++./waf-light -v --make-waf --tools=misc,doxygen,$ARDOURSRC/tools/autowaf.py,$ARDOURSRC/tools/misc.py --prelude='' + cp ./waf $ARDOURSRC/waf +diff --git a/tools/autowaf.py b/tools/autowaf.py +index f82b80a83f..375dc5909a 100644 +--- a/tools/autowaf.py ++++ b/tools/autowaf.py +@@ -140,14 +140,13 @@ def check_pkg(conf, name, **args): + found = None + pkg_var_name = 'PKG_' + name.replace('-', '_') + pkg_name = name +- if conf.env.PARDEBUG: +- args['mandatory'] = False # Smash mandatory arg +- found = conf.check_cfg(package=pkg_name + 'D', args="--cflags --libs", **args) +- if found: +- pkg_name += 'D' + if mandatory: + args['mandatory'] = True # Unsmash mandatory arg +- if not found: ++ if 'atleast_version' in args: ++ if not 'msg' in args: ++ args['msg'] = 'Checking for %r >= %s' %(pkg_name, args['atleast_version']) ++ found = conf.check_cfg(package=pkg_name, args=[pkg_name + " >= " + args['atleast_version'], '--cflags', '--libs'], **args) ++ else: + found = conf.check_cfg(package=pkg_name, args="--cflags --libs", **args) + if found: + conf.env[pkg_var_name] = pkg_name + +diff --git a/tools/waf-str.patch b/tools/waf-str.patch +new file mode 100644 +index 0000000000..8d37f68d32 +--- /dev/null ++++ b/tools/waf-str.patch +@@ -0,0 +1,11 @@ ++--- a/waflib/Build.py 2020-01-21 15:01:13.864899388 +0100 +++++ b/waflib/Build.py 2020-01-21 15:01:59.573030630 +0100 ++@@ -953,7 +953,7 @@ ++ tsk.link = kw.get('link', '') or kw.get('install_from', '') ++ tsk.relative_trick = kw.get('relative_trick', False) ++ tsk.type = kw['type'] ++- tsk.install_to = tsk.dest = kw['install_to'] +++ tsk.install_to = tsk.dest = str(kw['install_to']) ++ tsk.install_from = kw['install_from'] ++ tsk.relative_base = kw.get('cwd') or kw.get('relative_base', self.path) ++ tsk.install_user = kw.get('install_user') +-- +2.21.0 + diff --git a/recipes-musicians/ardour/ardour5/waf-backport/0003-Change-waf-darwin-default-compiler-to-prefer-gcc-if-.patch b/recipes-musicians/ardour/ardour5/waf-backport/0003-Change-waf-darwin-default-compiler-to-prefer-gcc-if-.patch new file mode 100644 index 0000000..352ee40 --- /dev/null +++ b/recipes-musicians/ardour/ardour5/waf-backport/0003-Change-waf-darwin-default-compiler-to-prefer-gcc-if-.patch @@ -0,0 +1,31 @@ +From 1d2cfd6f2d736144b8c81179126b5850a718f769 Mon Sep 17 00:00:00 2001 +From: Robin Gareus +Date: Tue, 21 Jan 2020 02:23:51 +0100 +Subject: [PATCH 3/8] Change waf/darwin default compiler to prefer gcc (if + available) + +--- + wscript | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/wscript b/wscript +index cb3980ed41..e1beb6a86d 100644 +--- a/wscript ++++ b/wscript +@@ -11,6 +11,13 @@ from waflib.Tools import winres + from waflib.Build import Context + from waflib.Build import BuildContext + ++# Fixup OSX 10.5/10.6 builds ++# prefer gcc, g++ 4.x over ancient clang-1.5 ++from waflib.Tools.compiler_c import c_compiler ++from waflib.Tools.compiler_cxx import cxx_compiler ++c_compiler['darwin'] = ['gcc', 'clang' ] ++cxx_compiler['darwin'] = ['g++', 'clang++' ] ++ + class i18n(BuildContext): + cmd = 'i18n' + fun = 'i18n' +-- +2.21.0 + diff --git a/recipes-musicians/ardour/ardour5/waf-backport/0004-Tweaks-to-build-package-scripts-for-new-waf.patch b/recipes-musicians/ardour/ardour5/waf-backport/0004-Tweaks-to-build-package-scripts-for-new-waf.patch new file mode 100644 index 0000000..023d725 --- /dev/null +++ b/recipes-musicians/ardour/ardour5/waf-backport/0004-Tweaks-to-build-package-scripts-for-new-waf.patch @@ -0,0 +1,128 @@ +From 5a841ef4624ef4b776e578af80d2397241754b00 Mon Sep 17 00:00:00 2001 +From: Robin Gareus +Date: Wed, 22 Jan 2020 00:47:33 +0100 +Subject: [PATCH 5/8] Tweaks to build/package scripts for new waf + +* Windows: delete waf installed .dll.a files +* Windows: override waf's conf.env.LIBDIR = conf.env.BINDIR + with explicit --libdir +* Windows: fix asm (`x86_64-w64-mingw32-as` -D flag is for + debug messages, -D defines are not available) +* Mac: override waf adding -install_name (and + -Wl,-compatibility_version -Wl,-current_version) + by moving -dynamiclib from linkflags to ldflags +* Mac: Allow libs with compat version number suffix + (not needed anymore, but may help in the future) + +Upstream-Status: Backport [1] + +[1] https://github.com/Ardour/ardour/commit/5a841ef4624ef4b776e578af80d2397241754b00 +--- + libs/ardour/wscript | 7 ++++++- + tools/osx_packaging/osx_build | 2 +- + tools/x-win/compile.sh | 3 ++- + tools/x-win/package.sh | 1 + + wscript | 17 +++++++++++++++++ + 5 files changed, 27 insertions(+), 3 deletions(-) + +diff --git a/libs/ardour/wscript b/libs/ardour/wscript +index 8a65daaaf0..a27826953a 100644 +--- a/libs/ardour/wscript ++++ b/libs/ardour/wscript +@@ -1,6 +1,6 @@ + #!/usr/bin/env python + from waflib.extras import autowaf as autowaf +-from waflib import Options ++from waflib import Options, Task, Tools + import os + import sys + import re +@@ -369,6 +369,11 @@ def build(bld): + # micro increment <=> no interface changes + LIBARDOUR_LIB_VERSION = "3.0.0" + ++ # remove '${DEFINES_ST:DEFINES}' from run_str. ++ # x86_64-w64-mingw32-as (mingw) -D flag is for debug messages ++ if bld.env['build_target'] == 'mingw': ++ class asm(Task.classes['asm']): run_str = '${AS} ${ASFLAGS} ${ASMPATH_ST:INCPATHS} ${AS_SRC_F}${SRC} ${AS_TGT_F}${TGT}' ++ + # operate on copy to avoid adding sources twice + sources = list(libardour_sources) + if bld.is_tracks_build(): +diff --git a/tools/osx_packaging/osx_build b/tools/osx_packaging/osx_build +index 2b417b86af..cb681bafd1 100755 +--- a/tools/osx_packaging/osx_build ++++ b/tools/osx_packaging/osx_build +@@ -449,7 +449,7 @@ while [ true ] ; do + strip -u -r -arch all $file &>/dev/null + fi + +- deps=`otool -L $file | awk '{print $1}' | egrep "($GTKSTACK_ROOT|$ARDOURSTACK_ROOT|/opt/|/local/|libs/$STDCPP)" | grep -v 'libjack\.' | grep -v "$(basename $file)"` ++ deps=`otool -L $file | awk '{print $1}' | egrep "($GTKSTACK_ROOT|$ARDOURSTACK_ROOT|/opt/|/local/|libs/$STDCPP)" | grep -v 'libjack\.' | egrep -v "$(basename $file .dylib).*.dylib"` + # echo -n "." + for dep in $deps ; do + base=`basename $dep` +diff --git a/tools/x-win/compile.sh b/tools/x-win/compile.sh +index d778e921b5..4f54f6623d 100755 +--- a/tools/x-win/compile.sh ++++ b/tools/x-win/compile.sh +@@ -79,7 +79,8 @@ LDFLAGS="-L${PREFIX}/lib" ./waf configure \ + --dist-target=mingw \ + --also-include=${PREFIX}/include \ + $ARDOURCFG \ +- --prefix=${PREFIX} ++ --prefix=${PREFIX} \ ++ --libdir=${PREFIX}/lib + ./waf ${CONCURRENCY} + + if [ "$(id -u)" = "0" ]; then +diff --git a/tools/x-win/package.sh b/tools/x-win/package.sh +index bfb7381e41..032c45a192 100755 +--- a/tools/x-win/package.sh ++++ b/tools/x-win/package.sh +@@ -200,6 +200,7 @@ cp gtk2_ardour/icons/cursor_square/* $DESTDIR/share/${LOWERCASE_DIRNAME}/icons/ + # clean build-dir after depoyment + echo " === bundle completed, cleaning up" + ./waf uninstall ++find $DESTDIR -name "*.dll.a" | xargs rm + echo " === complete" + du -sh $DESTDIR + +diff --git a/wscript b/wscript +index d4724ecb72..9fd84bb2ca 100644 +--- a/wscript ++++ b/wscript +@@ -915,6 +915,12 @@ def configure(conf): + conf.env.append_value ('CXXFLAGS', '-DSILENCE_AFTER') + conf.define ('FREEBIE', 1) + ++ # set explicit LIBDIR, otherwise mingw/windows builds use ++ # conf.env.LIBDIR = conf.env.BINDIR and `waf install` fails ++ # because $BINDIR/ardour6 is the main binary, and $LIBDIR/ardour6/ a directory ++ if Options.options.libdir: ++ conf.env.LIBDIR = Options.options.libdir ++ + if Options.options.lv2dir: + conf.env['LV2DIR'] = Options.options.lv2dir + else: +@@ -1247,6 +1253,17 @@ int main () { return 0; } + # Fix utterly braindead FLAC include path to not smash assert.h + conf.env['INCLUDES_FLAC'] = [] + ++ if sys.platform == 'darwin': ++ # override waf's -install_name added in ++ # waflib/Tools/ccroot.py when -dynamiclib is used ++ if conf.env.LINKFLAGS_cshlib: ++ conf.env.LINKFLAGS_cshlib = []; ++ conf.env.LDFLAGS_cshlib = ['-dynamiclib'] ++ ++ if conf.env.LINKFLAGS_cxxshlib: ++ conf.env.LINKFLAGS_cxxshlib = []; ++ conf.env.LDFLAGS_cxxshlib = ['-dynamiclib'] ++ + config_text = open('libs/ardour/config_text.cc', "w") + config_text.write('''#include "ardour/ardour.h" + namespace ARDOUR { +-- +2.21.0 + diff --git a/recipes-musicians/ardour/ardour5/waf-backport/0005-Downgrade-using-all-channels-warning-to-info-part-2.patch b/recipes-musicians/ardour/ardour5/waf-backport/0005-Downgrade-using-all-channels-warning-to-info-part-2.patch new file mode 100644 index 0000000..4e6a4a2 --- /dev/null +++ b/recipes-musicians/ardour/ardour5/waf-backport/0005-Downgrade-using-all-channels-warning-to-info-part-2.patch @@ -0,0 +1,25 @@ +From 7c381dab6e0977f61f9bbd08bd1d20f0fe2abcf6 Mon Sep 17 00:00:00 2001 +From: Robin Gareus +Date: Sat, 25 Jan 2020 04:17:53 +0100 +Subject: [PATCH 6/8] Downgrade "using all channels" warning to info - part 2 + +--- + libs/backends/alsa/alsa_audiobackend.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libs/backends/alsa/alsa_audiobackend.cc b/libs/backends/alsa/alsa_audiobackend.cc +index 6b044f9fd0..357b00c044 100644 +--- a/libs/backends/alsa/alsa_audiobackend.cc ++++ b/libs/backends/alsa/alsa_audiobackend.cc +@@ -883,7 +883,7 @@ AlsaAudioBackend::_start (bool for_latency_measurement) + } else { + _n_outputs = std::min (_n_outputs, _pcmi->nplay ()); + } +- PBD::warning << _("AlsaAudioBackend: adjusted output channel count to match device.") << endmsg; ++ PBD::info << _("AlsaAudioBackend: adjusted output channel count to match device.") << endmsg; + } + + if (_n_inputs != _pcmi->ncapt ()) { +-- +2.21.0 + diff --git a/recipes-musicians/ardour/ardour5/waf-backport/0006-Update-waf2.x-subst-feature-uses-obj-attributes.patch b/recipes-musicians/ardour/ardour5/waf-backport/0006-Update-waf2.x-subst-feature-uses-obj-attributes.patch new file mode 100644 index 0000000..332492b --- /dev/null +++ b/recipes-musicians/ardour/ardour5/waf-backport/0006-Update-waf2.x-subst-feature-uses-obj-attributes.patch @@ -0,0 +1,114 @@ +From 4fe30364951ea46b93e3c93acbaf2f777343d131 Mon Sep 17 00:00:00 2001 +From: Robin Gareus +Date: Sat, 25 Jan 2020 06:20:16 +0100 +Subject: [PATCH 7/8] Update waf2.x "subst" feature uses obj attributes + +Upstrem-Status: Backport [1] + +[1] https://github.com/Ardour/ardour/commit/4fe30364951ea46b93e3c93acbaf2f777343d131 +--- + libs/fst/wscript | 4 +--- + libs/plugins/a-comp.lv2/wscript | 2 +- + libs/plugins/a-delay.lv2/wscript | 2 +- + libs/plugins/a-eq.lv2/wscript | 2 +- + libs/plugins/a-fluidsynth.lv2/wscript | 2 +- + libs/plugins/a-reverb.lv2/wscript | 2 +- + libs/plugins/reasonablesynth.lv2/wscript | 2 +- + 7 files changed, 7 insertions(+), 9 deletions(-) + +diff --git a/libs/fst/wscript b/libs/fst/wscript +index ca90b7207d..bbac8d6f27 100644 +--- a/libs/fst/wscript ++++ b/libs/fst/wscript +@@ -52,9 +52,7 @@ def build(bld): + obj.target = 'ardour-vst-scanner' + obj.chmod = Utils.O755 + obj.install_path = os.path.join(bld.env['LIBDIR']) +- obj.dict = { +- 'VERSION' : bld.env['VERSION'], +- } ++ obj.VERSION = bld.env['VERSION'] + + obj = bld (features = 'c cxx cxxprogram wine') + obj.source = ( +diff --git a/libs/plugins/a-comp.lv2/wscript b/libs/plugins/a-comp.lv2/wscript +index 99d7bb03f1..00099cb564 100644 +--- a/libs/plugins/a-comp.lv2/wscript ++++ b/libs/plugins/a-comp.lv2/wscript +@@ -34,7 +34,7 @@ def build(bld): + obj.target = '../../LV2/%s/%s' % (bundle, i) + obj.install_path = '${LV2DIR}/%s' % bundle + obj.chmod = Utils.O644 +- obj.dict = {'LIB_EXT': module_ext} ++ obj.LIB_EXT = module_ext + + # Build plugin library + obj = bld(features = 'c cshlib', +diff --git a/libs/plugins/a-delay.lv2/wscript b/libs/plugins/a-delay.lv2/wscript +index 2af05ff137..c28d7cabcf 100644 +--- a/libs/plugins/a-delay.lv2/wscript ++++ b/libs/plugins/a-delay.lv2/wscript +@@ -33,7 +33,7 @@ def build(bld): + obj.target = '../../LV2/%s/%s' % (bundle, i) + obj.install_path = '${LV2DIR}/%s' % bundle + obj.chmod = Utils.O644 +- obj.dict = {'LIB_EXT': module_ext} ++ obj.LIB_EXT = module_ext + + # Build plugin library + obj = bld(features = 'c cshlib', +diff --git a/libs/plugins/a-eq.lv2/wscript b/libs/plugins/a-eq.lv2/wscript +index e36a804f7f..6f380aa232 100644 +--- a/libs/plugins/a-eq.lv2/wscript ++++ b/libs/plugins/a-eq.lv2/wscript +@@ -33,7 +33,7 @@ def build(bld): + obj.target = '../../LV2/%s/%s' % (bundle, i) + obj.install_path = '${LV2DIR}/%s' % bundle + obj.chmod = Utils.O644 +- obj.dict = {'LIB_EXT': module_ext} ++ obj.LIB_EXT = module_ext + + # Build plugin library + obj = bld(features = 'c cshlib', +diff --git a/libs/plugins/a-fluidsynth.lv2/wscript b/libs/plugins/a-fluidsynth.lv2/wscript +index 3a093259d6..681ad1f489 100644 +--- a/libs/plugins/a-fluidsynth.lv2/wscript ++++ b/libs/plugins/a-fluidsynth.lv2/wscript +@@ -32,7 +32,7 @@ def build(bld): + obj.target = '../../LV2/%s/%s' % (bundle, i) + obj.install_path = '${LV2DIR}/%s' % bundle + obj.chmod = Utils.O644 +- obj.dict = {'LIB_EXT': module_ext} ++ obj.LIB_EXT = module_ext + + # Build plugin library + obj = bld(features = 'cxx cshlib', +diff --git a/libs/plugins/a-reverb.lv2/wscript b/libs/plugins/a-reverb.lv2/wscript +index 3eb5ce10bc..a11e2cf7af 100644 +--- a/libs/plugins/a-reverb.lv2/wscript ++++ b/libs/plugins/a-reverb.lv2/wscript +@@ -32,7 +32,7 @@ def build(bld): + obj.target = '../../LV2/%s/%s' % (bundle, i) + obj.install_path = '${LV2DIR}/%s' % bundle + obj.chmod = Utils.O644 +- obj.dict = {'LIB_EXT': module_ext} ++ obj.LIB_EXT = module_ext + + # Build plugin library + obj = bld(features = 'c cshlib', +diff --git a/libs/plugins/reasonablesynth.lv2/wscript b/libs/plugins/reasonablesynth.lv2/wscript +index 0eb5c55a04..ee54ce8bee 100644 +--- a/libs/plugins/reasonablesynth.lv2/wscript ++++ b/libs/plugins/reasonablesynth.lv2/wscript +@@ -32,7 +32,7 @@ def build(bld): + obj.target = '../../LV2/%s/%s' % (bundle, i) + obj.install_path = '${LV2DIR}/%s' % bundle + obj.chmod = Utils.O644 +- obj.dict = {'LIB_EXT': module_ext} ++ obj.LIB_EXT = module_ext + + # Build plugin library + obj = bld(features = 'c cshlib', +-- +2.21.0 + diff --git a/recipes-musicians/ardour/ardour5/waf-backport/0007-a-comp.lv2-wscript-sync-to-master.patch b/recipes-musicians/ardour/ardour5/waf-backport/0007-a-comp.lv2-wscript-sync-to-master.patch new file mode 100644 index 0000000..0e41115 --- /dev/null +++ b/recipes-musicians/ardour/ardour5/waf-backport/0007-a-comp.lv2-wscript-sync-to-master.patch @@ -0,0 +1,55 @@ +From cf71cc33c44d25a5483ef3ed4ea994f845e0f9b8 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Andreas=20M=C3=BCller?= +Date: Sat, 25 Jan 2020 17:20:39 +0100 +Subject: [PATCH] a-comp.lv2/wscript: sync to master +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Upstream-Status: Backport + +Signed-off-by: Andreas Müller +--- + libs/plugins/a-comp.lv2/wscript | 12 +++++------- + 1 file changed, 5 insertions(+), 7 deletions(-) + +diff --git a/libs/plugins/a-comp.lv2/wscript b/libs/plugins/a-comp.lv2/wscript +index 00099cb564..c739e4bea7 100644 +--- a/libs/plugins/a-comp.lv2/wscript ++++ b/libs/plugins/a-comp.lv2/wscript +@@ -15,10 +15,9 @@ def options(opt): + def configure(conf): + conf.load('compiler_c') + autowaf.configure(conf) +- if Options.options.lv2: +- autowaf.check_pkg(conf, 'lv2', atleast_version='1.0.0', +- uselib_store='LV2_1_0_0') +- autowaf.check_pkg(conf, 'cairo', uselib_store='CAIRO', atleast_version='1.12.0') ++ autowaf.check_pkg(conf, 'lv2', atleast_version='1.0.0', ++ uselib_store='LV2_1_0_0') ++ autowaf.check_pkg(conf, 'cairo', uselib_store='CAIRO', atleast_version='1.12.0') + + def build(bld): + bundle = 'a-comp.lv2' +@@ -28,7 +27,6 @@ def build(bld): + if bld.is_defined('HAVE_LV2'): + # Build RDF files + for i in ['manifest.ttl', 'a-comp.ttl', 'a-comp#stereo.ttl', 'presets.ttl']: +- bld(features = 'subst', + obj = bld(features='subst') + obj.source = i + '.in' + obj.target = '../../LV2/%s/%s' % (bundle, i) +@@ -40,8 +38,8 @@ def build(bld): + obj = bld(features = 'c cshlib', + source = 'a-comp.c', + name = 'a-comp', +- cflags = [ '-fPIC', bld.env['compiler_flags_dict']['c99'] ], +- includes = [ '../../ardour' ], ++ cflags = [ bld.env['compiler_flags_dict']['pic'], bld.env['compiler_flags_dict']['c99'] ], ++ includes = [ '../../ardour', '../shared' ], + target = '../../LV2/%s/a-comp' % bundle, + install_path = '${LV2DIR}/%s' % bundle, + uselib = 'CAIRO', +-- +2.21.0 + diff --git a/recipes-musicians/ardour/ardour5/waf-backport/waf b/recipes-musicians/ardour/ardour5/waf-backport/waf new file mode 100755 index 0000000..da7d344 --- /dev/null +++ b/recipes-musicians/ardour/ardour5/waf-backport/waf @@ -0,0 +1,172 @@ +#!/usr/bin/env python +# encoding: latin-1 +# Thomas Nagy, 2005-2018 +# +""" +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +""" + +import os, sys, inspect + +VERSION="2.0.19" +REVISION="1216edef773cb93a573c0abd4d9bece5" +GIT="x" +INSTALL='' +C1='#,' +C2='#*' +C3='#&' +cwd = os.getcwd() +join = os.path.join + + +WAF='waf' +def b(x): + return x +if sys.hexversion>0x300000f: + WAF='waf3' + def b(x): + return x.encode() + +def err(m): + print(('\033[91mError: %s\033[0m' % m)) + sys.exit(1) + +def unpack_wafdir(dir, src): + f = open(src,'rb') + c = 'corrupt archive (%d)' + while 1: + line = f.readline() + if not line: err('run waf-light from a folder containing waflib') + if line == b('#==>\n'): + txt = f.readline() + if not txt: err(c % 1) + if f.readline() != b('#<==\n'): err(c % 2) + break + if not txt: err(c % 3) + txt = txt[1:-1].replace(b(C1), b('\n')).replace(b(C2), b('\r')).replace(b(C3), b('\x00')) + + import shutil, tarfile + try: shutil.rmtree(dir) + except OSError: pass + try: + for x in ('Tools', 'extras'): + os.makedirs(join(dir, 'waflib', x)) + except OSError: + err("Cannot unpack waf lib into %s\nMove waf in a writable directory" % dir) + + os.chdir(dir) + tmp = 't.bz2' + t = open(tmp,'wb') + try: t.write(txt) + finally: t.close() + + try: + t = tarfile.open(tmp) + except: + try: + os.system('bunzip2 t.bz2') + t = tarfile.open('t') + tmp = 't' + except: + os.chdir(cwd) + try: shutil.rmtree(dir) + except OSError: pass + err("Waf cannot be unpacked, check that bzip2 support is present") + + try: + for x in t: t.extract(x) + finally: + t.close() + + for x in ('Tools', 'extras'): + os.chmod(join('waflib',x), 493) + + if sys.hexversion<0x300000f: + sys.path = [join(dir, 'waflib')] + sys.path + import fixpy2 + fixpy2.fixdir(dir) + + os.remove(tmp) + os.chdir(cwd) + + try: dir = unicode(dir, 'mbcs') + except: pass + try: + from ctypes import windll + windll.kernel32.SetFileAttributesW(dir, 2) + except: + pass + +def test(dir): + try: + os.stat(join(dir, 'waflib')) + return os.path.abspath(dir) + except OSError: + pass + +def find_lib(): + src = os.path.abspath(inspect.getfile(inspect.getmodule(err))) + base, name = os.path.split(src) + + #devs use $WAFDIR + w=test(os.environ.get('WAFDIR', '')) + if w: return w + + #waf-light + if name.endswith('waf-light'): + w = test(base) + if w: return w + for dir in sys.path: + if test(dir): + return dir + err('waf-light requires waflib -> export WAFDIR=/folder') + + dirname = '%s-%s-%s' % (WAF, VERSION, REVISION) + for i in (INSTALL,'/usr','/usr/local','/opt'): + w = test(i + '/lib/' + dirname) + if w: return w + + #waf-local + dir = join(base, (sys.platform != 'win32' and '.' or '') + dirname) + w = test(dir) + if w: return w + + #unpack + unpack_wafdir(dir, src) + return dir + +wafdir = find_lib() +sys.path.insert(0, wafdir) + +if __name__ == '__main__': + + from waflib import Scripting + Scripting.waf_entry_point(cwd, VERSION, wafdir) + +#==> +#BZh91AY&SY2م DPm(¬#&00e(b5#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&q˵*X@뤪Ihjm6eAeNCw>\޷f/v}NҎJT]nLwqod;z{̯zQ޸¯5Sb#*nI]վmCyأ==n{޵$YwzKsQ|O6_N,{WuX#`#,׭٭slVGuUۮݞۇ$]yBJv4b=h鷌n`}>{Z)@#&*L,h ;*9#&5뷻7.wo{g>mǭ=#&}c#Jٷ׏gϻt͝wVv%vM{}yw۹pgxvݶC7\v=>1ok5Xn ׯynσୗ%V'٩{>^iLqgvKurF=O^ǫ+#&;o'ov<+f#&J*js9;}nswJWۨډ]vj{x{Jwe4; {;#&v#&#&=8]::-fmƌnӮ:j{R <-_#xG7%^JZݪ;Y%#*z8>55϶3c=㭷ֻqixݸzг!P6ؚ=w}d_ifAVqzT[y\/ouUϽ0ꪪ}{7>258uw.xo{qݵwz}M@u5#&2Bn3F!wvt`vo^g}>"v`ɦ32qe]}=d'_p>-}yt7ƾ>#*4@#&@#&@#&FF2#*&!Fz#i#*hhzjlA)A@ 1ɒx$ 24#*#*#&#&#&#&#&  'ښ~4Si?Ty!#&#&#&#&#&Ih51=#*#BdQyG5#&6#&4h#&#&#*#&#&#&@ @A14#&)F#* =OP=A#&2z& #&&O5=S{SzQM&h#&#*#&#&#&|:եOj_jf5N#&$J#,1!}} d\1\Y1U43XBk?> ,rCzAm)mpEsI-fDRwǓ.<95/RM;1׬:4|C U"# T#,PH**#,x#,TEQDQ(A WIYBD "Q@*#&DB$DlAO#,XAR#,uNbWړVUZS2d,fji j5Pc (ҊmęX3%EFCTjB3IdLFh(h&#,@#,ƥ #*1T@L"dmDPYiM+D,LHLbFѵ&I "f2P&41cSM-kfbK&Bh0em6i (Ii-6efb(J5&)j!#hD*,+MXؤHңT1F!#, hdFIR&B4B2HR24F#K%QF4X0!BEJiRdQI&LH*J4($@[ 3cF"Q3)YcY!iflbM5#&ea"IIh"M$ IT&lD!$# )%&flX(jHBZSd dY- "2E%e2#clL& M1$#JPlX#*#*4бJdR$Ȧb XZikI52( j0iE!SKMj0#*%Y),dĨјLlIL6e E&c$h"$LeLYJ[d5#1#*3cB*HIM1ѓSH,FRe&f,ja5DjRi!4J)4bBdE1e$)DQbD(Shj4412M2&h`0LcLYJb,!5fʍdI#*%2-"U#,DŢ#4ɢڔҀ#&H4$̤D&b"4YLa A)2"H6ڕH̡-3c)IJIԦE2ʛ4EHb2#HJm~^ԈJD1EحD6*6HhJѡ*5&k"3Eٖc(R$[4h06mbRlQHZ2iKllŅR#,iLZM`٫bSe,5JSfc2U6cEm,ɦk$2md6RcaZ,FHڋZC0VEVJmEbTFM"XEC-X I iR Y&B$Ҵ 4m1-RAm$T,T2)hdbB%5 6,[R6K4jdEK"e5MM& hILaL&d+Eb H44&"őB"Dm!fj QC%i+$ɓE&bMdEf)LġiZ-2BdefbƲfSLdLcE& ,#* %5(S","œH!5FeI%!HHI1%,LQh!(3i4Y+"E%bYƤE֌CF)6ce+2$d# LR#*16$5&PĚ%4!IMa)PS6ĖKFi-F,L4%IdFfbRbHHl0D2l`4bɢIS1RBAh[ QQc2i0 id(6(PVid3(Q لh+M KQAb #dIXAR6JƔ,hKELU1b2-(5&%"f±d`3%2JZh4Tȱd(KQki(SlmCD%)R cdd&#m&f-f@BM6eLE--I4,QAQDZJŲX1h&#,ILcEFImJ6m-ATjJ,R)2)5"LFl6QT6TVJЛR-DlQ$UE3UX[cԙ҈K54ڈl-YFlDM,ʒ,F,LV,Ih5FLhرm1315QE!(I6*ضŦj1eRɶ jM5bh(њ+$aԚ3e@$Im)~ M^#*kٖѭ FRes\hl6v7iƛ`FJQnQ"kqe3hN0`A, H܃~?or3A^2c<3Ȗ10Mnpzh(x=؆ql-L%)ٖU\vCdPۓcYӗ+U##1$vl:Dd;#b l)"~$|;\[ݽK`RRIL$7n(WHcZ% [tTb2c0h6H+ݧ||,? n#,,#,-y4xIlFt[;/Lւv"a6"%^?Eҽ[R#,GI)үvc `P„ [?c<3eslAG[ڗTjꋈMˢ)ͺY#*E\ۧllOu-"S59JE }NJe*}8s:t y2FmӲ!B؉.R,jAp 9s{w\A\t\F]wH"LEWz J(#,AТE- .T#,(ZL~i[v_G2ІݛBꑊ5Fwt:)03&)|z뢦{ߩW5%j0pT(TDѧD/8Br#ʥc}k#*m_ÊZdokOד~6L3[,AX_!cRR|;+A(e#*$S FqRdJrܴ[^^"Rܱh-׻*}{=om%}mAt EEڏe!yi*bL%+BkfoJSY~.-_rC#*Ӆ$H#*B/mV()Jsm"w$5^LxlS(E%ZR+­doV.5 fX1I#,p(Mj!iIINb WaGE;F-iy0TAT!Z-i3 Dy ktt4(N33xy0Ƹk7j"z(/LߛF|iNdM{,0ãfaVX8aA0*03S}}n H1i}`kҡM]UN)ET7Kj0N#,)}Gg<~Y~Jj2Cy2B(6gAnCMϚvA8Gv+5.vB:#H0cvʝj7bj(x.lD*9<{DD:mhůGĺc_JuBƔMd-XF{X ɪw{ IhjͬQP7߁#u==tq::_DC./̕~g3|FVhČ Z=v1%H h+qơUa|&R3˾vT7JaUwڙv>0皡?x!uw!#4hi:#/숡V (.tM\-yՈp'#0#+GSr .nff?4.)ϳڗqұ{nޝMVק#,AŅ,7#XֵABV&_2[m=..5vchrQmkGw1Ys5oM@6N( O~WZ|5 t~y466Qg8>3&7gkFFNM-; amƷmh<8fK"8/Oeiͼ#G[9}25n/!(7c/+~v~H #*C'5)R׮7 (S#*nZhZZ]aj*iNOúɧwam~UvߩxI#*ȾR/XgnoRG֨JLIvݶ;1(*Ҫ3FuWRj]J EVj k丹~9hFKY12Hi«nu4#*L5{~֜OʎCWɋ8H>$` _Ts]#*uΨj좑Q_Ҙnn>*/5`")F]5iMoP 0D3<Φ[SrJ29#*wdl[WGv$3+CmjG5G#QY/N#"m#ŏ>U9B PŢ˕gD֏MHe(+vteFW=u/~.St/uLMPeC$(B+fі+I r2`(sVd}rdSzoLnjP>x>c#,:UpC:]҂1#&#,@5 cU#,tZceICռG[ln㥩Gq`L/S>j*`aƤCi$~r9CmuVF{(OG׹Qz޲)ό-L\//EkZ=?^-)Ť~h.<E Ytk< SZz?Z-]8|&PQfuuWɧuvw7ʼ=&λ^0W6}=#*(fTbPfrIbcT =L QiSfymFBkn[vXx34w{TR-$*UIo?WDaԨ/킃;xc0f ߴ|kw-v>&9FRU99P[P'#, KoI°(q ҋMU#*H\#,&_GbrlA>b1ʀ,oQa6S@] "V n wzvq<08C+,2SF??.QeϓZoFRtsi5`e=2tg/V^Ql+{#eJciovmw&G:`-vF~bq)se ~J;RQU[iyz;%D;XNI9(@&Wa9`Y*\QqM<ŜUUq`, 0ШގƘ ϖlz5CЈl24}Ϧ.-u QsخʝOyF-Uȳ@#*XIԲ?c4(sN1^ +N[>k!7LD|57EZgJOiqCptF!ߤQljDC)VRh`oP7.֣.ߒ%ψU6E,WѤf{WÆI>h_cG9[)#nH솬!d#,V#, 纸3T)׾C1E;+Z#*#*'ock 6#UBph RmZT\8#,WsJF̚~(ɢ:B&$(:Ps>"DCLaGTx t˵oNE.}a+ Rg2bL9@V5V4̲ps#,.YSjPk}ѪuNwg cf7@GeP)B*u:!),3m|0tx^E'vbI|B=#&DH*jq}FRyϞNQȩ6Vbqa/M80z-A'{ceϋIO%t1@F@Q/=}3dtH!(nKy 3: U #*e8JvPogЁv4#,MM@O1ǦpX#,} o䣦p͚VDX:9 ӯL}Dm`2kvX%޽|a;Y?C\БtC#,<%.yܰȾݍ#&#*_df@i[x[pG>kwEKSwsQ)"RV˯f:%%F@,W\$/okMȔYԩD$89\֑J@"k6ou)HlHv e_k0wO#*b.ϝmr䵮sku8{[>Kr##`N(uE`x@LņHpͯ `+iv~ ݃IJ.wp}``oprrsdo `$w}z8x뮨K$HrSlnGn_} ?O8ק꣤]#*۫X!6Q#)V`}\RdJ̟g5+ I*$9z~uƽp8!Qj kf!GT5}#*xaz#ˌQ:\n{JQlbvmȀ~<ɠΉA]X_qt~kuFN{%AZ{ C6KZkow(zP, tTb#*9ԈQԶJ>#*YC#*{pĦYn1*K9}Z偨 7.O<_qdA>`^$Jrh|PS`#&u`ծXm;1b(HǙ kJ @Iy?#&А5^h"Kfr60qoӁM79Dy-I]:\eN(JZ#&ƻ*ru||ㅁ Q~qTѲ6:sWvu9c.gՒA%T}qD(I#*Ww^oG`L0vATWlhGmGXձd'AM5ʈrKxwD8(o0p^7D*;u훍 N?It9κԭ7U =w[Lb )$د)yy ,̻%93O ]_k̀:zک҆&*F˾^`832(RFV9Mlhc9lyazyWcZ$|4I3ŽtGQؔۜGK`,d>R0[˴bOz4>n\ptC、Ir34wZ l3MHPo]LbU -dq@!U(ѹJ@]h~XƑЛh5iR0^Wꀳ|H#Y~|+ɩӡ\H#&1:{4VYÇ8{FAp&xޜӍL4y3=uO;&)=6Pq MxL1o{$l(Ȓ(y) hEr(ބV_XsǬ)^VzSn1}CpzrU?,3u#,Y VP;(FsP]5eR#+ryV6sB{#,c+<|j(\,pA#]}i|MK19(37go @#,v‡htv>#*af4KH@BaK+ʶ b|`2LP"=gsYd3"?=sc=#*A`ԎB(blmrܐ NJ5:ZM"&iۦjM"=*cpVc#m+3siwۭSBk ~8BK)ᮼ Fmc"b*>yƵiθxx֋o8~_MM*͜x$$H*Atm#3j0Q΀PXCo9!LjVA0AhK̃ ~6wnxSQ޺O E)=#,v gat';-[)K3}@BJ>;ib:#,iI %Xj .kKSVBF-s$d:{(὇!m:1Nc^~o۾LzPƆ2TPP{FVlfB(QUF N% k#*ytY߶J=#Z0><#CB ŋ5dzotKhx:^#,ayB)z#Xڗmty^ a,f{DR+:ǫGLbk#ulDG#,Seo(Q/^h`Q#*w5K}^Ie3Ij|Yt};sogvsF./񌈍er6Z+EqA[JX[^(Pc"-*f!ݮ<˵i37H-͒"~D{V#*@lSj+QeU Yp1V45ۂŶa``:[5$Z|w2pqcXَVth I#j+V,(Oj𮯃yA`TG+fh$dM$5k=Ex2c88j^xLpT9%\E#&U#,@Z#*^2d*ꂞnmde  ^X׷DsJ8Xv<_)R" G2~7jϗl`pUv[:_J[ȠplLGSI K RdύȎihoYQgw#,o-3emln6G@ɕS!;NJdn0*TeSX±FEBFD`#*# BLP]ed 00$ zqƃ]X˳Z+[sF*KtWԯ="#4bAd1FK`(a!uRjVǨG. bY8u#,) *B#&YN6Js`3Iz{fB7Bw-]{/e@MΜU:>r*6ښ\#&!#&a:q2"om墸ׯrp`X`cXr DZ&Po?{`[pGl/K۠;}#,/f)ͫxSxM%#&HHv2#.#,eKE)MYR7dcF0ky.[Z9 îIqJx-KI4#*hrb3xE6>uW%D5aDx(iXsYg~r#,QF,s`tx \)p!l>Jt0y@ eR/cAD=_QR5=WT쿐ƯөόI%#*WKqp?XfIy]p892m$C%q#mR]=#)s9o|kZ+IfvXQkObX0D Oqg=/ǟӈ焐0+Ht#7)ʿ(an>9114`a`˜&xV@F) CP0d 6Jd ::a#* ul#*d)cQG#* t.jA6"r\`D4E.c|#boDR(q@CLۨMlL%ڴ6$a)eCSJ "[2W;mt<*-"H-gHLjE#*:ks;3ÄuphMuC$K: m;#or1Ĥ#,E=1LUP_W#,Cj#MK.һX4p#]X<-u,lFۛD2l1۪G0,pˣbĔ '}Y=?lS#~HXOC nAr)Ze0GEd~H\&!>.ꚛ|{(˥Oo*7{js<֔*Na)dz^?% !9#&#,?.vY0I\a\_#,bZ $DnvF n$|aӵo O62kF-krMkrtM%"11@[!f-w ]/R9!q{x?sށusj u#*~rsxZ~#* ƝIV+H{BγC>o68&\?yeJbW +֚޺5x.@(.F1H%նؚ}x8L!T$]o I}բ:#,3Ad6#&,ia&&F[(`)9!OPe**HɵRU #&?Z{vPLVp#EqPy3VBЏV#, 7?=vC?"}$?MfɧRd_ĥ)h: BY/buΟO ҬCwDIas̲=<Ā>{㌓aq5 >b5||"fӟ0^%Ϲ^})f#,h 8"]djG!JLH? Te r'؇pr:WwEkEdL#*m䮦7u#JPȜ#,Stg@#Kbk|r|| C}HأX#*u?Oz8?V]6~fXm)wf#&̱Kaй‰f7n\/ oiZ_exp#Wkz44/]n2,gx Mj;)qB醯sJ'#,7.S^n0\v818m;]T%} -ۯ͈=_ۯq3׭잮Σ^c"01:=^ G#&$MI{uW>{)1`9㗿Dt)(:GLǟ e 7tNuA rJvZ}OEe]> sQݾaܽx>?v"jڸ<-VûY7K/Wp“юC~-/:l-ӿc!Ò{t1ǔq!=@tB(cRu+z_Vw#]x7-Tr2[*l143ٶ9-IpohOMG?䢄z[M:_r`ۍo"?H~7n8x] %Nq#cۨr~puoJ,@)\Ž?MfCr_wut9FUt~vp#&}OLiOeu~M@-N99`V ?3W'#,uF~(#,؉0DHo#*E4=/ o70PoX܎=ܫ߾|+2dI|/4$qSު1p_wױ#*Ϗ_̒$K> :-V@cNf g}]}2[dRB]t:?"Lt+ALDҽ:x;ḽ:n4cHfK8=H_Q2䣈|3$!K A7kBZnu螯 h_ IwCltA`2f?ejy z2#,iiw1٣f1oTy>lYn7KJZF{n;>wZ })#,ʻjo`-*A Z7~cƬw$nq,0dt6H35 ebpLM"riƽA[}γL$ZU7/21]%;s^<>f4Wl`@i>7m lC6XqOf#*VȮݶRĀ05&w0Tc rq#j ( 9ҐiHa(Ӥ#,ߪ<;-gd0zYhv׳)R܇S**3cc32|ܩmqL41qJgma;]΢y}->5&i[7zaZ$#,!TN{cV[1ߞr}u̱ݢU{(h9(`cĒ#&Zf3~J*dG޾7QNYV^-{ #&?;/i*]oω"_X~!\iD i24#*h)?\cfѥPmR8<RIl@Fhs UiAQQ;?ťqRj̳5Q(D"D#)lv( X0$ Պ&B)cAEKiDh0fG|)#* ?=+WWMÓ@rH- hiV֎1__4S7+vz>4Ӈ`ۏl27ʗ!T#*j0V xٳ_m6~f/@*?LKhCoqP"ۆD8Zv>F/PU_ l>j펁Îh xp 'ނ$:]Q{;%A8qp T-91g#*yCdIjr8g]'5.&5n{&~~x|u]Ě1l@L/ wA:#,b#d }*beޜ18^f+qUmRC#1Jw} iCC(]x!O`e/IOCW $='4?O_@u#*$!p%tˑ#*rl$A@nt;ܿ?C{(mH:8Ε#* FE O3M#,gprP]`1ʦ*IHK#,um4Nicj례p"<~_-8~GqhB?KPͪa(UjnAX_l~o6/.H7bUG_|=cyZAVF3x:L#,#&J$XF3ծ,=2"cDO~ {(BA1dhY63US& zHa1VﺥXa!Z#y# tfh*0bdE#,w4MqixУL+ݰFcZӣ+ AӐٱXT7lFY]ۜ (Mux :#>5QY!̭ t!p#)XdLK(Ԁؠ63䡡hrʖ=)h]uiNi:vMՀ 6҅QǪ4h9iEo8k2E#,[(g@nePOlջnv8f~x0L(:qQY7J#&B 6]!rNs˖"LaQ'ge703  #_) $ro> O>N]IԄ#,w9]'Y ADFXYmaiUSUD qnǻb"5#\\axqiF4S>},Y!:R6TfV5[ KsBi%~rn2á,\GxF`CTW`xi"w =Fqm#,'eGuR:ޚaTg]Хq rWj^^%9`i9/T|BQǝҦm4}BP'&3#,&Nx[ fOLϺ+-ȋ"9,߲;x|i]fn$1 C2SsqZG8"ub<\zJj8BQ]O#,Δ/y\\#,q[bgw=2d?L*mӷ5bF2n-E8u_Cçw/+#,nj_lDiby>?=jeB|'mЍ3k!u#o14 iwSEG89lh6IG99A ^1-1Pbpaۉ7#*]rnҼYVmʡQ 5-aȎtATTP܈x#,ac Lgp{گF!`smwǼ.UF%K,9183xBtz$p+Zn-.:p h5BLQ~;WjuS]㺳}P^LpC)DR  $kFC,wS..M/GgnnӪOdpY0]iK4pm?q%xtFRmnXÈ8wKNtI;z8#,~|ek"2"c:7QB\ZGmvk3wAgm^BKzܻԐ> }nPl[n &ѐc :1pѣ>/fxw_\ֈ3!E d P Owwv_ն!3 < B 5l[VvZsuqN=~I#&Ó#* ,n#*q5Q$f~#*&Ȗ=?Ŀk0y#,O=ɽ1N:%kUO<#&g?]bD%GĭNLQ(xMlbn FHSC8Ƞ??3S/?i4SpqwvwX_ ep(Dt2I0.z8~JIAf; ~#Iv3G+wYS@nG%t#=X"{.xN5YL#,Zq4ԤleEulfNCxi?KK\ADcHJz3rPjq']ux~WALCaMt^Gc.atA EDu?t uΌ~{bG7&a$Ǣfse[^ßL ԅ?MrU<Ɏ{td5]GY$M[ \>5̄0f縅 #*{Su!cA/4!^J}({x{=5#,@z}}#QET <ό}ļ~" n&)O+p#*gI\[v\):|. 3:v`zfX.0o%uxzu4K":봒vͥU~]|jx#o~#&l \ƤxQu87KtϜ8jmce&@׃;ZɾQǃ\ѧ} m'لRuz>9NV𰐁C:"AsxDw!b^.p$EKS?En^ bI6KeS,<+ұʒs$sC$%CHa$yx/kLټU-Ǚj%EŞa4FR3#,+rNC2_d==m{UFsDS%/[tx/#,MCnM&rZ;qó&";"muy.F*(̣M\#*GkŦ壏Dxn#,(~eڑI/ԏzcH8+4L=Y^)0dS>XlqK$RtK22|n 7]u0@#*'zҭ0dQ#,<#(8C!ż~Kc|M3Aq'T3e4%0/1-3=$Ҷ3ux`εL#,"Z:q t< y^olC1?U܈I*Z"bX'r=%܈w@/sb83֡GP GFWUe!%q-u>9[PoI"6,#*{KC4%nN fB-!5\cN-Wr鶈4.YAܓah!j5ˬB#&Xuǖ֊N &6B.#,eN,urF/RVmg,VCg[T>K5am(Wذ[X4@4rɤǁc a\,`RWs1Ȋ?ou[ԣ;i[Ϗ%,@cCVZsNw-/*p|Xs:Z$'JOr.b!Kb+$|0qMmmbɶm)Z:V TmV]Q>`.-S *Cȶn3B=Ze7n:>V9BlEY}RC>K'T\mvzZ̸`2sSO-"Taxg}փU-كq÷0'щɗ=³Fmq`Ӈ~Y^4XP.wݐ6s΅ƛCV#&u=}EO"3QeCz΍-,*=; DaJ;NQʬͶ[ED'88/Q9ve]4#,_!-LT-ԻQFPT#,$VCv6/#,y*f.wԼL8=3JOk⧲_N`3|燫fN;)SO &,#*+z }I1mXTy^#n?x{"iYYdL]A (G]Ɏ6qi7*ڣI4;U}_X&se^w;|T/2Ksxڶ,<#,(Pp{1}z,~0Wq/Fޟ5dKGq3|C&fCCDzt=<#*B@*25eq.Dƃ#\V>vi#,B9KhQw nLj+,#e2>7rCtA{srу. ɱS]5F- gb9鞢ҝ*Kߌ3zZbtc(ż 이Z8FmހNh 5q@ɓ:|1+קGJfcp#,b.[#*#&zAhk,)ﻘ>&cSh Eda.5tJT\UW%Drә’7_克eq8x[;\.!fKy Ҷ첰Hd<Vݴa#*-$~"6:U7lKw4a9#x Fٖџ G*Ym u9{]cαy!pf\;}pj8;p Rf0HI#,%ڴ7fPj"{1#&3R;ivkqqvk'hRx7M2vR 2WWGRMKs ϭ=氫)]JUo몋R%T4+OLCc7D"S|%*ɀs[HR1T #&#*krQS4^d/ZZF3AQU7E.׳b"u \bo똬=^ᄩrP]$6럢;'jYXO u"HpYtwsHP8T0.4EK12(X'_ ϿW3k꺱k'BPtSodݚxLk/`KJ% 8^Ox$]; 4A(2"#FGO Uߛ7>}e<JY4o__1!)~:_V[~C`|GQk2覚IVdFtZٽiQMG2Aq x8./ո-cf|<(悡'#,ނ瓀WlӇMb8PyJ>{~{u,VV<&UN3984A9͸1r6Nj\5i*nh8h)_૬|f#*<~9"xzD-g]&GS!2spr,z㝔QaLƢx'>kqiM,($ˬ%t f8Ӑ}m:.n#,,D٢1#ȃ@"E[@ŠY^æ$HLߡNޱfQP=is#,m,a|.v[Q[AInT\eQP3WB23>qt5윖nf0R5ֽ3؅3|hk} DIt{#Koc-sTByrJ (Kތ<*#*:CAd/Nyûgb6{JXϱ^Hw[nIՉŅܧS2XR{**^I,w9,|91=Q~zKaktZ"84ى[dBNq]{&0y$1brR{'d}Y씡!Ǘs z^:(R!_Ӈ^~]äC>|.#[.̀u=#*r#,DQp%!3Ύ:3:c$ܠMI&^x]A#&ٙ_?񾿫;}?|%-+ɒSߊ~'T zr{'Uޯ#,1pyaXڞcJQ}q_Jat2_txoUphR!mI"š_۫)M U<3#L(5GFcH۱l!}+)^=2UR)#"`jH@8p/Wq=[Rgvo q~vVȻ-L#&\P\=с8}v"bȣI]ʾ>.YPB#,`?zqmn5*k@CB -{x-sz'x,pOh1Od X{|0-v{,4*0[#tAF]x}@꽸ZF%)v7򗪀-0L*li]%Eiӏyer<$"~TԻ-R1gc4u"p&6P(S띜N)qֵX(Uf\Piϥ~^︕s<7EagV~mݞzW'C=VcvO&JQ=xm?;a)L6 8fty?$;"W>v@#,1EE]N;Pbze)膵APuE*/X*u5-j('m(#&+7ig80;/Lд,ԓ&΃jDzĠ ԰fK:F,|)Јe#&zl6btl=ێ˝- n( b1lx0&~Jw tjиqq/bGc17eB(oW:S=xn$l,xƋ)+*,ŀZsJH-$Ы]4i[ ܫ|~<ﬗ.&YPWH!Y JO# l$GVpk_ٝ.=1oaL{ciESD;%HA7A-#w;J83ʭլ>j.鑎TԿ[s3\"={`Ca؊U@a 7OD~nj-jV;ӯe#*fG4)ֵoBwtM-Sl|HXM. #*ENq/y W#{$,ŷcf.7"xP#sݘ\%:OU$j>kQ3?>:oe7!4֬1Ca+#&\5h2e3aڒd{zkmҍf4X:M(*Lz)Z.tPJ3)WC(k}@I]NG^֙)8?"e5"ofuԱrϻAg09iZ^nʨg r^Sxul(paICK#M)-:v>|GNs[v7nMt3Oz<'8v9; [Q'M)@)) 2fu"b1)O!\4#t)z3}$ &*U <Mf5`a=łOؐ*YQ-wWּbLX>AT=5/9e*1+~_w?H1S|#&E#&=#&#&tr9"l~_0$|V02"JrG~C

Zx|L?wُ{L4JX>qpt NBfr#q<#,rTSlcfVfDp[?˷kÐN,^my珞ɝ&^77hѣl|vşPĨg)"5P3a%16rE4aYn@_sH^Ԗ3B$~`kP}>ƪ5ߣ#*}o‹r ;flw KW={`yw!_\3-NB-D*( ]!f*&C#}ҀD+h05n `X l:QRXȈta#XR%?mq3a[b(&ģ]KÄ`SrRk#&"#*@2n|D3#,1S}c@YFcQ`UK} i'3}+?~ζ#!uXӍ?X1#*T>@Ë&AqPWYB27i1H^*H:$QW#*+<"i ])/:@ 6#*ykǼ3K>Cx ;!#*}rutquٱsn [DgJ)!N)ÌgV{#,WqN,ZP0=}Zn,⣀f*R)F!#,Q+FPL'ʆ|]T њU=O8|ZbtdӲXkQx쨪aӺ/{G4>^Rzcda2͡|CڕЄ2eӓ{5W~U׾%S4ԲfJcc<бUTƘ_Rkd8x# \9#*rt.Sr5[NmȐG"B@lGvP!*Sܬٿ:MSCjN,c$wt-)[7B5Q9n#&M1I#*)Țzut%ܓX{6bWn(h=#,%YIIH,#,:("<&f6M8QE#*w޼m?&'J8NJ\r'!"{^2֏;p 0:` yFIdgvϫdaԬA#,#*~6ڕr|ҫ{[&[YVMZ#HL`41#!a>;^ޘ"`2ۛkIzΊM)L)F"K3WpujS bKGaܳ~-F'wq <-CWDžHQξ#,Rq-OV<*y>~7SA*$FAa"P&Xx2| )e=|t ^Y'!sF̊PE{ˣPA\em% %&#&eqE2S-|(#,rNE9-Wᲂ"O)L:cy#%h;#,P& #Pb5 QSkwh/ōk](Qv[PlP^8ّ(jcUUɵOmj\H25#*V>1O@3ΝdPQ"p#,eoOv~;k?5WM-1f5C^Ue#,P!Pm#& ݻ7CfCxapĒ\/Zo(2`g[݀bT+4mBbSDI- "P0s2%IXBmjΚ]A<&F\=[8@2yx{B#, yNֺK\3חWwJl x]|_09s9u#*m $6Nu⹼.NK=c\iʧ*JzJtm 3DL ,Yy5Fȷ<;) L=DI&OK8Ɏ#*LG=᮹MVY=PL'e=XBA\7N;CӥqҚ¥k%Wկ;hлCh#*t$S;kN^8Mn!aD!~*>tP@GJ X2ϫ+q<b, !Dΐ*Poegdһ6+k:Qr@*=CTxtˊD(@$Q#&r6T' !ũL',ilϺy;HKw~2irD?~0Ƅ Ѱy (z*ˡA?jU`PpcP:L<ش\DCmUR7𗈥a.뙜-Lsn$7c3sbXb3~o*x ]f9|NwCpQrd@!]7נYAgFX].AѱêRokHb䓵r&uQbF1kƷ]]Jc',XYss:9p.`Tq- Ɍ׍#*F&Ǣ4zbܝ'@|($,ӅK-;wԔl~u7"QzxJ".)p o"XWՃF4M-,FJ3ۭÞ~;xMCX(Eϳgl#*E?R`~p89aZKjTj ?~[̯%2#&Jj0d2Ps|op'rjntK;Ho֡´IOLVnYT/Ow[x$#&#&:X#&#&~ioFV#*h-"ks55τTW{:0XQnW+R,v9#&$_#,)ye'U#*L=7ˢ !~^p]F;`7Uyg5`%no:#&m'ㄒ!*qCwIhot:AĔBf<հ#,a+<yГ#,BO(H"+B7(ZeogB I*AKy)H3nd>B9íT##! g=~ThȪRcAvrAh`Ë(!LC˴:{9\; #xKMNb)%9{tU-fi'Aճk#, rpu݂mn%4l{z/=wmuC=>?Gw=!OlA+ݛz"aHF!ψ>^b1@_d*n.k#*bLOПg~N("\{S0'@I2Q#&Ӈz~<rԈ=}'* e8qgyORڴUmx~Tr^{/i*W5l7{KU+9^ؾs4J݈ޭk@pG*f1[#&bEi/Iv}PzJ#&(Kmݜ0Nqᄅl!2!vd!3܍$i2<7VqlvEaAo #,=i+R&'.mTJv%B\x.\~^.T E"b)Uf]sZus'͂"4FJm9ǻ_\ZcZzZ{SKO$~G<˿fv!׻@O^Xz"uy;g7P32{f`g~8Y=¬Ϳ5{rr%k xLВ߼$*ೃ㝶O\l  =8۱m߳OW{d uEm#4&Npot~:H8"T6DӤ6a@޵[{b.OqP|&|#&~h_W%K"l%oa%7&-J+ǧT#*u ?^:#3!p kv%9ZGTt\$H;)%YP*_ߗ?Hzڸ3M׭~8̫!08G;tmaQiX_jsWTͦhǿ$dE<>$tTGl{!N`Qޫs@lz/:%_t~oVsηWz^S֚ms* D+L$Z<\V<:#,v1ѝG<1?']¥_W*p#,Ù&#*@="[2i?gTǽ{fAzh)\K`ܙD{ltO&Ve|x$MLݍv R:J\MY]rѤaņ7M~XEeDBI L }^[y({ 8MrJW\PcA#,aWJo>ûγ1\=s="=c/N%ǜQ߮Ω xA5n|;#=N{Z}kፆPwu S=fD0Í- #ݟl:I$Lm ෮"uqRTd,5Nܮtg`|@ʝJ^}pVZ/c7HOn^4=FSuR^yKae*5t4ssNb0/ ʉy_=ͻ q:3G49&QNj$P-wQRwgڌs=؊tQC'],gs_#,mnfhCӼD]e؃CC:t!l]9\sNc:Å Т:<>H_)F#,tS0JܞFg69|>HNWNm9C4b!']Le:s +nݹvnnzf= ѐA7Tdf|9oRj=\,cEvrhSRvAE ">P|1MʟjӴ*e` =qfƍw󯺲.#˷”?IȐe<:r$=$<.9&Mx鎀gܓt糞Nb‰w8Ury^hI=O[ј)gXYz*5+޺X1aŒ% ]1eYpmvq4ĨW#*)Sl?S\Qsd}Xᢑg^k\"81`_=H(#=NrY՝ 'ߧwJd5ӱХtU6#*.{d81pC$u{θrEQ&#,.c5)#& LwF"$`ksT/^ѷFὟMY*Wc\{ ՐSjAHDx-}sHB?b㣡)AiHOe-x@Z2RS"vfD)a+B*xGو|DZ:2w#*?r":j;?iVpcc#,.G;gGRZ_ 3WÅm5OE,'1h <~Yh'O+ϣ,Sw#&-r"Ju7NΠzp9-9څsq:w:;>S'7f׿_TL4G?Wꚲ9T.{q臖)qN^ ߈z*}l8>~#,thw8-ARHR :yY; :wO?I7̆=Mh]Xd# g5|3mj4ߑ=:EFF;Sac#,`IfhZObK-2#*Ą Bkz & wC)Eyu YzEǚwqRo֢kILir\m!#&( 6H%^Bm{ƩT~Wq/#&#,F"!֨{y5[*-#,Fdgu|%¸Ҳ4ϨQQ v"+$I!<9#*?<(C`ˋL򠠸\/ Ӟ=~8Y\rꕩ~:mƆdpm_adl=|5'l (:rȤX)?% Sv{!NX}+8ZU l=uǪ]6]NG$(oY'Urg#,DKO0(z|MCsG*`"mWS;v%pMA'P{prK#[,s~4)$ s#,:G(q9D⧘:4:E:@AQO̟G'|@AkLrjҎ|O17$ Nrl_+j5V!LSCɏ6 NzYmrd$?bXc-`,$zK#*VH/2xu(BC]9QD7 )\[Gfp@&Ace*WՙptmF%r01EE#&t3GJ87b4KxX#ƥ@v u$-zc4`{hl(zOn В"srMR(>OR[h1!,a˖Ĩ(vv|#&@eb$zӦ#*f2@WG\! ҡJ -<0WR|fM59'#,C6#&LI]!I,-IEџ[!]?9#&q7-Eۦ=f1ɯs&gΜ?~ʨ+@ 0WX#&yfJ&%Åh<)SQں׏v09g&#*!"+3~rd0c%j~[ik+'fNs*~f -:h#8#,we0}HtSRN~M]'p#&[(Jw>ϜksƓ/L#&mh\+?y隦Q7|`bBl=meVn;÷{$Pk>ql~DNPg5jy:iDzph$~E @CQ^ x2TIK`E^0pI" ϽRB82X(v.+ 9O p8u6v/(yZN?G_"w+ո1~W<Z#>^YyF9m|5PV#,+&Ip爄'3uwt/QtW&V}Ja3+У\/IϹt=S02W]z,;p#ϥICH_ÞN-6ςs-Ŕ3 vAsk =ؗwE=1#*Mk0oϭJ:2:I`zܳN:3&+K%r<9v}#*- JNdǭL@i#&#& ç䈗Qe|!IZ`|A~|56A Kk;Kt EXEr0Պ-NW*nGUXhyh Er#*@8Nƺ{ LAw蠙xqdUrjcREV IT( QE2xժ/'n5vY0I'w6\~! "~Dh7)I sf#*+TR1& \aQ]SA3#*r%]ۼ&YӾq09 #&`ٲwcOu?U#&=C#,ʞbA @@={K&=ސ?_|"s?i2kQ:~nZ>i?k|9CT4|1K'Mh֎7ަ7yQ}7)3rrsqtZ߹7(w2{#,(9^OKAGvr?uziEdʟ]yatǸޮ/;=YIsebѮC<,{~:s#&9]E5Zţ§l5E- ">/է+LV<ȿ2'3[#*;thY?R%HS/(̞7}uO7-f-$èqa0x#‹"8{1$H""B8R4݇[HAȪ6&р`FlXq[Z*n 1P@0v}<#= txM>a@b%ɭN?xcj/<~ #*8(vrZJTwatWcOh"♣]Q]c{#, tP9=-#*%(tceF{eۭX#*Cf=W{Ib0'5DD2^F{:nvo?|5ڠ?ͱW9hvnhCBRYaSxmt/^#&Di=$yclr.`g19=䆉׾Ǹ4Y`Ra:*GH`"'"ݱqMC#,#*c9AP1%tQW#:_&#,ŐJ~W5!ܢ(щq,eZ;T/qnJssA=zb:btzIn_퍕,90qAZor(}@& 2EP mM1̗@Cҫeӆ]zEҮ#&c"pj#,LDz!:hgqDV ʿ t{GnŰ$$UGDB-CQ##*:B"I8}b[hJ䆍܂HkǧMi %>7c&[o-Km^%aQOf;tQp[/%եA\ HN(-"ЇTquΨhCcrDŲH:KkaFF#,3GdȤ8VA2VI`%v#)lprAB,9 #*H,m\r5yǹ k(Zsc"jk9,ܖAE%qp_:\vocfK .Z˼ϚH/%^nh4nEэ'˹g /;$ƻ+rNɍ:VE#v؊JCoq;{~]Z qI>׫#,G:j<, ؈󕓠Y4=.ywX_#,Em\b!z I!<)xE5֨䨘 h#*7??7[N\-6duwL8R9Ӧie4,q O{ˠ뾳-sR/y>S2e\\T^_=Vq9r!hШ?ΓaD}ZbAAI+wQѡ`U,Q[#&ahB*ЇyKEr#&IJڞW980>E༁ѧ2wξ^O|3͈ME0wIޗ ;F]ݼg֦S϶4f2'm$q؍ﰪ!]~#,0T6XV |#& ?3€\PQ#&wp099|C}/cG_5AM# Q_#d^>Je90˟wal2 ־ø.;#&r65#*$d[PN?v}C?]GK_n[8}կ'Ud/R#&R Y^G@F}W6A6jP6~nMCX#*z.=wi$[:s RdU#,.}f5n|jo;;#,Kp/rX0ƞAaïwPᱪ)\%.S7M;7TzBCp\&#*;V(@HfnpP5)OTĠD2Κm\xxaŷh&3r#*U?Ib"1w Y#*-5o%'i>>GSOªCyJ[*xL"Tu77bEM##&+U2{6n&ji ,)eH6-юq(dhWuN$B 1Lj|!M;8lGflozH00oNS04Vaږm,])˔:)z}j!/? 38LA'οn׫<T_#&%$MR+m/4\;RYx}̌zJS,Ɯ v%t$#,b(da|BTw񱐖 )xp0JC[ʵ{0_+APd KgfĢ~N&"RH4QquxX/n99`V4D փG p8Lo2M: :"?_A%4ȯgjAсN0 .rZ@!>W%AŤ5#,'|Ր+#,=Y*f*/t a$s2"T@aIqR3S ;#&`I1_tXLšR&*np.^arBωy :SCLa+rĘ!L4I@ЇIm?#&ڇ]JOӒ@VOJ‡HJRel"OY#PQEhFSJNC+hK!,)fuI&jMb2SRZZij欵zef׌: 'ރV!03ta1Վ#*g/av}ݘ U”elC;O&[Qh;}c94,ICDž%5&Wf^%Rlӌ]#*"gbs{"Ղ̻vE5+\ oJo,Y#}`8')$"a<ߒq)DS) PeQ#&ߦϻI`>s4ߠc&Y=(0N~mhߨb#,V!pW*L Q#,NGݗ;ET)E8ho!#*ywC-o{bYPP }igJL>i\{Jhn7_|K<_rSWXqzb-?[LPHH#-|֒X].|(S şo8&I #&?p~W7=Xhg3É 0:ȤUFOdZUK<h#,_qCۑrv8Gi_P[l;ɻ&E ANe\[#}sXƜ?wyVu*`~R~Q#&GSĊ#WGOD*(?zHN0{ l{|yV<@ KF?^W|L;/懯*ےؕܦj؄I'E7&bt @H~$Iw(A->Eih%5S_.:a9P#$+{#20}群P 1Īў'c$ԍ  ;,9ۜ#,tň>AbZ>̊:Mv-s:0UBV#Oƪ>fE? `SJ';®Ƶ#,1!JC1UH%HYWs4h9HɁEw>̊f#&O{wubIHx[dc;{b,Jt.UkAkT%k߽{Op>`v&"l<$32@B%6^O`dz)2D)~k£XUPm᥊1L6|1rF6J$hw<<}o'>q+x'P! FA#,4*3SԜϼ >bp<#,SI{#~$W+Ӷ݇ᜯcß @C#,R=BBѷE O}[*%#*4G^j?ɟQ4{YfL1,)ugL#,5ܹ ޢ޴q#s-#&, U]P5x.(g 9yh}ЫKO12a,#Z4}UI  ݠ<HP ]C{pKHQA9_*)~$IJ#Y9!|_^@۵HTB#:%f߿høC4J|{;x th@THIC~do@L$yˍy+wD!Y$X a*1*vvib$?I{,TUv_#&1H#*F#?j0ĩC&O<3EAUc8Pd'p*>X"N }J L " FIrc#,C%^aN-@[sHb hJ~d>u~ˮ˟Ԥ%ZE)`(\['zvD"2U4MM#&?hXld.x#Ѐ|#,FWdUL#,$ WSs^{/XNv2K.8#* eIო60I!%1 YkM_S}r#*lo8UPU@h rE8'Pf,͒dG+`BamiKڡy};s*:Aj0zxOu睃ϷO$Upj}MめBI7ʣ-#IH.rvȋ.^lHCQ'l#&@<ÑxmvʇT4$pn4HGBB IIJ\@_n&&C^lxSo#&,-&|s_ ZeIl{x =>cp`|L]6I+SΩIlbZD?Eҋx/Q}הO#&櫋3`۳~^u:@"VHG#&*T"kNE#&QF#,˲(8`K9j\ C}GD*~fgt(9n*~8|YK4?<<{f?#&I,`#/wq;~)!2BWH6zӓ\#,o8c,GAʱxBrgLw"4LWyZ@U7 g#qߘQzK!425c`%wqoMU޽TM^]o;ru@',oH'#,yI!\%ݻ/#&\/]oCC !U,xqP`| 0/♃m5/}=\JEBwԜ!g#*k ̀ ?NjĺCH">b#&V'Ҋ0#&4 X?N)^Xi?Xiv*1^y zfTX6@Ald7T%4#*#,?R\~6E&~#,S9ոS_*MD9(G.#, [0(vIxk׾HcW(PLצɐ?;+s˿SWmN')CLʆtt{̣I'u!%hҀӍ0!#&"*0I5p7ҠЄC1/!lnWdKx|{m#r>ͿǷӖj.Ay1![F3dwd- s}hz[0,DZ1_* 8#&GSzIq\"3#Pȼ,)f"J4`PF53yκf['y퀲YhՂS [! DD7MGas,N$㌳*t((0NUPlR(f?g"f!N'Są3$RӆiP@%h7h1j6֚\tc?UjoBm1-#*d)!4&njcr#U`ٽfZM ɲ#aHZ>Xa D MʟXVð2A_ԬLEqI:'*fslpMgm a~=@ (4)- d#*9Ta}QqB7̀|wsQĿbhјOčI^ZM{>NNǢ(䮵z%#*_s\)(>RM9m#&Z x(l7M!˝3atCvMLO"ofaKYx{sTphbCW7b\jS|\l{{sIXf";'k=>!igFON]/4'"#,<0G{2{Nl%@!0=F^p(hv)N =Mӽ"KᰍDQ(fw59zuڊp7?_Ѽ3D\&V`S/ Y^`r#,&\Y{CaDǀE!"`SY`O g>x^:`Ê(ysҊ:y#,?O/G䥃&Fyp6gŐJU뺨{G3.umPޓ,yR;L(n-IGGHNw)~r `l#*`Btpu5 TI^CNrՒW^?i( icPh?2&Rq^۬vhT,cˢET ̊#*Ր8讶M/ez]#, ixE[L$~48@yNkzOLCtukI:aٲ{s8pvpd/o8mG߬6itZb^'2m/q𹅬4A@#,3@$bm })-2\PS5#&,BUd TUR.,JE 6bdޖrVmSKt0A14T _7WMRPZ$M{+tS#,(1#,)ȻT l!#*Wi00Vgp#&Eyy1~zz: EEwr2ć9\"ە\JCx;W~U׮q/do7n|嵗޾:Dۺ~jJv#*_o[W9.P*3iT?oڝ}}}z8rʻӻϦ!'XF37ȔGf.Otgr۩p@^P)CTNcD~x#^oM{Qx2[G̤;t=C4?ȃР} #,&؋Nۍ[mw5#v̹`8/3$D/U_=@`(<62񦰨eÊ46Jp2O^IIԠJ#&'@%on1Ze]/GYn_UIv#+!J,#Iw>J)h~<|64.ةM$4I%+T<!:Y{{O h 3!.I#*#&=&r 6| X!z E>?{|dP(lWz,~!ѕc(6;r}Vѡjv逇/?W^.3#` 6~9~#&z#,.d!.eUV=K aw;2&a u6fnx#,03BHIH?fo#&Kմz`I*0gsB ɶ][wUP|!bh@ȴwYr'r\#,؛#, 'v!i#,7{u%!K?s%&AALŀsɽq,*~XTHCAMwY2!v!ԏb_:׫By_wf6z0^r)g[d$DXl8̪Ng>.0OF-ܜ@t4{-q:1)~U-VC ;Y7h9-r[sxĜd8m-#*]ߕiWٓ#,L(Z NBc6 #*KЪ=,n^ڙ[\ ;9M2.{ ?hӷpq,#*4vz`A%s&DDatoP!V YVq(p[[#*Cݳ;WPbG.ވy&2|[=yfDv8 P"7P] Mqb = XqIeٶ;6&vzbz:=npx_!6[ \yZ[Ôz.DLP~č#*H^X0qL2[ h&Sk ` /yhvd+xca ,@,孇0҃$9gy85++x|ۂa{u2[|e{ǣ{Kb#,C2`rNemLˆ;H :!raDL<#,zuKO.d#&U[PkpJQ8vfN>.pM % ᇜ13jcȡ5#,m,43iLj52gclY7yl%nt#1Ma%wʽSsBzgRvQpxUީK'b(ƔsˈĄi6.t$T0phCɘ,|`LĘӢ-Z2PIμ#KłE .jI#*7ԧ?_C톸CHOo܍v 1q|m%/#*#*g9RGxhM,g^OYi!f#J#, #&'.}X*ѷ2$#,(9 I `5DCvз"8`FZ](kify: (9n.#UU#X'|Aw)`;{JXX[|Z8hCiG(tՔП`QmL̇b[mqZZ#*T$t~jc#*:UÄFѰ[:ͱ.E,?>N/BY c}+KBdM#*&NwOO*6H#&a׹.gъP?>Y-aLl zȨa e$vU&P.#,d0M#*KZ24XIDLj#*_{tЬM|lZXP/Dn8ۀ!`DWB3ji.C{i tm|ӡ}Ht}#&\_\bbU7گ{oy0꜅@p0p 5)ԅRPYCS=7H@$LtHbpMX;9Se 6\`dD0EBd&a<U6>,XUGK˯/͗Pv:Ns}-!۸`WX "( FТK!:C!CA\~|ۆs6sr{"#aCi#*VN{Ae*eʋi› n0.=yp|Fc̦zxz}}+O7NzbFz{CfniƖ 9ZF|U1y|rO714!#,"01xh%&eY$L-ȕ(#, ?^p[š@a|E2}{=ea $}?G 鉳4N Aq&Q A,t<곙%tURkʹF9CwY?{[HI8^J\_Q*`hTuUZ#іst7 AF#duߑe{zyشhP*T ]fB#,DJ7p̄9TQ)*v (,T*F@q=X#,G0sLpԵ4jIeHk~?Ե+?%ORRfl:L>#Ԕ#*Co.?;#,x9#*  D(ĭDVݦe(־rd.R)s{*T.2w` (0Qvp#&Y"u]RWZiL_vLw=b) HIK^q($J#&>{hT<A˭`#&3$ bjpd%aWU#, 0m@5ebm%@sWB/dKlX‰;TqL|Hn#"!$6$sp:._;gY*ˎ>]a9#RBnP[ %*b$14kpqA"#*zJ4ۧgjqH˪sp/-0Q#, ! ؉qOfʟQ#,Sy(QP3=l 1%,R?#*+ȮZ2<|]ܢ*/ ,#JmUW-KIfB(!G#,"2#,(HĈ Dr"`0{ %7(%byJ1e,G#*#U'--Yp bu X`c4 LRGMzxעܺŽ]ҫަ]Fn;8srY]=/Nۤxt[>gkپRYVo &5㷼#&O )l!c{a"da~Iy;~5E2M*#,K,iàr,e/d| |/&el!˴\xo|ljx| ~Hk糼]>MO&*7WulVk5j]|B`BYꀪ.O#*wɐ?[f횙Jfx/_߻#*F^D6a炏?5 Q~|EcK(5lxLu΄]rM&?#&#&~nόaERQIIhQ܀mO}.cjAaNnMYjuU~Tfj H"z+WT;f*Clꇚv'L)L'Kb-gݟ/U#,E/Nph*O媍[`{|V{{WoʅjjQT6ZƒlMIImV5ZTضPYEP #,)?Qy}ZK}ڮ#,zdH((ȇ "u Hp4D $pztظhql96BCc*j 1C | e=#&M#&K"󊡅`FCMD2CZXU1kFD4(_*KK#3O#n##&0#&r;w#&#&۹RGp+ۘ{p\bYu;\ HeB_ƇH<ҚYR0DJlҢFR !AFCbVZcKQ\ۖܶ3aML٘5%Tm!X*ϳ3#*`CriYY DHgumB J2)dG( 24 v`56!E12MvI:Oi1]$`}7i}~(2DĒ53_h(x[}Wl=xJD/;f͕`}yLmB-cѨyPKʏ8gl;5P~ ь}7 1]hDLsCR0,\81%4_Q}iJ0]زux0 $'qևcR8zǡyhqwᶺfn$K* +mv&*䋎f63s0Ƣb,ɻ]xN#&۶6Ez5j!"BgT#,#*YMUj"#,wC`%GS9kIwh+ߚھקwn1{^o #&7Db>5'#&Fo0Sa](s/s:難 u]`nowϻQ-zIAțMgn#*6 p=;0pp[wϴZщcp6#Ǐ7gGDH#Fq͢/=.!@0bsaۯӠ0&L 16+wge;NsmBi-ǫr 2'|o|$ԬB*PRm"D@Q*RZPi[#@&BT AY84! hh'#@KĶR3XmvkF_/`؅Ω4p9>y$&;^AA >-?MM#ف{!F#,d눊xs)Fy" _iK&mUUO{0ǰ!߄{°bwN)mkcn.V CDRD:,I4,#,7rBCk6h(j?* dŬf2o#~Sn%HTt%D3#, *,G(PEuE!mbDQ"Eg3*j󫤮U1UL rӧG#,B-g 'HoCmޜ̝k3ݬ;#,85 mA#;ie.x/n&(w3rtr&3HH Fo룛7xESvLCnNf6l_`}nu˳"Aa˲ [iu#*8Ф!׍JfKt>) F'PBPRAp@d#*yNeEA K dN/s YHjĂWWYGd:#&;mMlS"ЗQDc#&721CL  \YikDp[xfr Tэ aKPr6uL3\0 @, D$ܠ&Q Rxndy~|<#,a(d!XbGȼžBk@lA#,J$vb…D-Y>H52OW&ؽ!_dA܋@j7SĢ夤=}sq-RX!Ipȱ*)ѐ:h@}}Y7d}Hrؕ!rgN;8#,0ZM(RN_?Qh!#5^$:|_[}:Sܬo9OU/ü8&H>#&h4Frc3e1VDO,'[(DB I!ޘR& m XלyēR/5f䅂$X#,$(QRLDA2Yw<9"%RGs9tN#,$՛Hb<)F*3!cE }4aDOME8\e VYZ8MU8Rk <$#,&y$#,#tX,Ӷ22@rJFD1):6vr5lmG>,L#*"9-4'vfT*;#xar#&~iN?dto߈ƌ5fe>.v%d1Tw@&kDtmoٷ*rlSݬF= #h +t>^0\a ,]5gcф(Z3D;҅R;|& 2n=<שMF"2ֲ#*`\k%d )Æ[{\)ݍ,٢mc#&z0^LL1H';c}o#, SY^F2J_ hOr@_u4>&'*浃 3:p$%NF3ck/'g QwboWkynw\MKl%jQjZSe],jn ABIe;0~^%H!T&P#*W("圈#,#*LHVj4()!l#&aMdIm&0˄r#, ќ&m%INh"EA* !ZLS/n]_{vl՚O "len|? <ۇ>ɜa\!nؤgnbhb)|u#bq暄glAP:t`y"xayw#,2|8ԛ#,P)pi#&mqW:Nj贓 yNaKQ\JF'XtyСȲ;MB%xKcC1\D?gc!s226;"kc8nDt&\c Iea&I#"8 ReTo0pJplD^[5p.lq4qmT:GI:VF_z=-ZwC3L`;|2e"AַDbutC֞+zgyS,#*6 (dc#*oӴ~_WcDJR`L#, >!XI2ġKsVna@- hQмMoRG!I4 PS+M"Ӷh) OLaFh#re#,$V̆ģd8mrO`R^m#,"-d#,G;}|[~`z@kYWN|?D7ES3lh|9TF/Pv47EDŽ*4xg)SmV-kM<ݏ I=/#&nP{)>0 D"\ 6mmܶZmZ#&"((HP-U_G&/T@>R!kNzghD4`3=b4\}7V&Q2IJdL֙IYJiKQh#*0biC%"P~ܡZi$S+e4̑"(bhbi]m%ALi%%L*̚5!5Qafc%ƛdԄASPe*3i6AH`4S&fvq(;S#,F6v`x[;|lȏgd2&.wHTcr[XY`%G^arKi}|Ŋ1%#&r1g>Ɗ$F~{nv.<2\Z{et7dEf0qe^fw? ֬.qXm`6c)[֣dxaq:_$#&! lb*R6e(Ȟ:uǁi33Ek7эE8ɦ4{K1|敎ihOC:{H]c#*+{|w`uD<05yY2jXRW#,2ytӃ{O3#*s1csQtΣB#fV23h&akXXњ4[xfY54r3mkt`)A-L^'13cb04^vh͌ E;yS;#*Lf1-k#*,e`c#*R{Gg[qz3͘ƆaF#,6ѨiOS$I(ƈHyLJn5(}Qg4aPʺqq2LHp ?TF\i5(I:UOxT+a[U[s)! ,aXjk$l=y=2T !יּ&bi/DNN!~P布̦Ӣ#&ƃ& `LPMZzR#&&爃F$M&x-D.-r;94u✖9CƎ.KP)ÕY*y{yt9ݡ%hK4VvH8ueT&;V8gXh:<&xڋY/]ŚaaJZmy1ssvI@Re8d"RȆg G] w&p-JO= tN;q8[a5,qfi޾5◍Bi2%FBwFj9#G7&as75Grf:)-L`մ*i-HI=PeC?F%}#*#,0&o3'#*LB &l3g~|7A}]m `u"[c)bhu+$³RBaZvcHkLǃ#,p}R))adD 14LکHwr=Kl K,GVCw(.m$FZjnI ,T| maJ5AҤ^ I5T.X:P`hHLql ӊRs9 ݮ ]!RDĜ380hmHL2eRe&ʠ#(3| 323j&1NM@^z5tCuyt՜.7;6kJ8IprNMYvg4C#8-A fVVL#,gPj`p0;e\Yf#,P܂L5ІӔ&ApDhNc+nMIB0kD&f"'{W|a=lLnmΧQ.ho,8#*kJ2Scq\&7j0da$V ¢5ZcA66CCS!s46&#&L16m./\-F4]8Zc;@4 x4<;lP'+u&hdYt73`p ,(f 09M{YK & cR(d(Q̙f5cp>܆#*%p%R!9,#*Xɂ3 ݮɘo3{ UQShAB#*\:(ƻxn1$yP3CrK@dA#&҇s:dlFmY3'~\][ C=tnf; 3l܄ 3%05Z-LVt=]lq]ܽPz*uCH  12fJm__R6A@x3;hp…#,y* PFl#,r|6߇u\#* jjU3",Tq5AѺE?·H  @PUga&`$81dA1O-L( |Ej,s -8a N:&N\[].#*ah7~er3Y\[a;9#*&)ʸXE #䉁aw#,Hҕ(l4.:f:p20-f.',xc!#*vn0k#&< l?Pqy\H#HBsꠁCMIܣL߀͵diIB#,BȼPJʁ"a`;!~=146#,d@AiTc&R@ц3ı 2Cw"ߧj`C%B2#WveMڃW6Jyy7U0GHv0NsiCs"ը aGS`>?<7xX~dȸ~[ܟR搑<`gvPzK6T6\]y(DoPPo1 Fio@M1(oRԦGkZD0RgHc(%j@{9E@P4#&CV ,ÀC> 0}_&T4j*cQ* 3hVōgm|ׇǞzEKw)u| xGa#&MgjF$kIּ)zjsP@M#*M:"0 eyL`; T̔R8XV_KbZW@nA'e#&#)mb]Yƈ\Y0qS wGJ (cKi"F'f4  TX -JYMn4V#*fF,`5SLq]$V!?b<*Y"2*d`0`_0ޣ&TyB22ov%זs6aiC(jB)r=h)\#i=2A:7ʬo0@n0q 8cZn CH" 8aGl+[/?bz3#,(U$"\BP])K^1l}Р?A%fDc4~~Ugx陏їzF:O3n v(G.8hQH j[B lphC">dϼ4a :u[2{Z$!j<"$֝HI7e ;l0&*Z>5 ᑐPDRXfb\PjbaWhB7Lak$rtR ZCeh zN?.'ZI1vI>CXaT&2R lG/fmxtiB)h6˛˂ͩv֚oƍԎ0X9!Dz5:,,\Swb<ҢaRi0ʼn.3#*#&T[#*W=ɗ"ӊAEeޝLi}}X-%Bt6+駹k;Y<`sA݈#,=2#*#,3<ԋT䑒8}[W-d 1X$BDS4> =JwrKS>Sꣁ?Fn(zUPnq'LK+bvV$ul9VW"ӆJTQS0JT3)ֲm&H(}LXԵQ*J"hd60YHL^&2-) m>-IA$%tzP.%oq%)"$YmQ#,(L@/~F-38 3hgʩ&܈pjS(':˕lR!j1$wu"g2ΓBc=.fA-=NQSž.2IV2Vl8[x61*ܶMS5i,#*#, 6 2& gZKT"2 `B1Q"sHڥEROP#,P 0`lm#*#*ERPҁ$dVg4PJA@#*$J K/?Cރۜm]ݶݡ΢M^RcVJ#pR:;clzfz[o'vҹoJv3iy3WW&RvjE$HٔC%"GFzmQ2$,f5I)MyK]5JZlʖ><& SAQH#&D_VBv Jcbsr A* qj#&wEaX "={FCOrP,a^o۬=|td2N'8l ifp2Xwgf &&]!1i((roڨ!tƮG/Rm1JMKRU(R)g"e#&Tc1!~ytR]Iafs/{?&sp#&H5#*bG8aDULcI"Fm᧷;MH#=BX|((8n뫴~Ld>>xo}^6h:#&ruJh# HZ"##*d%sedgBDraY+%Z.Ti 6uVqq |qx؋W}^#,pHATP E#&ϟc][Y<6 ;o8|CB~eAT @Q+Ei%Q+$U)77+ie hL[=k\ͥc)m&4RYM+LRP)F~#,[YLfM-Tʒ:応cn@; fM2u n\S2IPÊL0j'-T tN3vMxmim)iY#&Ȉ@@ nG2n'@)F4jjmj;+4ݮSW6yMU\\أRX"p@"S0ꢚS`w*)ME#&aH,يɉm"ҒkiY5d4R6 0%-EfQi$(m5&F6f2PX4RQMdб,mEYRDTT&T2YTdi*ILRU!$mJ!Yd(II&Ra44RY1#k"cj)be$YY2hҒjSm[jKZ׾ծڍe+%4"Q,HEaD*!{5z-XR5m5*jEeh?#&8zl"κI ;[^wLߙժ0{'v[|t8_Db좴ӈfGjy #x]W$! >@#&V|@c=АŞ/!rYƺu׆-6PLǣKtU7;TvU ~CM3o#y^Aq~D#*+C #*4$xf1AࡌUA*!I_P[Rݔp~HۭvM)ϘRw(WyuշH;P NEoޠ; M&Λ*.b\2xh&@l©pOу4Xд$?Լ6pZ*no͙{>WIB#,u.r0~UNKO*C(Olk8mbh`Vsw0EY*PΖxV78fGHeC7C#&x $P=mN,Z@#&#&-EF HP+!]|[zߪMSm-{*j}BD~t| \$$η8QX+JbS܌x3ia5͕)M-Z5u$PMt|{So6OcһwyR22vj'{7I#&\XtP!L#Ԥ&EA[`6P?WoV[cm #sU#˄,#,HRZC#!FELCi41 LCe7ӨlG&*FA4YQÍAiZQbb RERF[K#,Yk@ɂC"#,oRjKeւ:^eTC]B!- O 48n#*&ZtT6UX 5=Y=$a5Rwbr=nt o!"#*NI˓Nލ)͞ថ6PV76S-߱[Eծb$>``_#&'hM#]@4[Ib}J$#*)O3#,VZ|]j[qɹ0PJti:wKfK rؕhg|BnCJʙP!+~T7czZzyrDݘiZsµ)[nCtbd2OP0I-#,9+'Ј+̆vvI iY_0NI9;?Y2vK E7PhiF c@I%'G+!M@(X#,1(y)׻:ٛ w[P 0ZPLO@~7ym '̘<2uk4jjMMƌjօֶ;PD>=TDRB'}zyY_Dϐ10@ugC УV)ׄ&ԌGC bh J1`7Cy]J\Ȣ%BaܻO=o-FPh=#m۟N{;]f aQ6Ex`drpFB#,s˛Hw"_oD$LJ>*HfNnG;RM"wriݔ8wN!Xc( `RAlt-~ -hiTU0U0j9;%(R zwYiZ,vFȒMCZH[5}쉙DwWZj钌ݫXW귤VŶ^"ӻpr){%/2MnIwMP P<;뉦f`w'5]M:ۣX}_nCrEv:v3RMbv1A֩|Z'Vd`P(ZknoUʄ,S&Fl6#&TmT[jM4Һ蹾e^CƦ$McTj&r1+|{5콢hQ?HAU0(1G< @wx慙O4 fp,E lPoC:FCB#,sxs!h:HFOIlc5*FV.6>xӔ46#* x$P63yz)(j"G-K)a#*)鯐r|C>Ћ?\w=dEI 6tJʐd!<A `x+"5$D` *PpL&KdždUa8h&P`NY%G]C[66#,9 Dfk*һƢ[#*bwz\hyu_3dҌcj 56t\3cX4tgR.i4ZVf#Xa#,BΨm & mJʇ&Y:b()! LoeBk5a;Ra }}'I &~rvURgm֦eyƪYFTj(XICK41]XtSҐ3u|ϛxxϚ"\y*{×쟢#*Al+U[%kJʥkEr[3RI&ƛWZih%%Tabm]Mcm-W-RMf@0Gdn#&II#&_Ȳq "øPH~w`5?|"WaWV>({3\#^ʹvu[n8W&~.U(N_f0g]J$=WY>2Ûwa@)#,R zo]Xok^nfYl##&ܰA#UkՙEZT{Mcb^̍(̂ БX5bRIVmI4ԖmADTQ#q>mcѤ:!-olГ0Y?YHJX#,FUI}@x,#IF#,1wb߯$5DGc##&*Ё#&AweQ#:AmO}2τ%K.H#5T=7o:7S%wtm#,*U׬]H>Z x$Y`@Rfa%&e\{b#*4CE@F:}pp5s!L]w!;r׎ug#,H"ҔƵMuFYORLl2R]wwwb(]h g2!{'t*3{QKO[L1Si~Q2C-:ddIg8WeHCZ k85<:Y$ƆM2kX l@(14p&$C;* @9[CT#,%C0#&+UU.НTGoF^F6MaYnpw֠oљ3$N5)F*ph6/aRM gQUɷ4; 4-#mOkDILF#R!1o:pG&]l;LO0Hb %@b( „#*Mt(ʩCxwqؙ"&ZÁPxm3#&ܧ٦zhbI`7;tL̽G=|3ICVN>&Ҹ2P>qPHxm #EQFMf5jMєQJB!igjզf#he-A6Lmm-ZL١6ѲVU&ڵ#-Y$#*OS4}]ȑVDL(rDNU]K[\8#,7ioHڿoyYjrRx]ܴ#&t6jRZܴXm~;K{Zb#&mdWߺ3F4TCA5Ta!( 0s^D\BOࣻρD#&,#,{;R@ H DV#&]CC8#,h}A&T@$!T\%KtD4Bzsc8Îߺlp!ugW0 T[R_P /F]57s.SKff#rJ-r!\O='42AT!G tZִ\\>q"$#&gAw Y'C M) #&&-MpZ(% 1"tgN[blrn(\އeZOlSSBj6)'s0#&N+k Pyqkˣ p-+>kҊ^#AwZyCd_&t$!B4!`2R2,S4]`%DDDeeIoa)>b铆v$'<Һ5`1"F3ƈ#*B4#, ’6ċ}E#,c7uJ`p#,@##$l%44 @һ1$֭=허a-ǞV0Ewz6K"PE 2$dKAzRBn̠L6R&(}|fSU-TyJݥҐ.Et8ΛCjrfTA80ás #&u: -͏-,yZ-?ii VQk0#,MAc!D@VK ) ɰYBTO1PCpN#*^>a몡A`.Vr(kXyX}"{l,9|7L8B>sD7(f6QdPĈR#,"gALٕ^-0"`ѱJ=Se#**%k1x#*`dsLe`zY&6a}E5X|;F#DX8E#&aK'j"|R >rh"jI#,6>lO[f)$q<2VM/S(I  ZꗌP0WQy$Բ$+<W&~o$3猙 a쎈ʃP0L@ÃN|}6v}Pu5kiRħh~8fLsjyF2#*#Ùvva6Ie(d+Mf5\#}c÷ːK:t>jT1UO#0qEZf]M.׍٪VK*0#*nAݭ2#,|g*@7qp*KoC t3ےc&23y6-潾 #&FEFD9<(' -6Ne-":Aw#*뻁c0g~XqFO3~8D{C)DgF#&%oE,#*6)1WΛ<;[MfٶV΢vɣUב S&/&%Fo%TTPI>Uo+c1&+ӬF8@Y&X.YUnZe k`#0ʙZiRf-2r֖5FPْM瞄lzg9uvE&#*tT1`VnkEjciGo&1Vm$ #fH^#,p j#CkoFЮfbYG2;͈h1(r ׶rS9guI QS :Ӟ~_Yx7Q>E-.rWD^䏑d\#*@ P#&tXg(I׸}%)#,WVck̬YQ2ѱi-ljֿ#WƩ2?^15* $$ޟìlzXJ.pmS3Q#&!𵚲蚇aJs:rt:Ϥ]~f <0CgiSBd3\bl9-[s3nbq5a$ȬnfS(4?˯en VAMv"-)zM 9rx"&Mb}:1t&=&2{M4"P|-tM{1m˂@(##,_9w-#*P$/-܎r9KUry]aP#&OSZ^rs\bϬt]/.=>,&ݨ/:t#&n{}^p)>4m1SCKbĦ6Y 15#hemx24tREB舙ZAqС"Hz1.`u<`SQGݡ J!!|Ml%z:19d3پ.ʉ '<8v8;UN8h44wA0Cfap$y!I&D]=0ia=4tZ8DЏe>XHk<#&oCO _dHhmNF#,SP֩J2J;xl5V滷5۬ښUӷjbZ4֫\̼\վ| $D;,T( }~^iQJ#,cPӕeȬ0H᯶c|Rl<3i>l )uITU7!ol|%PNb_@#,ѮQZ}r:2kQ#C8Id#zr:eVX"13,ȇ8׏;p&27h&WC`;8Fred"q=ʻb#&3$~k, m9|>Yd&yd!ُ>t^Pӝn*YY&L"h8$&ҙ *fSV65#&mi,k1'U5c,76pz4zCIW`F51U%SgJX BQjXy+̖Cyƽ#,J-.MM=S#*eb56$\,/=n^tz9B6NXWL}ǰ1@#Ek11U67=SbWszuUd"ѳk#**r[(GF*Db#* / =œ^fJ% T$(7p#,9Rs0"$.12k]Qkq6i(?F狶%`[R'>poX{+{XzSD-{Nˏjr+0%,DN1 5{2y:e@C)Z+u#,x%H2" 9'99oZ#*q>::a)+W!Y#j,#,, ɘIͷ[[q/g[bHY1W8#&-|h0D9<A }4;p;&8椀曧< pp !b9yc#,ʺ."he2Hp<WJHILo]f}6d= QDj5ݝu[XƣUd4.V)miez٬(U]7_5'3nh1ث $Da1D Ij &ъJwt)옆#&̸utg2!lBi=i#,~X=ݒRQ=*4^tTaV̻b+cMጄq !kJCݗM\N J*5s#,l1Y&ڄă#,b\98id˅[ɜ.Dg"Q O鉼=W"紭cV&u<aǖ`E,[C}vckx4`xM#,by˘EO:,_; rCX`rbeکdd48:4Z?p$ >X3VɪMkcj#TυZRb_9WȊ[*6!1($V1QdTV)h(\,_wޮV7t>$U@L1-gF/!/-f<ă6$Ɩnʹm^J`<06B"%jYpHT.=#~\mcV[ U)&1`Bl TH*;HMw}\ɯA8 3ix-eFQ̩!QJ q",* 0#, DQ#,#,,eG,B*FM ! "Z( 91z7Ҧ)X 3|gb1/;=~-p5|79$`ݴ=FTci;>,#&N @$е q.#,8P&|0!8yg˳G FѤr?3+Ƀ)F/SOogNu7t/ιT)qHp߇Q6UYk%E6pm$>J'8l =y폊:5X#!XcI1#*j(YKԛ˖/Q C$HA\v0(.MSEC#&#!y:l;#&K#*޳٘+N ٪U:sPeE=@(mH ATV`B DTV#*21C#,l%\<)(BL(}+[WNݫ;[aS=Vb_ldY/*y\2Ҏ^CbRVXYL*ViM4S60^7o7qB^+r60ibjAB$wn\[ǒen]sY,:mMGj]5lb&̲T+MӚN䍛Fs*:ͣXZ-vҫktnۀ@'v@@{8HǮ)b#&<OxU`j '{,#&/C 5?gU;lP$R yfc #*ϯ<"СA\^>(YP#*'[ݸEZ+[ۛB>D")k5.vE!#&DB#,AX}@5ik1;ZssYXK^-ymπCWrÉ#&$$|ۥgV@7v/@,lj6YkSMklHHpQݏQ: vAURT#KLj-m!z'6$wW,*dԖzf6h![@?[hl3ž{iw+킒4)GAs=+aqU#,l?^ T4r쭍!p=HXy0D?&zfUt#*`@Ѳg<X% 3J ;Y4"ubZ|dll$$"qyqN#H~fuǗjT wG>}JahC##h0$@E$Kd6#**'"#&ZU#&aPb VpMd6WٱkpJHJJVk1[T1f:#,#,l#&nئ)RhDBKEVe͊/8o:f.$*U`֐$H#* #&F#m.D+2W4XKs@)#,T5J5Œ@Vmmkznnf5 ~H$ NCaI~1@Пbo*$u!>=2,*"#&l ABNn TrI#*Db"էycqjb#*_Tda$#**+)h#&UP@O#&9@ ҾȦi]Zv[o5 M$S; MC:Ckw OO#,"ssX~?^q d+ߺUK'G4 T_*,-6JϴvCMH7c8i2&۰MI#,FFqjy4{bD#,i=fhyރ#,ڍʊwW5.@#,oQ@LAX KL#&ߕIiBąA$m)>N<˚vn#&rD*7Ӗ#*/{߇}e)&C`1$IP!76} :$ ~Ǘ^sҼ* (%T^Nta)+"H.I"o i;}:]_AC6PLbQ|i3L#}PzqeBG GׁS'#,oyVY5=]CZw(%$fkcs|-#*BQ-I#*Y6ddhnĀ51[) x(q,ϋ\4Q?Nj2mlpHPR6?Y/t{O/K<#,|q\yT/YwًӖᅢ#,'g9QUW&`^N>-V #8vbbYf}..:{={TѦ|f3]eyV0l}2+"˫F1d7#*0oPnmhf41SKNEAsvDGxpPF$f`Lh1z4δKoZylK;́b2M'WuNP4sOj#.<5ٸHP@Jl.\ DG>(cIJqLB }"MyH\jf/oSr/{z :@D1#*TGŹr!.йF#,P\ޮ0Hޅp!S(*x LZ[CfXԪ]{z0!S,Wb,+65r^Cza#* tbW#&Q|Z61*(MAOMEd\2O_O$#,doE-@"!C}:;s`&FNWLJ(8OL,Pf5ʪI5LZڠאux2 $IJLbH+AacQI 'sWoij~]ȵ)(XzyVeRjL{J <]ȶS@2NPMؾt#&VÄ)mlB9#,Z#, TERJȝ(#,M c9g:WZřVȎ_O1 oϰ~q>(nb>DB<q@͢{<&Kę1%l2w^rۼ`Drry=Uw<Ç+NsHg}gy4I@ 9'K|#*#@C{O8 bA$"(xB8}`AhcQV(Ҵ}?MBT.Tux{bd33}⩷=;4gn!"s-DGCu.9ټsa'ӹEnW`wjڶ-(XurPII $]}!\y8a3'j#G8r(22` LeZ}p7QRaԠ($@ BZYMϡ->#*ĚٿT3g:3Dlw(BK FkGœ,S%TB0@*Yg#&?FPFjWF#,58l uligFa 6~IgYV_xPɌ^'7 %SwgQe,֖hڦ}OawT  oCr>߬!SXվo:4m-K ߳穟?0CLI!eA(&!QL@DidTM#Ad2*#,H~Rrwa9~/=HȜkϲo,n>b\xLͱ{2iEH4ͥeF$bY@DjBa}K/:::iN:[݅D+R)YmYNNj^DP V̆8)rfmtjr2 Jü#& 9pblM]w`Z12Sm iwOy=c#&e~TuQlZG|ړmRV5ik6ۍDzE ۥ=$AQG{I9YT $EΩ_ΚtT`(i0Ф(̑("MmuusmB6jQ6Lm֔\PM(֪Tي ")/IA(T `P쿯LAK~xzݹVa$YЌpmyi$F<gX)#&7q͵bF#cn'寞^P5#& HS;RD&0Q-m'꘍GʨjV$ *oHR-7NqΧ۳O>˜=j>Н.4] tлcPYѺBtE-mW-,f*>ЁB~dj(%BLRS嚉C-POEX,흮ě<#,(TU7wֻee ,%S;lx!؃ċ#&"P*z>a& E!8ƫ~Z*!E"@(}.D: fI,}jfI0sAaL%UL)٥mwwU_m#* U%Y[mPIPZVoFުl.B]tz*0#*&FVƯsڪPj; h;mCV2h/x6|4oqkpHPD@<3fOb@TҲnaق;({#&PDDSu>36IK#,1idZ446Qj5)IRJŅ6FƶkRZeRѩ6Y4Bi#,nH!hICT5Yí?Q]Kuz͵U`HAlb@Hqn."ߜ"]DǍeg%)^>,B /nYN\#,aM4YG^qQQҮ$!rO`!H8?˾.*1ꙉ")NrZ|ڒ >uPDT9;;Ǔy+Rf~nz\mlZ5H #%R@4 =ގ#&=8Qڰ#,1Sgn@T)}M&`8C+fg㋴42ӧ;5JR}uL #&T֭T'B+IxSE)QhΝc"3\ZCg6㲗xw2=훅͐ڟY#F>g8qNW(=*o˕A'oZ:C} #&vAaMsP#LPڻu'>R|&W=*U\і#&N:~U"lԾ!us#&'%ǮiY]9iQu rsI}, xfCi9f.ƩI+ߘ !=%PDPf=9޳MkBLxԜ\wBDynz\;|K4<#Jö2$,PzZD]"#Y.nNi xXNnIaw{7Y1tO)jZ|Arnwi$1mAY븠H:9}JnvBJ' W"H0.3K4ajd+G ywƗqGY*^}c̳$u+7B~2i.9np!r5DikQlg:6h ҖRK1{\xoTwJp۩QjPxCɈ(4u|&5nZrwJy\vܭ{#,h7882W~;)_M~y(~S2;JkJg޽#,P(9Kb+Y[')gtHE^$wzqws(Y::!9Lu3\!a]Vb8^$هf=Hj~JLZ0R#i?S945kX&2#,"$Eg8rWcA1ZqF:21HbϘ#*VX,h/iږhBK67c8{ɤw+ݎ0َ0K^-ٯ~.fy@2Uԗ.LMc}YYL81=)%Gj5BX8r#&](E iv nG)ŏ/,b3x <^BkD!0:(sDfiϚNhZXv^AƙKY#,N0LSKUʅs 5n:9v)C:BuNVBf-Ν{K5vCOZg{4a#&Îm!G]<ɼZny\nwPx)h#)#T@_.B'UbҾ`w"X φ"2QI7DJ_ss rH9^[C1;`\떎r^|;srCo\M.3\=8xx8P_&\<]T8-v[YZဘ`.0QCxL QW\rrȯ'rlKzpn!/)7= %zn蘼ժdgz['fe%R֔\Z{ k*ATCKyf,ؽu:p:,ʰ6b䈀CBkv 2*-F[#ǩC<0#&^"}C2="+C^5m?lM`Pl:#&Caa#! Y˞'pP;,g8&;r.LoBv6_,,4GW+ǯrTU*qQ[NL=Im<4ш!e8&mp(4b;#&3@.g&$$$.#v! \t#*qr4>}um7W@`@SP)!NCw"0)qOn"xXR7 (R-hWZ@K ~N u /el(17Mb%/|:Z ZI*#*u_0B{ trv*zp&\ۣ+J̍~cbĻkm|w6p]cozOt&"6(Se(aR dpd#D4,bAF#YF91$YTSIKE#,lF#&EAQc@J4 F hF0je"Ȋ vXk1(*4(TQ{zN/#]x%pa39#&2ϟ!$J!a]c-AJX14BQHrڍ,n֌y0f4HŒ\L&O6l齸*Fc)K b!!H1WA PDiOR;]xa%n’Di3uiq͐‰`6K)bu h)g@6ɾ+w'R.caG7yt#*Rux1*W(kDh0( ݌n!]&BIe8ԟyдm"{A0(IÚ9Tn50f9pwh~]ނ1sj2I q#iB#,a,w:ьfc4LSDڢ&nfeX;yѼ+:6nsDڟފ=GҼ}P2@c܊HnbQs zXhxJȥ-V ٔ 4֬y6.!aZ2F;Lb~FCjYMB#*ipňiYfx!s25Ɖ4m!BtJ#kS(k+df`CP625oY^F:8$ę\i]ꢙi طwX=&LMT F#,QYwPк۟+@Y(k??oAg*% _>#&{ldN>:qR0xgn6`f/TkCUDT->#* =d@}A`^6ԾA89g;|21wo)HHC7#&־zj6lviyuͬmW+Y/((WԦk44|wa+c+#&"[aF6Lc5M5cfƩ-&Ė(fFbZbQHL iX"Rh!JXEE*0I0G\l&$;#*[_o_/와ngv-vX>=ŝh.?.#&؇73gyBFqr!CǯᖻN_<0hqRzDY#*I ֨Kc{/16܇(j ̉0e-v%ߌ $G}NAyiurtn@0%AI!u[zT^xF*Tڝ#,i9m飶Lʱ/Cv/@' ,#&QMl Z4}6U)51[\n/WmwaE,ÀHhd-\YLcOax<澴UB#*ˣUPQGJ5#,Z&"(0r@PE rYdRđC,+@6my"ʼn4t˻t$潼4c)FLX#-)F0caZm. cj %4X!C#,6*#i<Ip`sg ɂL\#,Ҫ2 (Eu*.$REPF1FRBFyԆpp 5gR8Ns LB>P20ptlCRF,clPUlNpK`,H["I$0 т{t& hqͺ%a #&Wxw@9/c8J6g["B21ZPRӡ#,alzz98y };iVd1h q16,"ڜjmC&cRRXj+7#&w40T}~k*G;&!S@:qGl='Ks9-~l&rħ7C56&TS`4I M];Na_w5ׇᶈD!#*~d?Y+awFss E$Pg+ &CMȖ#&,#&$0KI(2JZJ=fd͊{3b/2 |I[HM^9e&M8UEk>njQɐ9PO#&x0?G@H@ L}^w?njJSj;.U9w+4<Q\v:sDd*hHajwC!)l}=wg6 ~s#,bQWIs띩J;B2tu#9d,&Evk%mw-P8wvir*$؉JxaYFΪNʍ24S#,(ARn0$A#&D3uVPK@Z'9`q袥ܛѾ6 4#QHTMжP";V^-B#,(;jkfDA5Zc}hg]#*a64dlZvmPݤNp삐B%@Mfy'&Ct<Wɀb 1QP"0A?iA@Dttf)I#* 9&HN&#,30ޡuj#/MP+y8wd! & "7/¸ u069o, =C^5#!&`G&F36|O<0ӎzdZ8|AfTRjjuĴQ29&eby/kLIQ8;)@LOsЖ-n )!|95i64lT!&hsRi"h&HlqZbte'۬3R\F][fe|PcxH rt*8H(&#;+#,'q4ʕPUN {$Tt+vbiFLSEGАz8̧TM{%"zH̙#,FPz*q-BuC&^NUx4:MJ=R-0!^i]wqL%Ӟ52*TNiȊ"- [Y_#,ZXRH"gs>-]#:#*u@]b(Qvg:55Iv:`iR;8:ù#;V15#*^ bB6~/Tp8uwBٍ=BvE)&"9jg# ez E%T`ɪ6@t%.!ttHA!'NƳОk`ہ֦7!x`ayvEyKp\4m~{] CMK#*#*0jI̶D:Z7\Qv3iOF^.e™⋚>3˦xxhPb@Pfx <;iAMA6}#mCO;i.,򶲝kQN#ii=4j8,LIfʔŇƛ`x3XN; 0l= *= 1hQ@m#,#*f \f9f>JdD&{FU|Swv찰B3.ځR沝iF %0jLE2PȺakoLW0KgFDL&QS ,zIoIBfy3^&1/ PZjz_O/NٖԳ 띓̐E2`ڍŴ{8.ze Z$Z [޵î&fDvYA.3tBA 9g":0*7#3?)#$Pm($1^e+ *ҒY^)F!:Dv\*h[0L"A#* w5hJ!%#&G#&##&Ӱ#J%"+) Ápm4 xiic w§Kh4P-HRo=w]fȌ*#*:fEPS1 iC}*2E"94 v\LS$w7/P*!gVB,5pl1q@!z 7q`]hhB@HYB VC9GE"b >yyckU@(1MϏHqBXh8; lU!$}yy A5f|,yǣKôC|~ck)rH2m̶QA7KMn2(#&#&;γaB!2s(qFj~Fq@H.hضKSwE2EC@*D-A&JEThЕתҏ$OILc#,2>UR_ٷ 'Df}a n^pѬS#*H"DgM#,=d6`§&ioelOQ[bb Gķ(f}q .5bwEz70MPB-E3LfQ'@^#*JYcvLvuMfkɴXQDԣf#* Qq0'k7M-J5VmM +aeƀ.@m*"^Xʕj -""8b!U^A 2ٕ*B˗(DM#*v[;Y H,RB[SUV#*hX0 #&YRA@eLTG}W8۷7 E8#&=w\N5*KR#,50\Ѳ!B"4pJDaY +#,;Q"dm4qZ-2HƐjBQ.%#&#r{#&:@M55@TwaC0W7ȳ֟z#&WK I?eT6yD'vd,hü9'VwȢ܄` MUϗm|pQf8DPuS$bli餈5VE0; ֺgk K#&NBbFRxZ S-bHsK^2抺ghQ$68tFۏǷf`ReHsgM`6Y~oh>HͰdB)RC#&#*8c&)gߟ>xe^W/$kh6RRf1TJPVlhMTcjmj9$,SаÃ=I,Ut#*;QQGYjCvQ]=sӔÄ]IEC,־7O O,nm>#,|O"(>vBIøKW۷|_/$ax-,MҚ\ƏS~ڝ[4SĒ0ۅjnV3qAdjW.>t@l£KDW#8Iƭ1cr`uRbnȌE L"mfm0m;04F Aej*J|N/ O^ރk!̮d݊b7UZZa3dXȾ#,r}E@jLLw#*/n+Ё^Z"\TG,|BHy2N\_cQ;r"v TXZ'P"Ws!R" L;Y FqY>'C@iD rIA&v}ڤ6EaZ nr@5#,|͵=*(#,<_d #&wG]~npMC If[#*w<^йT;?\SyWA#, M,N1.4Dh 4ϗyk븭8jCY24E/&[^Eh5^.kbWYZS&`4J<OޑM@wn}QAEW_OǙg϶@$%K#,I_F}zcF&6FEe)M)ށ;/h9DB&Ϻ#u!q}#aTLX?$P5TS"#65Qѳ$c-[6#*Kڭ#&DB DS^4{t:]_gՂ_0lBFژ3*krv!f!!RA(VtT(DVܞ{xpCcAb?Lf%daw\S5v6#*qHm>`(tG/`]MXmC\5 #&UV&unC5)&TlԖ1hi6RѾW7aQZ6( ( $?WeTbE%a%ر#&X>astibd]46(JCcj'ltwmYVRm^jVjVPk6lh 1"4w/lj=5$3*?D P72iF*_<*QyFEX*ҖK#MCi1a`:#*#*`LE!idP[V4)R޳a]]ݕ^o+]ShkzUQo7uݙ]svU["ͫ˻h]]ݶeIS"Sc[i:"%NJU" QFkL"޼T`F$@K#&J3L|[)kۻwn,f]5W-v^:#@u0G3#*yUVh]b0FB &eJ*)Шck?yc_ŶhmUzh1C0:q1gp2Qr|UvCP{%CnxK"_H;7tC2^^<:X%̅C45U*qt'Fux6pi4W30Sos QrFd.#*Lo-~a#&##,2h㙍ՑwX)%:@俁:d'ڋbNA =ytqC )jk/kXt$R)h)P07mS5 D[.#*TO ]E&iL' x0I4~t>fpNWY(R'?SN,pStA]xS`[Z/pؙh h!v`#LJCq'ZH5JmJ뙙za%_P݌_=:$w*b`sP?+vJ ft4t P/67[!Df<]J=W%]_|Y sTOTEBDEf{흪խP_;^fDdZ=#,+xn*D88A ʏg_ :"#]s pOxziő&N Y03Öp#& Y٪o>E-;cObg`5T`zR#, 黧 f>;̡# 7;kEZX*䬂w Eٰ" "$`x 9<3Z@L]&l2wsl(@{)Pt8hm-[`j$11/TJPmfƲm#IbWmTyЃ(L' 2X%@3To@X" زu=ĻR"T>#&nDcCIT |ă~.|U2#p[ttQZ.e; )A?3?G@a1#&aā'WH#*[?:)-v|Sپczwjxx~o^Xg:$x4SGlfa>,5>c8y`E%n$Aee-&:?T &|CvX׊A6-XxޔjZb, A^sjnA-/C)cL`S#$P? p吧) 8fѰaqkK Hf&0 &t.1&±/%KG C=w񂺯*#*E *F";z^g +#&JU?`I,6QMǎ%#,TX0[S3]5vZMlԉ#, ! H _?`q^reC#*ش?)}e#&b\D?.OP-6YMȠ#,!k?*@cc@[6m,h?g~ݧԿ?vxNZ.$'!Y.~ANEbyy"<K'XgϷ7o:[і+t# f'#*qRH@F#,p:Wo)}5\r`þGttYX=24,M尔q4N*%KsH0NԼIYK>g6p#,k:no'?v_dyQPL{eIB l]O*#&ߣ#& ]B@ʫf +#<== diff --git a/recipes-musicians/ardour/ardour5_git.bb b/recipes-musicians/ardour/ardour5_git.bb index 95c4b66..41da333 100644 --- a/recipes-musicians/ardour/ardour5_git.bb +++ b/recipes-musicians/ardour/ardour5_git.bb @@ -28,30 +28,39 @@ DEPENDS += " \ fluidsynth \ " -inherit wafold features_check gtk-icon-cache pkgconfig +inherit waf features_check gtk-icon-cache pkgconfig python3native mime-xdg REQUIRED_DISTRO_FEATURE = "x11" SRC_URI = " \ git://github.com/Ardour/ardour.git \ + file://waf-backport/waf \ + file://waf-backport/0001-Towards-waf-python-2-3-support.patch \ + file://waf-backport/0002-Update-waf-to-v2.0.19.patch \ + file://waf-backport/0003-Change-waf-darwin-default-compiler-to-prefer-gcc-if-.patch \ + file://waf-backport/0004-Tweaks-to-build-package-scripts-for-new-waf.patch \ + file://waf-backport/0005-Downgrade-using-all-channels-warning-to-info-part-2.patch \ + file://waf-backport/0006-Update-waf2.x-subst-feature-uses-obj-attributes.patch \ + file://waf-backport/0007-a-comp.lv2-wscript-sync-to-master.patch \ file://0001-remove-all-build-flags-that-cause-trouble-for-cross-.patch \ file://0002-Use-ARM-NEON-intrinsics-if-available-for-mixing-func.patch \ file://0003-Prevent-excessive-meter-redraws-for-inactive-meters-.patch \ file://0004-Prevent-excessive-meter-redraws-for-inactive-meters-.patch \ file://0005-Follow-fluidsynth-s-API-changes-introduced-with-2.0..patch \ + file://0006-Find-fmt-binding-in-out-of-tree-building.patch \ file://ardour5.desktop \ " SRCREV = "ae0dcdc0c5d13483271065c360e378202d20170a" PV = "5.12" S = "${WORKDIR}/git" - # arch specific override - default (tested) is ARM -> no fpu-optimizations # can be something like i686 / x86_64 see file 'wscript' in sourcepath for more details BUILD_DIST_TARGET ??= "none" EXTRA_OECONF = " \ --configdir=${sysconfdir} \ + --bindir=${bindir} \ --libdir=${libdir} \ --optimize \ --cxx11 \ @@ -63,6 +72,18 @@ EXTRA_OECONF = " \ --dist-target=${BUILD_DIST_TARGET} \ " +PATH_append = ":${B}" + +waf_preconfigure() { +} + +do_configure_prepend() { + # link python -> python3 + ln -sf `which python3` ${B}/python + # copy waf + cp -f ${WORKDIR}/waf-backport/waf ${S}/ +} + do_install_append() { # install icons to freedesktop locations for s in 16 22 32 48 256 512; do