build: update waf to version 2.0.6
Change-Id: I9cb1f2dbd01312a0b113dd33a4ca9fae344b087c
This commit is contained in:
1 parent
f5fca3a95d
commit
40491df37b
8 files changed
+98
-355
No files matched your search
@@ -25,13 +25,13 @@ if [[ $JOB_NAME != *"code-coverage" && $JOB_NAME != *"limited-build" ]]; then
|
||||
sudo env "PATH=$PATH" ./waf --color=yes distclean
|
||||
fi
|
||||
|
||||
# Configure/build in debug mode with tests and without precompiled headers
|
||||
# Configure/build in debug mode with tests
|
||||
if [[ $JOB_NAME == *"code-coverage" ]]; then
|
||||
COVERAGE="--with-coverage"
|
||||
elif [[ -n $BUILD_WITH_ASAN || -z $TRAVIS ]]; then
|
||||
ASAN="--with-sanitizer=address"
|
||||
fi
|
||||
./waf --color=yes configure --debug --with-tests --without-pch $COVERAGE $ASAN
|
||||
./waf --color=yes configure --debug --with-tests $COVERAGE $ASAN
|
||||
./waf --color=yes build -j${WAF_JOBS:-1}
|
||||
|
||||
# (tests will be run against debug version)
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
|
||||
|
||||
from waflib import TaskGen, Logs
|
||||
from waflib import TaskGen
|
||||
|
||||
def options(opt):
|
||||
opt.add_option('--with-coverage', action='store_true', default=False, dest='with_coverage',
|
||||
help='''Set compiler flags for gcc to enable code coverage information''')
|
||||
opt.add_option('--with-coverage', action='store_true', default=False,
|
||||
help='Add compiler flags to enable code coverage information')
|
||||
|
||||
def configure(conf):
|
||||
if conf.options.with_coverage:
|
||||
if not conf.options.debug:
|
||||
conf.fatal("Code coverage flags require debug mode compilation (add --debug)")
|
||||
conf.fatal('Code coverage flags require debug mode compilation (add --debug)')
|
||||
conf.check_cxx(cxxflags=['-fprofile-arcs', '-ftest-coverage', '-fPIC'],
|
||||
linkflags=['-fprofile-arcs'], uselib_store='GCOV', mandatory=True)
|
||||
|
||||
|
||||
@@ -1,16 +1,17 @@
|
||||
# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
|
||||
|
||||
from waflib import Logs, Configure, Utils
|
||||
from waflib import Configure, Logs, Utils
|
||||
|
||||
def options(opt):
|
||||
opt.add_option('--debug', '--with-debug', action='store_true', default=False, dest='debug',
|
||||
help='''Compile in debugging mode with minimal optimizations (-O0 or -Og)''')
|
||||
opt.add_option('--debug', '--with-debug', action='store_true', default=False,
|
||||
help='Compile in debugging mode with minimal optimizations (-O0 or -Og)')
|
||||
|
||||
def configure(conf):
|
||||
conf.start_msg('Checking C++ compiler version')
|
||||
|
||||
cxx = conf.env['CXX_NAME'] # CXX_NAME is the generic name of the compiler
|
||||
ccver = tuple(int(i) for i in conf.env['CC_VERSION'])
|
||||
cxx = conf.env.CXX_NAME # generic name of the compiler
|
||||
ccver = tuple(int(i) for i in conf.env.CC_VERSION)
|
||||
ccverstr = '.'.join(conf.env.CC_VERSION)
|
||||
errmsg = ''
|
||||
warnmsg = ''
|
||||
if cxx == 'gcc':
|
||||
@@ -28,13 +29,13 @@ def configure(conf):
|
||||
conf.flags = CompilerFlags()
|
||||
|
||||
if errmsg:
|
||||
conf.end_msg('.'.join(conf.env['CC_VERSION']), color='RED')
|
||||
conf.end_msg(ccverstr, color='RED')
|
||||
conf.fatal(errmsg)
|
||||
elif warnmsg:
|
||||
conf.end_msg('.'.join(conf.env['CC_VERSION']), color='YELLOW')
|
||||
conf.end_msg(ccverstr, color='YELLOW')
|
||||
Logs.warn(warnmsg)
|
||||
else:
|
||||
conf.end_msg('.'.join(conf.env['CC_VERSION']))
|
||||
conf.end_msg(ccverstr)
|
||||
|
||||
conf.areCustomCxxflagsPresent = (len(conf.env.CXXFLAGS) > 0)
|
||||
|
||||
@@ -53,10 +54,10 @@ def check_compiler_flags(conf):
|
||||
extraFlags = conf.flags.getDebugFlags(conf)
|
||||
if conf.areCustomCxxflagsPresent:
|
||||
missingFlags = [x for x in extraFlags['CXXFLAGS'] if x not in conf.env.CXXFLAGS]
|
||||
if len(missingFlags) > 0:
|
||||
Logs.warn("Selected debug mode, but CXXFLAGS is set to a custom value '%s'"
|
||||
% " ".join(conf.env.CXXFLAGS))
|
||||
Logs.warn("Default flags '%s' are not activated" % " ".join(missingFlags))
|
||||
if missingFlags:
|
||||
Logs.warn('Selected debug mode, but CXXFLAGS is set to a custom value "%s"'
|
||||
% ' '.join(conf.env.CXXFLAGS))
|
||||
Logs.warn('Default flags "%s" will not be used' % ' '.join(missingFlags))
|
||||
else:
|
||||
extraFlags = conf.flags.getOptimizedFlags(conf)
|
||||
|
||||
@@ -106,6 +107,9 @@ def add_supported_linkflags(self, linkflags):
|
||||
|
||||
|
||||
class CompilerFlags(object):
|
||||
def getCompilerVersion(self, conf):
|
||||
return tuple(int(i) for i in conf.env.CC_VERSION)
|
||||
|
||||
def getGeneralFlags(self, conf):
|
||||
"""Get dict of CXXFLAGS, LINKFLAGS, and DEFINES that are always needed"""
|
||||
return {'CXXFLAGS': [], 'LINKFLAGS': [], 'DEFINES': []}
|
||||
@@ -160,16 +164,14 @@ class GccBasicFlags(CompilerFlags):
|
||||
class GccFlags(GccBasicFlags):
|
||||
def getDebugFlags(self, conf):
|
||||
flags = super(GccFlags, self).getDebugFlags(conf)
|
||||
version = tuple(int(i) for i in conf.env['CC_VERSION'])
|
||||
if version < (5, 1, 0):
|
||||
if self.getCompilerVersion(conf) < (5, 1, 0):
|
||||
flags['CXXFLAGS'] += ['-Wno-missing-field-initializers']
|
||||
flags['CXXFLAGS'] += ['-fdiagnostics-color'] # gcc >= 4.9
|
||||
return flags
|
||||
|
||||
def getOptimizedFlags(self, conf):
|
||||
flags = super(GccFlags, self).getOptimizedFlags(conf)
|
||||
version = tuple(int(i) for i in conf.env['CC_VERSION'])
|
||||
if version < (5, 1, 0):
|
||||
if self.getCompilerVersion(conf) < (5, 1, 0):
|
||||
flags['CXXFLAGS'] += ['-Wno-missing-field-initializers']
|
||||
flags['CXXFLAGS'] += ['-fdiagnostics-color'] # gcc >= 4.9
|
||||
return flags
|
||||
@@ -177,8 +179,8 @@ class GccFlags(GccBasicFlags):
|
||||
class ClangFlags(GccBasicFlags):
|
||||
def getGeneralFlags(self, conf):
|
||||
flags = super(ClangFlags, self).getGeneralFlags(conf)
|
||||
version = tuple(int(i) for i in conf.env['CC_VERSION'])
|
||||
if Utils.unversioned_sys_platform() == 'darwin' and version >= (9, 0, 0): # Bug #4296
|
||||
if Utils.unversioned_sys_platform() == 'darwin' and self.getCompilerVersion(conf) >= (9, 0, 0):
|
||||
# Bug #4296
|
||||
flags['CXXFLAGS'] += [['-isystem', '/usr/local/include'], # for Homebrew
|
||||
['-isystem', '/opt/local/include']] # for MacPorts
|
||||
return flags
|
||||
@@ -194,7 +196,7 @@ class ClangFlags(GccBasicFlags):
|
||||
'-Wno-error=unneeded-internal-declaration', # Bug #1588
|
||||
'-Wno-unused-local-typedef', # Bugs #2657 and #3209
|
||||
]
|
||||
version = tuple(int(i) for i in conf.env['CC_VERSION'])
|
||||
version = self.getCompilerVersion(conf)
|
||||
if version < (3, 9, 0) or (Utils.unversioned_sys_platform() == 'darwin' and version < (8, 1, 0)):
|
||||
flags['CXXFLAGS'] += ['-Wno-unknown-pragmas']
|
||||
return flags
|
||||
@@ -206,7 +208,7 @@ class ClangFlags(GccBasicFlags):
|
||||
'-Wundefined-func-template',
|
||||
'-Wno-unused-local-typedef', # Bugs #2657 and #3209
|
||||
]
|
||||
version = tuple(int(i) for i in conf.env['CC_VERSION'])
|
||||
version = self.getCompilerVersion(conf)
|
||||
if version < (3, 9, 0) or (Utils.unversioned_sys_platform() == 'darwin' and version < (8, 1, 0)):
|
||||
flags['CXXFLAGS'] += ['-Wno-unknown-pragmas']
|
||||
return flags
|
||||
@@ -1,153 +0,0 @@
|
||||
#! /usr/bin/env python
|
||||
# encoding: utf-8
|
||||
# Alexander Afanasyev (UCLA), 2014
|
||||
|
||||
"""
|
||||
Enable precompiled C++ header support (currently only clang++ and g++ are supported)
|
||||
|
||||
To use this tool, wscript should look like:
|
||||
|
||||
def options(opt):
|
||||
opt.load('pch')
|
||||
# This will add `--with-pch` configure option.
|
||||
# Unless --with-pch during configure stage specified, the precompiled header support is disabled
|
||||
|
||||
def configure(conf):
|
||||
conf.load('pch')
|
||||
# this will set conf.env.WITH_PCH if --with-pch is specified and the supported compiler is used
|
||||
# Unless conf.env.WITH_PCH is set, the precompiled header support is disabled
|
||||
|
||||
def build(bld):
|
||||
bld(features='cxx pch',
|
||||
target='precompiled-headers',
|
||||
name='precompiled-headers',
|
||||
headers='a.h b.h c.h', # headers to pre-compile into `precompiled-headers`
|
||||
|
||||
# Other parameters to compile precompiled headers
|
||||
# includes=...,
|
||||
# export_includes=...,
|
||||
# use=...,
|
||||
# ...
|
||||
|
||||
# Exported parameters will be propagated even if precompiled headers are disabled
|
||||
)
|
||||
|
||||
bld(
|
||||
target='test',
|
||||
features='cxx cxxprogram',
|
||||
source='a.cpp b.cpp d.cpp main.cpp',
|
||||
use='precompiled-headers',
|
||||
)
|
||||
|
||||
# or
|
||||
|
||||
bld(
|
||||
target='test',
|
||||
features='pch cxx cxxprogram',
|
||||
source='a.cpp b.cpp d.cpp main.cpp',
|
||||
headers='a.h b.h c.h',
|
||||
)
|
||||
|
||||
Note that precompiled header must have multiple inclusion guards. If the guards are missing, any benefit of precompiled header will be voided and compilation may fail in some cases.
|
||||
"""
|
||||
|
||||
import os
|
||||
from waflib import Task, TaskGen, Logs, Utils
|
||||
from waflib.Tools import c_preproc, cxx
|
||||
|
||||
|
||||
PCH_COMPILER_OPTIONS = {
|
||||
'clang++': [['-include'], '.pch', ['-x', 'c++-header']],
|
||||
'g++': [['-include'], '.gch', ['-x', 'c++-header']],
|
||||
}
|
||||
|
||||
|
||||
def options(opt):
|
||||
opt.add_option('--without-pch', action='store_false', default=True, dest='with_pch', help='''Try to use precompiled header to speed up compilation (only g++ and clang++)''')
|
||||
|
||||
def configure(conf):
|
||||
if (conf.options.with_pch and conf.env['COMPILER_CXX'] in PCH_COMPILER_OPTIONS.keys()):
|
||||
if Utils.unversioned_sys_platform() == "darwin" and conf.env['CXX_NAME'] == 'clang':
|
||||
version = tuple(int(i) for i in conf.env['CC_VERSION'])
|
||||
if version < (6, 1, 0):
|
||||
# Issue #2804
|
||||
return
|
||||
conf.env.WITH_PCH = True
|
||||
flags = PCH_COMPILER_OPTIONS[conf.env['COMPILER_CXX']]
|
||||
conf.env.CXXPCH_F = flags[0]
|
||||
conf.env.CXXPCH_EXT = flags[1]
|
||||
conf.env.CXXPCH_FLAGS = flags[2]
|
||||
|
||||
|
||||
@TaskGen.feature('pch')
|
||||
@TaskGen.before('process_source')
|
||||
def apply_pch(self):
|
||||
if not self.env.WITH_PCH:
|
||||
return
|
||||
|
||||
if getattr(self.bld, 'pch_tasks', None) is None:
|
||||
self.bld.pch_tasks = {}
|
||||
|
||||
if getattr(self, 'headers', None) is None:
|
||||
return
|
||||
|
||||
self.headers = self.to_nodes(self.headers)
|
||||
|
||||
if getattr(self, 'name', None):
|
||||
try:
|
||||
task = self.bld.pch_tasks[self.name]
|
||||
self.bld.fatal("Duplicated 'pch' task with name %r" % self.name)
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
out = '%s.%d%s' % (self.target, self.idx, self.env['CXXPCH_EXT'])
|
||||
out = self.path.find_or_declare(out)
|
||||
task = self.create_task('gchx', self.headers, out)
|
||||
|
||||
# target should be an absolute path of `out`, but without precompiled header extension
|
||||
task.target = out.abspath()[:-len(out.suffix())]
|
||||
|
||||
self.pch_task = task
|
||||
if getattr(self, 'name', None):
|
||||
self.bld.pch_tasks[self.name] = task
|
||||
|
||||
@TaskGen.feature('cxx')
|
||||
@TaskGen.after_method('process_source', 'propagate_uselib_vars')
|
||||
def add_pch(self):
|
||||
if not (self.env['WITH_PCH'] and getattr(self, 'use', None) and getattr(self, 'compiled_tasks', None) and getattr(self.bld, 'pch_tasks', None)):
|
||||
return
|
||||
|
||||
pch = None
|
||||
# find pch task, if any
|
||||
|
||||
if getattr(self, 'pch_task', None):
|
||||
pch = self.pch_task
|
||||
else:
|
||||
for use in Utils.to_list(self.use):
|
||||
try:
|
||||
pch = self.bld.pch_tasks[use]
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
if pch:
|
||||
for x in self.compiled_tasks:
|
||||
x.env.append_value('CXXFLAGS', self.env['CXXPCH_F'] + [pch.target])
|
||||
|
||||
class gchx(Task.Task):
|
||||
run_str = '${CXX} ${ARCH_ST:ARCH} ${CXXFLAGS} ${CPPFLAGS} ${CXXPCH_FLAGS} ${FRAMEWORKPATH_ST:FRAMEWORKPATH} ${CPPPATH_ST:INCPATHS} ${DEFINES_ST:DEFINES} ${CXXPCH_F:SRC} ${CXX_SRC_F}${SRC[0].abspath()} ${CXX_TGT_F}${TGT[0].abspath()}'
|
||||
scan = c_preproc.scan
|
||||
color = 'BLUE'
|
||||
ext_out=['.h']
|
||||
|
||||
def runnable_status(self):
|
||||
try:
|
||||
node_deps = self.generator.bld.node_deps[self.uid()]
|
||||
except KeyError:
|
||||
node_deps = []
|
||||
ret = Task.Task.runnable_status(self)
|
||||
if ret == Task.SKIP_ME and self.env.CXX_NAME == 'clang':
|
||||
t = os.stat(self.outputs[0].abspath()).st_mtime
|
||||
for n in self.inputs + node_deps:
|
||||
if os.stat(n.abspath()).st_mtime > t:
|
||||
return Task.RUN_ME
|
||||
return ret
|
||||
@@ -1,94 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
# Philipp Bender, 2012
|
||||
# Matt Clarkson, 2012
|
||||
|
||||
import re
|
||||
from waflib.Task import Task
|
||||
from waflib.TaskGen import extension
|
||||
|
||||
"""
|
||||
A simple tool to integrate protocol buffers into your build system.
|
||||
|
||||
Example::
|
||||
|
||||
def configure(conf):
|
||||
conf.load('compiler_cxx cxx protoc')
|
||||
|
||||
def build(bld):
|
||||
bld(
|
||||
features = 'cxx cxxprogram'
|
||||
source = 'main.cpp file1.proto proto/file2.proto',
|
||||
include = '. proto',
|
||||
target = 'executable')
|
||||
|
||||
Notes when using this tool:
|
||||
|
||||
- protoc command line parsing is tricky.
|
||||
|
||||
The generated files can be put in subfolders which depend on
|
||||
the order of the include paths.
|
||||
|
||||
Try to be simple when creating task generators
|
||||
containing protoc stuff.
|
||||
|
||||
"""
|
||||
|
||||
class protoc(Task):
|
||||
# protoc expects the input proto file to be an absolute path.
|
||||
run_str = '${PROTOC} ${PROTOC_FLAGS} ${PROTOC_ST:INCPATHS} ${SRC[0].abspath()}'
|
||||
color = 'BLUE'
|
||||
ext_out = ['.h', 'pb.cc']
|
||||
def scan(self):
|
||||
"""
|
||||
Scan .proto dependencies
|
||||
"""
|
||||
node = self.inputs[0]
|
||||
|
||||
nodes = []
|
||||
names = []
|
||||
seen = []
|
||||
|
||||
if not node: return (nodes, names)
|
||||
|
||||
search_paths = [self.generator.path.find_node(x) for x in self.generator.includes]
|
||||
|
||||
def parse_node(node):
|
||||
if node in seen:
|
||||
return
|
||||
seen.append(node)
|
||||
code = node.read().split("\n")
|
||||
for line in code:
|
||||
m = re.search(r'^import\s+"(.*)";.*(//)?.*', line)
|
||||
if m:
|
||||
dep = m.groups()[0]
|
||||
for incpath in search_paths:
|
||||
found = incpath.find_resource(dep)
|
||||
if found:
|
||||
nodes.append(found)
|
||||
parse_node(found)
|
||||
else:
|
||||
names.append(dep)
|
||||
|
||||
parse_node(node)
|
||||
return (nodes, names)
|
||||
|
||||
@extension('.proto')
|
||||
def process_protoc(self, node):
|
||||
cpp_node = node.change_ext('.pb.cc')
|
||||
hpp_node = node.change_ext('.pb.h')
|
||||
self.create_task('protoc', node, [cpp_node, hpp_node])
|
||||
self.source.append(cpp_node)
|
||||
|
||||
if 'cxx' in self.features and not self.env.PROTOC_FLAGS:
|
||||
self.env.PROTOC_FLAGS = '--cpp_out=%s' % node.parent.get_bld().abspath()
|
||||
|
||||
use = getattr(self, 'use', '')
|
||||
if not 'PROTOBUF' in use:
|
||||
self.use = self.to_list(use) + ['PROTOBUF']
|
||||
|
||||
def configure(conf):
|
||||
conf.check_cfg(package="protobuf", uselib_store="PROTOBUF", args=['--cflags', '--libs'])
|
||||
conf.find_program('protoc', var='PROTOC')
|
||||
conf.env.PROTOC_ST = '-I%s'
|
||||
|
||||
+6
-11
@@ -4,29 +4,24 @@ from waflib import Utils
|
||||
top = '..'
|
||||
|
||||
def build(bld):
|
||||
test_main = bld(
|
||||
bld.objects(
|
||||
target='tests-main',
|
||||
name='tests-main',
|
||||
features='cxx',
|
||||
source='main.cpp',
|
||||
use='ChronoSync',
|
||||
defines=['BOOST_TEST_MODULE=ChronoSync']
|
||||
)
|
||||
defines=['BOOST_TEST_MODULE=ChronoSync'])
|
||||
|
||||
unit_test = bld.program(
|
||||
bld.program(
|
||||
target="../unit-tests",
|
||||
name='unit-tests',
|
||||
source=bld.path.ant_glob(['unit-tests/**/*.cpp', 'identity-management-fixture.cpp']),
|
||||
features=['cxx', 'cxxprogram'],
|
||||
use='ChronoSync tests-main',
|
||||
includes=['.'],
|
||||
install_path=None,
|
||||
)
|
||||
install_path=None)
|
||||
|
||||
# TODO: Re-enable when there integration tests are implemented
|
||||
# integrated_test = bld.program(
|
||||
# bld.program(
|
||||
# target="../integrated-tests",
|
||||
# source=bld.path.ant_glob(['integrated-tests/**/*.cpp']),
|
||||
# features=['cxx', 'cxxprogram'],
|
||||
# use='ChronoSync tests-main',
|
||||
# includes=['.'],
|
||||
# install_path=None,
|
||||
|
||||
@@ -33,12 +33,12 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||
import os, sys, inspect
|
||||
|
||||
VERSION="2.0.6"
|
||||
REVISION="784a4c698ea9764e23d81f1ca6a6e8ba"
|
||||
REVISION="593191f496fe8c66231dfd5df26167ae"
|
||||
GIT="459ddf50b622573ecfe36c12c076e0fcc610b01e"
|
||||
INSTALL=''
|
||||
C1='#1'
|
||||
C2='#/'
|
||||
C3='#-'
|
||||
C1='#2'
|
||||
C2='#&'
|
||||
C3='#%'
|
||||
cwd = os.getcwd()
|
||||
join = os.path.join
|
||||
|
||||
@@ -165,5 +165,6 @@ if __name__ == '__main__':
|
||||
Scripting.waf_entry_point(cwd, VERSION, wafdir)
|
||||
|
||||
#==>
|
||||
#BZh91AY&SYØeàK°ÿÿ°ÐÿÿÿÿÿÿÿÿÿÿÿÿE ‚„ 0�#-ˆ(b¼w{>÷#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-Ü}ÔË3cï`wµU¡”öÝ´í}¸®ÛkT‡»Ûw›m›h�›ÛÎóŸx,×ß4íJö[–ìêÐ×Ìóï¾\{i8{µ³‰TÞÚvÞö[»Ð¤»AÊŽö(Ùmw£D>yöº»aQ¹>ø7Ÿk®á–U�.·½}{ÛÃAÕÛÇÚÝ›oo¾ï+ܽͽ¸ëW<àè#-4#-;°Oc@è#1` ÷e#-8ôk¹½íæ{=w´‡®ÝÏAÞÔ{�vµ³Jh#-쮹Ôëè ò€§§¶6’#/h�6Í·Nà#1T¡Aï`áIÓAI:¶:ÅP#-èvàä£ß|ùöû®ŸnãÚ¢öÚófnð¹{�)™×"TvÅÖ%)·]_sÕÍ£ß{§€mîö>ûªëÏmzÊ©w]‘^÷›‡$�tíï½Ý{}ïv{󴎲jO¾Þ“Ϧõní–O»Ó½óSŽA¥+Q2Ð) ˆ=TwwmîÎóm¯<÷·½ï,tÅu¡í·5†Ù›)"¤œó#/Í=#-‰@¥TEGPŒSÑÞ6ñ—1·»wpÉKîﻹó3äУè#-#-gÖHÙ�µ€7Œ#-˾°vÙ˜#/ó·�h)^÷»opÞ÷�o.wØ÷o§½÷Øô¼ëãºîaÛ:(û¸qz·}ìíO#1×-–Ûxžfù÷×yv®âûžö˜ó®ÛÞ÷HöÝ}½ÝÍ$íåÆî[»»ÞÞ¶—pw§¶ú÷«¾tú÷wgT5ºáu׸hW}Ü%ñ<ž�{Æ#1:{c{îÝìåöåðúE$¶WÞ›¢|ökÛ»›6ÚÙëµ÷9+ÞâcïeÕ-Ük²^ºG;ÞöæžiÉ×Ö¯=MÑó›#-Nz¼Þ�wÞûîá÷lw™^ŠP#1‰UÖ”ª¥@Ùƒs6ÌÏa§bÚÇŽû*Ü«ÛÞ„ƒ¼ÍÌ݉Ðô®¦ÏfQ]vÊóx÷²¡o]åÕZw[35ìÏ#-#-Mç8€#-¢÷¯yÞ^®óº÷¬â“›YÙ'"§o»=î;ÜÙnhÍÆå¨l½2èÒŸ{»ÓD½}ÕSFy#/Έƒ{ÞÏZÛ8Ÿ=繜¯%Z#1Þ凶¢ãÝnžÙ¯nQ{+¼4ÚÛÓ³ùÞ8ûïs‡dºÞï\÷mÝܼxÔã>n'šìÖ|^�6^àû}ÜøöŒÍƒ`ØÀ>žN…{zé<¯§^ø=·]mƒ5WVêz4mév^öw{UÏ·}ë@Zí� Èni”ú×¼èÓ¸0:î÷tX»®>æöö;WJë¢Ý¹Ó®Å};.Ã{Þû½wŸUëlr»4ØôÊ»â:�ÖG÷j]máÜ:-¶ã›r{èÐÛˆ>• EížÖAî#-ʸò¯;u÷ž÷8»#1è#-4è{½àëÝÝnØo{›Æï+“Q¢÷87kµwvæçk-ØÙÄŠ;#1éÝ�RîÛ»SÞ9pÍîäèŽ7¼äåJò;3½Ëºñy÷ÛoZÁ—£àž±¶!“GŸn=�³ÙÃC+—½™;-i¹×tkäï½Å÷°VS»»r�¼öדݽ>+°ÓD#-€#-™2#-Œš4ÓÓ Dò�FÊ4y@=G©š†'”ü¨%4BhL@#1a1 ”ñIž§©©íPÑ¡“z�#-€#-#-#-$"šhÒdÈ £M ?*§èõOÕ6i0MSô'¥=#/ õ6Ô�Iê#-#-h&‚OT¤‰4SÓFMi)â›ÓTö¨õ='¤i¦Ô#/#-Ñ£CAêP#-#-#-#-#-’€#-@Ȧš54jc$4Á0#13CBG© #-#-#-#-“Q@@#-M#/ OÕOÊ~¦©úÓÊ{Sô”õ¡êiúˆ€h#-d#-Çÿìÿbª×\Hÿv#/ËZœ¿n«]Ò…1äª×tB0m±i«Iïµ[\µmQµi|’`�yúOÑ9ý¤qá5f)Ii¬Ç^—çú='Š|NDáTÑ‚îåMbÞ&Zsþ ¾'ü¶gîW6 9ÁZ‰¤RMr FF‚5›#‘�ºwÃÂÝ׆¦MíÃ,Í–×¹‡:»—Z�Q—Yƒœ=hâFdÖÍÎ+†˜#-… þÞuËòº2H0$¶SººÕ¥¶¢Ú©*Öe"B© ©"£"#-7#-HŠ�EòçaD‚ èRF#-#-b*ŽQA#1A±B=щVòÖ¶šµ5wE±X·´ÚŠÕkm|-µ«TÌ™%š�LÓd@ÉŒ)66¢&f¡Æ@%”£J)¶“a‰š$ÐJ2Zš‹cA…´f’ɦ‘&¢*1Hš”£ Ñ©c@bÊ›F’)6KFÔE K-)¦´@Ä,´†ÍÁ”eŒV�FÔd•”ÙE iŒ” †�,´Œ`E)hÔÓa-¥mf¶´3bM™3!4EY6Ó[M6�5%)*kc-M¶eL´™$ÄPlEšÓE’Š#1dQ²$Z"¢Í#h¤Àh¨�BÁ±IS1šTD)ˆÁ±B‚DIŒC"2HÚ���,DÛ3C"&)„ˆfIM+,˜‘Idb)d¬›6&"Ä2YHHÑiJ`›RdQ”I£&…1 ©(Ò%¤�+ ¦Æ‰"ÄQ3)iˆ¦`›É؉1MÍ‚ab6¤° ,¬!I)65I¨Å$%ˆ$J4H¢`°`&C%0ŒYBe“Q©•+ ²jH’b iM�$"H²[bË2ŠFÌ’‰³26"fÄÈŠQ›#0Lªi‰!R‚˲H4Ò1©Y,‘±D© ‘M$ÄR%M2�’jIeA�F“4�¢€‚)¦Š%j�ÄË(4–FB1d¤Èš ¦R%FŒÃe#1LTa”‚B�I˜À‰#–He„Ål“*fm¦1¶SX”D̆¤S¤FlYB²š6H¢ˆ"’I6HÆÆ2lÒ53E‹”�¤ÌÌRÈÊͦ±‚"™“MLšd‚�ÆQ…š"¦ÅjT¥%4RFLdȦÒY#£)!HŠ,mŠI1$šSQ²j4‰4��1ÐLÖi16ƒFÆ`Í!4™F"Æ‘2dI)²S"”D!dÈKY³bÖK’IdƨªA2ØR$Ècc"A„e’Æ£L%FRšP(ªa¡&e&)†Y6De0H¥š4Ëj#1I”dHhšÚ•µ£”&¦hÊdlÒŠI™ Ô¥°)f‹1I¤e e•6h‹S+e�Å6"¢2‘�¤%-1µÑ STˆ‚0ÄfÑF*+ck&S4ÔR¤š44´†ØØFÉ5Y†¡¤ÆQ’,¦T‘¬ˆ33L¶M´bIKcj)FM0‰bk1´,jAJZi“&TšƒbÊ´�6PŠÙ2ȪU+0¦ÍŒÆe‹DkdÓ+"TË)µ’¬¶R”Ó#[#@d¤mEŠVX’Ò)j5PZ ±«FJ‚Ь•’�ª6ŠŠ“V&ˆ™#lXŠˆ±Z‹´mbÀZL˜X6¨#1`%‚XÑ„-2M+Mb-�LJÆ-’,[Ij©mYEBBe3SVMTŒHDÓiY"Ö¥Y¶1Jm6Ë)S,ÓjšDF¶•K$™š¥Hň[BJe5–46Y5•–B¶iˆ„‚†Ti"BÅbÀš01$Ch4&1#1[F¨J%Eš¢²M4l™4”Y#-Ùb‘M”�£dEe‘‘Êf%#1J6S4AE¢¦HDfÓi1Dcll…0ŒÓ bC(ÐÓ š‚ÄbCd Æ‚IšŠ4ILŠQ ³J¨J˜ÒcL%*e’QhÈ@Q™j2”lÊI(È2†,¥b"˜mÔ”d°�’,°…-4)Äš4Y”Ù””²•™’±„h²FÄ1©£TlÖŒÑ#/)¤ØiŠ–+2‹Q HÈI�&2#/16$©*L¡�”Ó$e²R•ƒlÃf’ɱšM6b%#/(ÉY•¬ˆÓB¦h�‘*HˆA²ÌhÛ4�Š4@Öi6Jb&"i)! ´Z-„¨Ôj(ÅcŒÍa¤ÃI&…&FÆ)D±FÀ–‚²Í’ÈfQÅFBÉK4•2h¨HÖ5F¨“E –V‚ÅjMQ°dðŒj”¡«A¥4Ë!E$ЦE¢Õ"Äe-lŠ”UÆ“E“DS2…©E!™(’¦Ä¢&U¨�¬*eE’£h˜³J-“%bÕ¤Å%e6È[&ÆÐÑ6ILƒ)QaA±cd¢É¢HŒFÙ"CQI25fLTiM™±1Ö5EL¬šÉBšI¨ ˆÅM©6‹e$±²b1¢‚4˜2JÔˆÑie£he¨“Qjб”£i+dA#1£ljJ,R)¡2)‘™jDPjfÉ3Z"ÅRX¶�IRÍ´šÑ3j-�HQ±±’5±Lªi¶�£hضÆ-©3J!,¬¬KQŠÅ™±µJ•¥RŒÅB2“(4X"J�&±¬Y•$Z’¶,›e&Z�ˆiŠJ4mÖÙj±H™P©‰(ŒT0’ÆŠŠi&ÔÃ%XÛØ´Í[F5¬´•42ÖÊY-©©¶BÚ�5bhÊ(ˆÑ‘´’Š#/†³RjLÍ–TEbI2’dFF#!T–Ñf‚±“þÏùv?ñþêþû'–v²e®™ö»*±” ñĹ–#/ÛvOéË RAV4Ÿ%©Æñ‹kû¶Å�0jFã$?ò^íTÙý¿Qm£ËDvÿ’q‰FŠŽ0)b\0RH9"omF?SòýúÚ'ý¬Ä¿Pgÿ_ºÖ�ûI%#1Zå#-•´+(U!y9äÑþí‹nrzÅZM‡´ëóâ8ßgPø+(2?;;½X´í‰ÉÝæDdq(ÆÃ†.qÙè£LßœºsÿM¬+Œ™#-’;KµØ½.ô×Dú•ÃÉÉ£®ÉÞwHMíݽ¹w²öUê^5Ë9ܳ.û]fsW ɰ÷ís½ß+{¯a}>½üÞʸ\®T–+e˜¥Í®Å�Ö1¤gQ�]‘m3–¢ÈÍ鹤ÐY"’‹×ž¼Ö@Ö÷.9_ü–X{#-ÝÂ3LAEѧÅßí¹®š<Wå딖ıb‚>ïûõ”;^LV¢eæØŠ)„)´)Nþ9+ï¹$SW‚°-‚‘º&w€£Çôî\�þ¡‡“(ÎÏ£#1ÐA¢#/#/e†ížÓèÿ¹¯.‡*y(Vr¡©·çÚÖ#-ŽŽ·@g7rꔎm²ÁAi¤è»ŠesnšCEsnžw6*'×uñšÞ-"žþêù›ö•âûäS+är5±¹Ò1ÿ©¨\q¨Ûç´B!,;÷Ì!³iå–š&¥µV(+¢3Œ#-¤�XÕ‚ÛLYƶØÅÕ!¦{ÉxÜÞêæ�AÄ×\®ó»£¥ræJ2ëºIæBûZ¥‡þsü¤§‚ᑦÄ=�‰1´`…43»leÓ'–¬X+ó¢‘=*iúÜi�©ù=1!—‚•ÿrŠM˜sÓª€¨â¡þ`‡Ù‰[?’jÀ\$¥ÀÎúúâôà…ó§ãþñ¦²Å.2IBhLAù;ôÔ4b§r£MzõXä‘A‘LÏYÁDÈp%•œt²Ýt>8,Ö†«ƒ-ÑÄe''Vv&ŒœÙ%ó¯K®Ë3+·–·„ê÷²�xÕE)ûº}·èç•ô0{S³v·NM|êÁ6�)!ÈYSµ7LèÔš4hR—E)Ѫ²(5ŠòYlËS““J�ÛE,QÆxÞ>×劜ÕÊEçªL]ÁÆF4›O$WØÊ÷†¯GXYc�öï<þ²¾ß]½1ntÇò»C2b—ÏÅ4P²1ÐøPX†ù±+W¢#cÁÛ —»ží箞±Ð3=�I~6Íí¥`òeká]S¥4P0YP¯–MFñµsm·ýy(Óëu3!”+‚†*?káüh:戰j‚S ÐÁô|ŸÇæ×¦Ò&1‰MEÄŠ0›pA�qŠ3ÔÏ<€`Îáç{.Xô¸dÑs\Ômbó¾íëÖð�”«&ÃÞîXÔWïKuîì}Ýq�±BoŸ¯‡âžýÝs�“o™õ7Œj#/%¾ÇEQ`¤uNÛÐCÙŠñÓk0Ÿ6¦*ÉM08ëRZ?…C—2ƒŒEsZÙ«>ô›Ò”¬û�Ÿw[va‘¬›ô÷³µÐ´Â¹ïeá¨$`²˜,5m’è)J´�âÚDí©–´§t<hðqºQL¡—UiH®Ýõk#¹àèïáYNNYzw]ƒH¨ÀS�E#1lÃQMZH"JuœëJ»*”ÓÒÛKMZûR—ucg”"ûš'nÔ+MQX�Ry²Ö"<�4º:Q@'…SÉø(õptÝ\qXâ#/bÀ„rXM®îø–¨‹ˆA}É~w¨‡/TïÌc]¤9ºÃ$ß…J»aÑ�«2Ã<,°"€"Æ+FdiMù{™�ÅÞÓÍ7]\¦Iÿ›ó‚øúàLine truncated
|
||||
#BZh91AY&SYü¢K°ÿÿ°ÐÿÿÿÿÿÿÿÿÿÿÿÿE ‚„ 0�#%ˆ(b|wzs*#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%úóJ´¶*«ûÜ=JV;ºîË×v›»ª‹^\¨IÓ$o£=>í_nÓk!Û®ÖëÓ'›ßO¾X6½³gvÝ”qP{»¯Z´kRÛ]/I±Û1Öï6¡z÷ÎÏ1¶*úwšûè÷yã×¹Z>º{ƆAÝž¾vwÇv]ã}½µ[½7v9Kmïk€#%#% #%»€À˜gÛ#%<m™vŒ¥Û·#&;›@Ü9Ù£VÀ#%ŽçUÝÓè®’žƒÐP9¬èÔ´ÑT¢µ¯C#%•H*”R‚ÞáÕ E$C £BT¨(hw¼!»ëo=ÖŸfW}'½»«˜›½êÞnS3®)PîîZdT§Z·×šèûß]è#%¹äó£^}³í‹Ûky½ìõ×yîôgmíË×¼¾÷;|»í}öÏiÙÒ¹9ï¹ïl°Þ³Ÿ½½÷Þ�¼ø\ôÐè¶ëÎÞ@:AH*ƒÐelkÖ¶Ù»u¬Ý»ÞzÇLWZí±£0îÎl¤Š”ş)è#%*"ˆ h<�ch•=î¹y–cníÝÁ¥7Ð;¾îçÌËìh¢€ 2=˜[ \`]æìÍ€ß{Ý�h{r®ûïyÐö½¹ßcÜûž÷ßcÒ󯫺»ƒ{�vz%¾¸qzµöòõ7�uÛ3{nâñ›ç¯¼ßw¯z{œõí»s¨Û{Ín’mã‹»k»»Ý«Ù]ÃŽž¾½êï�+±GÝ�HÖë…×^á wÝÂ_Éè×¼`£§¶¯®¾ÞÎ_n_I/»«DùökÛ»›6Ù«ÝÛ}Ί÷œ˜ûÙ/½ÁÞKë ôs½ïqé4ò݇k.�9°tçµçzuß{ﻇݰòÛpJ)@*% *UBftI¶p;=†�‹k7·c¾Ê·*ö÷¡í‚Ì÷3vÖt<«©³Ø1n“«ÍãÞj©o]åÔhAÝf÷s®Ìð#%·g8€#%¢÷«—#»ÎëÞgºÍ¶g'LŸlóÅ÷6[¾ìsx¹ÝCeôË£Ó§ßw}>\o»u{d7:"õÁsÖ¶Î-óÙÆîg%@h{{–Ú‹�u½(¹^)èR»ÃM«Ñ³ß^\}ó0ìåîõÏ+wrñãÜxûÞÝãÞfk³w>-=íÜ»”Æë}î|{FlÁ°l0äÐ;zé<¯§nñ|ÜîƒVÁš«‡ÖôhÙÕÙ{Ùß/«�»Þ´#%ÀU®Ø¸Õ°¹)O{Í4nÖïwvn.ë…[îÜ·ŽÕÖíÞŸCÐ÷Ìݾ·µ¯»YA}{îuóêû7±ÑÐ ôÂì¶yާužÏíOwváÜ:0-¶w¼îò{é÷Ø—ˆ4ô#%vböÍ«`î#%(wm{“ç¶¾øSßs€;°ª#%#2h2{{a]ÝÖí€Fæ{ÆïMÖÔhš±½iuÝÚë�¬·aô÷oUQCºXWNì®—vÝ·KÃwVsvÜmôïL—Œ¯!G3ñ|»¯÷Ÿ|¯ZÂ³Øø'¬Hš“MëîñÛ×]spÈÊãÞå±;Úu`ÝñÝ÷Îì ¯ƒ›s¨ñVóÒóŽðèï�|}îh€ #%@h44˜†šbh4§å#%š�Hö¨M6 ÐýSzPJh‚@€ ’`!2b“ÔýSôM¤�4H=A h#%#%#%#%‚DAÑ &)± ‘ªze<Ñ©š¤x“Ôyi#&¦ja=@dd44#%#%Iꔑ&§¢m“%=•=’žÕz�z�¡¡ê4z€=A¦G¨#%@#%#%$!#%L€ #&&L@“ÔÆJf˜ši�Fh#HÈ#%#%#%#%j"@&€ MÉ‘ªŸ…Oõ‰éOÊz†£Ñ¢<¦Ò4Ð#&€Ð#%—ÿÙþÕU®¸‘þô–µ9~åV»¦%1’�ñª×tB2UE¦'¾ÕmsjÚ¢Õó¤Á>ãï?ø~2ßÀuÒjÌR’ÓYŸŽ]¾%é7Š’›wsRÓŸò‹àºÌþÀ%qDH+Bƒ¯U¢Â»`í™'—æDôðÙ§‹‰ªuN�TÛÍñxyÁ‡ˆ"™¼/p+œb#2‚kg þ\¿¬W}ÆÛMT¶™l§uu«KmEµRU¬ÊÖ’¶Ú-´m¬ˆ#%Ü"*5#ÑʉAФŒ#%#%ÄT ¢‚ ƒaµ©+ô5n•o-ki«SWt 2¡ "¦b¢Šd,”fj3M‘&0H¤ØÚˆ™š„K#%–R�(¦ÚM†&h“A(Éjj-�ÑšK&šDhšˆD¨Å"jRŒ€F¥�#%i‹*mH¤Ù-Q%,´¦šÑ²Ò4Q–1Z5Q’TSd!%¦2P&4²Ò1�¥£SM„¶•µšÚÐ͉4fdÌ„ÑdÛMm4ÚÔ”l¤©Œµ6Ù•2Òd“A°kLMJ()‘FÈ‘hDŠ‹4�¢“¢¢AÅ%LÆiQT¦#Ä!#2 &0-ˆÉ#jBB4±Cl͈˜¦!™%4¬°fbD#&%‘ˆ¥’²llhؘT‹Ée!#E¥)‚lII‘FQ&ŒšdÄ‚¤£H”F’@¬‚›$‹DÌ¥¦"™‚lk$3b$Å436 …ˆÚ’À$²°„X$¤ØÔ&£�– ‘(ÐE"‰‚Á€˜ed”Â1e ”JMF¦Th¬&É©"IˆD%¥6@�‰"Él@I‹,Ê)2J&ÌÈØ‰›")FlŒÁ2©¦$„YJ,bÈY ÓHXÄF¥d²FŤ&E4“MH•4È4hBI©%”e5LÒ6Цš(•¨C, ÒYÅ’“"h&™H•3”)1Pl†R #2@E&c$Œh"Y!–²L©™¶˜ÆÙMbQ2‘LB‘±e#2ÊhÙ"Š ŠI$Ù#ɳHÔÍ,FRB“31K#+6˜JÄFŠfM52i’#2CDRhŠ›Y©R””ÑHY1“"›HQdŒRŒ¤…"(±¶)$Ä’iMFɨÒ$PÒ6ÄcA3Y¤ÄÚ#&ƒ4„Òe‹DÈY‘$¦ÉLŠQ…“!-fÍ‹Y,HM%“¢¨-ËaH“!�Œ‰”jK�0”M-Ji@¢©†„™”˜¦dÙ”Á"–hÓ,!¨(M&Q‘!¢kjVÖŒPš™£)‘³J)&dDVƒR–À¥š,Å&‘”%–TÙ¢-L¬-”bC؈RˆÊF�”µû®ˆJš¤D†#6Š1Q[X¨Ù2™¦¢•$Ñ¡¥¤6ÆÂ6I¨ÚÈŒ5#&&2Œ‘e0¤�dA˜™še²m£J[QHZ2i„KY�¡cR#2RÓL™2¤ÔU¤h©²„VÉ–ER©Y…6lf3-lX²#[&™Y¦YM¬•e²”¦™Ù%#j,R²Ä–�ÉKQª‚Õ�Z2TUd¬”mQ´TTš±4DÉbÄTEŠÔXe£kÒdÂÁµ@S(¤ÆŒ!i’iZklhÚbV1l‘bÚH+UKjÊ*)šš²h’¤bB&›H¢Éµ*ͱŠSi¶YJ™f›TÒ"5´ªY$ÌÕ*F,BÚS)¬±¡²É¬¬²³LD$2£I(‹Ñ�ˆ‘"A¡1ˆRÚ5BP!*(dÕ’i£dɤ¢ÈËŠl¤#&"+,ŒˆFS1(RQ²™ b#2-2B#6›IŠ#cd)„f™¨ÉF†˜HÌÔ#!4LÔQ¢JdR�šP5BTÀF“a)S,�š‹FBŒËQ”£fRIF@Ñ�¤1e+ÃhØÆ¤£%„h,‘e„(Éh¡ ±Hf$Ѣ̦̤¥”¬Ì•Œ ³E’6!�Hµ£f´fˆ¨h©M&ÃLT±Y”Z�FBL�1�i‰±%IRel¦˜Ù £-’”¨Ôf4–MŒÒhѳ(iFJÌdFš3D‰P"DB#&–`ˆcFÙ¤lQ¢³I²S±1II ¢Ñl%F£QF+´fk#&&I4(Y261J �Š6´–l–C2ˆ6*2JY¤©�[EBF±ª5Dš(L²´( “Rj�ƒ&…„cT¥#&XÚ#&)¦Y#2(Ñ$U2-F¨±#)kdT¢¨Ö4˜",š"™”-J)ÉD•6%2Dm`ÑS*,•FÅšQl™+&)+)¶BÙ66†‰²JdJ‹#&‹%MDb6ÉŠI�A«2`ÐB£Jl͉ˆ¦±ª*edÖHÒÒMEF(šmI´[)%�“�¤Á’V¤F‹K-C-Dš‹TUŒ¥I["UcRQb‘M ‘LŒÈ˜ÓR"ƒS6IšÑ*’Å´jJ–m¤Ö‰›PljB��Œ‘ŠeSM´mFŶ1mI˜ÊQ eebZŒV,Í�¨ÚT¨¥*”f*”˜Ù@Ñ¢ÁTi5�bÌ©"Ô•±dÛ)2Ôh¬CH´RQ£hÖ¶ËUŠDÊ…LIDb¡€D–4TSI6¦É*ÆØ¶Å¦jÚ1e¤©¡–¶RÉmMM²Ôi«FQDFŒ�¤”Pl5š“Rfl²¢(¨“I”“"21#2¤¶‹2Û1ü¿ìý›úßèuoöç?'ÃÏ5§#2‹?âÿV•fˆ)¯¶e"ÃvÝ“ùrÃrÐhÒløÞy·õž–ôæþ¯õzô4Á©Œ�ÿÇ{µSgú~ÂÛGžˆíÿ$ãŒ#&.`Rĸ`¤�jª#2º2‘ìzÿ?ªõ{ký»´ÿ›Ì¼ÿ§ûyÞ¿ò*Æxdç�,$b/›žmíØ¶ç' «I°ö�~lGìêeGëgw«�±9;¼ÈŒSRR(j“ƒ5â䱈þúÙ³j“þíÚ�FL€I¥Û"lÆLhƒcôav4ŒŠˆÕÕ¨ÌÕLÒVS(�rÎw,Ë¿¬Îjä6.•#2b„ÑàÍ*�˜ÒæP)R�¤H¡"F(M®Û©Š�Ò2Ö‰M^<îÔ2ø·,ŒÞ›šMƒ0lË•Ì�éUOMÿç¥ò´îášb#2,íoU%0¡‚Ú§®ŠAE,PGÝÿ~²‡kÁéŠÔL¼ÛE0…6…"ÉßÇ%cýnIÆ“ÚÛAZ°YÞ�Ó¹rüc6Qœ]ж(`Ì]]×�îÿNzîm+©½…³•uM¿^ÐÆ°=¾,ZµYÞ{xòòŠ9Ë¢î)•ͺi#&UͺyÜhبŸzëå5¼Z4E‹~^êùÛöÕâûäS+âäkcs¤OånªñÎnŸµ¨KýólÚyeͳ™\Cm´ØF¾Ï:×»z{µW)6Œî¹GŽ&×iÏ&Y0Þ¥Z�m„hmmÂk®WyÝŽQÒ¹s%uÜ""ÓLEO6Ytä?¼«5J&©LR…",0!MîÛtÉÄe«#2üè¤OUM?[�1µ?'¦$2ðA¿ÙE&Ì9é‚Õ@TqPÿR!ôÄŸÌš¨Ix5%Èó¯uÐÙŠO<VÜñýæ§#"^„’X£;•o›#b§‰Q¦½vúìrH ȦoYÂWæcv\~û,ñ>¼)Ä�Z¯oQœ�YÕ4dà&É/�z®¸3,̬^ÞZÞ{¨CÞÊAãU§îéöß©Ï+è`ö§]ÚÝ95ó¨SXÚ@¤‡!dleNÔÝ3£PRhÑ¡J]§D.ªÈ Ö(wÉe³,YL#2NM*m±Gãxû_–*sW)Ÿå˜I£íËPã#M§’+ìe#2ûÃW£¬,‰±Èj[þv&E�6(àÓﺂ±ˆÅåE4P²1ÐøPX†ù±+W¢#cÁR…Q4iÑ—ŠE¡UŒrÐ"x³7¶•ƒÉ•¯…v&Jh tl…Exܲj7�«›cÿÖ¬A`÷´d2…xPPÅGí|?’ƒêöëwVæÒ†§ãü>mzm"c”ÔR|;·+½ÝUº]9JNÄîÅ�5NwYJH¸JV#)×5X¼ïŽzÞ2•dØ{ÝËŠýRÝ{»‹®1¶(MÊ�5Ä´*¨Z)‹"�Y“‹ÚËa¨4–û4Yð__žò¾ß]÷ýù¦Kó8²"4£�n"U�ñˆïà@Æ#\Ö¶jϽ$Â!F£éD•¬E„FEÊ 6vº˜W=ì¼5�š5ðxÛήN]1Ë_;Å—mHµ¥80Ë¡ãGƒ�ÒŠe¤º«JEvï«YøÕÏG#2ÊrrËÓºì²EFœ#2(SfˆZjÒAS¬çXƒ%¡GïŠ4wh�-´´Õ¯µ)wQ4ëEO£#2ãÆÂت+±'›-b#Év0€3Û#îþ.ü�#^pƒ>ËÞ�8ج&×÷|KT;aÇãýÎ{'ˆa̪ƒŒ¸cí!ÍÖq&ý±KZ<ZÓFºÒ�Ф¤Ì(Ì�)¿s1û=¡Ô5ƒLOýL߬ÇÒ¾ð#¼Îì0úª©Ù–e(ªe�{@‰Á¥5¯ÅÜýýøƒåLine truncated
|
||||
#<==
|
||||
#-----BEGIN PGP SIGNATURE-----\n\niQIcBAABCgAGBQJaias4AAoJEEm0xnwFJ3qqfmcP/j4ITHGXd3U8tRn4hjvpLLkT\nfTMd9x9hBEwwRqU0EYoAp2+yIoUKvb5JERF0YjGUWoiZqxEmGGp5BFSOJOrYhq0V\nsZIE01wrQQTYMn1jfoXhjywyLVdyMpl9hgb2Z7DnF9GgzUsd5bPWmoNaCMkhZjuD\nSaR13Ff0hAOVIt/fNoJiXYJ2ICDRG5LGKFlkxy0ykXOkrKDmdah4DV6MGVB/tS3n\niBhxgqMc9ILSFQoEQmFAXTid8Ej0OBj+csAk8nvbCEiV+k74BozpQ+QVfR+agX+K\nnf/oMed8F1jKa9uydbvcEn4SXXEBqKztiKvuCGmZIO3xKd+46+5Oh51wKxZYNsyk\nlYBAA/fH8fOZqMzTCRGZM3q6EnKf+zwGyf4lFOHuVzeXHlfcZA62V1Tcr9aQfsq0\n2saI9S9JsxEpFvAa4S+x7oQ+VJ0WM5XLb04KKFgAMjK/kW2Nw6rYQ0eNCdBX6NCc\n6LWnmmrB/TauSNsJSYIfICoKuv+hebjbSIQa5n1/zQeWYt8DKZYS9Lkwl34vMMdx\nDzq/l7QL+I5Z5jDSVkzRS31/K6T6RWiYFzHgabwD/DNBC8cfG4RwTZIEO3C8uLFy\nDo0MG8w5NFkMk7t0KQtBPe+7BK6Nv6Xo5mLTJ+01INvmgHavhgH4bSyg0kD8MbGS\nY4cOEMKnUkHXCpvXsOLz\n=9X3b\n-----END PGP SIGNATURE-----\n
|
||||
@@ -5,12 +5,12 @@ APPNAME = 'ChronoSync'
|
||||
GIT_TAG_PREFIX = ''
|
||||
|
||||
from waflib import Logs, Utils, Context
|
||||
import os
|
||||
import os, subprocess
|
||||
|
||||
def options(opt):
|
||||
opt.load(['compiler_c', 'compiler_cxx', 'gnu_dirs'])
|
||||
opt.load(['default-compiler-flags', 'boost', 'doxygen', 'sphinx_build',
|
||||
'coverage', 'sanitizers', 'pch'],
|
||||
'coverage', 'sanitizers'],
|
||||
tooldir=['.waf-tools'])
|
||||
|
||||
opt.add_option('--with-tests', action='store_true', default=False,
|
||||
@@ -18,7 +18,7 @@ def options(opt):
|
||||
|
||||
def configure(conf):
|
||||
conf.load(['compiler_c', 'compiler_cxx', 'gnu_dirs',
|
||||
'default-compiler-flags', 'boost', 'pch', 'coverage',
|
||||
'default-compiler-flags', 'boost', 'coverage',
|
||||
'doxygen', 'sphinx_build'])
|
||||
|
||||
if 'PKG_CONFIG_PATH' not in os.environ:
|
||||
@@ -28,8 +28,8 @@ def configure(conf):
|
||||
|
||||
boost_libs = 'system iostreams thread log log_setup'
|
||||
if conf.options.with_tests:
|
||||
conf.env['CHRONOSYNC_HAVE_TESTS'] = 1
|
||||
conf.define('CHRONOSYNC_HAVE_TESTS', 1);
|
||||
conf.env['CHRONOSYNC_HAVE_TESTS'] = True
|
||||
conf.define('CHRONOSYNC_HAVE_TESTS', 1)
|
||||
boost_libs += ' unit_test_framework'
|
||||
conf.check_boost(lib=boost_libs, mt=True)
|
||||
|
||||
@@ -48,44 +48,39 @@ def configure(conf):
|
||||
conf.write_config_header('config.hpp')
|
||||
|
||||
def build(bld):
|
||||
libsync = bld(
|
||||
target="ChronoSync",
|
||||
bld.shlib(
|
||||
target='ChronoSync',
|
||||
vnum = VERSION,
|
||||
cnum = VERSION,
|
||||
features=['cxx', 'cxxshlib'],
|
||||
source = bld.path.ant_glob(['src/**/*.cpp', 'src/**/*.proto']),
|
||||
use = 'BOOST NDN_CXX',
|
||||
includes = ['src', '.'],
|
||||
export_includes=['src', '.'],
|
||||
)
|
||||
export_includes=['src', '.'])
|
||||
|
||||
# Unit tests
|
||||
if bld.env["CHRONOSYNC_HAVE_TESTS"]:
|
||||
bld.recurse('tests')
|
||||
|
||||
bld.install_files(
|
||||
dest = "%s/ChronoSync" % bld.env['INCLUDEDIR'],
|
||||
files = bld.path.ant_glob(['src/**/*.hpp', 'src/**/*.h', 'common.hpp']),
|
||||
dest = '%s/ChronoSync' % bld.env['INCLUDEDIR'],
|
||||
files = bld.path.ant_glob(['src/*.hpp', 'common.hpp']),
|
||||
cwd = bld.path.find_dir("src"),
|
||||
relative_trick = False,
|
||||
)
|
||||
|
||||
bld.install_files(
|
||||
dest = "%s/ChronoSync" % bld.env['INCLUDEDIR'],
|
||||
files = bld.path.get_bld().ant_glob(['src/**/*.hpp', 'src/**/*.h', 'common.hpp', 'config.hpp']),
|
||||
dest = '%s/ChronoSync' % bld.env['INCLUDEDIR'],
|
||||
files = bld.path.get_bld().ant_glob(['src/*.hpp', 'common.hpp', 'config.hpp']),
|
||||
cwd = bld.path.get_bld().find_dir("src"),
|
||||
relative_trick = False,
|
||||
)
|
||||
relative_trick = False)
|
||||
|
||||
pc = bld(
|
||||
features = "subst",
|
||||
bld(features = 'subst',
|
||||
source='ChronoSync.pc.in',
|
||||
target='ChronoSync.pc',
|
||||
install_path = '${LIBDIR}/pkgconfig',
|
||||
PREFIX = bld.env['PREFIX'],
|
||||
INCLUDEDIR = "%s/ChronoSync" % bld.env['INCLUDEDIR'],
|
||||
VERSION = VERSION,
|
||||
)
|
||||
VERSION = VERSION)
|
||||
|
||||
def docs(bld):
|
||||
from waflib import Options
|
||||
@@ -95,85 +90,82 @@ def doxygen(bld):
|
||||
version(bld)
|
||||
|
||||
if not bld.env.DOXYGEN:
|
||||
Logs.error("ERROR: cannot build documentation (`doxygen' not found in $PATH)")
|
||||
else:
|
||||
bld(features="subst",
|
||||
name="doxygen-conf",
|
||||
source=["docs/doxygen.conf.in",
|
||||
"docs/named_data_theme/named_data_footer-with-analytics.html.in"],
|
||||
target=["docs/doxygen.conf",
|
||||
"docs/named_data_theme/named_data_footer-with-analytics.html"],
|
||||
VERSION=VERSION,
|
||||
HTML_FOOTER="../build/docs/named_data_theme/named_data_footer-with-analytics.html" \
|
||||
if os.getenv('GOOGLE_ANALYTICS', None) \
|
||||
else "../docs/named_data_theme/named_data_footer.html",
|
||||
GOOGLE_ANALYTICS=os.getenv('GOOGLE_ANALYTICS', ""))
|
||||
bld.fatal('Cannot build documentation ("doxygen" not found in PATH)')
|
||||
|
||||
bld(features="doxygen",
|
||||
doxyfile="docs/doxygen.conf",
|
||||
use="doxygen-conf")
|
||||
bld(features='subst',
|
||||
name='doxygen.conf',
|
||||
source=['docs/doxygen.conf.in',
|
||||
'docs/named_data_theme/named_data_footer-with-analytics.html.in'],
|
||||
target=['docs/doxygen.conf',
|
||||
'docs/named_data_theme/named_data_footer-with-analytics.html'],
|
||||
VERSION=VERSION,
|
||||
HTML_FOOTER='../build/docs/named_data_theme/named_data_footer-with-analytics.html' \
|
||||
if os.getenv('GOOGLE_ANALYTICS', None) \
|
||||
else '../docs/named_data_theme/named_data_footer.html',
|
||||
GOOGLE_ANALYTICS=os.getenv('GOOGLE_ANALYTICS', ''))
|
||||
|
||||
bld(features='doxygen',
|
||||
doxyfile='docs/doxygen.conf',
|
||||
use='doxygen.conf')
|
||||
|
||||
def sphinx(bld):
|
||||
version(bld)
|
||||
|
||||
if not bld.env.SPHINX_BUILD:
|
||||
bld.fatal("ERROR: cannot build documentation (`sphinx-build' not found in $PATH)")
|
||||
else:
|
||||
bld(features="sphinx",
|
||||
outdir="docs",
|
||||
source=bld.path.ant_glob("docs/**/*.rst"),
|
||||
config="docs/conf.py",
|
||||
VERSION=VERSION)
|
||||
bld.fatal('Cannot build documentation ("sphinx-build" not found in PATH)')
|
||||
|
||||
bld(features='sphinx',
|
||||
config='docs/conf.py',
|
||||
outdir='docs',
|
||||
source=bld.path.ant_glob('docs/**/*.rst'),
|
||||
VERSION=VERSION)
|
||||
|
||||
def version(ctx):
|
||||
# don't execute more than once
|
||||
if getattr(Context.g_module, 'VERSION_BASE', None):
|
||||
return
|
||||
|
||||
Context.g_module.VERSION_BASE = Context.g_module.VERSION
|
||||
Context.g_module.VERSION_SPLIT = [v for v in VERSION_BASE.split('.')]
|
||||
Context.g_module.VERSION_SPLIT = VERSION_BASE.split('.')
|
||||
|
||||
didGetVersion = False
|
||||
# first, try to get a version string from git
|
||||
gotVersionFromGit = False
|
||||
try:
|
||||
cmd = ['git', 'describe', '--always', '--match', '%s*' % GIT_TAG_PREFIX]
|
||||
p = Utils.subprocess.Popen(cmd, stdout=Utils.subprocess.PIPE,
|
||||
stderr=None, stdin=None)
|
||||
out = str(p.communicate()[0].strip())
|
||||
didGetVersion = (p.returncode == 0 and out != "")
|
||||
if didGetVersion:
|
||||
out = subprocess.check_output(cmd, universal_newlines=True).strip()
|
||||
if out:
|
||||
gotVersionFromGit = True
|
||||
if out.startswith(GIT_TAG_PREFIX):
|
||||
Context.g_module.VERSION = out[len(GIT_TAG_PREFIX):]
|
||||
Context.g_module.VERSION = out.lstrip(GIT_TAG_PREFIX)
|
||||
else:
|
||||
Context.g_module.VERSION = "%s-commit-%s" % (Context.g_module.VERSION_BASE, out)
|
||||
except OSError:
|
||||
# no tags matched
|
||||
Context.g_module.VERSION = '%s-commit-%s' % (VERSION_BASE, out)
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
|
||||
versionFile = ctx.path.find_node('VERSION')
|
||||
|
||||
if not didGetVersion and versionFile is not None:
|
||||
if not gotVersionFromGit and versionFile is not None:
|
||||
try:
|
||||
Context.g_module.VERSION = versionFile.read()
|
||||
return
|
||||
except (OSError, IOError):
|
||||
except EnvironmentError:
|
||||
pass
|
||||
|
||||
# version was obtained from git, update VERSION file if necessary
|
||||
if versionFile is not None:
|
||||
try:
|
||||
version = versionFile.read()
|
||||
if version == Context.g_module.VERSION:
|
||||
return # no need to update
|
||||
except (OSError, IOError):
|
||||
Logs.warn("VERSION file exists, but not readable")
|
||||
if versionFile.read() == Context.g_module.VERSION:
|
||||
# already up-to-date
|
||||
return
|
||||
except EnvironmentError as e:
|
||||
Logs.warn('%s exists but is not readable (%s)' % (versionFile, e.strerror))
|
||||
else:
|
||||
versionFile = ctx.path.make_node('VERSION')
|
||||
|
||||
if versionFile is None:
|
||||
return
|
||||
|
||||
try:
|
||||
versionFile.write(Context.g_module.VERSION)
|
||||
except (OSError, IOError):
|
||||
Logs.warn("VERSION file is not writeable")
|
||||
except EnvironmentError as e:
|
||||
Logs.warn('%s is not writable (%s)' % (versionFile, e.strerror))
|
||||
|
||||
def dist(ctx):
|
||||
version(ctx)
|
||||
|
||||
Reference in new issue
Block a user