build: update waf to version 2.0.6
Cleanup in most build scripts Change-Id: Ib024e95fb6f80e72b0c00e1dc8bb9300d6c5f191
This commit is contained in:
1 parent
5e2ccca06f
commit
5560fd40ae
10 files changed
+243
-221
No files matched your search
+22
-11
@@ -1,18 +1,29 @@
|
||||
# Emacs temp files
|
||||
# Emacs
|
||||
*~
|
||||
\#*\#
|
||||
/.emacs.desktop
|
||||
/.emacs.desktop.lock
|
||||
*.elc
|
||||
.\#*
|
||||
|
||||
# macOS stuff
|
||||
.DS_*
|
||||
# Visual Studio Code
|
||||
.vscode/
|
||||
|
||||
# waf build system
|
||||
.waf-1*
|
||||
.waf3-*
|
||||
.lock*
|
||||
build/
|
||||
# macOS
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
._*
|
||||
|
||||
# Waf build system
|
||||
/build/
|
||||
.waf-*-*/
|
||||
.waf3-*-*/
|
||||
.lock-waf*
|
||||
|
||||
# Compiled python code
|
||||
*.pyc
|
||||
*.pyo
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
|
||||
# Other
|
||||
VERSION
|
||||
/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
|
||||
+2
-7
@@ -52,7 +52,7 @@ Note that precompiled header must have multiple inclusion guards. If the guards
|
||||
"""
|
||||
|
||||
import os
|
||||
from waflib import Task, TaskGen, Logs, Utils
|
||||
from waflib import Task, TaskGen, Utils
|
||||
from waflib.Tools import c_preproc, cxx
|
||||
|
||||
|
||||
@@ -67,11 +67,6 @@ def options(opt):
|
||||
|
||||
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]
|
||||
@@ -134,7 +129,7 @@ def add_pch(self):
|
||||
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()}'
|
||||
run_str = '${CXX} ${ARCH_ST:ARCH} ${CXXFLAGS} ${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()} ${CPPFLAGS}'
|
||||
scan = c_preproc.scan
|
||||
color = 'BLUE'
|
||||
ext_out=['.h']
|
||||
|
||||
+3
-2
@@ -46,8 +46,9 @@ def addExtensionIfExists(extension):
|
||||
|
||||
addExtensionIfExists('sphinxcontrib.doxylink')
|
||||
|
||||
if os.getenv('GOOGLE_ANALYTICS', None):
|
||||
addExtensionIfExists('sphinxcontrib.googleanalytics')
|
||||
# sphinxcontrib.googleanalytics is currently not working with the latest version of Sphinx
|
||||
# if os.getenv('GOOGLE_ANALYTICS', None):
|
||||
# addExtensionIfExists('sphinxcontrib.googleanalytics')
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ['_templates']
|
||||
|
||||
@@ -2,14 +2,12 @@
|
||||
|
||||
from waflib import Utils
|
||||
|
||||
top = '..'
|
||||
top = '../..'
|
||||
|
||||
def build(bld):
|
||||
for i in bld.path.ant_glob(['*.cpp']):
|
||||
name = str(i)[:-len(".cpp")]
|
||||
bld(features='cxx cxxprogram',
|
||||
target=name,
|
||||
source=[i],
|
||||
use='ndn-cxx boost-tests-base BOOST',
|
||||
includes='..',
|
||||
install_path=None)
|
||||
for test in bld.path.ant_glob('*.cpp'):
|
||||
name = test.change_ext('').path_from(bld.path.get_bld())
|
||||
bld.program(target=name,
|
||||
source=[test],
|
||||
use='ndn-cxx tests-base BOOST',
|
||||
install_path=None)
|
||||
+23
-33
@@ -5,46 +5,36 @@ from waflib import Utils
|
||||
top = '..'
|
||||
|
||||
def build(bld):
|
||||
# precompiled headers (if enabled)
|
||||
bld(features=['cxx', 'pch'],
|
||||
name='tests-base',
|
||||
target='tests-base',
|
||||
headers=['../src/common-pch.hpp', 'boost-test.hpp'],
|
||||
use='ndn-cxx BOOST',
|
||||
includes='.')
|
||||
|
||||
# core objects that can be shared between unit and integrated tests
|
||||
bld(features="cxx",
|
||||
target="boost-tests-base",
|
||||
source=bld.path.ant_glob(['*.cpp'], excl=['main.cpp']),
|
||||
use='ndn-cxx tests-base BOOST',
|
||||
includes='.',
|
||||
install_path=None)
|
||||
bld.objects(target='tests-base',
|
||||
features='pch',
|
||||
source=bld.path.ant_glob('*.cpp', excl=['main.cpp']),
|
||||
headers=['../src/common-pch.hpp', 'boost-test.hpp'],
|
||||
includes='.',
|
||||
export_includes='.',
|
||||
use='ndn-cxx BOOST')
|
||||
|
||||
config_path = 'UNIT_TEST_CONFIG_PATH="%s"' % bld.bldnode.make_node('tmp-files')
|
||||
|
||||
# unit test objects
|
||||
unit_tests = bld(
|
||||
target="unit-test-objects",
|
||||
name="unit-test-objects",
|
||||
features="cxx",
|
||||
source=bld.path.ant_glob(['unit-tests/**/*.cpp'],
|
||||
excl=['**/*-osx.t.cpp', '**/*-sqlite3.t.cpp']),
|
||||
use='ndn-cxx tests-base BOOST',
|
||||
includes='.',
|
||||
defines='UNIT_TEST_CONFIG_PATH=\"%s/tmp-files/\"' %(bld.bldnode),
|
||||
install_path=None)
|
||||
|
||||
src = bld.path.ant_glob(['unit-tests/**/*.cpp'],
|
||||
excl=['**/*-osx.t.cpp', '**/*-sqlite3.t.cpp'])
|
||||
if bld.env['HAVE_OSX_FRAMEWORKS']:
|
||||
unit_tests.source += bld.path.ant_glob('unit-tests/**/*-osx.t.cpp')
|
||||
src += bld.path.ant_glob('unit-tests/**/*-osx.t.cpp')
|
||||
|
||||
# In case we want to make it optional later
|
||||
unit_tests.source += bld.path.ant_glob('unit-tests/**/*-sqlite3.t.cpp')
|
||||
src += bld.path.ant_glob('unit-tests/**/*-sqlite3.t.cpp')
|
||||
|
||||
bld.objects(target='unit-test-objects',
|
||||
source=src,
|
||||
use='tests-base',
|
||||
defines=[config_path])
|
||||
|
||||
# unit test app
|
||||
bld(features='cxx cxxprogram',
|
||||
target='../unit-tests',
|
||||
name='unit-tests-main-unit',
|
||||
source="main.cpp",
|
||||
use='ndn-cxx unit-test-objects boost-tests-base BOOST',
|
||||
install_path=None)
|
||||
bld.program(target='../unit-tests',
|
||||
name='unit-tests',
|
||||
source='main.cpp',
|
||||
use='unit-test-objects',
|
||||
install_path=None)
|
||||
|
||||
bld.recurse('integrated')
|
||||
+50
-26
@@ -4,32 +4,56 @@ from waflib import Utils
|
||||
|
||||
top = '..'
|
||||
|
||||
def configure(conf):
|
||||
conf.find_program('sh')
|
||||
|
||||
def build(bld):
|
||||
# List all .cpp files (whole tool should be in one .cpp)
|
||||
for i in bld.path.ant_glob(['*.cpp']):
|
||||
name = str(i)[:-len(".cpp")]
|
||||
bld(features=['cxx', 'cxxprogram'],
|
||||
target="../bin/%s" % name,
|
||||
source=[i] + bld.path.ant_glob(['%s/**/*.cpp' % name]),
|
||||
use='ndn-cxx'
|
||||
)
|
||||
# Single object tools:
|
||||
# tools/example-tool.cpp is a self-contained tool with a main() function
|
||||
# and is built as build/bin/example-tool.
|
||||
# These tools cannot be unit-tested.
|
||||
for tool in bld.path.ant_glob('*.cpp'):
|
||||
name = tool.change_ext('').path_from(bld.path.get_bld())
|
||||
bld.program(name=name,
|
||||
target='../bin/%s' % name,
|
||||
source=[tool],
|
||||
use='ndn-cxx')
|
||||
|
||||
# List all directories files (tool can has multiple .cpp in the directory)
|
||||
for name in bld.path.ant_glob(['*'], dir=True, src=False, excl=['wrapper']):
|
||||
bld(features=['cxx', 'cxxprogram'],
|
||||
target="../bin/%s" % name,
|
||||
source=bld.path.ant_glob(['%s/**/*.cpp' % name]),
|
||||
use='ndn-cxx',
|
||||
includes='%s' % name,
|
||||
)
|
||||
# Sub-directory tools:
|
||||
# tools/example-tool/**/*.cpp is compiled and linked into build/bin/example-tool.
|
||||
# tools/example-tool/main.cpp must exist and must contain the main() function.
|
||||
# All other objects are collected into 'tools-objects' and can be unit-tested.
|
||||
testableObjects = []
|
||||
for subdir in bld.path.ant_glob('*', dir=True, src=False):
|
||||
mainFile = subdir.find_node('main.cpp')
|
||||
if mainFile is None:
|
||||
continue # not a C++ tool
|
||||
|
||||
bld(features="subst",
|
||||
source=bld.path.ant_glob(['wrapper/*.sh']),
|
||||
target=['%s' % node.change_ext('', '.sh')
|
||||
for node in bld.path.ant_glob(['wrapper/*.sh'])],
|
||||
install_path="${BINDIR}",
|
||||
chmod=Utils.O755,
|
||||
)
|
||||
name = subdir.path_from(bld.path)
|
||||
srcFiles = subdir.ant_glob('**/*.cpp', excl=['main.cpp'])
|
||||
srcObjects = ''
|
||||
if srcFiles:
|
||||
srcObjects = 'tools-%s-objects' % name
|
||||
bld.objects(target=srcObjects,
|
||||
source=srcFiles,
|
||||
use='ndn-cxx',
|
||||
includes=name)
|
||||
testableObjects.append(srcObjects)
|
||||
|
||||
bld.program(name=name,
|
||||
target='../bin/%s' % name,
|
||||
source=[mainFile],
|
||||
use='ndn-cxx ' + srcObjects,
|
||||
includes=name)
|
||||
|
||||
bld.objects(target='tools-objects',
|
||||
source=[],
|
||||
export_includes='.',
|
||||
use=testableObjects)
|
||||
|
||||
# Tool wrappers
|
||||
wrapperFiles = bld.path.ant_glob('wrapper/*.sh')
|
||||
bld(name='wrappers',
|
||||
features='subst',
|
||||
source=wrapperFiles,
|
||||
target=['../bin/%s' % node.change_ext('', '.sh').path_from(bld.path.find_dir('wrapper').get_bld())
|
||||
for node in wrapperFiles],
|
||||
install_path='${BINDIR}',
|
||||
chmod=Utils.O755)
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: ISO8859-1
|
||||
# Thomas Nagy, 2005-2015
|
||||
|
||||
# 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
|
||||
@@ -32,13 +32,13 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import os, sys, inspect
|
||||
|
||||
VERSION="1.8.9"
|
||||
REVISION="849024857bd41c3cf8e87dc01ecf79b0"
|
||||
GIT="2b3bb0af33c07b93a72803a332ea8286427006bc"
|
||||
VERSION="2.0.6"
|
||||
REVISION="593191f496fe8c66231dfd5df26167ae"
|
||||
GIT="459ddf50b622573ecfe36c12c076e0fcc610b01e"
|
||||
INSTALL=''
|
||||
C1='#-'
|
||||
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¢í¦* ÿÿÿ´�AÿÿÿÿÿÿÿÿÿÿÿD #&††"¢Dˆ H¨8aðÜ÷<˜8#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&žDeX2ÚM©öÒŽmª5Í›gÛîÉÖØ´Úú>æ”U/+îÎúgGÎÎm–¦Ë#-í„)çtûï§RǵPpô¬%GnÜ]»c»zÃv{‹Þç]ÖWUÓ¥¾óW–o]sosÁì÷vGwsÞÕÂö�³ëç�ðúÖ'‹´öÚvöûÎŽ»Æ;g×�#&#&#-#&#&ùö#&>¥€&û#-h#&>ûØá½³#&.³©°w7Ð^=;�¡¶ ÙGCwŠƒÃÐzè]†…#&(kAAÑ…DI#- Š‹ÝºEìh(@(%!é¢]˜"õÓºN�}mu÷»�·¸yc½¬–ÞjrÀ;š” ë-šR—›_w»l�«Qô®æøà^÷z�²½[î˜7ž÷xû5›»»{f[Îû½Îùç#Ë.êÏÖÇ×>K»ºïo}¢»>ï¸#&Ûo<¸³#&©#&žÊ(kA�ž�ÞæÝî{ÜÏ2#*#&hz»×EGM¶‰Þ{ÎÛxÒ€Q@#-‰B€=@ÝÛ´i^»SÙëÓ]Þ÷<µ;½¼½¹÷¹¯}€hM®î²]:}ÞpøÞšÕ6{šW©:tvw|�ì¶5�½#&}»ç}òîûíóå^ût½Ï+Û4ú÷aÃÖz#&ÕA÷Î8šaã¾¼®U=k¾÷w¾—wÎzïi�®ß{{¶îöç½tßmÚÔ»7¼¹wQ»m¨Ï¦ó̼w½±ö»�k×P•Å]\zdÑÉât§NCÝŠÓ诂^Þì÷AD)jòç3â{Ý÷¼Nì}kݾïKmÛÙÇÛO/¥î=èÛî݇æ÷½®žKŸ{ŽtzÛ§Ï5€#*ß^5ïw¼;:#-çÃÚyé *%( 6Á]ÙÛ*eWsµh#&úsÍéëÓAÜÇ'S‡yÛµê^»hÊçYŽæ¢8ïnÃJƒ»çÝëÑï€#&o;‡@GÛíÞÍßc/=÷}Çœø]¯O¹ï=ºµÝ¹ì{¼‡Ú§œèíÖÜã‰××C¾õÞ´×»¹í–ÝÉ�wyˆn÷«Ö÷6Ï}Ÿ>ÝõgÓÆ÷>UÈïŸ[¼{Ï£¯µðêõ)õ½õÂ#-¾µZôsí¼�ï¾xdÜõ®o±ï{—›�¤{]ܾëµíï3_aåÍíßKo»�öï,«4jÐ>îhr»8§×W�‚ßgP]÷tíáói{è^·�qöçzvϽ#&ÀQ+V#*¬síž¼ûÝÛ®Ž½Ý#*}Ûí�Ϟν.—{×}rì/_#*îÎwf]w6[æì=åö¾}Ï«fìuÑ R‚:Ý4§Mw»«o^èØë3ƒT}÷‡.îŽÚ[àÛFì#&h»"ô™+Ó#&;ØîÃ<�l¼ø»»w@û`z#&Ô”ÛËÛîõ§v€a¾×69Ù×XzêÜáÓÛžŸ>Ûl÷u·îêJŠH³�Öæiõײ›gyÕro}ÞóÛq°Ý2ïX¯4Þç=öûç½{×ÅÒ÷Êû×Xv¼çΘ„�ôiïcžÍÎØÆœ÷y·>¼÷w<g¢«¾÷/½fL;²Ëo.�½]½5ð°”Ò#&@Ð#&€ ˆ4Á#*#&™'“!ôžHié¨ #&#&”Ð!˜€&�OôÉSØšdÐ$?I=5=M…2#&#&#&€#&#&�Hˆ ! &A¦©é•›U4ýOOÊMS'¨d44óPF#&44#&#& =R’"dM£$Ñž§å2žD@õ#*#& ÄÐiˆ@#*4#&Ð"HA#&@4#&M#&Mš4LIšž§ªhh#*#&€´Ô~¨$ÔDh �ÐhÔô¦Õ¤ÍIêzŸª~T=5ÒƒõOQ #&#&#&#&GÿËýËm«¸Dßð›Rmlº'ìíµw)£ã¶Ôå,’%!,€1Vžö©h �d0~¬~Ÿëüê¡ÞõÍÍØ¢H½¢¯ŒÖÞád¸•4ù‹U”ä¬ã8&¡î?Ò@|�÷^â%<Ò¼�A#&º�ÖgSfBÙÛ „e²ÌðÌ.K1åÉ+.yŽá1Í=K‰(æ¦& ÅÍÕÀõ/QŒV<(R<¤õP÷%C=â¥Ô¾ ¢¢&V(ÅÛ#&Æ¿——~{Ê8E Å@¨Ñ#& ª„€ˆH(""ˆÝT*�Q�FÈ(3 âHb(Ž#pB7"ŠBí‚E*#-AƒTH�"2*ˆ~-ªÕT�HĤ34ĈLˆhÆm3DIMH¥Œ‰’”SÛIPÔÉ%Š„Ñµ*+%�&h›([&2VeYš%� ¦ ±¤ŠMˆ´bˆ¤”©LÕËII ˜2’$[i5BÁ™fÆ–&¤b‚’QM"FfÅ£QZmZkU)&ÔL™&HÔ[KRµŒÓÙ”ËRY2›lJ›bcf©$ÔÂÈ¢I¨¶djFkFÒ²iš#-d”h)-$ŠR©!›˜!`£3Jbi±¥6 „#&SÆa©’dJ"JJ¤�"– !“C$D¤!"’RRÅ&H6Šc%)6¡-Af5#*‘Pʼn…R�0"Àd¢M"”LbÄÅA²e6ŠI–�ÊHšYHÉ*QE3#*i#-†EÃbBHØ�I`l´IÈ)QQQli)#-fÆ $Ô˜ŠHÈ„‰™š@“1˜FJ̳BTb$"HJ“a I4ÒÐbLš,¥0lÚ#M"�¢¤�”fƒH“5K,²”PbR4²MšeRÅ%™2²LÄ’(´62É#-‰,�² ¥™£EšFÉFe6h’šÚl„Êc`�I’“0ÓIK5K*TlQ0‚ŠJ‚&$È‚JPSF€a$d†™$KkH�¡šÈC)dY3#-RÚM’‹d‹F’d’P”Y(iÀhØ2ˆŠ$›5˜É¨Æ#¥C)šS�ØTÉ¢*XÅš›™E‘“P¦É$,¢¦Eˆ™¦#-4FÐb“&”“0Ù6M2#* �a&VRa´M’�$"IdÊ2M4#)”Œ±-%*›4TmˆL ™’"´cli&k"†“0’FTi@KÑ´jRf(¬L´™4Ra%‘„1K F“!Œ£4†Íª›[h(ª(É© k%ÊHÚ)’™&1¬–‹4ic)ši²R”Z™Ù¶%6Q”ŒÐ!B–¿K[£HYZC!,£%5�‹EF„̨‰¦(Ù-©Š’Z¦"†Á¥ˆ¡¥) ¤�f62T2Ô%¨²)¬™#*Œ¢Ò£H´,L™�KK1’F“™MVhÓ!«#dU6±M”IeFR«Õ¤ÚB³ek5)Ji†Úb…2"Æ´i©Q%¦Q¢2ÆÑXÛ3FØJ¬ÍQªÂF¤£m�£`²Qª3DB¨¤*#*±ª6©#*¬Bk$(�´Ñ¥QH&Š0ÍJ%6¥Q¨Ù$Ú1©¦LÕµ›Vš±a©µ,‰•5‘&fjiH¤™mRÔRÒS54ÙšÒ©Y*¥Lm¥L¥&ÔÒ´Ù‹I¡šÌÌ’VX¡›¤¶–ÒÈXµ4£D@`f£IF‘£`$# ˆb´É0)µRD¤Ø¦Slm)4ÑQ“&ƒIL(QH¥*#b�ZY�"i¢™)“ÊlÐʼn B£bÌ�Æ)Y©,6̲if2˜*B*&¥bÁ„Ù‰±F£bJJ24E™E©˜ÙˆRV4ÂfÁ£&ʼn†6e¨ÑBQ@R!©M£!fm66(Ð�¤´Ð‘I‚°¥–ƒ "LVBi)Mƒ%±#-MJ"I6jQ UU31°Ø©M&ÈÚL¢Í%¬A!�¢J$L›)&„©-&dlÍ1*[,ØÚ#-ÊlÑDlblRi©&S&Š™mHÉ”´l””fÀ‰& b&4cL£E5–M’”11RBE¢±a6-(ÛZi0É3D”šE¢˜Ø¤ˆÅ‚ÙiI&¤0ɘi)fCL+F�„6�Elš4&XV‚ ’-%±Pca@ÑIªR‰«ÆS3B�’JÌŠ’‰-!¢,²Ö¦,ɨ´c+%¡¥(TiIMT²J’™JQkb#*REJ4•FFÉcY4•5TÌS(©Kd-b¡¤™²E&ņ�B"Å‹LÉC4`ÚL‰3DŠ©Di„Ê[1¢ÑZ-Ф„*%0c)Q¨Ú6™% QI„I«J#--)ªSi5±¬Vɬ–³H#-Ñlš’‹Å(#(1³B$¡1²SŒª £ll[FÆ”Ûi(e¢#-Æ&¢¢B´LÛ,Ú�¢±QkI¶¥³d4²±*ŒZ)–*¦¤ÓiFQ¢”K&,©Qh$¨¢²VKd£lš±I´¦eM£B‘¨¤£E¢ÛmšÖš3P²X‰*eEF° Z#*&¥³VLdbÅE´V�lZ-¶�ªdÚØ‹TÔ¬Ú‰²�6$m$Æ#*•…”¢É4¨Š ˜Ø’$“)&DBÔ›b̵L|oè?ÝA¾Õ/Z?¹Jf†(24”ÍŠè\Ñ0š¡„ÿsûöi‚’™Z¨‰e?ÅXñÿoöÄÛ8 àäOý©Ðe?·äDW¶yÒ!óÙÎ2�âÅX4×,†ä°RÊHe7HZ#uR#µ‹·ñò»{CþMRñyðÿ£�ã²±—Ž2ꊦ#-YÛ]¬±Ga, ‘Ñ;fî!Ã?Uñaùs[hÔB“ºêa?‰#-îœuƒ±Z8(Ò<|1îFõru½�c,“#-J˜ÛuÊãk´ðb¡Ø£Â&9’#*¶ùaºÉ¢CLƃ³–{]¶wØò›ºÛ�2ñ{+Æø8UðW³Ñü޽Jô·³ÍÍFÈ!4ÛcìBŒv1h&íV7gTOó:½üí™{74”X"�ÖƒÓŠtŠƒÿzèP1�YŒ;U%z¤Ù–1SÛFRÆE‘Wáþë.NÎÚјN‰R÷»CG›(BС€§†t+ü3’ãJÕRKD²¤1Žqœû†_eƒ-‚È#°Äšzšzjft4™”ú4&ÓrPõì³oõ×ß /®-ÃNj‘2gžÞo¦»¹Ñw+›™4…&´�TX´~9}RÖX#-t¯žI"e¦PSÛA@¨ÈØ4øëD}.C¿zl\7¾ÚÃ/‚ö%Ëß@’�ñWùmoyé›hKMA¡·b��íéddAu#-4{úEZ9`ˆÜPÓJ•„܄r䛺ì;®š*#*ðU¼ó¿â¾WyÑü«½ºuºMFÑ”ÄH±_¥R>Ê+_ÏZcΟõ½0L´?ñHÎY$ï©ŒÆØ@‰V"À d)¤•ü˜Îçݘ]DE53‰`cm¸ÅÕ'•_®(¹û|zfn"µYÁÚúêæ$Ï%u‘Äó™ßýˆ½Ã:Œ'h�^ÐJ¤j¶�æCf„PèK¹û{_jZGc)>w;]å¢YNÆÄÑO½“˜ÞáêУbÔ~vN¸<åKŒ‡zZôZPÿ 9!„‹i;Ë#-X,ôëxûŸ–(ÃÕ¢uÖ‹6j#*�((‹^)y¬[ÃÝ¿£ZÄ›#*KHíÿFAzHi¶›LkÉÔX‹<(¨vBÈÇAœl¢eÖ뛑/VR¢ÿÚi{ʤyµ½áj±IEÕ«þÑb$ÅJ�*¥ÑJ dÑ^9™dÞ+šåcUûO)¨Óï¸4mé»ðõ~w„Íþÿo¯øÝ¯�ívŒrÜÖ»«¶#,Äa5'§.WçõõûzÚÛÉÒÅâ†EY×�a0‘y!ByP’ÒRB)„±ôÅÙ¤P;\¶1b©kŒ£~™®CâãIl˜^Ýn¾=ðó¼ã±cX²UôÏø‹Ý\��¡Àm�¢È.!ëx|µ#*ÿâ°##&¦™5ó :m›Æ‰Ï%CŒEt¬ÙŸb·©¢B×ÿ‚ò76êoŒº‘#-iDŠ:¡dØd)6ª¬¡r4÷ê¾Õ¼‰ì»2r×J_ƒµ¾#*j”Ù†ƒ4;ê‹iTM;nà7õyòÁ˜¼Zvõ«"#-I’©ÂºÜ5BòU"‘ãT–훈%]ÃË4KCFL±–I�†¢�‰<Ü6×MaZ`Û:ϦÁYãÛPófG’÷×�‘<*›ï©~5Gj;#¦u³ÇŒe®±ž×#*ÚG¹V§®™EÓ*j�O©Íñ¾�#-¤V©#¡#*#&¹Ç+ÛÊUÅÚ©#*&wdlBÔ60g«Ê¡û çµ1QT‹8ÑRšC³ÕÇý—{ò¼°øðÞûY:¡°ã�ufÿZäÍ2Ò&�Nˆç�~Ó‰|øÁìMnìzöH£ ™‡@$AÒ’6ï²L±ªÆÝˆÕÊ ñ¢d¶A‹Ÿ‚–˜£Òàiwºb£†EÆ™ý¹3�(S*Ù¾\h¹«Þ¨§7Ãþ&¦,>eÐìÑ/ÎqõÞñïžÛ†ÙŒÅC¾Üc}¼±•ŒW}¦¤çÜôÔ?“«@è×åD«c#2O‹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
|
||||
@@ -1,13 +1,13 @@
|
||||
# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
|
||||
|
||||
from waflib import Logs, Utils, Context
|
||||
import os
|
||||
from waflib import Context, Logs, Utils
|
||||
import os, subprocess
|
||||
|
||||
VERSION = "0.6.1"
|
||||
APPNAME = "ndn-cxx"
|
||||
PACKAGE_BUGREPORT = "https://redmine.named-data.net/projects/ndn-cxx"
|
||||
PACKAGE_URL = "http://named-data.net/doc/ndn-cxx/"
|
||||
GIT_TAG_PREFIX = "ndn-cxx-"
|
||||
VERSION = '0.6.1'
|
||||
APPNAME = 'ndn-cxx'
|
||||
PACKAGE_BUGREPORT = 'https://redmine.named-data.net/projects/ndn-cxx'
|
||||
PACKAGE_URL = 'http://named-data.net/doc/ndn-cxx/'
|
||||
GIT_TAG_PREFIX = 'ndn-cxx-'
|
||||
|
||||
def options(opt):
|
||||
opt.load(['compiler_cxx', 'gnu_dirs', 'c_osx'])
|
||||
@@ -64,7 +64,7 @@ def configure(conf):
|
||||
conf.env.enable_shared = conf.options.enable_shared
|
||||
|
||||
if not conf.options.enable_shared and not conf.options.enable_static:
|
||||
conf.fatal("Either static library or shared library must be enabled")
|
||||
conf.fatal('Either static library or shared library must be enabled')
|
||||
|
||||
conf.load(['compiler_cxx', 'gnu_dirs', 'c_osx',
|
||||
'default-compiler-flags', 'compiler-features', 'type_traits',
|
||||
@@ -79,7 +79,10 @@ def configure(conf):
|
||||
|
||||
conf.check_cxx(lib='pthread', uselib_store='PTHREAD', define_name='HAVE_PTHREAD', mandatory=False)
|
||||
conf.check_cxx(lib='rt', uselib_store='RT', define_name='HAVE_RT', mandatory=False)
|
||||
conf.check_cxx(function_name='getpass', header_name='unistd.h', mandatory=False)
|
||||
conf.check_cxx(msg='Checking for getpass function', mandatory=False,
|
||||
define_name='HAVE_GETPASS',
|
||||
fragment='''#include <unistd.h>
|
||||
int main() { getpass("Enter password"); }''')
|
||||
|
||||
if conf.check_cxx(msg='Checking for rtnetlink', define_name='HAVE_RTNETLINK', mandatory=False,
|
||||
header_name=['linux/if_addr.h', 'linux/if_link.h',
|
||||
@@ -106,10 +109,9 @@ def configure(conf):
|
||||
|
||||
conf.check_boost(lib=USED_BOOST_LIBS, mandatory=True, mt=True)
|
||||
if conf.env.BOOST_VERSION_NUMBER < 105400:
|
||||
Logs.error("Minimum required boost version is 1.54.0")
|
||||
Logs.error("Please upgrade your distribution or install custom boost libraries" +
|
||||
" (https://redmine.named-data.net/projects/nfd/wiki/Boost_FAQ)")
|
||||
return
|
||||
conf.fatal('Minimum required Boost version is 1.54.0\n'
|
||||
'Please upgrade your distribution or manually install a newer version of Boost'
|
||||
' (https://redmine.named-data.net/projects/nfd/wiki/Boost_FAQ)')
|
||||
|
||||
if conf.env['CXX_NAME'] == 'clang' and conf.env.BOOST_VERSION_NUMBER < 105800:
|
||||
conf.env.append_value('DEFINES', 'BOOST_ASIO_HAS_STD_ARRAY=1') # Bug #4096
|
||||
@@ -126,7 +128,7 @@ def configure(conf):
|
||||
|
||||
conf.check_compiler_flags()
|
||||
|
||||
# Loading "late" to prevent tests to be compiled with profiling flags
|
||||
# Loading "late" to prevent tests from being compiled with profiling flags
|
||||
conf.load('coverage')
|
||||
|
||||
conf.load('sanitizers')
|
||||
@@ -147,8 +149,8 @@ def configure(conf):
|
||||
def build(bld):
|
||||
version(bld)
|
||||
|
||||
bld(features="subst",
|
||||
name='version',
|
||||
bld(features='subst',
|
||||
name='version.hpp',
|
||||
source='src/version.hpp.in',
|
||||
target='src/version.hpp',
|
||||
install_path=None,
|
||||
@@ -164,28 +166,28 @@ def build(bld):
|
||||
if bld.env['HAVE_OSX_FRAMEWORKS']:
|
||||
# Need to disable precompiled headers for Objective-C++ code
|
||||
bld(features=['cxx'],
|
||||
target="ndn-cxx-mm",
|
||||
name="ndn-cxx-mm",
|
||||
target='ndn-cxx-mm',
|
||||
name='ndn-cxx-mm',
|
||||
source=bld.path.ant_glob(['src/**/*-osx.mm']),
|
||||
use='version BOOST OPENSSL SQLITE3 RT PTHREAD OSX_COREFOUNDATION OSX_CORESERVICES OSX_SECURITY OSX_SYSTEMCONFIGURATION OSX_FOUNDATION OSX_COREWLAN',
|
||||
includes=". src")
|
||||
includes='src')
|
||||
|
||||
libndn_cxx = dict(
|
||||
target="ndn-cxx",
|
||||
name="ndn-cxx",
|
||||
target='ndn-cxx',
|
||||
source=bld.path.ant_glob('src/**/*.cpp',
|
||||
excl=['src/**/*-osx.cpp',
|
||||
'src/**/*-rtnl.cpp',
|
||||
'src/**/*-sqlite3.cpp']),
|
||||
features='pch',
|
||||
headers='src/common-pch.hpp',
|
||||
use='version ndn-cxx-mm BOOST OPENSSL SQLITE3 RT PTHREAD',
|
||||
includes=". src",
|
||||
export_includes="src",
|
||||
includes='. src',
|
||||
export_includes='src',
|
||||
install_path='${LIBDIR}')
|
||||
|
||||
if bld.env['HAVE_OSX_FRAMEWORKS']:
|
||||
libndn_cxx['source'] += bld.path.ant_glob('src/**/*-osx.cpp')
|
||||
libndn_cxx['use'] += " OSX_COREFOUNDATION OSX_CORESERVICES OSX_SECURITY OSX_SYSTEMCONFIGURATION OSX_FOUNDATION OSX_COREWLAN"
|
||||
libndn_cxx['use'] += ' OSX_COREFOUNDATION OSX_CORESERVICES OSX_SECURITY OSX_SYSTEMCONFIGURATION OSX_FOUNDATION OSX_COREWLAN'
|
||||
|
||||
if bld.env['HAVE_RTNETLINK']:
|
||||
libndn_cxx['source'] += bld.path.ant_glob('src/**/*-rtnl.cpp')
|
||||
@@ -194,14 +196,14 @@ def build(bld):
|
||||
libndn_cxx['source'] += bld.path.ant_glob('src/**/*-sqlite3.cpp')
|
||||
|
||||
if bld.env.enable_shared:
|
||||
bld(features=['pch', 'cxx', 'cxxshlib'],
|
||||
vnum=VERSION_BASE,
|
||||
cnum=VERSION_BASE,
|
||||
**libndn_cxx)
|
||||
bld.shlib(name='ndn-cxx',
|
||||
vnum=VERSION_BASE,
|
||||
cnum=VERSION_BASE,
|
||||
**libndn_cxx)
|
||||
|
||||
if bld.env.enable_static:
|
||||
bld(features=['pch', 'cxx', 'cxxstlib'],
|
||||
**libndn_cxx)
|
||||
bld.stlib(name='ndn-cxx-static' if bld.env.enable_shared else 'ndn-cxx',
|
||||
**libndn_cxx)
|
||||
|
||||
# Prepare flags that should go to pkgconfig file
|
||||
pkgconfig_libs = []
|
||||
@@ -221,37 +223,37 @@ def build(bld):
|
||||
if bld.env['CXXFLAGS_%s' % lib]:
|
||||
pkgconfig_cxxflags += Utils.to_list(bld.env['CXXFLAGS_%s' % lib])
|
||||
|
||||
EXTRA_FRAMEWORKS = ""
|
||||
EXTRA_FRAMEWORKS = ''
|
||||
if bld.env['HAVE_OSX_FRAMEWORKS']:
|
||||
EXTRA_FRAMEWORKS = "-framework CoreFoundation -framework CoreServices -framework Security -framework SystemConfiguration -framework Foundation -framework CoreWLAN"
|
||||
EXTRA_FRAMEWORKS = '-framework CoreFoundation -framework CoreServices -framework Security -framework SystemConfiguration -framework Foundation -framework CoreWLAN'
|
||||
|
||||
def uniq(alist):
|
||||
seen = set()
|
||||
return [x for x in alist if x not in seen and not seen.add(x)]
|
||||
|
||||
pkconfig = bld(features="subst",
|
||||
source="libndn-cxx.pc.in",
|
||||
target="libndn-cxx.pc",
|
||||
install_path="${LIBDIR}/pkgconfig",
|
||||
pkconfig = bld(features='subst',
|
||||
source='libndn-cxx.pc.in',
|
||||
target='libndn-cxx.pc',
|
||||
install_path='${LIBDIR}/pkgconfig',
|
||||
VERSION=VERSION_BASE,
|
||||
|
||||
# This probably not the right thing to do, but to simplify life of apps
|
||||
# that use the library
|
||||
EXTRA_LIBS=" ".join([('-l%s' % i) for i in uniq(pkgconfig_libs)]),
|
||||
EXTRA_LDFLAGS=" ".join([('-L%s' % i) for i in uniq(pkgconfig_ldflags)]),
|
||||
EXTRA_LINKFLAGS=" ".join(uniq(pkgconfig_linkflags)),
|
||||
EXTRA_INCLUDES=" ".join([('-I%s' % i) for i in uniq(pkgconfig_includes)]),
|
||||
EXTRA_CXXFLAGS=" ".join(uniq(pkgconfig_cxxflags)),
|
||||
EXTRA_LIBS=' '.join([('-l%s' % i) for i in uniq(pkgconfig_libs)]),
|
||||
EXTRA_LDFLAGS=' '.join([('-L%s' % i) for i in uniq(pkgconfig_ldflags)]),
|
||||
EXTRA_LINKFLAGS=' '.join(uniq(pkgconfig_linkflags)),
|
||||
EXTRA_INCLUDES=' '.join([('-I%s' % i) for i in uniq(pkgconfig_includes)]),
|
||||
EXTRA_CXXFLAGS=' '.join(uniq(pkgconfig_cxxflags)),
|
||||
EXTRA_FRAMEWORKS=EXTRA_FRAMEWORKS)
|
||||
|
||||
if bld.env['WITH_TESTS']:
|
||||
bld.recurse('tests')
|
||||
|
||||
if bld.env['WITH_TOOLS']:
|
||||
bld.recurse("tools")
|
||||
bld.recurse('tools')
|
||||
|
||||
if bld.env['WITH_EXAMPLES']:
|
||||
bld.recurse("examples")
|
||||
bld.recurse('examples')
|
||||
|
||||
headers = bld.path.ant_glob('src/**/*.hpp',
|
||||
excl=['src/**/*-osx.hpp',
|
||||
@@ -267,24 +269,25 @@ def build(bld):
|
||||
# In case we want to make it optional later
|
||||
headers += bld.path.ant_glob('src/**/*-sqlite3.hpp', excl='src/**/detail/**/*')
|
||||
|
||||
bld.install_files("%s/ndn-cxx" % bld.env['INCLUDEDIR'], headers,
|
||||
bld.install_files('%s/ndn-cxx' % bld.env['INCLUDEDIR'], headers,
|
||||
relative_trick=True, cwd=bld.path.find_node('src'))
|
||||
|
||||
bld.install_files("%s/ndn-cxx" % bld.env['INCLUDEDIR'],
|
||||
bld.install_files('%s/ndn-cxx' % bld.env['INCLUDEDIR'],
|
||||
bld.path.find_resource('src/ndn-cxx-config.hpp'))
|
||||
|
||||
bld.install_files("%s/ndn-cxx" % bld.env['INCLUDEDIR'],
|
||||
bld.install_files('%s/ndn-cxx' % bld.env['INCLUDEDIR'],
|
||||
bld.path.find_resource('src/version.hpp'))
|
||||
|
||||
bld.install_files("${SYSCONFDIR}/ndn", "client.conf.sample")
|
||||
bld.install_files('${SYSCONFDIR}/ndn', 'client.conf.sample')
|
||||
|
||||
if bld.env['SPHINX_BUILD']:
|
||||
bld(features="sphinx",
|
||||
builder="man",
|
||||
outdir="docs/manpages",
|
||||
config="docs/conf.py",
|
||||
if bld.env.SPHINX_BUILD:
|
||||
bld(features='sphinx',
|
||||
name='manpages',
|
||||
builder='man',
|
||||
outdir='docs/manpages',
|
||||
config='docs/conf.py',
|
||||
source=bld.path.ant_glob('docs/manpages/**/*.rst'),
|
||||
install_path="${MANDIR}/",
|
||||
install_path='${MANDIR}',
|
||||
VERSION=VERSION)
|
||||
|
||||
def docs(bld):
|
||||
@@ -295,85 +298,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