From e32c177e45a24324a0e81844f0233b377115328f Mon Sep 17 00:00:00 2001 From: Gabriel Ferreira Date: Mon, 31 Jan 2022 19:43:21 -0300 Subject: [PATCH] build: remove waf files, tests and references --- .gitignore | 3 +- .vscode/tasks.json | 2 +- bindings/python/wscript | 547 ------ .../waf_workaround_fakeconfig.cmake | 4 +- buildsupport/version-defines-template.h | 2 +- contrib/.gitignore | 1 - contrib/wscript | 326 --- examples/channel-models/wscript | 5 - examples/energy/wscript | 7 - examples/error-model/wscript | 5 - examples/ipv6/wscript | 32 - examples/matrix-topology/wscript | 6 - examples/naming/wscript | 5 - examples/realtime/wscript | 8 - examples/routing/wscript | 56 - examples/socket/wscript | 14 - examples/stats/wscript | 6 - examples/tcp/wscript | 51 - examples/traffic-control/wscript | 25 - examples/tutorial/wscript | 33 - examples/udp-client-server/wscript | 8 - examples/udp/wscript | 5 - examples/wireless/wscript | 123 -- ns3 | 8 +- src/antenna/wscript | 47 - src/aodv/examples/wscript | 6 - src/aodv/wscript | 48 - src/applications/examples/wscript | 8 - src/applications/wscript | 75 - src/bridge/examples/wscript | 12 - src/bridge/wscript | 21 - src/brite/examples/wscript | 7 - src/brite/wscript | 116 -- src/buildings/examples/wscript | 12 - src/buildings/wscript | 63 - src/click/examples/wscript | 26 - src/click/wscript | 137 -- src/config-store/examples/wscript | 6 - src/config-store/wscript | 96 - src/core/examples/hash-example.cc | 2 - src/core/examples/wscript | 68 - src/core/model/example-as-test.h | 6 +- src/core/model/int64x64.h | 2 +- src/core/model/test.h | 2 +- src/core/wscript | 514 ----- src/csma-layout/examples/wscript | 5 - src/csma-layout/wscript | 18 - src/csma/examples/wscript | 20 - src/csma/wscript | 23 - src/dsdv/examples/wscript | 6 - src/dsdv/wscript | 37 - src/dsr/examples/wscript | 6 - src/dsr/wscript | 56 - src/energy/examples/wscript | 14 - src/energy/wscript | 62 - src/fd-net-device/examples/wscript | 37 - src/fd-net-device/wscript | 254 --- src/flow-monitor/examples/wscript | 4 - src/flow-monitor/wscript | 41 - src/internet-apps/examples/wscript | 11 - src/internet-apps/wscript | 62 - src/internet/examples/wscript | 9 - src/internet/wscript | 354 ---- src/lr-wpan/examples/wscript | 20 - src/lr-wpan/wscript | 64 - src/lte/examples/wscript | 75 - src/lte/wscript | 345 ---- src/mesh/examples/wscript | 5 - src/mesh/wscript | 101 - src/mobility/examples/wscript | 33 - src/mobility/wscript | 74 - src/mpi/examples/wscript | 25 - src/mpi/wscript | 78 - src/netanim/doc/animation.rst | 2 +- src/netanim/examples/wscript | 30 - src/netanim/wscript | 25 - src/network/examples/wscript | 20 - src/network/wscript | 181 -- src/nix-vector-routing/examples/wscript | 18 - src/nix-vector-routing/wscript | 30 - src/olsr/examples/wscript | 10 - src/olsr/wscript | 43 - src/openflow/examples/wscript | 6 - src/openflow/wscript | 164 -- src/point-to-point-layout/wscript | 23 - src/point-to-point/examples/wscript | 8 - src/point-to-point/wscript | 43 - src/propagation/examples/wscript | 13 - src/propagation/wscript | 63 - src/sixlowpan/examples/wscript | 21 - src/sixlowpan/wscript | 40 - src/spectrum/examples/wscript | 26 - src/spectrum/wscript | 106 - src/stats/doc/probe.rst | 2 +- src/stats/examples/wscript | 28 - src/stats/wscript | 95 - src/tap-bridge/examples/wscript | 15 - src/tap-bridge/wscript | 57 - src/test/wscript | 55 - src/topology-read/examples/wscript | 5 - src/topology-read/wscript | 37 - src/traffic-control/examples/wscript | 28 - src/traffic-control/wscript | 77 - src/uan/examples/wscript | 20 - src/uan/wscript | 74 - src/virtual-net-device/examples/wscript | 7 - src/virtual-net-device/wscript | 18 - src/visualizer/wscript | 101 - src/wave/examples/wscript | 14 - src/wave/wscript | 67 - src/wifi/examples/wscript | 29 - src/wifi/wscript | 317 --- src/wimax/examples/wscript | 11 - src/wimax/wscript | 126 -- src/wscript | 748 ------- test.py | 48 +- utils.py | 2 +- utils/coverity-report.sh | 6 +- utils/run-examples-with-full-logging.sh | 2 +- utils/tests/TestBase.py | 2 +- utils/tests/gitlab-ci-pybindgen.yml | 4 +- utils/tests/test-ns3.py | 104 - utils/tests/test-test.py | 6 +- utils/tests/test-waf.py | 193 -- utils/wscript | 37 - waf | 174 -- waf-tools/boost.py | 413 ---- waf-tools/cflags.py | 203 -- waf-tools/clang_compilation_database.py | 68 - waf-tools/command.py | 131 -- waf-tools/misc.py | 413 ---- waf-tools/relocation.py | 85 - waf-tools/shellcmd.py | 357 ---- waf-tools/versioning.py | 262 --- waf.bat | 1 - wscript | 1748 ----------------- wutils.py | 260 --- 137 files changed, 51 insertions(+), 11666 deletions(-) delete mode 100644 bindings/python/wscript delete mode 100644 contrib/wscript delete mode 100644 examples/channel-models/wscript delete mode 100644 examples/energy/wscript delete mode 100644 examples/error-model/wscript delete mode 100644 examples/ipv6/wscript delete mode 100644 examples/matrix-topology/wscript delete mode 100644 examples/naming/wscript delete mode 100644 examples/realtime/wscript delete mode 100644 examples/routing/wscript delete mode 100644 examples/socket/wscript delete mode 100644 examples/stats/wscript delete mode 100644 examples/tcp/wscript delete mode 100644 examples/traffic-control/wscript delete mode 100644 examples/tutorial/wscript delete mode 100644 examples/udp-client-server/wscript delete mode 100644 examples/udp/wscript delete mode 100644 examples/wireless/wscript delete mode 100644 src/antenna/wscript delete mode 100644 src/aodv/examples/wscript delete mode 100644 src/aodv/wscript delete mode 100644 src/applications/examples/wscript delete mode 100644 src/applications/wscript delete mode 100644 src/bridge/examples/wscript delete mode 100644 src/bridge/wscript delete mode 100644 src/brite/examples/wscript delete mode 100644 src/brite/wscript delete mode 100644 src/buildings/examples/wscript delete mode 100644 src/buildings/wscript delete mode 100644 src/click/examples/wscript delete mode 100644 src/click/wscript delete mode 100644 src/config-store/examples/wscript delete mode 100644 src/config-store/wscript delete mode 100644 src/core/examples/wscript delete mode 100644 src/core/wscript delete mode 100644 src/csma-layout/examples/wscript delete mode 100644 src/csma-layout/wscript delete mode 100644 src/csma/examples/wscript delete mode 100644 src/csma/wscript delete mode 100644 src/dsdv/examples/wscript delete mode 100644 src/dsdv/wscript delete mode 100644 src/dsr/examples/wscript delete mode 100644 src/dsr/wscript delete mode 100644 src/energy/examples/wscript delete mode 100644 src/energy/wscript delete mode 100644 src/fd-net-device/examples/wscript delete mode 100644 src/fd-net-device/wscript delete mode 100644 src/flow-monitor/examples/wscript delete mode 100644 src/flow-monitor/wscript delete mode 100644 src/internet-apps/examples/wscript delete mode 100644 src/internet-apps/wscript delete mode 100644 src/internet/examples/wscript delete mode 100644 src/internet/wscript delete mode 100644 src/lr-wpan/examples/wscript delete mode 100644 src/lr-wpan/wscript delete mode 100644 src/lte/examples/wscript delete mode 100644 src/lte/wscript delete mode 100644 src/mesh/examples/wscript delete mode 100644 src/mesh/wscript delete mode 100644 src/mobility/examples/wscript delete mode 100644 src/mobility/wscript delete mode 100644 src/mpi/examples/wscript delete mode 100644 src/mpi/wscript delete mode 100644 src/netanim/examples/wscript delete mode 100644 src/netanim/wscript delete mode 100644 src/network/examples/wscript delete mode 100644 src/network/wscript delete mode 100644 src/nix-vector-routing/examples/wscript delete mode 100644 src/nix-vector-routing/wscript delete mode 100644 src/olsr/examples/wscript delete mode 100644 src/olsr/wscript delete mode 100644 src/openflow/examples/wscript delete mode 100644 src/openflow/wscript delete mode 100644 src/point-to-point-layout/wscript delete mode 100644 src/point-to-point/examples/wscript delete mode 100644 src/point-to-point/wscript delete mode 100644 src/propagation/examples/wscript delete mode 100644 src/propagation/wscript delete mode 100644 src/sixlowpan/examples/wscript delete mode 100644 src/sixlowpan/wscript delete mode 100644 src/spectrum/examples/wscript delete mode 100644 src/spectrum/wscript delete mode 100644 src/stats/examples/wscript delete mode 100644 src/stats/wscript delete mode 100644 src/tap-bridge/examples/wscript delete mode 100644 src/tap-bridge/wscript delete mode 100644 src/test/wscript delete mode 100644 src/topology-read/examples/wscript delete mode 100644 src/topology-read/wscript delete mode 100644 src/traffic-control/examples/wscript delete mode 100644 src/traffic-control/wscript delete mode 100644 src/uan/examples/wscript delete mode 100644 src/uan/wscript delete mode 100644 src/virtual-net-device/examples/wscript delete mode 100644 src/virtual-net-device/wscript delete mode 100644 src/visualizer/wscript delete mode 100644 src/wave/examples/wscript delete mode 100644 src/wave/wscript delete mode 100644 src/wifi/examples/wscript delete mode 100644 src/wifi/wscript delete mode 100644 src/wimax/examples/wscript delete mode 100644 src/wimax/wscript delete mode 100644 src/wscript delete mode 100644 utils/tests/test-waf.py delete mode 100644 utils/wscript delete mode 100755 waf delete mode 100644 waf-tools/boost.py delete mode 100644 waf-tools/cflags.py delete mode 100644 waf-tools/clang_compilation_database.py delete mode 100644 waf-tools/command.py delete mode 100644 waf-tools/misc.py delete mode 100644 waf-tools/relocation.py delete mode 100644 waf-tools/shellcmd.py delete mode 100644 waf-tools/versioning.py delete mode 100755 waf.bat delete mode 100644 wscript delete mode 100644 wutils.py diff --git a/.gitignore b/.gitignore index 9419fcf39..f44c80997 100644 --- a/.gitignore +++ b/.gitignore @@ -29,8 +29,7 @@ massif.* coverity TAGS -.lock-waf_*_build -.waf* +.lock-ns3 build-dir/ build/ diff --git a/.vscode/tasks.json b/.vscode/tasks.json index a27c46468..e8f159326 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -6,7 +6,7 @@ { "label": "Build", "type": "shell", - "command": "./waf", + "command": "./ns3", "group": { "kind": "build", "isDefault": true diff --git a/bindings/python/wscript b/bindings/python/wscript deleted file mode 100644 index d5322e840..000000000 --- a/bindings/python/wscript +++ /dev/null @@ -1,547 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- -from __future__ import print_function -import types -import re -import os -import subprocess -import shutil -import sys - -from waflib import Task, Options, Configure, TaskGen, Logs, Build, Utils, Errors -from waflib.Errors import WafError - -# feature = TaskGen.feature -# after = TaskGen.after - -# https://github.com/gjcarneiro/pybindgen -# If specifying a released pybindgen version, specify the required PYBINDGEN -# version as, e.g. '0.21.0' -# If specifying a commit on the development tree, specify it like this based -# on 'git describe --tags' command. Example, if the latest release was 0.21.0, -# and 'git describe --tags' reports "0.21.0-6-g8e7c0a9", then write the -# PYBINDGEN version string below as '0.21.0.post6+ng8e7c0a9' -REQUIRED_PYBINDGEN_VERSION = '0.22.0' -REQUIRED_PYGCCXML_VERSION = (2, 0, 1) -REQUIRED_CASTXML_VERSION = '0.2' - -RUN_ME=-3 - -# return types of some APIs differ in Python 2/3 (type string vs class bytes) -# This method will decode('utf-8') a byte object in Python 3, -# and do nothing in Python 2 -def maybe_decode(input): - if sys.version_info < (3,): - return input - else: - try: - return input.decode('utf-8') - except: - sys.exc_clear() - return input - -def add_to_python_path(path): - if os.environ.get('PYTHONPATH', ''): - os.environ['PYTHONPATH'] = path + os.pathsep + os.environ.get('PYTHONPATH') - else: - os.environ['PYTHONPATH'] = path - -def set_pybindgen_pythonpath(env): - if env['WITH_PYBINDGEN']: - add_to_python_path(env['WITH_PYBINDGEN']) - - -def options(opt): - opt.load('python') - opt.add_option('--disable-python', - help=("Don't build Python bindings."), - action="store_true", default=False, - dest='python_disable') - opt.add_option('--apiscan', - help=("Rescan the API for the indicated module(s), for Python bindings. " - "Needs working CastXML / pygccxml environment. " - "The metamodule 'all' expands to all available ns-3 modules."), - default=None, dest='apiscan', metavar="MODULE[,MODULE...]") - opt.add_option('--with-pybindgen', - help=('Path to an existing pybindgen source tree to use.'), - default=None, - dest='with_pybindgen', type="string") - opt.add_option('--with-python', - help=('Path to the Python interpreter to use.'), - default=None, dest='with_python', type="string") - - -def split_version(version): - if (re.search ('post', version)): - # Version format such as '0.17.0.post58+ngcf00cc0' - ver = re.split('[.+]', version)[:4] - return (int(ver[0]), int(ver[1]), int(ver[2]), int(ver[3].split('post')[1])) - else: - # Version format such as '0.18.0' - ver = re.split('[.]', version)[:3] - return (int(ver[0]), int(ver[1]), int(ver[2]), 0) - - -def configure(conf): - conf.env['ENABLE_PYTHON_BINDINGS'] = False - if Options.options.python_disable: - conf.report_optional_feature("python", "Python Bindings", False, - "disabled by user request") - return - # Disable python in static builds (bug #1253) - if ((conf.env['ENABLE_STATIC_NS3']) or \ - (conf.env['ENABLE_SHARED_AND_STATIC_NS3'])): - conf.report_optional_feature("python", "Python Bindings", False, - "bindings incompatible with static build") - return - - enabled_modules = list(conf.env['NS3_ENABLED_MODULES']) - enabled_modules.sort() - available_modules = list(conf.env['NS3_MODULES']) - available_modules.sort() - all_modules_enabled = (enabled_modules == available_modules) - - conf.load('misc', tooldir=['waf-tools']) - - if sys.platform == 'cygwin': - conf.report_optional_feature("python", "Python Bindings", False, - "unsupported platform 'cygwin'") - Logs.warn("Python is not supported in CygWin environment. Try MingW instead.") - return - - - ## Check for Python - - if Options.options.with_python is not None: - conf.env.PYTHON = Options.options.with_python - - try: - conf.load('python') - except Errors.ConfigurationError as ex: - conf.report_optional_feature("python", "Python Bindings", False, - "The python interpreter was not found") - return - try: - conf.check_python_version((2,3)) - except Errors.ConfigurationError as ex: - conf.report_optional_feature("python", "Python Bindings", False, - "The python found version is too low (2.3 required)") - return - try: - conf.check_python_headers() - except Errors.ConfigurationError as ex: - conf.report_optional_feature("python", "Python Bindings", False, - "Python library or headers missing") - return - - # stupid Mac OSX Python wants to build extensions as "universal - # binaries", i386, x86_64, and ppc, but this way the type - # __uint128_t is not available. We need to disable the multiarch - # crap by removing the -arch parameters. - for flags_var in ["CFLAGS_PYEXT", "CFLAGS_PYEMBED", "CXXFLAGS_PYEMBED", - "CXXFLAGS_PYEXT", "LINKFLAGS_PYEMBED", "LINKFLAGS_PYEXT"]: - flags = conf.env[flags_var] - i = 0 - while i < len(flags): - if flags[i] == '-arch': - del flags[i] - del flags[i] - continue - i += 1 - conf.env[flags_var] = flags - - # -fvisibility=hidden optimization - if (conf.env['CXX_NAME'] == 'gcc' and [int(x) for x in conf.env['CC_VERSION']] >= [4,0,0] - and conf.check_compilation_flag('-fvisibility=hidden')): - conf.env.append_value('CXXFLAGS_PYEXT', '-fvisibility=hidden') - conf.env.append_value('CCFLAGS_PYEXT', '-fvisibility=hidden') - - if conf.check_compilation_flag('-Wno-array-bounds'): - conf.env.append_value('CXXFLAGS_PYEXT', '-Wno-array-bounds') - - # Check for the location of pybindgen - if Options.options.with_pybindgen is not None: - if os.path.isdir(Options.options.with_pybindgen): - conf.msg("Checking for pybindgen location", ("%s (given)" % Options.options.with_pybindgen)) - conf.env['WITH_PYBINDGEN'] = os.path.abspath(Options.options.with_pybindgen) - else: - # ns-3-dev uses ../pybindgen, while ns-3 releases use ../REQUIRED_PYBINDGEN_VERSION - pybindgen_dir = os.path.join('..', "pybindgen") - pybindgen_release_str = "pybindgen-" + REQUIRED_PYBINDGEN_VERSION - pybindgen_release_dir = os.path.join('..', pybindgen_release_str) - if os.path.isdir(pybindgen_dir): - conf.msg("Checking for pybindgen location", ("%s (guessed)" % pybindgen_dir)) - conf.env['WITH_PYBINDGEN'] = os.path.abspath(pybindgen_dir) - elif os.path.isdir(pybindgen_release_dir): - conf.msg("Checking for pybindgen location", ("%s (guessed)" % pybindgen_release_dir)) - conf.env['WITH_PYBINDGEN'] = os.path.abspath(pybindgen_release_dir) - del pybindgen_dir - del pybindgen_release_dir - if not conf.env['WITH_PYBINDGEN']: - conf.msg("Checking for pybindgen location", False) - - # Check for pybindgen - - set_pybindgen_pythonpath(conf.env) - - try: - conf.check_python_module('pybindgen') - except Errors.ConfigurationError: - Logs.warn("pybindgen missing => no python bindings") - conf.report_optional_feature("python", "Python Bindings", False, - "PyBindGen missing") - return - else: - out = subprocess.Popen([conf.env['PYTHON'][0], "-c", - "import pybindgen.version; " - "print(pybindgen.__version__)"], - stdout=subprocess.PIPE).communicate()[0] - pybindgen_version = maybe_decode(out.strip()) - conf.msg('Checking for pybindgen version', pybindgen_version) - if not pybindgen_version: - Logs.warn("pybindgen_version is an empty string") - conf.report_optional_feature("python", "Python Bindings", False, - "PyBindGen version not found") - return - if not (split_version(pybindgen_version) >= split_version(REQUIRED_PYBINDGEN_VERSION)): - Logs.warn("pybindgen (found %r), (need %r)" % - (pybindgen_version, REQUIRED_PYBINDGEN_VERSION)) - conf.report_optional_feature("python", "Python Bindings", False, - "PyBindGen found but version %s is not the required version %s" % (pybindgen_version, REQUIRED_PYBINDGEN_VERSION)) - return - - - def test(t1, t2): - test_program = ''' -#include -#include - -int main () -{ - std::vector< %(type1)s > t = std::vector< %(type2)s > (); - return 0; -} -''' % dict(type1=t1, type2=t2) - - try: - ret = conf.check(compiler='cxx', fragment=test_program, features='cxx') - except Errors.ConfigurationError: - ret = False - conf.msg('Checking for types %s and %s equivalence' % (t1, t2), (ret and 'no' or 'yes')) - return ret - - uint64_is_long = test("uint64_t", "unsigned long") - uint64_is_long_long = test("uint64_t", "unsigned long long") - - if uint64_is_long: - conf.env['PYTHON_BINDINGS_APIDEFS'] = 'gcc-LP64' - elif uint64_is_long_long: - conf.env['PYTHON_BINDINGS_APIDEFS'] = 'gcc-ILP32' - else: - conf.env['PYTHON_BINDINGS_APIDEFS'] = None - if conf.env['PYTHON_BINDINGS_APIDEFS'] is None: - msg = 'none available' - else: - msg = conf.env['PYTHON_BINDINGS_APIDEFS'] - - conf.msg('Checking for the apidefs that can be used for Python bindings', msg) - - if conf.env['PYTHON_BINDINGS_APIDEFS'] is None: - conf.report_optional_feature("python", "Python Bindings", False, - "No apidefs are available that can be used in this system") - return - - - ## If all has gone well, we finally enable the Python bindings - conf.env['ENABLE_PYTHON_BINDINGS'] = True - conf.report_optional_feature("python", "Python Bindings", True, None) - - - # check cxxabi stuff (which Mac OS X Lion breaks) - fragment = r""" -# include -int main () -{ - const abi::__si_class_type_info *_typeinfo __attribute__((unused)) = NULL; - return 0; -} -""" - gcc_rtti_abi = conf.check_nonfatal(fragment=fragment, msg="Checking for internal GCC cxxabi", - okmsg="complete", errmsg='incomplete', - mandatory=False) - conf.env["GCC_RTTI_ABI_COMPLETE"] = str(bool(gcc_rtti_abi)) - - - - ## Check for pygccxml - try: - conf.check_python_module('pygccxml') - except Errors.ConfigurationError: - conf.report_optional_feature("castxml", "Python API Scanning Support", False, - "Missing 'pygccxml' Python module") - return - - try: - import pygccxml as pygccxml_imported - pygccxml_version_str = pygccxml_imported.__version__ - except (ImportError, AttributeError): - Logs.warn("pygccxml version cannot be determined") - conf.report_optional_feature("castxml", "Python API Scanning Support", False, - "pygccxml Python module version is unknown") - return - - # Bug 2013: pygccxml versions > 1.0.0 prepend a 'v' to version number - pygccxml_version_str = pygccxml_version_str.lstrip('v') - pygccxml_version = tuple([int(x) for x in pygccxml_version_str.split('.')]) - conf.msg('Checking for pygccxml version', pygccxml_version_str) - if not (pygccxml_version >= REQUIRED_PYGCCXML_VERSION): - Logs.warn("pygccxml (found %s) is too old (need %s) => " - "automatic scanning of API definitions will not be possible" % - (pygccxml_version_str, - '.'.join([str(x) for x in REQUIRED_PYGCCXML_VERSION]))) - conf.report_optional_feature("castxml", "Python API Scanning Support", False, - "pygccxml Python module too old") - return - - - ## Check castxml version - try: - castxml = conf.find_program('castxml', var='CASTXML') - except WafError: - castxml = None - if not castxml: - Logs.warn("castxml missing; automatic scanning of API definitions will not be possible") - conf.report_optional_feature("castxml", "Python API Scanning Support", False, - "castxml missing") - return - - out = subprocess.Popen([castxml[0], '--version'], - stdout=subprocess.PIPE).communicate()[0] - castxml_version_line = maybe_decode(out).split('\n', 1)[0].strip() - ## Expecting version string such as 'castxml version 0.1-gfab9c47' - m = re.match( "^castxml version (\d\.\d)(-)?(\w+)?", castxml_version_line) - try: - castxml_version = m.group(1) - castxml_version_ok = castxml_version >= REQUIRED_CASTXML_VERSION - except AttributeError: - castxml_version = castxml_version_line - castxml_version_ok = False - conf.msg('Checking for castxml version', castxml_version) - if not castxml_version_ok: - Logs.warn("castxml version unknown or too old, need version >= %s; automatic scanning of API definitions will not be possible" % REQUIRED_CASTXML_VERSION) - conf.report_optional_feature("castxml", "Python API Scanning Support", False, - "castxml too old") - return - - ## If we reached - conf.env['ENABLE_PYTHON_SCANNING'] = True - conf.report_optional_feature("castxml", "Python API Scanning Support", True, None) - -# --------------------- - -def get_headers_map(bld): - headers_map = {} # header => module - for ns3headers in bld.all_task_gen: - if 'ns3header' in getattr(ns3headers, "features", []): - if ns3headers.module.endswith('-test'): - continue - for h in ns3headers.to_list(ns3headers.headers): - headers_map[os.path.basename(h)] = ns3headers.module - return headers_map - -def get_module_path(bld, module): - for ns3headers in bld.all_task_gen: - if 'ns3header' in getattr(ns3headers, "features", []): - if ns3headers.module == module: - break - else: - raise ValueError("Module %r not found" % module) - return ns3headers.path.abspath() - -class apiscan_task(Task.Task): - """Uses castxml to scan the file 'everything.h' and extract API definitions. - """ - before = ['cxxprogram', 'cxxshlib', 'cxxstlib', 'command'] - after = ['gen_ns3_module_header', 'ns3header'] - color = "BLUE" - def __init__(self, curdirnode, env, bld, target, cflags, module): - self.bld = bld - super(apiscan_task, self).__init__(generator=self, env=env) - self.curdirnode = curdirnode - self.env = env - self.target = target - self.cflags = cflags - self.module = module - - def display(self): - return 'api-scan-%s\n' % (self.target,) - - def uid(self): - try: - return self.uid_ - except AttributeError: - m = Utils.md5() - up = m.update - up(self.__class__.__name__.encode()) - up(self.curdirnode.abspath().encode()) - up(self.target.encode()) - self.uid_ = m.digest() - return self.uid_ - - def run(self): - self.inputs = [self.bld.bldnode.find_resource("ns3/{0}-module.h".format(self.module))] - self.outputs = [self.bld.srcnode.find_resource("src/{}/bindings/modulegen__{}.py".format(self.module, self.target))] - if self.outputs[0] is None: - self.outputs = [self.bld.srcnode.find_resource("contrib/{}/bindings/modulegen__{}.py".format(self.module, self.target))] - top_builddir = self.bld.bldnode.abspath() - module_path = get_module_path(self.bld, self.module) - headers_map = get_headers_map(self.bld) - scan_header = os.path.join(top_builddir, "ns3", "%s-module.h" % self.module) - - if not os.path.exists(scan_header): - Logs.error("Cannot apiscan module %r: %s does not exist" % (self.module, scan_header)) - return 0 - - argv = [ - self.env['PYTHON'][0], - os.path.join(self.curdirnode.abspath(), 'ns3modulescan-modular.py'), # scanning script - top_builddir, - self.module, - repr(get_headers_map(self.bld)), - os.path.join(module_path, "bindings", 'modulegen__%s.py' % (self.target)), # output file - self.cflags, - ] - scan = subprocess.Popen(argv, stdin=subprocess.PIPE) - retval = scan.wait() - - if retval >= 0 and "LP64" in self.target: - self.lp64_to_ilp32( - os.path.join(module_path, "bindings", 'modulegen__%s.py' % (self.target)), - os.path.join(module_path, "bindings", 'modulegen__%s.py' % "gcc_ILP32") - ) - - return retval - - def runnable_status(self): - # By default, Waf Task will skip running a task if the signature of - # the build has not changed. We want this task to always run if - # invoked by the user, particularly since --apiscan=all will require - # invoking this task many times, once per module. - return RUN_ME - - def lp64_to_ilp32(self, lp64path, ilp32path): - lp64file = open(lp64path, "r") - lp64bindings = lp64file.read() - lp64file.close() - ilp32file = open(ilp32path, "w") - ilp32bindings = re.sub("unsigned long(?!( long))", "unsigned long long", lp64bindings) - ilp32file.write(ilp32bindings) - ilp32file.close() - -def get_modules_and_headers(bld): - """ - Gets a dict of - module_name => ([module_dep1, module_dep2, ...], [module_header1, module_header2, ...]) - tuples, one for each module. - """ - - retval = {} - for module in bld.all_task_gen: - if not module.name.startswith('ns3-'): - continue - if module.name.endswith('-test'): - continue - module_name = module.name[4:] # strip the ns3- prefix - ## find the headers object for this module - headers = [] - for ns3headers in bld.all_task_gen: - if 'ns3header' not in getattr(ns3headers, "features", []): - continue - if ns3headers.module != module_name: - continue - for source in ns3headers.to_list(ns3headers.headers): - headers.append(os.path.basename(source)) - retval[module_name] = (list(module.module_deps), headers) - return retval - - - - -class gen_ns3_compat_pymod_task(Task.Task): - """Generates a 'ns3.py' compatibility module.""" - before = ['cxxprogram', 'cxxshlib', 'cxxstlib'] - color = 'BLUE' - - def run(self): - assert len(self.outputs) == 1 - outfile = open(self.outputs[0].abspath(), "w") - print("import warnings", file=outfile) - print('warnings.warn("the ns3 module is a compatibility layer '\ - 'and should not be used in newly written code", DeprecationWarning, stacklevel=2)', file=outfile) - print(file=outfile) - for module in self.bld.env['PYTHON_MODULES_BUILT']: - print("from ns.%s import *" % (module.replace('-', '_')), file=outfile) - outfile.close() - return 0 - - - -def build(bld): - if Options.options.python_disable: - return - - env = bld.env - set_pybindgen_pythonpath(env) - - if Options.options.apiscan: - if not env['ENABLE_PYTHON_SCANNING']: - raise WafError("Cannot re-scan python bindings: (py)gccxml not available") - scan_targets = [] - if sys.platform == 'cygwin': - scan_targets.append(('gcc_cygwin', '')) - else: - import struct - if struct.calcsize('I') == 4 and struct.calcsize('L') == 8 and struct.calcsize('P') == 8: - scan_targets.append(('gcc_LP64', '-m64')) - elif struct.calcsize('I') == 4 and struct.calcsize('L') == 4 and struct.calcsize('P') == 4: - scan_targets.append(('gcc_ILP32', '')) - else: - raise WafError("Cannot scan python bindings for unsupported data model") - - test_module_path = bld.path.find_dir("../../src/test") - if Options.options.apiscan == 'all': - scan_modules = [] - for mod in bld.all_task_gen: - if not mod.name.startswith('ns3-'): - continue - if mod.path.is_child_of(test_module_path): - continue - if mod.name.endswith('-test'): - continue - bindings_enabled = (mod.name in env.MODULAR_BINDINGS_MODULES) - #print mod.name, bindings_enabled - if bindings_enabled: - scan_modules.append(mod.name.split('ns3-')[1]) - else: - scan_modules = Options.options.apiscan.split(',') - print("Modules to scan: ", scan_modules) - for target, cflags in scan_targets: - group = bld.get_group(bld.current_group) - for module in scan_modules: - group.append(apiscan_task(bld.path, env, bld, target, cflags, module)) - return - - - if env['ENABLE_PYTHON_BINDINGS']: - task = gen_ns3_compat_pymod_task(env=env.derive()) - task.set_outputs(bld.path.find_or_declare("ns3.py")) - task.dep_vars = ['PYTHON_MODULES_BUILT'] - task.bld = bld - grp = bld.get_group(bld.current_group) - grp.append(task) - - bld(features='copy', source="ns__init__.py", target='ns/__init__.py') - bld.install_as('${PYTHONARCHDIR}/ns/__init__.py', 'ns__init__.py') - - - # note: the actual build commands for the python bindings are in - # src/wscript, not here. diff --git a/buildsupport/custom_modules/waf_workaround_fakeconfig.cmake b/buildsupport/custom_modules/waf_workaround_fakeconfig.cmake index 9780ba5c5..d1df4ed36 100644 --- a/buildsupport/custom_modules/waf_workaround_fakeconfig.cmake +++ b/buildsupport/custom_modules/waf_workaround_fakeconfig.cmake @@ -1,6 +1,6 @@ # cmake-format: off # -# A sample of what Waf currently produces +# A sample of what Waf produced # ---- Summary of optional NS-3 features: # Build profile : debug @@ -210,6 +210,6 @@ macro(write_fakewaf_config) string(APPEND out "\n") endif() - file(WRITE ${PROJECT_BINARY_DIR}/ns3wafconfig.txt ${out}) + file(WRITE ${PROJECT_BINARY_DIR}/ns3config.txt ${out}) message(STATUS ${out}) endmacro() diff --git a/buildsupport/version-defines-template.h b/buildsupport/version-defines-template.h index 2a0198563..b9e5c0e97 100644 --- a/buildsupport/version-defines-template.h +++ b/buildsupport/version-defines-template.h @@ -134,7 +134,7 @@ /** * Indicates the build profile that was specified by the --build-profile option - * of "waf configure" + * of "ns3 configure" * * Type: string literal */ diff --git a/contrib/.gitignore b/contrib/.gitignore index 0e0fc146e..2f1d1143b 100644 --- a/contrib/.gitignore +++ b/contrib/.gitignore @@ -2,5 +2,4 @@ * # Include specific files that should be tracked by Git -!wscript !.gitignore diff --git a/contrib/wscript b/contrib/wscript deleted file mode 100644 index 83a39836e..000000000 --- a/contrib/wscript +++ /dev/null @@ -1,326 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- -from __future__ import print_function -from collections import deque -import os, os.path -import sys -import shutil -import types -import warnings - -from waflib import TaskGen, Task, Options, Build, Utils, Context -from waflib.Errors import WafError -import wutils - -try: - set -except NameError: - from sets import Set as set # Python 2.3 fallback - -# Allow mulitple modules to live in a single directory in contrib. -# For example, a directory structure like: -# contrib/package/module1 -# /module2 -# Useful for external projects that are building interdependent modules that -# are logically packaged together. -def find_contrib_modules(ctx, log=False): - modules = [] - - entries = deque( (ctx.path, d) for d in ctx.path.listdir() ) - - while entries: - parent, entry = entries.popleft() - - if not entry or entry[0] == '.' or entry.endswith('CVS'): - continue - - node = parent.find_node(entry) - - if not node: - continue - - if node.isdir(): - #does this directory have a wscript file? - wscript_node = node.find_node('wscript') - - if wscript_node: - #found a wscript file, treat this directory as a module. - - #get the path relative to the context path - module_path = node.path_from(ctx.path) - modules.append(module_path) - - if log: - ctx.msg("Found contrib module", module_path) - else: - #maybe this directory is a project, - #add its children to the list of entries to process - entries.extend( (node, d) for d in node.listdir() ) - - return sorted(modules) - -def get_required_boost_libs(conf): - for module in find_contrib_modules(conf): - conf.recurse (module, name="required_boost_libs", mandatory=False) - -def options(opt): - for module in find_contrib_modules(opt): - opt.recurse(module, mandatory=False) - -def configure(conf): - all_contrib_modules = find_contrib_modules(conf, True) - - # Append blddir to the module path before recursing into modules - # This is required for contrib modules with test suites - blddir = os.path.abspath(os.path.join(conf.bldnode.abspath(), conf.variant)) - conf.env.append_value('NS3_MODULE_PATH', blddir) - - # Remove duplicate path items - conf.env['NS3_MODULE_PATH'] = wutils.uniquify_list(conf.env['NS3_MODULE_PATH']) - - for module in all_contrib_modules: - conf.recurse(module, mandatory=False) - - ## Used to link the 'test-runner' program with all of ns-3 code - conf.env['NS3_CONTRIBUTED_MODULES'] = ['ns3-' + module.split('/')[-1] for module in all_contrib_modules] - - -# we need the 'ns3module' waf "feature" to be created because code -# elsewhere looks for it to find the ns3 module objects. - -def create_ns3_module(bld, name, dependencies=(), test=False): - static = bool(bld.env.ENABLE_STATIC_NS3) - # Create a separate library for this module. - if static: - module = bld(features='cxx cxxstlib ns3module') - else: - module = bld(features='cxx cxxshlib ns3module') - target = '%s/lib/ns%s-%s%s' % (bld.srcnode.path_from(module.path), - wutils.VERSION, - name, bld.env.BUILD_SUFFIX) - - module.target = target - linkflags = [] - cxxflags = [] - ccflags = [] - if not static: - cxxflags = module.env['shlib_CXXFLAGS'] - ccflags = module.env['shlib_CXXFLAGS'] - # Turn on the link flags for shared libraries if we have the - # proper compiler and platform. - if module.env['CXX_NAME'] in ['gcc', 'icc'] and module.env['WL_SONAME_SUPPORTED']: - # Get the module library name without any relative paths - # at its beginning because all of the libraries will end - # up in the same directory. - module_library_name = module.env.cshlib_PATTERN % (os.path.basename(module.target),) - linkflags = '-Wl,--soname=' + module_library_name - cxxdefines = ["NS3_MODULE_COMPILATION"] - ccdefines = ["NS3_MODULE_COMPILATION"] - - module.env.append_value('CXXFLAGS', cxxflags) - module.env.append_value('CCFLAGS', ccflags) - module.env.append_value('LINKFLAGS', linkflags) - module.env.append_value('CXXDEFINES', cxxdefines) - module.env.append_value('CCDEFINES', ccdefines) - - module.is_static = static - module.vnum = wutils.VNUM - # Add the proper path to the module's name. - # Set the libraries this module depends on. - module.module_deps = list(dependencies) - - module.install_path = "${LIBDIR}" - - module.name = "ns3-" + name - module.dependencies = dependencies - # Initially create an empty value for this because the pcfile - # writing task assumes every module has a uselib attribute. - module.uselib = '' - module.use = ['ns3-' + dep for dep in dependencies] - module.test = test - module.is_ns3_module = True - module.ns3_dir_location = bld.path.path_from(bld.srcnode) - - module.env.append_value("INCLUDES", Context.out_dir) - - module.pcfilegen = bld(features='ns3pcfile') - module.pcfilegen.module = module.name - - return module - -def create_ns3_module_test_library(bld, name): - # Create an ns3 module for the test library that depends only on - # the module being tested. - library_name = name + "-test" - library = bld.create_ns3_module(library_name, [name], test=True) - library.features += " ns3testlib" - - # Modify attributes for the test library that are different from a - # normal module. - del library.is_ns3_module - library.is_ns3_module_test_library = True - library.module_name = 'ns3-' + name - - # Add this module and test library to the list. - bld.env.append_value('NS3_MODULES_WITH_TEST_LIBRARIES', [(library.module_name, library.name)]) - - # Set the include path from the build directory to modules. - relative_path_from_build_to_here = bld.path.path_from(bld.bldnode) - include_flag = '-I' + relative_path_from_build_to_here - library.env.append_value('CXXFLAGS', include_flag) - library.env.append_value('CCFLAGS', include_flag) - - return library - -def create_obj(bld, *args): - warnings.warn("(in %s) Use bld(...) call now, instead of bld.create_obj(...)" % str(bld.path), - DeprecationWarning, stacklevel=2) - return bld(*args) - - -def ns3_python_bindings(bld): - # this method is called from a module wscript, so remember bld.path is not bindings/python! - module_abs_src_path = bld.path.abspath() - module = os.path.basename(module_abs_src_path) - env = bld.env - env.append_value("MODULAR_BINDINGS_MODULES", "ns3-"+module) - - if Options.options.apiscan: - return - - if not env['ENABLE_PYTHON_BINDINGS']: - return - - bindings_dir = bld.path.find_dir("bindings") - if bindings_dir is None or not os.path.exists(bindings_dir.abspath()): - warnings.warn("(in %s) Requested to build modular python bindings, but apidefs dir not found " - "=> skipped the bindings." % str(bld.path), - Warning, stacklevel=2) - return - - if ("ns3-%s" % (module,)) not in env.NS3_ENABLED_CONTRIBUTED_MODULES: - #print "bindings for module %s which is not enabled, skip" % module) - return - - env.append_value('PYTHON_MODULES_BUILT', module) - try: - apidefs = env['PYTHON_BINDINGS_APIDEFS'].replace("-", "_") - except AttributeError: - # we likely got an empty list for env['PYTHON_BINDINGS_APIDEFS'] - return - - #debug = ('PYBINDGEN_DEBUG' in os.environ) - debug = True # XXX - source = [bld.srcnode.find_resource('bindings/python/ns3modulegen-modular.py'), - bld.path.find_resource("bindings/modulegen__%s.py" % apidefs)] - - modulegen_customizations = bindings_dir.find_resource("modulegen_customizations.py") - if modulegen_customizations is not None: - source.append(modulegen_customizations) - - modulegen_local = bld.path.find_resource("bindings/modulegen_local.py") - # the local customization file may or not exist - if modulegen_local is not None: - source.append("bindings/modulegen_local.py") - - module_py_name = module.replace('-', '_') - module_target_dir = bld.srcnode.find_dir("bindings/python/ns").path_from(bld.path) - - # if bindings/.py exists, it becomes the module frontend, and the C extension befomes _ - if bld.path.find_resource("bindings/%s.py" % (module_py_name,)) is not None: - bld(features='copy', - source=("bindings/%s.py" % (module_py_name,)), - target=('%s/%s.py' % (module_target_dir, module_py_name))) - extension_name = '_%s' % (module_py_name,) - bld.install_files('${PYTHONARCHDIR}/ns', ["bindings/%s.py" % (module_py_name,)]) - else: - extension_name = module_py_name - - target = ['bindings/ns3module.cc', 'bindings/ns3module.h', 'bindings/ns3modulegen.log'] - #if not debug: - # target.append('ns3modulegen.log') - - argv = ['NS3_ENABLED_FEATURES=${FEATURES}', - 'GCC_RTTI_ABI_COMPLETE=${GCC_RTTI_ABI_COMPLETE}', - '${PYTHON}'] - #if debug: - # argv.extend(["-m", "pdb"]) - - argv.extend(['${SRC[0]}', module_abs_src_path, apidefs, extension_name, '${TGT[0]}']) - - argv.extend(['2>', '${TGT[2]}']) # 2> ns3modulegen.log - - features = [] - for (name, caption, was_enabled, reason_not_enabled) in env['NS3_OPTIONAL_FEATURES']: - if was_enabled: - features.append(name) - - bindgen = bld(features='command', source=source, target=target, command=argv) - bindgen.env['FEATURES'] = ','.join(features) - bindgen.dep_vars = ['FEATURES', "GCC_RTTI_ABI_COMPLETE"] - bindgen.before = ['cxxprogram', 'cxxshlib', 'cxxstlib'] - bindgen.after = 'gen_ns3_module_header' - bindgen.name = "pybindgen(ns3 module %s)" % module - bindgen.module = module - bindgen.install_path = None - - # generate the extension module - pymod = bld(features='cxx cxxshlib pyext') - pymod.source = ['bindings/ns3module.cc'] - pymod.target = '%s/%s' % (module_target_dir, extension_name) - pymod.name = 'ns3module_%s' % module - pymod.module = module - pymod.use = ["%s" % mod for mod in pymod.env['NS3_ENABLED_CONTRIBUTED_MODULES']] - if pymod.env['ENABLE_STATIC_NS3']: - if sys.platform == 'darwin': - pymod.env.append_value('LINKFLAGS', '-Wl,-all_load') - for mod in pymod.usel: - #mod = mod.split("--lib")[0] - pymod.env.append_value('LINKFLAGS', '-l' + mod) - else: - pymod.env.append_value('LINKFLAGS', '-Wl,--whole-archive,-Bstatic') - for mod in pymod.use: - #mod = mod.split("--lib")[0] - pymod.env.append_value('LINKFLAGS', '-l' + mod) - pymod.env.append_value('LINKFLAGS', '-Wl,-Bdynamic,--no-whole-archive') - defines = list(pymod.env['DEFINES']) - defines.extend(['NS_DEPRECATED=', 'NS3_DEPRECATED_H']) - defines.extend(['NS_DEPRECATED_3_35=', 'NS3_DEPRECATED_H']) - defines.extend(['NS_DEPRECATED_3_34=', 'NS3_DEPRECATED_H']) - if Utils.unversioned_sys_platform() == 'win32': - try: - defines.remove('_DEBUG') # causes undefined symbols on win32 - except ValueError: - pass - pymod.env['DEFINES'] = defines - # The following string should lead to includes of - # '-I.', '-Isrc/core/bindings' when compiling module_helpers.cc - pymod.includes = Context.out_dir + ' ' + Context.out_dir + '/src/core/bindings' - pymod.install_path = '${PYTHONARCHDIR}/ns' - - # Workaround to a WAF bug, remove this when ns-3 upgrades to WAF > 1.6.10 - # https://www.nsnam.org/bugzilla/show_bug.cgi?id=1335 - # http://code.google.com/p/waf/issues/detail?id=1098 - if Utils.unversioned_sys_platform() == 'darwin': - pymod.mac_bundle = True - - return pymod - -def build(bld): - bld.create_ns3_module = types.MethodType(create_ns3_module, bld) - bld.create_ns3_module_test_library = types.MethodType(create_ns3_module_test_library, bld) - bld.create_obj = types.MethodType(create_obj, bld) - bld.ns3_python_bindings = types.MethodType(ns3_python_bindings, bld) - - all_contrib_modules = find_contrib_modules(bld) - - # Remove these modules from the list of all modules. - for not_built in bld.env['MODULES_NOT_BUILT']: - - if not_built in all_contrib_modules: - all_contrib_modules.remove(not_built) - - bld.recurse(list(all_contrib_modules)) - - for module in all_contrib_modules: - modheader = bld(features='ns3moduleheader') - modheader.module = module.split('/')[-1] diff --git a/examples/channel-models/wscript b/examples/channel-models/wscript deleted file mode 100644 index 8e27ea2bf..000000000 --- a/examples/channel-models/wscript +++ /dev/null @@ -1,5 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('three-gpp-v2v-channel-example', ['core', 'mobility', 'propagation', 'spectrum', 'antenna', 'buildings']) - obj.source = 'three-gpp-v2v-channel-example.cc' diff --git a/examples/energy/wscript b/examples/energy/wscript deleted file mode 100644 index b551e9701..000000000 --- a/examples/energy/wscript +++ /dev/null @@ -1,7 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('energy-model-example', ['core', 'mobility', 'wifi', 'energy', 'internet', 'config-store']) - obj.source = 'energy-model-example.cc' - obj = bld.create_ns3_program('energy-model-with-harvesting-example', ['core', 'mobility', 'wifi', 'energy', 'internet', 'config-store']) - obj.source = 'energy-model-with-harvesting-example.cc' diff --git a/examples/error-model/wscript b/examples/error-model/wscript deleted file mode 100644 index f5d557830..000000000 --- a/examples/error-model/wscript +++ /dev/null @@ -1,5 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('simple-error-model', ['point-to-point', 'internet', 'applications']) - obj.source = 'simple-error-model.cc' diff --git a/examples/ipv6/wscript b/examples/ipv6/wscript deleted file mode 100644 index ac1403074..000000000 --- a/examples/ipv6/wscript +++ /dev/null @@ -1,32 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('icmpv6-redirect', ['csma', 'internet', 'internet-apps']) - obj.source = 'icmpv6-redirect.cc' - - obj = bld.create_ns3_program('ping6', ['csma', 'internet', 'internet-apps']) - obj.source = 'ping6.cc' - - obj = bld.create_ns3_program('radvd', ['csma', 'internet', 'internet-apps']) - obj.source = 'radvd.cc' - - obj = bld.create_ns3_program('radvd-two-prefix', ['csma', 'internet', 'internet-apps']) - obj.source = 'radvd-two-prefix.cc' - - obj = bld.create_ns3_program('test-ipv6', ['point-to-point', 'internet']) - obj.source = 'test-ipv6.cc' - - obj = bld.create_ns3_program('fragmentation-ipv6', ['csma', 'internet', 'internet-apps']) - obj.source = 'fragmentation-ipv6.cc' - - obj = bld.create_ns3_program('fragmentation-ipv6-two-MTU', ['csma', 'internet', 'internet-apps']) - obj.source = 'fragmentation-ipv6-two-MTU.cc' - - obj = bld.create_ns3_program('loose-routing-ipv6', ['csma', 'internet', 'internet-apps']) - obj.source = 'loose-routing-ipv6.cc' - - obj = bld.create_ns3_program('wsn-ping6', ['lr-wpan', 'internet', 'sixlowpan', 'mobility', 'internet-apps']) - obj.source = 'wsn-ping6.cc' - - obj = bld.create_ns3_program('fragmentation-ipv6-PMTU', ['csma', 'internet', 'internet-apps', 'point-to-point']) - obj.source = 'fragmentation-ipv6-PMTU.cc' diff --git a/examples/matrix-topology/wscript b/examples/matrix-topology/wscript deleted file mode 100644 index 595d6d561..000000000 --- a/examples/matrix-topology/wscript +++ /dev/null @@ -1,6 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('matrix-topology', - ['network', 'internet', 'netanim', 'point-to-point', 'mobility', 'applications']) - obj.source = 'matrix-topology.cc' diff --git a/examples/naming/wscript b/examples/naming/wscript deleted file mode 100644 index 7c2a2bf27..000000000 --- a/examples/naming/wscript +++ /dev/null @@ -1,5 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('object-names', ['core', 'csma', 'internet', 'applications']) - obj.source = 'object-names.cc' diff --git a/examples/realtime/wscript b/examples/realtime/wscript deleted file mode 100644 index 6c81a7d0f..000000000 --- a/examples/realtime/wscript +++ /dev/null @@ -1,8 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - if bld.env["ENABLE_REAL_TIME"]: - obj = bld.create_ns3_program('realtime-udp-echo', ['csma', 'internet', 'applications']) - obj.source = 'realtime-udp-echo.cc' - - bld.register_ns3_script('realtime-udp-echo.py', ['csma', 'internet', 'applications']) diff --git a/examples/routing/wscript b/examples/routing/wscript deleted file mode 100644 index d2cb2cf03..000000000 --- a/examples/routing/wscript +++ /dev/null @@ -1,56 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('dynamic-global-routing', - ['point-to-point', 'csma', 'internet', 'applications']) - obj.source = 'dynamic-global-routing.cc' - - obj = bld.create_ns3_program('static-routing-slash32', - ['point-to-point', 'csma', 'internet', 'applications']) - obj.source = 'static-routing-slash32.cc' - - obj = bld.create_ns3_program('global-routing-slash32', - ['point-to-point', 'csma', 'internet', 'applications']) - obj.source = 'global-routing-slash32.cc' - - obj = bld.create_ns3_program('global-injection-slash32', - ['point-to-point', 'csma', 'internet', 'applications']) - obj.source = 'global-injection-slash32.cc' - - obj = bld.create_ns3_program('simple-global-routing', - ['point-to-point', 'internet', 'applications', 'flow-monitor']) - obj.source = 'simple-global-routing.cc' - - obj = bld.create_ns3_program('simple-alternate-routing', - ['point-to-point', 'internet', 'applications']) - obj.source = 'simple-alternate-routing.cc' - - obj = bld.create_ns3_program('mixed-global-routing', - ['point-to-point', 'internet', 'csma', 'applications']) - obj.source = 'mixed-global-routing.cc' - - obj = bld.create_ns3_program('simple-routing-ping6', - ['csma', 'internet', 'internet-apps']) - obj.source = 'simple-routing-ping6.cc' - - obj = bld.create_ns3_program('manet-routing-compare', - ['wifi', 'dsr', 'dsdv', 'aodv', 'olsr', 'internet', 'applications']) - obj.source = 'manet-routing-compare.cc' - - obj = bld.create_ns3_program('ripng-simple-network', - ['csma', 'internet', 'internet-apps']) - obj.source = 'ripng-simple-network.cc' - - bld.register_ns3_script('simple-routing-ping6.py', ['csma', 'internet', 'internet-apps']) - - obj = bld.create_ns3_program('rip-simple-network', - ['csma', 'internet', 'internet-apps']) - obj.source = 'rip-simple-network.cc' - - obj = bld.create_ns3_program('global-routing-multi-switch-plus-router', - ['core', 'network', 'applications', 'internet', 'bridge', 'csma', 'point-to-point', 'csma', 'internet']) - obj.source = 'global-routing-multi-switch-plus-router.cc' - - obj = bld.create_ns3_program('simple-multicast-flooding', - ['core', 'network', 'applications', 'internet']) - obj.source = 'simple-multicast-flooding.cc' diff --git a/examples/socket/wscript b/examples/socket/wscript deleted file mode 100644 index bfbea1fd0..000000000 --- a/examples/socket/wscript +++ /dev/null @@ -1,14 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('socket-bound-static-routing', ['network', 'csma', 'point-to-point', 'internet']) - obj.source = 'socket-bound-static-routing.cc' - - obj = bld.create_ns3_program('socket-bound-tcp-static-routing', ['network', 'csma', 'point-to-point', 'internet', 'applications']) - obj.source = 'socket-bound-tcp-static-routing.cc' - - obj = bld.create_ns3_program('socket-options-ipv4', ['network', 'csma', 'point-to-point', 'internet']) - obj.source = 'socket-options-ipv4.cc' - - obj = bld.create_ns3_program('socket-options-ipv6', ['network', 'csma', 'point-to-point', 'internet']) - obj.source = 'socket-options-ipv6.cc' diff --git a/examples/stats/wscript b/examples/stats/wscript deleted file mode 100644 index b51afea0e..000000000 --- a/examples/stats/wscript +++ /dev/null @@ -1,6 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('wifi-example-sim', ['stats', 'internet', 'mobility', 'wifi']) - obj.source = ['wifi-example-sim.cc', - 'wifi-example-apps.cc'] diff --git a/examples/tcp/wscript b/examples/tcp/wscript deleted file mode 100644 index 2962c3d9d..000000000 --- a/examples/tcp/wscript +++ /dev/null @@ -1,51 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('tcp-large-transfer', - ['point-to-point', 'applications', 'internet']) - obj.source = 'tcp-large-transfer.cc' - - obj = bld.create_ns3_program('tcp-star-server', - ['point-to-point', 'applications', 'internet']) - obj.source = 'tcp-star-server.cc' - - obj = bld.create_ns3_program('star', - ['netanim', 'point-to-point', 'point-to-point-layout', 'applications', 'internet']) - obj.source = 'star.cc' - - obj = bld.create_ns3_program('tcp-bulk-send', - ['point-to-point', 'applications', 'internet']) - obj.source = 'tcp-bulk-send.cc' - - obj = bld.create_ns3_program('tcp-pcap-nanosec-example', - ['point-to-point', 'applications', 'internet']) - obj.source = 'tcp-pcap-nanosec-example.cc' - - obj = bld.create_ns3_program('tcp-variants-comparison', - ['point-to-point', 'internet', 'applications', 'flow-monitor']) - - obj.source = 'tcp-variants-comparison.cc' - - obj = bld.create_ns3_program('tcp-pacing', - ['point-to-point', 'internet', 'applications', 'flow-monitor']) - - obj.source = 'tcp-pacing.cc' - - obj = bld.create_ns3_program('dctcp-example', - ['core', 'network', 'internet', 'point-to-point', 'applications', 'traffic-control']) - obj.source = 'dctcp-example.cc' - - obj = bld.create_ns3_program('tcp-linux-reno', - ['point-to-point', 'internet', 'applications', 'traffic-control', 'network']) - - obj.source = 'tcp-linux-reno.cc' - - obj = bld.create_ns3_program('tcp-validation', - ['point-to-point', 'internet', 'applications', 'traffic-control', 'network', 'internet-apps']) - - obj.source = 'tcp-validation.cc' - - obj = bld.create_ns3_program('tcp-bbr-example', - ['point-to-point', 'internet', 'applications', 'traffic-control', 'network', 'internet-apps', 'flow-monitor']) - - obj.source = 'tcp-bbr-example.cc' diff --git a/examples/traffic-control/wscript b/examples/traffic-control/wscript deleted file mode 100644 index f743ecb1a..000000000 --- a/examples/traffic-control/wscript +++ /dev/null @@ -1,25 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('traffic-control', - ['internet', 'point-to-point', 'applications', 'traffic-control', 'flow-monitor']) - obj.source = 'traffic-control.cc' - - obj = bld.create_ns3_program('queue-discs-benchmark', - ['internet', 'point-to-point', 'applications', 'internet-apps', 'traffic-control', 'flow-monitor']) - obj.source = 'queue-discs-benchmark.cc' - - obj = bld.create_ns3_program('red-vs-fengadaptive', ['point-to-point', 'point-to-point-layout', 'internet', 'applications', 'traffic-control']) - obj.source = 'red-vs-fengadaptive.cc' - - obj = bld.create_ns3_program('red-vs-nlred', ['point-to-point', 'point-to-point-layout', 'internet', 'applications', 'traffic-control']) - obj.source = 'red-vs-nlred.cc' - - obj = bld.create_ns3_program('tbf-example', - ['internet', 'point-to-point', 'applications', 'traffic-control']) - obj.source = 'tbf-example.cc' - - obj = bld.create_ns3_program('cobalt-vs-codel', - ['internet', 'point-to-point', 'applications', 'traffic-control']) - obj.source = 'cobalt-vs-codel.cc' - diff --git a/examples/tutorial/wscript b/examples/tutorial/wscript deleted file mode 100644 index 3963d067f..000000000 --- a/examples/tutorial/wscript +++ /dev/null @@ -1,33 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('hello-simulator', ['core']) - obj.source = 'hello-simulator.cc' - - obj = bld.create_ns3_program('first', ['core', 'point-to-point', 'internet', 'applications']) - obj.source = 'first.cc' - - bld.register_ns3_script('first.py', ['internet', 'point-to-point', 'applications']) - - obj = bld.create_ns3_program('second', ['core', 'point-to-point', 'csma', 'internet', 'applications']) - obj.source = 'second.cc' - - bld.register_ns3_script('second.py', ['core', 'point-to-point', 'csma', 'internet', 'applications']) - - obj = bld.create_ns3_program('third', ['core', 'point-to-point', 'csma', 'wifi', 'internet', 'applications']) - obj.source = 'third.cc' - - bld.register_ns3_script('third.py', ['core', 'point-to-point', 'csma', 'wifi', 'internet', 'applications']) - - obj = bld.create_ns3_program('fourth', ['core']) - obj.source = 'fourth.cc' - - obj = bld.create_ns3_program('fifth', ['core', 'point-to-point', 'internet', 'applications']) - obj.source = [ 'fifth.cc', 'tutorial-app.cc' ] - - obj = bld.create_ns3_program('sixth', ['core', 'point-to-point', 'internet', 'applications']) - obj.source = [ 'sixth.cc', 'tutorial-app.cc' ] - - obj = bld.create_ns3_program('seventh', ['core', 'stats', 'point-to-point', 'internet', 'applications']) - obj.source = [ 'seventh.cc', 'tutorial-app.cc' ] - diff --git a/examples/udp-client-server/wscript b/examples/udp-client-server/wscript deleted file mode 100644 index d6d0b4998..000000000 --- a/examples/udp-client-server/wscript +++ /dev/null @@ -1,8 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('udp-client-server', ['csma', 'internet', 'applications']) - obj.source = 'udp-client-server.cc' - - obj = bld.create_ns3_program('udp-trace-client-server', ['csma', 'internet', 'applications']) - obj.source = 'udp-trace-client-server.cc' diff --git a/examples/udp/wscript b/examples/udp/wscript deleted file mode 100644 index acce45fc5..000000000 --- a/examples/udp/wscript +++ /dev/null @@ -1,5 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('udp-echo', ['csma', 'internet', 'applications']) - obj.source = 'udp-echo.cc' diff --git a/examples/wireless/wscript b/examples/wireless/wscript deleted file mode 100644 index 93a0b3662..000000000 --- a/examples/wireless/wscript +++ /dev/null @@ -1,123 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('mixed-wired-wireless', ['wifi', 'applications', 'olsr', 'netanim']) - obj.source = 'mixed-wired-wireless.cc' - - bld.register_ns3_script('mixed-wired-wireless.py', ['wifi', 'applications', 'olsr']) - - obj = bld.create_ns3_program('wifi-adhoc', ['wifi', 'applications']) - obj.source = 'wifi-adhoc.cc' - - obj = bld.create_ns3_program('wifi-clear-channel-cmu', ['internet', 'wifi']) - obj.source = 'wifi-clear-channel-cmu.cc' - - obj = bld.create_ns3_program('wifi-ap', ['wifi', 'applications']) - obj.source = 'wifi-ap.cc' - - bld.register_ns3_script('wifi-ap.py', ['wifi', 'applications']) - - obj = bld.create_ns3_program('wifi-wired-bridging', ['wifi', 'csma', 'bridge', 'applications']) - obj.source = 'wifi-wired-bridging.cc' - - obj = bld.create_ns3_program('wifi-multirate', ['wifi', 'flow-monitor', 'olsr', 'applications']) - obj.source = 'wifi-multirate.cc' - - obj = bld.create_ns3_program('wifi-simple-adhoc', ['internet', 'wifi']) - obj.source = 'wifi-simple-adhoc.cc' - - obj = bld.create_ns3_program('wifi-simple-adhoc-grid', ['internet', 'wifi', 'olsr']) - obj.source = 'wifi-simple-adhoc-grid.cc' - - obj = bld.create_ns3_program('wifi-simple-infra', ['internet', 'wifi']) - obj.source = 'wifi-simple-infra.cc' - - obj = bld.create_ns3_program('wifi-simple-interference', ['internet', 'wifi']) - obj.source = 'wifi-simple-interference.cc' - - obj = bld.create_ns3_program('wifi-blockack', ['wifi', 'applications']) - obj.source = 'wifi-blockack.cc' - - obj = bld.create_ns3_program('wifi-dsss-validation', ['wifi']) - obj.source = 'wifi-dsss-validation.cc' - - obj = bld.create_ns3_program('wifi-ofdm-validation', ['wifi']) - obj.source = 'wifi-ofdm-validation.cc' - - obj = bld.create_ns3_program('wifi-ofdm-ht-validation', ['wifi']) - obj.source = 'wifi-ofdm-ht-validation.cc' - - obj = bld.create_ns3_program('wifi-ofdm-vht-validation', ['wifi']) - obj.source = 'wifi-ofdm-vht-validation.cc' - - obj = bld.create_ns3_program('wifi-hidden-terminal', ['wifi', 'applications', 'flow-monitor']) - obj.source = 'wifi-hidden-terminal.cc' - - obj = bld.create_ns3_program('wifi-ht-network', ['wifi', 'applications']) - obj.source = 'wifi-ht-network.cc' - - obj = bld.create_ns3_program('wifi-vht-network', ['wifi', 'applications']) - obj.source = 'wifi-vht-network.cc' - - obj = bld.create_ns3_program('wifi-timing-attributes', ['wifi', 'applications']) - obj.source = 'wifi-timing-attributes.cc' - - obj = bld.create_ns3_program('wifi-sleep', ['wifi', 'applications']) - obj.source = 'wifi-sleep.cc' - - obj = bld.create_ns3_program('wifi-power-adaptation-distance', ['wifi', 'applications']) - obj.source = 'wifi-power-adaptation-distance.cc' - - obj = bld.create_ns3_program('wifi-power-adaptation-interference', ['wifi', 'applications', 'flow-monitor']) - obj.source = 'wifi-power-adaptation-interference.cc' - - obj = bld.create_ns3_program('wifi-rate-adaptation-distance', ['wifi', 'applications']) - obj.source = 'wifi-rate-adaptation-distance.cc' - - obj = bld.create_ns3_program('wifi-aggregation', ['wifi', 'applications']) - obj.source = 'wifi-aggregation.cc' - - obj = bld.create_ns3_program('wifi-txop-aggregation', ['wifi', 'applications']) - obj.source = 'wifi-txop-aggregation.cc' - - obj = bld.create_ns3_program('wifi-simple-ht-hidden-stations', ['wifi', 'applications']) - obj.source = 'wifi-simple-ht-hidden-stations.cc' - - obj = bld.create_ns3_program('wifi-80211n-mimo', ['wifi', 'applications']) - obj.source = 'wifi-80211n-mimo.cc' - - obj = bld.create_ns3_program('wifi-mixed-network', ['wifi', 'applications']) - obj.source = 'wifi-mixed-network.cc' - - obj = bld.create_ns3_program('wifi-tcp', ['wifi', 'applications']) - obj.source = 'wifi-tcp.cc' - - obj = bld.create_ns3_program('wifi-80211e-txop', ['wifi', 'applications']) - obj.source = 'wifi-80211e-txop.cc' - - obj = bld.create_ns3_program('wifi-spectrum-per-example', ['wifi', 'applications']) - obj.source = 'wifi-spectrum-per-example.cc' - - obj = bld.create_ns3_program('wifi-spectrum-per-interference', ['wifi', 'applications']) - obj.source = 'wifi-spectrum-per-interference.cc' - - obj = bld.create_ns3_program('wifi-spectrum-saturation-example', ['wifi', 'applications']) - obj.source = 'wifi-spectrum-saturation-example.cc' - - obj = bld.create_ns3_program('wifi-ofdm-he-validation', ['wifi']) - obj.source = 'wifi-ofdm-he-validation.cc' - - obj = bld.create_ns3_program('wifi-he-network', ['wifi', 'applications']) - obj.source = 'wifi-he-network.cc' - - obj = bld.create_ns3_program('wifi-multi-tos', ['wifi', 'applications']) - obj.source = 'wifi-multi-tos.cc' - - obj = bld.create_ns3_program('wifi-backward-compatibility', ['wifi', 'applications']) - obj.source = 'wifi-backward-compatibility.cc' - - obj = bld.create_ns3_program('wifi-spatial-reuse', ['wifi', 'applications']) - obj.source = 'wifi-spatial-reuse.cc' - - obj = bld.create_ns3_program('wifi-error-models-comparison', ['wifi']) - obj.source = 'wifi-error-models-comparison.cc' diff --git a/ns3 b/ns3 index 497829210..1b4bee620 100755 --- a/ns3 +++ b/ns3 @@ -152,7 +152,7 @@ def parse_args(argv): help="Do not execute the commands", action="store_true", default=None, dest="configure_dry_run") - parser_clean = sub_parser.add_parser('clean', help='Removes files created by waf and ns3') + parser_clean = sub_parser.add_parser('clean', help='Removes files created by ns3') parser_clean.add_argument('clean', action="store_true", default=False) parser_clean.add_argument('--dry-run', help="Do not execute the commands", @@ -405,10 +405,10 @@ def project_not_configured(config_msg=""): def check_config(current_cmake_cache_folder): if current_cmake_cache_folder is None: project_not_configured() - waf_like_config_table = current_cmake_cache_folder + os.sep + "ns3wafconfig.txt" - if not os.path.exists(waf_like_config_table): + config_table = current_cmake_cache_folder + os.sep + "ns3config.txt" + if not os.path.exists(config_table): project_not_configured() - with open(waf_like_config_table, "r") as f: + with open(config_table, "r") as f: print(f.read()) diff --git a/src/antenna/wscript b/src/antenna/wscript deleted file mode 100644 index 5d3d85ade..000000000 --- a/src/antenna/wscript +++ /dev/null @@ -1,47 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - - module = bld.create_ns3_module('antenna', ['core']) - - module.source = [ - 'model/angles.cc', - 'model/antenna-model.cc', - 'model/isotropic-antenna-model.cc', - 'model/cosine-antenna-model.cc', - 'model/parabolic-antenna-model.cc', - 'model/three-gpp-antenna-model.cc', - 'model/phased-array-model.cc', - 'model/uniform-planar-array.cc', - ] - - module_test = bld.create_ns3_module_test_library('antenna') - module_test.source = [ - 'test/test-angles.cc', - 'test/test-degrees-radians.cc', - 'test/test-isotropic-antenna.cc', - 'test/test-cosine-antenna.cc', - 'test/test-parabolic-antenna.cc', - 'test/test-uniform-planar-array.cc', - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - module_test.source.extend([ - # 'test/antenna-examples-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'antenna' - headers.source = [ - 'model/angles.h', - 'model/antenna-model.h', - 'model/isotropic-antenna-model.h', - 'model/cosine-antenna-model.h', - 'model/parabolic-antenna-model.h', - 'model/three-gpp-antenna-model.h', - 'model/phased-array-model.h', - 'model/uniform-planar-array.h', - ] - - bld.ns3_python_bindings() diff --git a/src/aodv/examples/wscript b/src/aodv/examples/wscript deleted file mode 100644 index 819cf5aeb..000000000 --- a/src/aodv/examples/wscript +++ /dev/null @@ -1,6 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('aodv', - ['wifi', 'internet', 'aodv', 'internet-apps']) - obj.source = 'aodv.cc' diff --git a/src/aodv/wscript b/src/aodv/wscript deleted file mode 100644 index a73f12693..000000000 --- a/src/aodv/wscript +++ /dev/null @@ -1,48 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - module = bld.create_ns3_module('aodv', ['internet', 'wifi']) - module.includes = '.' - module.source = [ - 'model/aodv-id-cache.cc', - 'model/aodv-dpd.cc', - 'model/aodv-rtable.cc', - 'model/aodv-rqueue.cc', - 'model/aodv-packet.cc', - 'model/aodv-neighbor.cc', - 'model/aodv-routing-protocol.cc', - 'helper/aodv-helper.cc', - ] - - aodv_test = bld.create_ns3_module_test_library('aodv') - aodv_test.source = [ - 'test/aodv-id-cache-test-suite.cc', - 'test/aodv-test-suite.cc', - 'test/aodv-regression.cc', - 'test/bug-772.cc', - 'test/loopback.cc', - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - aodv_test.source.extend([ - # 'test/aodv-examples-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'aodv' - headers.source = [ - 'model/aodv-id-cache.h', - 'model/aodv-dpd.h', - 'model/aodv-rtable.h', - 'model/aodv-rqueue.h', - 'model/aodv-packet.h', - 'model/aodv-neighbor.h', - 'model/aodv-routing-protocol.h', - 'helper/aodv-helper.h', - ] - - if bld.env['ENABLE_EXAMPLES']: - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/applications/examples/wscript b/src/applications/examples/wscript deleted file mode 100644 index 34d269a01..000000000 --- a/src/applications/examples/wscript +++ /dev/null @@ -1,8 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - if not bld.env['ENABLE_EXAMPLES']: - return; - - obj = bld.create_ns3_program('three-gpp-http-example', ['applications','point-to-point','internet','network']) - obj.source = 'three-gpp-http-example.cc' diff --git a/src/applications/wscript b/src/applications/wscript deleted file mode 100644 index 8f5326b5c..000000000 --- a/src/applications/wscript +++ /dev/null @@ -1,75 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - module = bld.create_ns3_module('applications', ['internet', 'stats']) - module.source = [ - 'model/bulk-send-application.cc', - 'model/onoff-application.cc', - 'model/packet-sink.cc', - 'model/udp-client.cc', - 'model/udp-server.cc', - 'model/seq-ts-header.cc', - 'model/seq-ts-size-header.cc', - 'model/seq-ts-echo-header.cc', - 'model/udp-trace-client.cc', - 'model/packet-loss-counter.cc', - 'model/udp-echo-client.cc', - 'model/udp-echo-server.cc', - 'model/application-packet-probe.cc', - 'model/three-gpp-http-client.cc', - 'model/three-gpp-http-server.cc', - 'model/three-gpp-http-header.cc', - 'model/three-gpp-http-variables.cc', - 'helper/bulk-send-helper.cc', - 'helper/on-off-helper.cc', - 'helper/packet-sink-helper.cc', - 'helper/udp-client-server-helper.cc', - 'helper/udp-echo-helper.cc', - 'helper/three-gpp-http-helper.cc', - ] - - applications_test = bld.create_ns3_module_test_library('applications') - applications_test.source = [ - 'test/three-gpp-http-client-server-test.cc', - 'test/bulk-send-application-test-suite.cc', - 'test/udp-client-server-test.cc' - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - applications_test.source.extend([ - # 'test/applications-examples-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'applications' - headers.source = [ - 'model/bulk-send-application.h', - 'model/onoff-application.h', - 'model/packet-sink.h', - 'model/udp-client.h', - 'model/udp-server.h', - 'model/seq-ts-header.h', - 'model/seq-ts-size-header.h', - 'model/seq-ts-echo-header.h', - 'model/udp-trace-client.h', - 'model/packet-loss-counter.h', - 'model/udp-echo-client.h', - 'model/udp-echo-server.h', - 'model/application-packet-probe.h', - 'model/three-gpp-http-client.h', - 'model/three-gpp-http-server.h', - 'model/three-gpp-http-header.h', - 'model/three-gpp-http-variables.h', - 'helper/bulk-send-helper.h', - 'helper/on-off-helper.h', - 'helper/packet-sink-helper.h', - 'helper/udp-client-server-helper.h', - 'helper/udp-echo-helper.h', - 'helper/three-gpp-http-helper.h' - ] - - if (bld.env['ENABLE_EXAMPLES']): - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/bridge/examples/wscript b/src/bridge/examples/wscript deleted file mode 100644 index cdf18b1c9..000000000 --- a/src/bridge/examples/wscript +++ /dev/null @@ -1,12 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - - obj = bld.create_ns3_program('csma-bridge', ['bridge', 'csma', 'internet', 'applications']) - obj.source = 'csma-bridge.cc' - - bld.register_ns3_script('csma-bridge.py', ['bridge', 'csma', 'internet', 'applications']) - - obj = bld.create_ns3_program('csma-bridge-one-hop', ['bridge', 'csma', 'internet', 'applications']) - obj.source = 'csma-bridge-one-hop.cc' - diff --git a/src/bridge/wscript b/src/bridge/wscript deleted file mode 100644 index d02ac7476..000000000 --- a/src/bridge/wscript +++ /dev/null @@ -1,21 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_module('bridge', ['network']) - obj.source = [ - 'model/bridge-net-device.cc', - 'model/bridge-channel.cc', - 'helper/bridge-helper.cc', - ] - headers = bld(features='ns3header') - headers.module = 'bridge' - headers.source = [ - 'model/bridge-net-device.h', - 'model/bridge-channel.h', - 'helper/bridge-helper.h', - ] - - if bld.env['ENABLE_EXAMPLES']: - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/brite/examples/wscript b/src/brite/examples/wscript deleted file mode 100644 index 24fe6f367..000000000 --- a/src/brite/examples/wscript +++ /dev/null @@ -1,7 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('brite-generic-example', ['brite', 'internet', 'point-to-point', 'nix-vector-routing', 'applications']) - obj.source = 'brite-generic-example.cc' - obj = bld.create_ns3_program('brite-MPI-example', ['brite', 'internet', 'point-to-point', 'nix-vector-routing', 'applications', 'mpi']) - obj.source = 'brite-MPI-example.cc' diff --git a/src/brite/wscript b/src/brite/wscript deleted file mode 100644 index 5624b89a7..000000000 --- a/src/brite/wscript +++ /dev/null @@ -1,116 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -import os - -from waflib import Options - - -def options(opt): - opt.add_option('--with-brite', - help=('Use BRITE integration support, given by the indicated path,' - ' to allow the use of the BRITE topology generator'), - default=False, dest='with_brite') - -def configure(conf): - conf.env['ENABLE_BRITE'] = False - - lib_to_check = 'libbrite.so' - if Options.options.with_brite: - conf.msg("Checking BRITE location", ("%s (given)" % Options.options.with_brite)) - brite_dir = Options.options.with_brite - if os.path.exists(os.path.join(brite_dir, lib_to_check)): - conf.env['WITH_BRITE'] = os.path.abspath(Options.options.with_brite) - conf.env['ENABLE_BRITE'] = True - else: - conf.report_optional_feature("brite", "BRITE Integration", False, - "BRITE not found at requested location") - # Add this module to the list of modules that won't be built - # if they are enabled. - conf.env['MODULES_NOT_BUILT'].append('brite') - return - else: - # No user specified '--with-brite' option, try to guess - # bake.py uses ../../build, while ns-3-dev uses ../BRITE - brite_dir = os.path.join('..','BRITE') - brite_bake_build_dir = os.path.join('..', '..', 'build') - brite_bake_lib_dir = os.path.join(brite_bake_build_dir, 'lib') - if os.path.exists(os.path.join(brite_dir, lib_to_check)): - conf.msg("Checking for BRITE location", ("%s (guessed)" % brite_dir)) - conf.env['WITH_BRITE'] = os.path.abspath(brite_dir) - conf.env['ENABLE_BRITE'] = True -# Below is not yet ready (bake does not install BRITE yet, just builds it) -# elif os.path.exists(os.path.join(brite_bake_lib_dir, lib_to_check)): -# conf.msg("Checking for BRITE location", ("%s (guessed)" % brite_bake_lib_dir)) -# conf.env['WITH_BRITE'] = os.path.abspath(brite_bake_lib_dir) - else: - conf.report_optional_feature("brite", "BRITE Integration", False, 'BRITE not enabled (see option --with-brite)') - - # Add this module to the list of modules that won't be built - # if they are enabled. - conf.env['MODULES_NOT_BUILT'].append('brite') - return - - test_code = ''' -#include "Brite.h" - -int main() -{ - return 0; -} -''' - - conf.env['HAVE_DL'] = conf.check(mandatory=True, lib='dl', define_name='HAVE_DL', uselib_store='DL') - - conf.env['LIBPATH_BRITE'] = [os.path.abspath(os.path.join(conf.env['WITH_BRITE'], '.'))] - - conf.env['INCLUDES_BRITE'] = [ - os.path.abspath(os.path.join(conf.env['WITH_BRITE'],'.')), - os.path.abspath(os.path.join(conf.env['WITH_BRITE'],'Models')) - ] - - conf.env['DEFINES_BRITE'] = ['NS3_BRITE'] - - conf.env['BRITE'] = conf.check(fragment=test_code, lib='brite', libpath=conf.env['LIBPATH_BRITE'], uselib='BRITE') - - # This statement will get LD_LIBRARY_PATH set correctly when waf needs - # to load the brite shared library. - conf.env.append_value('NS3_MODULE_PATH',os.path.abspath(os.path.join(conf.env['WITH_BRITE'], '.'))) - - conf.report_optional_feature("brite", "BRITE Integration", - conf.env['BRITE'], "BRITE library not found") - -def build(bld): - # Don't do anything for this module if brite's not enabled. - if 'brite' in bld.env['MODULES_NOT_BUILT']: - return - - module = bld.create_ns3_module('brite', ['network', 'core', 'internet', 'point-to-point']) - module.source = [ - ] - - module_test = bld.create_ns3_module_test_library('brite') - module_test.source = [ - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - module_test.source.extend([ - # 'test/brite-examples-test-suite.cc', - ]) - - if bld.env['BRITE'] and bld.env['HAVE_DL']: - module.use.extend(['BRITE', 'DL']) - module_test.use.extend(['BRITE', 'DL']) - - headers = bld(features='ns3header') - headers.module = 'brite' - headers.source = [ - ] - - if bld.env['ENABLE_BRITE']: - module.source.append ('helper/brite-topology-helper.cc') - headers.source.append ('helper/brite-topology-helper.h') - module_test.source.append('test/brite-test-topology.cc') - - if bld.env['ENABLE_EXAMPLES'] and bld.env['ENABLE_BRITE']: - bld.recurse('examples') diff --git a/src/buildings/examples/wscript b/src/buildings/examples/wscript deleted file mode 100644 index 7c8fcceda..000000000 --- a/src/buildings/examples/wscript +++ /dev/null @@ -1,12 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('buildings-pathloss-profiler', - ['buildings']) - obj.source = 'buildings-pathloss-profiler.cc' - obj = bld.create_ns3_program('outdoor-random-walk-example', - ['buildings']) - obj.source = 'outdoor-random-walk-example.cc' - obj = bld.create_ns3_program('outdoor-group-mobility-example', - ['mobility', 'network', 'buildings']) - obj.source = 'outdoor-group-mobility-example.cc' diff --git a/src/buildings/wscript b/src/buildings/wscript deleted file mode 100644 index 5e63112a7..000000000 --- a/src/buildings/wscript +++ /dev/null @@ -1,63 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - - module = bld.create_ns3_module('buildings', ['mobility', 'propagation', 'config-store']) - module.source = [ - 'model/building.cc', - 'model/building-list.cc', - 'model/mobility-building-info.cc', - 'model/itu-r-1238-propagation-loss-model.cc', - 'model/buildings-propagation-loss-model.cc', - 'model/hybrid-buildings-propagation-loss-model.cc', - 'model/oh-buildings-propagation-loss-model.cc', - 'model/buildings-channel-condition-model.cc', - 'model/three-gpp-v2v-channel-condition-model.cc', - 'helper/building-container.cc', - 'helper/building-position-allocator.cc', - 'helper/building-allocator.cc', - 'helper/buildings-helper.cc', - 'model/random-walk-2d-outdoor-mobility-model.cc', - ] - - module_test = bld.create_ns3_module_test_library('buildings') - module_test.source = [ - 'test/buildings-helper-test.cc', - 'test/building-position-allocator-test.cc', - 'test/buildings-pathloss-test.cc', - 'test/buildings-shadowing-test.cc', - 'test/buildings-channel-condition-model-test.cc', - 'test/outdoor-random-walk-test.cc', - 'test/three-gpp-v2v-channel-condition-model-test.cc', - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - module_test.source.extend([ - # 'test/buildings-examples-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'buildings' - headers.source = [ - 'model/building.h', - 'model/building-list.h', - 'model/mobility-building-info.h', - 'model/itu-r-1238-propagation-loss-model.h', - 'model/buildings-propagation-loss-model.h', - 'model/hybrid-buildings-propagation-loss-model.h', - 'model/oh-buildings-propagation-loss-model.h', - 'model/buildings-channel-condition-model.h', - 'model/three-gpp-v2v-channel-condition-model.h', - 'helper/building-container.h', - 'helper/building-allocator.h', - 'helper/building-position-allocator.h', - 'helper/buildings-helper.h', - 'model/random-walk-2d-outdoor-mobility-model.h', - ] - - if (bld.env['ENABLE_EXAMPLES']): - bld.recurse('examples') - - - bld.ns3_python_bindings() diff --git a/src/click/examples/wscript b/src/click/examples/wscript deleted file mode 100644 index 2c674be6f..000000000 --- a/src/click/examples/wscript +++ /dev/null @@ -1,26 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('nsclick-simple-lan', - ['click', 'csma', 'internet', 'applications']) - obj.source = 'nsclick-simple-lan.cc' - - obj = bld.create_ns3_program('nsclick-raw-wlan', - ['click', 'wifi', 'internet', 'applications']) - obj.source = 'nsclick-raw-wlan.cc' - - obj = bld.create_ns3_program('nsclick-udp-client-server-csma', - ['click', 'csma', 'internet', 'applications']) - obj.source = 'nsclick-udp-client-server-csma.cc' - - obj = bld.create_ns3_program('nsclick-udp-client-server-wifi', - ['click', 'wifi', 'internet', 'applications']) - obj.source = 'nsclick-udp-client-server-wifi.cc' - - obj = bld.create_ns3_program('nsclick-routing', - ['click', 'csma', 'internet', 'applications']) - obj.source = 'nsclick-routing.cc' - - obj = bld.create_ns3_program('nsclick-defines', - ['click']) - obj.source = 'nsclick-defines.cc' diff --git a/src/click/wscript b/src/click/wscript deleted file mode 100644 index a1578d5fc..000000000 --- a/src/click/wscript +++ /dev/null @@ -1,137 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -import os - -from waflib import Options - - -def options(opt): - opt.add_option('--with-nsclick', - help=('Path to Click source or installation prefix for NS-3 Click Integration support'), - dest='with_nsclick', default=None) - opt.add_option('--disable-nsclick', - help=('Disable NS-3 Click Integration support'), - dest='disable_nsclick', default=False, action="store_true") - -def configure(conf): - if Options.options.disable_nsclick: - conf.report_optional_feature("nsclick", "NS-3 Click Integration", False, - "disabled by user request") - return - - if Options.options.with_nsclick: - if os.path.isdir(Options.options.with_nsclick): - conf.msg("Checking for libnsclick.so location", ("%s (given)" % Options.options.with_nsclick)) - conf.env['WITH_NSCLICK'] = os.path.abspath(Options.options.with_nsclick) - else: - # bake.py uses ../../build, while ns-3-dev uses ../click. - lib_to_check = 'libnsclick.so' - nsclick_bake_build_dir = os.path.join('..', '..', 'build') - nsclick_bake_lib_dir = os.path.join(nsclick_bake_build_dir, 'lib') - nsclick_dir = os.path.join('..','click') - if os.path.exists(os.path.join(nsclick_bake_lib_dir, lib_to_check)): - conf.msg("Checking for click location",("%s (guessed)" % nsclick_bake_build_dir)) - conf.env['WITH_NSCLICK'] = os.path.abspath(nsclick_bake_build_dir) - elif os.path.isdir(nsclick_dir): - conf.msg("Checking for click location", ("%s (guessed)" % nsclick_dir)) - conf.env['WITH_NSCLICK'] = os.path.abspath(nsclick_dir) - del nsclick_bake_build_dir - del nsclick_bake_lib_dir - del nsclick_dir - if not conf.env['WITH_NSCLICK']: - conf.msg("Checking for click location", False) - conf.report_optional_feature("nsclick", "NS-3 Click Integration", False, - "nsclick not enabled (see option --with-nsclick)") - - # Add this module to the list of modules that won't be built - # if they are enabled. - conf.env['MODULES_NOT_BUILT'].append('click') - - return - - test_code = ''' -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -int simclick_sim_send(simclick_node_t *sim,int ifid,int type, const unsigned char* data,int len,simclick_simpacketinfo *pinfo) -{ - return 0; -} - -int simclick_sim_command(simclick_node_t *sim, int cmd, ...) -{ - return 0; -} -#ifdef __cplusplus -} -#endif - -int main() -{ - return 0; -} -''' - conf.env['HAVE_DL'] = conf.check(mandatory=True, lib='dl', define_name='HAVE_DL', uselib_store='DL') - - for tmp in ['lib', 'ns']: - libdir = os.path.abspath(os.path.join(conf.env['WITH_NSCLICK'],tmp)) - if os.path.isdir(libdir): - conf.env.append_value('NS3_MODULE_PATH',libdir) - conf.env['LIBPATH_NSCLICK'] = [libdir] - - conf.env['INCLUDES_NSCLICK'] = [os.path.abspath(os.path.join(conf.env['WITH_NSCLICK'],'include'))] - conf.env['LIB_NSCLICK'] = ['nsclick'] - conf.env['DEFINES_NSCLICK'] = ['NS3_CLICK'] - conf.env['NSCLICK'] = conf.check_nonfatal(fragment=test_code, use='DL NSCLICK', - msg="Checking for library nsclick") - conf.report_optional_feature("nsclick", "NS-3 Click Integration", - conf.env['NSCLICK'], "nsclick library not found") - if not conf.env['NSCLICK']: - # Add this module to the list of modules that won't be built - # if they are enabled. - conf.env['MODULES_NOT_BUILT'].append('click') - -def build(bld): - # Don't do anything for this module if click should not be built. - if 'click' in bld.env['MODULES_NOT_BUILT']: - return - - module = bld.create_ns3_module('click', ['core', 'network', 'internet']) - module.source = [ - 'model/ipv4-click-routing.cc', - 'model/ipv4-l3-click-protocol.cc', - 'helper/click-internet-stack-helper.cc', - ] - - module_test = bld.create_ns3_module_test_library('click') - module_test.source = [ - 'test/ipv4-click-routing-test.cc', - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - module_test.source.extend([ - # 'test/click-examples-test-suite.cc', - ]) - - if bld.env['NSCLICK'] and bld.env['HAVE_DL']: - module.use.extend(['NSCLICK', 'DL']) - module_test.use.extend(['NSCLICK', 'DL']) - - headers = bld(features='ns3header') - headers.module = 'click' - headers.source = [ - 'model/ipv4-click-routing.h', - 'model/ipv4-l3-click-protocol.h', - 'helper/click-internet-stack-helper.h', - ] - - if bld.env['ENABLE_EXAMPLES']: - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/config-store/examples/wscript b/src/config-store/examples/wscript deleted file mode 100644 index 7bacf5b35..000000000 --- a/src/config-store/examples/wscript +++ /dev/null @@ -1,6 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - - obj = bld.create_ns3_program('config-store-save', ['core', 'config-store']) - obj.source = 'config-store-save.cc' diff --git a/src/config-store/wscript b/src/config-store/wscript deleted file mode 100644 index 4e3e143d3..000000000 --- a/src/config-store/wscript +++ /dev/null @@ -1,96 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -import wutils -import sys -import subprocess -from waflib import Options - -# Bug 2936 gcc version issue for GTK+ and -Wparentheses -gcc_version_gtkplus_warning_issue = (8, 0, 0) - -def options(opt): - opt.add_option('--disable-gtk', - help=('Disable GTK+ support'), - dest='disable_gtk', default=False, action="store_true") - - -def configure(conf): - if Options.options.disable_gtk: - conf.env['ENABLE_GTK'] = False - conf.report_optional_feature("GtkConfigStore", "GtkConfigStore", - conf.env['ENABLE_GTK'], - "--disable-gtk option given") - else: - have_gtk = conf.check_cfg(package='gtk+-3.0 >= 3.22', - args=['--cflags', '--libs'], uselib_store='GTK', - mandatory=False) - - conf.env['ENABLE_GTK'] = have_gtk - conf.report_optional_feature("GtkConfigStore", "GtkConfigStore", - conf.env['ENABLE_GTK'], - "library 'gtk+-3 >= 3.22' not found") - - # Bug 2936 and #340 -Wparentheses issue for gcc >= 8 - # This have to be kept until we can bump the minimum GTK version to 3.24 - if conf.env['ENABLE_GTK']: - if conf.env['CXX_NAME'] in ['gcc']: - if tuple(map(int, conf.env['CC_VERSION'])) >= gcc_version_gtkplus_warning_issue: - conf.env.append_value('CXXFLAGS', '-Wno-parentheses') - - have_libxml2 = conf.check_cfg(package='libxml-2.0 >= 2.7', - args=['--cflags', '--libs'], uselib_store='LIBXML2', - mandatory=False) - - conf.env['ENABLE_LIBXML2'] = have_libxml2 - conf.report_optional_feature("XmlIo", "XmlIo", - conf.env['ENABLE_LIBXML2'], - "library 'libxml-2.0 >= 2.7' not found") - - conf.write_config_header('ns3/config-store-config.h', top=True) - - -def build(bld): - bld.install_files('${INCLUDEDIR}/%s%s/ns3' % (wutils.APPNAME, wutils.VERSION), '../../ns3/config-store-config.h') - - module = bld.create_ns3_module('config-store', ['core', 'network']) - module.source = [ - 'model/attribute-iterator.cc', - 'model/config-store.cc', - 'model/attribute-default-iterator.cc', - 'model/file-config.cc', - 'model/raw-text-config.cc', - ] - - headers = bld(features='ns3header') - headers.module = 'config-store' - headers.source = [ - 'model/file-config.h', - 'model/config-store.h', - ] - - if bld.env['ENABLE_GTK']: - headers.source.append('model/gtk-config-store.h') - module.source.extend(['model/gtk-config-store.cc', - 'model/model-node-creator.cc', - 'model/model-typeid-creator.cc', - 'model/display-functions.cc', - ]) - module.use.append('GTK') - - if bld.env['ENABLE_LIBXML2']: - module.source.append('model/xml-config.cc') - module.use.append('LIBXML2') - # Bug 2637: use xcrun utility to find where macOS puts headers - if sys.platform == 'darwin': - find_sdk_path = '/usr/bin/xcrun --show-sdk-path'.split() - try: - p = subprocess.Popen(find_sdk_path, stdout=subprocess.PIPE) - xcrun_output = p.stdout.read().strip().decode("utf-8") - module.includes = str(xcrun_output + u'/usr/include/libxml2') - except OSError: - pass - - if bld.env['ENABLE_EXAMPLES']: - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/core/examples/hash-example.cc b/src/core/examples/hash-example.cc index 95125fdde..cfdbcb0bc 100644 --- a/src/core/examples/hash-example.cc +++ b/src/core/examples/hash-example.cc @@ -46,8 +46,6 @@ --dict=/usr/share/dict/propernames \ --dict=/usr/share/dict/connectives" -Waf: Entering directory `build' -Waf: Leaving directory `build' 'build' finished successfully (3.028s) Hasher diff --git a/src/core/examples/wscript b/src/core/examples/wscript deleted file mode 100644 index d458d8dc2..000000000 --- a/src/core/examples/wscript +++ /dev/null @@ -1,68 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - if not bld.env['ENABLE_EXAMPLES']: - return; - - obj = bld.create_ns3_program('main-callback', ['core']) - obj.source = 'main-callback.cc' - - obj = bld.create_ns3_program('sample-simulator', ['core']) - obj.source = 'sample-simulator.cc' - - bld.register_ns3_script('sample-simulator.py', ['core']) - - obj = bld.create_ns3_program('main-ptr', ['core'] ) - obj.source = 'main-ptr.cc' - - obj = bld.create_ns3_program('main-random-variable-stream', ['core', 'config-store','stats']) - obj.source = 'main-random-variable-stream.cc' - - obj = bld.create_ns3_program('sample-random-variable', - ['core']) - obj.source = 'sample-random-variable.cc' - - obj = bld.create_ns3_program('sample-random-variable-stream', - ['core']) - obj.source = 'sample-random-variable-stream.cc' - - obj = bld.create_ns3_program('command-line-example', - ['core']) - obj.source = 'command-line-example.cc' - - obj = bld.create_ns3_program('hash-example', - ['core']) - obj.source = 'hash-example.cc' - - obj = bld.create_ns3_program('sample-log-time-format', ['core']) - obj.source = 'sample-log-time-format.cc' - - obj = bld.create_ns3_program('test-string-value-formatting', ['core']) - obj.source = 'test-string-value-formatting.cc' - - obj = bld.create_ns3_program('sample-show-progress', - ['core']) - obj.source = 'sample-show-progress.cc' - - obj = bld.create_ns3_program('empirical-random-variable-example', ['core', 'flow-monitor']) - obj.source = 'empirical-random-variable-example.cc' - - obj = bld.create_ns3_program('system-path-examples', - ['core']) - obj.source = 'system-path-examples.cc' - - obj = bld.create_ns3_program('fatal-example', - ['core']) - obj.source = 'fatal-example.cc' - - if bld.env['ENABLE_BUILD_VERSION']: - obj = bld.create_ns3_program('build-version-example', - ['core']) - obj.source = 'build-version-example.cc' - - if bld.env['ENABLE_THREADING'] and bld.env["ENABLE_REAL_TIME"]: - obj = bld.create_ns3_program('main-test-sync', ['network']) - obj.source = 'main-test-sync.cc' - - obj = bld.create_ns3_program('length-example', ['core']) - obj.source = 'length-example.cc' diff --git a/src/core/model/example-as-test.h b/src/core/model/example-as-test.h index 1a01b8428..f059a5e7a 100644 --- a/src/core/model/example-as-test.h +++ b/src/core/model/example-as-test.h @@ -126,7 +126,7 @@ protected: * \par Test Addition * * To use an example program as a test you need to create a test suite - * file and add it to the appropriate list in your module wscript + * file and add it to the appropriate list in your module CMakeLists.txt * file. The "good" output reference file needs to be generated for * detecting regressions. * @@ -148,7 +148,7 @@ protected: * the same example is run twice with different arguments. * * You then need to add that newly created test suite file to the list - * of test sources in `mymodule/wscript`. Building of examples + * of test sources in `mymodule/CMakeLists.txt`. Building of examples * is an option so you need to guard the inclusion of the test suite: * * \code{.py} @@ -156,7 +156,7 @@ protected: * module.source.append('model/mymodule-examples-test-suite.cc') * \endcode * - * Since you modified a wscript file you need to reconfigure and + * Since you modified a CMakeLists.txt file you need to reconfigure and * rebuild everything. * * You just added new tests so you will need to generate the "good" diff --git a/src/core/model/int64x64.h b/src/core/model/int64x64.h index 54929fe6b..e8224cec3 100644 --- a/src/core/model/int64x64.h +++ b/src/core/model/int64x64.h @@ -24,7 +24,7 @@ // Order is important here, as it determines which implementation // will generate doxygen API docs. This order mimics the -// selection logic in wscript, so we generate docs from the +// selection logic in CMakeLists.txt, so we generate docs from the // implementation actually chosen by the configuration. #if defined (INT64X64_USE_128) && !defined (PYTHON_SCAN) #include "int64x64-128.h" diff --git a/src/core/model/test.h b/src/core/model/test.h index 69280a99e..836f7c2b3 100644 --- a/src/core/model/test.h +++ b/src/core/model/test.h @@ -1046,7 +1046,7 @@ protected: * subdirectories, then the variable NS_TEST_SOURCEDIR may not work * and the user may want to explicitly pass in a directory string. * - * Note that NS_TEST_SOURCEDIR is set in src/wscript for each module + * Note that NS_TEST_SOURCEDIR is set in src/CMakeLists.txt for each module */ void SetDataDir (std::string directory); diff --git a/src/core/wscript b/src/core/wscript deleted file mode 100644 index 4419c109a..000000000 --- a/src/core/wscript +++ /dev/null @@ -1,514 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- -import sys -import re - -from waflib import Context, Configure, Options, Utils -import wutils - -int64x64 = { - # implementation name: [define, env, highprec] - 'default': ['INT64X64_USE_128', 'INT64X64_USE_128', '128-bit integer'], - 'int128': ['INT64X64_USE_128', 'INT64X64_USE_128', '128-bit integer'], - 'cairo': ['INT64X64_USE_CAIRO', 'INT64X64_USE_CAIRO', 'cairo 128-bit integer'], - 'double': ['INT64X64_USE_DOUBLE', 'INT64X64_USE_DOUBLE', 'long double'], - } - -default_int64x64 = 'default' - -def options(opt): - assert default_int64x64 in int64x64 - opt.add_option('--int64x64', - action='store', - default=default_int64x64, - help=("Force the choice of int64x64_t implementation " - "(normally only for debugging). " - "The supported implementations use int128_t, " - "cairo_int128, or long double. " - "The int128_t implementation (the preferred option) " - "requires compiler support. " - "The cairo implementation fallback provides exactly " - "the same numerical results, but possibly at lower " - "execution speed. The long double implementation " - "may not provide the same numerical results because " - "the implementation-defined numerical precision may " - "be less than the other implementations. " - "[Allowed Values: %s]" - % ", ".join([repr(p) for p in list(int64x64.keys())])), - choices=list(int64x64.keys()), - dest='int64x64_impl') - - opt.add_option('--disable-pthread', - help=('Whether to enable the use of POSIX threads'), - action="store_true", default=False, - dest='disable_pthread') - - opt.add_option('--check-version', - help=("Print the current build version"), - action="store_true", default=False, - dest='check_version') - - opt.add_option('--enable-build-version', - help=("Check git repository for changes and update build version " - "during waf build"), - action="store_true", default=False, - dest='enable_build_version') - -def configure(conf): - - conf.load('versioning', ['waf-tools']) - - conf.require_boost_incs('core', 'ns-3 core module', required=False) - - int64x64_impl = Options.options.int64x64_impl - if int64x64_impl == 'default' or int64x64_impl == 'int128': - - code_snip_type=''' - #include - - int main(int argc, char **argv) { - (void)argc; (void)argv; - if ((uint128_t *) 0) return 0; - if (sizeof (uint128_t)) return 0; - return 1; - } - ''' - have_uint128 = conf.check_nonfatal(msg='checking for uint128_t', - define_name='HAVE_UINT128_T', - code=code_snip_type) - - code_snip_type=''' - #include - - int main(int argc, char **argv) { - (void)argc; (void)argv; - if ((__uint128_t *) 0) return 0; - if (sizeof (__uint128_t)) return 0; - return 1; - } - ''' - have__uint128 = conf.check_nonfatal(msg='checking for __uint128_t', - define_name='HAVE___UINT128_T', - code=code_snip_type) - if have_uint128 or have__uint128: - int64x64_impl = 'int128' - else: - int64x64_impl = 'cairo' - - def_flag, env_flag, highprec = int64x64[int64x64_impl] - # Add a tag confirming default choice - if Options.options.int64x64_impl == 'default': - highprec += ' (default)' - conf.define(def_flag, 1) - conf.env[env_flag] = 1 - conf.msg('Checking high precision implementation', highprec) - - conf.check_nonfatal(header_name='stdint.h', define_name='HAVE_STDINT_H') - conf.check_nonfatal(header_name='inttypes.h', define_name='HAVE_INTTYPES_H') - conf.check_nonfatal(header_name='sys/inttypes.h', define_name='HAVE_SYS_INT_TYPES_H') - conf.check_nonfatal(header_name='sys/types.h', define_name='HAVE_SYS_TYPES_H') - conf.check_nonfatal(header_name='sys/stat.h', define_name='HAVE_SYS_STAT_H') - conf.check_nonfatal(header_name='dirent.h', define_name='HAVE_DIRENT_H') - - conf.check_nonfatal(header_name='signal.h', define_name='HAVE_SIGNAL_H') - - # Check for POSIX threads - test_env = conf.env.derive() - if Utils.unversioned_sys_platform() != 'darwin' and Utils.unversioned_sys_platform() != 'cygwin': - test_env.append_value('LINKFLAGS', '-pthread') - test_env.append_value('CXXFLAGS', '-pthread') - test_env.append_value('CCFLAGS', '-pthread') - fragment = r""" -#include -int main () -{ - pthread_mutex_t m; - pthread_mutex_init (&m, NULL); - return 0; -} -""" - if Options.options.disable_pthread: - conf.report_optional_feature("Threading", "Threading Primitives", - False, - "Disabled by user request (--disable-pthread)") - have_pthread = False - else: - have_pthread = conf.check_nonfatal(header_name='pthread.h', define_name='HAVE_PTHREAD_H', - env=test_env, fragment=fragment, - errmsg='Could not find pthread support (build/config.log for details)') - if have_pthread: - # darwin accepts -pthread but prints a warning saying it is ignored - if Utils.unversioned_sys_platform() != 'darwin' and Utils.unversioned_sys_platform() != 'cygwin': - conf.env['CXXFLAGS_PTHREAD'] = '-pthread' - conf.env['CCFLAGS_PTHREAD'] = '-pthread' - conf.env['LINKFLAGS_PTHREAD'] = '-pthread' - - conf.env['ENABLE_THREADING'] = have_pthread - - conf.report_optional_feature("Threading", "Threading Primitives", - conf.env['ENABLE_THREADING'], - " include not detected") - - if not conf.check_nonfatal(lib='rt', uselib='RT, PTHREAD', define_name='HAVE_RT'): - conf.report_optional_feature("RealTime", "Real Time Simulator", - False, "librt is not available") - else: - conf.report_optional_feature("RealTime", "Real Time Simulator", - conf.env['ENABLE_THREADING'], - "threading not enabled") - conf.env["ENABLE_REAL_TIME"] = conf.env['ENABLE_THREADING'] - - if Options.options.enable_build_version: - conf.env['ENABLE_BUILD_VERSION'] = True - conf.env.append_value('DEFINES', 'ENABLE_BUILD_VERSION=1') - else: - conf.env['ENABLE_BUILD_VERSION'] = False - - conf.write_config_header('ns3/core-config.h', top=True) - -def build(bld): - - - bld.install_files('${INCLUDEDIR}/%s%s/ns3' % (wutils.APPNAME, wutils.VERSION), '../../ns3/core-config.h') - - core = bld.create_ns3_module('core') - core.source = [ - 'model/time.cc', - 'model/event-id.cc', - 'model/scheduler.cc', - 'model/list-scheduler.cc', - 'model/map-scheduler.cc', - 'model/heap-scheduler.cc', - 'model/calendar-scheduler.cc', - 'model/priority-queue-scheduler.cc', - 'model/event-impl.cc', - 'model/simulator.cc', - 'model/simulator-impl.cc', - 'model/default-simulator-impl.cc', - 'model/timer.cc', - 'model/watchdog.cc', - 'model/synchronizer.cc', - 'model/make-event.cc', - 'model/log.cc', - 'model/breakpoint.cc', - 'model/type-id.cc', - 'model/attribute-construction-list.cc', - 'model/object-base.cc', - 'model/ref-count-base.cc', - 'model/object.cc', - 'model/test.cc', - 'model/random-variable-stream.cc', - 'model/rng-seed-manager.cc', - 'model/rng-stream.cc', - 'model/command-line.cc', - 'model/attribute.cc', - 'model/boolean.cc', - 'model/integer.cc', - 'model/uinteger.cc', - 'model/enum.cc', - 'model/double.cc', - 'model/int64x64.cc', - 'model/string.cc', - 'model/pointer.cc', - 'model/object-ptr-container.cc', - 'model/object-factory.cc', - 'model/global-value.cc', - 'model/trace-source-accessor.cc', - 'model/config.cc', - 'model/callback.cc', - 'model/names.cc', - 'model/vector.cc', - 'model/fatal-impl.cc', - 'model/system-path.cc', - 'helper/random-variable-stream-helper.cc', - 'helper/event-garbage-collector.cc', - 'model/hash-function.cc', - 'model/hash-murmur3.cc', - 'model/hash-fnv.cc', - 'model/hash.cc', - 'model/des-metrics.cc', - 'model/ascii-file.cc', - 'model/node-printer.cc', - 'model/time-printer.cc', - 'model/show-progress.cc', - 'model/system-wall-clock-timestamp.cc', - 'helper/csv-reader.cc', - 'model/length.cc', - 'model/trickle-timer.cc', - ] - - if (bld.env['ENABLE_EXAMPLES']): - core.source.append('model/example-as-test.cc') - - core_test = bld.create_ns3_module_test_library('core') - core_test.source = [ - 'test/attribute-test-suite.cc', - 'test/attribute-container-test-suite.cc', - 'test/build-profile-test-suite.cc', - 'test/callback-test-suite.cc', - 'test/command-line-test-suite.cc', - 'test/config-test-suite.cc', - 'test/global-value-test-suite.cc', - 'test/int64x64-test-suite.cc', - 'test/names-test-suite.cc', - 'test/object-test-suite.cc', - 'test/ptr-test-suite.cc', - 'test/event-garbage-collector-test-suite.cc', - 'test/many-uniform-random-variables-one-get-value-call-test-suite.cc', - 'test/one-uniform-random-variable-many-get-value-calls-test-suite.cc', - 'test/pair-value-test-suite.cc', - 'test/tuple-value-test-suite.cc', - 'test/sample-test-suite.cc', - 'test/simulator-test-suite.cc', - 'test/time-test-suite.cc', - 'test/timer-test-suite.cc', - 'test/traced-callback-test-suite.cc', - 'test/type-traits-test-suite.cc', - 'test/watchdog-test-suite.cc', - 'test/hash-test-suite.cc', - 'test/type-id-test-suite.cc', - 'test/length-test-suite.cc', - 'test/trickle-timer-test-suite.cc', - ] - - if (bld.env['ENABLE_EXAMPLES']): - core_test.source.extend([ - 'test/examples-as-tests-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'core' - headers.source = [ - 'model/nstime.h', - 'model/event-id.h', - 'model/event-impl.h', - 'model/simulator.h', - 'model/simulator-impl.h', - 'model/default-simulator-impl.h', - 'model/scheduler.h', - 'model/list-scheduler.h', - 'model/map-scheduler.h', - 'model/heap-scheduler.h', - 'model/calendar-scheduler.h', - 'model/priority-queue-scheduler.h', - 'model/simulation-singleton.h', - 'model/singleton.h', - 'model/timer.h', - 'model/timer-impl.h', - 'model/watchdog.h', - 'model/synchronizer.h', - 'model/make-event.h', - 'model/system-wall-clock-ms.h', - 'model/system-wall-clock-timestamp.h', - 'model/empty.h', - 'model/callback.h', - 'model/object-base.h', - 'model/ref-count-base.h', - 'model/simple-ref-count.h', - 'model/type-id.h', - 'model/attribute-construction-list.h', - 'model/ptr.h', - 'model/object.h', - 'model/log.h', - 'model/log-macros-enabled.h', - 'model/log-macros-disabled.h', - 'model/assert.h', - 'model/breakpoint.h', - 'model/fatal-error.h', - 'model/test.h', - 'model/random-variable-stream.h', - 'model/rng-seed-manager.h', - 'model/rng-stream.h', - 'model/command-line.h', - 'model/type-name.h', - 'model/type-traits.h', - 'model/int-to-type.h', - 'model/attribute.h', - 'model/attribute-accessor-helper.h', - 'model/boolean.h', - 'model/int64x64.h', - 'model/int64x64-double.h', - 'model/integer.h', - 'model/uinteger.h', - 'model/double.h', - 'model/enum.h', - 'model/string.h', - 'model/pointer.h', - 'model/object-factory.h', - 'model/attribute-helper.h', - 'model/attribute-container.h', - 'model/attribute-container-accessor-helper.h', - 'model/global-value.h', - 'model/traced-callback.h', - 'model/traced-value.h', - 'model/trace-source-accessor.h', - 'model/config.h', - 'model/object-ptr-container.h', - 'model/object-vector.h', - 'model/object-map.h', - 'model/pair.h', - 'model/tuple.h', - 'model/deprecated.h', - 'model/abort.h', - 'model/names.h', - 'model/vector.h', - 'model/default-deleter.h', - 'model/fatal-impl.h', - 'model/system-path.h', - 'model/unused.h', - 'model/math.h', - 'helper/event-garbage-collector.h', - 'helper/random-variable-stream-helper.h', - 'model/hash-function.h', - 'model/hash-murmur3.h', - 'model/hash-fnv.h', - 'model/hash.h', - 'model/valgrind.h', - 'model/build-profile.h', - 'model/des-metrics.h', - 'model/ascii-file.h', - 'model/ascii-test.h', - 'model/node-printer.h', - 'model/time-printer.h', - 'model/show-progress.h', - 'helper/csv-reader.h', - 'model/length.h', - 'model/trickle-timer.h', - ] - - if (bld.env['ENABLE_EXAMPLES']): - headers.source.append('model/example-as-test.h') - - if sys.platform == 'win32': - core.source.extend([ - 'model/win32-system-wall-clock-ms.cc', - ]) - else: - core.source.extend([ - 'model/unix-system-wall-clock-ms.cc', - ]) - - - env = bld.env - if env['INT64X64_USE_DOUBLE']: - headers.source.extend(['model/int64x64-double.h']) - elif env['INT64X64_USE_128']: - headers.source.extend(['model/int64x64-128.h']) - core.source.extend(['model/int64x64-128.cc']) - elif env['INT64X64_USE_CAIRO']: - core.source.extend([ - 'model/int64x64-cairo.cc', - ]) - headers.source.extend([ - 'model/int64x64-cairo.h', - 'model/cairo-wideint-private.h', - ]) - - if env['ENABLE_REAL_TIME']: - headers.source.extend([ - 'model/realtime-simulator-impl.h', - 'model/wall-clock-synchronizer.h', - ]) - core.source.extend([ - 'model/realtime-simulator-impl.cc', - 'model/wall-clock-synchronizer.cc', - ]) - core.use.append('RT') - core_test.use.append('RT') - - if env['ENABLE_THREADING']: - core.source.extend([ - 'model/system-thread.cc', - 'model/unix-fd-reader.cc', - 'model/unix-system-mutex.cc', - 'model/unix-system-condition.cc', - ]) - core.use.append('PTHREAD') - core_test.use.append('PTHREAD') - core_test.source.extend(['test/threaded-test-suite.cc']) - headers.source.extend([ - 'model/unix-fd-reader.h', - 'model/system-mutex.h', - 'model/system-thread.h', - 'model/system-condition.h', - ]) - - if env['ENABLE_GSL']: - core.use.extend(['GSL', 'GSLCBLAS', 'M']) - core_test.use.extend(['GSL', 'GSLCBLAS', 'M']) - core_test.source.extend([ - 'test/rng-test-suite.cc', - 'test/random-variable-stream-test-suite.cc' - ]) - - vers_tg = None - if env['ENABLE_BUILD_VERSION']: - version_template = bld.path.find_node('model/version-defines.h.in') - version_header = bld.bldnode.make_node('ns3/version-defines.h') - - vers_tg = bld(features='version-defines', - source=version_template, - target=version_header) - - #silence errors about no mapping for version-defines.h.in - vers_tg.mappings['.h'] = lambda *a, **k: None - vers_tg.mappings['.h.in'] = lambda *a, **k: None - - core.source.append('model/version.cc') - - headers.source.append('model/version.h') - - if bld.env['INCLUDES_BOOST']: - core.use.append('BOOST') - - if Options.options.check_version: - print_version(bld, vers_tg) - raise SystemExit(0) - return - - if (bld.env['ENABLE_EXAMPLES']): - bld.recurse('examples') - - pymod = bld.ns3_python_bindings() - if pymod is not None: - pymod.source += ['bindings/module_helpers.cc'] - -def print_version(bld, tg): - - if tg is None: - print ('Build version support is not enabled, reconfigure with --enable-build-version flag') - return - - tg.post() - - for task in tg.tasks: - if task.__class__.__name__ == 'git_ns3_version_info': - #manually run task - task.run() - break - - handlers = { - 'VERSION_TAG': lambda s: s.strip('"'), - 'CLOSEST_TAG': lambda s: s.strip('"'), - 'VERSION_TAG_DISTANCE': lambda s: '' if s == '0' else "+" + s, - 'VERSION_COMMIT_HASH': lambda s: "@" + s.strip('"'), - 'VERSION_DIRTY_FLAG': lambda s: '' if s == '0' else '-dirty', - 'BUILD_PROFILE': lambda s: "-" + s - } - - fields=('VERSION_TAG', 'CLOSEST_TAG', 'VERSION_TAG_DISTANCE', - 'VERSION_COMMIT_HASH', 'VERSION_DIRTY_FLAG', 'BUILD_PROFILE') - - parts = dict() - - for field in fields: - if field in bld.env: - parts[field] = handlers[field](bld.env[field]) - else: - parts[field] = '' - - if parts['CLOSEST_TAG'] != parts['VERSION_TAG']: - parts['CLOSEST_TAG'] = "+" + parts['CLOSEST_TAG'] - else: - parts['CLOSEST_TAG'] = "" - - print(''.join([parts[f] for f in fields])) diff --git a/src/csma-layout/examples/wscript b/src/csma-layout/examples/wscript deleted file mode 100644 index 85810e86c..000000000 --- a/src/csma-layout/examples/wscript +++ /dev/null @@ -1,5 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('csma-star', ['csma', 'csma-layout', 'internet', 'applications']) - obj.source = 'csma-star.cc' diff --git a/src/csma-layout/wscript b/src/csma-layout/wscript deleted file mode 100644 index a90dd318d..000000000 --- a/src/csma-layout/wscript +++ /dev/null @@ -1,18 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_module('csma-layout', ['csma', 'network', 'internet']) - obj.source = [ - 'model/csma-star-helper.cc', - ] - headers = bld(features='ns3header') - headers.module = 'csma-layout' - headers.source = [ - 'model/csma-star-helper.h', - ] - - if bld.env['ENABLE_EXAMPLES']: - bld.recurse('examples') - - bld.ns3_python_bindings() - diff --git a/src/csma/examples/wscript b/src/csma/examples/wscript deleted file mode 100644 index e1029c176..000000000 --- a/src/csma/examples/wscript +++ /dev/null @@ -1,20 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('csma-one-subnet', ['csma', 'internet', 'applications']) - obj.source = 'csma-one-subnet.cc' - - obj = bld.create_ns3_program('csma-broadcast', ['csma', 'internet', 'applications']) - obj.source = 'csma-broadcast.cc' - - obj = bld.create_ns3_program('csma-packet-socket', ['csma', 'internet', 'applications']) - obj.source = 'csma-packet-socket.cc' - - obj = bld.create_ns3_program('csma-multicast', ['csma', 'internet', 'applications']) - obj.source = 'csma-multicast.cc' - - obj = bld.create_ns3_program('csma-raw-ip-socket', ['csma', 'internet', 'applications', 'internet-apps']) - obj.source = 'csma-raw-ip-socket.cc' - - obj = bld.create_ns3_program('csma-ping', ['csma', 'internet', 'applications', 'internet-apps']) - obj.source = 'csma-ping.cc' diff --git a/src/csma/wscript b/src/csma/wscript deleted file mode 100644 index 3a66126bd..000000000 --- a/src/csma/wscript +++ /dev/null @@ -1,23 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_module('csma', ['network']) - obj.source = [ - 'model/backoff.cc', - 'model/csma-net-device.cc', - 'model/csma-channel.cc', - 'helper/csma-helper.cc', - ] - headers = bld(features='ns3header') - headers.module = 'csma' - headers.source = [ - 'model/backoff.h', - 'model/csma-net-device.h', - 'model/csma-channel.h', - 'helper/csma-helper.h', - ] - - if bld.env['ENABLE_EXAMPLES']: - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/dsdv/examples/wscript b/src/dsdv/examples/wscript deleted file mode 100644 index 810ad65d9..000000000 --- a/src/dsdv/examples/wscript +++ /dev/null @@ -1,6 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('dsdv-manet', ['wifi', 'internet', 'dsdv', 'applications']) - obj.source = 'dsdv-manet.cc' - diff --git a/src/dsdv/wscript b/src/dsdv/wscript deleted file mode 100644 index 3279875eb..000000000 --- a/src/dsdv/wscript +++ /dev/null @@ -1,37 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - module = bld.create_ns3_module('dsdv', ['internet']) - module.includes = '.' - module.source = [ - 'model/dsdv-rtable.cc', - 'model/dsdv-packet-queue.cc', - 'model/dsdv-packet.cc', - 'model/dsdv-routing-protocol.cc', - 'helper/dsdv-helper.cc', - ] - - module_test = bld.create_ns3_module_test_library('dsdv') - module_test.source = [ - 'test/dsdv-testcase.cc', - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - module_test.source.extend([ - # 'test/dsdv-examples-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'dsdv' - headers.source = [ - 'model/dsdv-rtable.h', - 'model/dsdv-packet-queue.h', - 'model/dsdv-packet.h', - 'model/dsdv-routing-protocol.h', - 'helper/dsdv-helper.h', - ] - if (bld.env['ENABLE_EXAMPLES']): - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/dsr/examples/wscript b/src/dsr/examples/wscript deleted file mode 100644 index 57333549c..000000000 --- a/src/dsr/examples/wscript +++ /dev/null @@ -1,6 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('dsr', ['core', 'network', 'internet', 'applications', 'mobility', 'config-store', 'wifi', 'dsr']) - obj.source = 'dsr.cc' - diff --git a/src/dsr/wscript b/src/dsr/wscript deleted file mode 100644 index 00ce617e4..000000000 --- a/src/dsr/wscript +++ /dev/null @@ -1,56 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - module = bld.create_ns3_module('dsr', ['internet', 'wifi']) - module.includes = '.' - module.source = [ - 'model/dsr-routing.cc', - 'model/dsr-options.cc', - 'model/dsr-fs-header.cc', - 'model/dsr-option-header.cc', - 'model/dsr-maintain-buff.cc', - 'model/dsr-passive-buff.cc', - 'model/dsr-rsendbuff.cc', - 'model/dsr-rcache.cc', - 'model/dsr-rreq-table.cc', - 'model/dsr-gratuitous-reply-table.cc', - 'model/dsr-errorbuff.cc', - 'model/dsr-network-queue.cc', - 'helper/dsr-helper.cc', - 'helper/dsr-main-helper.cc', - ] - - module_test = bld.create_ns3_module_test_library('dsr') - module_test.source = [ - 'test/dsr-test-suite.cc', - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - module_test.source.extend([ - # 'test/dsr-examples-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'dsr' - headers.source = [ - 'model/dsr-routing.h', - 'model/dsr-options.h', - 'model/dsr-fs-header.h', - 'model/dsr-option-header.h', - 'model/dsr-maintain-buff.h', - 'model/dsr-passive-buff.h', - 'model/dsr-rsendbuff.h', - 'model/dsr-rcache.h', - 'model/dsr-rreq-table.h', - 'model/dsr-gratuitous-reply-table.h', - 'model/dsr-errorbuff.h', - 'model/dsr-network-queue.h', - 'helper/dsr-helper.h', - 'helper/dsr-main-helper.h', - ] - - if (bld.env['ENABLE_EXAMPLES']): - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/energy/examples/wscript b/src/energy/examples/wscript deleted file mode 100644 index 04e529605..000000000 --- a/src/energy/examples/wscript +++ /dev/null @@ -1,14 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - if not bld.env['ENABLE_EXAMPLES']: - return; - - obj = bld.create_ns3_program('li-ion-energy-source', ['core', 'energy']) - obj.source = 'li-ion-energy-source.cc' - - obj = bld.create_ns3_program('rv-battery-model-test', ['core', 'energy', 'wifi']) - obj.source = 'rv-battery-model-test.cc' - - obj = bld.create_ns3_program('basic-energy-model-test', ['core', 'energy', 'wifi']) - obj.source = 'basic-energy-model-test.cc' diff --git a/src/energy/wscript b/src/energy/wscript deleted file mode 100644 index a77079556..000000000 --- a/src/energy/wscript +++ /dev/null @@ -1,62 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_module('energy', ['network']) - obj.source = [ - 'model/energy-source.cc', - 'model/basic-energy-source.cc', - 'model/li-ion-energy-source.cc', - 'model/rv-battery-model.cc', - 'model/device-energy-model.cc', - 'model/device-energy-model-container.cc', - 'model/simple-device-energy-model.cc', - 'model/energy-harvester.cc', - 'model/basic-energy-harvester.cc', - 'helper/energy-source-container.cc', - 'helper/energy-model-helper.cc', - 'helper/basic-energy-source-helper.cc', - 'helper/li-ion-energy-source-helper.cc', - 'helper/rv-battery-model-helper.cc', - 'helper/energy-harvester-container.cc', - 'helper/energy-harvester-helper.cc', - 'helper/basic-energy-harvester-helper.cc', - ] - - obj_test = bld.create_ns3_module_test_library('energy') - obj_test.source = [ - 'test/li-ion-energy-source-test.cc', - 'test/basic-energy-harvester-test.cc', - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - obj_test.source.extend([ - # 'test/energy-examples-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'energy' - headers.source = [ - 'model/energy-source.h', - 'model/basic-energy-source.h', - 'model/li-ion-energy-source.h', - 'model/rv-battery-model.h', - 'model/device-energy-model.h', - 'model/device-energy-model-container.h', - 'model/simple-device-energy-model.h', - 'model/energy-harvester.h', - 'model/basic-energy-harvester.h', - 'helper/energy-source-container.h', - 'helper/energy-model-helper.h', - 'helper/basic-energy-source-helper.h', - 'helper/li-ion-energy-source-helper.h', - 'helper/rv-battery-model-helper.h', - 'helper/energy-harvester-container.h', - 'helper/energy-harvester-helper.h', - 'helper/basic-energy-harvester-helper.h', - ] - - if (bld.env['ENABLE_EXAMPLES']): - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/fd-net-device/examples/wscript b/src/fd-net-device/examples/wscript deleted file mode 100644 index 50253515b..000000000 --- a/src/fd-net-device/examples/wscript +++ /dev/null @@ -1,37 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - env = bld.env - if not env['ENABLE_FDNETDEV']: - return - - obj = bld.create_ns3_program('dummy-network', ['fd-net-device', 'internet', 'internet-apps']) - obj.source = 'dummy-network.cc' - obj = bld.create_ns3_program('fd2fd-onoff', ['fd-net-device', 'internet', 'applications']) - obj.source = 'fd2fd-onoff.cc' - - if bld.env["ENABLE_REAL_TIME"]: - obj = bld.create_ns3_program('realtime-dummy-network', ['fd-net-device', 'internet', 'internet-apps']) - obj.source = 'realtime-dummy-network.cc' - obj = bld.create_ns3_program('realtime-fd2fd-onoff', ['fd-net-device', 'internet', 'applications']) - obj.source = 'realtime-fd2fd-onoff.cc' - - if bld.env['ENABLE_EMU' or 'ENABLE_NETMAP_EMU' or 'ENABLE_DPDKNETDEV']: - obj = bld.create_ns3_program('fd-emu-ping', ['fd-net-device', 'internet', 'internet-apps']) - obj.source = 'fd-emu-ping.cc' - obj = bld.create_ns3_program('fd-emu-onoff', ['fd-net-device', 'internet', 'applications']) - obj.source = 'fd-emu-onoff.cc' - obj = bld.create_ns3_program('fd-emu-tc', ['fd-net-device', 'internet', 'internet-apps', 'applications', 'traffic-control']) - obj.source = 'fd-emu-tc.cc' - obj = bld.create_ns3_program('fd-emu-send', ['fd-net-device', 'internet', 'internet-apps', 'applications', 'traffic-control']) - obj.source = 'fd-emu-send.cc' - - if bld.env['ENABLE_EMU']: - obj = bld.create_ns3_program('fd-emu-udp-echo', ['fd-net-device', 'internet', 'applications']) - obj.source = 'fd-emu-udp-echo.cc' - - if bld.env['ENABLE_TAP']: - obj = bld.create_ns3_program('fd-tap-ping', ['fd-net-device', 'internet', 'internet-apps']) - obj.source = 'fd-tap-ping.cc' - obj = bld.create_ns3_program('fd-tap-ping6', ['fd-net-device', 'internet', 'internet-apps', 'csma']) - obj.source = 'fd-tap-ping6.cc' diff --git a/src/fd-net-device/wscript b/src/fd-net-device/wscript deleted file mode 100644 index 8f6afc9c1..000000000 --- a/src/fd-net-device/wscript +++ /dev/null @@ -1,254 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -import os.path - -from waflib import Options - -def configure(conf): - conf.env['ENABLE_FDNETDEV'] = False - - if conf.env['ENABLE_THREADING']: - # Check for system dependencies - have_sysioctl = conf.check_nonfatal(header_name='sys/ioctl.h', - define_name = 'HAVE_SYS_IOCTL_H') - have_netif = conf.check_nonfatal(header_name='net/if.h', - define_name = 'HAVE_IF_NETS_H') - - # Enable the FdNetDevice module. - # Besides threading support, we also require ethernet.h - conf.env['ENABLE_FDNETDEV'] = conf.check_nonfatal(header_name='net/ethernet.h', - define_name='HAVE_NET_ETHERNET_H') - if conf.env['ENABLE_FDNETDEV']: - conf.report_optional_feature("FdNetDevice", - "File descriptor NetDevice", - True, - "FdNetDevice module enabled") - - # Check if dpdk environment variables are set. Also check if we have correct paths set. - env_rte_sdk = os.environ.get('RTE_SDK', '') - env_rte_target = os.environ.get('RTE_TARGET', '') - have_dpdk_src = env_rte_sdk != '' and env_rte_target != '' and \ - os.path.exists(os.path.join(env_rte_sdk, env_rte_target, 'include/rte_eal.h')) and \ - os.path.exists(os.path.join(env_rte_sdk, env_rte_target, 'lib/librte_eal.so')) - - have_dpdk_pkg = False - if not have_dpdk_src: - # Check if libdpdk is installed as package - have_dpdk_pkg = conf.check_cfg(package='libdpdk', uselib_store='DPDK', - args=['--cflags', '--libs'], mandatory=False) - - conf.env['ENABLE_DPDKNETDEV'] = have_dpdk_pkg or have_dpdk_src - - if conf.env['ENABLE_DPDKNETDEV']: - # Set DPDK Lib Mode. pkg if the package if installed or src if built from source. - dpdk_lib_mode = 'pkg' if have_dpdk_pkg else 'src' - conf.env.append_value('DPDK_LIB_MODE', [dpdk_lib_mode]) - conf.env.append_value('DEFINES', ['HAVE_DPDK_USER_H']) - if have_dpdk_pkg: - conf.report_optional_feature("DpdkNetDevice", - "DPDK NetDevice", - True, - "DPDKNetDevice module enabled (from libdpdk)") - else: - conf.report_optional_feature("DpdkNetDevice", - "DPDK NetDevice", - True, - "DPDKNetDevice module enabled (from source)") - else: - conf.report_optional_feature("DpdkNetDevice", - "DPDK NetDevice", - False, - "libdpdk not found, $RTE_SDK and/or $RTE_TARGET environment variable not set or incorrect") - else: - conf.report_optional_feature("FdNetDevice", - "File descriptor NetDevice", - False, - " include not detected") - - else: - conf.report_optional_feature("FdNetDevice", - "File descriptor NetDevice", - False, - "needs threading support which is not available") - - if conf.env['ENABLE_FDNETDEV']: - blddir = os.path.abspath(os.path.join(conf.bldnode.abspath(), conf.variant)) - dir = os.path.abspath(os.path.join(blddir, "src/fd-net-device")) - conf.env.append_value('NS3_EXECUTABLE_PATH', dir) - - if conf.env['ENABLE_DPDKNETDEV']: - if 'src' in conf.env['DPDK_LIB_MODE']: - dpdk_build = os.path.join(os.environ['RTE_SDK'], os.environ['RTE_TARGET']) - conf.env.append_value('CXXFLAGS', ['-I' + os.path.join(dpdk_build, 'include'), '-mssse3']) - conf.env.append_value('LINKFLAGS', ['-I' + os.path.join(dpdk_build, 'include')]) - conf.env.append_value('LINKFLAGS', ['-L' + os.path.join(dpdk_build, 'lib')]) - conf.env.SHLIB_MARKER += ',-lrte_eal,-lrte_ethdev,-lrte_pmd_virtio,-lrte_pmd_e1000,-lrte_pmd_ixgbe,-lrte_pmd_i40e,-lnuma,-ldl,-lrte_mempool,-lrte_mbuf,-lrte_ring,-lrte_kvargs,-lrte_net' - else: - # Add this module to the list of modules that won't be built - # if they are enabled. - conf.env['MODULES_NOT_BUILT'].append('dpdk-net-device') - - else: - # Add this module to the list of modules that won't be built - # if they are enabled. - conf.env['MODULES_NOT_BUILT'].append('fd-net-device') - - # Next, check for whether specialized FdNetDevice features are enabled - # such as tap device support, raw socket support, and netmap support - - if conf.env['ENABLE_FDNETDEV']: - conf.env['ENABLE_TAP'] = conf.check_nonfatal( - header_name='linux/if_tun.h', - define_name='HAVE_IF_TUN_H') and have_sysioctl and have_netif - - if conf.env['ENABLE_TAP']: - conf.report_optional_feature("TapFdNetDevice", - "Tap FdNetDevice", - True, - "Tap support enabled") - else: - conf.report_optional_feature("TapFdNetDevice", - "Tap FdNetDevice", - False, - "needs linux/if_tun.h") - - # Enable use of raw socket (EMU) helper. - conf.env['ENABLE_EMU'] = conf.check_nonfatal( - header_name='netpacket/packet.h', - define_name='HAVE_PACKET_H') and have_sysioctl and have_netif - - if conf.env['ENABLE_EMU']: - conf.report_optional_feature("EmuFdNetDevice", - "Emulation FdNetDevice", - True, - "Emulation support enabled") - else: - conf.report_optional_feature("EmuFdNetDevice", - "Emulation FdNetDevice", - False, - "needs netpacket/packet.h") - - # Enable use of netmap EMU support - conf.env['ENABLE_NETMAP_EMU'] = conf.check_nonfatal( - header_name='net/netmap_user.h', - define_name='HAVE_NETMAP_USER_H') and have_sysioctl and have_netif - - if conf.env['ENABLE_NETMAP_EMU']: - conf.report_optional_feature("NetmapFdNetDevice", - "Netmap emulation FdNetDevice", - True, - "Netmap emulation support enabled") - else: - conf.report_optional_feature("NetmapFdNetDevice", - "Netmap emulation FdNetDevice", - False, - "needs net/netmap_user.h") - -def build(bld): - # Don't do anything for this module if emu's not enabled. - if not bld.env['ENABLE_FDNETDEV']: - return - - module = bld.create_ns3_module('fd-net-device', ['network']) - module.source = [ - 'model/fd-net-device.cc', - 'helper/fd-net-device-helper.cc', - 'helper/encode-decode.cc', - 'helper/creator-utils.cc', - ] - - headers = bld(features='ns3header') - headers.module = 'fd-net-device' - headers.source = [ - 'model/fd-net-device.h', - 'helper/fd-net-device-helper.h', - ] - - if bld.env['ENABLE_TAP']: - if not bld.env['PLATFORM'].startswith('freebsd'): - module.source.extend([ - 'helper/tap-fd-net-device-helper.cc', - ]) - - headers.source.extend([ - 'helper/tap-fd-net-device-helper.h', - ]) - - creator = bld.create_suid_program('tap-device-creator') - creator.source = [ - 'helper/tap-device-creator.cc', - 'helper/encode-decode.cc', - 'helper/creator-utils.cc', - ] - - module.env.append_value("DEFINES", - "TAP_DEV_CREATOR=\"%s\"" % (creator.target,)) - - if bld.env['ENABLE_DPDKNETDEV']: - module.use.append('DPDK') - module.source.extend([ - 'helper/dpdk-net-device-helper.cc', - 'model/dpdk-net-device.cc' - ]) - headers.source.extend([ - 'helper/dpdk-net-device-helper.h', - 'model/dpdk-net-device.h' - ]) - if 'src' in bld.env['DPDK_LIB_MODE']: - # Add DPDK libraries to library path - dpdk_build = os.path.join(os.environ['RTE_SDK'], os.environ['RTE_TARGET']) - if os.environ.get('LD_LIBRARY_PATH', '') == '': - os.environ['LD_LIBRARY_PATH'] = os.path.join(dpdk_build, 'lib') - else: - os.environ['LD_LIBRARY_PATH'] += ':' + os.path.join(dpdk_build, 'lib') - # Add $RTE_SDK/usertools to PATH env - if os.environ.get('PATH', '') == '': - os.environ['PATH'] = os.path.join(os.environ['RTE_SDK'], 'usertools') - else: - os.environ['PATH'] += ':' + os.path.join(os.environ['RTE_SDK'], 'usertools') - - if bld.env['ENABLE_EMU']: - module.source.extend([ - 'helper/emu-fd-net-device-helper.cc', - ]) - - headers.source.extend([ - 'helper/emu-fd-net-device-helper.h', - ]) - - creator = bld.create_suid_program('raw-sock-creator') - creator.source = [ - 'helper/raw-sock-creator.cc', - 'helper/encode-decode.cc', - 'helper/creator-utils.cc', - ] - - module.env.append_value("DEFINES", - "RAW_SOCK_CREATOR=\"%s\"" % (creator.target,)) - - if bld.env['ENABLE_NETMAP_EMU']: - module.source.extend([ - 'model/netmap-net-device.cc', - 'helper/netmap-net-device-helper.cc', - ]) - - headers.source.extend([ - 'model/netmap-net-device.h', - 'helper/netmap-net-device-helper.h', - ]) - - creator = bld.create_suid_program('netmap-device-creator') - creator.source = [ - 'helper/netmap-device-creator.cc', - 'helper/encode-decode.cc', - 'helper/creator-utils.cc', - ] - - module.env.append_value("DEFINES", - "NETMAP_DEV_CREATOR=\"%s\"" % (creator.target,)) - - if bld.env['ENABLE_EXAMPLES']: - bld.recurse('examples') - - bld.ns3_python_bindings() - diff --git a/src/flow-monitor/examples/wscript b/src/flow-monitor/examples/wscript deleted file mode 100644 index 19d41b7e7..000000000 --- a/src/flow-monitor/examples/wscript +++ /dev/null @@ -1,4 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - bld.register_ns3_script('wifi-olsr-flowmon.py', ['flow-monitor', 'internet', 'wifi', 'olsr', 'applications', 'mobility']) diff --git a/src/flow-monitor/wscript b/src/flow-monitor/wscript deleted file mode 100644 index 66060421c..000000000 --- a/src/flow-monitor/wscript +++ /dev/null @@ -1,41 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_module('flow-monitor', ['internet', 'config-store', 'stats']) - obj.source = ["model/%s" % s for s in [ - 'flow-monitor.cc', - 'flow-classifier.cc', - 'flow-probe.cc', - 'ipv4-flow-classifier.cc', - 'ipv4-flow-probe.cc', - 'ipv6-flow-classifier.cc', - 'ipv6-flow-probe.cc', - ]] - obj.source.append("helper/flow-monitor-helper.cc") - - module_test = bld.create_ns3_module_test_library('flow-monitor') - module_test.source = [ ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - module_test.source.extend([ - # 'test/flow-monitor-examples-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'flow-monitor' - headers.source = ["model/%s" % s for s in [ - 'flow-monitor.h', - 'flow-probe.h', - 'flow-classifier.h', - 'ipv4-flow-classifier.h', - 'ipv4-flow-probe.h', - 'ipv6-flow-classifier.h', - 'ipv6-flow-probe.h', - ]] - headers.source.append("helper/flow-monitor-helper.h") - - if bld.env['ENABLE_EXAMPLES']: - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/internet-apps/examples/wscript b/src/internet-apps/examples/wscript deleted file mode 100644 index b16e65db8..000000000 --- a/src/internet-apps/examples/wscript +++ /dev/null @@ -1,11 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - if not bld.env['ENABLE_EXAMPLES']: - return; - - obj = bld.create_ns3_program('dhcp-example', ['internet', 'internet-apps', 'csma', 'point-to-point', 'applications']) - obj.source = 'dhcp-example.cc' - - obj = bld.create_ns3_program('traceroute-example', ['aodv', 'core', 'network', 'internet', 'point-to-point', 'wifi','internet-apps']) - obj.source = 'traceroute-example.cc' \ No newline at end of file diff --git a/src/internet-apps/wscript b/src/internet-apps/wscript deleted file mode 100644 index edd26f627..000000000 --- a/src/internet-apps/wscript +++ /dev/null @@ -1,62 +0,0 @@ -# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -# def options(opt): -# pass - -# def configure(conf): -# conf.check_nonfatal(header_name='stdint.h', define_name='HAVE_STDINT_H') - -def build(bld): - module = bld.create_ns3_module('internet-apps', ['internet']) - module.source = [ - 'model/ping6.cc', - 'model/radvd-interface.cc', - 'model/radvd-prefix.cc', - 'model/radvd.cc', - 'model/v4ping.cc', - 'model/v4traceroute.cc', - 'model/dhcp-header.cc', - 'model/dhcp-server.cc', - 'model/dhcp-client.cc', - 'helper/ping6-helper.cc', - 'helper/radvd-helper.cc', - 'helper/v4ping-helper.cc', - 'helper/v4traceroute-helper.cc', - 'helper/dhcp-helper.cc', - ] - - applications_test = bld.create_ns3_module_test_library('internet-apps') - applications_test.source = [ - 'test/dhcp-test.cc', - 'test/ipv6-radvd-test.cc', - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - applications_test.source.extend([ - # 'test/internet-apps-examples-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'internet-apps' - headers.source = [ - 'model/ping6.h', - 'model/radvd.h', - 'model/radvd-interface.h', - 'model/radvd-prefix.h', - 'model/v4ping.h', - 'model/v4traceroute.h', - 'model/dhcp-header.h', - 'model/dhcp-server.h', - 'model/dhcp-client.h', - 'helper/ping6-helper.h', - 'helper/v4ping-helper.h', - 'helper/v4traceroute-helper.h', - 'helper/radvd-helper.h', - 'helper/dhcp-helper.h', - ] - - if (bld.env['ENABLE_EXAMPLES']): - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/internet/examples/wscript b/src/internet/examples/wscript deleted file mode 100644 index e759fa5fc..000000000 --- a/src/internet/examples/wscript +++ /dev/null @@ -1,9 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - if not bld.env['ENABLE_EXAMPLES']: - return; - - obj = bld.create_ns3_program('main-simple', - ['network', 'internet', 'applications']) - obj.source = 'main-simple.cc' diff --git a/src/internet/wscript b/src/internet/wscript deleted file mode 100644 index f6787f7a3..000000000 --- a/src/internet/wscript +++ /dev/null @@ -1,354 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- -import os -import sys - -from waflib import Options, Logs, Utils, Task - -def build(bld): - # bridge dependency is due to global routing - obj = bld.create_ns3_module('internet', ['bridge', 'traffic-control', 'network', 'core']) - obj.source = [ - 'model/ip-l4-protocol.cc', - 'model/udp-header.cc', - 'model/tcp-header.cc', - 'model/ipv4-interface.cc', - 'model/ipv4-l3-protocol.cc', - 'model/ipv4-end-point.cc', - 'model/udp-l4-protocol.cc', - 'model/tcp-l4-protocol.cc', - 'model/arp-header.cc', - 'model/arp-cache.cc', - 'model/arp-l3-protocol.cc', - 'model/arp-queue-disc-item.cc', - 'model/udp-socket-impl.cc', - 'model/ipv4-end-point-demux.cc', - 'model/udp-socket-factory-impl.cc', - 'model/tcp-socket-factory-impl.cc', - 'model/pending-data.cc', - 'model/rtt-estimator.cc', - 'model/ipv4-raw-socket-factory-impl.cc', - 'model/ipv4-raw-socket-impl.cc', - 'model/icmpv4.cc', - 'model/icmpv4-l4-protocol.cc', - 'model/loopback-net-device.cc', - 'model/ndisc-cache.cc', - 'model/ipv6-interface.cc', - 'model/icmpv6-header.cc', - 'model/ipv6-l3-protocol.cc', - 'model/ipv6-end-point.cc', - 'model/ipv6-end-point-demux.cc', - 'model/ipv6-raw-socket-factory-impl.cc', - 'model/ipv6-raw-socket-impl.cc', - 'model/ipv6-autoconfigured-prefix.cc', - 'model/ipv6-extension.cc', - 'model/ipv6-extension-header.cc', - 'model/ipv6-extension-demux.cc', - 'model/ipv6-option.cc', - 'model/ipv6-option-header.cc', - 'model/ipv6-option-demux.cc', - 'model/icmpv6-l4-protocol.cc', - 'model/tcp-socket-base.cc', - 'model/tcp-socket-state.cc', - 'model/tcp-highspeed.cc', - 'model/tcp-hybla.cc', - 'model/tcp-vegas.cc', - 'model/tcp-congestion-ops.cc', - 'model/tcp-linux-reno.cc', - 'model/tcp-westwood.cc', - 'model/tcp-scalable.cc', - 'model/tcp-veno.cc', - 'model/tcp-bic.cc', - 'model/tcp-cubic.cc', - 'model/tcp-yeah.cc', - 'model/tcp-ledbat.cc', - 'model/tcp-illinois.cc', - 'model/tcp-htcp.cc', - 'model/tcp-lp.cc', - 'model/tcp-dctcp.cc', - 'model/tcp-bbr.cc', - 'model/tcp-rx-buffer.cc', - 'model/tcp-tx-buffer.cc', - 'model/tcp-tx-item.cc', - 'model/tcp-rate-ops.cc', - 'model/tcp-option.cc', - 'model/tcp-option-rfc793.cc', - 'model/tcp-option-winscale.cc', - 'model/tcp-option-ts.cc', - 'model/tcp-option-sack-permitted.cc', - 'model/tcp-option-sack.cc', - 'model/ipv4-packet-info-tag.cc', - 'model/ipv6-packet-info-tag.cc', - 'model/ipv4-interface-address.cc', - 'model/ipv4-address-generator.cc', - 'model/ipv4-header.cc', - 'model/ipv4-queue-disc-item.cc', - 'model/ipv4-packet-filter.cc', - 'model/ipv4-route.cc', - 'model/ipv4-routing-protocol.cc', - 'model/udp-socket.cc', - 'model/udp-socket-factory.cc', - 'model/tcp-socket.cc', - 'model/tcp-socket-factory.cc', - 'model/tcp-recovery-ops.cc', - 'model/tcp-prr-recovery.cc', - 'model/ipv4.cc', - 'model/ipv4-raw-socket-factory.cc', - 'model/ipv6-header.cc', - 'model/ipv6-queue-disc-item.cc', - 'model/ipv6-packet-filter.cc', - 'model/ipv6-interface-address.cc', - 'model/ipv6-route.cc', - 'model/ipv6.cc', - 'model/ipv6-raw-socket-factory.cc', - 'model/ipv6-routing-protocol.cc', - 'model/ipv4-list-routing.cc', - 'model/ipv6-list-routing.cc', - 'helper/ipv4-list-routing-helper.cc', - 'helper/ipv6-list-routing-helper.cc', - 'model/ipv4-static-routing.cc', - 'model/ipv4-routing-table-entry.cc', - 'model/ipv6-static-routing.cc', - 'model/ipv6-routing-table-entry.cc', - 'helper/ipv4-static-routing-helper.cc', - 'helper/ipv6-static-routing-helper.cc', - 'model/global-router-interface.cc', - 'model/global-route-manager.cc', - 'model/global-route-manager-impl.cc', - 'model/candidate-queue.cc', - 'model/ipv4-global-routing.cc', - 'helper/ipv4-global-routing-helper.cc', - 'helper/internet-stack-helper.cc', - 'helper/internet-trace-helper.cc', - 'helper/ipv4-address-helper.cc', - 'helper/ipv4-interface-container.cc', - 'helper/ipv4-routing-helper.cc', - 'helper/ipv6-address-helper.cc', - 'helper/ipv6-interface-container.cc', - 'helper/ipv6-routing-helper.cc', - 'model/ipv6-address-generator.cc', - 'model/ipv4-packet-probe.cc', - 'model/ipv6-packet-probe.cc', - 'model/ipv6-pmtu-cache.cc', - 'model/ripng.cc', - 'model/ripng-header.cc', - 'helper/ripng-helper.cc', - 'model/rip.cc', - 'model/rip-header.cc', - 'helper/rip-helper.cc', - ] - - internet_test = bld.create_ns3_module_test_library('internet') - internet_test.source = [ - 'test/global-route-manager-impl-test-suite.cc', - 'test/ipv4-address-generator-test-suite.cc', - 'test/ipv4-address-helper-test-suite.cc', - 'test/ipv4-list-routing-test-suite.cc', - 'test/ipv4-packet-info-tag-test-suite.cc', - 'test/ipv4-raw-test.cc', - 'test/ipv4-header-test.cc', - 'test/ipv4-fragmentation-test.cc', - 'test/ipv4-forwarding-test.cc', - 'test/ipv4-test.cc', - 'test/ipv4-static-routing-test-suite.cc', - 'test/ipv4-global-routing-test-suite.cc', - 'test/ipv6-extension-header-test-suite.cc', - 'test/ipv6-list-routing-test-suite.cc', - 'test/ipv6-packet-info-tag-test-suite.cc', - 'test/ipv6-test.cc', - 'test/ipv6-raw-test.cc', - 'test/ipv6-address-duplication-test.cc', - 'test/tcp-test.cc', - 'test/tcp-timestamp-test.cc', - 'test/tcp-sack-permitted-test.cc', - 'test/tcp-wscaling-test.cc', - 'test/tcp-option-test.cc', - 'test/tcp-header-test.cc', - 'test/tcp-ecn-test.cc', - 'test/tcp-general-test.cc', - 'test/tcp-error-model.cc', - 'test/tcp-slow-start-test.cc', - 'test/tcp-cong-avoid-test.cc', - 'test/tcp-fast-retr-test.cc', - 'test/tcp-rto-test.cc', - 'test/tcp-highspeed-test.cc', - 'test/tcp-hybla-test.cc', - 'test/tcp-vegas-test.cc', - 'test/tcp-scalable-test.cc', - 'test/tcp-veno-test.cc', - 'test/tcp-bic-test.cc', - 'test/tcp-yeah-test.cc', - 'test/tcp-illinois-test.cc', - 'test/tcp-htcp-test.cc', - 'test/tcp-lp-test.cc', - 'test/tcp-ledbat-test.cc', - 'test/tcp-zero-window-test.cc', - 'test/tcp-pkts-acked-test.cc', - 'test/tcp-rtt-estimation.cc', - 'test/tcp-bytes-in-flight-test.cc', - 'test/tcp-advertised-window-test.cc', - 'test/tcp-classic-recovery-test.cc', - 'test/tcp-prr-recovery-test.cc', - 'test/tcp-loss-test.cc', - 'test/tcp-linux-reno-test.cc', - 'test/udp-test.cc', - 'test/ipv6-address-generator-test-suite.cc', - 'test/ipv6-dual-stack-test-suite.cc', - 'test/ipv6-fragmentation-test.cc', - 'test/ipv6-forwarding-test.cc', - 'test/ipv6-ripng-test.cc', - 'test/ipv6-address-helper-test-suite.cc', - 'test/rtt-test.cc', - 'test/tcp-tx-buffer-test.cc', - 'test/tcp-rx-buffer-test.cc', - 'test/tcp-endpoint-bug2211.cc', - 'test/tcp-datasentcb-test.cc', - 'test/tcp-rate-ops-test.cc', - 'test/ipv4-rip-test.cc', - 'test/tcp-close-test.cc', - 'test/icmp-test.cc', - 'test/ipv4-deduplication-test.cc', - 'test/tcp-dctcp-test.cc', - 'test/tcp-syn-connection-failed-test.cc', - 'test/tcp-pacing-test.cc', - 'test/tcp-bbr-test.cc', - ] - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - internet_test.source.extend([ - # 'test/internet-examples-test-suite.cc', - ]) - - privateheaders = bld(features='ns3privateheader') - privateheaders.module = 'internet' - privateheaders.source = [ - ] - headers = bld(features='ns3header') - headers.module = 'internet' - headers.source = [ - 'model/udp-header.h', - 'model/tcp-header.h', - 'model/tcp-option.h', - 'model/tcp-option-winscale.h', - 'model/tcp-option-ts.h', - 'model/tcp-option-sack-permitted.h', - 'model/tcp-option-sack.h', - 'model/tcp-option-rfc793.h', - 'model/icmpv4.h', - 'model/icmpv6-header.h', - # used by routing - 'model/ipv4-interface.h', - 'model/ipv4-l3-protocol.h', - 'model/ipv4-end-point.h', - 'model/ipv4-end-point-demux.h', - 'model/ipv6-l3-protocol.h', - 'model/ipv6-extension.h', - 'model/ipv6-extension-demux.h', - 'model/ipv6-extension-header.h', - 'model/ipv6-option.h', - 'model/ipv6-option-header.h', - 'model/ipv6-end-point.h', - 'model/ipv6-end-point-demux.h', - 'model/arp-l3-protocol.h', - 'model/udp-l4-protocol.h', - 'model/tcp-l4-protocol.h', - 'model/icmpv4-l4-protocol.h', - 'model/ip-l4-protocol.h', - 'model/arp-header.h', - 'model/arp-cache.h', - 'model/arp-queue-disc-item.h', - 'model/icmpv6-l4-protocol.h', - 'model/ipv6-interface.h', - 'model/ndisc-cache.h', - 'model/loopback-net-device.h', - 'model/ipv4-packet-info-tag.h', - 'model/ipv6-packet-info-tag.h', - 'model/ipv4-interface-address.h', - 'model/ipv4-address-generator.h', - 'model/ipv4-header.h', - 'model/ipv4-queue-disc-item.h', - 'model/ipv4-packet-filter.h', - 'model/ipv4-route.h', - 'model/ipv4-routing-protocol.h', - 'model/udp-socket.h', - 'model/udp-socket-factory.h', - 'model/tcp-socket.h', - 'model/tcp-socket-factory.h', - 'model/ipv4.h', - 'model/ipv4-raw-socket-factory.h', - 'model/ipv4-raw-socket-impl.h', - 'model/ipv6-header.h', - 'model/ipv6-queue-disc-item.h', - 'model/ipv6-packet-filter.h', - 'model/ipv6-interface-address.h', - 'model/ipv6-route.h', - 'model/ipv6.h', - 'model/ipv6-raw-socket-factory.h', - 'model/ipv6-routing-protocol.h', - 'model/ipv4-list-routing.h', - 'model/ipv6-list-routing.h', - 'helper/ipv4-list-routing-helper.h', - 'helper/ipv6-list-routing-helper.h', - 'model/ipv4-static-routing.h', - 'model/ipv4-routing-table-entry.h', - 'model/ipv6-static-routing.h', - 'model/ipv6-routing-table-entry.h', - 'helper/ipv4-static-routing-helper.h', - 'helper/ipv6-static-routing-helper.h', - 'model/global-router-interface.h', - 'model/global-route-manager.h', - 'model/global-route-manager-impl.h', - 'model/candidate-queue.h', - 'model/ipv4-global-routing.h', - 'helper/ipv4-global-routing-helper.h', - 'helper/internet-stack-helper.h', - 'helper/internet-trace-helper.h', - 'helper/ipv4-address-helper.h', - 'helper/ipv4-interface-container.h', - 'helper/ipv4-routing-helper.h', - 'helper/ipv6-address-helper.h', - 'helper/ipv6-interface-container.h', - 'helper/ipv6-routing-helper.h', - 'model/ipv6-address-generator.h', - 'model/tcp-highspeed.h', - 'model/tcp-hybla.h', - 'model/tcp-vegas.h', - 'model/tcp-congestion-ops.h', - 'model/tcp-linux-reno.h', - 'model/tcp-westwood.h', - 'model/tcp-scalable.h', - 'model/tcp-veno.h', - 'model/tcp-bic.h', - 'model/tcp-cubic.h', - 'model/tcp-yeah.h', - 'model/tcp-illinois.h', - 'model/tcp-htcp.h', - 'model/tcp-lp.h', - 'model/tcp-dctcp.h', - 'model/windowed-filter.h', - 'model/tcp-bbr.h', - 'model/tcp-ledbat.h', - 'model/tcp-socket-base.h', - 'model/tcp-socket-state.h', - 'model/tcp-tx-buffer.h', - 'model/tcp-tx-item.h', - 'model/tcp-rate-ops.h', - 'model/tcp-rx-buffer.h', - 'model/tcp-recovery-ops.h', - 'model/tcp-prr-recovery.h', - 'model/rtt-estimator.h', - 'model/ipv4-packet-probe.h', - 'model/ipv6-packet-probe.h', - 'model/ipv6-pmtu-cache.h', - 'model/ripng.h', - 'model/ripng-header.h', - 'helper/ripng-helper.h', - 'model/rip.h', - 'model/rip-header.h', - 'helper/rip-helper.h', - ] - - if (bld.env['ENABLE_EXAMPLES']): - bld.recurse('examples') - - bld.ns3_python_bindings() - diff --git a/src/lr-wpan/examples/wscript b/src/lr-wpan/examples/wscript deleted file mode 100644 index 635544510..000000000 --- a/src/lr-wpan/examples/wscript +++ /dev/null @@ -1,20 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('lr-wpan-packet-print', ['lr-wpan']) - obj.source = 'lr-wpan-packet-print.cc' - - obj = bld.create_ns3_program('lr-wpan-phy-test', ['lr-wpan']) - obj.source = 'lr-wpan-phy-test.cc' - - obj = bld.create_ns3_program('lr-wpan-data', ['lr-wpan']) - obj.source = 'lr-wpan-data.cc' - - obj = bld.create_ns3_program('lr-wpan-error-model-plot', ['lr-wpan', 'stats']) - obj.source = 'lr-wpan-error-model-plot.cc' - - obj = bld.create_ns3_program('lr-wpan-error-distance-plot', ['lr-wpan', 'stats']) - obj.source = 'lr-wpan-error-distance-plot.cc' - - obj = bld.create_ns3_program('lr-wpan-mlme', ['lr-wpan']) - obj.source = 'lr-wpan-mlme.cc' diff --git a/src/lr-wpan/wscript b/src/lr-wpan/wscript deleted file mode 100644 index c7834dd93..000000000 --- a/src/lr-wpan/wscript +++ /dev/null @@ -1,64 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_module('lr-wpan', ['core', 'network', 'mobility', 'spectrum', 'propagation']) - obj.source = [ - 'model/lr-wpan-error-model.cc', - 'model/lr-wpan-interference-helper.cc', - 'model/lr-wpan-phy.cc', - 'model/lr-wpan-mac.cc', - 'model/lr-wpan-mac-header.cc', - 'model/lr-wpan-mac-pl-headers.cc', - 'model/lr-wpan-fields.cc', - 'model/lr-wpan-mac-trailer.cc', - 'model/lr-wpan-csmaca.cc', - 'model/lr-wpan-net-device.cc', - 'model/lr-wpan-spectrum-value-helper.cc', - 'model/lr-wpan-spectrum-signal-parameters.cc', - 'model/lr-wpan-lqi-tag.cc', - 'helper/lr-wpan-helper.cc', - ] - - module_test = bld.create_ns3_module_test_library('lr-wpan') - module_test.source = [ - 'test/lr-wpan-ack-test.cc', - 'test/lr-wpan-cca-test.cc', - 'test/lr-wpan-collision-test.cc', - 'test/lr-wpan-ed-test.cc', - 'test/lr-wpan-error-model-test.cc', - 'test/lr-wpan-packet-test.cc', - 'test/lr-wpan-pd-plme-sap-test.cc', - 'test/lr-wpan-spectrum-value-helper-test.cc', - 'test/lr-wpan-ifs-test.cc', - 'test/lr-wpan-slotted-csmaca-test.cc', - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - module_test.source.extend([ - # 'test/lr-wpan-examples-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'lr-wpan' - headers.source = [ - 'model/lr-wpan-error-model.h', - 'model/lr-wpan-interference-helper.h', - 'model/lr-wpan-phy.h', - 'model/lr-wpan-mac.h', - 'model/lr-wpan-mac-header.h', - 'model/lr-wpan-mac-pl-headers.h', - 'model/lr-wpan-fields.h', - 'model/lr-wpan-mac-trailer.h', - 'model/lr-wpan-csmaca.h', - 'model/lr-wpan-net-device.h', - 'model/lr-wpan-spectrum-value-helper.h', - 'model/lr-wpan-spectrum-signal-parameters.h', - 'model/lr-wpan-lqi-tag.h', - 'helper/lr-wpan-helper.h', - ] - - if (bld.env['ENABLE_EXAMPLES']): - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/lte/examples/wscript b/src/lte/examples/wscript deleted file mode 100644 index d1e3d3381..000000000 --- a/src/lte/examples/wscript +++ /dev/null @@ -1,75 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('lena-cqi-threshold', - ['lte']) - obj.source = 'lena-cqi-threshold.cc' - obj = bld.create_ns3_program('lena-dual-stripe', - ['lte']) - obj.source = 'lena-dual-stripe.cc' - obj = bld.create_ns3_program('lena-fading', - ['lte']) - obj.source = 'lena-fading.cc' - obj = bld.create_ns3_program('lena-intercell-interference', - ['lte']) - obj.source = 'lena-intercell-interference.cc' - obj = bld.create_ns3_program('lena-ipv6-addr-conf', - ['lte']) - obj.source = 'lena-ipv6-addr-conf.cc' - obj = bld.create_ns3_program('lena-ipv6-ue-rh', - ['lte']) - obj.source = 'lena-ipv6-ue-rh.cc' - obj = bld.create_ns3_program('lena-ipv6-ue-ue', - ['lte']) - obj.source = 'lena-ipv6-ue-ue.cc' - obj = bld.create_ns3_program('lena-pathloss-traces', - ['lte']) - obj.source = 'lena-pathloss-traces.cc' - obj = bld.create_ns3_program('lena-profiling', - ['lte']) - obj.source = 'lena-profiling.cc' - obj = bld.create_ns3_program('lena-rem', - ['lte']) - obj.source = 'lena-rem.cc' - obj = bld.create_ns3_program('lena-rem-sector-antenna', - ['lte']) - obj.source = 'lena-rem-sector-antenna.cc' - obj = bld.create_ns3_program('lena-rlc-traces', - ['lte']) - obj.source = 'lena-rlc-traces.cc' - obj = bld.create_ns3_program('lena-simple', - ['lte']) - obj.source = 'lena-simple.cc' - obj = bld.create_ns3_program('lena-simple-epc', - ['lte']) - obj.source = 'lena-simple-epc.cc' - obj = bld.create_ns3_program('lena-simple-epc-backhaul', - ['lte']) - obj.source = 'lena-simple-epc-backhaul.cc' - obj = bld.create_ns3_program('lena-deactivate-bearer', - ['lte']) - obj.source = 'lena-deactivate-bearer.cc' - obj = bld.create_ns3_program('lena-x2-handover', - ['lte']) - obj.source = 'lena-x2-handover.cc' - obj = bld.create_ns3_program('lena-x2-handover-measures', - ['lte']) - obj.source = 'lena-x2-handover-measures.cc' - obj = bld.create_ns3_program('lena-frequency-reuse', - ['lte']) - obj.source = 'lena-frequency-reuse.cc' - obj = bld.create_ns3_program('lena-distributed-ffr', - ['lte']) - obj.source = 'lena-distributed-ffr.cc' - obj = bld.create_ns3_program('lena-uplink-power-control', - ['lte']) - obj.source = 'lena-uplink-power-control.cc' - - obj = bld.create_ns3_program('lena-radio-link-failure', - ['lte']) - obj.source = 'lena-radio-link-failure.cc' - - if bld.env['ENABLE_EMU']: - obj = bld.create_ns3_program('lena-simple-epc-emu', - ['lte', 'fd-net-device']) - obj.source = 'lena-simple-epc-emu.cc' diff --git a/src/lte/wscript b/src/lte/wscript deleted file mode 100644 index fd861399e..000000000 --- a/src/lte/wscript +++ /dev/null @@ -1,345 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - - lte_module_dependencies = ['core', 'network', 'spectrum', 'stats', 'buildings', 'virtual-net-device','point-to-point','applications','internet','csma'] - if (bld.env['ENABLE_EMU']): - lte_module_dependencies.append('fd-net-device') - module = bld.create_ns3_module('lte', lte_module_dependencies) - module.source = [ - 'model/lte-common.cc', - 'model/lte-spectrum-phy.cc', - 'model/lte-spectrum-signal-parameters.cc', - 'model/lte-phy.cc', - 'model/lte-enb-phy.cc', - 'model/lte-ue-phy.cc', - 'model/lte-spectrum-value-helper.cc', - 'model/lte-amc.cc', - 'model/lte-enb-rrc.cc', - 'model/lte-ue-rrc.cc', - 'model/lte-rrc-sap.cc', - 'model/lte-rrc-protocol-ideal.cc', - 'model/lte-rrc-protocol-real.cc', - 'model/lte-rlc-sap.cc', - 'model/lte-rlc.cc', - 'model/lte-rlc-sequence-number.cc', - 'model/lte-rlc-header.cc', - 'model/lte-rlc-am-header.cc', - 'model/lte-rlc-tm.cc', - 'model/lte-rlc-um.cc', - 'model/lte-rlc-am.cc', - 'model/lte-rlc-tag.cc', - 'model/lte-rlc-sdu-status-tag.cc', - 'model/lte-pdcp-sap.cc', - 'model/lte-pdcp.cc', - 'model/lte-pdcp-header.cc', - 'model/lte-pdcp-tag.cc', - 'model/eps-bearer.cc', - 'model/lte-radio-bearer-info.cc', - 'model/lte-net-device.cc', - 'model/lte-enb-net-device.cc', - 'model/lte-ue-net-device.cc', - 'model/lte-control-messages.cc', - 'helper/lte-helper.cc', - 'helper/lte-stats-calculator.cc', - 'helper/epc-helper.cc', - 'helper/no-backhaul-epc-helper.cc', - 'helper/point-to-point-epc-helper.cc', - 'helper/radio-bearer-stats-calculator.cc', - 'helper/radio-bearer-stats-connector.cc', - 'helper/phy-stats-calculator.cc', - 'helper/mac-stats-calculator.cc', - 'helper/phy-tx-stats-calculator.cc', - 'helper/phy-rx-stats-calculator.cc', - 'helper/radio-environment-map-helper.cc', - 'helper/lte-hex-grid-enb-topology-helper.cc', - 'helper/lte-global-pathloss-database.cc', - 'model/rem-spectrum-phy.cc', - 'model/ff-mac-common.cc', - 'model/ff-mac-csched-sap.cc', - 'model/ff-mac-sched-sap.cc', - 'model/lte-mac-sap.cc', - 'model/ff-mac-scheduler.cc', - 'model/lte-enb-cmac-sap.cc', - 'model/lte-ue-cmac-sap.cc', - 'model/rr-ff-mac-scheduler.cc', - 'model/lte-enb-mac.cc', - 'model/lte-ue-mac.cc', - 'model/lte-radio-bearer-tag.cc', - 'model/eps-bearer-tag.cc', - 'model/lte-phy-tag.cc', - 'model/lte-enb-phy-sap.cc', - 'model/lte-enb-cphy-sap.cc', - 'model/lte-ue-phy-sap.cc', - 'model/lte-ue-cphy-sap.cc', - 'model/lte-interference.cc', - 'model/lte-chunk-processor.cc', - 'model/pf-ff-mac-scheduler.cc', - 'model/fdmt-ff-mac-scheduler.cc', - 'model/tdmt-ff-mac-scheduler.cc', - 'model/tta-ff-mac-scheduler.cc', - 'model/fdbet-ff-mac-scheduler.cc', - 'model/tdbet-ff-mac-scheduler.cc', - 'model/fdtbfq-ff-mac-scheduler.cc', - 'model/tdtbfq-ff-mac-scheduler.cc', - 'model/pss-ff-mac-scheduler.cc', - 'model/cqa-ff-mac-scheduler.cc', - 'model/epc-gtpu-header.cc', - 'model/epc-gtpc-header.cc', - 'model/epc-enb-application.cc', - 'model/epc-sgw-application.cc', - 'model/epc-pgw-application.cc', - 'model/epc-mme-application.cc', - 'model/epc-x2-sap.cc', - 'model/epc-x2-header.cc', - 'model/epc-x2.cc', - 'model/epc-tft.cc', - 'model/epc-tft-classifier.cc', - 'model/lte-mi-error-model.cc', - 'model/lte-vendor-specific-parameters.cc', - 'model/epc-enb-s1-sap.cc', - 'model/epc-s1ap-sap.cc', - 'model/epc-s11-sap.cc', - 'model/lte-as-sap.cc', - 'model/epc-ue-nas.cc', - 'model/lte-harq-phy.cc', - 'model/lte-asn1-header.cc', - 'model/lte-rrc-header.cc', - 'model/lte-handover-management-sap.cc', - 'model/lte-handover-algorithm.cc', - 'model/a2-a4-rsrq-handover-algorithm.cc', - 'model/a3-rsrp-handover-algorithm.cc', - 'model/no-op-handover-algorithm.cc', - 'model/lte-anr-sap.cc', - 'model/lte-anr.cc', - 'model/lte-ffr-algorithm.cc', - 'model/lte-ffr-sap.cc', - 'model/lte-ffr-rrc-sap.cc', - 'model/lte-fr-no-op-algorithm.cc', - 'model/lte-fr-hard-algorithm.cc', - 'model/lte-fr-strict-algorithm.cc', - 'model/lte-fr-soft-algorithm.cc', - 'model/lte-ffr-soft-algorithm.cc', - 'model/lte-ffr-enhanced-algorithm.cc', - 'model/lte-ffr-distributed-algorithm.cc', - 'model/lte-ue-power-control.cc', - 'model/lte-ccm-rrc-sap.cc', - 'model/lte-ue-ccm-rrc-sap.cc', - 'model/lte-ccm-mac-sap.cc', - 'model/lte-enb-component-carrier-manager.cc', - 'model/lte-ue-component-carrier-manager.cc', - 'model/no-op-component-carrier-manager.cc', - 'model/simple-ue-component-carrier-manager.cc', - 'model/component-carrier.cc', - 'helper/cc-helper.cc', - 'model/component-carrier-ue.cc', - 'model/component-carrier-enb.cc' - ] - - module_test = bld.create_ns3_module_test_library('lte') - module_test.source = [ - 'test/lte-test-downlink-sinr.cc', - 'test/lte-test-uplink-sinr.cc', - 'test/lte-test-link-adaptation.cc', - 'test/lte-test-interference.cc', - 'test/lte-test-ue-phy.cc', - 'test/lte-test-rr-ff-mac-scheduler.cc', - 'test/lte-test-pf-ff-mac-scheduler.cc', - 'test/lte-test-fdmt-ff-mac-scheduler.cc', - 'test/lte-test-tdmt-ff-mac-scheduler.cc', - 'test/lte-test-tta-ff-mac-scheduler.cc', - 'test/lte-test-fdbet-ff-mac-scheduler.cc', - 'test/lte-test-tdbet-ff-mac-scheduler.cc', - 'test/lte-test-fdtbfq-ff-mac-scheduler.cc', - 'test/lte-test-tdtbfq-ff-mac-scheduler.cc', - 'test/lte-test-pss-ff-mac-scheduler.cc', - 'test/lte-test-cqa-ff-mac-scheduler.cc', - 'test/lte-test-earfcn.cc', - 'test/lte-test-spectrum-value-helper.cc', - 'test/lte-test-pathloss-model.cc', - 'test/lte-test-entities.cc', - 'test/lte-simple-helper.cc', - 'test/lte-simple-net-device.cc', - 'test/test-lte-rlc-header.cc', - 'test/lte-test-rlc-um-transmitter.cc', - 'test/lte-test-rlc-am-transmitter.cc', - 'test/lte-test-rlc-um-e2e.cc', - 'test/lte-test-rlc-am-e2e.cc', - 'test/epc-test-gtpu.cc', - 'test/test-epc-tft-classifier.cc', - 'test/epc-test-s1u-downlink.cc', - 'test/epc-test-s1u-uplink.cc', - 'test/test-lte-epc-e2e-data.cc', - 'test/test-lte-antenna.cc', - 'test/lte-test-phy-error-model.cc', - 'test/lte-test-mimo.cc', - 'test/lte-test-harq.cc', - 'test/test-lte-rrc.cc', - 'test/test-lte-x2-handover.cc', - 'test/test-lte-x2-handover-measures.cc', - 'test/test-asn1-encoding.cc', - 'test/lte-test-ue-measurements.cc', - 'test/lte-test-cell-selection.cc', - 'test/test-lte-handover-delay.cc', - 'test/test-lte-handover-target.cc', - 'test/lte-test-deactivate-bearer.cc', - 'test/lte-ffr-simple.cc', - 'test/lte-test-downlink-power-control.cc', - 'test/lte-test-uplink-power-control.cc', - 'test/lte-test-frequency-reuse.cc', - 'test/lte-test-interference-fr.cc', - 'test/lte-test-cqi-generation.cc', - 'test/lte-simple-spectrum-phy.cc', - 'test/lte-test-carrier-aggregation.cc', - 'test/lte-test-aggregation-throughput-scale.cc', - 'test/lte-test-ipv6-routing.cc', - 'test/lte-test-carrier-aggregation-configuration.cc', - 'test/lte-test-radio-link-failure.cc', - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - module_test.source.extend([ - # 'test/lte-examples-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'lte' - headers.source = [ - 'model/lte-common.h', - 'model/lte-spectrum-phy.h', - 'model/lte-spectrum-signal-parameters.h', - 'model/lte-phy.h', - 'model/lte-enb-phy.h', - 'model/lte-ue-phy.h', - 'model/lte-spectrum-value-helper.h', - 'model/lte-amc.h', - 'model/lte-enb-rrc.h', - 'model/lte-ue-rrc.h', - 'model/lte-rrc-sap.h', - 'model/lte-rrc-protocol-ideal.h', - 'model/lte-rrc-protocol-real.h', - 'model/lte-rlc-sap.h', - 'model/lte-rlc.h', - 'model/lte-rlc-header.h', - 'model/lte-rlc-sequence-number.h', - 'model/lte-rlc-am-header.h', - 'model/lte-rlc-tm.h', - 'model/lte-rlc-um.h', - 'model/lte-rlc-am.h', - 'model/lte-rlc-tag.h', - 'model/lte-rlc-sdu-status-tag.h', - 'model/lte-pdcp-sap.h', - 'model/lte-pdcp.h', - 'model/lte-pdcp-header.h', - 'model/lte-pdcp-tag.h', - 'model/eps-bearer.h', - 'model/lte-radio-bearer-info.h', - 'model/lte-net-device.h', - 'model/lte-enb-net-device.h', - 'model/lte-ue-net-device.h', - 'model/lte-control-messages.h', - 'helper/lte-helper.h', - 'helper/lte-stats-calculator.h', - 'helper/epc-helper.h', - 'helper/no-backhaul-epc-helper.h', - 'helper/point-to-point-epc-helper.h', - 'helper/phy-stats-calculator.h', - 'helper/mac-stats-calculator.h', - 'helper/phy-tx-stats-calculator.h', - 'helper/phy-rx-stats-calculator.h', - 'helper/radio-bearer-stats-calculator.h', - 'helper/radio-bearer-stats-connector.h', - 'helper/radio-environment-map-helper.h', - 'helper/lte-hex-grid-enb-topology-helper.h', - 'helper/lte-global-pathloss-database.h', - 'model/rem-spectrum-phy.h', - 'model/ff-mac-common.h', - 'model/ff-mac-csched-sap.h', - 'model/ff-mac-sched-sap.h', - 'model/lte-enb-cmac-sap.h', - 'model/lte-ue-cmac-sap.h', - 'model/lte-mac-sap.h', - 'model/ff-mac-scheduler.h', - 'model/rr-ff-mac-scheduler.h', - 'model/lte-enb-mac.h', - 'model/lte-ue-mac.h', - 'model/lte-radio-bearer-tag.h', - 'model/eps-bearer-tag.h', - 'model/lte-phy-tag.h', - 'model/lte-enb-phy-sap.h', - 'model/lte-enb-cphy-sap.h', - 'model/lte-ue-phy-sap.h', - 'model/lte-ue-cphy-sap.h', - 'model/lte-interference.h', - 'model/lte-chunk-processor.h', - 'model/pf-ff-mac-scheduler.h', - 'model/fdmt-ff-mac-scheduler.h', - 'model/tdmt-ff-mac-scheduler.h', - 'model/tta-ff-mac-scheduler.h', - 'model/fdbet-ff-mac-scheduler.h', - 'model/tdbet-ff-mac-scheduler.h', - 'model/fdtbfq-ff-mac-scheduler.h', - 'model/tdtbfq-ff-mac-scheduler.h', - 'model/pss-ff-mac-scheduler.h', - 'model/cqa-ff-mac-scheduler.h', - 'model/epc-gtpu-header.h', - 'model/epc-gtpc-header.h', - 'model/epc-enb-application.h', - 'model/epc-sgw-application.h', - 'model/epc-pgw-application.h', - 'model/epc-mme-application.h', - 'model/lte-vendor-specific-parameters.h', - 'model/epc-x2-sap.h', - 'model/epc-x2-header.h', - 'model/epc-x2.h', - 'model/epc-tft.h', - 'model/epc-tft-classifier.h', - 'model/lte-mi-error-model.h', - 'model/epc-enb-s1-sap.h', - 'model/epc-s1ap-sap.h', - 'model/epc-s11-sap.h', - 'model/lte-as-sap.h', - 'model/epc-ue-nas.h', - 'model/lte-harq-phy.h', - 'model/lte-asn1-header.h', - 'model/lte-rrc-header.h', - 'model/lte-handover-management-sap.h', - 'model/lte-handover-algorithm.h', - 'model/a2-a4-rsrq-handover-algorithm.h', - 'model/a3-rsrp-handover-algorithm.h', - 'model/no-op-handover-algorithm.h', - 'model/lte-anr-sap.h', - 'model/lte-anr.h', - 'model/lte-ffr-algorithm.h', - 'model/lte-ffr-sap.h', - 'model/lte-ffr-rrc-sap.h', - 'model/lte-fr-no-op-algorithm.h', - 'model/lte-fr-hard-algorithm.h', - 'model/lte-fr-strict-algorithm.h', - 'model/lte-fr-soft-algorithm.h', - 'model/lte-ffr-soft-algorithm.h', - 'model/lte-ffr-enhanced-algorithm.h', - 'model/lte-ffr-distributed-algorithm.h', - 'model/lte-ue-power-control.h', - 'model/lte-ccm-rrc-sap.h', - 'model/lte-ue-ccm-rrc-sap.h', - 'model/lte-ccm-mac-sap.h', - 'model/lte-enb-component-carrier-manager.h', - 'model/lte-ue-component-carrier-manager.h', - 'model/no-op-component-carrier-manager.h', - 'model/simple-ue-component-carrier-manager.h', - 'helper/cc-helper.h', - 'model/component-carrier.h', - 'model/component-carrier-ue.h', - 'model/component-carrier-enb.h' - ] - - if (bld.env['ENABLE_EMU']): - module.source.append ('helper/emu-epc-helper.cc') - headers.source.append ('helper/emu-epc-helper.h') - - if (bld.env['ENABLE_EXAMPLES']): - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/mesh/examples/wscript b/src/mesh/examples/wscript deleted file mode 100644 index e3280dd35..000000000 --- a/src/mesh/examples/wscript +++ /dev/null @@ -1,5 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('mesh', ['internet', 'mobility', 'wifi', 'mesh', 'applications']) - obj.source = 'mesh.cc' diff --git a/src/mesh/wscript b/src/mesh/wscript deleted file mode 100644 index 8e41d34d8..000000000 --- a/src/mesh/wscript +++ /dev/null @@ -1,101 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_module('mesh', ['internet', 'wifi']) - - obj.source = [ - 'model/mesh-information-element-vector.cc', - 'model/mesh-point-device.cc', - 'model/mesh-l2-routing-protocol.cc', - 'model/mesh-wifi-beacon.cc', - 'model/mesh-wifi-interface-mac.cc', - 'model/dot11s/ie-dot11s-beacon-timing.cc', - 'model/dot11s/ie-dot11s-configuration.cc', - 'model/dot11s/ie-dot11s-id.cc', - 'model/dot11s/ie-dot11s-peer-management.cc', - 'model/dot11s/ie-dot11s-preq.cc', - 'model/dot11s/ie-dot11s-prep.cc', - 'model/dot11s/ie-dot11s-perr.cc', - 'model/dot11s/ie-dot11s-rann.cc', - 'model/dot11s/ie-dot11s-peering-protocol.cc', - 'model/dot11s/ie-dot11s-metric-report.cc', - 'model/dot11s/dot11s-mac-header.cc', - 'model/dot11s/peer-link-frame.cc', - 'model/dot11s/peer-link.cc', - 'model/dot11s/peer-management-protocol-mac.cc', - 'model/dot11s/peer-management-protocol.cc', - 'model/dot11s/hwmp-tag.cc', - 'model/dot11s/hwmp-rtable.cc', - 'model/dot11s/hwmp-protocol-mac.cc', - 'model/dot11s/hwmp-protocol.cc', - 'model/dot11s/airtime-metric.cc', - 'model/flame/flame-header.cc', - 'model/flame/flame-rtable.cc', - 'model/flame/flame-protocol-mac.cc', - 'model/flame/flame-protocol.cc', - 'helper/mesh-helper.cc', - 'helper/mesh-stack-installer.cc', - 'helper/dot11s/dot11s-installer.cc', - 'helper/flame/flame-installer.cc', - ] - - obj_test = bld.create_ns3_module_test_library('mesh') - obj_test.source = [ - 'test/mesh-information-element-vector-test-suite.cc', - 'test/dot11s/dot11s-test-suite.cc', - 'test/dot11s/pmp-regression.cc', - 'test/dot11s/hwmp-reactive-regression.cc', - 'test/dot11s/hwmp-proactive-regression.cc', - 'test/dot11s/hwmp-simplest-regression.cc', - 'test/dot11s/hwmp-target-flags-regression.cc', - 'test/dot11s/regression.cc', - 'test/flame/flame-test-suite.cc', - 'test/flame/flame-regression.cc', - 'test/flame/regression.cc', - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - obj_test.source.extend([ - # 'test/mesh-examples-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'mesh' - headers.source = [ - 'model/mesh-information-element-vector.h', - 'model/mesh-point-device.h', - 'model/mesh-l2-routing-protocol.h', - 'model/mesh-wifi-beacon.h', - 'model/mesh-wifi-interface-mac.h', - 'model/mesh-wifi-interface-mac-plugin.h', - 'model/dot11s/hwmp-protocol.h', - 'model/dot11s/peer-management-protocol.h', - 'model/dot11s/ie-dot11s-beacon-timing.h', - 'model/dot11s/ie-dot11s-configuration.h', - 'model/dot11s/ie-dot11s-peer-management.h', - 'model/dot11s/ie-dot11s-id.h', - 'model/dot11s/peer-link.h', - 'model/dot11s/dot11s-mac-header.h', - 'model/dot11s/peer-link-frame.h', - 'model/dot11s/hwmp-rtable.h', - 'model/dot11s/ie-dot11s-peering-protocol.h', - 'model/dot11s/ie-dot11s-metric-report.h', - 'model/dot11s/ie-dot11s-perr.h', - 'model/dot11s/ie-dot11s-prep.h', - 'model/dot11s/ie-dot11s-preq.h', - 'model/dot11s/ie-dot11s-rann.h', - 'model/flame/flame-protocol.h', - 'model/flame/flame-header.h', - 'model/flame/flame-rtable.h', - 'model/flame/flame-protocol-mac.h', - 'helper/mesh-helper.h', - 'helper/mesh-stack-installer.h', - 'helper/dot11s/dot11s-installer.h', - 'helper/flame/flame-installer.h', - ] - - if bld.env['ENABLE_EXAMPLES']: - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/mobility/examples/wscript b/src/mobility/examples/wscript deleted file mode 100644 index 284e46e87..000000000 --- a/src/mobility/examples/wscript +++ /dev/null @@ -1,33 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - if not bld.env['ENABLE_EXAMPLES']: - return; - - obj = bld.create_ns3_program('main-grid-topology', - ['core', 'mobility', 'network']) - obj.source = 'main-grid-topology.cc' - - obj = bld.create_ns3_program('main-random-topology', - ['core', 'mobility']) - obj.source = 'main-random-topology.cc' - - obj = bld.create_ns3_program('main-random-walk', - ['core', 'mobility']) - obj.source = 'main-random-walk.cc' - - obj = bld.create_ns3_program('mobility-trace-example', - ['core', 'mobility', 'network']) - obj.source = 'mobility-trace-example.cc' - - obj = bld.create_ns3_program('ns2-mobility-trace', - ['core', 'mobility']) - obj.source = 'ns2-mobility-trace.cc' - - obj = bld.create_ns3_program('bonnmotion-ns2-example', - ['core', 'mobility']) - obj.source = 'bonnmotion-ns2-example.cc' - - obj = bld.create_ns3_program('reference-point-group-mobility-example', - ['core', 'network', 'mobility']) - obj.source = 'reference-point-group-mobility-example.cc' diff --git a/src/mobility/wscript b/src/mobility/wscript deleted file mode 100644 index c171f3358..000000000 --- a/src/mobility/wscript +++ /dev/null @@ -1,74 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - mobility = bld.create_ns3_module('mobility', ['network']) - mobility.source = [ - 'model/box.cc', - 'model/constant-acceleration-mobility-model.cc', - 'model/constant-position-mobility-model.cc', - 'model/constant-velocity-helper.cc', - 'model/constant-velocity-mobility-model.cc', - 'model/gauss-markov-mobility-model.cc', - 'model/geographic-positions.cc', - 'model/hierarchical-mobility-model.cc', - 'model/mobility-model.cc', - 'model/position-allocator.cc', - 'model/random-direction-2d-mobility-model.cc', - 'model/random-walk-2d-mobility-model.cc', - 'model/random-waypoint-mobility-model.cc', - 'model/rectangle.cc', - 'model/steady-state-random-waypoint-mobility-model.cc', - 'model/waypoint.cc', - 'model/waypoint-mobility-model.cc', - 'helper/mobility-helper.cc', - 'helper/ns2-mobility-helper.cc', - 'helper/group-mobility-helper.cc', - ] - - mobility_test = bld.create_ns3_module_test_library('mobility') - mobility_test.source = [ - 'test/mobility-test-suite.cc', - 'test/mobility-trace-test-suite.cc', - 'test/ns2-mobility-helper-test-suite.cc', - 'test/steady-state-random-waypoint-mobility-model-test.cc', - 'test/waypoint-mobility-model-test.cc', - 'test/geo-to-cartesian-test.cc', - 'test/rand-cart-around-geo-test.cc', - 'test/box-line-intersection-test.cc', - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - mobility_test.source.extend([ - # 'test/mobility-examples-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'mobility' - headers.source = [ - 'model/box.h', - 'model/constant-acceleration-mobility-model.h', - 'model/constant-position-mobility-model.h', - 'model/constant-velocity-helper.h', - 'model/constant-velocity-mobility-model.h', - 'model/gauss-markov-mobility-model.h', - 'model/geographic-positions.h', - 'model/hierarchical-mobility-model.h', - 'model/mobility-model.h', - 'model/position-allocator.h', - 'model/rectangle.h', - 'model/random-direction-2d-mobility-model.h', - 'model/random-walk-2d-mobility-model.h', - 'model/random-waypoint-mobility-model.h', - 'model/steady-state-random-waypoint-mobility-model.h', - 'model/waypoint.h', - 'model/waypoint-mobility-model.h', - 'helper/mobility-helper.h', - 'helper/ns2-mobility-helper.h', - 'helper/group-mobility-helper.h', - ] - - if (bld.env['ENABLE_EXAMPLES']): - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/mpi/examples/wscript b/src/mpi/examples/wscript deleted file mode 100644 index f5c1fcb89..000000000 --- a/src/mpi/examples/wscript +++ /dev/null @@ -1,25 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('simple-distributed', - ['mpi', 'point-to-point', 'internet', 'nix-vector-routing', 'applications']) - obj.source = ['simple-distributed.cc', 'mpi-test-fixtures.cc'] - - obj = bld.create_ns3_program('simple-distributed-empty-node', - ['mpi', 'point-to-point', 'internet', 'nix-vector-routing', 'applications']) - obj.source = ['simple-distributed-empty-node.cc', 'mpi-test-fixtures.cc'] - - obj = bld.create_ns3_program('simple-distributed-mpi-comm', - ['point-to-point', 'internet', 'nix-vector-routing', 'applications']) - obj.source = ['simple-distributed-mpi-comm.cc', 'mpi-test-fixtures.cc'] - - obj = bld.create_ns3_program('third-distributed', - ['mpi', 'point-to-point', 'internet', 'mobility', 'wifi', 'csma', 'applications']) - obj.source = ['third-distributed.cc', 'mpi-test-fixtures.cc'] - - obj = bld.create_ns3_program('nms-p2p-nix-distributed', - ['mpi', 'point-to-point', 'internet', 'nix-vector-routing', 'applications']) - obj.source = ['nms-p2p-nix-distributed.cc', 'mpi-test-fixtures.cc'] - - - diff --git a/src/mpi/wscript b/src/mpi/wscript deleted file mode 100644 index c3328ff49..000000000 --- a/src/mpi/wscript +++ /dev/null @@ -1,78 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- -import sys -import subprocess - -from waflib import Options -from waflib.Errors import WafError - -def configure(conf): - if Options.options.enable_mpi: - # try to detect openmpi installation - mpi = conf.check_cfg(path='mpic++', args='-showme', - package='', uselib_store='MPI', mandatory=False) - if mpi: - conf.env.append_value('DEFINES_MPI', 'NS3_OPENMPI') - else: - # try the MPICH2 flags - mpi = conf.check_cfg(path='mpic++', args='-compile-info -link-info', - package='', uselib_store='MPI', mandatory=False) - if mpi: - conf.env.append_value('DEFINES_MPI', 'NS3_MPICH') - if mpi: - conf.env.append_value('DEFINES_MPI', 'NS3_MPI') - conf.env['ENABLE_MPI'] = True - for libpath in conf.env.LIBPATH_MPI: - if 'mpi' in libpath: - conf.env.append_value('LINKFLAGS_MPI', '-Wl,-rpath,'+libpath) - # Bug #2437, using OpenMPI 1.6.5 (possibly later versions) - # if upstream OpenMPI bug clears at some point, this - # can be removed - # conf.env.append_value('CXXFLAGS', '-Wno-literal-suffix') - conf.report_optional_feature("mpi", "MPI Support", True, '') - else: - conf.report_optional_feature("mpi", "MPI Support", False, 'mpic++ not found') - conf.env['MODULES_NOT_BUILT'].append('mpi') - else: - conf.report_optional_feature("mpi", "MPI Support", False, 'option --enable-mpi not selected') - conf.env['MODULES_NOT_BUILT'].append('mpi') - - -def build(bld): - # Don't do anything for this module if mpi's not enabled. - if 'mpi' in bld.env['MODULES_NOT_BUILT']: - return - - sim = bld.create_ns3_module('mpi', ['core', 'network']) - sim.source = [ - 'model/distributed-simulator-impl.cc', - 'model/granted-time-window-mpi-interface.cc', - 'model/mpi-receiver.cc', - 'model/null-message-simulator-impl.cc', - 'model/null-message-mpi-interface.cc', - 'model/remote-channel-bundle.cc', - 'model/remote-channel-bundle-manager.cc', - 'model/mpi-interface.cc', - ] - - # MPI tests are based on examples that are run as tests, only test when examples are built. - if bld.env['ENABLE_EXAMPLES']: - module_test = bld.create_ns3_module_test_library('mpi') - module_test.source = [ - 'test/mpi-test-suite.cc', - ] - - headers = bld(features='ns3header') - headers.module = 'mpi' - headers.source = [ - 'model/mpi-receiver.h', - 'model/mpi-interface.h', - 'model/parallel-communication-interface.h', - ] - - if bld.env['ENABLE_MPI']: - sim.use.append('MPI') - - if bld.env['ENABLE_EXAMPLES']: - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/netanim/doc/animation.rst b/src/netanim/doc/animation.rst index 24deb4a5a..db458d93e 100644 --- a/src/netanim/doc/animation.rst +++ b/src/netanim/doc/animation.rst @@ -153,7 +153,7 @@ The above will create an XML file dumbbell-animation.xml Mandatory ######### -1. Ensure that your program's wscript includes the "netanim" module. An example of such a wscript is at src/netanim/examples/wscript. +1. Ensure that your program's CMakeLists.txt includes the "netanim" module. An example of such a CMakeLists.txt is at src/netanim/examples/CMakeLists.txt. 2. Include the header [#include "ns3/netanim-module.h"] in your test program 3. Add the statement diff --git a/src/netanim/examples/wscript b/src/netanim/examples/wscript deleted file mode 100644 index 05a995ed4..000000000 --- a/src/netanim/examples/wscript +++ /dev/null @@ -1,30 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('dumbbell-animation', - ['netanim', 'applications', 'point-to-point-layout']) - obj.source = 'dumbbell-animation.cc' - - obj = bld.create_ns3_program('grid-animation', - ['netanim', 'applications', 'point-to-point-layout']) - obj.source = 'grid-animation.cc' - - obj = bld.create_ns3_program('star-animation', - ['netanim', 'applications', 'point-to-point-layout']) - obj.source = 'star-animation.cc' - - obj = bld.create_ns3_program('wireless-animation', - ['netanim', 'applications', 'point-to-point', 'csma', 'wifi', 'mobility', 'network']) - obj.source = 'wireless-animation.cc' - - obj = bld.create_ns3_program('uan-animation', - ['netanim', 'internet', 'mobility', 'applications', 'uan']) - obj.source = 'uan-animation.cc' - - obj = bld.create_ns3_program('colors-link-description', - ['netanim', 'applications', 'point-to-point-layout']) - obj.source = 'colors-link-description.cc' - - obj = bld.create_ns3_program('resources-counters', - ['netanim', 'applications', 'point-to-point-layout']) - obj.source = 'resources-counters.cc' diff --git a/src/netanim/wscript b/src/netanim/wscript deleted file mode 100644 index a05bee689..000000000 --- a/src/netanim/wscript +++ /dev/null @@ -1,25 +0,0 @@ -## -*-Mode : python; py-indent-offset : 4; indent-tabs-mode : nil; coding : utf-8; -*- - -import wutils - -# Required NetAnim version -NETANIM_RELEASE_NAME = "netanim-3.108" - -def build (bld) : - module = bld.create_ns3_module ('netanim', ['internet', 'mobility', 'wimax', 'wifi', 'csma', 'lte', 'uan', 'lr-wpan', 'energy', 'wave', 'point-to-point-layout']) - module.includes = '.' - module.source = [ 'model/animation-interface.cc', ] - netanim_test = bld.create_ns3_module_test_library('netanim') - netanim_test.source = ['test/netanim-test.cc', ] - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - netanim_test.source.extend([ - # 'test/netanim-examples-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'netanim' - headers.source = ['model/animation-interface.h', ] - if (bld.env['ENABLE_EXAMPLES']) : - bld.recurse('examples') - bld.ns3_python_bindings() diff --git a/src/network/examples/wscript b/src/network/examples/wscript deleted file mode 100644 index 65e678b22..000000000 --- a/src/network/examples/wscript +++ /dev/null @@ -1,20 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - if not bld.env['ENABLE_EXAMPLES']: - return; - - obj = bld.create_ns3_program('main-packet-header', ['network']) - obj.source = 'main-packet-header.cc' - - obj = bld.create_ns3_program('main-packet-tag', ['network']) - obj.source = 'main-packet-tag.cc' - - obj = bld.create_ns3_program('packet-socket-apps', ['core', 'network']) - obj.source = 'packet-socket-apps.cc' - - obj = bld.create_ns3_program('lollipop-comparisions', ['core', 'network']) - obj.source = 'lollipop-comparisions.cc' - - obj = bld.create_ns3_program('bit-serializer', ['core', 'network']) - obj.source = 'bit-serializer.cc' diff --git a/src/network/wscript b/src/network/wscript deleted file mode 100644 index 07e8bf000..000000000 --- a/src/network/wscript +++ /dev/null @@ -1,181 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - network = bld.create_ns3_module('network', ['core', 'stats']) - network.source = [ - 'model/address.cc', - 'model/application.cc', - 'model/buffer.cc', - 'model/byte-tag-list.cc', - 'model/channel.cc', - 'model/channel-list.cc', - 'model/chunk.cc', - 'model/header.cc', - 'model/nix-vector.cc', - 'model/node.cc', - 'model/node-list.cc', - 'model/net-device.cc', - 'model/packet.cc', - 'model/packet-metadata.cc', - 'model/packet-tag-list.cc', - 'model/socket.cc', - 'model/socket-factory.cc', - 'model/tag.cc', - 'model/tag-buffer.cc', - 'model/trailer.cc', - 'utils/address-utils.cc', - 'utils/bit-deserializer.cc', - 'utils/bit-serializer.cc', - 'utils/crc32.cc', - 'utils/data-rate.cc', - 'utils/drop-tail-queue.cc', - 'utils/dynamic-queue-limits.cc', - 'utils/error-channel.cc', - 'utils/error-model.cc', - 'utils/ethernet-header.cc', - 'utils/ethernet-trailer.cc', - 'utils/flow-id-tag.cc', - 'utils/inet-socket-address.cc', - 'utils/inet6-socket-address.cc', - 'utils/ipv4-address.cc', - 'utils/ipv6-address.cc', - 'utils/mac16-address.cc', - 'utils/mac48-address.cc', - 'utils/mac64-address.cc', - 'utils/llc-snap-header.cc', - 'utils/output-stream-wrapper.cc', - 'utils/packetbb.cc', - 'utils/packet-burst.cc', - 'utils/packet-socket.cc', - 'utils/packet-socket-address.cc', - 'utils/packet-socket-factory.cc', - 'utils/pcap-file.cc', - 'utils/pcap-file-wrapper.cc', - 'utils/queue.cc', - 'utils/queue-item.cc', - 'utils/queue-limits.cc', - 'utils/queue-size.cc', - 'utils/net-device-queue-interface.cc', - 'utils/radiotap-header.cc', - 'utils/simple-channel.cc', - 'utils/simple-net-device.cc', - 'utils/sll-header.cc', - 'utils/packet-socket-client.cc', - 'utils/packet-socket-server.cc', - 'utils/packet-data-calculators.cc', - 'utils/packet-probe.cc', - 'utils/mac8-address.cc', - 'helper/application-container.cc', - 'helper/net-device-container.cc', - 'helper/node-container.cc', - 'helper/packet-socket-helper.cc', - 'helper/trace-helper.cc', - 'helper/delay-jitter-estimation.cc', - 'helper/simple-net-device-helper.cc', - ] - - network_test = bld.create_ns3_module_test_library('network') - network_test.source = [ - 'test/bit-serializer-test.cc', - 'test/buffer-test.cc', - 'test/drop-tail-queue-test-suite.cc', - 'test/error-model-test-suite.cc', - 'test/ipv6-address-test-suite.cc', - 'test/packetbb-test-suite.cc', - 'test/packet-test-suite.cc', - 'test/packet-metadata-test.cc', - 'test/pcap-file-test-suite.cc', - 'test/sequence-number-test-suite.cc', - 'test/packet-socket-apps-test-suite.cc', - 'test/lollipop-counter-test.cc', - 'test/test-data-rate.cc', - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - network_test.source.extend([ - # 'test/network-examples-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'network' - headers.source = [ - 'model/address.h', - 'model/application.h', - 'model/buffer.h', - 'model/byte-tag-list.h', - 'model/channel.h', - 'model/channel-list.h', - 'model/chunk.h', - 'model/header.h', - 'model/net-device.h', - 'model/nix-vector.h', - 'model/node.h', - 'model/node-list.h', - 'model/packet.h', - 'model/packet-metadata.h', - 'model/packet-tag-list.h', - 'model/socket.h', - 'model/socket-factory.h', - 'model/tag.h', - 'model/tag-buffer.h', - 'model/trailer.h', - 'utils/address-utils.h', - 'utils/bit-deserializer.h', - 'utils/bit-serializer.h', - 'utils/crc32.h', - 'utils/data-rate.h', - 'utils/drop-tail-queue.h', - 'utils/dynamic-queue-limits.h', - 'utils/error-channel.h', - 'utils/error-model.h', - 'utils/ethernet-header.h', - 'utils/ethernet-trailer.h', - 'utils/flow-id-tag.h', - 'utils/inet-socket-address.h', - 'utils/inet6-socket-address.h', - 'utils/ipv4-address.h', - 'utils/ipv6-address.h', - 'utils/llc-snap-header.h', - 'utils/mac16-address.h', - 'utils/mac48-address.h', - 'utils/mac64-address.h', - 'utils/output-stream-wrapper.h', - 'utils/packetbb.h', - 'utils/packet-burst.h', - 'utils/packet-socket.h', - 'utils/packet-socket-address.h', - 'utils/packet-socket-factory.h', - 'utils/pcap-file.h', - 'utils/pcap-file-wrapper.h', - 'utils/generic-phy.h', - 'utils/queue.h', - 'utils/queue-item.h', - 'utils/queue-limits.h', - 'utils/queue-size.h', - 'utils/net-device-queue-interface.h', - 'utils/radiotap-header.h', - 'utils/sequence-number.h', - 'utils/simple-channel.h', - 'utils/simple-net-device.h', - 'utils/sll-header.h', - 'utils/packet-socket-client.h', - 'utils/packet-socket-server.h', - 'utils/pcap-test.h', - 'utils/packet-data-calculators.h', - 'utils/packet-probe.h', - 'utils/mac8-address.h', - 'utils/lollipop-counter.h', - 'helper/application-container.h', - 'helper/net-device-container.h', - 'helper/node-container.h', - 'helper/packet-socket-helper.h', - 'helper/trace-helper.h', - 'helper/delay-jitter-estimation.h', - 'helper/simple-net-device-helper.h', - ] - - if (bld.env['ENABLE_EXAMPLES']): - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/nix-vector-routing/examples/wscript b/src/nix-vector-routing/examples/wscript deleted file mode 100644 index 64c3b01fe..000000000 --- a/src/nix-vector-routing/examples/wscript +++ /dev/null @@ -1,18 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('nix-simple', - ['point-to-point', 'applications', 'internet', 'nix-vector-routing']) - obj.source = 'nix-simple.cc' - - obj = bld.create_ns3_program('nms-p2p-nix', - ['point-to-point', 'applications', 'internet', 'nix-vector-routing']) - obj.source = 'nms-p2p-nix.cc' - - obj = bld.create_ns3_program('nix-simple-multi-address', - ['point-to-point', 'applications', 'internet', 'nix-vector-routing']) - obj.source = 'nix-simple-multi-address.cc' - - obj = bld.create_ns3_program('nix-double-wifi', - ['point-to-point', 'wifi', 'applications', 'internet', 'nix-vector-routing']) - obj.source = 'nix-double-wifi.cc' \ No newline at end of file diff --git a/src/nix-vector-routing/wscript b/src/nix-vector-routing/wscript deleted file mode 100644 index 843068f99..000000000 --- a/src/nix-vector-routing/wscript +++ /dev/null @@ -1,30 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - module = bld.create_ns3_module('nix-vector-routing', ['internet']) - module.includes = '.' - module.source = [ - 'model/nix-vector-routing.cc', - 'helper/nix-vector-helper.cc', - ] - - nix_vector_test = bld.create_ns3_module_test_library('nix-vector-routing') - nix_vector_test.source = [ - 'test/nix-test.cc', - ] - - headers = bld(features='ns3header') - headers.module = 'nix-vector-routing' - headers.source = [ - 'model/nix-vector-routing.h', - 'helper/nix-vector-helper.h', - ] - headers.deprecated = [ - 'model/ipv4-nix-vector-routing.h', - 'helper/ipv4-nix-vector-helper.h', - ] - - if bld.env['ENABLE_EXAMPLES']: - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/olsr/examples/wscript b/src/olsr/examples/wscript deleted file mode 100644 index 35a0d90e4..000000000 --- a/src/olsr/examples/wscript +++ /dev/null @@ -1,10 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('simple-point-to-point-olsr', - ['point-to-point', 'internet', 'olsr', 'applications', 'wifi']) - obj.source = 'simple-point-to-point-olsr.cc' - - obj = bld.create_ns3_program('olsr-hna', - ['core', 'mobility', 'wifi', 'csma', 'olsr']) - obj.source = 'olsr-hna.cc' diff --git a/src/olsr/wscript b/src/olsr/wscript deleted file mode 100644 index 999e39cea..000000000 --- a/src/olsr/wscript +++ /dev/null @@ -1,43 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - module = bld.create_ns3_module('olsr', ['internet']) - module.includes = '.' - module.source = [ - 'model/olsr-header.cc', - 'model/olsr-state.cc', - 'model/olsr-routing-protocol.cc', - 'helper/olsr-helper.cc', - ] - - module_test = bld.create_ns3_module_test_library('olsr') - module_test.source = [ - 'test/bug780-test.cc', - 'test/hello-regression-test.cc', - 'test/olsr-header-test-suite.cc', - 'test/regression-test-suite.cc', - 'test/olsr-routing-protocol-test-suite.cc', - 'test/tc-regression-test.cc', - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - module_test.source.extend([ - # 'test/olsr-examples-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'olsr' - headers.source = [ - 'model/olsr-routing-protocol.h', - 'model/olsr-header.h', - 'model/olsr-state.h', - 'model/olsr-repositories.h', - 'helper/olsr-helper.h', - ] - - - if bld.env['ENABLE_EXAMPLES']: - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/openflow/examples/wscript b/src/openflow/examples/wscript deleted file mode 100644 index 23bb252fe..000000000 --- a/src/openflow/examples/wscript +++ /dev/null @@ -1,6 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('openflow-switch', - ['openflow', 'csma', 'internet', 'applications']) - obj.source = 'openflow-switch.cc' diff --git a/src/openflow/wscript b/src/openflow/wscript deleted file mode 100644 index fb31549b0..000000000 --- a/src/openflow/wscript +++ /dev/null @@ -1,164 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -import os -from waflib import Logs, Options -from waflib.Errors import WafError - -def options(opt): - opt.add_option('--with-openflow', - help=('Path to OFSID source for NS-3 OpenFlow Integration support'), - default='', dest='with_openflow') - -def configure(conf): - if Options.options.with_openflow: - if os.path.isdir(Options.options.with_openflow): - conf.msg("Checking for OpenFlow location", ("%s (given)" % Options.options.with_openflow)) - conf.env['WITH_OPENFLOW'] = os.path.abspath(Options.options.with_openflow) - else: - # bake.py uses ../../build, while ns-3-dev uses ../openflow. - lib_to_check = 'libopenflow.a' - openflow_bake_build_dir = os.path.join('..', '..', 'build') - openflow_bake_lib_dir = os.path.join(openflow_bake_build_dir, 'lib') - openflow_dir = os.path.join('..','openflow') - if os.path.exists(os.path.join(openflow_bake_lib_dir, lib_to_check)): - conf.msg("Checking for OpenFlow location",("%s (guessed)" % openflow_bake_build_dir)) - conf.env['WITH_OPENFLOW'] = os.path.abspath(openflow_bake_build_dir) - elif os.path.isdir(openflow_dir): - conf.msg("Checking for OpenFlow location", ("%s (guessed)" % openflow_dir)) - conf.env['WITH_OPENFLOW'] = os.path.abspath(openflow_dir) - del openflow_bake_build_dir - del openflow_bake_lib_dir - del openflow_dir - if not conf.env['WITH_OPENFLOW']: - conf.msg("Checking for OpenFlow location", False) - conf.report_optional_feature("openflow", "NS-3 OpenFlow Integration", False, - "OpenFlow not enabled (see option --with-openflow)") - # Add this module to the list of modules that won't be built - # if they are enabled. - conf.env['MODULES_NOT_BUILT'].append('openflow') - return - - if not conf.require_boost_incs('openflow', 'NS-3 OpenFlow Integration'): - conf.env['MODULES_NOT_BUILT'].append('openflow') - return - - test_code = ''' -#include "openflow/openflow.h" -#include "openflow/nicira-ext.h" -#include "openflow/ericsson-ext.h" - -extern "C" -{ -#define private _private -#define delete _delete -#define list List - -#include "openflow/private/csum.h" -#include "openflow/private/poll-loop.h" -#include "openflow/private/rconn.h" -#include "openflow/private/stp.h" -#include "openflow/private/vconn.h" -#include "openflow/private/xtoxll.h" - -#include "openflow/private/chain.h" -#include "openflow/private/table.h" -#include "openflow/private/datapath.h" // The functions below are defined in datapath.c -uint32_t save_buffer (ofpbuf *); -ofpbuf * retrieve_buffer (uint32_t id); -void discard_buffer (uint32_t id); -#include "openflow/private/dp_act.h" // The functions below are defined in dp_act.c -void set_vlan_vid (ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *ah); -void set_vlan_pcp (ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *ah); -void strip_vlan (ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *ah); -void set_dl_addr (ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *ah); -void set_nw_addr (ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *ah); -void set_tp_port (ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *ah); -void set_mpls_label (ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *ah); -void set_mpls_exp (ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *ah); -#include "openflow/private/pt_act.h" // The function below is defined in pt_act.c -void update_checksums (ofpbuf *buffer, const sw_flow_key *key, uint32_t old_word, uint32_t new_word); - -#undef list -#undef private -#undef delete -} - -int main() -{ - return 0; -} -''' - conf.env['HAVE_DL'] = conf.check(mandatory=True, lib='dl', define_name='HAVE_DL', uselib_store='DL') - - conf.env.append_value('NS3_MODULE_PATH',os.path.abspath(os.path.join(conf.env['WITH_OPENFLOW'],'build'))) - conf.env.append_value('NS3_MODULE_PATH',os.path.abspath(os.path.join(conf.env['WITH_OPENFLOW'],'lib'))) - - conf.env['INCLUDES_OPENFLOW'] = [ - os.path.abspath(os.path.join(conf.env['WITH_OPENFLOW'],'include'))] - conf.env['LIBPATH_OPENFLOW'] = [ - os.path.abspath(os.path.join(conf.env['WITH_OPENFLOW'],'build')), - os.path.abspath(os.path.join(conf.env['WITH_OPENFLOW'],'lib'))] - - conf.env['DEFINES_OPENFLOW'] = ['NS3_OPENFLOW'] - - conf.env['OPENFLOW'] = conf.check_nonfatal(fragment=test_code, lib='openflow', - libpath=conf.env['LIBPATH_OPENFLOW'], - use='OPENFLOW DL') - conf.env.append_value('LIB_OPENFLOW', 'dl') - conf.report_optional_feature("openflow", "NS-3 OpenFlow Integration", - conf.env['OPENFLOW'], "openflow library not found") - if conf.env['OPENFLOW']: - conf.env['ENABLE_OPENFLOW'] = True - # Openflow library has some strncpy() usage that can trigger warnings - if conf.env['BUILD_PROFILE'] == 'optimized': - conf.env.append_value('CXXFLAGS', '-Wno-stringop-truncation') - else: - # Add this module to the list of modules that won't be built - # if they are enabled. - conf.env['MODULES_NOT_BUILT'].append('openflow') - - - -def build(bld): - # Don't do anything for this module if openflow's not enabled. - if 'openflow' in bld.env['MODULES_NOT_BUILT']: - return - - # Build the Switch module - obj = bld.create_ns3_module('openflow', ['internet']) - obj.use.append('BOOST') - obj.source = [ - ] - - obj_test = bld.create_ns3_module_test_library('openflow') - obj_test.source = [ - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - obj_test.source.extend([ - # 'test/openflow-examples-test-suite.cc', - ]) - - if bld.env['OPENFLOW'] and bld.env['HAVE_DL']: - obj.use.extend('OPENFLOW DL'.split()) - obj_test.use.extend('OPENFLOW DL'.split()) - - headers = bld(features='ns3header') - headers.module = 'openflow' - headers.source = [ - ] - - if bld.env['ENABLE_OPENFLOW']: - obj.source.append('model/openflow-interface.cc') - obj.source.append('model/openflow-switch-net-device.cc') - obj.source.append('helper/openflow-switch-helper.cc') - - obj.env.append_value('DEFINES', 'NS3_OPENFLOW') - obj_test.source.append('test/openflow-switch-test-suite.cc') - headers.source.append('model/openflow-interface.h') - headers.source.append('model/openflow-switch-net-device.h') - headers.source.append('helper/openflow-switch-helper.h') - - if bld.env['ENABLE_EXAMPLES'] and bld.env['ENABLE_OPENFLOW']: - bld.recurse('examples') diff --git a/src/point-to-point-layout/wscript b/src/point-to-point-layout/wscript deleted file mode 100644 index 7f12619fe..000000000 --- a/src/point-to-point-layout/wscript +++ /dev/null @@ -1,23 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - module = bld.create_ns3_module('point-to-point-layout', ['internet', 'point-to-point', 'mobility']) - module.includes = '.' - module.source = [ - 'model/point-to-point-dumbbell.cc', - 'model/point-to-point-grid.cc', - 'model/point-to-point-star.cc', - ] - - headers = bld(features='ns3header') - headers.module = 'point-to-point-layout' - headers.source = [ - 'model/point-to-point-dumbbell.h', - 'model/point-to-point-grid.h', - 'model/point-to-point-star.h', - ] - - bld.ns3_python_bindings() - - - diff --git a/src/point-to-point/examples/wscript b/src/point-to-point/examples/wscript deleted file mode 100644 index 8f561292e..000000000 --- a/src/point-to-point/examples/wscript +++ /dev/null @@ -1,8 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - if not bld.env['ENABLE_EXAMPLES']: - return; - - obj = bld.create_ns3_program('main-attribute-value', ['network', 'point-to-point']) - obj.source = 'main-attribute-value.cc' diff --git a/src/point-to-point/wscript b/src/point-to-point/wscript deleted file mode 100644 index 014004ebd..000000000 --- a/src/point-to-point/wscript +++ /dev/null @@ -1,43 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - - -def build(bld): - if bld.env['ENABLE_MPI']: - module = bld.create_ns3_module('point-to-point', ['network', 'mpi']) - else: - module = bld.create_ns3_module('point-to-point', ['network']) - module.source = [ - 'model/point-to-point-net-device.cc', - 'model/point-to-point-channel.cc', - 'model/ppp-header.cc', - 'helper/point-to-point-helper.cc', - ] - if bld.env['ENABLE_MPI']: - module.source.append('model/point-to-point-remote-channel.cc') - - module_test = bld.create_ns3_module_test_library('point-to-point') - module_test.source = [ - 'test/point-to-point-test.cc', - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - module_test.source.extend([ - # 'test/point-to-point-examples-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'point-to-point' - headers.source = [ - 'model/point-to-point-net-device.h', - 'model/point-to-point-channel.h', - 'model/ppp-header.h', - 'helper/point-to-point-helper.h', - ] - if bld.env['ENABLE_MPI']: - headers.source.append('model/point-to-point-remote-channel.h') - - if (bld.env['ENABLE_EXAMPLES']): - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/propagation/examples/wscript b/src/propagation/examples/wscript deleted file mode 100644 index f14ab9c5b..000000000 --- a/src/propagation/examples/wscript +++ /dev/null @@ -1,13 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - if not bld.env['ENABLE_EXAMPLES']: - return; - - obj = bld.create_ns3_program('main-propagation-loss', - ['core', 'mobility', 'config-store', 'stats', 'propagation', 'buildings']) - obj.source = 'main-propagation-loss.cc' - - obj = bld.create_ns3_program('jakes-propagation-model-example', - ['core', 'propagation', 'buildings']) - obj.source = 'jakes-propagation-model-example.cc' diff --git a/src/propagation/wscript b/src/propagation/wscript deleted file mode 100644 index 46db9d579..000000000 --- a/src/propagation/wscript +++ /dev/null @@ -1,63 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - module = bld.create_ns3_module('propagation', ['network', 'mobility']) - module.includes = '.' - module.source = [ - 'model/propagation-delay-model.cc', - 'model/propagation-loss-model.cc', - 'model/jakes-propagation-loss-model.cc', - 'model/jakes-process.cc', - 'model/cost231-propagation-loss-model.cc', - 'model/okumura-hata-propagation-loss-model.cc', - 'model/itu-r-1411-los-propagation-loss-model.cc', - 'model/itu-r-1411-nlos-over-rooftop-propagation-loss-model.cc', - 'model/kun-2600-mhz-propagation-loss-model.cc', - 'model/channel-condition-model.cc', - 'model/probabilistic-v2v-channel-condition-model.cc', - 'model/three-gpp-propagation-loss-model.cc', - 'model/three-gpp-v2v-propagation-loss-model.cc', - ] - - module_test = bld.create_ns3_module_test_library('propagation') - module_test.source = [ - 'test/propagation-loss-model-test-suite.cc', - 'test/okumura-hata-test-suite.cc', - 'test/itu-r-1411-los-test-suite.cc', - 'test/kun-2600-mhz-test-suite.cc', - 'test/itu-r-1411-nlos-over-rooftop-test-suite.cc', - 'test/channel-condition-model-test-suite.cc', - 'test/three-gpp-propagation-loss-model-test-suite.cc', - 'test/probabilistic-v2v-channel-condition-model-test.cc', - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - module_test.source.extend([ - # 'test/propagation-examples-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'propagation' - headers.source = [ - 'model/propagation-delay-model.h', - 'model/propagation-loss-model.h', - 'model/jakes-propagation-loss-model.h', - 'model/jakes-process.h', - 'model/propagation-cache.h', - 'model/cost231-propagation-loss-model.h', - 'model/propagation-environment.h', - 'model/okumura-hata-propagation-loss-model.h', - 'model/itu-r-1411-los-propagation-loss-model.h', - 'model/itu-r-1411-nlos-over-rooftop-propagation-loss-model.h', - 'model/kun-2600-mhz-propagation-loss-model.h', - 'model/channel-condition-model.h', - 'model/probabilistic-v2v-channel-condition-model.h', - 'model/three-gpp-propagation-loss-model.h', - 'model/three-gpp-v2v-propagation-loss-model.h', - ] - - if (bld.env['ENABLE_EXAMPLES']): - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/sixlowpan/examples/wscript b/src/sixlowpan/examples/wscript deleted file mode 100644 index 915b22320..000000000 --- a/src/sixlowpan/examples/wscript +++ /dev/null @@ -1,21 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - if not bld.env['ENABLE_EXAMPLES']: - return; - - obj = bld.create_ns3_program('example-sixlowpan', - ['network', 'sixlowpan', 'internet', 'csma', 'internet-apps']) - obj.source = 'example-sixlowpan.cc' - - obj = bld.create_ns3_program('example-ping-lr-wpan', - ['network', 'sixlowpan', 'internet', 'lr-wpan', 'internet-apps']) - obj.source = 'example-ping-lr-wpan.cc' - - obj = bld.create_ns3_program('example-ping-lr-wpan-beacon', - ['network', 'sixlowpan', 'internet', 'lr-wpan', 'internet-apps']) - obj.source = 'example-ping-lr-wpan-beacon.cc' - - obj = bld.create_ns3_program('example-ping-lr-wpan-mesh-under', - ['network', 'sixlowpan', 'internet', 'lr-wpan', 'internet-apps', 'csma']) - obj.source = 'example-ping-lr-wpan-mesh-under.cc' diff --git a/src/sixlowpan/wscript b/src/sixlowpan/wscript deleted file mode 100644 index 6e51db111..000000000 --- a/src/sixlowpan/wscript +++ /dev/null @@ -1,40 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - module = bld.create_ns3_module('sixlowpan', ['internet', 'network', 'core']) - module.includes = '.' - module.source = [ - 'model/sixlowpan-net-device.cc', - 'model/sixlowpan-header.cc', - 'helper/sixlowpan-helper.cc', - ] - - module_test = bld.create_ns3_module_test_library('sixlowpan') - module_test.source = [ - 'test/mock-net-device.cc', - 'test/sixlowpan-hc1-test.cc', - 'test/sixlowpan-iphc-test.cc', - 'test/sixlowpan-iphc-stateful-test.cc', - 'test/sixlowpan-fragmentation-test.cc', - ] - - # This suite runs an example, only include if examples are built - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - module_test.source.extend([ - 'test/sixlowpan-examples-test-suite.cc', - ]) - - headers = bld(features=['ns3header']) - headers.module = 'sixlowpan' - headers.source = [ - 'model/sixlowpan-net-device.h', - 'model/sixlowpan-header.h', - 'helper/sixlowpan-helper.h', - ] - - - if (bld.env['ENABLE_EXAMPLES']): - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/spectrum/examples/wscript b/src/spectrum/examples/wscript deleted file mode 100644 index ef054b144..000000000 --- a/src/spectrum/examples/wscript +++ /dev/null @@ -1,26 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('adhoc-aloha-ideal-phy', - ['spectrum', 'mobility', 'internet', 'applications']) - obj.source = 'adhoc-aloha-ideal-phy.cc' - - obj = bld.create_ns3_program('adhoc-aloha-ideal-phy-matrix-propagation-loss-model', - ['spectrum', 'mobility', 'internet', 'applications']) - obj.source = 'adhoc-aloha-ideal-phy-matrix-propagation-loss-model.cc' - - obj = bld.create_ns3_program('adhoc-aloha-ideal-phy-with-microwave-oven', - ['spectrum', 'mobility', 'internet', 'applications']) - obj.source = 'adhoc-aloha-ideal-phy-with-microwave-oven.cc' - - obj = bld.create_ns3_program('tv-trans-example', - ['spectrum', 'mobility', 'core']) - obj.source = 'tv-trans-example.cc' - - obj = bld.create_ns3_program('tv-trans-regional-example', - ['spectrum', 'mobility', 'core']) - obj.source = 'tv-trans-regional-example.cc' - - obj = bld.create_ns3_program('three-gpp-channel-example', - ['spectrum', 'mobility', 'core', 'lte']) - obj.source = 'three-gpp-channel-example.cc' diff --git a/src/spectrum/wscript b/src/spectrum/wscript deleted file mode 100644 index a7346ff24..000000000 --- a/src/spectrum/wscript +++ /dev/null @@ -1,106 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - - module = bld.create_ns3_module('spectrum', ['propagation', 'antenna']) - module.source = [ - 'model/spectrum-model.cc', - 'model/spectrum-value.cc', - 'model/spectrum-converter.cc', - 'model/spectrum-signal-parameters.cc', - 'model/spectrum-propagation-loss-model.cc', - 'model/phased-array-spectrum-propagation-loss-model.cc', - 'model/friis-spectrum-propagation-loss.cc', - 'model/constant-spectrum-propagation-loss.cc', - 'model/spectrum-phy.cc', - 'model/spectrum-channel.cc', - 'model/single-model-spectrum-channel.cc', - 'model/multi-model-spectrum-channel.cc', - 'model/spectrum-interference.cc', - 'model/spectrum-error-model.cc', - 'model/spectrum-model-ism2400MHz-res1MHz.cc', - 'model/spectrum-model-300kHz-300GHz-log.cc', - 'model/wifi-spectrum-value-helper.cc', - 'model/waveform-generator.cc', - 'model/spectrum-analyzer.cc', - 'model/aloha-noack-mac-header.cc', - 'model/aloha-noack-net-device.cc', - 'model/half-duplex-ideal-phy.cc', - 'model/half-duplex-ideal-phy-signal-parameters.cc', - 'model/non-communicating-net-device.cc', - 'model/microwave-oven-spectrum-value-helper.cc', - 'model/tv-spectrum-transmitter.cc', - 'model/trace-fading-loss-model.cc', - 'model/three-gpp-spectrum-propagation-loss-model.cc', - 'model/three-gpp-channel-model.cc', - 'model/matrix-based-channel-model.cc', - 'helper/spectrum-helper.cc', - 'helper/adhoc-aloha-noack-ideal-phy-helper.cc', - 'helper/waveform-generator-helper.cc', - 'helper/spectrum-analyzer-helper.cc', - 'helper/tv-spectrum-transmitter-helper.cc', - ] - - module_test = bld.create_ns3_module_test_library('spectrum') - module_test.source = [ - 'test/spectrum-interference-test.cc', - 'test/spectrum-value-test.cc', - 'test/spectrum-ideal-phy-test.cc', - 'test/spectrum-waveform-generator-test.cc', - 'test/tv-helper-distribution-test.cc', - 'test/tv-spectrum-transmitter-test.cc', - 'test/three-gpp-channel-test-suite.cc', - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - module_test.source.extend([ - # 'test/spectrum-examples-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'spectrum' - headers.source = [ - 'model/spectrum-model.h', - 'model/spectrum-value.h', - 'model/spectrum-converter.h', - 'model/spectrum-signal-parameters.h', - 'model/spectrum-propagation-loss-model.h', - 'model/phased-array-spectrum-propagation-loss-model.h', - 'model/friis-spectrum-propagation-loss.h', - 'model/constant-spectrum-propagation-loss.h', - 'model/spectrum-phy.h', - 'model/spectrum-channel.h', - 'model/single-model-spectrum-channel.h', - 'model/multi-model-spectrum-channel.h', - 'model/spectrum-interference.h', - 'model/spectrum-error-model.h', - 'model/spectrum-model-ism2400MHz-res1MHz.h', - 'model/spectrum-model-300kHz-300GHz-log.h', - 'model/wifi-spectrum-value-helper.h', - 'model/waveform-generator.h', - 'model/spectrum-analyzer.h', - 'model/aloha-noack-mac-header.h', - 'model/aloha-noack-net-device.h', - 'model/half-duplex-ideal-phy.h', - 'model/half-duplex-ideal-phy-signal-parameters.h', - 'model/non-communicating-net-device.h', - 'model/microwave-oven-spectrum-value-helper.h', - 'model/tv-spectrum-transmitter.h', - 'model/trace-fading-loss-model.h', - 'model/three-gpp-spectrum-propagation-loss-model.h', - 'model/three-gpp-channel-model.h', - 'model/matrix-based-channel-model.h', - 'helper/spectrum-helper.h', - 'helper/adhoc-aloha-noack-ideal-phy-helper.h', - 'helper/waveform-generator-helper.h', - 'helper/spectrum-analyzer-helper.h', - 'helper/tv-spectrum-transmitter-helper.h', - 'test/spectrum-test.h', - ] - - if (bld.env['ENABLE_EXAMPLES']): - bld.recurse('examples') - - - bld.ns3_python_bindings() diff --git a/src/stats/doc/probe.rst b/src/stats/doc/probe.rst index 3543838d1..43dbc0939 100644 --- a/src/stats/doc/probe.rst +++ b/src/stats/doc/probe.rst @@ -184,7 +184,7 @@ users to temporarily insert Probe statements like `printf` statements within existing |ns3| models. Note that in order to be able to use the DoubleProbe in this example like this, 2 things were necessary: 1. the stats module header file was included in the example .cc file -2. the example was made dependent on the stats module in its wscript file. +2. the example was made dependent on the stats module in its CMakeLists.txt file. Analogous things need to be done in order to add other Probes in other places in the |ns3| code base. diff --git a/src/stats/examples/wscript b/src/stats/examples/wscript deleted file mode 100644 index d0006f657..000000000 --- a/src/stats/examples/wscript +++ /dev/null @@ -1,28 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - if not bld.env['ENABLE_EXAMPLES']: - return; - - obj = bld.create_ns3_program('gnuplot-example', ['network', 'stats']) - obj.source = 'gnuplot-example.cc' - - program = bld.create_ns3_program('double-probe-example', ['network', 'stats']) - program.source = 'double-probe-example.cc' - - program = bld.create_ns3_program('time-probe-example', ['stats']) - program.source = 'time-probe-example.cc' - - program = bld.create_ns3_program('gnuplot-aggregator-example', ['network', 'stats']) - program.source = 'gnuplot-aggregator-example.cc' - - program = bld.create_ns3_program('gnuplot-helper-example', ['network', 'stats']) - program.source = 'gnuplot-helper-example.cc' - - program = bld.create_ns3_program('file-aggregator-example', ['network', 'stats']) - program.source = 'file-aggregator-example.cc' - - program = bld.create_ns3_program('file-helper-example', ['network', 'stats']) - program.source = 'file-helper-example.cc' - - diff --git a/src/stats/wscript b/src/stats/wscript deleted file mode 100644 index e90fe29bb..000000000 --- a/src/stats/wscript +++ /dev/null @@ -1,95 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def configure(conf): - have_sqlite3 = conf.check_cfg(package='sqlite3', uselib_store='SQLITE3', - args=['--cflags', '--libs'], - mandatory=False) - - conf.env['SQLITE_STATS'] = have_sqlite3 - have_sem = conf.check_nonfatal(header_name='semaphore.h', define_name='HAVE_SEMAPHORE_H') - conf.env['SEMAPHORE_ENABLED'] = have_sem - conf.report_optional_feature("SQLiteStats", "SQLite stats support", - conf.env['SQLITE_STATS'] and conf.env['SEMAPHORE_ENABLED'], - "library 'sqlite3' and/or semaphore.h not found") - -def build(bld): - obj = bld.create_ns3_module('stats', ['core']) - obj.source = [ - 'helper/file-helper.cc', - 'helper/gnuplot-helper.cc', - 'model/data-calculator.cc', - 'model/time-data-calculators.cc', - 'model/data-output-interface.cc', - 'model/omnet-data-output.cc', - 'model/data-collector.cc', - 'model/gnuplot.cc', - 'model/data-collection-object.cc', - 'model/probe.cc', - 'model/boolean-probe.cc', - 'model/double-probe.cc', - 'model/time-probe.cc', - 'model/uinteger-8-probe.cc', - 'model/uinteger-16-probe.cc', - 'model/uinteger-32-probe.cc', - 'model/time-series-adaptor.cc', - 'model/file-aggregator.cc', - 'model/gnuplot-aggregator.cc', - 'model/get-wildcard-matches.cc', - 'model/histogram.cc', - ] - - module_test = bld.create_ns3_module_test_library('stats') - module_test.source = [ - 'test/basic-data-calculators-test-suite.cc', - 'test/average-test-suite.cc', - 'test/double-probe-test-suite.cc', - 'test/histogram-test-suite.cc', - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - module_test.source.extend([ - # 'test/stats-examples-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'stats' - headers.source = [ - 'helper/file-helper.h', - 'helper/gnuplot-helper.h', - 'model/data-calculator.h', - 'model/time-data-calculators.h', - 'model/basic-data-calculators.h', - 'model/data-output-interface.h', - 'model/omnet-data-output.h', - 'model/data-collector.h', - 'model/gnuplot.h', - 'model/average.h', - 'model/data-collection-object.h', - 'model/probe.h', - 'model/boolean-probe.h', - 'model/double-probe.h', - 'model/time-probe.h', - 'model/uinteger-8-probe.h', - 'model/uinteger-16-probe.h', - 'model/uinteger-32-probe.h', - 'model/time-series-adaptor.h', - 'model/file-aggregator.h', - 'model/gnuplot-aggregator.h', - 'model/get-wildcard-matches.h', - 'model/histogram.h', - ] - - if bld.env['SQLITE_STATS']: - headers.source.append('model/sqlite-data-output.h') - obj.source.append('model/sqlite-data-output.cc') - obj.use.append('SQLITE3') - - if bld.env['SQLITE_STATS'] and bld.env['SEMAPHORE_ENABLED']: - obj.source.append('model/sqlite-output.cc') - headers.source.append('model/sqlite-output.h') - - if (bld.env['ENABLE_EXAMPLES']): - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/tap-bridge/examples/wscript b/src/tap-bridge/examples/wscript deleted file mode 100644 index bf3865a66..000000000 --- a/src/tap-bridge/examples/wscript +++ /dev/null @@ -1,15 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - env = bld.env - if env['ENABLE_TAP']: - obj = bld.create_ns3_program('tap-csma', ['csma', 'tap-bridge', 'internet', 'wifi']) - obj.source = 'tap-csma.cc' - obj = bld.create_ns3_program('tap-csma-virtual-machine', ['csma', 'tap-bridge', 'internet']) - obj.source = 'tap-csma-virtual-machine.cc' - bld.register_ns3_script('tap-csma-virtual-machine.py', ['csma', 'tap-bridge', 'internet']) - obj = bld.create_ns3_program('tap-wifi-virtual-machine', ['csma', 'tap-bridge', 'internet', 'wifi', 'mobility']) - obj.source = 'tap-wifi-virtual-machine.cc' - bld.register_ns3_script('tap-wifi-virtual-machine.py', ['csma', 'tap-bridge', 'internet', 'wifi', 'mobility']) - obj = bld.create_ns3_program('tap-wifi-dumbbell', ['wifi', 'csma', 'point-to-point', 'tap-bridge', 'internet', 'applications']) - obj.source = 'tap-wifi-dumbbell.cc' diff --git a/src/tap-bridge/wscript b/src/tap-bridge/wscript deleted file mode 100644 index 3d7acc04d..000000000 --- a/src/tap-bridge/wscript +++ /dev/null @@ -1,57 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -import os.path - -def configure(conf): - if conf.env['ENABLE_THREADING']: - conf.env['ENABLE_TAP'] = conf.check_nonfatal(header_name='linux/if_tun.h', - define_name='HAVE_IF_TUN_H') - conf.report_optional_feature("TapBridge", "Tap Bridge", - conf.env['ENABLE_TAP'], - " include not detected") - else: - conf.report_optional_feature("TapBridge", "Tap Bridge", - False, - "needs threading support which is not available") - - if conf.env['ENABLE_TAP']: - blddir = os.path.abspath(os.path.join(conf.bldnode.abspath(), conf.variant)) - tapcreatordir = os.path.abspath(os.path.join(blddir, "src/tap-bridge")) - conf.env.append_value('NS3_EXECUTABLE_PATH', tapcreatordir) - else: - # Add this module to the list of modules that won't be built - # if they are enabled. - conf.env['MODULES_NOT_BUILT'].append('tap-bridge') - -def build(bld): - # Don't do anything for this module if tap-bridge's not enabled. - if not bld.env['ENABLE_TAP']: - return - - module = bld.create_ns3_module('tap-bridge', ['internet', 'network', 'core']) - module.source = [ - 'model/tap-bridge.cc', - 'model/tap-encode-decode.cc', - 'helper/tap-bridge-helper.cc', - ] - headers = bld(features='ns3header') - headers.module = 'tap-bridge' - headers.source = [ - 'model/tap-bridge.h', - 'helper/tap-bridge-helper.h', - 'doc/tap.h', - ] - - if not bld.env['PLATFORM'].startswith('freebsd'): - tap_creator = bld.create_suid_program('tap-creator') - tap_creator.source = [ - 'model/tap-creator.cc', - 'model/tap-encode-decode.cc', - ] - - module.env.append_value("DEFINES", "TAP_CREATOR=\"%s\"" % (tap_creator.target,)) - - if bld.env['ENABLE_EXAMPLES']: - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/test/wscript b/src/test/wscript deleted file mode 100644 index 48bf7be7c..000000000 --- a/src/test/wscript +++ /dev/null @@ -1,55 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -import sys - -def configure(conf): - # Add the test module to the list of enabled modules that should - # not be built if this is a static build on Darwin. They don't - # work there for the test module, and this is probably because the - # test module has no source files. - if conf.env['ENABLE_STATIC_NS3'] and sys.platform == 'darwin': - conf.env['MODULES_NOT_BUILT'].append('test') - -def build(bld): - # Don't do anything for this module if it should not be built. - if 'test' in bld.env['MODULES_NOT_BUILT']: - return - - test = bld.create_ns3_module('test', - ['applications', 'bridge', 'config-store', - 'csma', 'csma-layout', 'dsr', - 'flow-monitor', 'internet', 'lr-wpan', - 'lte', 'mesh', 'mobility', 'olsr', - 'point-to-point', 'sixlowpan', 'stats', - 'uan', 'wifi', 'internet-apps', - 'point-to-point-layout', 'traffic-control']) - - headers = bld(features='ns3header') - headers.module = 'test' - - test_test = bld.create_ns3_module_test_library('test') - test_test.source = [ - 'csma-system-test-suite.cc', - 'ns3tc/fq-codel-queue-disc-test-suite.cc', - 'ns3tc/fq-cobalt-queue-disc-test-suite.cc', - 'ns3tc/fq-pie-queue-disc-test-suite.cc', - 'ns3tc/pfifo-fast-queue-disc-test-suite.cc', - 'ns3tcp/ns3tcp-loss-test-suite.cc', - 'ns3tcp/ns3tcp-no-delay-test-suite.cc', - 'ns3tcp/ns3tcp-socket-test-suite.cc', - 'ns3tcp/ns3tcp-state-test-suite.cc', - 'ns3tcp/ns3tcp-socket-writer.cc', - 'ns3wifi/wifi-msdu-aggregator-test-suite.cc', - 'ns3wifi/wifi-ac-mapping-test-suite.cc', - 'ns3wifi/wifi-issue-211-test-suite.cc', - 'traced/traced-callback-typedef-test-suite.cc', - 'traced/traced-value-callback-typedef-test-suite.cc', - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - test_test.source.extend([ - # 'test/test-examples-test-suite.cc', - ]) - - diff --git a/src/topology-read/examples/wscript b/src/topology-read/examples/wscript deleted file mode 100644 index 77ea06120..000000000 --- a/src/topology-read/examples/wscript +++ /dev/null @@ -1,5 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('topology-example-sim', ['topology-read', 'internet', 'nix-vector-routing', 'point-to-point', 'applications']) - obj.source = 'topology-example-sim.cc' diff --git a/src/topology-read/wscript b/src/topology-read/wscript deleted file mode 100644 index e915452af..000000000 --- a/src/topology-read/wscript +++ /dev/null @@ -1,37 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_module('topology-read', ['network']) - obj.source = [ - 'model/topology-reader.cc', - 'model/inet-topology-reader.cc', - 'model/orbis-topology-reader.cc', - 'model/rocketfuel-topology-reader.cc', - 'helper/topology-reader-helper.cc', - ] - - module_test = bld.create_ns3_module_test_library('topology-read') - module_test.source = [ - 'test/rocketfuel-topology-reader-test-suite.cc', - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - module_test.source.extend([ - # 'test/topology-examples-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'topology-read' - headers.source = [ - 'model/topology-reader.h', - 'model/inet-topology-reader.h', - 'model/orbis-topology-reader.h', - 'model/rocketfuel-topology-reader.h', - 'helper/topology-reader-helper.h', - ] - - if bld.env['ENABLE_EXAMPLES']: - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/traffic-control/examples/wscript b/src/traffic-control/examples/wscript deleted file mode 100644 index 1f738e8ca..000000000 --- a/src/traffic-control/examples/wscript +++ /dev/null @@ -1,28 +0,0 @@ -# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - pass - - obj = bld.create_ns3_program('red-tests', ['point-to-point', 'internet', 'applications', 'flow-monitor', 'traffic-control']) - obj.source = 'red-tests.cc' - - obj = bld.create_ns3_program('red-vs-ared', ['point-to-point', 'point-to-point-layout', 'internet', 'applications', 'traffic-control']) - obj.source = 'red-vs-ared.cc' - - obj = bld.create_ns3_program('adaptive-red-tests', ['point-to-point', 'internet', 'applications', 'flow-monitor', 'traffic-control']) - obj.source = 'adaptive-red-tests.cc' - - obj = bld.create_ns3_program('pfifo-vs-red', ['point-to-point', 'point-to-point-layout', 'internet', 'applications', 'traffic-control']) - obj.source = 'pfifo-vs-red.cc' - - obj = bld.create_ns3_program('codel-vs-pfifo-basic-test', ['point-to-point','network', 'internet', 'applications', 'traffic-control']) - obj.source = 'codel-vs-pfifo-basic-test.cc' - - obj = bld.create_ns3_program('codel-vs-pfifo-asymmetric', ['point-to-point','network', 'internet', 'applications', 'traffic-control', 'config-store']) - obj.source = 'codel-vs-pfifo-asymmetric.cc' - - obj = bld.create_ns3_program('pie-example', ['point-to-point', 'internet', 'applications', 'flow-monitor', 'traffic-control']) - obj.source = 'pie-example.cc' - - obj = bld.create_ns3_program('fqcodel-l4s-example', ['point-to-point', 'internet', 'applications', 'flow-monitor','internet-apps', 'traffic-control']) - obj.source = 'fqcodel-l4s-example.cc' diff --git a/src/traffic-control/wscript b/src/traffic-control/wscript deleted file mode 100644 index 18437726d..000000000 --- a/src/traffic-control/wscript +++ /dev/null @@ -1,77 +0,0 @@ -# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -# def options(opt): -# pass - -# def configure(conf): -# conf.check_nonfatal(header_name='stdint.h', define_name='HAVE_STDINT_H') - -def build(bld): - module = bld.create_ns3_module('traffic-control', ['core', 'network']) - module.source = [ - 'model/traffic-control-layer.cc', - 'model/packet-filter.cc', - 'model/queue-disc.cc', - 'model/pfifo-fast-queue-disc.cc', - 'model/fifo-queue-disc.cc', - 'model/red-queue-disc.cc', - 'model/codel-queue-disc.cc', - 'model/fq-codel-queue-disc.cc', - 'model/pie-queue-disc.cc', - 'model/fq-pie-queue-disc.cc', - 'model/prio-queue-disc.cc', - 'model/mq-queue-disc.cc', - 'model/tbf-queue-disc.cc', - 'model/cobalt-queue-disc.cc', - 'model/fq-cobalt-queue-disc.cc', - 'helper/traffic-control-helper.cc', - 'helper/queue-disc-container.cc' - ] - - module_test = bld.create_ns3_module_test_library('traffic-control') - module_test.source = [ - 'test/red-queue-disc-test-suite.cc', - 'test/codel-queue-disc-test-suite.cc', - 'test/adaptive-red-queue-disc-test-suite.cc', - 'test/pie-queue-disc-test-suite.cc', - 'test/fifo-queue-disc-test-suite.cc', - 'test/prio-queue-disc-test-suite.cc', - 'test/queue-disc-traces-test-suite.cc', - 'test/tbf-queue-disc-test-suite.cc', - 'test/tc-flow-control-test-suite.cc', - 'test/cobalt-queue-disc-test-suite.cc' - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - module_test.source.extend([ - # 'test/traffic-control-examples-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'traffic-control' - headers.source = [ - 'model/traffic-control-layer.h', - 'model/packet-filter.h', - 'model/queue-disc.h', - 'model/pfifo-fast-queue-disc.h', - 'model/fifo-queue-disc.h', - 'model/red-queue-disc.h', - 'model/codel-queue-disc.h', - 'model/fq-codel-queue-disc.h', - 'model/pie-queue-disc.h', - 'model/fq-pie-queue-disc.h', - 'model/prio-queue-disc.h', - 'model/mq-queue-disc.h', - 'model/tbf-queue-disc.h', - 'model/cobalt-queue-disc.h', - 'model/fq-cobalt-queue-disc.h', - 'helper/traffic-control-helper.h', - 'helper/queue-disc-container.h' - ] - - if bld.env.ENABLE_EXAMPLES: - bld.recurse('examples') - - bld.ns3_python_bindings() - diff --git a/src/uan/examples/wscript b/src/uan/examples/wscript deleted file mode 100644 index 165c9b0e4..000000000 --- a/src/uan/examples/wscript +++ /dev/null @@ -1,20 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('uan-cw-example', ['internet', 'mobility', 'stats', 'applications', 'uan']) - obj.source = 'uan-cw-example.cc' - - obj = bld.create_ns3_program('uan-rc-example', ['internet', 'mobility', 'stats', 'applications', 'uan']) - obj.source = 'uan-rc-example.cc' - - obj = bld.create_ns3_program ('uan-raw-example', ['internet', 'mobility', 'stats', 'uan']) - obj.source = 'uan-raw-example.cc' - - obj = bld.create_ns3_program ('uan-ipv4-example', ['internet', 'mobility', 'stats', 'uan']) - obj.source = 'uan-ipv4-example.cc' - - obj = bld.create_ns3_program ('uan-ipv6-example', ['internet', 'mobility', 'stats', 'uan']) - obj.source = 'uan-ipv6-example.cc' - - obj = bld.create_ns3_program ('uan-6lowpan-example', ['internet', 'mobility', 'stats', 'uan', 'sixlowpan']) - obj.source = 'uan-6lowpan-example.cc' diff --git a/src/uan/wscript b/src/uan/wscript deleted file mode 100644 index b89b38bbc..000000000 --- a/src/uan/wscript +++ /dev/null @@ -1,74 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - module = bld.create_ns3_module('uan', ['network', 'energy', 'mobility']) - module.source = [ - 'model/uan-channel.cc', - 'model/uan-phy-gen.cc', - 'model/uan-mac.cc', - 'model/uan-transducer.cc', - 'model/uan-transducer-hd.cc', - 'model/uan-net-device.cc', - 'model/uan-tx-mode.cc', - 'model/uan-prop-model.cc', - 'model/uan-prop-model-ideal.cc', - 'model/uan-mac-aloha.cc', - 'model/uan-header-common.cc', - 'model/uan-noise-model-default.cc', - 'model/uan-mac-cw.cc', - 'model/uan-prop-model-thorp.cc', - 'model/uan-phy-dual.cc', - 'model/uan-header-rc.cc', - 'model/uan-mac-rc.cc', - 'model/uan-mac-rc-gw.cc', - 'model/uan-phy.cc', - 'model/uan-noise-model.cc', - 'model/acoustic-modem-energy-model.cc', - 'helper/uan-helper.cc', - 'helper/acoustic-modem-energy-model-helper.cc', - ] - - module_test = bld.create_ns3_module_test_library('uan') - module_test.source = [ - 'test/uan-test.cc', - 'test/uan-energy-model-test.cc', - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - module_test.source.extend([ - # 'test/uan-examples-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'uan' - headers.source = [ - 'model/uan-channel.h', - 'model/uan-phy.h', - 'model/uan-mac.h', - 'model/uan-net-device.h', - 'model/uan-prop-model.h', - 'model/uan-tx-mode.h', - 'model/uan-transducer.h', - 'model/uan-phy-gen.h', - 'model/uan-transducer-hd.h', - 'model/uan-prop-model-ideal.h', - 'model/uan-mac-aloha.h', - 'model/uan-header-common.h', - 'model/uan-noise-model.h', - 'model/uan-noise-model-default.h', - 'model/uan-mac-cw.h', - 'model/uan-prop-model-thorp.h', - 'model/uan-phy-dual.h', - 'model/uan-header-rc.h', - 'model/uan-mac-rc.h', - 'model/acoustic-modem-energy-model.h', - 'helper/uan-helper.h', - 'helper/acoustic-modem-energy-model-helper.h', - 'model/uan-mac-rc-gw.h', - ] - - if (bld.env['ENABLE_EXAMPLES']): - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/virtual-net-device/examples/wscript b/src/virtual-net-device/examples/wscript deleted file mode 100644 index c7f81c174..000000000 --- a/src/virtual-net-device/examples/wscript +++ /dev/null @@ -1,7 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - - obj = bld.create_ns3_program('virtual-net-device', ['virtual-net-device', 'point-to-point', 'internet', 'applications']) - obj.source = 'virtual-net-device.cc' - diff --git a/src/virtual-net-device/wscript b/src/virtual-net-device/wscript deleted file mode 100644 index 95775d480..000000000 --- a/src/virtual-net-device/wscript +++ /dev/null @@ -1,18 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - - -def build(bld): - module = bld.create_ns3_module('virtual-net-device', ['network']) - module.source = [ - 'model/virtual-net-device.cc', - ] - headers = bld(features='ns3header') - headers.module = 'virtual-net-device' - headers.source = [ - 'model/virtual-net-device.h', - ] - - if bld.env['ENABLE_EXAMPLES']: - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/visualizer/wscript b/src/visualizer/wscript deleted file mode 100644 index 6dd90619a..000000000 --- a/src/visualizer/wscript +++ /dev/null @@ -1,101 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- -from waflib import Options - -required_python_modules = [ - 'gi', - 'gi.repository.GObject', - 'cairo', - 'pygraphviz', - 'gi.repository.Gtk', - 'gi.repository.Gdk', - 'gi.repository.Pango', - 'gi.repository.GooCanvas', -] - - -def configure(conf): - # If Python was explicitly disabled, then add this module to the - # list of modules that won't be built if they are enabled. - conf.env['ENABLE_PYVIZ'] = True - if not conf.check_optional_feature("python"): - conf.env['ENABLE_PYVIZ'] = False - conf.report_optional_feature("PyViz", "PyViz visualizer", - False, - "Python Bindings are needed but not enabled") - conf.env['MODULES_NOT_BUILT'].append('visualizer') - return - - modules_missing = [] - for pymod in required_python_modules: - try: - conf.check_python_module(pymod) - except conf.errors.ConfigurationError: - modules_missing.append(pymod) - if modules_missing: - conf.report_optional_feature("PyViz", "PyViz visualizer", - False, "Missing python modules: %s" % (', '.join(modules_missing),)) - conf.env['ENABLE_PYVIZ'] = False - conf.env['MODULES_NOT_BUILT'].append('visualizer') - return - - conf.report_optional_feature("PyViz", "PyViz visualizer", True, None) - - -def build(bld): - - module = bld.create_ns3_module('visualizer', ['internet', 'wifi', 'point-to-point', 'csma', 'bridge', 'wimax', 'lte', 'mesh']) - headers = bld(features='ns3header') - headers.module = 'visualizer' - - # Don't do anything more for this module if Python was explicitly - # disabled. - if not bld.env['ENABLE_PYVIZ']: - return - - headers.source = [] - - # XXX This file was added so that static builds would work on - # Darwin, which doesn't like modules with no source files. It - # would have been better to add this module to the list - # conf.env['MODULES_NOT_BUILT'] if Python bindings were not - # enabled, but it's not possible for this module to determine in - # its configure() function if Python bindings will be enabled - # because that is done by the wscript file in bindings/python that - # is parsed after this module's wscript file is parsed. - module.source = [ - 'model/dummy-file-for-static-builds.cc', - ] - - module.features += ' pyembed' - #module.env.append_value('CXXFLAGS', module.env['shlib_CXXFLAGS']) - #module.includes = '.' - - module.source.extend([ - 'model/pyviz.cc', - 'model/visual-simulator-impl.cc', - ]) - headers.source.append('model/pyviz.h') - - vissrc = [ - 'visualizer/base.py', - 'visualizer/core.py', - 'visualizer/hud.py', - 'visualizer/__init__.py', - 'visualizer/svgitem.py', - ] - pyviz = bld(features='py') - pyviz.source = vissrc - pyviz.install_path = '${PYTHONARCHDIR}/visualizer' - - visplugin_src = [ - 'visualizer/plugins/interface_statistics.py', - 'visualizer/plugins/ipv4_routing_table.py', - 'visualizer/plugins/olsr.py', - 'visualizer/plugins/show_last_packets.py', - 'visualizer/plugins/wifi_intrastructure_link.py' - ] - pyvizplug = bld(features='py') - pyvizplug.source = visplugin_src - pyvizplug.install_path = '${PYTHONARCHDIR}/visualizer/plugins' - - bld.ns3_python_bindings() diff --git a/src/wave/examples/wscript b/src/wave/examples/wscript deleted file mode 100644 index 73da89b82..000000000 --- a/src/wave/examples/wscript +++ /dev/null @@ -1,14 +0,0 @@ -# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program('wave-simple-80211p', - ['core', 'applications', 'mobility', 'network', 'wifi','wave']) - obj.source = 'wave-simple-80211p.cc' - - obj = bld.create_ns3_program('wave-simple-device', - ['core', 'applications', 'mobility', 'network', 'wifi','wave']) - obj.source = 'wave-simple-device.cc' - - obj = bld.create_ns3_program('vanet-routing-compare', - ['core', 'aodv', 'applications', 'dsr', 'dsdv', 'flow-monitor', 'mobility', 'network', 'olsr', 'propagation', 'wifi', 'wave']) - obj.source = 'vanet-routing-compare.cc' diff --git a/src/wave/wscript b/src/wave/wscript deleted file mode 100644 index ae8b64582..000000000 --- a/src/wave/wscript +++ /dev/null @@ -1,67 +0,0 @@ -# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -# def options(opt): -# pass - -# def configure(conf): -# conf.check_nonfatal(header_name='stdint.h', define_name='HAVE_STDINT_H') - -def build(bld): - module = bld.create_ns3_module('wave', ['core','wifi', 'propagation', 'internet']) - module.source = [ - 'model/wave-frame-exchange-manager.cc', - 'model/ocb-wifi-mac.cc', - 'model/vendor-specific-action.cc', - 'model/channel-coordinator.cc', - 'model/channel-scheduler.cc', - 'model/default-channel-scheduler.cc', - 'model/channel-manager.cc', - 'model/vsa-manager.cc', - 'model/bsm-application.cc', - 'model/higher-tx-tag.cc', - 'model/wave-net-device.cc', - 'helper/wave-bsm-stats.cc', - 'helper/wave-mac-helper.cc', - 'helper/wave-helper.cc', - 'helper/wifi-80211p-helper.cc', - 'helper/wave-bsm-helper.cc' - ] - - module_test = bld.create_ns3_module_test_library('wave') - module_test.source = [ - 'test/mac-extension-test-suite.cc', - 'test/ocb-test-suite.cc', - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - module_test.source.extend([ - # 'test/wave-examples-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'wave' - headers.source = [ - 'model/wave-frame-exchange-manager.h', - 'model/ocb-wifi-mac.h', - 'model/vendor-specific-action.h', - 'model/channel-coordinator.h', - 'model/channel-manager.h', - 'model/channel-scheduler.h', - 'model/default-channel-scheduler.h', - 'model/vsa-manager.h', - 'model/higher-tx-tag.h', - 'model/wave-net-device.h', - 'model/bsm-application.h', - 'helper/wave-bsm-stats.h', - 'helper/wave-mac-helper.h', - 'helper/wave-helper.h', - 'helper/wifi-80211p-helper.h', - 'helper/wave-bsm-helper.h', - ] - - if bld.env.ENABLE_EXAMPLES: - bld.recurse('examples') - - bld.ns3_python_bindings() - diff --git a/src/wifi/examples/wscript b/src/wifi/examples/wscript deleted file mode 100644 index 68a94956d..000000000 --- a/src/wifi/examples/wscript +++ /dev/null @@ -1,29 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - if not bld.env['ENABLE_EXAMPLES']: - return; - - obj = bld.create_ns3_program('wifi-phy-test', - ['wifi']) - obj.source = 'wifi-phy-test.cc' - - obj = bld.create_ns3_program('wifi-test-interference-helper', - ['wifi']) - obj.source = 'wifi-test-interference-helper.cc' - - obj = bld.create_ns3_program('wifi-manager-example', - ['wifi']) - obj.source = 'wifi-manager-example.cc' - - obj = bld.create_ns3_program('wifi-trans-example', - ['wifi']) - obj.source = 'wifi-trans-example.cc' - - obj = bld.create_ns3_program('wifi-phy-configuration', - ['wifi', 'config-store']) - obj.source = 'wifi-phy-configuration.cc' - - obj = bld.create_ns3_program('wifi-bianchi', - ['wifi', 'applications', 'internet-apps' ]) - obj.source = 'wifi-bianchi.cc' \ No newline at end of file diff --git a/src/wifi/wscript b/src/wifi/wscript deleted file mode 100644 index bb182da11..000000000 --- a/src/wifi/wscript +++ /dev/null @@ -1,317 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_module('wifi', ['network', 'propagation', 'energy', 'spectrum', 'antenna', 'mobility']) - obj.source = [ - 'model/wifi-utils.cc', - 'model/wifi-information-element.cc', - 'model/wifi-information-element-vector.cc', - 'model/wifi-mode.cc', - 'model/ssid.cc', - 'model/wifi-phy.cc', - 'model/wifi-phy-operating-channel.cc', - 'model/wifi-phy-state-helper.cc', - 'model/error-rate-model.cc', - 'model/yans-error-rate-model.cc', - 'model/nist-error-rate-model.cc', - 'model/non-ht/dsss-error-rate-model.cc', - 'model/table-based-error-rate-model.cc', - 'model/interference-helper.cc', - 'model/wifi-phy-common.cc', - 'model/yans-wifi-phy.cc', - 'model/yans-wifi-channel.cc', - 'model/spectrum-wifi-phy.cc', - 'model/wifi-spectrum-phy-interface.cc', - 'model/wifi-spectrum-signal-parameters.cc', - 'model/wifi-mac-header.cc', - 'model/wifi-mac-trailer.cc', - 'model/wifi-tx-timer.cc', - 'model/wifi-protection.cc', - 'model/wifi-acknowledgment.cc', - 'model/wifi-tx-parameters.cc', - 'model/wifi-protection-manager.cc', - 'model/wifi-default-protection-manager.cc', - 'model/wifi-ack-manager.cc', - 'model/wifi-default-ack-manager.cc', - 'model/frame-exchange-manager.cc', - 'model/qos-frame-exchange-manager.cc', - 'model/ht/ht-frame-exchange-manager.cc', - 'model/vht/vht-frame-exchange-manager.cc', - 'model/he/he-frame-exchange-manager.cc', - 'model/he/multi-user-scheduler.cc', - 'model/he/rr-multi-user-scheduler.cc', - 'model/wifi-mac-queue.cc', - 'model/mac-tx-middle.cc', - 'model/mac-rx-middle.cc', - 'model/txop.cc', - 'model/supported-rates.cc', - 'model/capability-information.cc', - 'model/status-code.cc', - 'model/mgt-headers.cc', - 'model/channel-access-manager.cc', - 'model/wifi-mac.cc', - 'model/wifi-remote-station-info.cc', - 'model/wifi-remote-station-manager.cc', - 'model/ap-wifi-mac.cc', - 'model/sta-wifi-mac.cc', - 'model/adhoc-wifi-mac.cc', - 'model/wifi-net-device.cc', - 'model/rate-control/arf-wifi-manager.cc', - 'model/rate-control/aarf-wifi-manager.cc', - 'model/rate-control/ideal-wifi-manager.cc', - 'model/rate-control/constant-rate-wifi-manager.cc', - 'model/rate-control/amrr-wifi-manager.cc', - 'model/rate-control/onoe-wifi-manager.cc', - 'model/rate-control/rraa-wifi-manager.cc', - 'model/rate-control/aarfcd-wifi-manager.cc', - 'model/rate-control/cara-wifi-manager.cc', - 'model/rate-control/minstrel-wifi-manager.cc', - 'model/rate-control/minstrel-ht-wifi-manager.cc', - 'model/qos-utils.cc', - 'model/qos-txop.cc', - 'model/msdu-aggregator.cc', - 'model/amsdu-subframe-header.cc', - 'model/originator-block-ack-agreement.cc', - 'model/recipient-block-ack-agreement.cc', - 'model/ctrl-headers.cc', - 'model/qos-blocked-destinations.cc', - 'model/block-ack-agreement.cc', - 'model/block-ack-manager.cc', - 'model/block-ack-window.cc', - 'model/block-ack-type.cc', - 'model/snr-tag.cc', - 'model/he/mu-snr-tag.cc', - 'model/ht/ht-capabilities.cc', - 'model/wifi-tx-vector.cc', - 'model/rate-control/parf-wifi-manager.cc', - 'model/rate-control/aparf-wifi-manager.cc', - 'model/rate-control/rrpaa-wifi-manager.cc', - 'model/rate-control/thompson-sampling-wifi-manager.cc', - 'model/ampdu-subframe-header.cc', - 'model/mpdu-aggregator.cc', - 'model/ampdu-tag.cc', - 'model/wifi-radio-energy-model.cc', - 'model/wifi-tx-current-model.cc', - 'model/vht/vht-capabilities.cc', - 'model/non-ht/erp-information.cc', - 'model/ht/ht-operation.cc', - 'model/vht/vht-operation.cc', - 'model/non-ht/dsss-parameter-set.cc', - 'model/edca-parameter-set.cc', - 'model/he/mu-edca-parameter-set.cc', - 'model/he/he-capabilities.cc', - 'model/frame-capture-model.cc', - 'model/simple-frame-capture-model.cc', - 'model/preamble-detection-model.cc', - 'model/threshold-preamble-detection-model.cc', - 'model/he/he-operation.cc', - 'model/he/he-configuration.cc', - 'model/extended-capabilities.cc', - 'model/wifi-mac-queue-item.cc', - 'model/wifi-psdu.cc', - 'model/wifi-ppdu.cc', - 'model/non-ht/dsss-ppdu.cc', - 'model/non-ht/ofdm-ppdu.cc', - 'model/non-ht/erp-ofdm-ppdu.cc', - 'model/ht/ht-ppdu.cc', - 'model/vht/vht-ppdu.cc', - 'model/he/he-ppdu.cc', - 'model/ht/ht-configuration.cc', - 'model/vht/vht-configuration.cc', - 'model/he/obss-pd-algorithm.cc', - 'model/he/constant-obss-pd-algorithm.cc', - 'model/he/he-ru.cc', - 'model/phy-entity.cc', - 'model/non-ht/dsss-phy.cc', - 'model/non-ht/ofdm-phy.cc', - 'model/non-ht/erp-ofdm-phy.cc', - 'model/ht/ht-phy.cc', - 'model/vht/vht-phy.cc', - 'model/he/he-phy.cc', - 'helper/wifi-radio-energy-model-helper.cc', - 'helper/athstats-helper.cc', - 'helper/wifi-helper.cc', - 'helper/yans-wifi-helper.cc', - 'helper/spectrum-wifi-helper.cc', - 'helper/wifi-mac-helper.cc', - ] - - obj_test = bld.create_ns3_module_test_library('wifi') - obj_test.source = [ - 'test/block-ack-test-suite.cc', - 'test/channel-access-manager-test.cc', - 'test/tx-duration-test.cc', - 'test/power-rate-adaptation-test.cc', - 'test/wifi-test.cc', - 'test/wifi-txop-test.cc', - 'test/spectrum-wifi-phy-test.cc', - 'test/wifi-primary-channels-test.cc', - 'test/wifi-aggregation-test.cc', - 'test/wifi-error-rate-models-test.cc', - 'test/wifi-transmit-mask-test.cc', - 'test/wifi-phy-thresholds-test.cc', - 'test/wifi-phy-reception-test.cc', - 'test/inter-bss-test-suite.cc', - 'test/wifi-mac-ofdma-test.cc', - 'test/wifi-phy-ofdma-test.cc', - 'test/wifi-mac-queue-test.cc', - 'test/wifi-channel-switching-test.cc', - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - obj_test.source.extend([ - # 'test/wifi-examples-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'wifi' - headers.source = [ - 'model/wifi-utils.h', - 'model/wifi-information-element.h', - 'model/wifi-information-element-vector.h', - 'model/wifi-net-device.h', - 'model/wifi-mode.h', - 'model/ssid.h', - 'model/wifi-phy-common.h', - 'model/wifi-phy-band.h', - 'model/wifi-standards.h', - 'model/yans-wifi-phy.h', - 'model/spectrum-wifi-phy.h', - 'model/yans-wifi-channel.h', - 'model/wifi-phy.h', - 'model/wifi-phy-operating-channel.h', - 'model/wifi-spectrum-phy-interface.h', - 'model/wifi-spectrum-signal-parameters.h', - 'model/interference-helper.h', - 'model/wifi-remote-station-info.h', - 'model/wifi-remote-station-manager.h', - 'model/ap-wifi-mac.h', - 'model/sta-wifi-mac.h', - 'model/adhoc-wifi-mac.h', - 'model/rate-control/arf-wifi-manager.h', - 'model/rate-control/aarf-wifi-manager.h', - 'model/rate-control/ideal-wifi-manager.h', - 'model/rate-control/constant-rate-wifi-manager.h', - 'model/rate-control/amrr-wifi-manager.h', - 'model/rate-control/onoe-wifi-manager.h', - 'model/rate-control/rraa-wifi-manager.h', - 'model/rate-control/aarfcd-wifi-manager.h', - 'model/rate-control/cara-wifi-manager.h', - 'model/rate-control/minstrel-wifi-manager.h', - 'model/rate-control/minstrel-ht-wifi-manager.h', - 'model/rate-control/thompson-sampling-wifi-manager.h', - 'model/wifi-mac.h', - 'model/supported-rates.h', - 'model/error-rate-model.h', - 'model/yans-error-rate-model.h', - 'model/nist-error-rate-model.h', - 'model/non-ht/dsss-error-rate-model.h', - 'model/table-based-error-rate-model.h', - 'model/wifi-mac-queue.h', - 'model/txop.h', - 'model/wifi-mac-header.h', - 'model/wifi-mac-trailer.h', - 'model/wifi-phy-state-helper.h', - 'model/qos-utils.h', - 'model/qos-txop.h', - 'model/msdu-aggregator.h', - 'model/amsdu-subframe-header.h', - 'model/mgt-headers.h', - 'model/status-code.h', - 'model/capability-information.h', - 'model/channel-access-manager.h', - 'model/mac-tx-middle.h', - 'model/mac-rx-middle.h', - 'model/wifi-tx-timer.h', - 'model/wifi-protection.h', - 'model/wifi-acknowledgment.h', - 'model/wifi-tx-parameters.h', - 'model/wifi-protection-manager.h', - 'model/wifi-default-protection-manager.h', - 'model/wifi-ack-manager.h', - 'model/wifi-default-ack-manager.h', - 'model/frame-exchange-manager.h', - 'model/qos-frame-exchange-manager.h', - 'model/ht/ht-frame-exchange-manager.h', - 'model/vht/vht-frame-exchange-manager.h', - 'model/he/he-frame-exchange-manager.h', - 'model/he/multi-user-scheduler.h', - 'model/he/rr-multi-user-scheduler.h', - 'model/originator-block-ack-agreement.h', - 'model/recipient-block-ack-agreement.h', - 'model/ctrl-headers.h', - 'model/block-ack-agreement.h', - 'model/block-ack-manager.h', - 'model/block-ack-window.h', - 'model/snr-tag.h', - 'model/he/mu-snr-tag.h', - 'model/ht/ht-capabilities.h', - 'model/rate-control/parf-wifi-manager.h', - 'model/rate-control/aparf-wifi-manager.h', - 'model/rate-control/rrpaa-wifi-manager.h', - 'model/wifi-tx-vector.h', - 'model/ampdu-subframe-header.h', - 'model/mpdu-aggregator.h', - 'model/ampdu-tag.h', - 'model/wifi-radio-energy-model.h', - 'model/wifi-tx-current-model.h', - 'model/vht/vht-capabilities.h', - 'model/non-ht/erp-information.h', - 'model/ht/ht-operation.h', - 'model/vht/vht-operation.h', - 'model/non-ht/dsss-parameter-set.h', - 'model/edca-parameter-set.h', - 'model/he/mu-edca-parameter-set.h', - 'model/he/he-capabilities.h', - 'model/frame-capture-model.h', - 'model/simple-frame-capture-model.h', - 'model/preamble-detection-model.h', - 'model/threshold-preamble-detection-model.h', - 'model/qos-blocked-destinations.h', - 'model/he/he-operation.h', - 'model/he/he-configuration.h', - 'model/extended-capabilities.h', - 'model/wifi-mac-queue-item.h', - 'model/wifi-psdu.h', - 'model/wifi-ppdu.h', - 'model/non-ht/dsss-ppdu.h', - 'model/non-ht/erp-ofdm-ppdu.h', - 'model/non-ht/ofdm-ppdu.h', - 'model/ht/ht-ppdu.h', - 'model/vht/vht-ppdu.h', - 'model/he/he-ppdu.h', - 'model/wifi-phy-state.h', - 'model/wifi-phy-listener.h', - 'model/block-ack-type.h', - 'model/wifi-mpdu-type.h', - 'model/ht/ht-configuration.h', - 'model/vht/vht-configuration.h', - 'model/he/obss-pd-algorithm.h', - 'model/he/constant-obss-pd-algorithm.h', - 'model/he/he-ru.h', - 'model/reference/error-rate-tables.h', - 'model/phy-entity.h', - 'model/non-ht/dsss-phy.h', - 'model/non-ht/ofdm-phy.h', - 'model/non-ht/erp-ofdm-phy.h', - 'model/ht/ht-phy.h', - 'model/vht/vht-phy.h', - 'model/he/he-phy.h', - 'helper/wifi-radio-energy-model-helper.h', - 'helper/athstats-helper.h', - 'helper/wifi-helper.h', - 'helper/yans-wifi-helper.h', - 'helper/spectrum-wifi-helper.h', - 'helper/wifi-mac-helper.h', - ] - - if bld.env['ENABLE_GSL']: - obj.use.extend(['GSL', 'GSLCBLAS', 'M']) - obj_test.use.extend(['GSL', 'GSLCBLAS', 'M']) - - if (bld.env['ENABLE_EXAMPLES']): - bld.recurse('examples') - - bld.ns3_python_bindings() - diff --git a/src/wimax/examples/wscript b/src/wimax/examples/wscript deleted file mode 100644 index f9f6b9358..000000000 --- a/src/wimax/examples/wscript +++ /dev/null @@ -1,11 +0,0 @@ -7## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -def build(bld): - obj = bld.create_ns3_program( 'wimax-ipv4', ['wimax', 'internet', 'mobility', 'csma', 'applications']) - obj.source = 'wimax-ipv4.cc' - - obj = bld.create_ns3_program( 'wimax-multicast', ['wimax', 'internet', 'csma', 'applications']) - obj.source = 'wimax-multicast.cc' - - obj = bld.create_ns3_program( 'wimax-simple', ['wimax', 'internet', 'mobility', 'applications']) - obj.source = 'wimax-simple.cc' diff --git a/src/wimax/wscript b/src/wimax/wscript deleted file mode 100644 index 5de9973fa..000000000 --- a/src/wimax/wscript +++ /dev/null @@ -1,126 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- -def build(bld): - obj = bld.create_ns3_module('wimax', ['network', 'internet', 'propagation', 'mobility']) - obj.source = [ - 'model/cid.cc', - 'model/cid-factory.cc', - 'model/wimax-net-device.cc', - 'model/bs-net-device.cc', - 'model/ss-net-device.cc', - 'model/wimax-mac-header.cc', - 'model/wimax-phy.cc', - 'model/wimax-channel.cc', - 'model/ofdm-downlink-frame-prefix.cc', - 'model/wimax-connection.cc', - 'model/ss-record.cc', - 'model/mac-messages.cc', - 'model/dl-mac-messages.cc', - 'model/ul-mac-messages.cc', - 'model/simple-ofdm-wimax-phy.cc', - 'model/simple-ofdm-wimax-channel.cc', - 'model/send-params.cc', - 'model/ss-manager.cc', - 'model/connection-manager.cc', - 'model/bs-uplink-scheduler.cc', - 'model/bs-uplink-scheduler-simple.cc', - 'model/bs-uplink-scheduler-mbqos.cc', - 'model/bs-uplink-scheduler-rtps.cc', - 'model/bs-scheduler.cc', - 'model/bs-scheduler-simple.cc', - 'model/bs-scheduler-rtps.cc', - 'model/wimax-mac-queue.cc', - 'model/burst-profile-manager.cc', - 'model/ss-scheduler.cc', - 'model/service-flow.cc', - 'model/service-flow-manager.cc', - 'model/service-flow-record.cc', - 'model/ss-link-manager.cc', - 'model/bs-link-manager.cc', - 'model/bandwidth-manager.cc', - 'model/crc8.cc', - 'model/ul-job.cc', - 'model/snr-to-block-error-rate-record.cc', - 'model/snr-to-block-error-rate-manager.cc', - 'model/simple-ofdm-send-param.cc', - 'model/ss-service-flow-manager.cc', - 'model/bs-service-flow-manager.cc', - 'model/ipcs-classifier.cc', - 'model/ipcs-classifier-record.cc', - 'model/wimax-tlv.cc', - 'model/cs-parameters.cc', - 'model/wimax-mac-to-mac-header.cc', - 'helper/wimax-helper.cc', - ] - - - obj_test = bld.create_ns3_module_test_library('wimax') - obj_test.source = [ - 'test/wimax-tlv-test.cc', - 'test/mac-messages-test.cc', - 'test/wimax-service-flow-test.cc', - 'test/ss-mac-test.cc', - 'test/phy-test.cc', - 'test/qos-test.cc', - 'test/wimax-fragmentation-test.cc', - ] - - # Tests encapsulating example programs should be listed here - if (bld.env['ENABLE_EXAMPLES']): - obj_test.source.extend([ - # 'test/wimax-examples-test-suite.cc', - ]) - - headers = bld(features='ns3header') - headers.module = 'wimax' - headers.source = [ - 'model/wimax-channel.h', - 'model/wimax-net-device.h', - 'model/bs-net-device.h', - 'model/ss-net-device.h', - 'model/cid.h', - 'model/cid-factory.h', - 'model/ofdm-downlink-frame-prefix.h', - 'model/wimax-connection.h', - 'model/ss-record.h', - 'model/mac-messages.h', - 'model/dl-mac-messages.h', - 'model/ul-mac-messages.h', - 'model/wimax-phy.h', - 'model/simple-ofdm-wimax-phy.h', - 'model/simple-ofdm-wimax-channel.h', - 'model/send-params.h', - 'model/service-flow.h', - 'model/ss-manager.h', - 'model/connection-manager.h', - 'model/wimax-mac-header.h', - 'model/wimax-mac-queue.h', - 'model/crc8.h', - 'model/service-flow-manager.h', - 'model/bs-uplink-scheduler.h', - 'model/bs-uplink-scheduler-simple.h', - 'model/bs-uplink-scheduler-mbqos.h', - 'model/bs-uplink-scheduler-rtps.h', - 'model/ul-job.h', - 'model/bs-scheduler.h', - 'model/bs-scheduler-simple.h', - 'model/bs-scheduler-rtps.h', - 'model/service-flow-record.h', - 'model/snr-to-block-error-rate-record.h', - 'model/snr-to-block-error-rate-manager.h', - 'model/simple-ofdm-send-param.h', - 'model/ss-service-flow-manager.h', - 'model/bs-service-flow-manager.h', - 'model/cs-parameters.h', - 'model/ipcs-classifier-record.h', - 'model/wimax-tlv.h', - 'model/ipcs-classifier.h', - 'model/bvec.h', - 'model/wimax-mac-to-mac-header.h', - 'helper/wimax-helper.h', - ] - - - if bld.env['ENABLE_EXAMPLES']: - bld.recurse('examples') - - bld.ns3_python_bindings() diff --git a/src/wscript b/src/wscript deleted file mode 100644 index 4e3dca962..000000000 --- a/src/wscript +++ /dev/null @@ -1,748 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- -from __future__ import print_function -import os, os.path -import sys -import shutil -import types -import warnings - -from waflib import TaskGen, Task, Options, Build, Utils, Context -from waflib.Errors import WafError -import wutils - -try: - set -except NameError: - from sets import Set as set # Python 2.3 fallback - - - -all_modules = [] -for dirname in os.listdir('src'): - if dirname.startswith('.') or dirname == 'CVS': - continue - path = os.path.join('src', dirname) - if not os.path.isdir(path): - continue - if os.path.exists(os.path.join(path, 'wscript')): - all_modules.append(dirname) -all_modules.sort() - -def get_required_boost_libs(conf): - for module in all_modules: - conf.recurse (module, name="required_boost_libs", mandatory=False) - -def options(opt): - opt.add_option('--enable-rpath', - help=("Link programs with rpath" - " (normally not needed, see " - " --run and --shell; moreover, only works in some" - " specific platforms, such as Linux and Solaris)"), - action="store_true", dest='enable_rpath', default=False) - - opt.add_option('--enable-modules', - help=("Build only these modules (and dependencies)"), - dest='enable_modules') - - - for module in all_modules: - opt.recurse(module, mandatory=False) - -def configure(conf): - # Append blddir to the module path before recursing into modules - blddir = os.path.abspath(os.path.join(conf.bldnode.abspath(), conf.variant)) - conf.env.append_value('NS3_MODULE_PATH', blddir + "/lib") - - for module in all_modules: - conf.recurse(module, mandatory=False) - - # Remove duplicate path items - conf.env['NS3_MODULE_PATH'] = wutils.uniquify_list(conf.env['NS3_MODULE_PATH']) - - if Options.options.enable_rpath: - conf.env.append_value('RPATH', '-Wl,-rpath,%s' % (os.path.join(blddir),)) - - ## Used to link the 'test-runner' program with all of ns-3 code - conf.env['NS3_MODULES'] = ['ns3-' + module.split('/')[-1] for module in all_modules] - - - -# we need the 'ns3module' waf "feature" to be created because code -# elsewhere looks for it to find the ns3 module objects. -@TaskGen.feature('ns3module') -def _add_test_code(module): - pass - -def create_ns3_module(bld, name, dependencies=(), test=False): - static = bool(bld.env.ENABLE_STATIC_NS3) - # Create a separate library for this module. - if static: - module = bld(features='cxx cxxstlib ns3module') - else: - module = bld(features='cxx cxxshlib ns3module') - module.target = '%s/lib/ns%s-%s%s' % (bld.srcnode.path_from(module.path), wutils.VERSION, - name, bld.env.BUILD_SUFFIX) - linkflags = [] - cxxflags = [] - ccflags = [] - if not static: - cxxflags = module.env['shlib_CXXFLAGS'] - ccflags = module.env['shlib_CXXFLAGS'] - # Turn on the link flags for shared libraries if we have the - # proper compiler and platform. - if module.env['CXX_NAME'] in ['gcc', 'icc'] and module.env['WL_SONAME_SUPPORTED']: - # Get the module library name without any relative paths - # at its beginning because all of the libraries will end - # up in the same directory. - module_library_name = module.env.cshlib_PATTERN % (os.path.basename(module.target),) - linkflags = '-Wl,--soname=' + module_library_name - cxxdefines = ["NS3_MODULE_COMPILATION"] - ccdefines = ["NS3_MODULE_COMPILATION"] - - module.env.append_value('CXXFLAGS', cxxflags) - module.env.append_value('CCFLAGS', ccflags) - module.env.append_value('LINKFLAGS', linkflags) - module.env.append_value('CXXDEFINES', cxxdefines) - module.env.append_value('CCDEFINES', ccdefines) - - module.is_static = static - module.vnum = wutils.VNUM - # Add the proper path to the module's name. - # Set the libraries this module depends on. - module.module_deps = list(dependencies) - - module.install_path = "${LIBDIR}" - - module.name = "ns3-" + name - module.dependencies = dependencies - # Initially create an empty value for this because the pcfile - # writing task assumes every module has a uselib attribute. - module.uselib = '' - module.use = ['ns3-' + dep for dep in dependencies] - module.test = test - module.is_ns3_module = True - module.ns3_dir_location = bld.path.path_from(bld.srcnode) - - module.env.append_value("INCLUDES", Context.out_dir) - - module.pcfilegen = bld(features='ns3pcfile') - module.pcfilegen.module = module.name - - return module - -@TaskGen.feature("ns3testlib") -@TaskGen.before_method("apply_incpaths") -def apply_incpaths_ns3testlib(self): - if not self.source: - return - testdir = self.to_nodes(self.source[-1])[0].parent.path_from(self.bld.srcnode) - self.env.append_value("DEFINES", 'NS_TEST_SOURCEDIR="%s"' % (testdir,)) - - -def create_ns3_module_test_library(bld, name): - # Create an ns3 module for the test library that depends only on - # the module being tested. - library_name = name + "-test" - library = bld.create_ns3_module(library_name, [name], test=True) - library.features += " ns3testlib" - - # Modify attributes for the test library that are different from a - # normal module. - del library.is_ns3_module - library.is_ns3_module_test_library = True - library.module_name = 'ns3-' + name - - # Add this module and test library to the list. - bld.env.append_value('NS3_MODULES_WITH_TEST_LIBRARIES', [(library.module_name, library.name)]) - - # Set the include path from the build directory to modules. - relative_path_from_build_to_here = bld.path.path_from(bld.bldnode) - include_flag = '-I' + relative_path_from_build_to_here - library.env.append_value('CXXFLAGS', include_flag) - library.env.append_value('CCFLAGS', include_flag) - - return library - -def create_obj(bld, *args): - warnings.warn("(in %s) Use bld(...) call now, instead of bld.create_obj(...)" % str(bld.path), - DeprecationWarning, stacklevel=2) - return bld(*args) - - -def ns3_python_bindings(bld): - - # this method is called from a module wscript, so remember bld.path is not bindings/python! - module_abs_src_path = bld.path.abspath() - module = os.path.basename(module_abs_src_path) - env = bld.env - env.append_value("MODULAR_BINDINGS_MODULES", "ns3-"+module) - - if Options.options.apiscan: - return - - if not env['ENABLE_PYTHON_BINDINGS']: - return - - bindings_dir = bld.path.find_dir("bindings") - if bindings_dir is None or not os.path.exists(bindings_dir.abspath()): - warnings.warn("(in %s) Requested to build modular python bindings, but apidefs dir not found " - "=> skipped the bindings." % str(bld.path), - Warning, stacklevel=2) - return - - env.append_value('PYTHON_MODULES_BUILT', module) - try: - apidefs = env['PYTHON_BINDINGS_APIDEFS'].replace("-", "_") - except AttributeError: - # we likely got an empty list for env['PYTHON_BINDINGS_APIDEFS'] - return - - #debug = ('PYBINDGEN_DEBUG' in os.environ) - debug = True # XXX - source = [bld.srcnode.find_resource('bindings/python/ns3modulegen-modular.py'), - bld.path.find_resource("bindings/modulegen__%s.py" % apidefs)] - - modulegen_customizations = bindings_dir.find_resource("modulegen_customizations.py") - if modulegen_customizations is not None: - source.append(modulegen_customizations) - - modulegen_local = bld.path.find_resource("bindings/modulegen_local.py") - # the local customization file may or not exist - if modulegen_local is not None: - source.append("bindings/modulegen_local.py") - - module_py_name = module.replace('-', '_') - module_target_dir = bld.srcnode.find_dir("bindings/python/ns").path_from(bld.path) - - # if bindings/.py exists, it becomes the module frontend, and the C extension befomes _ - if bld.path.find_resource("bindings/%s.py" % (module_py_name,)) is not None: - bld(features='copy', - source=("bindings/%s.py" % (module_py_name,)), - target=('%s/%s.py' % (module_target_dir, module_py_name))) - extension_name = '_%s' % (module_py_name,) - bld.install_files('${PYTHONARCHDIR}/ns', ["bindings/%s.py" % (module_py_name,)]) - else: - extension_name = module_py_name - - target = ['bindings/ns3module.cc', 'bindings/ns3module.h', 'bindings/ns3modulegen.log'] - #if not debug: - # target.append('ns3modulegen.log') - - argv = ['NS3_ENABLED_FEATURES=${FEATURES}', - 'GCC_RTTI_ABI_COMPLETE=${GCC_RTTI_ABI_COMPLETE}', - '${PYTHON}'] - #if debug: - # argv.extend(["-m", "pdb"]) - - argv.extend(['${SRC[0]}', module_abs_src_path, apidefs, extension_name, '${TGT[0]}']) - - argv.extend(['2>', '${TGT[2]}']) # 2> ns3modulegen.log - - features = [] - for (name, caption, was_enabled, reason_not_enabled) in env['NS3_OPTIONAL_FEATURES']: - if was_enabled: - features.append(name) - - bindgen = bld(features='command', source=source, target=target, command=argv) - bindgen.env['FEATURES'] = ','.join(features) - bindgen.dep_vars = ['FEATURES', "GCC_RTTI_ABI_COMPLETE"] - bindgen.name = "pybindgen(ns3 module %s)" % module - bindgen.module = module - bindgen.install_path = None - - # Retrieve the module dependencies - module_obj = bld.get_tgen_by_name('ns3-' + module) - module_deps = module_obj.use.copy() - module_deps.append('ns3-' + module) - - # generate the extension module - pymod = bld(features='cxx cxxshlib pyext') - pymod.source = ['bindings/ns3module.cc'] - pymod.target = '%s/%s' % (module_target_dir, extension_name) - pymod.name = 'ns3module_%s' % module - pymod.module= module - pymod.use = module_deps # Should be '"ns3-"+module', but see bug 1117 - if pymod.env['ENABLE_STATIC_NS3']: - if sys.platform == 'darwin': - pymod.env.append_value('LINKFLAGS', '-Wl,-all_load') - for mod in pymod.usel: - #mod = mod.split("--lib")[0] - pymod.env.append_value('LINKFLAGS', '-l' + mod) - else: - pymod.env.append_value('LINKFLAGS', '-Wl,--whole-archive,-Bstatic') - for mod in pymod.use: - #mod = mod.split("--lib")[0] - pymod.env.append_value('LINKFLAGS', '-l' + mod) - pymod.env.append_value('LINKFLAGS', '-Wl,-Bdynamic,--no-whole-archive') - defines = list(pymod.env['DEFINES']) - defines.extend(['NS_DEPRECATED=', 'NS3_DEPRECATED_H']) - defines.extend(['NS_DEPRECATED_3_36=', 'NS3_DEPRECATED_H']) - defines.extend(['NS_DEPRECATED_3_35=', 'NS3_DEPRECATED_H']) - defines.extend(['NS_DEPRECATED_3_34=', 'NS3_DEPRECATED_H']) - if Utils.unversioned_sys_platform()== 'win32': - try: - defines.remove('_DEBUG') # causes undefined symbols on win32 - except ValueError: - pass - pymod.env['DEFINES'] = defines - # The following string should lead to includes of - # '-I.', '-Isrc/core/bindings' when compiling module_helpers.cc - pymod.includes = Context.out_dir + ' ' + Context.out_dir + '/src/core/bindings' - pymod.install_path = '${PYTHONARCHDIR}/ns' - - return pymod - - -def build(bld): - bld.create_ns3_module = types.MethodType(create_ns3_module, bld) - bld.create_ns3_module_test_library = types.MethodType(create_ns3_module_test_library, bld) - bld.create_obj = types.MethodType(create_obj, bld) - bld.ns3_python_bindings = types.MethodType(ns3_python_bindings, bld) - - # Remove these modules from the list of all modules. - for not_built in bld.env['MODULES_NOT_BUILT']: - - # XXX Because these modules are located in subdirectories of - # test, their names in the all_modules list include the extra - # relative path "test/". If these modules are moved into the - # src directory, then this if block should be removed. - if not_built == 'ns3tcp' or not_built == 'ns3wifi': - not_built = 'test/' + not_built - - if not_built in all_modules: - all_modules.remove(not_built) - - bld.recurse(list(all_modules)) - - for module in all_modules: - modheader = bld(features='ns3moduleheader') - modheader.module = module.split('/')[-1] - -class ns3pcfile(Task.Task): - after = ['cxxprogram', 'cxxshlib', 'cxxstlib'] - - def __str__(self): - "string to display to the user" - tgt_str = ' '.join([a.bldpath() for a in self.outputs]) - return 'pcfile: %s' % (tgt_str) - - def runnable_status(self): - return super(ns3pcfile, self).runnable_status() - - def _self_libs(self, env, name, libdir): - if env['ENABLE_STATIC_NS3']: - path_st = 'STLIBPATH_ST' - lib_st = 'STLIB_ST' - lib_marker = 'STLIB_MARKER' - else: - path_st = 'LIBPATH_ST' - lib_st = 'LIB_ST' - lib_marker = 'SHLIB_MARKER' - retval = [env[path_st] % libdir] - if env[lib_marker]: - retval.append(env[lib_marker]) - retval.append(env[lib_st] % name) - return retval - - def _lib(self, env, dep): - libpath = env['LIBPATH_%s' % dep] - linkflags = env['LINKFLAGS_%s' % dep] - libs = env['LIB_%s' % dep] - retval = [] - for path in libpath: - retval.append(env['LIBPATH_ST'] % path) - retval = retval + linkflags - for lib in libs: - retval.append(env['LIB_ST'] % lib) - return retval - - def _listify(self, v): - if isinstance(v, list): - return v - else: - return [v] - - def _cflags(self, dep): - flags = self.env['CFLAGS_%s' % dep] - return self._listify(flags) - - def _cxxflags(self, dep): - return self._listify(self.env['CXXFLAGS_%s' % dep]) - - def _defines(self, dep): - return [self.env['DEFINES_ST'] % define for define in self.env['DEFINES_%s' % dep]] - - def _includes(self, dep): - includes = self.env['INCLUDES_%s' % dep] - return [self.env['CPPPATH_ST'] % include for include in Utils.to_list(includes)] - - def _generate_pcfile(self, name, use, env, outfilename, module): - prefix = env.PREFIX - includedir = Utils.subst_vars('${INCLUDEDIR}/%s%s' % (wutils.APPNAME, wutils.VERSION), env) - libdir = env.LIBDIR - libs = self._self_libs(env, "%s%s-%s%s" % (wutils.APPNAME, wutils.VERSION, name[4:], env.BUILD_SUFFIX), '${libdir}') - for dep in use: - libs += self._lib(env, dep) - for dep in env.LIBS: - libs += self.env['LIB_ST'] % dep - cflags = [self.env['CPPPATH_ST'] % '${includedir}'] - - if getattr(module, 'export_includes', None): - for include in module.to_incnodes(module.export_includes): - cflags += [self.env['CPPPATH_ST'] % include.abspath()] - requires = [] - for dep in use: - cflags = cflags + self._cflags(dep) + self._cxxflags(dep) + \ - self._defines(dep) + self._includes(dep) - if dep.startswith('ns3-'): - dep_name = dep[4:] - requires.append("libns%s-%s%s" % (wutils.VERSION, dep_name, env.BUILD_SUFFIX)) - - with open(outfilename, 'wt') as outfile: - print("""\ -prefix=%s -libdir=%s -includedir=%s - -Name: lib%s -Description: ns-3 module %s -Version: %s -Libs: %s -Cflags: %s -Requires: %s\ -""" % (prefix, libdir, includedir, - name, name, wutils.VERSION, ' '.join(libs), ' '.join(cflags), ' '.join(requires)), file=outfile) - - def run(self): - output_filename = self.outputs[0].abspath() - self._generate_pcfile(self.module.name, - self.module.to_list(self.module.use), - self.env, output_filename, self.module) - - -@TaskGen.feature('ns3pcfile') -@TaskGen.after_method('process_rule') -def apply(self): - module = self.bld.find_ns3_module(self.module) - output_filename = 'lib%s.pc' % os.path.basename(module.target) - output_node = self.path.find_or_declare(output_filename) - assert output_node is not None, str(self) - task = self.create_task('ns3pcfile') - self.bld.install_files('${LIBDIR}/pkgconfig', output_node) - task.set_outputs([output_node]) - task.module = module - - - -@TaskGen.feature('ns3header') -@TaskGen.after_method('process_rule') -def apply_ns3header(self): - if self.module is None: - raise WafError("'module' missing on ns3headers object %s" % self) - ns3_dir_node = self.bld.path.find_or_declare("ns3") - headers_to_process = set(self.to_list(self.source)) - if hasattr(self, 'deprecated'): - headers_to_process.update(set(self.to_list(self.deprecated))) - for filename in headers_to_process: - src_node = self.path.find_resource(filename) - if src_node is None: - raise WafError("source ns3 header file %s not found" % (filename,)) - dst_node = ns3_dir_node.find_or_declare(src_node.name) - assert dst_node is not None - task = self.create_task('ns3header') - task.mode = getattr(self, 'mode', 'install') - if task.mode == 'install': - self.bld.install_files('${INCLUDEDIR}/%s%s/ns3' % (wutils.APPNAME, wutils.VERSION), [src_node]) - task.set_inputs([src_node]) - task.set_outputs([dst_node]) - else: - task.header_to_remove = dst_node - self.headers = set(self.to_list(self.source)) - self.source = '' # tell WAF not to process these files further - if hasattr(self, 'deprecated'): - self.deprecated = '' # tell WAF not to process these files further - - - -class ns3header(Task.Task): - before = ['cxxprogram', 'cxxshlib', 'cxxstlib', 'gen_ns3_module_header'] - color = 'BLUE' - - def __str__(self): - "string to display to the user" - env = self.env - src_str = ' '.join([a.bldpath() for a in self.inputs]) - tgt_str = ' '.join([a.bldpath() for a in self.outputs]) - if self.outputs: sep = ' -> ' - else: sep = '' - if self.mode == 'remove': - return 'rm-ns3-header %s' % (self.header_to_remove.abspath(),) - return 'install-ns3-header: %s' % (tgt_str) - - def __repr__(self): - return str(self) - - def uid(self): - try: - return self.uid_ - except AttributeError: - m = Utils.md5() - up = m.update - up(self.__class__.__name__.encode()) - for x in self.inputs + self.outputs: - up(x.abspath().encode()) - up(self.mode.encode()) - if self.mode == 'remove': - up(self.header_to_remove.abspath().encode()) - self.uid_ = m.digest() - return self.uid_ - - def runnable_status(self): - if self.mode == 'remove': - if os.path.exists(self.header_to_remove.abspath()): - return Task.RUN_ME - else: - return Task.SKIP_ME - else: - return super(ns3header, self).runnable_status() - - def run(self): - if self.mode == 'install': - assert len(self.inputs) == len(self.outputs) - inputs = [node.abspath() for node in self.inputs] - outputs = [node.abspath() for node in self.outputs] - for src, dst in zip(inputs, outputs): - try: - os.chmod(dst, 0o600) - except OSError: - pass - shutil.copy2(src, dst) - ## make the headers in builddir read-only, to prevent - ## accidental modification - os.chmod(dst, 0o400) - return 0 - else: - assert len(self.inputs) == 0 - assert len(self.outputs) == 0 - out_file_name = self.header_to_remove.abspath() - try: - os.unlink(out_file_name) - except OSError as ex: - if ex.errno != 2: - raise - return 0 - - -@TaskGen.feature('ns3privateheader') -@TaskGen.after_method('process_rule') -def apply_ns3privateheader(self): - if self.module is None: - raise WafError("'module' missing on ns3headers object %s" % self) - ns3_dir_node = self.bld.path.find_or_declare("ns3/private") - for filename in set(self.to_list(self.source)): - src_node = self.path.find_resource(filename) - if src_node is None: - raise WafError("source ns3 header file %s not found" % (filename,)) - dst_node = ns3_dir_node.find_or_declare(src_node.name) - assert dst_node is not None - task = self.create_task('ns3privateheader') - task.mode = getattr(self, 'mode', 'install') - if task.mode == 'install': - task.set_inputs([src_node]) - task.set_outputs([dst_node]) - else: - task.header_to_remove = dst_node - self.headers = set(self.to_list(self.source)) - self.source = '' # tell WAF not to process these files further - -class ns3privateheader(Task.Task): - before = ['cxxprogram', 'cxxshlib', 'cxxstlib', 'gen_ns3_module_header'] - after = 'ns3header' - color = 'BLUE' - - def __str__(self): - "string to display to the user" - env = self.env - src_str = ' '.join([a.bldpath() for a in self.inputs]) - tgt_str = ' '.join([a.bldpath() for a in self.outputs]) - if self.outputs: sep = ' -> ' - else: sep = '' - if self.mode == 'remove': - return 'rm-ns3-header %s' % (self.header_to_remove.abspath(),) - return 'install-ns3-header: %s' % (tgt_str) - - def __repr__(self): - return str(self) - - def uid(self): - try: - return self.uid_ - except AttributeError: - m = Utils.md5() - up = m.update - up(self.__class__.__name__.encode()) - for x in self.inputs + self.outputs: - up(x.abspath().encode()) - up(self.mode.encode()) - if self.mode == 'remove': - up(self.header_to_remove.abspath().encode()) - self.uid_ = m.digest() - return self.uid_ - - def runnable_status(self): - if self.mode == 'remove': - if os.path.exists(self.header_to_remove.abspath()): - return Task.RUN_ME - else: - return Task.SKIP_ME - else: - return super(ns3privateheader, self).runnable_status() - - def run(self): - if self.mode == 'install': - assert len(self.inputs) == len(self.outputs) - inputs = [node.abspath() for node in self.inputs] - outputs = [node.abspath() for node in self.outputs] - for src, dst in zip(inputs, outputs): - try: - os.chmod(dst, 0o600) - except OSError: - pass - shutil.copy2(src, dst) - ## make the headers in builddir read-only, to prevent - ## accidental modification - os.chmod(dst, 0o400) - return 0 - else: - assert len(self.inputs) == 0 - assert len(self.outputs) == 0 - out_file_name = self.header_to_remove.abspath() - try: - os.unlink(out_file_name) - except OSError as ex: - if ex.errno != 2: - raise - return 0 - -class gen_ns3_module_header(Task.Task): - before = ['cxxprogram', 'cxxshlib', 'cxxstlib'] - after = 'ns3header' - color = 'BLUE' - - def runnable_status(self): - if self.mode == 'remove': - if os.path.exists(self.header_to_remove.abspath()): - return Task.RUN_ME - else: - return Task.SKIP_ME - else: - return super(gen_ns3_module_header, self).runnable_status() - - def __str__(self): - "string to display to the user" - env = self.env - src_str = ' '.join([a.bldpath() for a in self.inputs]) - tgt_str = ' '.join([a.bldpath() for a in self.outputs]) - if self.outputs: sep = ' -> ' - else: sep = '' - if self.mode == 'remove': - return 'rm-module-header %s' % (self.header_to_remove.abspath(),) - return 'gen-module-header: %s' % (tgt_str) - - def run(self): - if self.mode == 'remove': - assert len(self.inputs) == 0 - assert len(self.outputs) == 0 - out_file_name = self.header_to_remove.abspath() - try: - os.unlink(out_file_name) - except OSError as ex: - if ex.errno != 2: - raise - return 0 - assert len(self.outputs) == 1 - out_file_name = self.outputs[0].get_bld().abspath()#self.env) - header_files = [os.path.basename(node.abspath()) for node in self.inputs] - header_files.sort() - - with open(out_file_name, "w") as outfile: - print(""" -#ifdef NS3_MODULE_COMPILATION -# error "Do not include ns3 module aggregator headers from other modules; these are meant only for end user scripts." -#endif - -#ifndef NS3_MODULE_%s - """ % (self.module.upper().replace('-', '_'),), file=outfile) - - # if self.module_deps: - # print >> outfile, "// Module dependencies:" - # for dep in self.module_deps: - # print >> outfile, "#include \"%s-module.h\"" % dep - - print(file=outfile) - print("// Module headers:", file=outfile) - for header in header_files: - print("#include \"%s\"" % (header,), file=outfile) - - print("#endif", file=outfile) - - return 0 - - def sig_explicit_deps(self): - self.m.update('\n'.join(sorted([node.abspath() for node in self.inputs])).encode('utf-8')) - return self.m.digest() - - def unique_id(self): - try: - return self.uid - except AttributeError: - "this is not a real hot zone, but we want to avoid surprizes here" - m = Utils.md5() - m.update("ns-3-module-header-%s" % self.module) - self.uid = m.digest() - return self.uid - - -# Generates a 'ns3/foo-module.h' header file that includes all public -# ns3 headers of a certain module. -@TaskGen.feature('ns3moduleheader') -@TaskGen.after_method('process_rule') -def apply_ns3moduleheader(self): - ## get all of the ns3 headers - ns3_dir_node = self.bld.path.find_or_declare("ns3") - all_headers_inputs = [] - found_the_module = False - for ns3headers in self.bld.all_task_gen: - if 'ns3header' in getattr(ns3headers, "features", []): - if ns3headers.module != self.module: - continue - found_the_module = True - for source in sorted(ns3headers.headers): - source = os.path.basename(source) - node = ns3_dir_node.find_or_declare(os.path.basename(source)) - if node is None: - fatal("missing header file %s" % (source,)) - all_headers_inputs.append(node) - if not found_the_module: - raise WafError("error finding headers for module %s" % self.module) - if not all_headers_inputs: - return - - try: - module_obj = self.bld.get_tgen_by_name("ns3-" + self.module) - except WafError: # maybe the module was disabled, and therefore removed - return - - all_headers_outputs = [ns3_dir_node.find_or_declare("%s-module.h" % self.module)] - task = self.create_task('gen_ns3_module_header') - task.module = self.module - task.mode = getattr(self, "mode", "install") - if task.mode == 'install': - assert module_obj is not None, self.module - self.bld.install_files('${INCLUDEDIR}/%s%s/ns3' % (wutils.APPNAME, wutils.VERSION), - ns3_dir_node.find_or_declare("%s-module.h" % self.module)) - task.set_inputs(all_headers_inputs) - task.set_outputs(all_headers_outputs) - task.module_deps = module_obj.module_deps - else: - task.header_to_remove = all_headers_outputs[0] diff --git a/test.py b/test.py index c32be7615..4e85fbe3e 100755 --- a/test.py +++ b/test.py @@ -47,14 +47,14 @@ try: except ImportError: import Queue as queue # -# XXX This should really be part of a waf command to list the configuration +# XXX This should really be part of a ns3 command to list the configuration # items relative to optional ns-3 pieces. # # A list of interesting configuration items in the waf configuration # cache which we may be interested in when deciding on which examples -# to run and how to run them. These are set by waf during the +# to run and how to run them. These are set by ns3 during the # configuration phase and the corresponding assignments are usually -# found in the associated subdirectory wscript files. +# found in the associated subdirectory CMakeLists.txt files. # interesting_config_items = [ "NS3_ENABLED_MODULES", @@ -92,13 +92,13 @@ PYTHON = "" VALGRIND_FOUND = True # -# This will be given a prefix and a suffix when the waf config file is +# This will be given a prefix and a suffix when the ns3 config file is # read. # test_runner_name = "test-runner" # -# If the user has constrained us to run certain kinds of tests, we can tell waf +# If the user has constrained us to run certain kinds of tests, we can tell ns3 # to only build # core_kinds = ["core", "performance", "system", "unit"] @@ -148,7 +148,7 @@ def parse_examples_to_run_file( # some tests when they are run under valgrind. # # Note that the two conditions are Python statements that - # can depend on waf configuration variables. For example, + # can depend on ns3 configuration variables. For example, # when NSC was in the codebase, we could write: # # ("tcp-nsc-lfn", "NSC_ENABLED == True", "NSC_ENABLED == False"), @@ -167,7 +167,7 @@ def parse_examples_to_run_file( example_arguments = example_name_parts[1] # Add the proper prefix and suffix to the example name to - # match what is done in the wscript file. + # match what is done in the CMakeLists.txt file. example_path = "%s%s-%s%s" % (APPNAME, VERSION, example_name, BUILD_PROFILE_SUFFIX) # Set the full path for the example. @@ -195,7 +195,7 @@ def parse_examples_to_run_file( # do_run is a condition under which to run the example. # # Note that the condition is a Python statement that can - # depend on waf configuration variables. For example, + # depend on ns3 configuration variables. For example, # # ("realtime-udp-echo.py", "ENABLE_REAL_TIME == True"), # @@ -578,21 +578,21 @@ def sigint_hook(signal, frame): # # In general, the build process itself naturally takes care of figuring out -# which tests are built into the test runner. For example, if waf configure +# which tests are built into the test runner. For example, if ns3 configure # determines that ENABLE_EMU is false due to some missing dependency, # the tests for the emu net device simply will not be built and will # therefore not be included in the built test runner. # # Examples, however, are a different story. In that case, we are just given # a list of examples that could be run. Instead of just failing, for example, -# an example if its library support is not present, we look into the waf +# an example if its library support is not present, we look into the ns3 # saved configuration for relevant configuration items. # -# XXX This function pokes around in the waf internal state file. To be a -# little less hacky, we should add a command to waf to return this info +# XXX This function pokes around in the ns3 internal state file. To be a +# little less hacky, we should add a command to ns3 to return this info # and use that result. # -def read_waf_config(): +def read_ns3_config(): f = None try: # sys.platform reports linux2 for python2 and linux for python3 @@ -630,9 +630,9 @@ def read_waf_config(): print("%s ==" % item, eval(item)) # -# It seems pointless to fork a process to run waf to fork a process to run +# It seems pointless to fork a process to run ns3 to fork a process to run # the test runner, so we just run the test runner directly. The main thing -# that waf would do for us would be to sort out the shared library path but +# that ns3 would do for us would be to sort out the shared library path but # we can deal with that easily and do here. # # There can be many different ns-3 repositories on a system, and each has @@ -1042,12 +1042,12 @@ class worker_thread(threading.Thread): # def run_tests(): # - # Pull some interesting configuration information out of waf, primarily + # Pull some interesting configuration information out of ns3, primarily # so we can know where executables can be found, but also to tell us what # pieces of the system have been built. This will tell us what examples # are runnable. # - read_waf_config() + read_ns3_config() # # Set the proper suffix. @@ -1060,15 +1060,15 @@ def run_tests(): # # Add the proper prefix and suffix to the test-runner name to - # match what is done in the wscript file. + # match what is done in the CMakeLists.txt file. # test_runner_name = "%s%s-%s%s" % (APPNAME, VERSION, "test-runner", BUILD_PROFILE_SUFFIX) # - # Run waf to make sure that everything is built, configured and ready to go + # Run ns3 to make sure that everything is built, configured and ready to go # unless we are explicitly told not to. We want to be careful about causing # our users pain while waiting for extraneous stuff to compile and link, so - # we allow users that know what they''re doing to not invoke waf at all. + # we allow users that know what they're doing to not invoke ns3 at all. # if not options.no_build: @@ -1079,7 +1079,7 @@ def run_tests(): # options, so if we see them, we can safely only build the test-runner. # # If the user has constrained us to running only a particular type of - # file, we can only ask waf to build what we know will be necessary. + # file, we can only ask ns3 to build what we know will be necessary. # For example, if the user only wants to run BVT tests, we only have # to build the test-runner and can ignore all of the examples. # @@ -1122,7 +1122,7 @@ def run_tests(): ns3_runnable_scripts = get_list_from_file(build_status_file, "ns3_runnable_scripts") ns3_runnable_scripts = [os.path.basename(script) for script in ns3_runnable_scripts] else: - print('The build status file was not found. You must do waf build before running test.py.', file=sys.stderr) + print('The build status file was not found. You must configure before running test.py.', file=sys.stderr) sys.exit(2) # @@ -1529,7 +1529,7 @@ def run_tests(): elif len(options.example): # Add the proper prefix and suffix to the example name to - # match what is done in the wscript file. + # match what is done in the CMakeLists.txt file. example_name = "%s%s-%s%s" % (APPNAME, VERSION, options.example, BUILD_PROFILE_SUFFIX) key_list = [] @@ -1952,7 +1952,7 @@ def main(argv): help="report multiple failures from test suites and test cases") parser.add_option("-n", "--no-build", action="store_true", dest="no_build", default=False, - help="do not run waf before starting testing") + help="do not build before starting testing") parser.add_option("-p", "--pyexample", action="store", type="string", dest="pyexample", default="", metavar="PYEXAMPLE", diff --git a/utils.py b/utils.py index 153c77aeb..134bb234c 100644 --- a/utils.py +++ b/utils.py @@ -1,6 +1,6 @@ #! /usr/bin/env python3 -# These methods are used by test.py and waf to look for and read the +# These methods are used by test.py to look for and read the # .ns3rc configuration file, which is used to specify the modules that # should be enabled diff --git a/utils/coverity-report.sh b/utils/coverity-report.sh index f463c303b..f8d2b6cb4 100755 --- a/utils/coverity-report.sh +++ b/utils/coverity-report.sh @@ -49,14 +49,14 @@ function doo () say $(date) blank -doo ./waf clean +doo ./ns3 clean blank -doo ./waf configure $NS3CONFIG +doo ./ns3 configure $NS3CONFIG blank cov=coverity/cov-int -doo cov-build --dir $cov ./waf build +doo cov-build --dir $cov ./ns3 build blank tarf=coverity/ns-3.tgz diff --git a/utils/run-examples-with-full-logging.sh b/utils/run-examples-with-full-logging.sh index 9260a8b6b..6e04d2460 100755 --- a/utils/run-examples-with-full-logging.sh +++ b/utils/run-examples-with-full-logging.sh @@ -33,7 +33,7 @@ do if [[ "$line" == example* ]] then name=${line#example } - NS_LOG="*" ./waf --run "$name" >& /dev/null + NS_LOG="*" ./ns3 --run "$name" >& /dev/null status="$?" echo "program $name status $status" fi diff --git a/utils/tests/TestBase.py b/utils/tests/TestBase.py index 056244cdd..375376488 100644 --- a/utils/tests/TestBase.py +++ b/utils/tests/TestBase.py @@ -42,7 +42,7 @@ def print_cmds(cmds): def set_workdir(): dir_files = [ f for f in os.listdir('.') if os.path.exists(f) ] - if not 'VERSION' in dir_files and not 'waf' in dir_files: + if not 'VERSION' in dir_files and not 'ns3' in dir_files: if os.path.split(os.path.abspath('.'))[1] == 'tests' and os.path.split(os.path.abspath(os.pardir))[1] == 'utils': os.chdir('../../') else: diff --git a/utils/tests/gitlab-ci-pybindgen.yml b/utils/tests/gitlab-ci-pybindgen.yml index b93a9e843..325d58ba2 100644 --- a/utils/tests/gitlab-ci-pybindgen.yml +++ b/utils/tests/gitlab-ci-pybindgen.yml @@ -14,8 +14,8 @@ # script: # - git clone https://github.com/afq984/python-cxxfilt.git # - mv python-cxxfilt/cxxfilt bindings/python -# - CXX="g++" ./waf configure --disable-examples --disable-tests -d debug -# - ./waf --apiscan=$MODULE +# - CXX="g++" ./ns3 configure --disable-examples --disable-tests -d debug +# - ./ns3 --apiscan=$MODULE # - git diff src > pybindgen_new.patch # artifacts: # paths: diff --git a/utils/tests/test-ns3.py b/utils/tests/test-ns3.py index 027b5e5c2..75c4b1e68 100644 --- a/utils/tests/test-ns3.py +++ b/utils/tests/test-ns3.py @@ -165,109 +165,6 @@ def get_enabled_modules(): return read_c4che_entry("NS3_ENABLED_MODULES") -class NS3RunWafTargets(unittest.TestCase): - """! - ns3 tests related to compatibility with Waf-produced binaries - """ - - ## when cleaned_once is False, clean up build artifacts and reconfigure - cleaned_once = False - - def setUp(self): - """! - Clean the default build directory, then configure and build ns-3 with waf - @return None - """ - if not NS3RunWafTargets.cleaned_once: - NS3RunWafTargets.cleaned_once = True - run_ns3("clean") - return_code, stdout, stderr = run_program("waf", "configure --enable-examples --enable-tests", python=True) - self.assertEqual(return_code, 0) - self.assertIn("finished successfully", stdout) - - return_code, stdout, stderr = run_program("waf", "build", python=True) - self.assertEqual(return_code, 0) - self.assertIn("finished successfully", stdout) - - def test_01_loadExecutables(self): - """! - Try to load executables built by waf - @return None - """ - # Check if build-status.py exists, then read to get list of executables. - self.assertTrue(os.path.exists(usual_build_status_script)) - ## ns3_executables holds a list of executables in build-status.py - self.ns3_executables = get_programs_list() - self.assertGreater(len(self.ns3_executables), 0) - - def test_02_loadModules(self): - """! - Try to load modules built by waf - @return None - """ - # Check if c4che.py exists than read to get the list of enabled modules. - self.assertTrue(os.path.exists(usual_c4che_script)) - ## ns3_modules holds a list to the modules enabled stored in c4che.py - self.ns3_modules = get_enabled_modules() - self.assertGreater(len(self.ns3_modules), 0) - - def test_03_runNobuildScratchSim(self): - """! - Try to run an executable built by waf - @return None - """ - return_code, stdout, stderr = run_ns3("run scratch-simulator --no-build") - self.assertEqual(return_code, 0) - self.assertIn("Scratch Simulator", stderr) - - def test_04_runNobuildExample(self): - """! - Try to run a different executable built by waf - @return None - """ - return_code, stdout, stderr = run_ns3("run command-line-example --verbose --no-build") - self.assertEqual(return_code, 0) - self.assertIn("command-line-example", stdout) - - def test_05_runTestCaseCoreExampleSimulator(self): - """! - Try to run a test case built by waf that calls the ns3 wrapper script - @return None - """ - return_code, stdout, stderr = run_program("test.py", "--no-build -s core-example-simulator", True) - self.assertEqual(return_code, 0) - self.assertIn("PASS", stdout) - - def test_06_runTestCaseExamplesAsTestsTestSuite(self): - """! - Try to run a different test case built by waf that calls the ns3 wrapper script - @return None - """ - return_code, stdout, stderr = run_program("test.py", "--no-build -s examples-as-tests-test-suite", True) - self.assertEqual(return_code, 0) - self.assertIn("PASS", stdout) - - def test_07_runCoreExampleSimulator(self): - """! - Try to run test cases built by waf that calls the ns3 wrapper script - when the output directory is set to a different path - @return None - """ - run_ns3("clean") - - return_code, stdout, stderr = run_program("waf", - "configure --enable-examples --enable-tests --out build/debug", - python=True) - self.assertEqual(return_code, 0) - self.assertIn("finished successfully", stdout) - - return_code, stdout, stderr = run_program("waf", - '--run "test-runner --suite=core-example-simulator --verbose"', - True) - self.assertEqual(return_code, 0) - self.assertIn("PASS", stdout) - - class NS3CommonSettingsTestCase(unittest.TestCase): """! ns3 tests related to generic options @@ -1831,7 +1728,6 @@ if __name__ == '__main__': suite = unittest.TestSuite() # Put tests cases in order - suite.addTests(loader.loadTestsFromTestCase(NS3RunWafTargets)) suite.addTests(loader.loadTestsFromTestCase(NS3CommonSettingsTestCase)) suite.addTests(loader.loadTestsFromTestCase(NS3ConfigureBuildProfileTestCase)) suite.addTests(loader.loadTestsFromTestCase(NS3ConfigureTestCase)) diff --git a/utils/tests/test-test.py b/utils/tests/test-test.py index 3b622dd91..dea8fa986 100644 --- a/utils/tests/test-test.py +++ b/utils/tests/test-test.py @@ -45,7 +45,7 @@ # -l, --list print the list of known tests # -m, --multiple report multiple failures from test suites and test # cases -# -n, --no-build do not run waf before starting testing +# -n, --no-build do not run ns3 before starting testing # -p PYEXAMPLE, --pyexample=PYEXAMPLE # specify a single python example to run (with relative # path) @@ -111,8 +111,8 @@ def main(argv): '--xml=t_opt.xml && rm -rf t_opt.xml', ] - configure_string = sys.executable + ' waf configure --enable-tests --enable-examples' - clean_string = sys.executable + ' waf clean' + configure_string = sys.executable + ' ns3 configure --enable-tests --enable-examples' + clean_string = sys.executable + ' ns3 clean' cmd_execute_list = [ '%s && %s test.py %s && %s' % (configure_string, sys.executable, option, clean_string) for option in test_cases] runner = TestBaseClass(argv[1:], "Test suite for the ns-3 unit test runner" , 'test-py') return runner.runtests(cmd_execute_list) diff --git a/utils/tests/test-waf.py b/utils/tests/test-waf.py deleted file mode 100644 index 1ca6b6173..000000000 --- a/utils/tests/test-waf.py +++ /dev/null @@ -1,193 +0,0 @@ -#! /usr/bin/env python3 -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- -# -# Copyright (c) 2014 Siddharth Santurkar -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as -# published by the Free Software Foundation; -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -# NOTE: Run this script with the Python3 interpreter if the python3 compatibility -# of the ns-3 unit test runner needs to be tested. - -# The following options of waf are being tested for poratability by this script. -# To see the options supported by this script, run with the -h option on the command line -# -# build : executes the build (pre: configure, post: clean) -# check : run the equivalent of the old ns-3 unit tests using test.py -# clean : cleans the project -# configure: configures the project (pore: None, post: distclean) -# dist : makes a tarball for redistributing the sources (pre:none ) -# distcheck: checks if the project compiles (tarball from 'dist') (pre: dist, post: rm -rf ns-3*.tar.bz2) -# docs : build all the documentation: doxygen, manual, tutorial, models (pre: configure; post: distclean) -# doxygen : do a full build, generate the introspected doxygen and then the doxygen -# install : installs the targets on the system (pre: configure, post: uninstall ) -# list : lists the targets to execute (pre: configure) -# shell : run a shell with an environment suitably modified to run locally built programs (pre:configure) -# sphinx : build the Sphinx documentation: manual, tutorial, models -# step : executes tasks in a step-by-step fashion, for debugging (pre: configure) -# uninstall: removes the targets installed (pre: install, post uninstall) -# *update : updates the plugins from the *waflib/extras* directory - - - - -from __future__ import print_function -from TestBase import TestBaseClass -import sys - -def replace(pre, post, main_cmd_list): - if pre: - pre = pre + ' && ' - else: - pre = '' - if post: - post = ' && ' + post - else: - post = '' - return [ pre + main_cmd + post for main_cmd in main_cmd_list ] - -def main(argv): - """ - Prepares test cases and executes - """ - runner = TestBaseClass(argv[1:], "Test suite for the ns-3 Waf build system", 'waf') - in_cmds = runner.override_cmds() - if in_cmds: - cmds = in_cmds.split(',') - else: - cmds = ['basic', 'build', 'configure', 'step', 'clean', 'dist', 'list'] - - config_test_cases = [ - "--enable-gcov", - "--enable-sudo", - "--enable-tests", - "--disable-tests", - "--enable-examples", - "--disable-examples", - "--doxygen-no-build", - "--enable-static", - "--enable-mpi", - "--enable-rpath", - "--enable-modules=build/utils/test-runner.cc.1.o", - "--boost-static", - "--boost-mt", - "--boost-linkage_autodetect", - "--boost-python=33", - "--disable-gtk", - "--int64x64=cairo", - "--disable-pthread", - "--force-planetlab", - "--nopyc", - "--nopyo", - "--disable-python", - "--apiscan=all", - "--with-python=/usr/bin/python2.7", - "-o test_out && rm -rf test_out", - "--out=test_out && rm -rf test_out", - "-t test_top && rm -rf test_top", - "--top=test_top && rm -rf test_top", - "--download", - "--check-c-compiler=gc", - "--check-cxx-compiler=g++", - ] - - basic_test_cases = [ - "--version", - "-h", - "--help", - ] - - build_test_cases = [ - "-j10", - "--jobs=10", - "-d optimized", - "-d debug", - "-d release", - "--build-profile optimized", - "--build-profile debug", - "--build-profile release", - "-p", - "--progress", - ] - - step_test_cases = [ - "--files=\"*/main.c,*/test/main.o\"", - ] - - install_test_cases = [ - "-f", - "--force", - "--prefix=./test-prefix && rm -rf ./test-prefix", - "--exec-prefix=.", - "--bindir=./test-prefix/bin --sbindir=./test-prefix/sbin --libexecdir=./test-prefix/libexec --sysconfdir=./test-prefix/etc --sharedstatedir=./test-prefix/com --localstatedir=./test-prefix/var --libdir=./test-prefix/lib --includedir=./test-prefix/include --oldincludedir=./test-prefix/usr/include --datarootdir=./test-prefix/share --datadir=./test-prefix/share_root --infodir=./test-prefix/info --localedir=./test-prefix/locale --mandir=./test-prefix/man --docdir=./test-prefix/doc/package --htmldir=./test-prefix/doc --dvidir=./test-prefix/doc --pdfdir=./test-prefix/doc --psdir=./test-prefix/doc && rm -rf ./test-prefix", - ] - - common_test_cases = [ - "", - "-k", - "--keep", - "-v", - "--verbose", - "--nocache", - "--zones=task_gen", - "--zones=deps", - "--zones=tasks", - "--no-task-lines", - ] - - test_case_mappings = { - 'basic' : basic_test_cases, - 'configure' : config_test_cases, - 'build' : build_test_cases, - 'step' : step_test_cases, - 'install' : install_test_cases, - } - - waf_string = sys.executable + ' waf' - cmd_execute_list = [] - for cmd in cmds: - if cmd == 'basic': - cmd_list = [] - else: - cmd_list = ['%s %s %s' % (waf_string, cmd, option) for option in common_test_cases ] - if cmd in test_case_mappings: - cmd_list += ['%s %s %s' % (waf_string, cmd, option) for option in test_case_mappings[cmd] ] - if cmd == 'basic': - cmd_list.append('%s configure && %s build && %s --run scratch/myfirst' % tuple([waf_string]*3)) - cmd_list.append('%s configure && %s build && %s --pyrun scratch/myfirst.py' % tuple([waf_string]*3)) - if cmd == 'build': - cmd_list = replace(waf_string+' configure', waf_string+' clean', cmd_list) - cmd_list.append('%s configure --enable-gcov && %s build --lcov-report && %s clean' % tuple([waf_string]*3)) - elif cmd == 'configure': - cmd_list = replace(None, waf_string+' distclean', cmd_list) - elif cmd == 'distcheck': - cmd_list = replace(waf_string+' dist', 'rm -rf ns-3*.tar.bz2', cmd_list) - elif cmd == 'docs': - cmd_list = replace(waf_string+' configure', waf_string+' distclean', cmd_list) - elif cmd == 'install': - cmd_list = replace(waf_string+' configure', waf_string+' uninstall', cmd_list) - elif cmd == 'list': - cmd_list = replace(waf_string+' configure', waf_string +' distclean', cmd_list) - elif cmd == 'shell': - cmd_list = replace(waf_string+' configure', waf_string+' distclean', cmd_list) - elif cmd == 'step': - cmd_list = replace(waf_string+' configure', waf_string+' distclean', cmd_list) - elif cmd == 'uninstall': - cmd_list = replace(waf_string+' install', None, cmd_list) - cmd_execute_list += cmd_list - - return runner.runtests(cmd_execute_list) - -if __name__ == '__main__': - sys.exit(main(sys.argv)) diff --git a/utils/wscript b/utils/wscript deleted file mode 100644 index 26e966d45..000000000 --- a/utils/wscript +++ /dev/null @@ -1,37 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- -import os.path - -def build(bld): - env = bld.env - - test_runner = bld.create_ns3_program('test-runner', ['core']) - test_runner.install_path = None # do not install - test_runner.source = 'test-runner.cc' - - # Set the libraries the testrunner depends on equal to the list of - # enabled modules plus the list of enabled module test libraries. - test_runner.use = [mod for mod in (env['NS3_ENABLED_MODULES'] + env['NS3_ENABLED_MODULE_TEST_LIBRARIES'])] - - obj = bld.create_ns3_program('bench-simulator', ['core']) - obj.source = 'bench-simulator.cc' - - # Because the list of enabled modules must be set before - # test-runner can be built, this diretory is parsed by the top - # level wscript file after all of the other program module - # dependencies have been handled. - # - # So, make sure that the network module is enabled before building - # these programs. - if 'ns3-network' in env['NS3_ENABLED_MODULES']: - obj = bld.create_ns3_program('bench-packets', ['network']) - obj.source = 'bench-packets.cc' - - # Make sure that the csma module is enabled before building - # this program. - # if 'ns3-csma' in env['NS3_ENABLED_MODULES']: - obj = bld.create_ns3_program('print-introspected-doxygen', ['network']) - obj.source = 'print-introspected-doxygen.cc' - obj.use = [mod for mod in env['NS3_ENABLED_MODULES']] - - obj = bld.create_ns3_program('perf-io', ['core']) - obj.source = 'perf/perf-io.cc' \ No newline at end of file diff --git a/waf b/waf deleted file mode 100755 index 15afae21b..000000000 --- a/waf +++ /dev/null @@ -1,174 +0,0 @@ -#!/usr/bin/env python3 -# encoding: latin-1 -# Thomas Nagy, 2005-2018 -# -# Modified for ns-3 (git development version waf-2.0.21-6-g60e3f5f4, -# with a change of the shebang statement to avoid possible use of python2) -""" -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.21" -REVISION="c6c9a875365426e5928462b9b74d40b5" -GIT="60e3f5f488dc88ff50984f51be7f7293b9a0b0fb" -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&SY-®^ñÿÿ°dPÿÿÿÿÿÿÿÿÿÿÿe ¨Â,#&40E0m b¼÷{¾Þè€#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&ÕßMs%GÝÇk hÅZZK³®]½·iºÎØ[:÷zõ¶eЦú;¾ö÷³>²Ž¦2»§vú{¦“¯}7Ó:}z÷fÛ#ª:î¶î“Üõå]:q[{f½æ÷-lQtß7ºz²‹ÎëϦçîåhbb‡'­Þ¹Þú÷·‡v]ã}®›o7¸=‡­3Æ#&#&#&#&(ç°#&G :pûÙ@ñGVmÛ0t#,;–w6Ð]w׎Ò٪РIoræígièІfÀS"ºÕ½³opPÀ)R¤ {T€Q$P  z‘P)¶ô=Ú ß<ÞÞîbì;IwÙî/všîÕ¨³:â’Nl´Õ+lí×WÜôå£×t€77ÙvØ×>ÝÞìðÝεï{†¤¹»¬^û»Þùíï]o¶îWv¯_w»}s“9ÜúñÞ&s¤(uKj­@‚¤Šë%íœÝtÖ'½ì{Ýîæ÷¼çXöÑB†—25†ŒRH¨¯x°p#&%•I#&§¡ç è=¸ª§£ÙgTw°ííÞƒ)p;{ÚïŽ÷›ÛÛz£l¨£ìÊ6Yôè²À wØÙ›ÝóÛh{s¨ïñÝ΄½>ï_†ûVO¸õq×§@7…÷Þ!Ó¬ö7n9ž´1XZ2‡¢öt+×vžºõ°æíÔîàæ'‡¬ézÓI¸vÙÓ½{¤çg´#&ÀSg£…1MÚÛ­Žìtî »½Ú;‹Œ%v›µ«£¶íß@r]íΚukîÌÝ…ï_vûo7ÍëZr»#&õÒë!B†ÞaY¹£€¶ÝÝ¡îìF´q®ÜãßO»#&¾ðà@hdrÍ«`î#&:8yWºûá¡€(S@ #-{×·…{»YvŽ÷ºÞ;¼®L]@ÆõΪ¬¾÷Om¥ã¶Üì#-’…»k©Ö¢¡V«³[Ãzõï#-¬û©»m™mJä¯;=í›ãsæßwH6û©ßÓ#- ɦóîñìlÞpHá»{³-×n}ÝïFè/3ç³ï»l[5ÝöåÙñu}æ·ç£–¯™¾;CM#&@ÐhhFš14O ÓÉO%šS#&P<¡±‚S@„#&@$õOSÓL¦OTõ?H 4bh@#& #&#&#&HH"44ž¦˜š5=M)êo*y=)í)úHõ=5(ä@z€#&@#&#&OT¤ˆIé#&#Ÿ¥”ô(ÓõFG¦“@#&õÔ#,4$=@#&#&#&#&#&$„#& ÓF„bhŠmOÓQ€#h#&ƒBMDA#& ‘ SL˜LIè§Š~©äÍSÔi Ø¡µ#,#&#&#&#&#&|¿þ“üú«Jçúqʵ;µÛóUiæi3PgÆ«NÄ…1&¨ÈÀ TJ€#-€(ù¬Dü¿òü üWæ9¼U?çNî[\ÍL:,—¬65,²ïsù½r>pÖ¦RóúßqþÊ_ROÞ ï¶úZÔZÝZ·o”³,TdØÈ¢ÅŠ)/“ÁçfsvsÒ¯žºcWRjá¬ÓÖù.öN<É˹»½s|Ë9—™TœÉU{ÖìÑ~ëwÖB¸TаR1W+µZmmcV³6¶ml@²#-p‚¢ÔP'IedI#£C#-ˆ¨9E,DFÄ#&HD÷À"¥„E ¨*î‹b±W´Úеª­ï¶Ö¶©™2J35#,3M‘4`‘IQ¶‰™¨D± ©J4¢›i6LÐ&I ”dµ5£`жŒÒY4‘%¢Ôb‘6”ÐH´jXÐÀÓTÚ4E&ÉhµBRËJim1 -!³A0e™ŒjHÔj-A’h4¦Èa&¦4” †‹,´Œ`E)´ji²%´Ûk-[F™‰,fdÌ„Ñ`Ë&Úm´ÓhRQ²’Ó[jm³6RÒd™ˆ ¨ ‹5¦&‹%È£dHÚ#-‹4¢“¢¢A Å%L#4¨ˆ*Sƒb…ˆ’Ä C"2HÚ‘2¥ˆ‚fhd‘1J0Ì‚–VX31"’ÈÄRɬ›,Q0©Hd²‘£iM0M‰)2(Ê$Ñ“CI“#-’"QI²#-lh’,E2–E3ØÖHfÄIŠhfl ­&À$²°„X$¤ØÔDIi( ¤‰*!$J4H¢`Š Ã!Œ’˜F(L¤”š‹3cF°‘¤Ô‘$Ä"Ò› HD‘d¶ $Å–e™%e26"fÄÈŠQ›#0Lªi‰!RÙ¨°H4ÓCc•’ÉJ) ‘M$ÄR0Ù¦@±¤Ä!$Ô’Ê2ƒ&iESMMj€ÄË(4–FB1d¤Èš ¦R%FŒÂfÒ…&5Á™H$$Rf0"HÆ‚%’a1A$Ê™š³m”¶%3!©Ä)›+)¢¤Š(Á™$Ù#ÉSHÔÍ,FRB“3–FVm0•ˆŒII¦¦M3 ¤1”E!³DTØ¢ÍJ”¤¦ŠCddÆLŠm!E’1J2’ˆ¢ÅQI&$“JmMF‘"†˜ØÊ4È›A£c0ešL£cH™ 2 ”Ù)LRˆ„,Ó!-fͬ–$†’ÉŒ†¨ª A"k#-D™ lf$FPjK‹4‰Dшµ)¥‹S#, 3)1D†Y6De0H¥š4¦0† Ð–L¤D†‰U¦¶´`™BjfŒ¦F&”RLȈ­¥6À¥š,Å&‘”%–TÙ¢-L¬-”bBŠlD)DM"¤%6¿;k¢¦©aˆÍ¢ŒlVÅlTl™Ji¨¥I4hii Q°’j6²##,CLÆQ’6S*H¶D‰™¦[%´Q‰IKQµ…£&˜MMf,XXÔ‚™ifL™RmFÊ´6PŠÙ2ȪU,•0¦ÍŒÆf­DVɦVD©–Sk%Yl¥)¦E¶F€ÉHÚ‹ÖX’Ò)j-PUF$5´d¨(ªÉ¬”mQX¨©hš"d±b-±Z†Z6±°“&`ª€Ó(¤FŒd-2M+Kb-LMcÉ6Ñ­Tµ¬±PÈL¦jZÉ¢J‘‰šm#bɵ*ͱŠSiT²•2Ë#-ÔÒ"5´ªY)jjhØ…´$¦SYbÃe“YYd+e˜¡ ¡•H±¢,Xf“"D6ƒBc¥´j„ BTPÉj+$ÓFÉ“IE‘Ùb‘M”£dEeH¦2™‰B’šfˆ(´Zd„ÈͦÒbˆÆØÙ#-aÓ bBŒh¤¢ÃLI5ˆÄ†ÈA“5h’™£Ae”#,P•0F&4ÂR¦lš‹FB£3j2”lÊI(È2†,¥±L6“DcRl–Ad‹,!FKE#,ŠC1&e*e%,¥f+Af‹$lC‘j5FÍhÍPÑ©JM†˜©clÊKQ HÈI&2#,16$©*L¡EJi’B“5„¥5ƒlÃf’ɱšM6b&šQ’Ó#jÈ4*fˆK#-$I6Q˜"4U4Š4@Öi6Jb&"i)! ´Z-„¨Ôj(ÅcŒËa¤ÃI&… &FÆ)D±FÀ–‚³M‹!™D#d¥”•2"Ú6€cTj‰4P™f¨ ±Aš“Tj ˜bR”6±´SL²Q¢Hªd–ˆ#TX‹”­²*QTkLMLÊ¥†d¢J›ˆ™V¢5`ÑS"Å’£h˜³J-“%bÚÒb’²›dKdØÚ%I)e*, H666J6Mb1d‰#,E$Ìj̘4¨Ò›3bb)¬jŠ™Y5™BšI¨ Š(¢iµ%bÙI,l˜Š4PF“IZ‘-,´m µZ-QV2”m&¶Dª6Ƥ¢Å"š"™‘˜ÓR#†¦l“5¢6*’Å´jJ–U“Z&mH¶5Q±±’*¢™TÒ¬mFÆÛ¶¤Ìe(„³YX–£‹4¨ÚˆÚT¨¥+J3Í!”#,,%F“lkeI¤­‹&ÙI•£F±#,1h¤Æ£VÛ-«‰•#-‰‰(ŒT0Ñ£bšIµ0ÆI¶±m‹LÕ´cZËISC-l¥“mMM²ÔšjÄÑ”Q£#i%#,f¤ÔÌÍ–TEbI2’dFF#!d¶‹2Û1üzþ“[ê{¿€kÛ½¼ÿ-{Iÿ3GK#,°”aË%!ÿ)7Ôå?„]”ÏïEéPhÒlú'=vßÒó±½9¿‹øºô&ƒ*–’¨ÿ‚ù2âÃû'úþeÈjÿBžéÎ`¤Á¢ƒÇG±.0R*‚ª¨ &#- âpùö´N‚©êÿHgÿO¾Öú %#-zdÆ{¬3Ô–1Þæ˜–Å·8{%ZM‡Ìï÷â9¿…s†2¡‘ü,<³V-;brW,]¾hfƤ¤PÙ'6ä䱞·léĻʱ„df0$ŽÒí‘6c&5Ñ>Ó\òrhë²wÒ×.ôô«Ô¼k–s¹eüN¼úfsE"¨ŒŠëP¦"W‹4LªvcK™@¥Ja)"’DŒP›Ý·AŠ•Ó5%ëáÖå^<ëµ ¾-Ë#7¦æÉJ/^zò½/]Ôï—šã•ÿ±e‡ö°#,Ü!Ã2˜ÁE‚‘Ý¡\×ɯ&°¾Ïk”–Äc(#ðÿeåâÎç‹Ó5 ®­ˆ¢˜aM¡H²wòÉVcýM,Æ•ëµ(dR8ÍȜ蒜?*ñAþÁ‡j''t-C‚Qo/æ|äWmlÇŠx-›2K¾îJ ½¾XƒZµ²ÈÆ&Úz–Bƒi¸åÑwÊæÝ,†¢®mÓÎâ$ØØŸvëå5¼m" ×äî§Öëöâü r)•ñr-±©)ÿc(ö¸m)”©ôáÎÂV(éÓ ù´òeˆŒÛ1é§dCm6…õØ‘£—.ˆH# ±ª)ÃH,ç[iOWwk•ïíÞKÅs{«š5]r»ÎìnQÒ¹s%uÝ$‹M1ì²IƒõÏófÉDÙ(V)BŠ‘¦†xmŒ¸Ñ9 µbÁ_m£ìI§ïhÆ•·iuô{3!£ÅJÿ¡E&ètÓªÀTqPÿJ@úâQ³úVá%.x×߈s@ÇGìÐÃg-±ædÈÝWT-…Ÿ…Jë½Ëí¯Êæ8W×§ðç‰ÓGů–½¯~C»UáÛ^?ªË=Ç蜎NîZhâ2““«;SFNl’ùײëƒ2†ecž7óÚóµwЇɔ‚œšŠSá×ï¿G=/ƒÞ»µºrkéP¤ˆª6) ÈYS¹7LèÔš4hW’bÊS«-¦ÈøÐUéCÇBËfX²˜Tú)b#Œó¼}ïÏ:«–Eë­&#-ªŸn.àÒR4›O$WæÊù„Óìë "lr–ÿÇuö}vôŹÓÂë ÉŠ_>ºûýP²1ÐøÐX†ù­±+W¢#cÁR…Q4iÑ—ŠE¡Uˆ9h1åR¯m+›+_#-þžÊ2ºÒ…A@P²›&£xÚ¹¶¿Ñýä£Oºêfײ+Æ‚†+ÃÇù¬;3DR5A)AX§×øÿeæ×¦²ŒbSQIðîфۀ#-#,AÆ(ÆÏ€Q›g›4Ƚ¥ÏeÁ(¹®Z+bõß‹zõy2•d¨{]ËŠý©n½ÝÅת(Mõº÷øzÞ)ïÝÑ×1±¨Ù6úe¼cPi-ø#-‹#ªv^‚ìWŽ›Y€d÷¥LT)’š`qÖ¤´:‡.eÄÍkf¬üROJR³ñ;>®¶ì¡‘¬›ö;€ÙÚèZI\÷²ðÑ$XS†­²XŽ2#,7/±3Ú!yx-Ÿd>NÛ¥ÊIuV”ìÒ×}ZÈßÙV§†….þ”äå—§u– XEFœ#-(SfŽ +8ãÆ(ø½&!’Уú"Z#Ø´Õ¯Å)wQ6{áð0ž£ˆô²²•ÏÃ7ðÉ@ÈM +ckt¨1>2’\‰crFÓD³ça÷å» Â#,·c…d?à›Æ¥Óa|\»!£H0˜Êköѳ¨ðªu)ҫ‡‡¶ç'#-'&½)$Œˆø­k]Ì´1#-s"”¢ÞÁo 3Ò±ržâ¹/šuBÌç‰<5œÉðót¿N3ZH<ü1d-XF{’Á æÃW¼ø0´–ɵ‡ä{Dò3T·è$nÅêʱõÒWýë¯ÉüçºÚ|ÿ.ëÇT•ø5÷°ú·ŒOÛ~^»ÄI‚ˆ©ø{s~bnxñ{SK\¨hÌUå!ÌGÆNÁÉ÷nVIüšÛ¬(vná%Ûˆã÷ÒwI$`@bX+»„ù»\}ce2™Ê`mk4µ“OÃ-nö†™ŸªXiô?mÃC¶•çEF}•µÉ÷'WÌ5›eZ3ôLUwŠ÷÷ºâ_ÍB>4\‡ò’‘ˆÌ´ùÅAÚêï½i ÏÁÊEE4dfýš\|è¤Eàf¬Xʼn´š#=%¿'+"ܧ۹£øöuOÃ~Ù¾4H¿užMA”ëÏœ0hLZu>Ïv.ú£³¦õ¶üÞkÏEµÛX) §ëq6œN¹ÚfAuóð“á]!¶P“ A—Ùj]©°û#2&Ïãj4ëž^^°ð;„C²ø¼Ò4̲ž¸üŒäsGšöÑHðf·#-zvmsÉ/lX^´[T–uázFiTYL*¢P[oeU!àÍÌÀ¤uNíÌG¹“ç×–FŹëzt}§‹2C=!ZªÌ|.\WN<®Á›¹º¦›Úái¢/ÛO!ù^ÖjŒƒh~±†•úÜ:j•"#H´W_LråYÑ8Ùþ­hñáPÐmÔ‰lðaK–R‚±7gFTaóŒuòм6Êƶ& :F‘÷ÁcÏ}Ù–Âk2ШF7§éOó¹æ]L³v?¶ßëg‡¼pÿ£C;*wd}ÔåÍöÉü¬¥òvÌâÑG’òc•ìˆçÕêgd$™”¸rkhÖììz ÿë8^×;¼ëøæ[(/ËÂc#¤ÎMýÿv¼Ý!3|lç¾*–Ø×ØU:„éé1äŒ:¤*!šãûË=çÇC–#-EP¹µùk›q~Íæ·¥y²ÅNë­ôÑ `‚5zXF|)é §#-'ÂW_œ ¹T-íV÷ÍË‚ðÂì¤X¤˜Ó¡Rú ¸ýòûPö&|8tîçãÆÜÉÓw–^[åÝþY”“§~öí }=ä«Ô7cëGëp‹†n&¯Å+5ÝÊŽ6PeÉÏ7Ωf²»ë µðÇ-ó“J)ø;]M›àPRxoAyðœõ¡íÑ+yq°-Ó~9ÉéaP½è'}{bQKÜ!4GhaÑû㙪ºÅH…”ö7;–*^ó‚«ðçp»¦POa¥Âò*õãRWLz/ã—1Ùüù˜×‘•Ç»ˆ$K»™ îœw%^#-›4ûÔ¢"ñÆ=Ø”ÏçþyÖ÷ûžN3Ûˆ,Ôò¯{ÿ§–'DXeu«»°Ý†ù¯¦¼<:sÔw.àúÎØÊ†|gi;ù3¥HK)ð8 § \Ÿ!ÖºUpCÀû9yöuÐ\âT [Q‹ÉôðÏ@LÕ#&²qý4ìé]i4iT*åÒTD#-Õ£k*ÏT:éq#,ÛU«Ž±·È¥Õ½Œûµ«¬¥¿…Sçí¤óC&7ý¼°aC7rr‰Ìs§RëÖŠ¯Úɶ)Ö†Û¬†<û «L^÷ôØ÷Êù28mD{XÆó-Ëòž¸½ÜÀ}æ^Ô´Ý¿ž}—è±´7Kª†ZR´ƒïêẤ‘è­Ìx@xŽc½Ì/I€á÷ˆÓ YMh=‰¿UH¤äéÍ'–눢t%W˜.7¹-J`^!;(#,.mü3çsx±-¼kÁÈ##ÜÒlëËJÖñ‚†#-½sRõþJúàò4£Å™‚£"Ïçé›{©ÙLåa$7{%‰Žó Ò _e`x&‘Qµ\#,¨‡Õ9!ø÷VÌÔñÖ‹Oõ¡w­þçG:Ŧ²X‘§Ä³(ô(AÃ>j£Ì#-ð{P—Ù’p›ù‰‡—Õ×éßÊ̾ý¤Ê#,Ðé¦]¯‡%á‚?“Œõ€ŒK¡[@ì{É+ù¢ËÖò„|Qû%µóÛc¥CAûœu‰pá….é~×nS–q;jT0j×6Š»j'è¥)üµ¤Ú°-½ôæaìÜ1˜8ëRA¹|@¢m1DYꞺrÍKû-ÇßP»ªþ$ Afv2 b>6{ðúèý>úhíxÙžij§q”s’‹cÌ3µgÎF9P(&#-‚·¨°›FˆÎ­7ðuÙü =ÛÌëkŠ^ éÙ×wv; æ´•àÕ  ì®Élßj9×éîÛm!üo#-WÉ} ÛÇ^ž“t¼WRLa•ýIŒ©­µ„\bŸ« ¡G»5:¥3yÁ¢šfXüMtæéÓ7<’hÂÆ#-º’&vb£Em¤MÉé#LÇÍ’6YM 7r$ ^ÛDõT&ANÿ'?‚hAá˜WÓãRëz-sÅŸ ºúåУ$ìãý„ÆcùMf"6½ò.µ¡ËúÙ^E¤J6(™¨~O£¾…†Ž®ŠøÓXKa i†±å›C«Bâ|àÉûBQÓ·ÛZÅCŒÆèï]ÆGŸ¹U&° TTM2`½)àÔ‰ÍI#,ÚTèÌg‰.êË­P2‘š’…*‰BÅxûqKŠ%ER€A„Õã·væñ;\Š\u]ruÖÎEV(ÂZÓ²‹ý?g}žƒêð›ù¸àî(R¡ÓRÃí‰'ÆT’K’Dr”:¯~qöò&oômÿ¹ÁC¤ö?£·s!Fìciýï#&I€#,Pïã•Ãp%éŽâ6'¿%ƒÐ¹B¡ËFîÿ§çþ6æå©â£IóéZüR-çºö3øTœÓ8¦a9Ä—²k†¬÷¤Õ’ugÅ#,Þ.¬½+D£\Ù~UÕÛÊ2¥1²lÛà“B#,Ÿe ã¹52)´L ÙpSºJcU›¹ôVrº™¦’—6PÀîgêË\4©£ºE%U¶——£²sª tÁeF£ Ôd‘#&Ô«ãèd¡8¯­‘`¢X*ZQˆqLˆy)e‹8«|Êãý®®#&úžÁ®ù”}F0ÄÛ#&Íæ ¸å'E<¬åÐ ¤`4—Š*€aú=·?^•º­Ê#,0qˆ¯m€|42eoèmÚàù>÷UÇ˦.òËdÔ}&ݪˆ%”côõB±Û=Šò«<©Ô÷œw?þat¨âQ‹U~ƒ¥Hãú\0ˆþÎ! ö­-K#ö>Ê!w0¸CU‘íûæv±ÀI ¹w¡ÏªëÜb +èí©¸Þ.¹«Ftª!oâðyN6OC8™Ý8?ûQBše]páŽû`{aQ ¼s‰a­$cníÂŒ»‚”)ýÜ i ,¾ßï·ž¡mi¥Ò%f߯æ<9i#òZ€ÛŽ!ºÛi0Û;ö~æºiw“òÜ|˜ÑX\_‹Ör2Op“œ¼˜N‚Ò7Ëì¦mêKªb³ñM@ÁJÁY¥m7¯Ù¥ãNêàì™cµkßJ–”ž‘‰Ñá•ɨiP%ᘇ÷~ïÜ :!C)9-fªË®UFZNtM…uäöìöÐíuâ‘¿‹&?m(ò~®Üø°Ì¸q:zÏ¡sÄø‰81…ÍR‡½°AKœ»VÚr)s³Æ‘°cu‘yïq³>É’[(— ž3¹-Ö.6-sÊØá0ç(;Õ1Ä`]‹˜@%‘ #&ó"‘, ‹O’#-;µµ¸\¼øÜ×þ{•ž´eÈ¿#,ö¶n‹{ß6ˆó,·=µ!ŠPŠç¹¼!”tÐv‹2Ù»—-‡ 8ëפIIÓ,—.¬Á6>¤m«ê×Y×;Œp·]pïãÊÆ-ÝR ûQÿŒ@{@3#,£oéövÙI;:g+{-à•ÚÞ ï]F7ëp!„¾Î­/ ?©¹´RÇŇS”yAoùîÓ-#,Õ¶Ôò­rÁ·+~Žûà¥OœÉñ Kÿ®ŽÏFvT뎉?肺¨xÈBMN’Ã’„‡ñðã¶œ¹ñ%^í?Ô2u³r#,mQ€c@¤ÛDÐðXéß1Ý€›Ç¢¢pX#-€Ù} o棦±•´¾ä‰¾péœËìÒÒ%ŸtŸþ ÈŒŸ\t<ã;í/úA=;'^nc«¶.ÑÊùˆÒÁÏy•Ýö])ÛÏÇ­`—zó}¸jÂv-ÓJ#ß|וF~šå5n‹íµÅÏC£1´¯©)ì£wíê»Ú?BÃ(ðËs¸Ph8? ÛLÝV³Kž]'²90xÝôߺê,~ùÙ¢Sr9TbOlÓ¦Q/ÿ—ßk¨Ä3Af•nhÊ3Ó+@½4ÉC«Ö1`íÃ…1Ø íåò,‹QÉ[‘ÍeÛU¬"p#-”A™Xçùœ¶ºsk6éPÎ#&‡fž­Ø÷Ư]‚ ê–X8 C󔳸Aݼjçþ:×?©†§Q_òe !1¿w #-¿õÄkù.ÇêÝ—ŒŒÍBpJ§‘ËæÄGþP"›ÈÕ#,;¿ñ7lKœ D^Ùâ`+ŽSÝWgûwEÇ_²u£Çíça³Ó™‘º‡uó #-¯x#uˆ~=÷ß¼#&oøÀrEÈ$:~ðàÁM3#,¿ßãöð„Ï×ÒžþN1^ÕTE¥’$Sd’<]¶ò£(òøE“ô§Xùù¹Æ½6Ñ"Üsn£Ã׫ËêöÔtúµ¨þEC%^Ä{Juýzµ»¦Ã€uàƒr¨$(°! `gÑùâ3#&LëA°! #&A$ø¿Ç¿Óý;„Kg»ÐØ>£÷âéw^»å #,ƒk¢À¢ ÐD×Ì@ÿwÇêI¹þ¬Æú)ˆñ0óG÷-ä¯÷9¬]ÿsx’v"$ØÅÎê¡2(ŠAúJ›Œ˜#&¯ËO2i©:Yð6Œ/ãüK?wÛÆfÐ~ö’ë.¿3»N{e¼ ­X=Àg›ý6ºD¬#ñžïMËüçÜQ®õ ²\tTD—{8±èaݘ=¹Ž4)/r×#,ž”â^8ª IB¥šŸv)3)؈ǖÛ}¿[žU‡ÕŸ ý„¹oíü2ýŸŽ› øìÙŽŸôþå?êÌO“PÅGX«¶‰½Ù\ëoUÇ5à‰³JÍÏeL±Y|SÜÜ™#ú¿É?o±|¬f«ý¿û¦a¸0×?²X³¥[GTrÕÔ§ÏÙ»cî×úþsGeÍÌÇöyúŸO»Í†ëlÈvfü<ØTÐz3s”G}©vnÐF°èïìº(úJÈìýÙüä0¦º?e›lz=üw]¶ú‡|£ùA÷ß¿™Fp¯£¡øÞß»Òç$5µ¯AMà".Ï#&怳·§¦sìÜ¥×,Xj"@ïkò*°N^›ïwÊ̘#,E#,¸}§éÇÉá8p-c&ÉDUCÄ÷'_©×~ˆ^Û¥tSþ}oöôgS³wÓ>¬XB§<ˆIÁM•mGý—øuaÕ9º»Î}œíýÙÙ{eˆ1ˆ0m2HY£P´Ÿ¯#߬ž þÏæëü_gÈß§?ä?^ íÚyK¢ªW#,ºB`¦¦Lîì>…úä²dCàæÌGÌC"5íFSMÁ¾Î5a&n»kÈ¥ÈcEVvÙmŠ"^Qˆ@))¬„Á£w®ao‘œÈ²ãï2InÿÒò0…¶xÌ­­œBdr{Ø‘ãå¡Óá›1X Â˜²<’•~nþš‡@n†F)èÞ]îý÷-#-!ÍÊrfžûìŒá'ð÷rúºLȧ­Ëj¤ˆŽ¤çsûº—0†òö¼“àƒî2`L -zÙ­Ãæ ½µd˜šÛ>±TÆoí¬X[0ùéîïvº˜ÿ&_FígÁÚH0ÚR»é̹÷)þu¬q;3æDc]g=ׯÐ2 I[Ÿ'áSáÚ|ñ'±1tÃOO®#,Ö½2ÚG(zØ mԜ㬆0°ÐÃýôu’Áp'H¥tKEh“R×[8ت,UH B’[¿³À ªãƒ„ßg;ð½ȈØã¼]p¬|òKƑЛh=iŽÊR’:ù›Û‡éa=^¼šë!ê}ähƒ\r>ìí~gŒÁéÉ“è³È,Ò8)€5øª@ I¯vyJŠÜ‡€ºïŽÎ¡wF!m#-Ÿ˜#&qQi@•#&@™ðѤØ?3)}ø·ûI½½9§ʯ1ˆPV~¿•ß象’bãÐÛœS{Ó½VZµ@U3žwåñȽ—}ºoKÏPõ!Ãi^á3´oôjBI/– p|¼¶–e\åÆòä«ÎˆG^Ù÷ï_ÊõÆzˆÝ#-=0ú¼=Î-=“,8Ñ(”ºRK¼Žœ­Êø/ú·m̬oÖ$“ÛÛá±Le`ttGY% qßÄ7Tå!‚¡OÁö_‡È#,Ã}_g÷ó‹Ž%z‘”“X@·BÎ q$Õ#-m„ÎÐè»WºHì8€•!öᬜÇz€øáëZX`¼PN*" ]‹‚™&¡`E[¦{_Önžøß}ˆ6NÈFˆþ—Ö¹t=¢¸Ô Œi°2÷ ¾7š}>sLøÁ( ‰¢§´aMFp¡Å!w)Œ…DË .îqß6,¶¨ˆ²Äô©¼° ÆÒƒ •ÇLk1žú£ŒGT>‘n¿0Jf=1Ž«Šm…wˆÆTˆ°вO´6ƘڱÔá‘¢»µázl_wîÿ8hx”MöX0,ìÉ@¼û5E:>EÄy¿¢‹{”]£ˆnÌx®)ž¨ÁSÝ  +°5Ƥ°D$Ä€#8¬>Û€þC-õ?·Ç}þ_#-r{£ÙäФívT|1a{È€õ@#+Ú$8£œª/‘m (?µZI.3©Ku-(T:åE˜ZX¡2}uØ!;v\Øæïz] ïU~˜ga“=åhÕ);ãxuØÖ±é˜ƒz9×™UþƒáJ7oQ÷HR"Ñs‘ö :ó]"”ÁØP(¡Aè#ÄC ¦¨ ¡K=ØÃÆÉ§;B¶2Z!(ŒÀ­læÁêNEäªé¹ö Õf˜ÚRË4¦¢¤áhE6-óFÜòQb=#§JŠª4w}ѹæfuCBePGá|XµNçxœ±uz#,bƒn=>´{Ë—L9„phr39z„)‡9FëaX”=U™S,[øõs….ܨ¼`¨é“Ññ넱ֽ.z1»DR‘Å+‡GàÞ¥<#-ØÛÍ£ŒU$2Öå såÓߣÉz`;%åÖ½yªO8«,›}YEÏŒ½¯^$Ç«<'è8&ab£½#,pÕßèØ$Lˆ‚"Ê„Í÷q« |Á–`ÚôZ«ÝGºzÖs2ã34¬#&b¹ï}†péèzkp7mšç|ˆŸ×G÷°×Ž,-Þ.è m@B³eͼ룉zî×wžeÚîî´ñÙŒhæé›rÑP€– ɵEñÊ‚"«tÑ·*3÷Úx¹ï:šä³‘±‡i€i¢4&Új"’#,ƒTÅf 0‚1FTm3ÛžÜDÁ¥BâF0cqÆ#&Ø€= NÄ188Ö÷#,A³ëôó®Iª½üÃÆÌqtÑ¢@’6#xlùT`qé(¤í$Á(v:ÿR½¢îlû² ñ­»ï©V©~\š‡5àä\=E²¸Ûà¾ÛäÜÝ©wš¢C÷©K.Ç)oÇžh¸`áPP¦E ß8Uã&B®¨)à†ò"àdÄe ˆì/mû¬c·L5¡¡C*a Á‡t……"}š~|ü"ò–XˆD2gZhP{Ç’=ýaŽÆUmô“kTçjÚ<gß×ÎrRÓ°8k•ývO‡¿¡kʶØgâºó}¸ÃRf¼¼y³‡í÷U¤cý³C€ü4/ûn¶DuKF›Õ’¦,h!x£Eã>iBg%Îm޶b–Š†æ˜¦Àé˜JÞ(c’ö%Ö…hÛÇRÇÜÒ4&Ž#,D5ÓPå1¬aX£@æѤK"ŒÀ4V—M,KX™²…ÖX21"'Ó½ؼ¼®:¦_vH㶺#-9aÖŠø­¹£%âºjôÅ«ë«Ï~Ûrli‘F,MAdÊ"Œ–ÁdPËꉪpŠØõÝT±¡dã¢E`V(Õc`b¤(ˆ°4ãSlt­|§O~§-±Ä#,^ÌöY/Û­˜ŠÑY‹\DŒ!V Ò¼ë<ò–Š)X,_C À[ReºÕHö õLj¾xcjk!ŠéY+¼3ÊÀpäzÏ‚y÷›öX~G?‡Íþýykïâùm¨w»tDèქ´{c^# DÊ#,äߣPþ\{›”€³¢Ñ7`š•-ѯóHzè¶Ñù¼–èßB¾AÅìÓÚÁÅ;âËÚSÔž(;|¶Ópô,Èà¸åK¡´«©±Ö6YRÄ7d—Þ¦#,}›uÏO_ã©tÚÔã‘2¼%–®õ@!“¤˜‘öKY¾#¥ö’ZÔŸ~Ìì‚w¬9§¸Ýô[7æ· ¶Âðþ¨3A‰´g…ß”±äú¾3œ;ƒï‡?iN…„^®ØÂtÔ˺pÒmxMÔŒ,'mIâÐÉH€Ûõ·Ê ŸUë‚ WH(‡£káB‘¨Ù%]3¨p#&†¾†³>3)$”7]-¢à~ÍV’§éœ5ÍóðáYËÈkhMj’ˆ,T‰AE`ßsáœÁwœÖÜGæ"/ÞEüÇ÷û¢Txk¹ïÁ/só ÇTcùÐ#-Ü#Ø– Œ’Ùî?´æc¹'£Ç—èÓüùc³±÷_BwB";³Ú)å¡HÏó¾a¶{aŠFâ¹VàÛûÖ71§È¼¨súúäÚAŒÐÚc" Äro'™5dEd4éLÔÄC"ª]"k$¡‘f@“³­МYÀÖJEéQÁo2@CeI7PÃÝ¿Æè\ ©²ÉE!²]´@Â¥$š´åÛ¥"›QDF4¬Y#-0š7ÌX™–•&ƒjÐÛ‘€ÝC ¦U ˆÇ¦a¢A‰±!ˆbÓ%Ù†òýß>_ãÔ9¡%ZúŠ¿uãº[¾i böí#-û»;-}ûw[öß®¢˜Ò(d§#øv®"“cŸ(|¸ôzR«0«ñCµÊKÖI¤‹R×7‰Ùåɸ¸5±]!K–n.,4=Èó%l‹(Æ`°jI"ëêv›ƒÜäæ5Tt^OüñôíºL˜ðÁ§™$ & ÙñNlÈ»q!X<ìE©¿ ÷þŒ¶´×AÑKÄžÆÄZ6XZ nFX•«D¶+]1t‹•ˆªtã¢>w”½v}›ü«n‡h¹Ñ¸ZÓ1²r>r!ÀT‹šNVß&är®Ù- ·;ÜðÕ³0­ ˜85ýv®«&U¤ˆÅ+5PÅ1zõ«xk.ió'[0ä!÷=²¨ÜL#Ó‚sÛoì×lç>‘áFö|ŽW¾U=Ø£‘? {°#-›þ~`Ú à!x”)e¶b——¦?âù_´Áõá#&dÇØ¬B>ÄÓMsWï‚„ÌKK,Þº:¹¬ 76›BYÐä¶ù©Ækm… ›ñé©MôÊEÉ&\\^¤D‘L›Q†[šµÒɹ·M$‚Ô¢*DƒT“"Z®”T Á‘Ò«d<Ø*ö iÁlÁ°8Ô¡’×Ûš“¯陵¨d38 7…ÊÔ¼1Z~/ØrŽÈ9Ƨ?hR{qì ã¤#&OÌ€”#&[à ޅµ¼áÛ˜(r¯û›~Ðï«‚ë„Ù±êö¶¾6à3å ô ùÔ»!Ô¡ÃP7F‚Á‰ XÏÛwìØ?ÃñÓ££­›TÒÛô*\G:yâ-=öQáÄÑÈ%ú¡»ÉÏÇG¿§ˆ×娯v.°ûÌ~-  ÔõOrfÄ•c)Á_ùLÚû˜cø`â~5ÍæüÙ^B}oY%ñŸò¯$_ËqøË|:VìnSÏt8®3 |ô+‚”2¹ð<ÑáÜû!å±[ºC›’ý#&ë%£: @–]ð_¿û£Ë·á¼uj#&Q!’^ñ¿Åû6»Åe’fç¶î¾‹§S𯾷þŽϳÃ/ª`oø­Ó#,çøØÃÏñìÚ~Ï»gEk¶ñdÏ× F0O‹Sbø:•p`âä„w²IS˰o»ÕÌ=$ú%×ß;­w¯ób &¦Â+¨‚QÌHG2©F`ÈÅúGý#-1Aéù~Ÿ£<%Ú(ìh·‚C„˜ÔqKHæóÙW“9K¬¦Ý{жZ’¶å…°ýßïûÿB#&Gx¡óÿtÍ/ç³mšyÿ7Ƕ\#&çE„ T¥Ü»úmºÃÇ`OØ~ÉG×ÏÞüu<½åzä4:á÷GÑu»þvô²,*[ž§V‚)›RY4Iˆ ÙRÄ¢ýw‰£MŠ¿˜½·j(Ö[¹×e#&¤#Rþä¡@Ò_îà57Ám_¯ù‹ÀûœÛž³pà™pþ§òå–á’š‹«M·Âì A.ž–7éóìù½”jñ ‹›w][¡’R¤ήè^Ä×ìëÊÿÉ©«÷ÊÁEÊBSºmþzj#&·‡Õý\OMò~5ˆL¡ŽY›²)ŠüL!)°ï{¿Î–M„ŒÈÁwIÉz¢ƒ(,Ðkz•tCmé$mt«ðʶAÄQ 8*Šªd"‡œ"~žÌƒùÏ»#ñp¼ÎÚ¨ÛMˆÄãK0…Í5@¬E  |ôn‹ØÚÛþ^¾yá0ÿD‹Û ÷TÿÇW§ù÷›Ñ–i~-:—øë‹÷©Jfx>ƒý#,.£®0¹ ame’ø¶*Ûw°ôðµÍjÀ7Ø ?À퀊Á¹ãä=¥•Áèáç东Hã¨uEšÇË죀Î=Z‡èý>‡Ð~~ÜßµâÞñ§éú…}Kää™ÓÖz -[O¯G@Ó[û¹ð»ÑDÒÏsÔÿ¹túoŒƒº\<|¤jøñˆ¾“ù͘-§>p¼aôU¿Fåx~9÷¨è*Eº,{¿º. €äAÂ`‘€uíê]7 ©YϚŌ9sˆ™_.‰žÛ¡í’¾{;:o7%èX×k½âz,ýQ ¹—iÒåŒÝýú|Qñn“j¤mwãêü³¥¼+¡‡mì‚FêïˆÃPÞNTŒà©×ôî¹!üTEüÓ<(G}ê^õ ®Ó†­öÝmçsQŽ^R€4ˆeA@tžöÅ9Ë C=w –SP’(pɾë)c´9ÎçÓGü}3KåN£¢ýgå8É÷ãŸ)v×…!Uñ0p˜Ì[‘éºT‹·‘Ž#ê?º‹‘XìQùˆaëÚçÁ%8ãÿp= ëû`‡L¨ùA÷g?qGâhòÙ°@Ò¤z/òWÐØƒ¼¸¨2&O. ŽÓ®ÝûÈÅìÕŠÈÔhåƒy„M´ì"Nxöß5+Œ–Fq`OcdÓ/•%MB°ñgJÆ “)æU v%ª& yu‡5TÑYƒj!@“‚“šž¦ÏBýݪ$'ﲡïP?#&ØbHp2¿†W•fB¼¨$¡;J=?©†›~Vúæ-й1"vþ Þú`ÒñAüŠž ¯#,fSw#ýÚ£R_¯ø{Ÿ>€BbÁ/ê@;†ÐíÄ9 å^eäÃT“„ú÷ùQ\F™Z Ó¡ ˜Hl4š¼¿µBïUWÀ%Ç;—¯É± Sð4²ÂÀbGût°J ÎȆ%}#-Äz¢X‹ÖçÖ0'óô=?>Å\¡Å"…>#&7I@´$ƒº… ZFŠŠˆö¤çÄôò}øúuíà?äFÏF–äþµ8tC¤«œ,–‰P´Bˆ5,¤Þ˜u).‹x ©_vy¦y§fËè$ouÎÆÈ}~ÓõL¡³³?åÙGW¿Åôð—«èú-?†Þ]pUAìôóûŠ™iM7Õe•áÃÌG鯩³Ÿ¢Ö#-õÛ¤iòÌi)mt_Ë–»;êdY{{ÿsx½GöðÝ}¶?Eº{¾Îýƒ~ߎ\·Ø!kÊôÃÏ~8EDµUí¯ú?]Ráä>nåèã&÷ß#-8ëpboÙŸŸCìv诹ZSyŽ·jû·G÷ðökîôèÏÊm‡y²åžŸðé÷¸îÓeÁEÂÀ2wgŸSëÕ=<þ¶ƒÏN‹qÀx=†þ !÷§«ùËÝ}Èä s$“â·í~^ÝêèÇe%=¦"Ëù¡é¿õŽ\qÛo‡,<›øyÎídÝ,w»ÌD½_ ]ªëû©=üÍŽíš#-tCÍdîã񱧮–‘èéÕW‘!Çèg§ŠJÄHÐþ¾*…†ŸúaŽîÿ³[â9+5ôS­ü#Ýú|cgjïµã›ÒhÏÏèê^ÿ´ÓÝèôk³aÏѶúN#3'p¦±‘wí¾ÈmEWÕ]÷Y_ϣɪû:t¿Å¨[VÂÙ³½~aé_N>˜é ÙÂV÷jHdºŸô ̾Ãj€ÊÑCÑ1ðúdኪjßñîŽÙK{{HŽTû<“¿Í¶Ü(£›÷(‘JüµN|Wêù÷êá—þc§!{l7þŽÄòÿ?o¾3Ðëíü56½§N1¥çò#-îµÝw¢þÜ{Z=ÀxLaú ý³œÙ„{5Žo¯ùpÑ#-¡ÖƒïЊð!ÌW£³7¿^©†Í2_bÚ>m|]ó>x;Ž—6pù:¤ß9Žžjüï÷³ºñ“b#&¨<±½«ä•é÷´7ý¹èG 42*rPðÌ…ymŒõYîöÙÙõZ9öç‚|ä~Aûø»Ov•»” áNÇÿ†~¯M{­·ùpýEÖV¹Ý: y[&—o•¿ß©©ûýß¹ Aî#™s”J…uýüï ô€óé{/æì#-‘IldPÞ Ìhä€Pa¦!ý|¼!ø|¢æ±E (Zb˜Ã¯C¹?ðúµs¨:>ψ'îî©çé|5þŸ}¼¯æÐ}ïŸÕÙŸp—Ü,fm}ýc¶ì|óÔýGwÞoÓénܸÄ[lêÙ²ÕÙ·ól¿£ÎjBíÔ‰Ëï^ô厮Ë?§-#ÇâøçÛÙùk¸aõ÷ûG¸~¡Äu>þ_ ü…ËpêmŸ¢fywßç`?n­Ö #-ñ_¢Ÿºä›ücÌ>kG@û6‡áøáN«tþjæá¤pù¹š·~>»ãQ¬Tlô§xïúópÁÛ5v›‡L>Ÿ/ξ³Ž”ùGã¨Py?‹Ç¼K@‚´COã›o=ãöý‡Ö–§xñy8ŽnPåVˆQô•ñ½€ë?„†Æ~Þ#,0üF‚˜wóækÏáÌ|j»%ñ-þ—Ñê±Õ»îÙôŸ¿«½x‹¶óôÿ}Ñù‹ýmÅØƒæ³¿™[G'þSßX“%úŽvÓÉ4Qõ<ŸË÷ádE pòx¡Oz¨ÇIÃÂbû¿>Ä7ß>=|’:Ÿ¾#["I¶XTS×¢@æm,#&(ÇyPœ™¾Šƪ’ö0alµK¤®C2J2A7º%lÄ #&¢ãUâŽhÜ, ’΄NGI]’±tÁôM+Ñ#,3®7k¹½×»<ð§MÜü]pâ•#,µJ‘ÖÁ€ÒúíŽR#×Çíã4¶L¹¨â+¹x;.©™À’Xê%äs‘¸KPüé·öpÓ·Ë=??¨'Ïõoýbÿov˜q°š÷t°x-ÆÇKk°¼4Švƒ/,Á®ùV´¢+‡9âdãѺְVŽèŸNmYå”F™B²ˆ¨œòòÙÄQ9\èÝܵÊÊl,mŒKÌPŠÔÇùgµæï:êûÔ_GÏNµtiÞ<› ›÷ŸÀvóLÙ0ÍÒ.25ë“ÄÒ²#,“ÝH׫›Õ(ÆÅ´Û{,³ã#-êY¸~ßSƬ÷$¬Óé kž)nAuèAѬ]¼[y½8Q¢Xá¢qxй4yð¯{ÆŸŒQãàG¡¼¶ßs¬øä™BBRwB‰{ŸdÉ™ýåï–öl7·ÅÎÓîú8‡t“˜lpL9…ë·ÅC¨þ}±‡”ó;Ëü7.—QKÊÿw/K?æÏçЛ®å¢ï< {ìSµ$›¶¾žÜPúoê¤ìd"v“݇º¶:Ù)^›£õº¶|Xá'SÇüa«×Q£Ô3#,ào’õ½„:T’W–#‡õíšTOÜÉT§,†$xý;ïÄ:¢d”ò—áñëä”s#&Þ[pj#,¥ñØJÞ-:'þ??ÐFá›'Á§ø•fFf\ÈÚ–7a+,ƒDpaSø=ª1­A£J Ûb¤pDx&¥(“vÄh†‡1¸°UV”n!tÙýz]ÅÀ¬ÕÝÊj̳5QÑ¡L0„m…„v)lv5‚…c#,2J`B#,YCCt!I± ÕŠØ"²¸äca>¬5MÎØ,m¡´»&6)";~í-âí¨th‰{E¡>8­2m:ÄÿÝ|­èó‘Ëf3°”oðöÕaü…3Òk2Öx³_ò C5%uÞý΂w!aàlar(ÆÒe„aŒÁû—ì÷oý/S÷Týæœ#¯#±E4DC»::P#5˜¼hZMê d)TI‘²Õ¨,M±¦Ù…¤’© ÿçH‚P´Y¶Ï˜èúô&S¿ ¾ nYšsü‰¢þ±?Õ‡Ë.“}ìýý8Òø$2p´iŸY²Í2ÆsªÝu×âÏ–û|ßÇG–Í•å쮽“Õ´KÌ=#-¶~ŸÑéÎã°cøôçŸ^ÿ¬xâ›Å1NïÃøàûs³èÇög#ü="à!¯VÇ}·çõé1‹ÝçYVʬšã®ÊßóÏdsøk†amÕa”ûQ‘$ƒ‡C¾²ëª>Ñçì÷~ÏÁ>¯f^®ò‰i ‚¿`áÅÀ#,@&ª¦ßƒ€¶Ó«ÕÎ)ê…œ7ôu眅‘'ZþUþ÷#œ®r½•òsXZyzm7óëÂaSZ–êwÇø·»îè×åÙüm×ÇUÜI§Ú‰»+?ýÚ{æ-’È …übûBßç<ã¯Ð¬#-)£¤‹Þ\p?½ñ_×íÖØÄÑ›^†+rEµh‘[J%cµÃÝ`¨Öð2Žtõu¼^´yçœÛÆ9ÍfRɲPQR¶¸aa‰F$7@+9²ã—"ˆƒPm¢b•Š"ŽÂ× ÐÑ\YJËgø=ª4a…%kœÑ¨È)j•ª!l¨Z-ˆPж#-2An¤Þnç£0)׎‚Q7"‚¦#-Qƒ!70aF˜L‰ÃÅÖují²S@ØÆ:¢HÆ%™ 9˜Vvª-!òÓ¸èêYKk™ÂHZo®RQ-­”i¯î:Îí` 4ó´mÎuoføo"#,ŒLY"L¨p©ÄH÷`cô¨ŽšL‰áh%´±&Ñ\Ȫr#AÕDaWzeF8×Y)Æ6Ox1\ìý«®¸ø!U†$‚’IsJCÙõC‹D´&é½’ôAŒô»/øº£'|F`2Â_õÜe¿¨ÈÔŠ#-Åíå#-[ȧªx?#&HΪ˜Dð<ßÑCï³4VþkU××õ^Ž}1A1߯[öšÚðÿt7µwLéÑŽe¾ÉþZŸ¦»»šgŒîÌ<Ö=a{î_”¾?#,‰²""tèò/\õÓ‹z²×aŸŽß‡K€pšË-Nq7³ñüS›äÿ5Cúž¢È#-žÇ0á‡9 ¹_À§qúbG°~}|¦¤q€ó7kˉß=!ã_Ãõ8#,R«wUU|þ´^“_`ZHK6XžŽâB>˜â‡èþ“—3è—åð^B!øü´ÑëžY÷TÕ¿§+>ŸÓë!‰æª£#-»G(:žQî;‰íÏpñ²}?G+ßêk}·PYNÍ“:1è%÷ÖCê‘‘nÎ…™¶ñu–ä¶#,ôtk®ç<’müEkÓ¯GÉÇŒ0±zä`ÛŸ!°O««nÍüÔx–‰U.áB³÷k*¢¿ÏVÚ1Ydld„qV!¨÷X­€OòeÓy¶‚´‹QQHPK*+(bˆÈÖÙçõËùüØûü–|}c¯û?تëÚvïõúÿ>ŸžMζ²è… R,FÆzë›D̈£˜æQeû(­¿A3§1¡‰hp‘´¸kvé½¢šÁpf'­T-à+™c0‚O5+4Ç«]øÑVƒ!XA‘¥^HÃ9T‡S3 ´(4ŠŒ™Ej,¯¥ÍG-/%ﱉ¯ºLˆ{¦ñ#[Q}³S&ÿ !°YÆÚ kÜ!4¿˜Œ†hŒ5`£yTòeLzDm,ݹÃdX1ÈHÈ»¾.K,AÙU¡óU›z´ïkU·Ûp²&Jkw¶âfƤű›¢††cM£aÆP6ÏÚØ´y.Ó;0'hn‡i:ÚvËÁñMÕ€º ¢Ù6Ò…QÇ›?¹þL™2‘ß0Ö²óE#-*ŠÃ-ŒŒl„³Õà 71¥‰=² VߥÑOœFñ™ç®FÉ…NTVHKŸÚ=2¯8T¥#&!#-To]Û¹r|\!»¸£Æú¯´TéÒßöèè8‰(B–™Lã"12߬?И-ä Gð(qS‰Ç¥R¿äý>Zcê#©þ_|¸œmP·c(žŽQïͨ<Þ O¤ûÇŠº1ÕË_£”éô‡úF§ ÞÝ@>ÓXñäDe…FØ£,-*ª~ºUQœ`¿=Þ-È®‘©"åÆŽ-(Æ‘*tûçÕ¥‚«$ºu"8¤ $n¦æ`ïÝcU½$NÑ ÚhM$¯ÏNQC¿Æ_ˆt5³…‡ŽÒÅ“MéСʂ;B+äõz5 #,%¢éäZ ÑA8Š#,¸67˜æb±¹Í«¥Uhª#-œ¶òþ,šíwtm¾c‰)P”k–Ø$Hd0?#,[ÿÌ?{Ïíë¿o«Ì:.\Ð|qwÉפ]–¯É>|G‹Õü¼%^ê°!‚*u Ô‡A7OÏ6~‰4.šVƒ#qn¨ÇGiæc¹Âes,dS#- EoõHlj21´ÃìHÇ‹½0 óF‡âG[q·º¨ÊO®‹» ÿ¥Å Ÿ¨Ä[UQHÔiÄWFã…/nˆ–7#-,°4'×mæyÙ˜Ò&ÍRç%ÜZ8LÊ,°¡+&°,”ÊpF´Ã~”¬|C7Õ2•(¦š€¢U#,"ÊQB_zf$«¦E¶°æ#-±±õ!¡Êžo…m´½8MD ¬’dnŽ’`»4f’[z±¤Ær#,ƒÝ^ „OĈ‰âøh4jq…cLîPË’1‘µàìe&E½À¬vÅ`j0t¡E&Y": —…™†‡¸…2.'ûãJ?þŸ³>#,wТÌFvn9€Öò„À¸h{šŽøÁ£á)IÏŠ”â4Å—†}NœI??ßàÆØaWdݸŸ*gBƒ?yeV&Qß½lêÉC±mUkºã’b~5Sa«³Öìç²¶šDÉ#,ôYO#³–^@/$T‡Djm¤Y.¹ã#Ô‹ëw¥¸Õuço½›mŒcõŠ/!¼çöf£nMÉ*íKqŒ{±µZ$Â-àLd"mZ®Iàëàô»Î˜é{æeõîÛÆ‹ß1®›c6Å;"h§&“6ä)’‡0Û8ÌR ()ò¬#-ùªŒá5FvÄ(_¹Bñ/ƒcýbÍXR#,ЧÓn¾è¸{Ê#/¹¶Æj Ë… †ßRŠY¡ÄM^ó8Iå‹DXe£C"g(ÈDf¼ÈQ±GÔGpá®ó¿´·ÂÃn8ÛË:’O;#,1³‘Õ¯oÁáÀÎê·=ŽpZsÀMC%sñ?c°¡‰mÎ&MðXß)ÈÞn‹TRí¼qe2øõÎ×Ú1Ö5­ßW¹hM~:îÔº†î¼«dë‹ÔªÞAåj«[É•P]ÃK¦gJG±ã†ïÊ»Nêçs¶˜ápq2[ò[p£9NCµ è/2´ôwÆîåÜë›Mx]µÒ¹Qt’ƒ[#,Á¢<#-:26#,Š^m;ÐëÀQ¶ÔuvwPVMæ%’±Ü*78Ø(æòÙÝ6øìŠ]qq¬û¨5‹#,À€Ûk[írã£ÕÒ+V;B'F)ºêèã9““;6TÊ[^‰l`"ZÈã]\ë]™Äwf¸ŸT8Ü䯴*l9¾®I9ÆÈ%„¹¹­ÖîØ§PÆ#,Ž]¶ØÉËH'’mjM ˆ0Úy›Æ_g¸åcbkàÕoÓ:Ù›D$âoªûIW‹tôJÀç—²mwNš“'“®T”)x‡*b-¨žõ§t½=»Ëm9`ÝkŠ8‘‡º=Öäâ0„b#%To¯,Ú¶¼5ô4•ÿšã#pp·Ì-{'IÏqÇšïîç|Ôô[.äþM®k~~\oP·y–LNMÿ^õåûGo]B¤š÷(ÂÝqÔC©K+&!ˆ‚&2ÙSn—Žòˆ‡Ãï14©,¨Þ# è‹Rl&–Gî¹íÑ!7×#áµÙ¯#&σ-ÞX úŸå1­$¼I2ÄÞäÁÉ¡­DÝÕ‹ ½ªrò á%ò &Ѻæc E¶Œ³éö||Kž2ïÇ÷/€¦Xø…” ©–e²r†Aƒ( #&ŸŽwßw~WôÔ»,½/¼âðapO#,îˆÒ#-5€ñúB;íQBx‚ùØöí¤f*“™WbZÀ÷±(3‡7lX±¸tW®Cú‹r²ÊÎA—AŸXröDÁâ)>Pv?pçi彌›¾<ÉÇ)x1öšÕSú#&9ÕÏèl¼.¶„£ór#á’.VM§¶ ©-ÁàI6ÌÓ‰§¶d)J¨{Ï¿F`?w‡±ÉN®rîÿFáÈá"¼àí[ñùâÀ”ÑD¼#-:ð8Á2f*Ÿ)×Ë(~¾x"”•nÉeÁrä(AFÓ«ðÛŒ[&-‡™¡h­Kr“íiÇœVzžÎ>ØîúYôÝÔ)2LD¼xbæ#&~DÛãVf(x;é?rFªÙV%ñWíuÒJB$*dÙYd蕈ô‹„ãͱ°«·Z‰ðn›‡€+½ÀƒÛEIýEb§—VÙðd)X…öy -âŽ×ÛiÒxT±E¤màâÙ¼ÿ¿úT7bÍw}ç¡uo='vèÎ}”9n:N‡¸ÊðQÓÒ³DÜ Ê$âÂð™$ÔÞxÖ]—D›d{z>éÞMzƒÓ%$ôÕz ³bŽÌ8°½SÕØt$ÌÍœš3é=ë¯3­ßÂÍÚšé'ôômèFìPø¿ØËið޳˜¾ƒÈ¡¦¦ž]†jR5Ÿ*Šå²½i¬“ý9é”ЩŸ=Ë¥ÙvÕ{Ößrk¶ÔüÄÑ߬xQ¼¸4÷ÍüR÷óÝŒ×ALJá{4lK!¸vŽ¥4ÉÌètöÖ-xæN§·¸?ٛءødu8! „sÈü¢pm<(þåÀndöÁœ·¬ëܲiøm¥¤ÄŽm…&‘a$ÇuÊÌæÊ°êÂôÛ|°<3R˜tZ€üõÁ{‘Ç^}ü½Ë¯MèEBidüÖæmŽ?ÖFTÎ[Ñ¢›áX^‘i8#Ì¢¹î!C&C^ÔÃÙ`²HAÐGÇäg$H!¡º¥î%è~Ÿ ñÚ$#,cÂÐûShas‘âÃÙo·»s‘ïžœ1ß¹iêcÍ¡st–Õ m£§Z=ÝWžÄ¾”ìc”’Oø9 uæ vžË£C˜7Ù“Ä4ÆçO¿áešÇ½#,6µî7èw­3LuGY¶ü>S„!Œ•âwµ0·Nõ3\JܘrSs t Uþ).>­ÄvrrýO7oØáÜ»x‹º‹)kÇÄü„yQêÍ'ÞqþéÆû©:%Ñ0mrƒ¢ªyµ}¯X(óP"*>˜Äm‚¢ôqÃÛ³Ú2Œ#-·5÷ε¨{ÑÑU{Íåï*×o Ý<5òëÃpSÊ{Ò „êD;L43¡ÊØF§ÄW9g÷Î3[ËüH|¿—L™ïcšÈ+YQ_ÀFéuž-Î6Q^¨Áâ"¶fÆÞÞF‰GØ>\Ge¡ÑÍŒ•l#±H%˜n+©î€ÏÈ©ßA¯f ~«®ˆ{NT‚0 •’¹ÀVŽK|u}uÑJÅ B”êÓ”§¼}ÑU$BO3ã:²_D혗šßŽI#-µÕóCªÕ¼2Mõ¬½ìu¶÷¦ta>y6œ­¡™û5œÍNîQâ¸V§$t7Idl¸,ÌêC.¥÷*EdÌn2,Y—(è¿‹Ç¥|•m¿”tΠáß&×J/OÒK3mäô)²¤ííÙ‘sÑË¿ˆ &„Õ¶º³¥ßTx¸ñÛĆ­ûbíü7纪‘mÈŽƒñÞfN­¿ HÑâb‘%YÉ¥ÚÌJÒ˜2ReW6d”¤æw5ó86[@BåjåÞ”!æa·íÔÐáN›Ä`JcaG´."ƒDæˆ‚Š¢Õ°7ˆÇ$b©ƒ»ñT޳åì:µÈœðÏu4‡¼^ò}[õ­À//gq1$7jÂScSù¯(˜×%“Ñèæµã·I-Ó>s†xÞâ%©µB»"ÛgÉ5âÎÖº/s‹É¾ÄQ«ǃ™è¸­›Ñ§q|Í̘m¶Iö0ŠRûÖO…ÞúNÝÆÎløH@¡Á团¦ƒ›{‘Á8ÃS(—!Új4_h»cž®{Øÿd¦ IRåEéÔÚ.Í¥‘À¼ÅCÔ“IîW‚f!âP½eS”,<ìÿÎ|æîr—Ë~›çÑ¿œçVÝŽ(;‡ªàç¶é×äÚRá£^e'SÓ­Rú#-OÎçPPz²26ŠºTiÛìÒ<‘âYEü ëMöƇ:6pw¯×#-ãÒÛn!ÞʨÁôsº›=ŽhŠq?ò—Ã¥±µ }¨Æm‡Éi¹ÁölíÄí§´þ§ÅȦ0Éá{mæË¨=áfF{=žXbQÙ&žAÁÂ#,íêçCѯ¶˜³Dãñ{6ìè-=¼.‘²öár–ë–*e2Šê/Ì…,e=ü¼ÍŠÛ;ædM,žûHðämå-!–¶Oã3ãŠo¯ß·Lo£ ˜D¹ˆäáR·tK22¶ÜÚßC—–!&ô¡×_Ò×ú F†ÇG!ÿrˆž8é¿5mËEn£Â0‰¨¾ò›t>áÁ÷è‡^öòaút-Žb¾O$LÐ\u÷õ£§ZEŒ®Ë5ÎhJ`^cPÃlRòÑíEuvwq&•³äÍÖ½åã[<:Á›j˜=´8D ´'Û£À`¼¯'±‡“Øâ}ØÉãÙʰ~»H„šÑÙò¥©ì,‚f\æ#,\SSgóføþžÅ»á;]MGôË«t¹þ½§!DsTaöy•"G“öQ£fÅÓv:®²`u#'ÓžkdZµHýîç³á¼yWMϽoŸ×Z¼ÀýzÀ•<¤¦TvZ§•H¤[cƒôÃînéÎB>Ümtdçmz‘ìá‹åd2›Ý¢#&r„ #-#,«eùÙ(ÊÂéYµô׿I|ÖÒÄ\®uºýz̸‘lLÔÓÊÞ¡ -«ƒk·^ßu ñÕh&•I0£5‹ºûp²uÙØ$ :ÖÅòx”¡çÅÒúpñkŽ5˜a•áFn aiEuú·d$*dë0.yа~›CV#&¬•u=ØâÌó¦ÁûF×>碧‚+Qý…îCzëί-%´ÍK>qn‡AåôÂZW\e'(æe]tݲŒr™/zØCŠ“ÔNmÝ•/£I—nd'òX2^†VÌ¡n¥Ù‚ދĕ.‚ˆ•ˆÕ¬×®)t–hVvºIÞ¢-ï×ò}g¥1ž…¶K#-¯uÌÍ+«­ æ¸ÔØçÓ˜9Lß:¹áêÙx°æŒto¾B¥º¤ýf\!mËñÓMª;äð^ïãxmÿ}•ÌîÁîE´=á‘M4,¬²`FCEëý¦. • #&R:îLq° rˆ¿Å+] Þnîa¤îpZëmäÛ}ÏH†&WWy¸myíg°Öó÷Þ¤µt@w¾' àŒ¥ÍÓqŸsyí[RÕEžG~¨8\½ï§M]†^EÒêâäßÓãGŽß—Ë©E…}ÉõSÝß |¨±ï:®|ôa—]ÇÛ½“{ñŸ¥—¤çîÄ í÷˜8ªgtvœn•’|b Ë+IvÒWFŒê ªÆê°›ÊhR0y¹ö\÷› Ü+nsÙGJÎÕ–~Y¸ºYRûU×Ìâ È™yòPäÃ~ÖWsôF4ŸoO-ì\éùöbü"#,ma»qX×'ÚëúdÞ*æ›Ûfv AMóWL‰#–×ÁËeÚV-Ѝ!yŒ¼ô¼è¶Q{ó,ûÔiá.xÌ<\ ÇÒ @§&˜jÕQI¤–;21Ö1æÑ*ªñ¼|wΈä–âuÅÂdœéW)ã'@™ÁÖö¥ÝqŸJŒIØ:#- Q,ˆÝa¿-PØáûéœà2kl!홨®‹0«á‹hÙ£¼Ûp›äíØFÅ-f®啃#&µ¥cdÙ4•qP÷»¥h(ë}"‘¨R"GYh’²¾*ÛJëp|–JBÖNaâߢ×á`ÎVŒj¶7­ñ³dC|&ÑråÁ¥Hµˆh-œôÌI-¥_T>Yöåk¶-Gµ’­Úî»C–®c”ÂË"Â:Is|÷]ç%×·ßã~;{ó·ZÙrN‰ØKïj¦’b«éU7.Á‘o_=n%”ˆ’$a¾Œ¡\º4a‰¼Ç˜º† ¼fP¨Š#˜¶èit7Ë#,NmøÒLjÌ-LV¨XFÊe¹î¶<Æî0Ûit^ûö\û!yœ´`拼#-†rencéɱ­ÚÓ]5F- ôºƒ‰²gbÆ­¯äsÓ=TtèÕ…¥áùŠoÆ#&ààÍA^–³8ÆÀl˜!Ê.±o7Bù[8d±v¡øû˜7ðjšÉ>±¸vy©P9é2dëðÄš³˜ÇkÛMš`øË ¨Œ)*RÁˆa õ±€Ù¨­aKsQaÚu왎8'·Û—ëóçä£,Væ î/@X[Cœ"edpê S¸¤$¬óÚZ«ý9æí†2!’J Þ²µ(¢#šœœ)-aƒEùnX=«(P¦Ã×šŠ¥×öõñ»-Õª†êCzÛ§úã•#(‰e!w‘º¨¦±–‚ºé{6(Œ€Šã’ëOZÏ_}ÍÓy)1L6ðéšP¾·«>ºß¦vÙ’ôY4Ê=WÁZ¾»FÕ/˜-/A4¥Vð°ó-áMœ÷~ú££ßÄôÚLṳû¡º]rsa×HR1€ÖTÕ Û¥Áâè*açu®|b¶ž—µïçw8É ‰&ö#-5&*4TZ*àjÃiuUF£ ¤+BG‰MßÖôöû)县ÀÆûc*/Gööj“;gRÔ”Fͱs})¤YŒ´½åðmå,à´.{ç,%©©Y2Å–¸S†Ç¬˜ð®K ¯r±qx~žÆ¬¦ºÜ‡œ‰ Èb2;ÚžºÃc¦P GØB¼¸—Ã+{MªZPäE ŽœKJá½cfªŽ§ñÆø/|þåš=7¿0ǯƒ4@øõË«t:ëQË 1œQÇJ§^ŒÅ®Rv@0ù·Fµžæ•êZ’&´ÕŸÌúï$E ‚»Î­ í†O£Ù(îкa›ü¼ø5RÒ‚ðÈ*PZ\äOwÈä7*(”³ (ã—›,EÒF:EiNž HÍ™t;©ù!#JºñmiǾþ˜¿L¿Ûfb¢®Ñ¼J³&œëâùËúáØÓûæ6¦­œ‘O†¯•ßs$õÞ< p¶¯ÀQÁ‰`´±ÁÎxÈê<_IvÆ]4ÓQ9)#Qժ̖8Ê7‘J®'@)e’s¢Òx™t4½Ì”ÿTOZ Ìl é¬|°úi_ xæÙͬÆòu$Áb[ŒøÝ¾“Ó9‹m€Ï”ߎ3çZ4°3ñƒ:=ñn …3Ò´yÑÌž±_Ã<“®‘r³äš¿#,T ÁWI¬øÍÛµÃÑŠå{ùKz{òEøz7ÖºN<&¹škGL,…R޳^-Wc'O©×†Ø4à›dÃøîÝ f:‹."Q¿[—éWT½¸$¹ˆ Êéá±-è¼/³9Ÿóú߆7Avˆå}œÁ¡„Zw#-xo j•¦Cµ;Æ1æÅÝùÞ‰±#²ÎNæI-ÉU#&¦$Ô'šãÆ·=¶wX™&[aÒ¬béS.וÒ}}û—ª ±—N{  (R œ–çK œ jGÏNQdÓ8ßë^tæ†@“;Œè#&Š…ìÅ êÔÿ§@Üxƈ7ÿ=Û:n@öýL(ƒ¯ÃUgX¦]j‚hBv›ÀÅ4‰s"––†´ïË‚öŽÝê&}l±å7¼d#&$óB¾uSÅS²¡¤’Ñn[f÷ìùq°kÒ>F½ÐêåñÏò#,—hàÊÕ=öä…!Ÿ=½«Ém³{ćöïTU pï²|Gn–ÌbªGmŠÚ”?´òEò£¢¦ñ¬Zö¾Ü –œá]­áý‡?¬JÝηÄ#,IáÞq’î§ó~§IŒ;ÌÙÕWÝmÆ/›TÆ—Q®±(äã¦Þ¡ÚüC¢¤–ôžàjÉhY›Ê:#-HEzø´ÑÚD3ÐÖ ¤E<š9hKt>F‰%ptg([û,@$¡ vÂÃ+5 PçšTM„ ‚ÏÙén+çó1Â7_êáôâ¹|¾{ë÷÷x“¾'ÛÍÕøOšRÒ¾.\Å#& >¥#&r}ÿPh®{#,ƒ”×pæ©BRaZ9ÚŠ‡CÕ䯲XI 6!zP‚Œýî§Ûñ«¼¶C%þ'8ÃñÿYÚþù+w-‰-'áí•ûÔlJE©6ɱmÕ×WÇó|kõ±9-#- |ô Ë6p+ú¼¬r‰¹Â[†-Ÿ<ùl_ׄÐúI–ÎfñxÉ$‹ E"ƒ²ÐMS¯2õzu8]¶)L-&O§ÀÌw§jÎ-œ»-½<Ù‘ýhfÍ…js’ez–¯t#-ûß:L¾ðþÍåôŽ7”joGßt/}„ˆ~zàðü‘ÎþäæÌD0Áˆ$ª$¬È­ãøOè•ICŠB£IQ¹]ôOgùøœ¿7÷êÎ8¸—îfïÏ_îËzû«úÁyk§ÁΕ$NIÉe¢–ù|ïAÚžÉ}± —ø¾.ùð‡È¥¡ÔŽõÕ¼rmz8.»k€[¸#tÁ¹#,ÇòawÝædý?H6º©ë½¸“ZFè驵$4ô¥6.Öçô3ƒŠ\ª#&±|Ì#|Àý#-BóS’4ÔÍ#-°‡X@£§e‰Ž2`vIô}ŠšÒ¢ Ôº—§!Ööø°™ààXüˆñ9C">ýwz'‰´êZ+Ôª³-âˆ4k¿_Ô¿fŸoÜJ¹ž ‰V„¦Ä°s«'%è zþweœ}[¢ã(í ø¿c;•¢ s=F£&È^ã.ŽAÕ,d¡fnгýo©0õ¿ Ï0¶öåÁ¡-mú·'b¨D BŒ(#-Q !¯ÝSšÕý¯Õ?'ªe)Êèxþ¿í¶È#&N³:^ {6Rå;ä Ä ¥k8—5@¨Ï‹"™`/Ž•‡Lдž,¤†åÔ“&$ÖƒŒNgP”–z– ÉgZ;ÈÞÚ¥ƒÝo#&ú&P#,±¿¯¦ÃÃq“¹ÒÅ„þ¸C¶ÄžŸêÍÓ}c••n~”V:–íB•¯«Ú AÕ&Þ~#-óñˆv=fšîa»@‘Á¥„Lƒ‹’ø$qýv4ºa‹çM)¾¼rsQ'¯#-$ÕÛºŽ¨ãÄé©•„‹•]ƒ{UP ¼’e„’`+Ir²ÐB¥&XDàI-ÊŽ2‡µT#¦˜s³¡Í(`L$¼}C³¿åWR{±€¿kÕŸ½ÝøÌ Fâ,´Kí@|ï è ¿‡î¦QÞ ö’A<|þ8ùO\v­(ªzšH‡x”·¡h#Óßw ’„!#-!»ÎÂß§úWBÊ]K™UµÓ:µ‚‡ÛT“ÖT¥…©XSRýÎçxͰhŠ7(÷"žmïAÏÏF±‚÷l€ì„€>J©˜ aI\öñ¾«{àš]V™8ã†6ßá2†³8ƒ‡¸m4ƒÊf5­j[¸ü6EŠI›0—t:ÕQHÄŽÔ“k¨g(H%ÃE8G|Sžyó¾ßQýfí/ćÇRò·Zú#e䄊¨@ȱŽq`æá|RÏ]¢.#&¨’ÝßÓA€˜ÁÜyå*q'#-žÏKåAá#/ΊbSK–jB6¶wdÂáÒvØ×A|TÈ\µQÛË÷°h3'ÓС¶ñÔ|žDïÕwðôžP>oì>G„1}™Í#&x¹íæ‰Kšnøðœ¾÷“="<^O,³t´#-“âu?ÚûÿaßÀ)Gy–$ýðã_vÕp¼Ï˜iÍé0ìó|ˆ3²6ó:F¬f,Iú.}Ë„àó¯–ó‡ÃÝŠúÌà Bl#-`˜MÞ…¿"«—?Õ¬ÞoŠMÿ)D#-ERÓ äÆÅ&ä[ݶÐùž#&ŽÆœœULfžÐi#w)T[Ç“¼èYr~¿•¹ÏصzÒ ã=K@Œ+ q:Exk5Ë#—0Åü_3HWZpúäBË{8Î;ôÁxÉX;%=7Ò÷«‹sp+&Ø—ã`KH²µ6ÑàC’Aݲ‚ÖQ"Ê<š/pp~Ž{Ü»a®;p¨x›öÔy^"#,Huu¯r#- tìaprsÔxÞ-wŠÚ“³6Jq˜‡}†ùfL퀑`wdÃ@à’†ƒ¥å5¹§<ƳÔü%~¹é \:m­ÍyÓxóÀ<"(^år†Å [‰#,±˜Hi‡s¬qmln¹ú+xÇs_|Œ»3_¹untÏLŽñX¸ï/l¿³ç{ÏŸŒAï߆åÆv±–âZÙQñíœä’ àÁk"ƒíL«‹v< 9&jò¹•‹Ç?7%:1}Ù…È’Zák®1ç°ƒ¸E@:J½e#-м?­ØŠq{°Óß%–&â’’ÑþdWƒ–Šy6‡õR½À'qúÚãÇ‹ÁÛFRç剻8ZˆgÓK6L²8ª1‚o'š\8¸`À-€ #!C<×® lˆá2ô×8¿¬=ê6¶±†­œë“ó¹J¬jUˆ¼‡Ú•áÖ"Hi7ž·Üug ¬f¡z·Ÿœ ‘åµ~#,À»o–'Áød¦aQ#ô¥†•`œt„Wƒ›¹ÓÚ80:øEH¥êkØ\S™ÑiåV‚öñÝØ;µÓOD/ò­.§o¹1ìÉ"mKjOO©G͈úÆa‚\P)›5¼Õ#-ZÞ:Ç&­÷íH#Ñs[9•ûïÛÔ” ƒdÄ“ÅXoòR„¬[©Z€Ä;·³ÓQ”õrÍŠNÓ"©ËÏ”à=Øtlc&i^N`5’¢Ã6 ¶ÙX­ê2_0 ‰oa!3Ö=+{bëhû¥ï=LH©Ý½«ªþ+Ø#âfñãò…‚íðØB”pc={qq%~~aDÙbëyˆqÒN6#\‹º6páZ9Ú’M‡•Ž@^©ŽÈ”Îg·”öx/ª¹1Dn§ðLzÓáC ½ÐrMÛåI>mªN•¾ž|4[äoëpq¦•`¬ÁŠoK®O³~¼¼Kö@§Ï~FþéfÕ#,™5©SWÌð1ºj¶ôm#4&ðܾßÛDµ¯0I#°È¯fŠØ“Å€7ÛLg;0t •¼o)WцaåqOð¾ —ÔŸ1§C•/ŽkLàš¾)>™vdä Qk„M1f‹uhXì{Ž 9÷óƒÊécoÛ¨³Ý˜zz>›3ÒgpAïÚ=¼eX»8æ˜ì¯ ‰Ó³ÚRPÆ*lÒ‹I¦ÆÚtî×çÄWË:c ºðk“;ˆ´öà,p¾K¦7(¶ä 2 éÙÙ|Ò”“žÂ&jˆWQ\n–‡Òü>)‰LgÈÂ9#-âGÖÐÐŒx9Óßt) ª™z3}Š´$§©öT’šÏ:Êè¤A½?ž¼v¹Z.³„C1i@•*§Ñ•îÂãJa)Uý¿âÿ/½ðÚ¦™ä”¯öx<²ë‹öÕCúà‡ùy#-¨²€•è>–Iøú¼k,á3ñ ª§Ã@ÿlCäà>þÃݣ׸ý^Ïl0‡úR{>9ö`EŠŠª@ÂOìC¢ŸÐ0“3úh!4ýGÝ÷&û€·Ð$žÏ?™ž8ø2¥àr”·È<óèT*øœ¶”Hóuìâ@&¹UÎ^4ºç#&¥-Lªl†!ù°¢-¬ñB‚û(ÀEàÊAsÝ]k‹¦åºYú8úÝìyhæ;=›,O•zȉÕ0ýÌ{j¦‰Pég¯»Ç;Ž{l¾¾ËW@ÀÄâ*’²¨ßJš!ÚqîïTSlÄc«fªV…›yá8ö·»ù7æ©Íû,7 ‚U:ÑÃÏÎ[#{°ÍzO‡u¯q¸^¥Ïc 84–”*:ñ²b;x ˆ X#&QúÆù mʺP†²<~ÏÙ9Šš¥êÞºi6ãm—²0÷~›:Ï<ÉkŠìH‚Iï˜2,€ïzY»·ÎªQú<¬gNòÀ´äPØ#&ô²#&{ã&ÝÇõ4¡ûn`Iš¹‹ÿŠ /„8+ðBb—ó;BË–k Ä fS¡’£Q#&rPÈ\€ Ü Xt@äBÌ=ÌTL ‡dG&û9f–#& ·0"Ð;!``aºõBà@‚`66RÀ,}pVÉ•M…%Œˆ© —K”ŽŠ7J Dbƒ™C@—T1Ù¾Âüœ°†5¥6MR7 ¼],fV3wE‚1,8H–U1·%)f°#-2 Ðd¢:žÜ¡PC8«ýP¶ÏtðØ‹û?#-§ýï_?ϯì?[8ðøÃ¢,ì“=§u* bwóy‰îËú7¬oúhØp>²à¹#,ÿÆ…ý‹q§øtx$–š¼ ӀȆÒ*lcgÔÀ!Û^¢swåÒߺzè¦Zê…ïiŒŒÆò›3…µÓÎõGø³FœúPûyk¬ê<"i ]ê)÷º§´/ÐæÙΣ:kxþ\3M¹ û’öÛt®|É•½µ}»$øSLÍË£)ìÌ/A Ø1¦†ÁJd¢UX‚ź Á¶spˆ›ÇÙ­Ül!„†hE"ÑÆeήÝáü{Ã`^c÷ï·!q×WôÉÅòE/Ä…ÖŒÈù³³'¹,⣀ßfÅGŒÃV#ÊJÜ¢VíA3\\[(0”•U—#Þ2꡺s4f¨ÕeWûî<ꟘºD–xbövWCÒa°e°ñxꨪèý²ó¾0ü¬¢t&¦>B~(x3Ü<èô-i¡}¦9ŸÚð‡Oq¶¶Ð¾Á–m ãàæÔ®¿A d²Ìžììòn1,x¿ÉZ2h¨Ac%‘VJf•,Ö™’˜¢÷·Øzr,r4UU1¤”UBÎÝ}ºÊ#,ÚOsrx# \C9í#,¸9.S³p˜5¡‹+q™¶ßC"B^úEJˆÁ„ÜÏFHEŠ|‹"¿8šZlßÏ6íßQSÔñ»4“v1’¦†Ç#kŠgÒ‡MGÑÛ#-ÝÄ}¨´&Ñ7—ÆJ’Ó©ž6ç¸Æ¢ètuÂàá&Ȉâ#,ha´¡ ö(lUeY¤V H…ƒ¶·“aØ©FvtÙG#,…m7[¡Ùé¾ÌãîRiÍÄê98r¦î2VCÆt±®uÈoØr§'ŒŽiÖò„ž„z]Ì÷Ä3„ˆXv‰­dC™ÒgùôM*Ýy{zVF,O´ë¨&Å0ñœ“¹<ït²'ö(v²¢(#-H¤-ì·5²V±«|eY-lU®[W6ÉV¹UÒÚ½YwßyÝëÖºåUô|úX)4`¯HÅÑI²³ÊâdMñøWÎ^mc¤Ø1^<è*KT”ÛZ0àálìü±_>K7ïÀôrÆÔµJ¦|Íù;:‚ÇD‹ƒÏ¹7ŸÊøñ·‘#-:5ô¨PÎò—ñÀZŸl¬xÐt3Â}ž7S¤›éZM“hÖÆÌÛE_[âIpðH| Îù)š¸e=|t ›OâÉä}}$}#Y ‹[¹4hõC¥pjªJYI’Io͵ããî{ì#,uï:!ÀI*såÑoÉ‹1¬J:ò¤´¡eÔ’Z&#& ¼}~ÍØé¿žªW@Þ#&›éÔxÆ1$Ÿ!±ÞA¾Ò‘è0LðÉ1#-sV*u×+Ã4öÑ€åR˜RÉ-‰@ÁÎþ”t«:dÑ.ˆS"²(MÍPB0ÝÏ–w@Né‘–ÿ-“»,VÀseT‡ŒÞÁä ÅåÒ£Rõ›´Q€s3ós䣬{%öÁ¿-ðƒï‘À¤!$a+Dñø ¢< ªô1‹¤#-).¥Ã=yy¸ë³UÝÒ’X‚ènc/]¨Ô÷û›á‚µ>ÝÏERŽUÛ̈ªXîÔ`ÙÏu‡°K>ôê¡ÎÞw«-‰–ÃÖä;åÉQ¸OFÚvÔ(ÞF æÚÉôTÑ+éRJ!¬Y圬2/ Øõ½Ø&I hØîD0Îî§ÅåÃNzédè`³og@–nÍôgK޶˜*q)•½@îï#áŒì»!2†Ë+)½ûþ3a]»-Qãáù·N;ÝC†Ó¥Õñôg»¥53…JÖKa«_Ÿ·¥ô|áÐ(*Áu#`c4¢]¾;4ä¢Õqlzg 6tÐÆj£uY`¬Ä(±jC‹tßWNµ €N4ºQÊ«îÃmó‹ÜÙqÚpkµ™`ò7op8 @…¶…#,ð´ÐM6umã>.CŠíµË@„ç@.œô0üwló…{9d×N’7#ŽFHÙ>èá=ª÷XÝf±©¥”ùö¸¤¯˜EwWÝÆGž¼ç‘”}#,o=ø=žÆóç6ÞHí¦vwéÄsɾv†Â}?W.m”õªwEêõ‘½´™ :>ŽYßC¥5E´%4¢…£x—‹&`e@ŠÁx{Ž(#,ÌßZß™D•Á‚€¾’JD*€1Åž(ðA´0Ó½xÁ†ï±ŸuªÖº§4•ýóˆîø”—Ö+ÏA?·Š¶{7Ò}…á’u@ì'|ldêBÒ #"Tt ÎGR¦âduB­l´?îÊóÓ’$X²áI·Y†QÝ|Áì9Õ&ÃÖ ¢kŽ%}é³²xé][lâoUµˆ(ç‚ PÊ1‡½»!²|v÷JÍ´P/étÛžþï¸û>ï›¶jª?«Íç÷iú9v^mçœͼ°D@#8¼=DvG‰Ý¦ùŽ‚Òåµ@ÜÔ~òõKáêáÇL‡Æ1±=Jýwmµ¬ðGDµàÇê€pâ®hûmfqx.D_š#-”HßÛ\).ñ‰¦iŦ¬ŽÜ ¥³ý=ŸÍÎüà7‹9¹uiÍäù$À ÈZØS3§S?S¡ a‡C¨ªí‹ü׈çͰ‰]’Aý·Ã;òžVEîf HVß›§{8a!•–Š$U¬†®‡uF‘n¥Y: Pƒ!LêMHšÆADâªÂöxûxÌ&0ÙVîl¦257²\Ã=ÒŽo·_»àgÙ|Ê„‚ˆ¤B¬R?/¯žEÊxs嵘>õ8ACÝ6HˆÑFa°;Ëè²Ûf«V²ÙIaÚú¢LbµÊ\T+w¯áÔ„•>Oà}ß‘êÏ32ïè¤ÓL»BGãDû#&°û_ 0@ÄhÐ"k汎:ö=øÎ~P–˜ð×5PµNÓkïÚPzᦛ8¦†Â#-Î6ÁÝ!®¾t Ÿ¬­Ê)+m`çRò)ÿ;lÌ«’ºf™˜ |7Ò÷Œø»U*~iUúD|’ý­p•þ #&A@ÅêÀù`6kw aúõwúéêáºad@Ę̈­ ~cª·yïÏ*íÒçCfQ#&8‰RÍ8_}(Èšµ#&¡ïÃf¼xõ(ŸèÚßÃW¸0ót»â#&—{ºƒæ)3æ}H¹\óúh£ã}\%$P…¶¾6}l3œ¦äÁ©ExôÞ<Ã#&ó9ꗮᮻX¿»ú~eŒØÿ[©DKž)Í8ñ zò¾sz$ÓáªÝC<ÉÂl¤ŒKá£èsq!YdT£|û$Ð;cUã¾ç1ÚGg«‚¶±›þ¹3ÄÒS+ËPhÅu·¯SßßZ!%²Ÿ´º)$y#¥êó‹ªO×Úôè¯ ÛÖ³—êøÞ`Ì¢ûKCHî!Ñ¥à´ZkV<—Ö½±Ÿç!èg1³¡ÖϹå|MÜÚb+Åý¶âL¦DU½1U¬’\~]ïx‰7=á°šR›`® e;xó@<‡Š³G‚­Ï#,ú´Eë|9Ÿ{¸Y>˜q© mVbAЪ9XBOén½ I4²Éѹ>“p’ò:)¦Ç>LBª2#,dB¼¯ITĹ” /ìQÊ,¾!ö…4P¨t&”îð:#è”c•Ã>‡à~^o=…ÍáÈŸçìxOx°uÑqUôïqcÁ´§’?ÇeVƈ‡ÖÌšOú=…¬3ƒš€Câðqñ#7_.ðÚ/QöšM¿Š„ˆ{Ž.{Äñжj®¢öãÓg-?íxL­ÒÊßÜôÕ—ÊÅpñI¤Hš™ý»\odtözA0¹”TIKƒ)»K ‹¶vUîZ4‚¬"Óu’¸°Æâ· ¯ÒË#&h¢ù\l²è—HI4>Á$¶5êŸ[–Ý7.ûtQºæÊ©Ëè–~ŸG>é%ü!U4ìÛ?–û›;õvJ"ælCÓ¼¥ä³ðDÇMe؃ØCÂC:‡t!¶ýozËž8­øÛ>¢ØëN°áBt(Ž’N祿gBF2þ÷qM´{¢§Þ]Óº-Ït%nOf~æ±͸Ãà”äøM>×­Ó=Uâ‹iAaŽ(Š)M6³ç—­àY8qòJÛ»É÷xnÝn{ÌzõµÑËßǗРŽv‚‡*2#,f{ÞsŸÂß,¥®ÔzëÔ¹ÊXÇç€WáÙÍ¢*jNÕˆ#Õ̹^öÞ»!ƒÖW=—:|ç6MAÙH3…,.ëåÔ×¾Á5GQêŒFÅj½ñ!èRÍotÆ(Yðý4S‹64k½/Øç~‘udâ:|ý/á÷t¯cƒ`PÙ¬T¦¿pö%OðE)ðü.d—´NÝ÷.¾Üw+=þØxÉnï™/”¦Ïõìë¢÷ƒKZyí‡%oÖ'·Õ•AGG|žèƒwöÕQó«6ç¹iûY'.þׯ äo¤(¦äh³ä\ŠjdäW¹MØ£Çè£Óg¥t°‰‚1ˆ>WW´W\ßiÑÄTøƒÞÈäÚü­®Ü¥ÜM ýVÑ*û"<½"‚Ï!Ùá’Aú&Á#,!€ç¼qö]àSOËáëòzzû°¸¤HdÜ]¡@O¿ëð†'ygÆ¢~ ÁãœÓ¡ðï|æA©Ö6&eÞ*ãêŠ#,6YÕ:½‚ìª!$#ކe£4œ0€p&~ A-Ü;Çv>Ûĸ,‰aÌ8.ÐW¡SY@Ïö4X"%vªÑ{.ˆ6 t‹)z1G²>æÚšŽA#áDxÀ-Œ}&}¯ÇÍåBâiÍHB8®ÏÌáЖ_ïMå÷1$7 ®ÿ«ÝwŒCãð×Ä* Æ]Õ·ªŒ‰²#P©.Ãö½Y‘83ª[I»€Â•ö²Ÿ ÕŒ£éˆå:ø ˜µ§ŸŸèWNÎC²~¤Dq¨èûC%—q2ñî³Öc—#,±ÙÀciäøQÇeÓ$ÎŒ4E…T(— ¸ðàý-àFŠ,~ÕõB XÐyøÃ»¼±,a¯Õõ\6Óôš% ÓÊè¿Î÷ܯvö÷s.¡w™çåÚúàÎýª'E?¼ƒÛáÉo)Í&Ô%sÎÑÊt7àîrìøLŸ½©Yâ0¿f#-óë·ô—Â0ìk[m¶×ôЛ£)qt½è/ª+öCÃ*\¤^öoöQ[÷}øÙ;´ëg½#,OMo|UE…Bîr®´Od4YäqßÉ‘¦:OjN~…ü•xEÄwÛÔžIÃ3iW*=WI#&fF€° 1@ì‚iUVù¦…Ëó¬ïOÑ-CI”–GÊÝ!ñÍêRsO±‡£/!G$;çPäP«4¹=¬Ã<Øx9M IíBðQI€l$¡!"]°ô:‘q7r·z”2”W™GXÊ¥‘»¼È°°88óNý˜ì8]ÊDy»ÄÙTS#,]D;¢€q‰sl‚#&é€Y€º#’$ƒW¤@¨øE^ñªjU¢ê˜‚Ž#‚7ˆAWZ¬@LCª¨¼È'*¼tÛwi,ƒg­Í:Ä)ëòʯ³›Ã+Ê?!RºábÌ î¨+ï—;œ+*󚺃s2ÜbDÏBZEáâHO2ÎC}»í$ð}ó^zb"Ákסñ ˆ¨¸(¼#&O鎌ôþõW› 5«‡ö'ÃhdÒ#-û‘C 1R¼‚ŸñÛ«ù+ÿxñé<þtÿ.tÕÜ!Ô1mõ/7ѵé?écÔ6v+Ÿo×ú¾^ÞŒÇ`)$ô‹ÜÄtt†#-í:G„Q¾ã©õsç¦rÎ?Û^kX÷çl^?´ù§ÑûSú}åf8P`ŠcW0áGµn±mª\}úb4‚I ©{"#DýßxH'çêîyó9  3#, ~¥íÐýb:(àçIз×C¼H#,#ë}N !ò—„”ñ°Â÷ý>ç«;æ^°5~mÂCî–vë.’žò áT÷„ $J–$[EÉÞ÷›§s¯.5º}¦~€?l“L‹ØCHnúoŒéçÀ¸`: Á÷]«j‘‰\Œ ºM`tÀ¨'«³U$ß}4ì„?V#,ؼÏÏæ¨;Ù†¥@v¯åÛÔ3•#-FqÙ-åˈRƒ ™ŒÇh¶¹BD”è"Bjƒ+1&=ÿÃÝJ¼N:æ.æ ¸ %#&#&°ö²å±*#-zü°¸€5)>ì=$ké½oCÃÏðŒÊ#&üõ(RƒÂÁ”xk…òÚ«ìR|Çϳä73 ° ¹P!DAR&‚NŽ0#-±ƒzY*¥MtÛ ìt²5”ØX"èÏ•ÎÎeÕ.ÄŸÊœ€-„âoYâM~(¦Ú˜ó |t¢qêînmý#&œ›Ì÷U\Cä½q#-w;¥¤òª#-ÌÌÕJXG‚éæš‰+Àšëï{³à–Ke(Ö½#-¦±©0½Q,+*ÚJùúÛaB2ÁÃ97ü7)Ýùþ Ã)Øpã8ì®§â}dˆcšˆ®„‡Ó‘ÔŒwáá#ŒÂ,p†“ët‡Aè•5+ÝldèwäÕÒzòã;CòÀÈcö€ü¶Ê(J“ w>hço-qfž;Ô¾)28à M´#,”ÛÖ¨:ßLú¯D|sy3&ßKU²Énwð¯KuÂq<×Þ,ì´n6æHãÈ&˜i+™˜ƒÌFóK‚ÃV:Žžy¢%ðTY_&†€„!&—õDs~5ZÿXç†|ÑA~¸{#ŸK©²-]@jX(–Öv§³–²´ÄšbÐhŒ†©O=rj=—Iœ«¹·–Ï{ª_GÜøâid&ó†oO·’ÝkràpΜDiüóѧÃÕ‚É#e85â¹½C7SýÐpõÈÊS¬pÙž™Ý)ÒÖgR©¼ÞqZK ÙÃ_…ú{¥ÉççÕIÅç WDß|t²û{WãÄ’LÕÙuDuÏh{Ùûñ–÷W‡Nr,aü_Nž¬¯¥2P.Eµ/shÂâýP#-å?cšJõEˆÑ›„…ïM;õ5gñ*Ð%U@Äœ0€%9#,,ÉrKÕNäòyµ]ªIVÖAßl8D&¹<¿^¢¬#&Û =Ï…ƒÀIj(‰FBz7£œ A8¤yæç½â#&Œ;QäJI<¬¹ #&‚p¥£ºIäêñlÛœ[rèµÚHAÅÜùÿ)‰6Þ»zö8—àõF¤@™k§J?+?äÓ¡mW‘i•Z¢‰ Gœê­Ÿ1uá&(Ô×_q”Då²g˜[“$g¶a:ìñk¦Ô½á6Hdû!†êR [€mâñË) aÁ6@h[4Åw¯‰§ðÚÈNà+Ûbv‘“‹¨êìdì—ŽZAª$-]ÛðÝŸ "üfÕÃûœ8Á"‚¦atv÷´ª¤M"ÜuX²—Tá!‹¢ð¨¤ Å%kÃ’…Ôü#¦°t½àôÚ­‹ú89ù%sÏ'_†b#,öË'iÐG5«„«g~i3šâîÚžÐD ijF­£Ä?½FØï1˜]wIÏ)æ.Ì€f,”¡Ñ—‘ê–‡kµcºð5¯ÒýÆ{iùéÜÒXŒ3ÄIÍffQ+%…3Q* d0~bb˜#&Ìå"¢eDŠy”ÙíALL›Ðêf7j;µA=ãá­W§¬+i:öµKˆ€ÒÃ22…•#,²³3võp‰LŒF{…7 ƒ#&ò-®³œ]…âRkß ×øðŒ‘çFÒtŒ‚Ô÷¯­FÙl×­¬õúdë–7â·èÙ-3Xlqƒâ¬{ì¢>‹v-„œçé("­‚:$ZÑjˆ€ø=@ÓªƒúpMP…¸E:D¦NŠÎ.NbäFI¶ôá¡£lU9›I#,?<;°5¢Ð6ãeâò¦ÉÞ-@¸#&õnDJÙu;›Ï€yÛ°ÛrÛÖƒÔdGGSìFصï²QÅöã·KÚÅÆÝ†jÁóT+RÝq¾q1]ÒžEh1ՠίۜf½Ë ×Óz‘mèCªA¸Ë|;&ðŒBʲgÉDËk÷cÄëa ÉFNÎÞ1^->0Δ"oê<~ÿÒæ¥é¢Ap»•ð)+\ÜÕ¤ qè6€kö×#,#§G ±·1p%´a#&¤ý#,±#&x·s ”ñ‰Æ‘yn5§;F<¡Âí÷‚§0yvv“Y<€D¤”ÖøõBïË÷–-źy~éoÖ“îUÆÌ˜Èyo­"#y˜#˜‰Ë /ÊZ”ï5‹æØ ¯ÀEë~#-и:{a _4Òá -p#--¶Œl>MË8Ù#&ÂðÄQ&5Ç–“…mƶ¤rÿ°{üÃÝù´ ÈèAÎßK—êŸÐ#-!¢Í¡Q"#-Ée¡÷'ʉ[M8 !FXŸ‡gbÒ¨Y*·e#-4Χ ú—Û÷ ކ°Èö£¶+Q_õÅRȾ!Ýî"v ¢Yi^åÏè»ýá|ÓaC˜ ÓØÛh\þgÙ’#&äl(j$ gWêÚÜÍ=î^ƒ±ùòDù¿‰v=ÝöºœªÉ㈠~Èø¿òêØUÙüî/Žœó,Õ!nÿ@zÀ\À%ñ+ÎyÎ-ÆeÉ$#}3`¯W² $_Ùxˆâ—, #&R°#,e#-Êò:5Ãìþù=?œ¯ÛmÄåé`ÖÛ Gwj‡a&sÙýß/Cã÷…éu> Å|§Î=¼1Ü÷v‚ƒA¤)Ù lÄû 8Í#Èû#,[¢_:Zƒì+[ÿɧi'ií @¸[{½÷ƒ\iä>(n¯È8uÿ)pwumœ6µQhÐ,BÌ—)Ïøá&ÚFïP°#&ý#,’Úka¬('ÞŠq!ÇÃb`Ó˜Z’FBM n½ ‡Y)?©ë)#,»#Jxr¹³ÐA¸Àφ•*¸Ü´>ùþ>aäëñu½ÉÜuÉx]í»Á7-ŸÞI¡´vmItÌ| söÛ?oqÂöžVÆÈ¨7RÂXÆ.ÈÈ’(H0µ˜q½ p{Ë‚îx­)F,=¾ÒÙ²"AÕs!9¯C¿×QÊxkÁpá6˜V9'tÃï+L”VØìƒø$¨Tû«ÎõtÒ’~o¸/rxŸŠÈb¬¨J°6Û»Ð^±8k ]B .q@Æ¥1Á_ä-®_ðC×Ñë#&ºwZÁÀH“_¦6£áû,¯ðwé£èà IOÂm´ÙÃ×Ãáä÷„”±ÿ‚ã(φì;ô6,#,ùÖ,ć¤{dx`¿·ÿGaR†³¡¤¨3ÎU¼Ò‰DZMm¬@x|¤ Î#,H¬’ ùç×çÜœÏJV=ÿG®€öʯ¢ßF)¨¯ÒÇùkvÚ9uÏ—Ð~×ÑLÑцÚŦj²’~of›Xe×ÚC¨" eaÝg¿ù{ñtÖöLæ÷ã™÷/òx2Ï¿`gl¤:¾ãa–f§C)(Ï·%îH‡—+X¤dŸ@Ò{üŽ݇1†Ÿó†Ö²Û~0)K~‘çO ’©„J€—^—=¦æ÷;Bªi@;#-pÿ¦\5sȳaÛ¶¿–o¹ ÂøÜ¢µ¿«kOà‹o>¹¯ïòÛíÙF³ƒ÷g ‡úq—¥3à îpêFA„#,ù‡^†FPÚt:Œ×H;Ýþ½5f©fÙ8Ì’ÅÚ¢›eé‡Gð/»å먳ö™Wä„$ë7KÀáþ>z½xûŽgi#-‘ƒû’†_2ÂÐV]O¶p_ç›÷ëP4KÏ¥ÙF/_ñ#Ù>¼U^ ƒaáÿ½2p~Ÿ0¥ߘ‰ CƒXŒgþ‡‡çúÀ®•Ä OpØÑm#-gSS®a”’ØŒÛÀ¨à0UÙÜøg²Ý!—[¸@¸Pd03ÿD¢¾åŸvs‰¥_n61°bcC„2æ²Ëf‡0®}ƒaË Ø8E„ˆmh4~¾#&»wïD‰‘ÁÍàQñôI¡ÑGS!6>¡#- ÿ7æÿwD6ý¯Ý×ÞA ÑCLŠõv)¸ÞŸ,Õ{g4;;ˆá,¹Éj/µ°P„ øÜ;C$ ”W—²#&#,B‡÷Bç°Àq‘N3¥÷ÙP~ä¥L#,o‹»8«È½²d-‡€’áÈÈ‹7Bšh!65#-a 29jSFja‡@&ff¨´Ø;"¢úz•÷†¦±‡á>é•@XSQ#-D×[ŸíðUõ#,fçëå ;Â9‡{×i Ñ:‡¨ÁPÏ-†oX[FEÔàl$‘2þ¿Àû»ù®[¾ô~x¹ ‡õþŒØ\䤟»m¸•#-û>‹ÞDô6þ»‡éë×jMèÉI—®Ý³ØÆÁ°~îùd–¿ñ‚æ#sË%¥Þ£p‹LÑ+¬¬Ñ¬ÓÖµ#-œƒd;@ÇÝš|Ü–ÐÕ9Sw#e™\¥",ÔŽ¼’I$ÍTi¬Rb¦]jjKK[m<Í\Õ–³WÓ+00޼eÔ1׬ `èñ=ZóZ#,X††µ½Ó7K¬2=æ;0Ü0dK•¤Ê±Ÿßd£8ëôü$;1¨ ËFÔZ·Ûkoäÿ+ãµå&#&Æ õ0 ˜ƒ" ý€¾Ô ªä°oçášty97@ê¬BxŽ«þ—÷o¯oU¶_ÁÁ™¥ 'Üî#-¶Ä®…ªI>uzšºDc<òï2R_¯¯Úº·Š@!ßãîO±Ú'*xñ±%¡÷éãhKdD9öT²jœÐŠ) ~Çúr×ëô÷ÿ"˶̇Ä"b; MCi ¥;ê-‘:]êË5ƒ‘B–Ê#-M£ãL“§ývãXÎM %oqp’I6Ä0ˆÅÀ©šÂST•åÐÊ‚Ô.À*oŠÔr(€¨RŸÃ~í]bøšƒç.^—Ã%7 é ßá X³cÖúÌãtç¾”Áݽ81I$I0¬Àý䮜fíJnP*e ÄTB_åÙÝvv~øâ¦ßSô+`ú˜êpûÿ,Œl툞žîæWwÌ­hÄþamûXÅ´\bûD…Óé·#þMMùÏ@#c)Ÿh _yÔùç²Yåö•RŠ’”¤Q׊d&Ý z¦¬·Rl¸…³#,ñ#&/vlK*Šƒ”’YÒ•#éúÙókoi]Ú#,Ö‚öÄâa~gã9E|„ … ¢†ÆöIŠP´þÆBؤ<À¢b€ÒpA¸L^žà½d‰ynV#&×xw]À/’‚êŠ!°‚¸³õmã…N?:ˆŽa#&'xŽ¿(,›\{¼„®E¼.Þ?ˆú­¸QÚ>J°™DŸ#-©'Õ®-{[Öö¥ŸM-TKî7"z,s0}™,þq=0}?k±ÇÆOz;N`rùŰzÆÀYa#,n ±ð:$>¶ƒÃõ¹œ·>'#&û çÂѱ9áÛû™Ú}A#,µNqv±ýÓôîvíñOÀà!Ñ<@#à)Ü@‘«£À#,Ï—r‚L¦IFÁûÃÎÁ‚ z¸uuדÀô'{F±éõšsÜ­C8ñ§ŒðäSi*—w ôŽ­ ö÷D<…‚É„Y(‡Ôò ¯°,ìWøŽ ¸‚‚{ÌŠ6ùësÁ9>_~†÷‡ 3 PGÐTèh3y÷’ÐÕ?0*>΢ÿŸ/qd+ä?ÏGÞÛû ö±öIAÖ¯´½UA#&°+BŠhÈ96BcO”„MÞqîï°#, |¤5 Œ>bª¿4 Ч }¨ñê!V+ ]°4d€>¯?Ö¯à‘I>}¨§lv…jkÐ{á OyÏì”vzš 'F¯ß¡­Fœ¨ÆND-feîÎÙ‚4£n•!rxè'Š#&…yýžÎí Œ+•}§¶¤¬Péô†œ=½ù…ÈAŽÖÖ=åWêŒñ:ØÉ'×HÐÁâ¼®Âó ¹À§L˜,NAbÃÔZ‡>ƒ»ÄåùÎnfEr†EÛz…àòÒûÌ•dBõV¢#J””p2nDƒ,ýK‰µU4¢pᱬ*èn²ˆTmùêHCn“C:J%Ѩyy}*a@Ä<ÕDc ’*‰RqÕëÏ›¶ÐÌ£ Å®±nFÚ=lpa.x=eu&÷ÙÇØ›z¹¹‘LÂ*ñÜyk3ÆAdV@úz„’ÑkB­ûy'QÜolX…‰H”Pý‡qˆŸ8Vôb•JÁ­øN|À>(ç­ì=ˆž@tO#@úó{Úƒ»‡Ô+æ«Þn6wF?Š[G˜fO›UJ/sËáõ¼Ÿá}õú²øu…KæòÄËÜXÝj,žù-îô¿ñ0ãq¢&‡$þü¨£Ê¤¡_ûN$46ƒ-¼4±LgM¤ á‹€7±Q¥Jj¤­Ù€áü^>Äô_7Ýw“öŸ}ª`s‰É4§ì½aî=H•ÊÉV·ÑÝUVÕ#” UÌÁ3÷;Ñàjø#,¾ùB§¸#-&’3æÈN¢râqü3—3ês w‚ž‚,Z©B$*#&Ó©òSÉ9Ÿp~l‘s¡ÂàwÔ§oØLÓÓõi'Y^:ÞØ¯–G…ÞFuü~¼?›u>üåx¯‡Y§Ð%¡Ïvhÿ+îÔÎ¥h,PMa`N¢ÅPn#&)k)$S®ûØž übS»q¢™…­KÉAIÔA¨ÐYƒˆGõÿ+úú“¦ák¨÷¤åj½R'8a´=^ú¾v‘˜gëxjƒ­²+"* F‰LÊ#7˼Úù(×*½+†éµÓ#,• ˆ+-J¢î%B#,”Sl-a(b”çÀô}ž¯·9pS€óƒ,û}Ì=¯«yí  à¾WGO{0dÌ kÒ|¥œßg¡èŒ6;R9€w˜í7?^ Sd?`4‚lw!b Š¥#‘D(€Ì‚`Î œjC!Àê†í¢ _J9)ak1<”¼è”mxóvðHIG£#¨ãyÛ=â8ß‹HÒóÈRº7pNÍéúçÛE$å\`³‡pf㪇¤@#,§‡ŽÂ@/·qFîè…om'N€ísÑž~ÉÝn«}¶Úæ6拸È8› i#- ÃÑ}l£Ô{ÉÛ݃;$ë>Ò³)1%Ïy$OÞ8n–— LPQEýë%Oë÷{£}âÒ´^ÿC·>?Ùtúãüj$+lÛê/«èóosÛR¡ù¿(6Ïî¢lüE¡V–™˜Þ™0ÃR‹ÂoaG°²J²I#ísуë¾MÐÌááÙ­H` aÅÀÅ]C{ÙpKÂHQA®Š©öœ9Ÿ.TRQnöQÓ$Ž¥Ï,œ¾}Ÿ½z£ BDnÕ 8P‡×B#Ú‘ì»ÙïýHu•%¤fðíݱaÚx!’Lvtìê‰K¾Š;ÂHB;R~0ú‚®=œþ]êžÞ¯òÂG”¸ÒžAd##-룠F r2søƒ"²1Š#-K;™ê†02¸ ’(½þýѳCq†ÎE>’øŸpÖp5WÅÑ¿#&o½BY Èþ¸ÿÝög0Äý„)ÿ'¸õæqN³n!š¢Š ŠJUZ*1Þ1œ(2ú°§*>ûóÙPd_ˆÂ¿B{µA1敀ŌÒ`9½…&KñNÎIǨH“Š«^픂!ƒù+ù$EÃñ Aõ¸Ó®ƒØuü‚¼;ß½-—?’”›Ui¥‚È!qpb~#&ï 3|"À¸õB§˜ Ø;®'× §=ýæÞô ߟ{ƒîzB¤°oÓöY. S#- žŠêz{Ny)Ö>ÍÞƒÚ§`vhqzànçS¤Œ’ð Š´²È8Ø#,›MØ8Ù¼¤æ8–I#¦ÀJä0ߣEDQVæc,°ßí‡?gòÊ=~4ôþ?¯íøéÅñïU#-&Î'³ eU B&ž¬K‹7æàÐå„à˜°FJ•’/"<ægÚCâ¾dNr_„ž‘ÒRƒQŠòøôêðâJ6ęȊ¹Pểa‡-Š1 ×^¸-ðÅÜóÌ D—ó­ÏÝ•53ˆÛ&ŒynîYÔX"¡Ê¥R~’lŽ(®‰òª-)Ñ©bzÔ6Ðm—Ó¸GR£˜-Fpðõ—´–>æÇ—ä#,çƒÅãÏ˳yÀÆO½$Uâpê·b}Mœ‰á‚’@°Þ#-ójަ€}xÍ&´ºžB„ÈWÄ ðºõåÕNÔN¸¬‚;Rá™õé×i¨y[Š„öÑöe@w‰l¸ƒôN`rܘóGá¶ÛyÚfŽ»B/P9ªPüÈ©°èpn4ŒHGB#,^6‚)aˆÂ@Àæp½u[‘ôÂ{ƒÐôPïðæN´,õvAÄ»‘‘ •Y•TKH¶s/ÎG.S£Ý´í5Fw„xÅÈùîËuPnÉ)=#&/¹Ú…ÏFuãÅS(‹‰â1}ƒé£êD?¨xÌ•Ëäl‚ÁE.^ØÛ‰‡Syžè ¡>îßW£éî-:}ßè@h[¦Àùe·ßýD‚"Ê*#,ï¸W'óµHO°˜Ü/Äß#9þ:xxçÃÕýiïWäÕÊŸÇR¡ðûh¼åµ‚Á1­üPØ¢cŸs}e;}Çß@AÌæ«{š3—ú÷û0lìë+ìáõŒà9aú«¶wþÙÖü~7½é¯ƒkzJ‘wÞC~Ê—§8#&ÔI$@uŠ„",„AQ#&“ 4Ù†½£é#,÷—µ!`‡ Ó’#,!òÃh±âàÐHY ت”?ž>ÿ^âîêfíüènAcùâ²gÆ „‹,ˆþþ°À;#&º¢÷¦åæO>ôˇ0,‚d% ¯xA°lô‡'V¹´Õú·îp>ÍFÉë]”t«„'¾gB½7%œjªdÓ¡‘?${JóÜV¡Þ‡}6±x#,ÕMù!BYÈÁa°mn7ä^€ö‡Â9„îLÀйp´4#-ú½^Ï„ƒV}ï5.ت»ÏJ’‘&Þú]×o;u°­EÿˆûÞâºe·pŒGû<ûìÝd#,àWoW.÷°Î”fÜ$;t@íÛ›á¼nÙv‹{%mÿ@~?xyXÑü©¤F¾4G4ôBÖ†¬6—kÙ(PÃâŠØÓIåñµzÌUcC4Q^ÿc\û=r·wP½3Ï<"2‹!³wqНo—¤}0ôJ뵇ÕzFžêx\Ì}1 €º |’ÉÜóÖ}AÄâŒÔ#&Ø?Da5_nßnàxœS0m¿è8Õé£g†Ò¡!&æ$…ux߈ì¶;'¬#×àîÒcè¿ý&¦ãÔt[j(#Ö­µUbE¶¡EUTC¯Ð¹W®*H¥â§üJþ­&%±(CT÷Q˜LLålØúé/ˆ¹¹×x±#,¬"ÓC4sXiê%x¯<íæ ®ézîÒfSo—[Ö¨ °’ s4ýGOùIýø±Àï#&éÓÆ¡) î.§«õá¢DGä‘ã˜H¿žoŸ î6Q*—ÊŽy5n×hç)ÊrYÈú½Ïbœ>®W“î”!Js·Ïõ‘åãý¦P›~Œà?ã€9xk–׺H½ucÝW¥È ƒ¯¦«“!Ù ~g¹ç—w~§yƯüºœOaMffT3 à{]?«^ÓdrU5¥ÑöCÚ•¯K¢ÁÛÆðá+@ú!p°©>9/S%F4ˆTIàQRsó*(#-  ,p,‡Y#,r¤½@v=¶þøuUÖ%ˆ»ýþQbM@Ö|ÿ‘ü£õœzTÏc!þ™ˆ#,x³à3í¡[D IÁ¹ê=Àt¹í]áhDƒ,#-ñÝ}ðzVaµü÷¹,Χ©9Ÿ?š]ƒŽ€<ß´=*Ÿ×³¨¹|ãú+€—4_år£v„1ùd<þ¿×a\ÿ†ib$Á«„¢$)€Æ_:é™lžRç›nØFÞ^'y L2©l‡ä2dAX!Q2¶…jOqØ—Žhq9"ºT"Õ#-+èAá©…¤©˜¥q„¬«#Óþ±6§õýŒÐÍHBý&gô„ÙR5³xƒ Qûaü›˜ ´Äðª *ÅÉ®’cKäõ`§–¬ç0\M}‡î«Z\ê#,ðèÅ_¨p`æ‚1'±«E¶²îVäûL±5ïÀÒë” ÍàH@9Š=aPüÿboñÃû|,m™°âDöe|…†Åêë»çO¿P~&ôõªŒUŠ0BA_Þá÷ËâPÄÈs$s•JÁ&Ÿêfsl·ðpM†ùw}Ÿ8…¸Ôaøß…®G{‡ÌI#&¨$#J#0´‹4ãS5ÙÛÙ’íšÕüoï~Sìÿ:‹G<¸ôñ/ïù›ùPyvιÞÚf59zøÈd¼¢Üü\ÜVÜB­ñ¿Zß›ÛYŒ” ¦XC™ïf!ˆñæ´þL~ÏÌ„l"uÓãÓÂü„y£Q–PG"¨ÐQH`0?–å(@ŽÐÈï_Ž#-ûÜ—øöO‰CK L ˆÂŒÂ”Â(výÃñâ¡2›!$¤‚ÏÙÁÎ1$Fê¾^7¢züÑlù\n†zÓÔ¡”-Á;ŽÕPHN_ä(™Kë`»4Ôg9ƒÀÔL@p¶VìÑÃMî„3Äê鮎…á¸?ŸôR‡™/«è,Ÿ:5¼OÈbhÍÑ2É2åÝ1‡¿#,yl›ãÝàȆDÄ!Pàá±ßëÏß'‘Ǭ·«üÚErØl~‚û“ºÎA&öÅ›`¶€{g÷ñž þÿ5îsô¸¸Ñ­û©¤2YsÅ&l.’<¨{ŽÙ‹xvqŒ¹”Dß!“P‘üˆ“,ëX'ϼm//¨S@y~Íz$;RÓéÙ•%õ”<#-óuÏõ•áR›¢õcdCxUÑå(8fáœGzîC]ÁDÅVƒù'„/3Áô)#&ðÁë#-8Jòùcã“ú]ñ,%@!0=Ñ÷F…ÿéþÍHåá¦Öó³ï¥ °CÕŠCô“”Ýnï·½²2ü¸*…ÅÃIUGH Cc ÌìkOƒb 9ÑáüJ½­ÚŠpÉên.¿–óAÞJî„îæ‰NFËýƒvþn +¨g»Xʼn¶×*‚¥—Àìsí˜÷â7UH{m+¬ƒ ~œ‚É¥1q7¾!Ú`¾¾xî>q ÖÿÑÈ>"}³±ûlýó =bQ϶Mý`£ütpåò=7ÒÁ“FÜ£f¬¶Ý½â6gÖâˆÇæJ‚U麨ƒ{ŸçG3å.ðu¶ÎßzÚ¡þçyŽèH±èù #Ìí0¢(ºCÄ·º'çŸÁ¿”’ŽŽ7(Ê$ïÎS‹îýkèæÁ\Ù\Áx„µ”9ù_çG#,SPÁíôH4•ïT9TéXYzÚ%Òz²XêþËÕ7V÷üí<%-5uùÈj#,Ü2UFf±/k¯Ö;tN®É~gޱîe±»10(7VlÇ-*™ºß5Áîš:™z ¸:V ³«´Q…r¼:rP¥V#,<u'p€–¥Œ_ rÖç*twdÃZÔ›1ó©·m=Mµ½Lú»ö3†…º\Ëb#&xiG·gÒõÅÅôyd˜×«ôœFˆ¿jßF»uÌw¬S›¾Ýºbà¨îƒ™qusÙ»‚GjÌ7°¯ÂÛÊóãÛŽ06˜»˜†á4.ŽæîÛ,Odå:ð!tËôÎ,Óf^ZótÏcžmjpªž¨r[¡‚€‚Å3F‚×Ç«¦Ù©*-õºÍí†ìøfk3“•k#,.µ¨éËu†äžš+u'Þm˜PE!“ø*жÃ~Ž+ƒÀÌë´˜[«þi #& äü<Ÿú ¿L½9pGA‘ˆ¨³-¤å­cn޲CœÐÔ®mkQ~"4œüfo|d "GcåuÓÍ>§òÕS±÷#®ï6³Q¶¦2ˆ·tO×Ô•æë˜ËõÐù<Ï—7ŸÎîs®ŸP¨ÏY³0õô½ã­»%þ–:{ù-ts—g÷ˆµÞ»Lӻϖ!&üÀ…A#bœVˆ›u(‘ý7]1}<_¦øÒå·U˜¤uL:Ú€ÝrŽËã~ iÛs.pMìÎqa?(Ô[Ä£³Æ^(ÇK`ÿŠŸøuPü¿Îû»a[»Õü< qÙp—°ôÜo ·¿=¶£û·yÁf^½O:öXÊ 1J?Œzañê3Ó¥haÌùiF…ps¼[!šÒæXÐ0ÎëFÎÇAÕ`Û0EaÒÈHâ‡Å|±[jÄÇ”…=K£ükÇÖðÉ 6fq ¡Üh»–7Ê’TäœÌ…£‰ ɲ}Î:–ñ„bMÖ€ÉmÙ;[ I‰‹È©ïíˆÃñ 4ƃi¨4CùȬúšÃb&ïÄññ׺۽ƒÝâîCmû9U—ÔKÐf²S°-Æ96·vÛ°›xšÃ]%­+»‹ ê+ÊTîÑp*r!Ë…ä`uô˜.3£Ð¶ýYÊÙ#&u#,p²pOìå;Òª×ç…Mç(CAMÆwY2!ƒ°²vÒ¯'CR=Is±ÞâfRPi^TI'kå}½w¹³Á…bó‘N:Þ#qÛ ™ɼˆ66:°¤è0ÝͼóíQò<;öwéo]®# ®ìsº)JÒfSu­ç[Æò¥8â—NÖ–Z³S $†ÙÞÌ&ùzÍHÝŽ'%®XÚæf±!#-„>à Ûd÷›¸hBì×ýåe*Zmµnz:m™9+À¡æÂˆ=ë{¹¦}Ñg€p{øÈl^š†h±ŠŠŠS×Ù´Huf‰#&y-¡´69`%Èjx—WµÌÜÂÂhv#,ÜÕõÕ4lïöûõ3ìÜK2™Ü#,ž³$¹˜uyà%I!Ÿ¾<óïñ×Ç~ßRBóBÂ"$Á’!Ú}ŒÅˆ_g^O§ÝØÛËb“ìe™c™›z)Eåâ%}Â’î1` %QBKªYbÑQD ’؃¥´®ýŸh+wºdjÏ'+R5(°„ÈÔ¸…‹3:IlKéÍ#ÙœÙñ¬<|åŽÃmôþl÷ÕSb*µÆ™`»ºðzzÃY4äð3Òh¥ZÛÝÐÞzN‚Ŀ÷#&!A9Î“Ž¨¨«G…y‰¿­ÕTÝjxÅiòpú²8à×»ý7Á´#,н6’ƒÅÜ8FçYoeT1#&¨¡U0á*\S½,ª=<}’ç†zÕVÚЕ|wî5äŸÊðÚ'=~j»¡O! e‡Œ=;àZõëwö(Ó[‰¡Ó,ìYÎò`']ÑL„ª5m²Ý3ã}´YÐ6”„€…Êädíø‰Mž.j›ŽÈ± #&‰8"wïc›cË.\‹,X}\Óð\i‘}$c(÷›–„Ðà£J(‹ÐâHk2fdçqªºDôòGhmä‹¡8BHÌß&!8ˆ-#,fz¾1C#-³·õ~¬=#&ëáï’ÖÀt„d¦4Øw&ŲäÀ”™’C42Í+ êQ'C¢©2º!Ï&|À‘҃׃G.óâˆhm"-#-0Éàá.ÆNàs„ÁÝ?!šì”0¡¿©»Œ^~¨Ü$•$ ”™9<¶¡‘PÚ# &E=†qõuî½—œþ?¯tÈý‹{òižã¶UÉP#Çtâ{$Ølìöƒ\1SŽ_lš³™§§"Ï]áò?¾‹×ØëÐbë‡TÉ6{b…p5/,„çšX¥†T2QRíB‰ÑŠhƒ ï§­´Òm$6ÎŒga¬Öɸj(pärGÔXÐ!™DøTšLÓF#,&2 QɃÐðÒcHs-5­^ᯛ; £]{:£U47à4½<}î`"ü_Φµ¨ÕDF¹â“»ãUéÐûŽÀ!ÛÀ÷=¯WÊ¥,–6‰¦ÍS"‚3Rll#Äí.Àï&MÕ&]¬èªù;C#àuW2šû=’ZÝ‘œÍœô@àG­ì,+Ú÷™ÑÛÞ†E͆F†ÒW³µ”¯aro¥s“´8…œ<ƒ'jÊUs.T\“M6•%’ï³E{§Æàii鳤±sÊø0çSÔaº¥úC×ϳ}Ñ,îLû}šÙX£†EPÄVï#&ïçÞèlÍÍ0‚¡ÒlÚ˜#-R^JþÎ/dø^¯Ûé«—Zy½!!¡ˆ`¸Áb#&c½CA-Á~è 7nl«$›I€–ḠRÅA'ìëFì©€sÿ§¹Mu#&†I|E>íÊö…L¾,ÂKaP[Õz¡¥1wmèu‹“—¬÷E‘2†Ã[êaÊ^~>³f´çÓwm’éW3Ät„ôD‘"¡ç^/ ƒŸC´‡h‚$Lê¿Ìà@˜ŒK…ðìÆzßÅz1æ}¨oð. äÒÐé¶tîû/ˆÓV¸N{ïïðÏbP´­%!Ýç´0ëyì»Ú/ÊË-” Y'±‰ ràyR={GÍ#-#Fïø§<%QD¤©ÉAb¤,R4Ùðø=8§—{‚±Ï)-Î`ç§ø‘êÿ$?óûfY‡úÿ×8t­Ed·rñ(ƒVŠJ_³ moÉûÖ§ä©ê]¥(¶fÉ”gZ¿}¶Î¿àõy€õ’¨mõ!ãÙgð"ûŽ Zt¿P}Þªý¹¥)5Ki“T¤LJqTôZHÅDbSÇiJ89J¥Ï/3ÕUÊ¡pÀ•hÛ•Âí´SDŸåÞ÷®Z±lV|)r[Jˆ®´ÓT*ck(%™¯v xwsèHCª ]ñ$„„”µíWÞ’E€„ûÀÿnÕ¤‚ H£å¶„@3z<Ó‹kåc€oÒñ;_<—ûÕrÎòIë°à> àÉIOH¥Ô5”³öŠDA™—`¢6$-’Ù&€MŸ–ÇÈEDÌùOd¹Mó‹©`DÑŠ@D7ªp£ ÷RˆÀŠ$F#&{ƒ€‚Àùð¿Ì1#,JΗ§ÔÓ£RŽÚÙxt˜¼ó¾×«\fwV.ˆ1]š@jT̆å@Ã$Qb$.ÊF°gÓ ™ÿ3dEº;{Î0ó•¡¥Ý>ë?Xv“SŠ@œN]T_㘬;‡ÆèxE¯´!ERvù…À±#&H1©³3°%„_¶Ÿd$Í•>‚#&'nñ „Üp5oMw²á¾ ×õ2Ê|ô¯„(¹¾Œ#,;#&mÓ^{C¼þ…ÒAuÌpàD<  b€në™=m·Ò¬m\´U-%›J’d}¡ï#„@î‚ ûâ 2"’#&€HŠÄˆ£D"#&,F#-q1ÉüC!‡lì¾ëép¸Ì=d£â„m¥ªŠ'À--Y³‰Tue¹‹–0—"ÂpƒvÅD>7•åž¾EO˜¦Wô&½B/ôT¤“õwo›noSz›šìJ7wh$¼:ê5ËwøÞy·‹›¦;¹ÕÍË%ewhä—ˤcpÝ`(1 áÿ¥¯„°à¬¬ýûç&È4 ²C][~€ìînq#&žù’#,?ã”6̱¼ëTñUcØ×È9“Û…û>süY;~ò¹5E2M´á*‹(i.¨±§·ƒg^ÒüÓw<÷4ÅŒ¿Ì0^‘ð-ó8fá|ß™5Ó+a=§áâãÇË~ÿçžÆ³Ö2šf5e 4ú²9Ðågûâò¯†9‰nÐõü¥T¬Öwžšù–õáÌÁ»ªyй—*6»‚Âíˆ(`BØò®q…M™ šëáíJI’"³”0¡¥´4ßJœ ÒÂ’ã`,?ÒÅ#&ĈeÙhÞên×y¹ýÅIØ;[ú¬·÷|—=ºSÓSôr›ÃH›ý>ƒe»Þ~8Ÿ¤,6ð68ªûêêÃÒtÅæâ'¨byGË¥ª7;}%ó#,ŽŠ( ¯ˆxð>3Ã^™xæÈPóòå­ÌÓ®d´®M[q©³Ê'ôMÃ^±¶8•=lìY½^KŽp[J²A6ƒ?žI‰aÛw1LÐvE”ÂŽO€4Ãæ~ä’~>ꦩ¢¡çÛõ_ây4QA(ì6§®“Z^î©èr{ #,b#&|!#¼Yš«"¾¥N‚ô2•ô”Q±z©$M峪hIÛP0.£‚ó_þµÙwllMƒ?6g¦ñf3$mwE\ª†šáçÃ.¸<´ú~Ð…,Œ¦%Dt´Dx@›ÃϵiJ€þˆ £ð„$ŒU ¶Ù*Ñl”FÍXÒM”IQŠÅeeµbi¶KI+cZKk#*4ÙŒ#&H"cY=gåøòúú.%¤µN–û%•]pêà"zPçdHª2#&È ö{ú „˜âÙùl¹¿¤g>k^vEº¬oµ6‡?m¹¡€ðÐØëŠ£ªˆ5 ŒhXdi½û#, «,Š_Æ#&&ƒ›”é’ikŽÜ¢÷Öˆý1HªcQÎ$ÊÉ¡’màšDÓ¥}*nhi(È´ CZL±_P/¥dÌ “5^]'^õºðEO|TQwoT ´QÜ#-ò¯0œ÷¤êáFM5»PH¶ÔºpÙ@•ˆUн‘mï°t‚û|ÇŸ:#,rƒ¬©#&Bšd9œ9t¨‘¨ˆ(&¼À,$éžC¢Š)#-„HÉ:D…!ŒIj+W6æÉ\Öå3aJ™ES0j*Mlm!¦¢"#-ŠO®gã<Á ‡csLšÈ€ã@#&!‘rU;€#&ÕGöq}C÷^ûýgçõâÜ馎Òqp‰¿ä OSЃƽˆàø]ŠH#÷À6äT#Hq´úd=§ýžÿú?»÷þ¯OúÛµT=}JOŒ`,’Îï;<x¨,SP#T%âãD#&-$Ã:ƒ©ÕÑAˆ„VD}U ‰º÷¾ó¸êêçc%Ö&²¡N(^(mŸêŠ ”Gõ’oÛ¦—QO›?²¼:¨ÊhθȖ‚üàuÎX`!\˜ü»-A§¶ŒÔHù ¿äˆöø?£Ôÿ@8’~ÚEw03!¹‹LAT3áí9Œ{e"@åÊË¿†ƒäjm»S d+Â)CU8/ƒ ³PÔ÷X ’§Õl#-“’Ì£Ÿ¸©h½3ݽ¤é5Ü6@A4i6%ÛMýt:“°ú{N¿ºŽð‚îàP¢šNH™#-C.²º'B¬ØÅë^eO·: ¡ü£ˆ 3±$µòu{=¯Ãƒø@äy„;—ü#,œ_u#,Ò)ÏÊZý)ºžCÈâuè¥y­¶~»ïÒÕƒ»‰6$Ú7?&À #-„O¢lÁÌøT˱ÁWà¢PÑÍß‹\ü+ÇN$ð<ä6;é˜îßâK•}ÙspÃä#&ÿ#-ííìšq‘w:¡÷sÃq †ˆYƒ¼ê…(›lÊSiý. ysñ2»Íuðí7͉ȅ·ÇŒbwiƘԃÎ=cÐæŠQ©Í¯—vk:Î.Ø!ŸB)2œÄz8;!XâçS3”'ŸJTgÍÜ0M AA=å%ECØ>açGˆw¿#&WLÐú)OD6ös:Vb¶ïþ/ñQó?¼¿½ü^Ê÷åu|ÝvœNÉE?z¨ûú wóŠDd_0*ªH*#-EX2‰Õêý­ ™ªEbyæ€øòñ“Úù|4îíÕT5Ø ±†/kÍûäuAf1øM_kK ƒ‡¬ˆ§ðúÕô@Ú#,åΦôt1ÌP4RªÅêYÎ’@Ó˜8ûl™º¿ÁÕë®ùjú+îµ@a»S[”`³&î»Þ‡µC¬ƒÃ2†!ÄUÝñÅ]i YY±h,#-½˜å}d©a¼\®ï~\Ç ½kc‰†72‰ò¯)è¼MùòÑáaó#-âöÞÍXJ`¼¾“É´‹Á@#,n—r:[wŽGgº€¨xQ {Cßí#-G_=¦ #&!+R¨Ï¢VAH©JÙé¼~^ºŸ§DòÄ,‹¹2<*ýAx?‚ rÎ`v<Æ]+e“;Ó?6šdN#,ZlB¤zHE׆†|áƒÙ¿š‡çNHœ¯ˆäl½Â6ªèìCèó‘­šóÛ´m?ŸnçãCØbÇz2<þ=žÐbŠR M•Ñ*»Nþ'åõ|ÌÈ;èÜvíÕºŒØ·´Aí îlKr#Tš,®àµäÉz³ä–¶~ÒÁ×~¯õ8 ›â›ŠÖábuN¾<ÇEÜm2"m£Ÿcd³i¯>Ó˜_CÈ¡Pí”79)בª¥KD†C³³Æ}Ü÷É8Žf#,(¤Sò¹~m¤Æ†4úqÂl¤ŽÈ3ïûû™èz¢€¥ÎܙȂ0ÃcÒê«™ÙŒ¼ë¼û'Nòà:s-bC2âÄ’N=#h ÌCHrÛÓ&ú¤';ÁÓž»36àüìK°ÁvuOG|MyôU$"W·qÀ'´ïÓ?YWSN8¼½ iF#-¨z_$:¤“¨ÕÉ©©GéáèÈ^D‰8¡¾º_ *wçx%'šßŠò×–Udaq`M¦Ó“ ~ÿ^ÝÂ×êã—³³zõgQ ¾aÙNÏvMlÞ jœÀðõ á;«G¹¨Âͬ,º ƒ nªæ)dhfÉmt¹²“ºº›9%Š´ÒÚíõyrÝÍBB ¬Œ À®X*2*ÇAFP´”ܲRì8ö·s"8\ÆÊ3apïÛY,‚iEb„tnÈbùè´55Šf¬Ê-¶‘7?²wÀ9Ÿ"¬)³—ZcJÎן#,Æ×ݿҾÚÚý~Ú¿näü¼Q#-%* ø¥ ŠDA~t² šÍ·áºêü*„“çc¢ò¡#&* €1¶A}Aò8¨Móô!ôÙ÷½éâíWXŒ“–‘1ÆÉ1gm`ò#,2Y§šM;kg{kE1Ž#-…#-œÐ¦hœî­[dm÷(§ÃõNØF×9êü’ ¤wlC0‚Ù_·®#&ÅA=PÞTD·*Íî«nÓݦšòÜyîÁ œÐŸ,Jìû›ò¬ò÷è]<3ÃwZ5\×UL–#-"ˆD‰R‘Œ4HÜu²R’ A¡iP‰aJ,|ÍÚNjÚ)˜§„‡aöÔÏ‚À’ºõ_jûs+#,»®Õcj+BwOy D1‹–§(–—"Z|pe絕Ž9†òHLwø¿Zúë [TíMŸjÏÚÝUtw=u²_“÷âoð0)“®"(âYÔ¦çìN‘5Ë[¼Ä¯Ù$ÚRƶÄͪª©òoQƒ¸ŠH‘ #&wãW[ðwöÖ NÙD{ž7rvc)´ôÛ‹­¨Ã0(…D… •ë/Cd€Í­oRi“²XLÃÓt/á q¡µÕ›k4RDÍü-øm4 ëdƘªd…Îï/§×æwø›õDBƒ²Ý#,°ÝT{O¯¿¹êÓ¼ªøÓÀè´r˜¢‰ý=vúc‘³!¢mbÄD,´P‰s<ÎŒc5yÕÒW*˜ªtÜéÄC>¯¡ÇA$„jMe¥k-FÈ€œD¡¾¢NOæiºÓœï'^šÀÌÀukè+³ÝLl›‰ø3I#&´¤ã¦ÉœÓ-¶þÍÚä”êȦ«^Y³1Èä`v\ãã@—ºª¤øÇ…÷T†xç:˜¨4†íÕ ¶á „Ú^e¯!!hl5ë©Vê¡2 ”¸_³J@È"‘„ÉÔ Ðº XX)tC‚ înÍ@Ôd„#,tV s—…@QaAâHÈ‹ûœÞì¯WÃ>4Dg‚1 •Ö$®ñ̰$‹Ø#&Ô#-‚­A¥ÙÖVj#-l‹´h6ìÞ]ŒFTRhF!D#zÈÒ+©††˜2&(@¸³ÞikDpžè¶0ôf„Î&匥¤¾ÄƒÆÅ †°0ÊS‹u#I¨†SemòººÛ]寣 ]JXaá²ÝAåú¹Îx9ã¶xDöÃ×pJüÔ¦|™$)Þ^²¦Q båp<ïéQ‹çÓ"ûYF×}ÐA;´gVÇ–¬ÙÖÆFI¸ îaD&Ƚ!Œæ:Ãß"‚SÊi"Å‘fú½”ß Èâ}Æ#,=LM Wd…ÙǦûOÂi@,òIÆÎÖÅW #,¼Ü²K†EŒ9WÚ÷ùlòžÞä}‚ä¾݆¦ÎI`ÝÅ’þ5Õïâ±!!1134SŽåãÒÏ( vq"`´›P*¥P£CºzûÏîH €„¨=j§Z+QÛÇÉD¹Ö ‚[!å åRÉÔrNø9†{D¨#&У×öóvîî_VòËæãÎ/0™" ÕU` bŠeKÁLsÙ©¸uuýŒ=´J‹QQ,,`¤‚uÂò…‘º"È"~¤ UX]5 ËEÌKò¼âÓ] p%ÄF #&ÉFB„dº“•ÒbÄœý–"(˜€SWŸ;Æ@4‹L]‘B$x=§>£v¼êHµYºT…ÑzÊÕo<šÉòP9#,ÛE1¹TR£ ðß& P®wf¥:T‰o&¢‡€OFü6Õ,>aÍ«tjZÜ4ËlŒ_{fr‘!¾Ž“µ’äX{‰`hB:öÝÀâoøýðì’Ùì œ¾;Íúu™ggǨhA°dN(æß§°œÑôm+f¦Ãµ¢†@%¢XˆP¢ë#,"Äç¢Ð“ùþT¥Pîn X3njÞæ”Ù.±¥GBñ5½UT«‚V"`€UˆØÃÇY íiÙš›,#&!3#&”ó˜,(Ö Öêg7­«˜º–šU$¯–·†r2@”7ìæÜr˜E¤¼Ø¦F ©%@ùäÛç;¬*…¿äË1›ñ»²þ$íI:c:ëÇîÉ×Pë‡ß#,æÈÑl©îj”ÞKÅ»ú©‡9#sÍ$!2[/œ0nRq÷ìC‡¢Oð•p4ÈðÏä4SJ¦Ú™^™ŸCÐÿo@d!$Fç|í,¡8#,gëöükô´R¦­~%ÏÜA`V­Eµâ£W6­±­mEoÆÕWmãm‹Uªè$(h]ÇË`÷zeÄè@Bþ.0QMX½QÛ'q¾Þ*¹T0#-#&ýQ™œxK<ƒ<¦›œ+¦õ—axˆÆ#-""ÁQJd̦iZe™%)4Å&¨´™¨?§u&ÖÁЉ¦¥ ”Ñ…¥{öå šÒbÉ(”ÊÙ¡L˜™¦dŒÀ£B*Š”¢h}=ÔDm%‘B‘)ŠIIe 5A2Pj-*4QÊafŒdÉZbšÅHL¢h2RÔJŒÄh4ͦ1`ˆ0PEšhî)Ü“y³ÛSˆò©ïf`„Íïmñ`™µù²µU}La‡ÝM|¿>YýE0vï`rزBY)˜>&ë^%VV iQÓ–2;7Ki„°ß¿vÙBDÁ el›íq¹.ÁG\Î}nÄíàÞ©E#-Êcûh>†:œ¹Ë8KyÐà³CÉÌÂÎZ«µËŽÝ- *ßUI‘B#üð·VV2¬«•α„œ¹æãTÉ` cÛê÷#~ùBß–+˜Èè6&Û pÀÈʦAܱeä_B‰™…zÓº „ddXš#-26k%b¢ˆÙ6‘#TDF#"{¸ëÙ׿ÃÌÌÄÅî¬Ø6E„Í)úk#O°¾“ËL¯žiXía¤¦p‘OñÏV¦ªH¦CAlìÍnôOí~;›ç/c¸zƒ¯ä$0'yêGÒÕÔïÚzºÓ幇ŒóÏS™á’íP*‹+¡|ÎàÉ ÒV_³ãfåÄw¦}z^¶åŠK8=‘#,Ù&ûëÑÙD!ÛUVmdjQJA(U$I#&‹Ü™1ë® ³³í¸F²ÆöÉVqŽ÷<¹nÒÌñ{œCˆ’°šÒ–ŒcïÉJˆÌxÇ·5ƒE»ôw‡bec¬û|ÿóg CîÖ“ùµ« ªIm¦û{ûᦑ£õ%ˆx'Fre Ó¶‰^+²žw~ãá­[¡B?;ç#-cguVÖˬ!çM®PÓŠ#-Ú+G0Âèš}“wŽûïG8 ápI5óXÜÚ¾#,o“¨%È`P±àæÂ“l2´îsIDðÎV©C)¨"ò#Œu-Í4î'¼Ñ®éthcdµàg’Œ ®„Ä©OSß¾k’÷ÙxIJÃÚqšflÛ³l%ÍÇÂ'dêpÚNB"T]³Lù2“álÕ#- jÚïc´Lî†Ê|Ú×S).-»32÷†[i"mG£Üu we…õúæ¶?w=šÏFîíÙáÌ™¶’ç¿âNÆ­óÕÔOezûÎÙÛcëõùŒ.4Ûó®W¿ì:­'ZB¤†xâøG…IÅ\³Â›ÓqÓ¿oÛ×õe´Çíµ—ç×AÂÈ:²´úK±(ñ;Þ®ÉéÓc= ¨%lô'÷}½“‰ƒ ÅSðÒ‚Ø,Í]£À>âvvǰÊùä¬3UI_VÒÇ€‹½DÑÙƒ¨ÊÎ|ö&d#,tÍIÖGpo6ã‘ã33!G…qo–\Ñ]:þùìͰ² vÔ \#&kö ÏrŒ°¼<#,›|Ò:È$‚ƒUýÎs‡—üŠ”ÝDÛ"O'ÞÑÆƵ#o+2ÞÐÛ2jŠXR„W#-2tEÚ“‰[ÔÈ“#Ó2\£¤KJON”yÍGš†™–¶Ù§—«¦t5.…’°ÎM5TÔ£R˜¹šÖ"E”"Âãx[isµ“0¦ÕÕ“PæÖß3s˜û5³|(ˆØØãNUåãe—QoDJÍÞÙ¬ÎLâôbº>*u½n)Ðâg@:wC¶ÆÖ‡ªËü–Ù²„o‰ãÓmcXÚGãƒ|6ä'àFv(„ýn$é=àJL%‡Ùfµ©ÏLwÅglhpI £S˜Ïn+ƒ4G`7îæ)¬RãžW¾_<ã0Ý®È^¯P•Üd>ÃÜllg:ðÆíq’‡Ö#‹¨á÷iy$‚rô©( ‘²I“æ:Ÿq­¤ÕÆlÑ5¶¯œ0–´¶±,1#1Âa÷x ;XÐÚìD×#L‰k\2L‘/fò.šX]ÔG¡‚Œ(¸Ô9L,~4Ô)¨˜ÂE¤6•KøV90Ä¢¥b¬+|ÜEY7þ궽‘”À„&XÅ5W3×Ë<útkgéÞÈo×.æJû§–]%•õª4(K—6œ¤ã‹i33r†ƒÒÄë ¦(E&â`¬½F:P™6ûDÄ>id›cRNL¼Ü¢îâÊ7L:àë˜8FM©ÉFÙ k}º;ëG§¥¨éË™gx«b2$%Ƀ~€âFšøÌ§]bT† .n $­1éf™­xÙ­DÍØû8#&o\7©÷·f¼ºgR“í³C«C7 )dF²;o­8˜§®œ³·Sœá´•:e[¤FŽNú9âMþŠ7£|5ƒå/7i ¤Ë§?ƒ%ÂFB÷;£5mvÁ¸G©5Wðó#,'Œ5ÏS~Ín=³ÞôÝÎ˜ÌÆ1ôœå´û·1ƒVÝf›ïÃu³U·6wu†blå…ÏÚï}ÎÎÖWaN\ÌÌbbo3Ρß'[µŒ¯€Öò¬tã6æCmžt¶h››Ç2TóbŠ©BÍ”‹”Kº€ªJâRz˜„T#-¨”žaåÒ‹w鉉ŒCφ³Æ58Q˜æz‘E¹¼<ÎeD)›ˆ£¼´ÖQ²´=ŸÉ[ÒY[•óç§Æ]팱Q™xBI¢ª,eU"[SD¶.c1#&ÖY›$ ëÓu¸73/±”+£˜™8ÉŽs57VäŽ O)&PmV†ÌåÖº.¶=2Ù¬Íë2kXò:«,2˜ÅŽ`ì…¦‹šÑ¬ìõ¦FÙ»Õ“ Àš=Ò²îÁC.|î®pª¤,á‚pÓ²h\Ô7D‚ÇuZN©ØÏ‹Ë°ö³µkG˜lÛÖ·œ tŠ(”Ù#,¸=¾kㆌ5:a‡[Ü®-Q÷ÙÞÜét«Cõ©#,Àvfò<~Ub#,NØB4‹lš%R¦TìÎÄm•œ@Ž#&aå‹OÑ¡Q¬OP…/¦#- ¿#,·L¡ß 2^§áv ‹2;6“ï(†çSáŽ8ç»ñpȃ«#&dDwÀ6èEáè¶ÆRÅFÑéP¤Y"ÏÍJiÃ80´ ì;2g΢1m Û³Ï|™š\ÔF‹ªàÌ&V¨™`3pMY2š™ ¶dD 14 –ÉLÚ©H¹wf•®”àIB…ˆéE3w-¼ÚHŒ´0!l'=kLÔÙ%$0±]“’KH¶”Ã|ÖÉæäL¹:TœY‡ƒ8&#,YzÔ§Fj£VÓ \k›82hp¡ëS–ÁuŒªÄð¹ˆ0¡:Û›<Z ´ZcH$©ÙÂ&p˜U»™AœØÎ=F{ó.S6¡Â DÆ0ÙƒiÕÉ©±‡Ï;à̪˜›ldªHEhÁB‘kHW-N,—XãeÙÀXS.Q¡¸Ú¯8Ù˜Óî9|ΖÈsc‚rбMÅÈÐÎ P@ÛÁ­²jÂr–v•dÀ­œFu¦ ã¬c†_uÄ¿E‘š‡”/ ðY:ãU‹´45±›0¬5š¥¦ÏÉÊÏA©×aA¦WðÉ„†&vqŠ ™ÝÙÄÖˆCQPôOjï|"Ç­ÌÔmÔê]“yaÅÀd®,A*ÌÂMN¢iŽ]Ås›¯—ªj…0‹#,20’b+`ÄaQ­1 ÀÒKjC<«¢JCŽ 568’¡“z‡05ªÅÕ"*…U "šIÃëõÏP¶\«cKYÿ”©3Ä›CC”é]½#,ƒ09jJ+¥o4ÒäP4 :†gÐÜÏ5ƒAÀnT3°£BQª–Î%±iwÇ1#,´”îw‰Zmîí81úE‘ÃéÇáö!ð©³%r”ÍhÞ2nþºÊ(¼aÞ­tümqÄä4˜¦/6êcûªI>ðG:r¤uÒ9Ük§’Û8ñú-ž£a±ÅÄ#,á°ŒŒ#-ý»Îa»‘Ì»´3f›ËUð„2T9¦íà §;€yì7–ÔþiHT¡ÍWŒƒÎXŸê¹Âä Uu»tãN湩–×Ô™ª°ˆˆ@±šˆPÙ‡¦)@YP9[L,Q1H_³Ï­"d&bøôFÆúˆ¨-#-£¸ï¯zH!µ”> 6d‡Šý0õEº›º|³Nå_¤"ª€ÿ–õ Ål*ª*Tf5ºî̹ºéº µÍ’¿œ¼BXýMS t@û݇ªŠƒÇ°y’À¡Cü/Eÿ!Ò˜íUõ#&q?n#&9‰ ù¼è¿!Êrë(`ÎDZµEzÌ(àŠ| ¼°'ðú Ï/ÜÃë^8§Y2.¨þÃ0Vè<ÜŸ¹²¾ìÜ}?9nìËä#l‰í»#•dÞïDiQ‘€6Y8íM¤(Þ.Á,¡x::ÄM(™3ý:M# ‚# YHbÞ¢UJhtÁqkHÃê#‘ pÁ¾PLXð3H,ðhA(†Á£ÄüX™ˆ)ØoÊÞ^Arå‰z¸oPL@ø³Fa[4áÈú:?&h)šÅQ¬hÔVѵcQ$Ø3LËF ¤dd#,º ’!B£¶Ñ>#ÃÜãËJÑS¼JìSŽÞ¿É2 —tu;  °ßÌòðƒ(`þ7v"&¼-Y,Dbi޳$±#&¬D‘¨í #D§(ƒh9Rf7 äêñ;üÝ]B##,2xÎú-}]dþ›¸æÞí(9’b¬Th‹óµ"¤Š¹Ÿš°ÞIë#&NzìƒN€S‘Óm‹i-ÁŒ[iC½e…3Pa“ -ÂGÊoøNQ¤Æ–:Û^w\³ßµŽ^šÕʺU|›z†4±¶6€i‚¬EÙ1‹fR–@l@ÓE`›Œ+KfˆF,`5þá̤LØÇr»•¬C_8Œý‡zZ*çÑÜXÓÓ¬;­Í_ëzî­Á& «÷Rß>sÔå3IãË™ý=±=/RÒ®rLŒ›ÙµqV†CCz!ÄÈ}½Á'ƒ3©=î976²­Ã+F(-GòÒpÍ0~lŒå&Ly"÷˜Y"„ìw›n­N(hÓaä'OCZ×Fž®àkb:{5kÌ+£"¬:°¬P}I¼¸,Ú—nÌ5®³Ñs4nˆæ g^’]Ûɲ³5“·y¦lñÒ‹\s#,Ų #,[éŒK"#)£(ݺ»Xd‰ ±Ñ²ÐÇÂ|Öò‡¯¡þ#,-h¥ó⸚ß-¼/òqª²¶£ª³{QËaÊ´’¹6Mìé§#,gx•²i—“*ÕLÀèÊ•.)e¬Êu¬½ææìÙ&èd­ñv5-zÔbŠºRˆš±S‰¤"锼špxÖÞ6ÙGÂÜÍä˜e9†mš±·ªÝOgS5%ËW%íÓÃíÉJÅ4äD™æ\5&艼Ãz ¢6áØçŽžj„Eá(ÑŒïju¾ŽL‘ Ú7éLzÍž=.˜ÑÏÐËNôíŽNãšàÈå‡Ë­µáÀÆi>=æ)1jnÀI™Ž‘®$ÌÜC#:¨y>шU#,7¾–6Þ¦Ó\I®§E}M>ÙJgXüLòÉo´W$ÈV\†<1Ȼ瑡:L¢’ <ŠD„=éT¾N“bŠf¶¢P˸ÓàÑÖæÂPa€,#"j;Œq1½jÝ)A`D‘#&IL• `I¤‰%¤hùë·Ò6©q´±Ø.\¯¯Y®=Wržn¦·©yåzšÚòó‹ësm§[¶¨iˆ²+sP³š]#-¥W ‰«ùCM#-PìÚ(c©{²?íHž°>²ƒÔƒ„FÕkÏs’»¸ª»C±DÑ“`7$ cyJÕŒ²TÉ„"–AÑÜÊØ2cBƒCQ¢èUÕ®Òké]×]ÜRoË^»\™iÚyºï2¯&ÄÆ•ºšÜ65Új6%KÌçüº)8p¥Ú6j@ÂÔ€­¢É”¶™T’RdMšÆØÖš‘L×R×JÒÊZdÖ–eMU}ùyá5¨0X©š-[BTm³JL¤!À··ÐfóAÐWêu”¶RÚ u°QI‘v™ #-q½´)v%)ë‚€È=ÂÁ#,ñ_DGqõçºÁëÏÖB0ºÏ^¿±…,;¹dYMCg¼Ýöf;>,@ïGi½ä„€¾ Ÿ$ fX N‹3—„âÃã¯],l#,LX·è1žžñ‹II©c&«M´œsLU<Žìï937'xb—‰ŠTäŸsøÙ;”¸Å*UR F$4Š¿ÞD€­6„S ¨F;#&**H»v›è­Óv%Ùmz±Àº:F­¿sN¼,¿Ó¬ØBÎu?$  ¦´Ö¥ÈìÌaDUÂÖ¦S"¾0;Ñ T È’$­Ãg#,=Ÿ½á»žÀÚïaÖGp&9êe^£EË…G†î½]¦ãñc'PýR{0Þû°¯uPÈEÐ€Š°.8Ý'T¯÷z)¾b |±`-TîŠ!“lÉ*èRìçèÙ#,•¯|ö(\ÑtÆõÑ®—DYÔèK¥80K ”mÿM‚VŽÇÌåx-õÅê/ÙlV¯; Ó}¸x(}ªÃ"#-‘P_Åóö}lk©øwYµ¼“Äãe®*¶øÌ£g·÷h`(TÛõ•R<„ lÚˆš¨€þuF¬‘x»#-%¤™Tbd“s[\‹(e¢k$Æ·¾íZäÓi´e-¤ÙFŤE4Ë%”ÉJ¢˜¥– RŒú—XSjÊf6†cLI´Q¶©­SDôâŠÈ­JîºmB_N×kv¯nÝ13[iFkJkRZÄš1©UûUÖ¾³‘,j÷îÙ&È¢Ö6JÖÛ"IlÚÖåÖ–&U$Ô¶ÞyÞØ›M¦Ê0©«#,¶–ͤÞÎÕj[c¨tVl·]yÜ’•i“C\·Vj’¼Y«ÅvĦ&ÛBFÛÂk²b²ÖÓ#,ü+ˆ8|æ*Í8àz/•%`ucË9`æ+K(ç—¶ÏÓú~‰ø|ºôo±ÔÂc¡>Ì’aMú1aÅ&#,P{zµ}paáÊbªbCÚÉm4è% V[rňˆÀRL¦¼h#&“RH* ëT1 d!#-H¨@„@ n±G–Í,§l@3ZB"Û4­šm¯vÚ®›i6.8˜&†U4¥ÞA « DdáJ!e"¦aÖ‚šSaMw¢™)E‚ÔP(²ZÒ٨يZfb[H¡(´¤Õ)m­6Í3k&¶SE*SoŠÜ¡…e¨¬ª&ÒPJ24¤…M²”Ò&¤Í#,3F(,F2¶QM“$–F…I«jR¨**SeJS%RVŠJ¤´‘µ(†ÔZͦ…¡%&,™I„¦I¦J–j¦ØQdHÚŠX™µ&Im­K5“&)%¥6ÙemIZµïª×v­¥e¶›Ie©#,%½åµ®›6mjSUd­Z5^Í^löUsZõš¬[m¥-‚Ú«H•ZTµV5¯·¾?‚~0âìë?~6æò7Øz%åÊ€m%o{¡ß2ß›·Žfzë-D÷4 €ÃÙ;öôÎYJ&¦O”8ë.ò"'“†›QO<é%I‘æž0¤yÆäoÑÛRÕB^zoü>B+Yï_ŒOäöc ì‡îl$1gÉÞaž>]]][:ë»Í›k(&cÑ¥ÑÙ´ÐÉrd‚í%.A)]¦%Ý}È5ô¯§Ç¥Ÿæè8ÉñÒû1Åìë”:P£ù› Ya%á¡„†ò6Ç«eŠ8š7Õf°GàH™ÙMCC2Ö¡õ#-FÊî"¹`‡êé}w¿­··iÀ*@åÜ#&#&+ØÕQ‚IÄ@ª(#-Ep4®Z„ç#&Y…Ÿ'¬ ¤ŒˆH5‘;:Rè¼–²»ê»±VUÆD`ýWú " dé[ž&ya–&\T•CA¸œ4í’FT1†ŠUI©ªk0'ãKˆI„#-žVÎÄ#&õh‹§7ï¹v­évçOscÑ]›¼iLcÞ›Qê €fççkTí&ïú?ÃÀ«–‚Îx…#-(,))~ÌUĸÞZ”Ã"°BèY.Êü?Évôµ½ÊËbŒm¡•”‘"ŒcFŒêª&cD2LŒ#l#-Ðh{ÄQšªÎ— ¶Œ d`Ž[I†b$¦áu'6ÑÍC#,cб¬Œ‚h½0б³Ž5#,»KTŠ3« ¨(ˆÁm-Æ.DZQ–è†0Òª¤Pk¥Ò@É‚¥«CÅ"“#-˜þ:…!®)ô©5A`×@c¥éßAG[‹œïF²%‘ø€†º…ó”B)Å6Z5=z ÈAº>(pÝTh†%j=Å#F©+À§«Gë`-G½¥#,ýàž5çóæk±—°ù'ŒÁÜæ" k;ްó Ô_5ô/&#±¨w>¡M2S"6‚ PVÐRû;«~ölVÑ{ukªX‰ˆ?gÖ:޵Qébæþ;·6áõõO˜wÝ–|[¡ e1û&—¬KxöC¦1x‚®y$i˜W’¶âÓå֪ž·ÑfðÀ¯Uñj[êÚä×&Ó£ˆ“ÚÍ8CjPØÅ#,njßRY²’VTÊÁ[õÉá3$…c0¶ö+ìXmA™5(Fûº È/o—X¥cçÛ0Á÷ªÑ1ð!Ì<Ãþ1¤2M¤. ”àƒPW΋± @©_.{W\_;÷¤ 8RúRœ H"–•,o$û[“’`^Ô/ƒòùJØ š×#-’­¥D¶ÖRƒC’H1¤˜Ð@i©IIêÑîÔEd47 ¨ F2eÓo8 N-¡÷0ëÓ:õ}™› ²í²´€À`®#-¡‘e#<§€õ‹^7Œy˜•,« ׺£œX[CNù­²V4Z5$&N2sF`ÚÐâc8ç=fŠsJÒÓ~úN§Ý~ò ª1°ôäxFQ*©z²¢ @œ^Y•q™ëTéÆïÊV>%B DT 9™<‚ÖØÊ,ݬ֘6VeF#œ‹†Aå—`7ëOãáàƒäwü:Õ#â”9fþ‘Ô\.¨¢<‘âXóN#-X0dSÀuȃ*©Íä'ußÉ¥ytqó-L¤7Ó„Ë8–¸Ö3"1¢qMÍÛ]´B;DvˆÇ,öÌjœ7vçïÄ&ä29mÐÚšˆˆ5§$k1«» Ǫc[¶†¶Øª‹‘(Ø‹­€2P¾ðèõÐÍÒHÄUô¢•xBz—¨°Ó´áÝfò¶g’¡q§yÝ ›žt`7Áϰz R%EŠR5Ä1E… a(¤*ÚºèÙëvÑLGÙ;@ÛCi: ˆÚ@}Ë||¢ÑD(o.ôã(ü@]û‰:Õà µèn(DN‘×H…’4ªœ† PEx`±PŠXšÕ1c0IEw ‹„ \]ç|TåÇ«NzîÆszîLYuEUb3+8¦7š§×}ÍIæÁH—ǹ¾,u/«¾ñkÝrͳr>p]5„‘¦†Úí¬O¦¹Q3»ºéyÝ„e<ís›‰.W[rY¥Ï<ëAâxñŸ‘½&YÛE#&I ÙƵƒtbR Œý=·k½TQ¢S#,u‡Zs!¼˜³Ó°Ð={Di+Ý<¤àzïà ÒKQ€Íó"¤;ö"l¾3Þ½â=öÝ#,ýyöôëÝå[ò ìG^@²p)œY¯,R…^[‰6†ëÚH^¥VieM­Ý¢Xþ_bb(z¸&¡Æ”pœwyzs몎˜ÆaìÄéíÈõ‡ZWƒØ)¼PNÎM;²‡À{p‰ÄÝŒã<ô’L@Á²A„ôì2Øé*Zý:Z.jH8ª‰$‹ãó¹‘0t‰ ®0ñD(YzwܰÀ—€jN,0â©‚e캒E„@ÃIe%[(“Á•‘3(ëÍzµzÕÒMŒQ$#-I"HÆ:A(ÒLcqžÝå/;·„Õ˘¥ìK‰à˱’’]–Q@21@xìë­¦XrH‡P£¾+ï.¦ÿ#,t]º=&cêû7r’0.Ï#,†Ë’yö<9GªHY•+Œó±"­vÐ1c¥Sä&Ñ5÷—YÍš-¿«tù._+Ò-_½­z´jɵVFaýéÁP:U2dwÆy¶ÛÅEouM4m(¢Ö«”eSM&ššë¢æÝLId›‹hÛõÕnF,EhÖ¾4¢ªô½/RÖ¼n‚0bÿOõÕ¢¬ ŠE` —€4R4- Q¾%Ã.s@a;_,Pæ…™O†4°™uÚÌà&Y B(Kd¤¨… ‘–œLgLlꉟzAšÎü`$ ËHDŒ/‚ÞЬ3#&ºhÄ¢e†l-&©%]Ù˜CAܯM~[v&Ïf¦Á¸Aaw–#-Áâo48;o\“ß%#,T_ôrØ-)CÊÂÙ$RШ6ØTþ*¥Q–ªÏJ#-…],’jó ÊeÉ‹"‡‰±fǧ‡¦Œ‡luT(5si¦»®ØÚdTi6Љ”*´#&›»|¯1ÐÀÂ5ÆFÈ僰›Æ\³r>5Ç]ð±[Ôz¢P‡RA2 ¬ ÛÓo¢|¹>Ðàð',lþ$Y0J…#&‚  OÀ±¸µž’~;¸ŠgLü±÷Ã#&]Α6À¹к “§»âmÆ2D ”„MA¿òXrW#mŸ}¼e¤4£¡6ÉØ5²B(Ò "£ösÑ>» ‚dk!µù¸þœJ}ZÌ·Wæÿ-èŽ!ø³¤%Â: —†b®É·ÎО‹âÃÌ;ºÆxŠž@¯hsOîñûˆäEAÏ ,öàCƒ®®}f\^¾ˆo¯™G\3ñèÄT,¨?Ëôº‡pbÈB? ! ]#, çÂÕ؃åæCÁ_§Òú‚/øŽõÀ‡o¤Ð@$Nâ#&¤ªR ªAUE„#-Š•‘@†hðFŘ"ŠTVD$B ¹­5 g¾Ý#-e²#{åÇûÐÁû8Ü`̕т±Ai¤±`§X¢Þ»õ޹„r;Τê>ÛkÚ¦§å÷î^{•ˆb$ùDƒrz“Ü”hu„äñ5•œŠËûáÐ9É$ $â" ÊÞ%²Æ÷²Z¤P´”Šá¥äQ!Ûöö>'Ï0»Å*ŒLV~^¾|¸°œ ,Q3–X{…~/3Öt.ÐVÎùômiã»Çê‰è;K[²Ò¾RýTHö…†œ²îË×áG­?"w‘P;r$„‘©@ŒÍ4î%zô°ò¥mTY*¥6È.j§ô3,?C0“M÷—íuCFª ±QT*¤Ïòݸ¦Š&Xy*˜ÊXKÙ +#&´0ËB‡ì@ÃGZ?ä%íý7*ëU` J’##,X9M†a#&ºîWŽYåኒeb•mqÆøÛ0ÂÝÑ!ª1,Â#-2dAZí&k-®%ŒÒ82a„w¨`(²QMJ¬Dl¡FBÚ¬ÞThÈi¡±ŒÊÉZiHÔ+5„YlàÊ@n¡)CD¤va[T#-B “,… Y¸KM™)Æ(/ì4…ŒP8Ö”¼AÊ%EIá{7“jñco]­zUéræu•ËÚ°`ŒÆ«Ù¦Æ-µƒ1••´7HÚ­ |!27’Æñá„ÙaXc0­&õPõ•`N×Y%ÛG}C[‰*ÛM…‘9k–¹smJî‹ËslW-ËàÞ1&5ë»ÒãCË®ÛâÙ4ÛhŒcΨ¸Î–¡³´‚ã1«Nñ,f0˜A¤èÎä^?ϬÃL°‘¦øâ\kV&4yÈ7Œò†‘h(õ…¦Ðª í#,çð×?4!ftUí#5ÿ’>PÓº5—•±©RÉh²«ªŒiQ&KźJ¨ÂƱEËUu+±FÛsu¶H‘™%ƒ YPu7V-J’ ’*?‰dÞ}‰üäXw"j@QHXÄHE¤·â~g·¡`5?l"Rβ»~5cÚ:²‹79}¾ƒ5É#,F !ˆB’*´QB5*¥E#-D’~6 r¢…"N_×f0 Ð…©tÄJ$=×WÇ[ŒÄ%9žÐ<\¶Ž<ÂALƒë›˜Ÿ¾9A¼oUQ E_V#-hBón[—ÅyK%l›yÛ©J–Us\ÖñµõÛkË2"‹d­a²Qêk+ªî¨µé«Ú™FÆdLDhͨbh*#-,ÄÂ’[RjÔ™¥¦3[ˆm°#,4ƒL$€QDŒ dyÎËR±ûúuC©¢æ"ÖÌeðXt‚;`ÔR U¿$Œª)rHêš#&E À G0’Ä\E,IÉ%Œ _DXÓ^ðY‚rYnHè\w?„§@¥!ˆ^?¶q4xLµeèÞ°ä¶)"ØOrûä€;4K‡fgŸ;L@ò¶¢ôÓ?´û¹1k™Êª†ÈJÆÿ/‡CovÔˆÃÖŽÊ¡8 Fì.1Ì3ÚM¦`—,9–rκ“ç®#-TT4úC#&ÛEüƒä}¼âpp5s!ì#&J¡³Ž½è»@îD<Ї¼l¥x°KJ•nÛ¸¤£JZR¦«Pͦ½åvÆš¬ÓYORº¢¢ÅÁaDQ’TBþ˜™7ܼ,ˆF«ºtomú?©@¢‚ãÃ`L'‡×à‘°}_2q:BðüHÝåaú´g ÓæÍ§}iáÑòaƒ$9ïÓªLM$×{¤ÃZk9»?l«Òeë®jï¤q#•mñÚ(j”Ã}õÆ ÑÒá½× "D`•”µ¢†ZÖ81†Ø<]QbiˆãƒÜ˜‘ž~#&Œ(t¶ˆ7ã‚ Yˆä>+ÃÞ žIé{;à«°’I$HI =QUÛ™9ÓÐy·§=22öþ{ëÍ ìÙ6[DÆ#,6ò\«êX²ËÂ¥9Ad#,a†¢ÓR¶dÿב·9+6Üè çô/C<0gQÒUɳšb?uŽ51º’GÛïÀ#vµÈIþ“¶#©NÖlÃ@,×äÀßf›&ä0ÄLOõµУHš@Ê&ÀÒ„%#,.Á…šq­ŠSDô#-!ºm¿ðæhüu&H‰¬Ð8 ® t£äÙ׃*Ž籠ÌßžW)ÆviŸ»öèbI¡£¡k”×F!ÔÃ'„qn‡g#,v>…Ù­/ñ&ñ|<~pøÖû“]#&ç\v(|¾!¬â€‘¨ñÛ[‡žÔh¶¬E²ƒ RRd³Lŵ5´µ&Æ´dc)¯Ö•Ñš&TËK?CVåµ3-M‘h¡fk­˜ªbXÛeª•¦Öi–³-²Ä–±iDU6¦blÕf‰¦©¶*ª-€-m6{ê¾Wò÷moÓÙ5ü;­²rßpÛ-4p+#×ãü‰RZÜÛEk]NUj-¬ZêkZæ·fðUæ6ýݦ½26ÂA'"v§YáÙÇ@N €n£lGš¹ÌZÜØ¢’ê_ŠÒÞÕWd„OÐAvÄ"ôH¯·ud$C"¨R1¦,ª=Œ) >2 \`ô8'Ó‘3„ãÀçdzà¸(íÞ]´Rñ!F@ˆxàSÓäŸætæ0å$¢)P#&÷D#,jsCh##&2=Åü˜–½‰WM¾êÛÆÚÚår¯ÔÚä/j[¤R q¥OjÌ/g;ÄXÍx#,Ðüzçàç‰6¢ ˆx:ª˜²>³¿Ê¥§m©#,±¹%Éè FI¶éMà\˰¹”Òõ™™ƒÄá¿\¸«€ÏñRÂÀк…®D+‰ò½¾b©Ä‰Þ#,#<ÏXé“°“ÂD¡(ìguÕÝÚŒš°Áº}ãP9=}ª¼;ȳq»¼±”˜&òðÀ);ùQCraÁÄ i.¨áÍgó½XOXŠÖ0†¢-„ƒTÑK0D¿çœé‰“v袋n,M…Êž/õ÷>qJ=¨}ÿ‘u¾iXü5eS0æ¡40ߎ>NÏö;ü´ACtsæLD1a4÷ áîv¿ÕÌ5ÀNÜWÖ õæá®¿£‘ÑŠQ$%ïü5áÇæ%¤„ ¸£Á5«O¢âÞw>Ròj³&{*´†_#&ÁÝél–$L¡LŠD eCxF(5ØZýõ"ƒ¬q1ºÖ4s#D‰>Ø€i‚‘>` ³L`)ª–¨õ¨ôö½~.ºê^Ô–\¸^ùÛã;o7#,®Œ¸šHQ¨4G˜v.b&L ³u:§ ¬J‰Œô*Æ›‹›0拲Ÿä¶Nç‰åéÖă!¸ sò(¹#QD)(lS@Ѱ‘Y˜ª ¤æÐYÁ@`'šˆgf“×éò¥épMŠŽƒ°ïó32íëWÖîïó"xÕQ# 9¦IÀr*¢Ú<&µŠªE[2ÚAC#-Æ jDÄû2gȵüû›w{o]åcwEÂÓ.cTbïF aS*ejKUͼ¼v®–ø/UÝc›ÅA0å­,¶f«(E¶ ªmE¡ƒ"ÒPP‰i/{&؄à §O”&µLXêk6@¬¡Ô‡N6ÓÈKwL;<yŒÛ#hÔH„$lÉx aưKú¶­46¶ôlJòV¦wn%ÝͲ9Pñ( ¼˜†m–ÌG0Ö]ÁF›×Û§9ÉNã’™ù𤄯Û%ˆî*‚Et ¦Îzzjyú~ÚÏÃ]À»ùbréôRÒç*ØÝîõzEìðX—MCPUÀWöi\*²È‰«C¬j0¯ Ì_(>tB_yW°´j¿"¶ûí¯2³IeF²VÄËFÉi5lj”Ä>ÆH#¢ ï¶ËbÂÙ%!P*#$ˆ}Ýãà^?—ØÃª6=,%7u¶©ƒ‰õ-ʪÃÕÝk5d*DÔ9”§.³Ÿ.i§Ã,²ä*À§Î5íŸIEv¶?ZH/la2Ô2.ó}œãÕùuÊõòëþn×k|m£SНè~å‘m—«å>,5'¢Öû™­ÆÓ &ɲ¨0ƒ~Ï)”×ùûçЙc‡¤àðÛ›íC +œM€u-z¨€š7 r:ðœqI‹ÛiqÇツFd™2m±‰óéÈ9ŒXÅŠ3ÑY¼…áØLHšC™Ü;p‚Zò*<àv#-’¶æ›÷¼é™‚Ú)–‰fiMA=§¹Kß.öú¶Å¹ñ6H_¿¾;ïm×ñ#sµzx’Õv:EîaµSIžÿÂ_8SÓúýúûñÇ"Ñúõê–«`½ÚMvõž~ãÉCfÄGÐy*£ïÁN¸wÞÿºáï‹Ê'q˜T?1Ê2b¦†–Åz‰MÅÖ‡öSc3hiô|Óg~} yi:Æu¦µz胉Õe‹¼SZ£ sûR,Ÿe#-ÌjjíÎýGzS'O}]Ÿ¯e;tnÞé¯#,ÎÃqâ‰÷qgèd;C$3VÄuBžlP˜#-¥B~¶B^Î#FÍþÞÙØeìX –çiÏV÷»*%Ž^"AЈ{ZÁD;¸T™ -]Ú„X #-*¦%0Q ã’äÍQ-aPa"£oAKA’Cw»[߬£êߪˆ¸ ¿aå.üF"§ÿ/õ—ì´¬F0MÇ;ÖÑ`±b!A1ÖL’Œ±$‚Aƒuƒb€ŠG#…\"ÑF˜ Þ ”DDøV/ @„VĸÊ&¦TƒÆ§ÊõÐáƒÄë;!s¦]Go­:YÍÙ©eX~ßê¸^wÉEª¬ZÅ­[U±IÁj/¿z|sH§Ë~Þ}¹ì9»O~Ç¥NÏ(†¿QóhiѦî‚`†Ì5bË„ )É#-Lµ‰‘:WFÏ<XaîàµD#,4viÂ7qt<„–¶µ%¼ƒ„MõSå+ \¹ä¢¹/b7÷¡Ú'Ë‘¨„±ßëøî #&B_Óa¡£¸HšzƒÆzå4Œ(¦¡¬±f¢¥7'R¢´I6Ñ€ˆF‰b ÚšjÊm´íÛWRlM­³Kjº­ÊeâååÝ¥o+[èË(ØR¥VÊÕX¶Õ÷<›äÜú§‰D1íóÕ)ZkÔ¥1¨féÊÝLæ²äVH$p×ßQ`RM±ì½Ú#,1t>úáø¸ÏŮɃ­óñ´ #$*Ö{.È[ãƒrî#, Ã0¾Óv”ºï”±¨+j“è8–ÃÑ舭ˆpS-¯vàMÙ”dnÐL¯OzƳ³‹âoW&VBŸx6@æ{g/…x7 Db*“Ò\౿XÉ»'?fÀ·žÉ_¯MÌcˆI:ßÃÉày'­·ö}9_úõØÑTF†ÚÇ?*.ÝC³U‡íß\K­Œï+|I†?Dפï[»™7œúM¶p äÑšõŸñ~ßÇû_ÞßžÀ-OäBP¥‰Î¨×6¢Ø2‘“¢âà‘rÈ!ßø÷ÒZ¤(MÊ:e­][µ¡a²"6­±0¼È*CõËâÑ!T‹d‘3%Wã*§"G"]ÒJ^‚À9±np9·bÈ!L7¨¸#,T>™óÌ(Ge3=g¼íë=NLÂòM9IËïÌy–pÒ†æÿlkG}êWBÆCG¹÷cHgM‰ardæ7ñÙémÖ³Áõ$ž0Ø–ƒˆ¯lDó£0""q©ãª'n¦±ƒA§Íõ¢ó"¡P•|n¼µV^!Ô2AÌRËøð+«ç¹óÙ—¬~dF#&쀉^ª¨B<Δs Ï.jf¢kSöî¸ä)Õ vÕsk§Ül^6‹V+Qm¬V£h´jÛ6ÉRkF²XÚÅm^*Û›cmsJ›Xe ‘Újf=<~ÛuÞåuTi.D%©,T‚0¥ÓÃrªôX]æÐBÒA€yöî8m¸]¿†ÈMäD–px>ÂÅ7Nú÷™#-bŠMŠÏVªÜ>ã–7ÏóQ·w[:þ©ëõ¸AõSö®šºÃ!¿}¨Âm²A™rͱ°Õ5Îf1’e0—î^…ü»“àvi6ñ¯Õî#&H¡##,OB¾Ù‡ 7bBDBò@ð`ÃØ#'ÀwçÇå¨ûƒÛ–ÇÝ"TúÈÈéøÒé @ÜfS»vWÒÝ1¡†@;$¡ÐsM‹_B‘ªPôÐöVâ¢ßÌ0„!¶ÛVb£9µHLÈcãQ Y´&©ªVÍ,[þM¯]tÁ(L:‘„+w=GРXljü7_c±š{hP¨;à•ªê’ª¤ ôQó$Ÿ^½ éw3j^—I»CD'°÷ÐÛìÚ]Nï‰ã6­–¦¥¾ËôL2b¨UEfºÑ³mk,ѦB™*¨X°@!ø;´®™Iõ ÙMIÁj7¹H#,&7ƒQ1°u…H„U5 “‚ƒL#,Ýv”©™šÅCE£]q±c@:þCÙPo@²‹7†6Õ 1’YhˆÆD% á­AÔ¡C C#Áš¶Ž=P(ÒÑ•1*0‰‘DÆ´ÄK Êi#,iž"­ù7Žì5}韶[AºôŠDÆØÆ ´#&5Ò®oœÜȳd«JUΓ#<Ýu“*B”ZW|üòy“ÔÛ¾=zñD¬Æž·[³Aå×fˆX^ãziP¶ˆ ¨ÌÝZ@Œë ²Ä0ÂíD A#&*#,JÙJÍ ¦61jI"Êm62Y¶fI‘¶ÊV^»·—jäÓ»—6ä‚Í×\¶æ»{ËšóyÞDÑB¥¨f7-õ½w³Ù› šf¡á…,¥Ò¦’óâŠ#%XuÓ#,aºÎSm&5X<'#,Z´ i"ƒ@ì±âzz³ÆÝjwNɆµi±¸ÐÔhè`k𪵌$X-¼ŒhÛVÑ'Ó“ÏG2m6”7#™ª`Ä£[ß#&e–a‹M x#-Yƒy»V*‚Bµëk¥R1­R Œ†©(G!c†œÙ™dµX¶ÝÖjвSB1),…  e‰‹Y¸d‰XípÑÈ HP3f6šaÛM´lâ$©Vex¬ˆ¬(ÚLCFãÚXÉf6ZIY\ ä¢À±¬%F³ ˆŠHÕAÌÇmLa›øåÎq¨ÃÃÊ݆R7ceÃ3 ÓS9›#-»qå+RÚRâh+ƒ™po>6¶6µ!’/¹¨ôÿL“aB#,žÎ%ö7eªg—9ÎZ"®4¾Äõjîz 8‚{ÚÒXÖ0õ÷LbÉ¼#,8ŸKɳskhÁÇ gzF—¬i¤\6¬Æ–Ùíê¨1*›=1#-XƒP§ÚXÌ{ŠÍÐ0Ø. q´7ï= Ë3ü#,JspÓ¨¡°†ÓC?\ò€ Ü}æ®E¶â5› $²àxOÌ÷X_¥‹®¦_›ÛÃ×厕Ñó[|ÐØ´Õ›o'L+¦B¾ÌVCÂhÃ<Ê‚ÛH0Äd&m’\U-4Öit=S|æjINNk$4$þt«P‹Fͬ4¨jáQËb¥ èµ4sga3‡6ñvý9óú¾S³[s€«j JND Äâñ¦Æ-16Q'*VábX&.ZÝÒ/R-iAçV<²ãT3 YŠQ@1¢Òˆ(4!­î¼ÔmtÕ›yvòš•ëj‰ˆ0Žƒ:Bˆ 4&*†5KiÑ0”BIq)¿ï18ž'Èɦ4Lšö×vëzµõiFMŸÖÒ±B{ü#-m(Jh´…ÝFUGäë«R©hžïB’¨–wD÷I’Ry\SËÁéZ¸¦Pí”ë²xSpT`VR›¨š—¨”ˆìððÓ1 #-]à“ˮ‡¦‡~ÛVÆimûžÍÝŠ3 $9nffÜFÍåEuÏFÜ$Â1Þ#-B#-ùUÓ±Ældïu„o©«Î#,¨°*°ƒ&cŽx i":z]Ÿèmz×À·/:µsOƒÃs;øûLA¿=EÑA¢vÚÁ„›Ãâú ± L(þC“¢$†L}æáppz)»øÚŒWÛÕy&玅ypÁpÌÔ$–¹«~Û9„aç=Jnʈ™hm²Â$S/³¯8`®üêý,¦ûÊr%MšN–Çôü_Œë–6u#&Ÿ¥¾SŒ­Ò÷cˆðəϨڰˆž·í˜õ2ãêCú€ÖúE£l%R·Ê¿=¬kmžÓ.#ahK¨Ù,ó"#-jÙR?*A/Fˆ(Ÿ"Ž©G#dR6ÐóÍäò·Ž•ÅWfÖᵺmRm]ã¢ÅXµç\ºjímÍ»·2êñµðË%‹H´ŒT©«œwUÝÚ±­JÓ[$ØKFP*J.å±B,„–’ #&Á4¶„”!ë¡¥ù1m…õäŠKóÅ:ŸFYÄ‘Z@AFPbŠ0…#-Ó#&)v#&?I˜#&À IÒ2äMu®÷-#,^!9­v½¶¼™¢IÂ@1 ¢–úe#,b¡)¥Ûi]kÙ­DTj¥)jEýZŠl¢Ö+13M*-±¨ÔÌTlj-E±µ™X4hÆ™ªM’Ì¢fLJ¦Š#jfM#"ÂHÀº€P³²”#-"*@æ}|3$ËC@ü?"(ÄT2…àU‚2#&¡X)!r}ç~§õ{qéÝ3KÏËì’Oøß å{py£cd+æ"9L^g@Þ[çG'¬Q ÈùÄ"E´”ÊѾnožõu 4j£ñMoÀ­nkÅ®Ÿ·ÕÔ)æî¢6Ó»³®ÚîÒRÖÜÅEU%·5˚ήÓvukJÖW®ÝšÍEª»i·n¿©óDš“™ÏKš `é©ó(öªûá@Ì4è&‰$Ä ª!ÐØ¸“uÝ„ÒI#&‘DHhFE£ˆU n;zr j”#Š#,ÅuLC@]Ä ™pí즹–o#,‹bIé}’? µ>Øûû%|>¬OvK8.O¡˜þ5çED.`*ëD†TE„úf›#&‡àxÀÙ°óªñ³‡&mÆ#,íS3ÏÊËÆWs$ÓP˜cLR+mM7Gša™#Î;“o³´ÊrJ;]æ#,ÂR<ý»Íóåð÷ï¸Æ6·ÚVŽá1«cFº={ÎOsèÉaÏ8#-§u„Xò ÖÈrO´®’ìl¾.÷ãF†«Ë³&l:‡¾‡9„K¯ZvSía wl²¹ã94gÂËm£µÑ-#š™axNã2–L4Ä»½žç‚i#-¿Ë'mF0d^Ñáx%Î\‹óÔ+ ðšÕåp;MªlÎ6[?^6áãCþÕcÃHrb¬[é3,§T­ª•ŠÈ&Ãì6¢|´Bëí#,4N0O¦0ŠÂ,•£T–ß*}¥jé©1¤×ðd”‹•é;¢+œTnM £b‚EQ#&‘d€²$XQ|ýל€×/NÍûÍœ—‰ÛíG#,v:kÁºþF]ÂÙrñŠ‹8oÆWõ‚àñНnúÎö ÖÌ€¿¦™#,ÁD2ɘ- b2î3±–P!§ˆh:Òú*í•~MVðÈÃÖ¨ªÞšJ#,¬áE#&Ø»"•Põ)ZE2H€!pòµ‘„ Òˆä™.Mƒ"Áçø*%âýá#&#,pæW§^sºxÃÓïó Qù¾GwÇÖ©ô>Ê›&áò‡6»#m›Ñ£ ø•Nœâ3„“½*z€QCùƒ-µ#&‡Ÿ0xDJªh¦H  °©X4LŒC©(b!VÏùn”!Qjäw¦3åû¬ù\x#-eä%n«º®;[a2³²µÙÙ¯7”'Cøq“ìbȲcA»²5uAIBÄ嫆”uÝâòœÜËÍÅfË"i$l&Ê–£ÆÛ´Û&‹S60xÜMæÜ®UÍÜw^s/&ã®»eè\®îÝ"¹x·%QÍ6[Éæ[«—sY–4;w›T«FG¶×7-tÚ²[F¥,Vu¹M™dÙv£©Ö@ü¨?Y,ìêÓ²9;Žà A¥ùáhyÇÉ…¬pØ‘ŒL@Ô‘,u’Z(ñ@‰`¤¤#-DÚ‚Fä¯+³q-cÙíê½/+Y6ŸÙ¶–2À¡4m’)3¥BQ²³R¢º#&V°kƒ1[¶T#La¹rиKAI"ÛÚÀ-zUʒܽìÛZñVÛɬRÒ‰'~‡Ó£m¶ûÚ]fË®:k_d›÷œÁTÌc3p~“” H\U3‚Ô#m.Ç…Þ €ôòÉ+×ò#-Ô4׫z½nG±¤ñŠæ»ÊQų.ZZA‘#&$TFâ¥B‚$ Ž¡ôäšD#,M¹&ytUØRoß¼6… hü(Gõ&þ¢˜(' ŠTqXÓèwÑÖ~rÙiSÂwbDXT+ šnÔ#,*9XŠF–¨[£tµ<½4íaõ müÐÑø@AäHÆ@ܱæ©Ù¾#,#&%- X#&± Ñ*@tS˜JÚþZÛ^ëb4¯»Í+·«NÌA¨ Yƒdj T’N¨v1#Z@š ·:׌öÀÞ§¡:œaAbŸaOùÅ6¼yÃéü÷XLÑµÕ KRR‰‹h„6­ÒqŸÙ†ƒ_l«îaµÂ(t8ϸvC0Èâ#L`¢6›MÖDÛy dÉ1ÁBHÓ#-ë1àÔxÔÌm»$"¥t#¿Ó#-ÅþÖClÒÐV†tyðäkËéÞ¸>‘¨…YzUm¸™ZÅËM>ãqÍy¼hvlÓõ†ˆx„E>Ц“ÄóØâàûPtÁPOàМv£u|¥DÓõÕÚtà#-&ðÓd#&¤‚‚Oe#,0UXûeH ñ+QëT{¶h³™sJl¯ß#&qo¸SˆKƒçãÿãƒn»»PÿFÿ½&GsÙ¯ëéI4`Ò#-™£OÑ„ú`+ ¹³çÄÔù*)¨_³¯r¹ýx7e˜ûŠýŸubZ”üJUŽ‹íî¯c¿öôSÞá,¬»z.™cÌ0kè„„ åÓgëW£ p ´†‰PEG€¶ÅÊ ÛA½¿èhÕ2™b Q«pv\DÆêv½¹ª…1b?K^ƒGOBC¹“ŠjŘ•‹žVÆØºy$LdUC#,žxY‰L©m@ÒâRgpp¤ˆŒÂÉ2"ZBÇË0/ñ#,ç#,íŠ'yŽ‘Ï÷­½˜$û4Z‚˜ ø!ß_3ޝ¯¾4¶Ì‘öÒ¸<”HçÍæ7í0»Î:ÄíŒz˜ÞӖ抣ÊI„a÷vG#-ªsf`I÷üUÁ(Gñ}ðío_Ñ$Å1ö²Í«n¶„-î9ÈöK¬â¾,¿Ÿl¦Ѧ@` ÀF Üb§&†0>Ù !#–A³OÆ1Œ’¹àƒi#,ê·6´E³ZÄciiDšM©¥àü'–C"ÉÕ ìŸ£Ç„½[úXæÑ»Þ‰…‰'mz}e°&f´R‹˜ƒÖyiÚΔóK×ù=iæÙ° y/Þu+‰`Ç„z’nà}˜>ŽÁh%÷²på–¯o3ë¶ÁNP4oL×Mã~ýeu yà[xÖq¯~LNïëüÞKšçMA`ˆÒÒðÌé-MâCv߆CaˆìÞ8<µ†çÑ{2ØÎÙéPŸÂb*)¼T»¨Ì¿’ìt8–Ú¡<ˆé¸NÐ#D"‘„hx•*Gâ©b!,³bšÞAKÕÓ¿¡ä=§°òdý©ý!ÄïöUývŸðªŒÀï§ñò#&LṑꃘxõöuîÓ0%OÜYé®Ä.YÁÔW/nmò/ÈkÄä½Ä|Í©š`zRPDÚAmÞ!"0/¦óI†¾ &C!@íŸó=8QtY&ah#à †H{üéõ€S0B1½µ¤ˆ†i´èQï};­|‚4†„Ï ìr{¨Ü»mn¿s~ìåÐûXx:°Vf¨Gó`~ö¹òœ’VÉ$Öõªþ²bÜÄ4JIö¶ÅÃ⪠!0$D–’2´Ï–4¤mœr²æ®Þ–®ñe?yîþ‘.GzJHf°ª¦ŽÄ"ÎøÎ³œ=¼¶••ÿ~/‹ÓãD~Ä »ù?_{Tž4šòŽ…¶¼’xª•;Ð5ÎÞëçgÊohŽùï¥Æ=t œ­ c@–0E/jFDì.Ð4b˜„t£*ßÇ×™Ö¾GÍÜ´Ï\Õe®,<ˆåüÔ÷¦á4·ŠiÜ'žgÅãw»¡G!à¤gƒîô§[™ÉQìa:_žÝã¢qUBfNv{obšï3œ¹£[#¯·cZFO4U(Zjy‹Ëôï=š$Å$“W×ìHqã°ºHõÿðé†ÁRŠMî#,(Bf Ý—8í¾€kîÁ€Ð3Œ½¿Óô~Zbm©öÊ‹õØ1 ’/ÔD ÀI#&|R${ÿ}@?Ô+ï‘$D„$H(wï/WAÚ©ôp炤{kÀüÕê=IÌÍôSЦîÓ‹ô víÇÚ|º\@>£Ôoa¨[ˆyDÈë¾e¸"èzξbãš<>\³yü¦¡c蜌w‡x¼ÜE#&ñ²¶ÒiVa+lmkM±&C“&ŒYôMDW‘@¢Ã¤AÊù"ƒ§@‡xwP¨ª“lÿ#-úõJìéÐâr„Ï»š"Þ”z7Á^”{lšúús·+ZQös;§CžUŸÌYʱPÆâ|mŽåE1‡¢°0*$Ô=†÷)ãP¶Æ{78ê$Ôu_µÆn4xƒl<¥¡ #&c¬$tºÅ­~°þÿ¡™RÊ©ágë,à ވŠÉ.?¶[µÒ‘Ð~¶ù@ˆ4ƒU":1@,¡¨ò„i¼øP˜ ŽÈ'ˆÄçüó#,¶Å‚éÄ#É%øG²#-*f~ªgi-A›ou?¨¯FU M4?ðt¾Fd)Ø„a#,KÍ`U†Ñ<"”Ü/·’~ÛÅÛ\&vš¤/¶#&ýåÄHéxø]ÿ+ú»«‡¼%&Þû£¼å%i‹-#-‚WD¿øu^.ÉoIÚü.Ø )ÚÚŠ¬ìð. míd ƒ(/bÁàZ\uX1‘xŸV½×)3õ[ú>{«rŽz#ný¬?NC‘ð‰ýyù_Ñî/EBFÁþç#-¬U1¸Î’HêD¿6]bSÊðÓ¼o+œ%Ë4!0téÁ#&½g›G‚C>Wéõ©,8ƒøáŸ5¿ìÄx(I ìèh·ÙQEùíòîYò]2cïj´ï]Ú&ň@“:嗆υ"ŠGJT¥ÞÔš¶D4³¶¶¡#Ùûrè’wœxnËõ¼bTdàŠr$¾ƒêßú¦›°Û\ÓÉÌr¹WtýUvªMÄ[l¶k4Õ,Ö%¥+U‘@‹;wí²÷j’D7¡Ñs‘“O[›}þ'䑺(Š´CÙR­#&X ±Wò?kç½z“øÿ‡™#&›FeRDhÌš(&›D¢j"““%ˆÓJ‘’‰¡HI³dÑPTEŒT‡è“—Ýž0~C&Ìž’n‚>ÄÍö&Û»›}.¼Î)I&Í»fPncl5;‡I°â!Lj#8±¬]^uЊ€bɘ_níÕÇÜ~Òz,˜eŠ•6`¥·mŸ@™@¨…{jE#R«5sQƒ.=kcõ÷bøäêšÆ%‘µÒDY!‹áûmfcz\/Ç#,€¶ºi5U9|ÝQIé¹> 7a20<6\›ÓWmé;*—i5õ¡2ÌÄ7šƒ/uìkv©ÏðöT3tg-Ç#Dz¿ê)¿8r•IP8$°ÏVÒÅ@ò/æ„ ™à±žs¸ügR¤Ó}Z#&Œ'ö@Ñk-‰TÆJR¶ÓN4£€#(dT–£BºÆ™$ @zë5˪6ܳºä¥r¶íwK›«­tŽö¼ï!µ™­¸{xƒYåÄC#-Û1&Ú1<¤Œ`¡|PÄ ÁJß•] aIª£n‰Õ*É#&#WöÌi$ØÚB¬jMi•x«W.—,î”bJ#:qŸ0ûu±W;^ŒÊƒ!Yˆ·l²\¤Ñtг#ªÀÂå .ÖÝÄãl‘¹õj'F\Æ\1HM3MæüßÐ^çyƒÈF\M£.šÀÞ „¸P’£‘ òœžˆÕI!×\ÑJâŒ&‰#-¦ ­\U¹êØüE±MƒÍ•cðk‡#,”VÍÇP…0‹!i#&ÄIÞUÈYš ÊWœvD"xï6ÝË(ºíã[팒"@#)ïÚ£`Ò3 D“J„INŠi¡TBÑPL6›rÅXË-µ4Ú›q4ÌcÄAiM1±¬MÂH”5`VT6'¡¹,Pj¨rªÓ¥%Ê;0²ºÛX!†ØE\Z¬(•uH£r$*²»F4ãhm7Zl¥#,•-æª0Õ Lx7…V#,*j†Á€j·—&Á¼ìæ=Ä©¥X¢î °r¢íM]ÜKKµ¨0jŒXðš{Ì[fY‘m]èϦ fhL•µvCg ¨Œ0ibá­)¤‡bë)JÁV«Vƒ,!Y$vS êÆ¨œ1öÌ1šzXIàöí/G^ ¤y]¦&*M„¢‚Î UÖ“áÞ¸¸‡¢ôCMSLŽ–bÈ¡8ÖÔY=n Ó!lÞÉ"ó&µ%àÇ!JŽmÌKH'…p¶A¥ZÀiz¨ÁH @îÑ„f#,ôœ°%«IƨÀÐÈ&•è\ÑEv:#,D(A3cJjª#,AàÂùÑxc  Ð†/ßóD#-.l§5‰¤wMVÓQ©Ô­lE,ˆÒí&qV¤¦#-¹Ö¡‘“"L«"†[##,4ÍÂAT0)„bi£,H+Bd€2Â#-¦“‘ ÁcF÷uTù²éép¶*úH ãňmõ&œàÁ6*š&…H"&ÐÒËrÍâ”m½1Av‡ÖÑf l%7k¡b:Q›•7!õCRÆiüi—´ÙLØXi± è¨Êh¤"¸÷2ŠÈôò··Hv0&AGȧ¾F·"#,ND­õìaµzQ‰²]ô~´ÞâXP¯¶lDKJsóèÐv#{눪‰#,cÎÍÚ¯.Ù±VV(jË`¦DM1žR qbòéßq1lTI$´B6&™Üš" ‘¤´ Q%Ô0B…#, ¢BÄ•FEIƒ#&i´–n@$RD2#&p´Ñù“TŠ ûy‡oZJDªR˜¤«Z¥eUKGù®¼ºbÔdµÞºº[õuÄõr;§rV;å|-ôWÛÚJ j-¶(‚b‘‹„AØ­T²ˆ~Ú)û‡ ÃÕéMû¦†¢º;‘Û^_«úÀ2‚,P¨ˆ„‹áœÙ ;ð#-ê~ü±oºõQGáŠSÑ=tQ³ë’«2à›‡Ñ#mIª¤´V¦™¬Û]|mS½"…ËlÒö¹ ûêRTC‘×^–#ïšéõ³Œ 4¨,ÀÈT"ÉøN‘+ð`YÏ/5Q‚\¡¦a•–H%7^.éד÷UzõÜX»»b1±­Ñ#,!-"`Û’#,Ðh@Ï‚£CPl2˜Ú­@c™KƒÜ#A­T£f(Sðd‡ì²ÂPAñÎÌÓÓ™¦A¬×aDGp {ê\õØüÂÞãâà|ÌÍ­.s"“#,‹u¿†ˆ½'~ëzøîU¹á v 0|½xZÖ9&jZ¨[VG‚|P 2õGl¸ƒâÚÉ{ÔŽí1}#ÀO¥´èr}zøè•ëJÜ>µgÏøâ*H³q 'sò3Ú`¤äb\µÊ"g ;F7rt$¬øž<Õ1;Ïdzsß¡áÆö,/T1%Ê.UìÞ–Ùiºp¦»Nu>]›;Pþ3äS g³²ïéGí;2ï<(ýßÖí`€eݤ’xlñvÞvXèã+‡Jœ}—æ‚Øçð–ü5âÛõéô±wÀ‚îâ¯ßZc?SÚ ÄD%C†h÷ w*JŠ¡P€…x}iÚ&NzH|ÛÚn ‘N¨`ç(œâw%¶¨÷ªÀÙ`Tìu±SgCÙ#&J‚¦ö.ú×a²²Ýc™Bñêú‹ã‰TìÎÛ$b„h°9qÐÍ…†–|m/c£Yüím潷쯳Á ØÃî‘k¯©•Ti}ÎwdZª²Ä"n!§Ïa™Hj樤0À—mE„ûecq­ÍN 7P—s¾2ÉÐÈ‘ùË^ãù½ÕéÝÊùõ®É.UtŠªJP‰ŸÓah) !"$‚“)-Ø–åÝÕ·îË\6¼UÆŽnVéµ·MY#,cnm&Úæ²k—-µÍÞír,m“j Qª+—‹;«¯æM¼zkÝ[ÓA¸Ü×0 |Ó“3~!‹LaÌtÓeðÌÄ¬ÃØ›½Áé2BöWyÆt#,Ô‘¡¾"ˆÑ0U¦ô¡î—‘.ÒFÿ#,ü*¹þ9¾ƒZO#-¨ ó‹ÌøJ? W?ÁþB(Ð3M€|gõRJ~±Bè6½6&À$ÂÑøúåÜh‰µ»4µÜmºîãµÒm:îë]þ¼è´¸ F1@ñA²C URDDQHEI")D"É «h·‘.ܨRd%ÛÝæT]ñ"ª½"‰Œ!"Hª°€,ˆ1ä}`¢#,GPë¡û` ë#&MŸ¢!èë¤ì·QF-P¬Ò8d4>4Ta¦Ÿ†.Ú²{¨ò@t#&ïÉ™~x‚ÏbDðõ’²n‡C¦#-ùÔÒ‡¡íÔ3`ð:@FDL¢Sæ¨P¡ûÆŒb¤’”(,bÒÉhÒllÐÚ’ŠÅ”¤¤”É´hR¶Ñ¨«c[Q­©iZe©hÔÊ•‚REF0—ð1íµ²ªˆEm¬È²#,Ç"6W"Dü× 2‚2#-ç¯+×—NtŽUÎztxÀ‰— À(»¦ƣʒB¦”I<Œt„˜“p¨¬M‰²62#-Ĥ‰Ik Pª bˆ``JZˆQJÀ#DQ”4€Å¢Š" E®ÃB‹ä*#&-@¥Œ³íþ ìwö׉SÆ—FÝ57wNìÆáÂOT#-KÁ ½S-("!b"IfjЃ-<€ëˆ9 à„ž¶sÕ  ØM¼Õ‡? ¯Ó>µ¥Ï-R¨¥{#&ú€©"@‡´/nÕ±²#74=ÍSô(y6ƒŒœ+©ÅÕ×éÖåË G–‰z‹Ë”`nA1†ZäåÄ0#@ð¿N`B!ªpýž¾u—u˜ö1CHÀ„20Pb_[`@šÕ#„n=éÅ;šü;kíä…Îk¥¸w3y+­å—R¥3(_¥wªÕËFÖÄ‚À TJ˜ RX„ò÷ÌÂÎðýÚÑ=8Qþe``©ŒU&•]î3)P¦Q÷#,6¬æ ³„:â¶gÊëD4µà%§ïíþâÏ”Jœ»6T¥´ÇôãìŠéŒss=¢nž„Ê_Z´ô?=Z#IRò]B„¼)«4UJ`o“VOÊZwìí‰ä†¡o¿ás¿Ž 쵑ÍÜv—ˆx~a S#ßiuÄøY9Ü©çU¹¶:!ñÁ+ßD[~n¸ŽÇìÙ|übžx_;€êƒÔ]x‹ŒIótÿ6–uzõ¢ð@`È:ÐK¤KŠa㢕O{øX͆˜¦ãÙj̪–mê_GWÛq€ƒ Ãyw;juÖ=3*£\q*4]pýÕtÀÌþ>88ÄØ-,¦bIN7.ÚžÚ{d ÖÛ?1íöÍuvñÛ4·Dáãš †d)âULµHöªÚúIv„æ¦zú=ËZá¸j“>U&à—L„?Yå†ßwgD¢a÷yóö̤Í‰í«°HN"Dh}u¥¹81K²‰ôZŠ•#,ÌÒ:@$¹¶”Ýmr`WOù6›P8‹JXô|8Þ1T…¶Ê‡PÉã`6•q3`´…#-£lgõà"fP0ÚÂ]…A¸ØwíÑAy.N¾¥6»mf%®®&’0Æ.3KÇ) ÂÕœÊ5q®ÙIåH•#-ŠX…Jáî:*n謄µŽ§„•/ yÀo#ߣ½Þ%™&‡s©X½*77/²cMž±ÁrÌ{«¯N™Æî’I¨ŸF¼­ÂQÅtâ‹c]K=²üdèúƇèhe3²ßÃŒðwYâ\Û[NDÊn+š•ÇË}´ðÛbÙ¬dÂH:&f#mø«ŽðôÖúDäw~Ý‚S#ùZñÑJíÝmÒvm§ŽÏ;ÿ«é[§Ûëz8Üí É%ä’yxÌÓFñÅ4šÓâ^’¾Ù¨ñÆ"D:]|\gR²ÖÖ“œQ{>TqdL”¨ÆíµO5¶ uwŒÛø'“RéZ:>ì¶–ÊüùŸœúf+¯ŽÒµê)¢º^`Úqqž$®Ýa·wÛ)s¯ÒpPëNw—‘ÝÄý=‰ïÓÒ1„ª:õy^6®aÖ ¥AÍ‚ZæÓ(Ê–Vx˜«­¶®œ§|ʼnt·Doª½žœ.ï>3ÛJto®¯*¨ºÞžöÆz!òüq³Ñ¹¹,3\^ïÁÍL&Æïrï¯îf!y£Åy “/f˜õ¬í_ƒÊW>Ùòäìè±ÊÊÙ^“ñ‹ôõǯ¡£ÇÀ7ïL"YÆaâ/ƒ=_9¹G–0„l–1·ZqFXÎ&F4é’¥ÞbϤÌï¹®¶â#, Q…ë9O":ŽaŒ›e1ЦõSs³ÊØHîÕM Ž\¡D¡¥½eñZèc~$Ì•u%À˽S$éçí£fóqóÊ£`|q‰=űLÁ|ñسØ¡¬PYË*RàíFánáÇ—hDe«¯$¼!ˆ#,Q٦ʆÆ3ƒg#„RcÄnñÝx’b3x0óš˜ñ^xc7ñ§cÁ±t5Õwï]DÒ…Tnh”ןx†i£ÞsÛí¥ÚKÀ%ä1ŒÃ#&§L¤ÍŒ)FþïvÀÌ0>á[dìÁヷ:x:J~ª“ܧ[tÏi ÅzáÔ6-rìÓˆRK‚e·­tªwÞ#,Ãqö…p’$‘0ˆ#ߌCùªõ#&€@>|#-@@Fn6aPŒRÔŽ\øÆŠG3 ·N5Û»·,³ÒÅ#»C¡BÔ³t€Ò¬HçÀÆFî2§V‰]†Å4:`Ã5€¡ \󗹞¸á¿DÊÊ„­¥ÐK™—UomÌ9¼¡²r…U¯¢2 ²H )!(@PR uë¢k/.òqÙhÊ ƛv«·<ÎîBñ¯­Y{§úT#-dáï0™È0¯•*g•œûs‚íÈòÛ.“°q®tÚçQ´ºX~PíÞ}'‹y3´s=QSóÌÇEKJOcË‚~±ÍE¢ªm(Š©©§#~1X©ûmÎ&ˇb²Ùm= ÷.Èà‡µ®½+j 7Žääã£e~ÏB`§8èúÒ^ÓÑ í7*útÚBT<Ö3ÐÂE—ö9£[F÷È7ÏÑp²9–žfª7 ­Zæ0ÙºÞÝCë¡ãÉMkE§m¢HÕ1Ï~e-lZ~ﴪū꣇±C3ÎüKzlѺҬ֢Zds|>òæ-Ìq:f‰ã‹Ø¼¶R±¯£µ“4D>"ˆìtËFvŒ›•Ù¸°ëëÓÏwÃŒ¡e+y³'†j1!ÀTF"ü#&œIċ焑9Tû›èœ ¯[–ãÐÇ4v4n s©¿xöÑÏ+èÝ 2¿…¹ã.nïÅöTÃtè×ã.–ñœ¾m°\¨îfübfM’ߺު|œ17—yöñÁ7”â=Çw‰å›îºî9ßA‘ÑÝÎÒ¶­P®5=ÆTa£çõŸ4)bR»wLÕ#&#æF°Ê‚ž12‚¨†–ay£ ê9䦫Ñdn/) 6wƒ8N arD@b¡¡5‚»`^få™#,õÊÁ¡ÑçÀÐôQ¸úY« Óp8jsåAaᘅ+^vÏõDÚž›ôM¨sÌ,!ܽätâ\°0†w,ÚåÏ‘w¸(aK›2âáîvÙ˜5Ò…ÍpÜnP¿jX,¸Œg ¢(Ô¹\†=;–ʤj®¡PÁ¯E´öq3¤:f,÷Ò­&Á¹äÜ5SEà…”à™5À ØÄ,¸wS:B+¬”ñ˜²NUÈÁÐè¯ Nðì:MWbÂÀ9Η#&×"PxzIÚ_|ñ›MÕÁ$™#&D±ÔÔ#-yü¯æ)רnôVfFE.)ó-ÄB Ö]»ƒpÂ…"Ù÷q-È oaÁÃqÈ‚Bx!¤ò~ À g6{zYm»?‚'qŒbÍû}õé&Ä1ðêCÇÜé<ËÉÛ_î†Bš¥Z.¾åd׿±¾÷#-9qö ǵ9¢zbp&ÁßÎ\Û£î+JY#-šý—#-ÆÆ«ófüÅ/)!F‘%˜|.ó[E„[&‡¡·­'M¶Å¡Æ"Q²Ø”¤cT! Û4L*y Q¦À#²ŒrbCed •P$ˆ)!"±j\ÄFÑVˆDIÀFУBÁ#-1 „f°‡ze"ÈŠv°XÚk¨±Q”4¢¢(˜TQ”©A Œ>„#ã龳ݜßÚuç¹_}¢¥#-ÑÀýþaž^…V¸0¸ù}}´$fúwÂ!}\p¯Mãor.MiU­~E´jÚ-Z)#&#&0Ê@(Ê]¾«T˜ÓåFÙÛû®f÷=ûp1¼$ch{ºNîäÂ"ý[ºÉÉÝ»3ª™o žøÂKÞU×½çÌz—Ó(õÌî`®ðG’B¶×kó„HパH ý÷üÇ_dl;¨Ôƒ×ÆyÐ-GÀ!½è:Õí«îjW¡¹mÙ¶’’®Õ2–­/.¹«ÚºoÕ¼¸(ФWèC\¿ùhk4óèD|¿g#}úWÝéXÇoÀV#-E)#&`#-Á‰ °£HÉŒbc@´J’…ªeX¦–ŲZKjÅ%bJÉ£BŠl¨Ú1 ÚÓR4¤Ù%4¤„•¡6ˆÔJD´d…3EJlŠU4ai&a†Ì"R„“µ‚#-¡þw–§#,<‹ú¦jÕ™î:F¨d)î‹F],þ¹ÞΛÏÂh.µè¹ ?#&¯Öós6~O2HHÎ>D8©ÙÇÆÚìÄ®fïeÊIß.­ –ŒO"¨>Ì€#,¶ƒ¨4Ð^HgqT4“C1¶ÅîÂb[pÝÌ”‚Ù0eô}0~W¦»7?r]ø¢ƒ! ,dˆðåÌÆdMåv[»ãr¦Q„„³ÓÈ7^*¦$ã…ß¼úü}ÚÂúïâsþŒCLª”q Û£/ßQ £~š5b–»ÂÔêSGó+òZ·ßmFª$¶É´DVÄj’Ö4}…«\ÚljP¤ÔhÅlF}»µs*Ë,PªU#íK a]ùï¼EDƒ Ê!GåíȶfÁe0}õ‚Ý=¥Á°gÒ¸”*#°¢Ô4ÌFŸ–]¬h‡Úâìñ¨v¨£ƒ%bš’9IˆŠ-´ÀÕTR ¡wNP+4l- ¡!Z´ƒcÄæZ’Æ‚±bLAuô1WŽ›Ýywn„œ×·^fŒe5Ù·´¯)7‹š%fVå¹çãè陨(à]†0€Vâðï!”`ŠÐ¡GLŒŠÄˆÄ½—cçÞ×ò Ôi>n&}ˆNLêbàlËH• N˜¢ÄÁÁ–¬‚ÉL%EAÅI#-QçR™ÂìÀl@ÍÛ6#­z¼mæäb•HdX|Hh[Ð!Æ"s˜HBbñõ„87V@ŒÜÔ‘µ¶‹ ØÛ[µ¤A"Àpä#-K†Hä[Í’D’I#UŒTCÛæù09€&š&A”®:7´ô¬$#&#-õ÷6SÔýøß Žâ€û~ø3ááÌzàgüiQ=2†Ìë½Y¿ß‹û_Í‘2u…„®ª¶o£ÐXÜcàŽ”H#,U›îX.1ÐÒ$SÈ©©*L$až5$»¨íî#,uø"}@ÁéÓ‰[ ‘“˜KÚ‹CÇåËÃô¼%W¥ÊbUÛÃ.³òðñÆUo¿[52UQJ–m¯ZÔÆÊJ#-}Ëñ*G[õ&¦¥„u ÒsjÛD½‚Ø EtÉ£Êz#-,„ˆ2{þ“†œú­öù®Ç¯å&õÚÕM&C>²·z”¹ˆDñJd‚U#-œS^¤ÿ3bžf#,‡Ö ÷< ;Ý¡oû$ ”š3ОΰS–1àQ©¯#-±çˆÐpÂl"еû¾“ÝØ:Õ&£“ÃͶ#&Q-ᄇ¼ëŠ@dˆ²Hˆˆ*¦#,>èô/}RŽâb_cõÖì[ âGÌùX|p”Âß«ñþWµÄÓœÎ4“Á.±Ó\?‹îšëÁߪ–B«¦‹ d†mn®3’t€‡btk?4¦ ÂjVwú`\Êw²snÚ#& §.¶Å »Ú“‹ÞPH%óŠºK<ì¥+Ö"VG¡NhŠ\þwÁÎc¯šR3¦BÁ¹‘mݽšÉb2Fˆ[œ¥BHÙ#-ßyp®îÒ-®áaŸl"RØC¨Š«¢&é‰Ê¼ñ©ž‚£f†F˜Â^¡#- (F@n™‘0pP#,@ŸÌnªÁ`È%þ¨Q¡š‡Ì»2 É–vÜ‹wª.ÍH`T54³ŠF¥"DÝ#,䑲Ú²ñ`Li IeœsÀFîÃPŒÙyš@ÂËÒp8€e¨ÏêFfÇ¥›m…#,bæZ¤Rª2¨Vų†þdz®D²u¾˜ai†É»Zô²ÎIÉ!ºM‚kʈŠ"¡µJ‘ƒcÐý¦f™3T#€†û±ÍZEyHûsÎÖζ3¡%D—2ayiQé¬Ô#-F*^)š#-@`^îãP‘#%…ß#,¸éÛ“ÇPºïRŽŒ4ÀMŽ[ÓPíf©ÐÈ! ˆ,‹Ô2ox¯.õëÆûsÊäõƒ$_'YúfáÚL#-FïpaÈL‹ äÞjuÌÄ´‘Q29&e±³ý¢r¶Ûˆ–ΪfWLnL¦gNƒà,8$¼µ·aIŽIóð#,ù%ƒºN µtJ(7f¶)ädÓÁâú'£Ï§cH8¹È4A©#-H2#&ë¸ïšµ ‹#&Ѥ½ X#-ÉŠH žÊÄ™Ž-¹š5@·Iå¥lgÆë Ô¬Çüu^nÝ­Šœfóõ¼ÑíÊÊøi™BL¹Çg{ÓyÌ«‰4yEŒ÷ÌGYÙ¬<«²#-Þ@a>—FÇMl}yï8‰pÁ›ñÇLÚw¶cHo!Ù G©µaÇ޾d™ƒ6³³B¯iè1@'JkMžn§Æ£6™‰ØJLí¶ÛK1r=I tW:Š1–”•¾cvLª4f\±ÖzmÃdɽ>ñ¡9²ä˜ŽY˜v8”×´†“J{åÆƒ +UÓb6A:NÍe;m±µÓK¹L#Î`%¢l¦‰Ä–;&v—.]=êË­Ÿ¶Ú`Û˜¶o1‘šg!­äkýnØ]¦6·í'65*·Nà„æã®;D‹uƒŽÑ[[›âiŠ¡÷xèdÅ4Z›;»ÈûG3*ÈÌœ˜gRÙ£ žªq5ƒí;u‚¬ãßÑqæUïMbšæ]8š\îÄá®›Á>¸€å^.dÜM"zNÚ•®:N¤0-0†¬¼!eÊåqë­k¾ön,Bãí9©HfJ*8±ÀÓ‘ïÍTC‘oȵµæ#-Íø§•»;]³½À÷½uÎQÈ«¡É®“H@±XŠj7f$m“6CŠÈÐÛ™çÓZ¼º`iRâæu³ƒŽ`ÖÌŠúÐoPÝ8˜Ëƒ†ý é়Úb$#gäøÊŽïÊËE¤xC`áB!"qIµH.ZKU‚cf(i®»@;MX#-ÄRP…F#&'xX§5¡‹Su …p/M`ƒòct´‘tWI„œùß#-;γYä¶ m›Zv5O(i£:И×Û#&ßQ3d ;ž‚㌱§4ü lÔ?nŠMÖÏB€fŠ$ÕY'¿BÐòv7´Ú.mùÒî¿8Ù¨—KFÖpÖçAu3i"OÊÿ_ºQm—2àé²)r×–&šOËÏ'+o+ ’ÉBL6kãS»ºŽ€4ëàëW×zÀ†fº‚ÊϳWM¨}1)ïÙD˳çQ³ÊÙe<#Z¨›úqä™8^ï³=¦·Þm]æû‹e…Õ’“Z‚°bSü·Öûæ Ö¸òÔ0+ÅɱúsWííº4š‰‚ŒDÚ] «°ÑN С0'¹ëß;ôÑlïêÎñôö¾u®Š•!“y‹ß¹Ú´a"qBJéJ¡iÛŽ$4Ë;d­Vòž*€˜i¦‘F¢a÷âðc°š-9‚‡hvX˜›jš,²àOLC[|*d#-¹‚]ΫdgìF¥DL!ÓÁS»&À, zx)òfGNNZº"¹zB÷.­C@@™ûGn¯($Îõ,T³°ã ÷uÜÎ4› ¤ýИpë{vM4ßœ–ÝŒf`&…5iÊíS"Â[eÚ³#,|´~H[hßÎÉŒ2 #,›"GªÁzÑ›QH‘Bk sC­Ð.Pngt‘‰‰™údŽd‘A¶¢„HúfHà‹Â‚Œ4EqT¡ªk&§xýÛ3ÅåÅ­³¦q#]q; Ѳ_=Áˆ#,œi6¹‡Y‚6#,ÃaKb ÐA‚A#,Í w5aZ¦„×¼Ì!pÈJ% ‚#&Ä#,»ÆMd4œ#,–h¤Eu] 1¦Ì,¹4m´¢¼†¬lÌËQ(ÁÀ¥…Ssa ˆ\0H J”!JÁÏmLªã¢á x£(в ØŠ)áÏ;èfÅÂ6#- §sf`#I¦öDL;%#,øò«#$#V‘UÓm@4¡A`—.;#&³#a„ÜÑU¢V B ,5p‘l¯hˆ˜ŽÆr¡˜4Eçœ:ëüÈ´ê`ˆG!›¡,J*¹Ä$*.©™P°¸Âq™¡0È`3´ÑQH¤Xˆ"O¸ž^}'ØcÚÚÇ(ÕP2Š*",5é£Ãœ!¼9l|<ì%†¡Ÿ»´@¡ª"Â$$Ø*¡PE„]ß#&ÜÕs#&HË¡^ÜT. j!µ™A^¨ðÈýž#,cUÃí5¼–…jÑõ1Áq±•n ·s,½†òñ¨âÙàm&-£™×B¸kNÌ?  ndfh&ü[:XdǵQK—`ðfĶwþ4U?gÓñ@ßæHƒ'ò$9±M\MB¾• "€UéJvfIMìÐN¬:ØÃ]¬ÑóÛ½4ÉÀx4ªá*$îJŒÈï.T‰Ã•ÀÊ#-DÈÒ*µAøÙdšcº ìÉO)ZE÷ÈšdÉç£ÅÛ“ÕZhõìîxgîsJêF9ÌTÍ@Z¿PTV(/!Se÷êªÖè+ÐämÎüÃnhûÞ÷=ÖqºÎ6b(².nô¼‘¾ú¼¡â“ìì¯òGÖ(‰OuqâüO©N£ž\$L«3¥õÛô>#&l üÑuß“—Cã¦KÌ )ðZU|Q¾Nݶ>âò¼ë4º$‰Á@˜vùEåâÔRònà;T­^¥®6õkµêðåÝ­æ’$ÅXÐ9dª‘#,´˜ØJL±&:A„q²–HR Žá€ª¦Pn$jÍ!‚ÐᤠF‡áI™#&@÷Ã>±gvCt§¦”kœÞ3¯†Z°ÅsWˆÑ«—m#-ÎBì’O‰´žœ$ˆàhá==³¹÷wù„>0ljá®ÍâÒZBw¤!Ûà@¹¡êÄKÔüƒ7E%3z1IõÝ­´bxF 1:HñÜÃY™ ЫCEbWd‰ˆd¦áô°2ÜTÍ¡Éh¢N®"Po(OW@›æràÈ)½ŽÔx2ÓÁîŽòIãc$ÊQÆH3mIº,¤ŸF’/êùMï!®‚'>¿‰4J¨XyŠÖ,äX‚[²Ã#-œ—œš›o–céÎÍ£˜û2”Ê­‘K1#-…æ#âá¾ÔÔü™S2mÊ2nå†á∂œa:R"Ÿ`ÓÔ‚˜êÛ»šîI{p®hm9Rèᦱô\mð`Ág(™çðçÑ5›†›#&×Wå“i²±db±'µ(ö™»/ø øQƒWÐ>P¦$÷Å;Qa­~u¶íj)(µ›ZÒ•©¾ÇRm“[dÚµ½ˆ‹-Ø‹.4#-!r#iQö1`  Ù"- †#- ,‰°ê€Ðžü½9QHR¤.™·€{€DÐÛã•nï5`q‰ÓK›Ý±YƒaD B[ßËÇâù‡SíSUV,oÇ3@ý¢Á‚€H#&"¤Š³»å–ýÿ1SË•5ó¾‘ÆÝ½A¸]%2ë°ÔnŒÜžlTu<°ëÇòINTÝµŽš!(¡Âp 0dY c"f0«M…d¹Uh¢H£¨‘26âi‰È1(㊰#l†KA(Á˜“³M×jÅæZå©æí­¶'%:ÎÝC,Ìë 5*;1’™ õ,-"m¹‘f™¥­?2‚wrÖô=\ž¤² ‹š³éáû϶£¨hÌ䛓Jáµ,‚0ïJ2öP‡û§J•[›ŒÅbŽž¡ëäÐÇA·qžer@1@!wN[r#,ä/MH]ó(üZ–|Uo¡kˆÑu!"€£­B˜JŠ12É#-§–ÀÈG…ªCvª­Né°Äp#&âЕJ!E$ù~=4|É1ãkh Wä§Å˜~W¨b¼HtK^2­æBŒÚihQ¥&•#-‹C8Ùj£Q+ÄW]è€XâPÄ@) /#-›Ʋ'í¸1ˆH£MZí´Bðޱi•Yóö턈"l>Ø( P€A¦š µ c=ð†Í„½ý„.I~#,«?b}§¨ïWá½#²zÅËËÕè4Ökh¦m&¤––Zc’R‚ªØµ˜›BlH¢¦´ÅV“oÜh­\Œ¨”IDbÅ(w¼#,ÓÍ=qÅŠ®y³¿b6#-!Äðêœ<æ®c¢Þ}(hnõöu¨®~bv¹îç‡#&›`’,€¹³ê#dõà_]AÛ´o䀞åNá=çÂꉑæKÅŸF{:¡$‡Q×ëòãÎ-ï·oÏl>Ç{ÃGÂc.x"[RÒõÄß>úm¢½u9#,6 R–Új‡F0ìî$‘Hƒqç|5#&ÃStÒtÜPdjÊW.ä±>´DÙA«…\äAèÒé¬a¶!ò;¼í±`Ë*à£i®yËã`z[·lMÐu€l´‚“BJBàÔ¶ÎDQˆkÊz%p"µbVúÞõ¶Rá¶§fˆÜ€¤#&lUª4«‚%*Aèƒ}£‚§ëØðwú¢§ÅPõÀŒˆ@a'xZÔàÃj´e2²,ƒ›±Q­ÿ‰ZÐÁbÌZ­aÃi~‚Àgïf¶LeŒ‹ìeaN×—#-¤± Àv÷zÞ°l–|#-æ³Ã©#-P]ÿR‚]PGö¨,‰B#ÞCÇ™„ëù:º±|—L¯#-‰Ð6‰ä$`D`C¨bæ( ÅSsÕ—KÇDøúJ#-óæpõÀ¼IÅ@í†E¦ç° FqY¢™D¯³£Ùä#,ü2†" €Òˆä2t#-ž!o~ñ•ááBÒTA-R$ÊEÂ@<×6B%B„°‚ZÊd·½ÃóŸyFï£áõøqžê¬Î”}k.+ùý™#&½â{€';wßþr.OY*4OϵS€ªr3€0.=ô–l×Äÿ=#,næ9¯¨-÷”T<¸ÐÕÚ@ÌvEw‚÷P\¹xynBÎ  ±UXÌfG‹¨ØˆÑ¤Ëºº #,‘¦WϼÃô÷mr®ns×›Ï=wÎ&QMÔQED¼›¹®^E“chÛx¹®[ˆcÝÛżò»JÒTlÂ/ê„"Td!Úª~ÔŠm ‘§.?ŸÜzû((ªü#-ü>–{L˜¸üƒÔZÍS è4ú¯¤õ(;C¯¬$#&!$F*ÆAŠ1R]GÈÞ=ˆ!—Y Ä´ØÈTT¤lmHÒÊJ¦Í«êü‘¨ßcUû›æi!Šš¢¨ÚSLÆÛ_~ÔíRö·~ÜÛÓRjÑ?¶–¶žÁŽEÑ…Ôò"6Ý-oŸ"[ëÏÊ¢¯„¯Znë›"›ÂÖjÅ6db±•Š™E²Á‰ëÎñ¶ÒkT(@Š'e(Š^#-4{rDMçóþ «ÕÞO{éùfaÙ‘$ñWÄ ›6£'¼}'ŸËmL}y•5¹ #-ý›n³ƒèdż;D| î#,pP3œÐ\ó˜ÈIÄõ*z3{¨ªò·å{Ø,E Œ„ƒÁ¦|Çû·B âfçšL ä*`,F)`7Ô‡HqîáóÀR@Âö­Sb„Ó#,"aêOzµBAz…*)Nci«AD‰A%SRkTÛRiIª[NÓ–ê÷ÔÙ#"€ÜնͤÀ ƒý™HjD¡X¥Âò¥>*ȰöÚ̲÷je×í8÷Uíg·Ã;ŠAðÕž7F¯ÄÁœ·-f`&âcÄ´LüÔ-ž©hëm!ÏÊ„âGKõ1¡æÁ6›DV€ç«Ú [éy,`ÿÕrÞÐéÒ^¼#cÕIsb>d˜2‡Üš…ÂÇÁ~„=_ƯùÀƒÍ]R|nɢإ4Ä©6F¢–Æ*LˆÚ¤ÛaKFýfÛêjñ6+EI¦QU‘D“¿¸õèöYÙ,ÒB6ÀP¨LŒ!êSB®ñ › ,a¡R4Š12aG¦Šhšwl #&%!Ãb©òŸdsà»¶ËÁßwUH(ÿp‘ ŵ¶ƒjPÕ¬ØE„P ,`ˆO°”yœ1Óש¿ÍÛÛJ¬²R@þS_v?c>¨Ph‡ûU¦#ëŒ1KŠL5VÊå˜F¸SPÝ×ʃ_ “ìðI‘VÚ#-ÒŽÙü/D²ÙÛ3"‹ *bc<êÖ†ÓÃý:0;Mk襻EwUÓxë|–ë4šš)RÞ³a]´îË]Ý•ã^o+]Sh²kzUÉQo7u™»3*ºæí¨«¨$¶E›W—v4Ñ6»º»ºÚM•$#,1±ƒI´+ *†‹+ TáJ°ÁÀ¤Dj1Q±ª4!¦Ø^›×—j”ÒÙMI–UéZêÞuuçj¼lm(ÊfÛ-”µçw-ÚîÝXÊÙt×H©NK7LŽÞ ª-P¦¾´ØCH`&ÍOà5ãUY¡t¤X²nq|(È["£A2Adc€U )ñÉPÆÖEé2–Ñš)CóI”`ÛaUí£ ß9Í$—F Qâ¶Jì°hm: Yé¦ %ÈîEÛûÜ¿Šâ…ÃìEÄE{†yü·‡Ù˜z1èXÏo»†Ó7°ÎtÁJ”Û:£XØîÞ[‰q!në|ôô>ߨZdbLz‘45U*qv¾“³;ż#-k4ÓLQŒ-õñ30õÈS°ÃïÛÊ ÉQÅrŠFq/ ƒ}z“ÅË_¶öI0t†L;¨`MI4qïÌÆÕdEÝ÷,?³)%ý¤tf†»¯ÞFµ}Ÿ9+.ë¥Ié­ìcòE±ƒ(\AçB†RÕ!®*F<¿Hrg´š¼={h_sH>CZ­"5¡f•ï*v>&¡œ(€|ìkÐæRk~£eèdI\0IÓ_ÿ¥¤»4Ø%Ÿ³Dä·Š§ó–fŽǃ—Gí>iDâÌ ç7(6ÈÖ˜µc©$ÁVÄ/Yí!Ä4¶´^á±4=ÉÚ&ä@ÑÕ„A.|#BðMÙ,ϧ¾q¯Hr,_#-ºBà"‘1A&Sh É`Â…(DTr¹ –ÿ¨á>@?Â1‡âqŠâ´½ƒƒbNØ»§V eÎ5A1ü~.`µ¤><îË/)‰ca°Ó¡«©—ƒƒÌé67@¿ß@”KÆ¡Ä éüËœ#‰1慨Üï{´È6R1Ã'ðd¹j"*í¨²v+åV¶ómA´âƒKûÐmc°‹È4•ÒˆŽ/R6ãt[F¡Wo<ÅG~êŒn#,lpâ#,0(ßs¹Ÿ‰|ºv\àvD#DF)äì§X…·eˆ¡Þ–E%2‹D ×# Hî{Ør×c3ƒ8?Ç26A€(6>ó&ýÜVÚŸ‰ê!G‘Œx$å`‘ï5/¸^‡YÈzȆAÁð…œÎóÏá¡‘ƒ™YÖu{p+qî†äge¿'¿ï÷ÛO0ÓfÈŸuÀÉTI÷b!hAAübgñÈ &™P[×Jˆå4†ñ#-B=3'Ì…¶Þ}ðÁH V•s¼ï‡_¨mß·cÈøÖµ3’Ffl2f`Wýp#&úèÿñÿü=Ÿîÿ‡ÓùÛÿjÿîÿgõÿkýÿëâÿüú¿þïùßûüZ¿7·éÿf£äÿd÷‡³ý×ÿ·åÿw‡ÿÌGûÿÝþ¯øÿ‡ýßûÿáþÿù|¿ìÿýÿ‡ü7aûÿãÿ/ùz=?þ ÿ.¿¯ôý‘ý#-€è§ý11 ÿˆþ¬Ï·ýçöŠd‚e<°Lƒ2®ßþ"œTäEÃYsÅþáL@­r½Uý <^õ¿ªüa#,‹÷½E»Ïê¯âÏì;ÝD’™™óÖù[(^Í ”GLùä$»=š‚ðÓh£ñ4(³#-k1eƒû¬ðã{…e´ÙÆäÈtÜP\Öà-ºžA¾Ü{?ÐSÕ“ýDpÎ<Šð’ H!ЯلÓÌÌ °ºG‘4%*ãþ}•Êlñ´§ú%ÿ’2¹~ ?¿»Íñä{Ú‡K¶=>(|øŒ^e[WŸ÷¡¹£B‚‹Öä†&ˆ–uññÿÃW-Êx6ànc~4¿÷Öë(Âtù–´Ç1Ò·Yä­™ŸÕ˰0#,íJš’!¿Á‘¯žë4ÆÆ·f‚Ghl´€èyôJ˜1†?ŸŠeTóhÞ¶ñ_Zi/ì`Mâ¡#&ѺhWµ—R Ke±‚TK,>-<Ù”Þ¨v ã¯¤ññǶnM4@·ØåPf¢£¬9x³®öµ¦†Ð þ}x—F÷$$0™­Co«Ï«ÁV-9¼R6wsC[$lðë çÆxɽMõ¨ìÙU:rqšf´Øå».Xl¡\TÌXH;Ä’,‘ˆÅ®{bò#&c.4£’Ã7æf}úaá”ëÚSVõ®åúðn먌ëN‘±£\-˜ÑNàRØ«"urÓ_L§ ½Çûˆßì h3‡¢/Q”†$ò8îú0±Û£Yª˜®ô—0Nˆ ±1óx"&ÁŸFîà²*å.2P= #,‹¨A<Äfa’Q\nSß§nxÝq£sz…Œì™ E`ª®(‚¡~ºp¸¦cá»a˜ÌÊ2 ³s¾\6¹‰¤U¡ˆ >"È!<ŽÑ(¿]¥’U€Á‰ * §¡Ù:/^%¸J1°æ—Ö0üߎ\Ffqÿí‹Ý¤ÐÌ/×`铼ËûdˆÁBLsÙJ†ö ¡ÃCioªØ'T!#&¨ÔHD¶”‰Bñ¸š‰CPmk4¦khÚ²UšH˜°¢2*kçvÕÛU_ èDéCËGé>$S8ûˆ‡ü û*¥¨«y‚Á-‹'CÛ( ¸”Ô‘ˆ¡ðëú@‡££õö$a¤ç-è·Ók‰óvl0hgcþÖ53ŸxýÍznUSˆ¢1û«ÇÏ«£¯ýCy6Ä+E×I扄8uîKºƒxvtÿÝ¿º†Ù÷ Ï8íΘä\ñ÷ÊO¦ôW}*¾’Zñ#&8Ç 9éS¦úêfW+¡ûû·ÛÜF‰IÍ2›â®´`eãLßg…@6ÍGa!÷1a¨„û.(÷«8hod\BE¸’¼e¯ž›Óâl¶Œ¥)½“|÷Ǿ•hÑo‹mõ›²Æ¼V’#,o´×1±hø6ÜÚÆ+ÆÛzQ«ÙjÞ¦‹Tš6‚Õ{æµÀMVùhVƒuÙÜ,•Xz<‚iLŒ“åÿQ Ã+*r’ €7™:…;]]Ö.x ·T,„2*wrä.1ä&ƸUpX±û%IG0 õ¿ûLjz¯Ýu^4$‹ 3xæ)_ö~Ùßáö²NR;ÑÕ÷sÏ™Fÿ#&®J‘úv#-úb2(±b¹ÜŽó¿Th’…*lÖÖKjfk¦·V®ËWÒ±6jMz¾V¿,Š6ŠÒ–Ö÷ÃÝðøæz>À?ëûTÖ)£Ã«ÕÕ<|¥tË.feò²Ó÷½g0@Âfóx÷°ü[*xþoÄ?GÇÿàÄOÿ]ÿ¢&Ìm=D’EOýÞ@P‹_ö͸s]9ÿœªOþ?ør(öƒâ!ˆ ”'¿ÿ›cÿ°-éþ}·ót‹uøxCä.ÃO ʽQˉ:]×Oxïî…=žg'¼'ÊB=“ÊYáù¾ÿ·ÒyÉå™Õäúkÿßsóô¿û  ~¨ýдq„ÃþÝ.øŸ¦^#&g#&£ôbÏfNÏúô«{›iÕ‹LQXá=|û~Ó_Oæ.ªÏè»_þ^B_Fœ+? N#,þú”ò¢Öp:WoŠ¢)œ|µ\.2Î`ÔþGøùí:vÑ: ¬¬~¼å‰¼#pÅå°–7áá'ו´æ /ÇåÃ0rV&HK}+^Fö\"‰P½{õGl¶BZ†!?ݾgÃ_§þZÈñ)è£91Co©lµV1û>açZºŸíªzǼ\!ìú>€ OÿâîH§#- µÀ` -#<== diff --git a/waf-tools/boost.py b/waf-tools/boost.py deleted file mode 100644 index 1ecf233a0..000000000 --- a/waf-tools/boost.py +++ /dev/null @@ -1,413 +0,0 @@ -#!/usr/bin/env python3 -# encoding: utf-8 -# -# partially based on boost.py written by Gernot Vormayr -# written by Ruediger Sonderfeld , 2008 -# modified by Bjoern Michaelsen, 2008 -# modified by Luca Fossati, 2008 -# rewritten for waf 1.5.1, Thomas Nagy, 2008 -# rewritten for waf 1.6.2, Sylvain Rouquette, 2011 - -''' - -This is an extra tool, not bundled with the default waf binary. -To add the boost tool to the waf file: -$ ./waf-light --tools=compat15,boost - or, if you have waf >= 1.6.2 -$ ./waf update --files=boost - -When using this tool, the wscript will look like: - - def options(opt): - opt.load('compiler_cxx boost') - - def configure(conf): - conf.load('compiler_cxx boost') - conf.check_boost(lib='system filesystem') - - def build(bld): - bld(source='main.cpp', target='app', use='BOOST') - -Options are generated, in order to specify the location of boost includes/libraries. -The `check_boost` configuration function allows to specify the used boost libraries. -It can also provide default arguments to the --boost-mt command-line arguments. -Everything will be packaged together in a BOOST component that you can use. - -When using MSVC, a lot of compilation flags need to match your BOOST build configuration: - - you may have to add /EHsc to your CXXFLAGS or define boost::throw_exception if BOOST_NO_EXCEPTIONS is defined. - Errors: C4530 - - boost libraries will try to be smart and use the (pretty but often not useful) auto-linking feature of MSVC - So before calling `conf.check_boost` you might want to disabling by adding - conf.env.DEFINES_BOOST += ['BOOST_ALL_NO_LIB'] - Errors: - - boost might also be compiled with /MT, which links the runtime statically. - If you have problems with redefined symbols, - self.env['DEFINES_%s' % var] += ['BOOST_ALL_NO_LIB'] - self.env['CXXFLAGS_%s' % var] += ['/MD', '/EHsc'] -Passing `--boost-linkage_autodetect` might help ensuring having a correct linkage in some basic cases. - -''' - -import sys -import re -from waflib import Utils, Logs, Errors -from waflib.Configure import conf -from waflib.TaskGen import feature, after_method - -BOOST_LIBS = ['/usr/lib/x86_64-linux-gnu', '/usr/lib/i386-linux-gnu', '/usr/lib', '/usr/local/lib', '/opt/local/lib', '/sw/lib', '/lib'] -BOOST_INCLUDES = ['/usr/include', '/usr/local/include', '/opt/local/include', '/sw/include'] -BOOST_VERSION_FILE = 'boost/version.hpp' -BOOST_VERSION_CODE = ''' -#include -#include -int main() { std::cout << BOOST_LIB_VERSION << std::endl; } -''' - -BOOST_ERROR_CODE = ''' -#include -int main() { boost::system::error_code c; } -''' - -BOOST_THREAD_CODE = ''' -#include -int main() { boost::thread t; } -''' - -# toolsets from {boost_dir}/tools/build/v2/tools/common.jam -PLATFORM = Utils.unversioned_sys_platform() -detect_intel = lambda env: (PLATFORM == 'win32') and 'iw' or 'il' -detect_clang = lambda env: (PLATFORM == 'darwin') and 'clang-darwin' or 'clang' -detect_mingw = lambda env: (re.search('MinGW', env.CXX[0])) and 'mgw' or 'gcc' -BOOST_TOOLSETS = { - 'borland': 'bcb', - 'clang': detect_clang, - 'como': 'como', - 'cw': 'cw', - 'darwin': 'xgcc', - 'edg': 'edg', - 'g++': detect_mingw, - 'gcc': detect_mingw, - 'icpc': detect_intel, - 'intel': detect_intel, - 'kcc': 'kcc', - 'kylix': 'bck', - 'mipspro': 'mp', - 'mingw': 'mgw', - 'msvc': 'vc', - 'qcc': 'qcc', - 'sun': 'sw', - 'sunc++': 'sw', - 'tru64cxx': 'tru', - 'vacpp': 'xlc' -} - - -def options(opt): - opt.add_option('--boost-includes', type='string', - default='', dest='boost_includes', - help='''path to the boost includes root (~boost root) - e.g. /path/to/boost_1_47_0''') - opt.add_option('--boost-libs', type='string', - default='', dest='boost_libs', - help='''path to the directory where the boost libs are - e.g. /path/to/boost_1_47_0/stage/lib''') - opt.add_option('--boost-mt', action='store_true', - default=False, dest='boost_mt', - help='select multi-threaded libraries') - opt.add_option('--boost-abi', type='string', default='', dest='boost_abi', - help='''select libraries with tags (gd for debug, static is automatically added), - see doc Boost, Getting Started, chapter 6.1''') - opt.add_option('--boost-linkage_autodetect', action="store_true", dest='boost_linkage_autodetect', - help="auto-detect boost linkage options (don't get used to it / might break other stuff)") - opt.add_option('--boost-toolset', type='string', - default='', dest='boost_toolset', - help='force a toolset e.g. msvc, vc90, \ - gcc, mingw, mgw45 (default: auto)') - py_version = '%d%d' % (sys.version_info[0], sys.version_info[1]) - opt.add_option('--boost-python', type='string', - default=py_version, dest='boost_python', - help='select the lib python with this version \ - (default: %s)' % py_version) - - -@conf -def __boost_get_version_file(self, d): - if not d: - return None - dnode = self.root.find_dir(d) - if dnode: - return dnode.find_node(BOOST_VERSION_FILE) - return None - -@conf -def boost_get_version(self, d): - """silently retrieve the boost version number""" - node = self.__boost_get_version_file(d) - if node: - try: - txt = node.read() - except EnvironmentError: - Logs.error("Could not read the file %r" % node.abspath()) - else: - re_but = re.compile('^#define\\s+BOOST_LIB_VERSION\\s+"(.*)"', re.M) - m = re_but.search(txt) - if m: - return m.group(1) - return self.check_cxx(fragment=BOOST_VERSION_CODE, includes=[d], execute=True, define_ret=True) - -@conf -def boost_get_includes(self, *k, **kw): - includes = k and k[0] or kw.get('includes', None) - if includes and self.__boost_get_version_file(includes): - return includes - for d in self.environ.get('INCLUDE', '').split(';') + BOOST_INCLUDES: - if self.__boost_get_version_file(d): - return d - if includes: - self.end_msg('headers not found in %s' % includes) - self.fatal('The configuration failed') - else: - self.end_msg('headers not found, please provide a --boost-includes argument (see help)') - self.fatal('The configuration failed') - - -@conf -def boost_get_toolset(self, cc): - toolset = cc - if not cc: - build_platform = Utils.unversioned_sys_platform() - if build_platform in BOOST_TOOLSETS: - cc = build_platform - else: - cc = self.env.CXX_NAME - if cc in BOOST_TOOLSETS: - toolset = BOOST_TOOLSETS[cc] - return isinstance(toolset, str) and toolset or toolset(self.env) - - -@conf -def __boost_get_libs_path(self, *k, **kw): - ''' return the lib path and all the files in it ''' - if 'files' in kw: - return self.root.find_dir('.'), Utils.to_list(kw['files']) - libs = k and k[0] or kw.get('libs', None) - if libs: - path = self.root.find_dir(libs) - files = path.ant_glob('*boost_*') - if not libs or not files: - for d in self.environ.get('LIB', '').split(';') + BOOST_LIBS: - if not d: - continue - path = self.root.find_dir(d) - if path: - files = path.ant_glob('*boost_*') - if files: - break - path = self.root.find_dir(d + '64') - if path: - files = path.ant_glob('*boost_*') - if files: - break - if not path: - if libs: - self.end_msg('libs not found in %s' % libs) - else: - self.end_msg('libs not found, please provide a --boost-libs argument (see help)') - if kw.get('required', True): - self.fatal('The configuration failed') - - self.to_log('Found the boost path in %r with the libraries:' % path) - for x in files: - self.to_log(' %r' % x) - return path, files - -@conf -def boost_get_libs(self, *k, **kw): - ''' - return the lib path and the required libs - according to the parameters - ''' - path, files = self.__boost_get_libs_path(**kw) - files = sorted(files, key=lambda f: (len(f.name), f.name), reverse=True) - toolset = self.boost_get_toolset(kw.get('toolset', '')) - toolset_pat = '(-%s[0-9]{0,3})' % toolset - version = '-%s' % self.env.BOOST_VERSION - - def find_lib(re_lib, files): - for file in files: - if re_lib.search(file.name): - self.to_log('Found boost lib %s' % file) - return file - return None - - def format_lib_name(name): - if name.startswith('lib') and self.env.CC_NAME != 'msvc': - name = name[3:] - return name[:name.rfind('.')] - - def match_libs(lib_names, is_static): - libs = [] - lib_names = Utils.to_list(lib_names) - if not lib_names: - return libs - t = [] - if kw.get('mt', False): - t.append('-mt') - if kw.get('abi', None): - t.append('%s%s' % (is_static and '-s' or '-', kw['abi'])) - elif is_static: - t.append('-s') - tags_pat = t and ''.join(t) or '' - ext = is_static and self.env.cxxstlib_PATTERN or self.env.cxxshlib_PATTERN - ext = ext.partition('%s')[2] # remove '%s' or 'lib%s' from PATTERN - - for lib in lib_names: - if lib == 'python': - # for instance, with python='27', - # accepts '-py27', '-py2', '27' and '2' - # but will reject '-py3', '-py26', '26' and '3' - tags = '({0})?((-py{2})|(-py{1}(?=[^0-9]))|({2})|({1}(?=[^0-9]))|(?=[^0-9])(?!-py))'.format(tags_pat, kw['python'][0], kw['python']) - else: - tags = tags_pat - # Trying libraries, from most strict match to least one - for pattern in ['boost_%s%s%s%s%s$' % (lib, toolset_pat, tags, version, ext), - 'boost_%s%s%s%s$' % (lib, tags, version, ext), - # Give up trying to find the right version - 'boost_%s%s%s%s$' % (lib, toolset_pat, tags, ext), - 'boost_%s%s%s$' % (lib, tags, ext), - 'boost_%s%s$' % (lib, ext), - 'boost_%s' % lib]: - self.to_log('Trying pattern %s' % pattern) - file = find_lib(re.compile(pattern), files) - if file: - libs.append(format_lib_name(file.name)) - break - else: - self.to_log('Failed looking for boost lib %s' % lib) - if kw.get('required', True): - self.end_msg('lib %s not found in %s' % (lib, path.abspath())) - self.fatal('The configuration failed') - return libs - - return path.abspath(), match_libs(kw.get('lib', None), False), match_libs(kw.get('stlib', None), True) - - -@conf -def check_boost(self, *k, **kw): - """ - Initialize boost libraries to be used. - - Keywords: you can pass the same parameters as with the command line (without "--boost-"). - Note that the command line has the priority, and should preferably be used. - """ - if not self.env['CXX']: - self.fatal('load a c++ compiler first, conf.load("compiler_cxx")') - - params = { - 'lib': k and k[0] or kw.get('lib', None), - 'stlib': kw.get('stlib', None), - 'required': kw.get('required', True) - } - for key, value in self.options.__dict__.items(): - if not key.startswith('boost_'): - continue - key = key[len('boost_'):] - params[key] = value and value or kw.get(key, '') - - var = kw.get('uselib_store', 'BOOST') - - self.start_msg('Checking boost includes') - self.env['INCLUDES_%s' % var] = inc = self.boost_get_includes(**params) - self.env.BOOST_VERSION = self.boost_get_version(inc) - self.end_msg(self.env.BOOST_VERSION + ' ' + inc) - if Logs.verbose: - Logs.pprint('CYAN', ' path : %s' % self.env['INCLUDES_%s' % var]) - - if not params['lib'] and not params['stlib']: - return - if 'static' in kw or 'static' in params: - Logs.warn('boost: static parameter is deprecated, use stlib instead.') - self.start_msg('Checking boost libs') - path, libs, stlibs = self.boost_get_libs(**params) - self.env['LIBPATH_%s' % var] = [path] - self.env['STLIBPATH_%s' % var] = [path] - self.env['LIB_%s' % var] = libs - self.env['STLIB_%s' % var] = stlibs - self.end_msg('ok' + ' ' + path) - if Logs.verbose: - Logs.pprint('CYAN', ' path : %s' % path) - Logs.pprint('CYAN', ' shared libs : %s' % libs) - Logs.pprint('CYAN', ' static libs : %s' % stlibs) - - - def try_link(): - if (params['lib'] and 'system' in params['lib']) or \ - params['stlib'] and 'system' in params['stlib']: - self.check_cxx(fragment=BOOST_ERROR_CODE, use=var, execute=False) - if (params['lib'] and 'thread' in params['lib']) or \ - params['stlib'] and 'thread' in params['stlib']: - self.check_cxx(fragment=BOOST_THREAD_CODE, use=var, execute=False) - - if params.get('linkage_autodetect', False): - self.start_msg("Attempting to detect boost linkage flags") - toolset = self.boost_get_toolset(kw.get('toolset', '')) - if toolset in ('vc',): - # disable auto-linking feature, causing error LNK1181 - # because the code wants to be linked against - self.env['DEFINES_%s' % var] += ['BOOST_ALL_NO_LIB'] - - # if no dlls are present, we guess the .lib files are not stubs - has_dlls = False - for x in Utils.listdir(path): - if x.endswith(self.env.cxxshlib_PATTERN % ''): - has_dlls = True - break - if not has_dlls: - self.env['STLIBPATH_%s' % var] = [path] - self.env['STLIB_%s' % var] = libs - del self.env['LIB_%s' % var] - del self.env['LIBPATH_%s' % var] - - # we attempt to play with some known-to-work CXXFLAGS combinations - for cxxflags in (['/MD', '/EHsc'], []): - self.env.stash() - self.env["CXXFLAGS_%s" % var] += cxxflags - try: - try_link() - self.end_msg("ok: winning cxxflags combination: %s" % (self.env["CXXFLAGS_%s" % var])) - exc = None - break - except Errors.ConfigurationError as e: - self.env.revert() - exc = e - - if exc is not None: - self.end_msg("Could not auto-detect boost linking flags combination, you may report it to boost.py author", ex=exc) - self.fatal('The configuration failed') - else: - self.end_msg("Boost linkage flags auto-detection not implemented (needed ?) for this toolchain") - self.fatal('The configuration failed') - else: - self.start_msg('Checking for boost linkage') - try: - try_link() - except Errors.ConfigurationError as e: - self.end_msg("Could not link against boost libraries using supplied options") - self.fatal('The configuration failed') - self.end_msg('ok') - - -@feature('cxx') -@after_method('apply_link') -def install_boost(self): - if install_boost.done or not Utils.is_win32 or not self.bld.cmd.startswith('install'): - return - install_boost.done = True - inst_to = getattr(self, 'install_path', '${BINDIR}') - for lib in self.env.LIB_BOOST: - try: - file = self.bld.find_file(self.env.cxxshlib_PATTERN % lib, self.env.LIBPATH_BOOST) - self.bld.install_files(inst_to, self.bld.root.find_node(file)) - except: - continue -install_boost.done = False diff --git a/waf-tools/cflags.py b/waf-tools/cflags.py deleted file mode 100644 index 832783d8a..000000000 --- a/waf-tools/cflags.py +++ /dev/null @@ -1,203 +0,0 @@ -from waflib import Logs, Options, Utils - - -class CompilerTraits(object): - def get_warnings_flags(self, level): - """get_warnings_flags(level) -> list of cflags""" - raise NotImplementedError - - def get_optimization_flags(self, level): - """get_optimization_flags(level) -> list of cflags""" - raise NotImplementedError - - def get_debug_flags(self, level): - """get_debug_flags(level) -> (list of cflags, list of cppdefines)""" - raise NotImplementedError - - -class GccTraits(CompilerTraits): - def __init__(self): - super(GccTraits, self).__init__() - # cumulative list of warnings per level - self.warnings_flags = [['-Wall'], ['-Werror'], ['-Wextra']] - - def get_warnings_flags(self, level): - warnings = [] - for l in range(level): - if l < len(self.warnings_flags): - warnings.extend(self.warnings_flags[l]) - else: - break - return warnings - - def get_optimization_flags(self, level): - if level == 0: - return ['-O0'] - elif level == 1: - return ['-O'] - elif level == 2: - return ['-O2'] - elif level == 3: - return ['-O3'] - - def get_debug_flags(self, level): - if level == 0: - return (['-g0'], ['NDEBUG']) - elif level == 1: - return (['-g'], []) - elif level >= 2: - return (['-ggdb', '-g3'], ['_DEBUG']) - - -class IccTraits(CompilerTraits): - def __init__(self): - super(IccTraits, self).__init__() - # cumulative list of warnings per level - # icc is _very_ verbose with -Wall, -Werror is barely achievable - self.warnings_flags = [[], [], ['-Wall']] - - def get_warnings_flags(self, level): - warnings = [] - for l in range(level): - if l < len(self.warnings_flags): - warnings.extend(self.warnings_flags[l]) - else: - break - return warnings - - def get_optimization_flags(self, level): - if level == 0: - return ['-O0'] - elif level == 1: - return ['-O'] - elif level == 2: - return ['-O2'] - elif level == 3: - return ['-O3'] - - def get_debug_flags(self, level): - if level == 0: - return (['-g0'], ['NDEBUG']) - elif level == 1: - return (['-g'], []) - elif level >= 2: - return (['-ggdb', '-g3'], ['_DEBUG']) - - - -class MsvcTraits(CompilerTraits): - def __init__(self): - super(MsvcTraits, self).__init__() - # cumulative list of warnings per level - self.warnings_flags = [['/W2'], ['/WX'], ['/Wall']] - - def get_warnings_flags(self, level): - warnings = [] - for l in range(level): - if l < len(self.warnings_flags): - warnings.extend(self.warnings_flags[l]) - else: - break - return warnings - - def get_optimization_flags(self, level): - if level == 0: - return ['/Od'] - elif level == 1: - return [] - elif level == 2: - return ['/O2'] - elif level == 3: - return ['/Ox'] - - def get_debug_flags(self, level): - if level == 0: - return ([], ['NDEBUG']) - elif level == 1: - return (['/ZI', '/RTC1'], []) - elif level >= 2: - return (['/ZI', '/RTC1'], ['_DEBUG']) - - - -gcc = GccTraits() -icc = IccTraits() -msvc = MsvcTraits() - -# how to map env['COMPILER_CC'] or env['COMPILER_CXX'] into a traits object -compiler_mapping = { - 'gcc': gcc, - 'g++': gcc, - 'msvc': msvc, - 'icc': icc, - 'icpc': icc, - 'clang': gcc, - 'clang++': gcc, -} - -profiles = { - # profile name: [optimization_level, warnings_level, debug_level] - 'default': [2, 1, 1], - 'debug': [0, 2, 3], - 'release': [3, 1, 0], - } - -default_profile = 'default' - -def options(opt): - assert default_profile in profiles - opt.add_option('-d', '--build-profile', - action='store', - default=default_profile, - help=("Specify the build profile. " - "Build profiles control the default compilation flags" - " used for C/C++ programs, if CCFLAGS/CXXFLAGS are not" - " set in the environment. [Allowed Values: %s]" - % ", ".join([repr(p) for p in list(profiles.keys())])), - choices=list(profiles.keys()), - dest='build_profile') - opt.add_option('--check-profile', - help=('print out current build profile'), - default=False, dest='check_profile', action="store_true") - opt.add_option('--disable-werror', - help=('disable -Werror flag (warnings treated as errors, e.g., deprecated functions)'), - default=False, dest='disable_werror', action="store_true") -def configure(conf): - cc = conf.env['COMPILER_CC'] or None - cxx = conf.env['COMPILER_CXX'] or None - if not (cc or cxx): - raise Utils.WafError("neither COMPILER_CC nor COMPILER_CXX are defined; " - "maybe the compiler_cc or compiler_cxx tool has not been configured yet?") - - try: - compiler = compiler_mapping[cc] - except KeyError: - try: - compiler = compiler_mapping[cxx] - except KeyError: - Logs.warn("No compiler flags support for compiler %r or %r" - % (cc, cxx)) - return - - opt_level, warn_level, dbg_level = profiles[Options.options.build_profile] - - optimizations = compiler.get_optimization_flags(opt_level) - debug, debug_defs = compiler.get_debug_flags(dbg_level) - warnings = compiler.get_warnings_flags(warn_level) - - if Options.options.disable_werror: - try: - warnings.remove ('-Werror') - except ValueError: - pass - - if cc and not conf.env['CCFLAGS']: - conf.env.append_value('CCFLAGS', optimizations) - conf.env.append_value('CCFLAGS', debug) - conf.env.append_value('CCFLAGS', warnings) - conf.env.append_value('CCDEFINES', debug_defs) - if cxx and not conf.env['CXXFLAGS']: - conf.env.append_value('CXXFLAGS', optimizations) - conf.env.append_value('CXXFLAGS', debug) - conf.env.append_value('CXXFLAGS', warnings) - conf.env.append_value('CXXDEFINES', debug_defs) diff --git a/waf-tools/clang_compilation_database.py b/waf-tools/clang_compilation_database.py deleted file mode 100644 index 8d0c42f79..000000000 --- a/waf-tools/clang_compilation_database.py +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env python3 -# encoding: utf-8 -# Christoph Koke, 2013 - -""" -Writes the c and cpp compile commands into build/compile_commands.json -see http://clang.llvm.org/docs/JSONCompilationDatabase.html - -Usage: - - def configure(conf): - conf.load('compiler_cxx') - ... - conf.load('clang_compilation_database') -""" - -import sys, os, json, shlex, pipes -from waflib import Logs, TaskGen, Task -from waflib.Tools import c, cxx - -Task.TaskBase.keep_last_cmd = True - -if sys.hexversion >= 0x3030000: - quote = shlex.quote -else: - quote = pipes.quote - -@TaskGen.feature('*') -@TaskGen.after_method('process_use') -def collect_compilation_db_tasks(self): - "Add a compilation database entry for compiled tasks" - try: - clang_db = self.bld.clang_compilation_database_tasks - except AttributeError: - clang_db = self.bld.clang_compilation_database_tasks = [] - self.bld.add_post_fun(write_compilation_database) - - for task in getattr(self, 'compiled_tasks', []): - if isinstance(task, (c.c, cxx.cxx)): - clang_db.append(task) - -def write_compilation_database(ctx): - "Write the clang compilation database as JSON" - database_file = ctx.bldnode.make_node('compile_commands.json') - Logs.info("Build commands will be stored in %s" % database_file.path_from(ctx.path)) - try: - root = json.load(database_file) - except IOError: - root = [] - clang_db = dict((x["file"], x) for x in root) - for task in getattr(ctx, 'clang_compilation_database_tasks', []): - try: - cmd = task.last_cmd - except AttributeError: - continue - directory = getattr(task, 'cwd', ctx.variant_dir) - f_node = task.inputs[0] - filename = os.path.relpath(f_node.abspath(), directory) - cmd = " ".join(map(quote, cmd)) - entry = { - "directory": directory, - "command": cmd, - "file": filename, - } - clang_db[filename] = entry - root = list(clang_db.values()) - database_file.write(json.dumps(root, indent=2)) - diff --git a/waf-tools/command.py b/waf-tools/command.py deleted file mode 100644 index 0bc2b7913..000000000 --- a/waf-tools/command.py +++ /dev/null @@ -1,131 +0,0 @@ -import re -import subprocess - -# import feature, taskgen_method, before_method, task_gen -from waflib import TaskGen, Node, Task, Utils, Build, Options, Logs, Task -debug = Logs.debug -error = Logs.error - -import shellcmd -#shellcmd.subprocess = pproc # the WAF version of the subprocess module is supposedly less buggy -shellcmd.debug = debug - - -arg_rx = re.compile(r"(?P\$\$)|(?P\$\{(?P\w+)(?P.*?)\})", re.M) - -class command(Task.Task): - color = "BLUE" - def __init__(self, env, generator): - Task.Task.__init__(self, env=env, normal=1, generator=generator) - - def __str__(self): - "string to display to the user" - env = self.env - src_str = ' '.join([a.bldpath() for a in self.inputs]) - tgt_str = ' '.join([a.bldpath() for a in self.outputs]) - if self.outputs: - sep = ' -> ' - else: - sep = '' - - pipeline = shellcmd.Pipeline() - pipeline.parse(self.generator.command) - cmd = pipeline.get_abbreviated_command() - return 'command (%s): %s%s%s' % (cmd, src_str, sep, tgt_str) - - def _subst_arg(self, arg, direction, namespace): - """ - @param arg: the command argument (or stdin/stdout/stderr) to substitute - @param direction: direction of the argument: 'in', 'out', or None - """ - def repl(match): - if match.group('dollar'): - return "$" - elif match.group('subst'): - var = match.group('var') - code = match.group('code') - result = eval(var+code, namespace) - if isinstance(result, Node.Node): - if var == 'TGT': - return result.get_bld().abspath() - elif var == 'SRC': - return result.srcpath() - else: - raise ValueError("Bad subst variable %r" % var) - elif result is self.inputs: - if len(self.inputs) == 1: - return result[0].srcpath() - else: - raise ValueError("${SRC} requested but have multiple sources; which one?") - elif result is self.outputs: - if len(self.outputs) == 1: - return result[0].get_bld().abspath() - else: - raise ValueError("${TGT} requested but have multiple targets; which one?") - elif isinstance(result, list): - assert len(result) == 1 - return result[0] - else: - return result - return None - - return arg_rx.sub(repl, arg) - - def run(self): - pipeline = shellcmd.Pipeline() - pipeline.parse(self.generator.command) - namespace = self.env.get_merged_dict() - if self.generator.variables is not None: - namespace.update(self.generator.variables) - namespace.update(env=self.env, SRC=self.inputs, TGT=self.outputs) - for cmd in pipeline.pipeline: - if isinstance(cmd, shellcmd.Command): - if isinstance(cmd.stdin, str): - cmd.stdin = self._subst_arg(cmd.stdin, 'in', namespace) - if isinstance(cmd.stdout, str): - cmd.stdout = self._subst_arg(cmd.stdout, 'out', namespace) - if isinstance(cmd.stderr, str): - cmd.stderr = self._subst_arg(cmd.stderr, 'out', namespace) - for argI in range(len(cmd.argv)): - cmd.argv[argI] = self._subst_arg(cmd.argv[argI], None, namespace) - if cmd.env_vars is not None: - env_vars = dict() - for name, value in cmd.env_vars.items(): - env_vars[name] = self._subst_arg(value, None, namespace) - cmd.env_vars = env_vars - elif isinstance(cmd, shellcmd.Chdir): - cmd.dir = self._subst_arg(cmd.dir, None, namespace) - return pipeline.run(verbose=(Options.options.verbose > 0)) - -@TaskGen.taskgen_method -@TaskGen.feature('command') -def init_command(self): - Utils.def_attrs(self, - # other variables that can be used in the command: ${VARIABLE} - variables = None, - rule='') - - - -@TaskGen.feature('command') -@TaskGen.after_method('process_rule') -def apply_command(self): - #self.meths.remove('apply_core') - # create the task - task = self.create_task('command') - setattr(task, "dep_vars", getattr(self, "dep_vars", None)) - # process the sources - inputs = [] - for node in self.source: - inputs.append(node) - task.set_inputs(inputs) - task.set_outputs([self.path.find_or_declare(tgt) for tgt in self.to_list(self.target)]) - self.source = '' - #Task.file_deps = Task.extract_deps - - - -# class command_taskgen(task_gen): -# def __init__(self, *k, **kw): -# task_gen.__init__(self, *k, **kw) -# self.features.append('command') diff --git a/waf-tools/misc.py b/waf-tools/misc.py deleted file mode 100644 index dd4f0e782..000000000 --- a/waf-tools/misc.py +++ /dev/null @@ -1,413 +0,0 @@ -#!/usr/bin/env python3 -# 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 EnvironmentError: - 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 every time" - 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') - -def subst_func(tsk): - "Substitutes variables in a .in file" - - m4_re = re.compile('@(\w+)@', re.M) - - code = tsk.inputs[0].read() #Utils.readf(infile) - - # replace all % by %% to prevent errors by % signs in the input file while string formatting - code = code.replace('%', '%%') - - s = m4_re.sub(r'%(\1)s', code) - - env = tsk.env - di = getattr(tsk, 'dict', {}) or getattr(tsk.generator, 'dict', {}) - if not di: - names = m4_re.findall(code) - for i in names: - di[i] = env.get_flat(i) or env.get_flat(i.upper()) - - tsk.outputs[0].write(s % di) - -@feature('subst') -@before_method('process_source') -def apply_subst(self): - Utils.def_attrs(self, fun=subst_func) - lst = self.to_list(self.source) - self.meths.remove('process_source') - - self.dict = getattr(self, 'dict', {}) - - for filename in lst: - node = self.path.find_resource(filename) - if not node: raise Errors.WafError('cannot find input file %s for processing' % filename) - - if self.target: - newnode = self.path.find_or_declare(self.target) - else: - newnode = node.change_ext('') - - try: - self.dict = self.dict.get_merged_dict() - except AttributeError: - pass - - if self.dict and not self.env['DICT_HASH']: - self.env = self.env.derive() - keys = list(self.dict.keys()) - keys.sort() - lst = [self.dict[x] for x in keys] - self.env['DICT_HASH'] = str(Utils.h_list(lst)) - - tsk = self.create_task('copy', node, newnode) - tsk.fun = self.fun - tsk.dict = self.dict - tsk.dep_vars = ['DICT_HASH'] - 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 - - 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/waf-tools/relocation.py b/waf-tools/relocation.py deleted file mode 100644 index 2adf3b0aa..000000000 --- a/waf-tools/relocation.py +++ /dev/null @@ -1,85 +0,0 @@ -#! /usr/bin/env python3 -# encoding: utf-8 - -""" -Waf 1.6 - -Try to detect if the project directory was relocated, and if it was, -change the node representing the project directory. Just call: - - waf configure build - -Note that if the project directory name changes, the signatures for the tasks using -files in that directory will change, causing a partial build. -""" -from __future__ import print_function -import os -from waflib import Build, ConfigSet, Task, Utils, Errors -from waflib.TaskGen import feature, before_method, after_method - -EXTRA_LOCK = '.old_srcdir' - -old1 = Build.BuildContext.store -def store(self): - old1(self) - db = os.path.join(self.variant_dir, EXTRA_LOCK) - env = ConfigSet.ConfigSet() - env.SRCDIR = self.srcnode.abspath() - env.store(db) -Build.BuildContext.store = store - -old2 = Build.BuildContext.init_dirs -def init_dirs(self): - - if not (os.path.isabs(self.top_dir) and os.path.isabs(self.out_dir)): - raise Errors.WafError('The project was not configured: run "waf configure" first!') - - srcdir = None - db = os.path.join(self.variant_dir, EXTRA_LOCK) - env = ConfigSet.ConfigSet() - try: - env.load(db) - srcdir = env.SRCDIR - except: - pass - - if srcdir: - d = self.root.find_node(srcdir) - if d and srcdir != self.top_dir and getattr(d, 'children', ''): - srcnode = self.root.make_node(self.top_dir) - print(("relocating the source directory %r -> %r" % (srcdir, self.top_dir))) - srcnode.children = {} - - for (k, v) in list(d.children.items()): - srcnode.children[k] = v - v.parent = srcnode - d.children = {} - - old2(self) - -Build.BuildContext.init_dirs = init_dirs - - -def uid(self): - try: - return self.uid_ - except AttributeError: - # this is not a real hot zone, but we want to avoid surprises here - m = Utils.md5() - up = m.update - up(self.__class__.__name__.encode()) - for x in self.inputs + self.outputs: - up(x.path_from(x.ctx.srcnode).encode()) - self.uid_ = m.digest() - return self.uid_ -Task.Task.uid = uid - -@feature('c', 'cxx', 'd', 'go', 'asm', 'fc', 'includes') -@after_method('propagate_uselib_vars', 'process_source') -def apply_incpaths(self): - lst = self.to_incnodes(self.to_list(getattr(self, 'includes', [])) + self.env['INCLUDES']) - self.includes_nodes = lst - bld = self.bld - self.env['INCPATHS'] = [x.is_child_of(bld.srcnode) and x.path_from(bld.bldnode) or x.abspath() for x in lst] - - diff --git a/waf-tools/shellcmd.py b/waf-tools/shellcmd.py deleted file mode 100644 index 6be9c2ca2..000000000 --- a/waf-tools/shellcmd.py +++ /dev/null @@ -1,357 +0,0 @@ -# Copyright (C) 2008 Gustavo J. A. M. Carneiro - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -from __future__ import print_function -import shlex -import subprocess -import sys -import re -import os - -env_var_rx = re.compile(r"^([a-zA-Z0-9_]+)=(\S+)$") - -def debug(message): - print(message, file=sys.stderr) - - -if sys.platform == 'win32': - dev_null = open("NUL:", "w") -else: - dev_null = open("/dev/null", "w") - -fcntl = fd = fl = None -try: - import fcntl -except ImportError: - pass -else: - fd = dev_null.fileno() - fl = fcntl.fcntl(fd, fcntl.F_GETFD) - fcntl.fcntl(fd, fcntl.F_SETFD, fl | fcntl.FD_CLOEXEC) -del fcntl, fd, fl - -def _open_out_file(filename): - if filename in ['NUL:', '/dev/null']: - return dev_null - else: - return open(filename, 'wb') - - -class Node(object): - pass - -class Op(Node): - pass - -class Pipe(Op): - pass - -class And(Op): - pass - -class Or(Op): - pass - -class Command(Node): - class PIPE(object): - pass # PIPE is a constant - class STDOUT(object): - pass # PIPE is a constant - - def __init__(self, name): - super(Command, self).__init__() - self.name = name # command name - self.argv = [name] # command argv - self.stdin = None - self.stdout = None - self.stderr = None - self.env_vars = None - - def __repr__(self): - return "Command(%r, argv=%r, stdin=%r, stdout=%r, stderr=%r)" \ - % (self.name, self.argv, self.stdin, self.stdout, self.stderr) - -class Chdir(Node): - def __init__(self): - super(Chdir, self).__init__() - self.dir = None - - def __repr__(self): - return "Chdir(%r)" \ - % (self.dir) - -class Pipeline(object): - def __init__(self): - self.current_command = None - self.pipeline = [] - - def _commit_command(self): - assert self.current_command is not None - self.pipeline.append(self.current_command) - self.current_command = None - - def get_abbreviated_command(self): - l = [] - for node in self.pipeline: - if isinstance(node, Command): - l.append(node.name) - if isinstance(node, Chdir): - l.append('cd %s' % node.dir) - elif isinstance(node, Pipe): - l.append('|') - elif isinstance(node, And): - l.append('&&') - elif isinstance(node, And): - l.append('||') - return ' '.join(l) - - def parse(self, command): - self.current_command = None - self.pipeline = [] - - if isinstance(command, list): - tokens = list(command) - else: - tokens = shlex.split(command) - debug("command: shlex: %r" % (tokens,)) - - BEGIN, COMMAND, CHDIR, STDERR, STDOUT, STDIN = list(range(6)) - state = BEGIN - self.current_command = None - env_vars = dict() - - while tokens: - token = tokens.pop(0) - if state == BEGIN: - env_var_match = env_var_rx.match(token) - if env_var_match is not None: - env_vars[env_var_match.group(1)] = env_var_match.group(2) - else: - assert self.current_command is None - if token == 'cd': - self.current_command = Chdir() - assert not env_vars - state = CHDIR - else: - self.current_command = Command(token) - if env_vars: - self.current_command.env_vars = env_vars - env_vars = dict() - state = COMMAND - elif state == COMMAND: - if token == '>': - state = STDOUT - elif token == '2>': - state = STDERR - elif token == '2>&1': - assert self.current_command.stderr is None - self.current_command.stderr = Command.STDOUT - elif token == '<': - state = STDIN - elif token == '|': - assert self.current_command.stdout is None - self.current_command.stdout = Command.PIPE - self._commit_command() - self.pipeline.append(Pipe()) - state = BEGIN - elif token == '&&': - self._commit_command() - self.pipeline.append(And()) - state = BEGIN - elif token == '||': - self._commit_command() - self.pipeline.append(Or()) - state = BEGIN - else: - self.current_command.argv.append(token) - elif state == CHDIR: - if token == '&&': - self._commit_command() - self.pipeline.append(And()) - state = BEGIN - else: - assert self.current_command.dir is None - self.current_command.dir = token - elif state == STDOUT: - assert self.current_command.stdout is None - self.current_command.stdout = token - state = COMMAND - elif state == STDERR: - assert self.current_command.stderr is None - self.current_command.stderr = token - state = COMMAND - elif state == STDIN: - assert self.current_command.stdin is None - self.current_command.stdin = token - state = COMMAND - self._commit_command() - return self.pipeline - - def _exec_piped_commands(self, commands): - retvals = [] - for cmd in commands: - retvals.append(cmd.wait()) - retval = 0 - for r in retvals: - if r: - retval = retvals[-1] - break - return retval - - def run(self, verbose=False): - pipeline = list(self.pipeline) - files_to_close = [] - piped_commands = [] - piped_commands_display = [] - BEGIN, PIPE = list(range(2)) - state = BEGIN - cwd = '.' - while pipeline: - node = pipeline.pop(0) - - if isinstance(node, Chdir): - next_op = pipeline.pop(0) - assert isinstance(next_op, And) - cwd = os.path.join(cwd, node.dir) - if verbose: - piped_commands_display.append("cd %s &&" % node.dir) - continue - - assert isinstance(node, (Command, Chdir)) - cmd = node - if verbose: - if cmd.env_vars: - env_vars_str = ' '.join(['%s=%s' % (key, val) for key, val in cmd.env_vars.items()]) - piped_commands_display.append("%s %s" % (env_vars_str, ' '.join(cmd.argv))) - else: - piped_commands_display.append(' '.join(cmd.argv)) - - if state == PIPE: - stdin = piped_commands[-1].stdout - elif cmd.stdin is not None: - stdin = open(cmd.stdin, "r") - if verbose: - piped_commands_display.append('< %s' % cmd.stdin) - files_to_close.append(stdin) - else: - stdin = None - - if cmd.stdout is None: - stdout = None - elif cmd.stdout is Command.PIPE: - stdout = subprocess.PIPE - else: - stdout = _open_out_file(cmd.stdout) - files_to_close.append(stdout) - if verbose: - piped_commands_display.append('> %s' % cmd.stdout) - - if cmd.stderr is None: - stderr = None - elif cmd.stderr is Command.PIPE: - stderr = subprocess.PIPE - elif cmd.stderr is Command.STDOUT: - stderr = subprocess.STDOUT - if verbose: - piped_commands_display.append('2>&1') - else: - stderr = _open_out_file(cmd.stderr) - files_to_close.append(stderr) - if verbose: - piped_commands_display.append('2> %s' % cmd.stderr) - - if cmd.env_vars: - env = dict(os.environ) - env.update(cmd.env_vars) - else: - env = None - - if cwd == '.': - proc_cwd = None - else: - proc_cwd = cwd - - debug("command: subprocess.Popen(argv=%r, stdin=%r, stdout=%r, stderr=%r, env_vars=%r, cwd=%r)" - % (cmd.argv, stdin, stdout, stderr, cmd.env_vars, proc_cwd)) - proc = subprocess.Popen(cmd.argv, stdin=stdin, stdout=stdout, stderr=stderr, env=env, cwd=proc_cwd) - del stdin, stdout, stderr - piped_commands.append(proc) - - try: - next_node = pipeline.pop(0) - except IndexError: - try: - retval = self._exec_piped_commands(piped_commands) - if verbose: - print("%s: exit code %i" % (' '.join(piped_commands_display), retval)) - finally: - for f in files_to_close: - if f is not dev_null: - f.close() - files_to_close = [] - return retval - else: - - if isinstance(next_node, Pipe): - state = PIPE - piped_commands_display.append('|') - - elif isinstance(next_node, Or): - try: - this_retval = self._exec_piped_commands(piped_commands) - finally: - for f in files_to_close: - if f is not dev_null: - f.close() - files_to_close = [] - if this_retval == 0: - if verbose: - print("%s: exit code %i (|| is short-circuited)" % (' '.join(piped_commands_display), retval)) - return this_retval - if verbose: - print("%s: exit code %i (|| proceeds)" % (' '.join(piped_commands_display), retval)) - state = BEGIN - piped_commands = [] - piped_commands_display = [] - - elif isinstance(next_node, And): - try: - this_retval = self._exec_piped_commands(piped_commands) - finally: - for f in files_to_close: - if f is not dev_null: - f.close() - files_to_close = [] - if this_retval != 0: - if verbose: - print("%s: exit code %i (&& is short-circuited)" % (' '.join(piped_commands_display), retval)) - return this_retval - if verbose: - print("%s: exit code %i (&& proceeds)" % (' '.join(piped_commands_display), retval)) - state = BEGIN - piped_commands = [] - piped_commands_display = [] - - - -def _main(): - pipeline = Pipeline() - pipeline.parse('./foo.py 2>&1 < xxx | cat && ls') - print(pipeline.run()) - -if __name__ == '__main__': - _main() - diff --git a/waf-tools/versioning.py b/waf-tools/versioning.py deleted file mode 100644 index 634705bbb..000000000 --- a/waf-tools/versioning.py +++ /dev/null @@ -1,262 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -import re - -from waflib import ConfigSet, Configure, Context, Options, Task, TaskGen - -CACHE_FILE = 'version.cache' - -class ns3_version_info(Task.Task): - '''Base task which implements functionality common to all inherited tasks - - This class handles parsing the ns-3 version tag into component parts - as well as saving the version fields to a cache file - - All version fields should be stored in the fields property - - Derived classes should override _find_closest_tag() and - _find_closest_ns3_tag() - ''' - - def __init__(self, *args, **kwargs): - self._fields = ConfigSet.ConfigSet() - - super(ns3_version_info, self).__init__(*args, **kwargs) - - @property - def fields(self): - return self._fields - - def _find_closest_tag(self, ctx): - """Override in derived classes""" - pass - - def _find_closest_ns3_tag(self, ctx): - """Override in derived classes""" - pass - - def _parse_version_tag(self, ctx, tag): - safe_tag = tag.strip() - matches = re.match("ns-(\d+)\.(\d+)(?:.(\d+))?(?:-(RC.+))?.*", safe_tag) - - if not matches: - return False - - self.fields['VERSION_TAG'] = '"{}"'.format(safe_tag) - self.fields['VERSION_MAJOR'] = matches.group(1) - self.fields['VERSION_MINOR'] = matches.group(2) - - patch = matches.group(3) - - if not patch: - patch = '0' - - self.fields['VERSION_PATCH'] = patch - - release_candidate = matches.group(4) - - if not release_candidate: - release_candidate = '' - - self.fields['VERSION_RELEASE_CANDIDATE'] = '"{}"'.format(release_candidate) - - return True - - def run(self): - ctx = self.generator.bld - - try: - self._find_closest_tag(ctx) - - if 'VERSION_TAG' not in self.fields: - self._find_closest_ns3_tag(ctx) - - #Generate the path where the cache file will be stored - base_path = self.generator.path.make_node('model') - cache_path = base_path.make_node(CACHE_FILE) - - #Write the version information out to the cache file - #The cache file is used to populate the version fields when a git - #repository can not be found - self.fields.store(cache_path.abspath()) - - #merge version info into main configset - ctx.env.update(self.fields) - - except Exception as e: - ctx.to_log("Extracting version information from tags failed: {}\n".format(e)) - return 1 - - return 0 - -class git_ns3_version_info(ns3_version_info): - '''Task to generate version fields from an ns-3 git repository''' - always_run = True - - def _find_closest_tag(self, ctx): - cmd = [ - 'git', - 'describe', - '--tags', - '--dirty', - '--long' - ] - - try: - out = ctx.cmd_and_log(cmd, - output=Context.STDOUT, - quiet=Context.BOTH) - except Exception as e: - raise Exception(e.stderr.strip()) - - matches = re.match('(.+)-(\d+)-(g[a-fA-F0-9]+)(?:-(dirty))?', out) - - if not matches: - raise ValueError("Closest tag found in git log" - "does not match the expected format (tag='{}')" - .format(out)) - - tag = matches.group(1) - - self.fields['CLOSEST_TAG'] = '"{}"'.format(tag) - self.fields['VERSION_TAG_DISTANCE'] = matches.group(2) - self.fields['VERSION_COMMIT_HASH'] = '"{}"'.format(matches.group(3)) - self.fields['VERSION_DIRTY_FLAG'] = '1' if matches.group(4) else '0' - - self._parse_version_tag(ctx, tag) - - def _find_closest_ns3_tag(self, ctx): - cmd = [ - 'git', - 'describe', - '--tags', - '--abbrev=0', - '--match', - 'ns-3*', - 'HEAD' - ] - - try: - out = ctx.cmd_and_log(cmd, - output=Context.STDOUT, - quiet=Context.BOTH) - except Exception as e: - raise Exception(e.stderr.strip()) - - tag = out.strip() - - result = self._parse_version_tag(ctx, tag) - - if not result: - raise ValueError("Closest ns3 tag found in git log" - " does not match the expected format (tag='{}')" - .format(tag)) - -@TaskGen.feature('version-defines') -def generate_version_defines(self): - - #Create a substitution task to generate version-defines.h - #from fields stored in env - subst_task = self.create_task('subst', self.source, self.target) - - if self.env['HAVE_NS3_REPO']: - #if a git repo is present, run the version task first to - #populate the appropriate fields with data from the git repo - version_task = self.create_task('git_ns3_version_info') - subst_task.set_run_after(version_task) - -@Configure.conf -def check_git_repo(self): - '''Determine if a git repository is present''' - - root = False - cmd = [ - 'git', - 'rev-parse', - '--show-toplevel' - ] - - try: - #determine if the current directory is part of a git repository - self.find_program('git') - - out = self.cmd_and_log(cmd, output=Context.STDOUT, quiet=Context.BOTH) - - root = out.strip() - except Exception: - root = False - - self.msg('Checking for local git repository', root) - - return bool(root) - -@Configure.conf -def check_git_repo_has_ns3_tags(self): - '''Determine if the git repository is an ns-3 repository - - A repository is considered an ns-3 repository if it has at least one - tag that matches the regex ns-3* - ''' - - tag = False - - cmd = [ - 'git', - 'describe', - '--tags', - '--abbrev=0', - '--match', - 'ns-3.[0-9]*' - ] - - try: - out = self.cmd_and_log(cmd, output=Context.STDOUT, quiet=Context.BOTH) - - tag = out.strip() - - except Exception: - tag = False - - self.msg('Checking local git repository for ns3 tags', tag) - - return bool(tag) - -def configure(ctx): - - has_git_repo = False - has_ns3_tags = False - - if not Options.options.enable_build_version: - return - - if ctx.check_git_repo(): - has_git_repo = True - has_ns3_tags = ctx.check_git_repo_has_ns3_tags() - - ctx.env['HAVE_GIT_REPO'] = has_git_repo - ctx.env['HAVE_NS3_REPO'] = has_ns3_tags - - if not has_ns3_tags: - version_cache = ConfigSet.ConfigSet () - - #no ns-3 repository, look for a cache file containing the version info - ctx.start_msg('Searching for file {}'.format(CACHE_FILE)) - - glob_pattern = '**/{}'.format(CACHE_FILE) - cache_path = ctx.path.ant_glob(glob_pattern) - - if len(cache_path) > 0: - #Found cache file - #Load it and merge the information into the main context environment - src_path = cache_path[0].srcpath() - ctx.end_msg(src_path) - - version_cache.load (src_path) - else: - ctx.end_msg(False) - - ctx.fatal('Unable to find ns3 git repository or version.cache file ' - 'containing version information') - - ctx.env.update(version_cache) - diff --git a/waf.bat b/waf.bat deleted file mode 100755 index bc191a5ee..000000000 --- a/waf.bat +++ /dev/null @@ -1 +0,0 @@ -@python -x waf %* & exit /b diff --git a/wscript b/wscript deleted file mode 100644 index 2b0e7c0bf..000000000 --- a/wscript +++ /dev/null @@ -1,1748 +0,0 @@ -## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- - -# python lib modules -from __future__ import print_function -import sys -import shutil -import types -import optparse -import os.path -import re -import shlex -import subprocess -import textwrap -import fileinput -import glob - -from utils import read_config_file - - -# WAF modules -from waflib import Utils, Scripting, Configure, Build, Options, TaskGen, Context, Task, Logs, Errors -from waflib.Errors import WafError - - -# local modules -import wutils - - -# By default, all modules will be enabled, examples will be disabled, -# and tests will be disabled. -modules_enabled = ['all_modules'] -examples_enabled = False -tests_enabled = False - -# GCC minimum version requirements for C++17 support -gcc_min_version = (8, 0, 0) - -# Bug 2181: clang warnings about unused local typedefs and potentially -# evaluated expressions affecting darwin clang/LLVM version 7.0.0 (Xcode 7) -# or clang/LLVM version 3.6 or greater. We must make this platform-specific. -darwin_clang_version_warn_unused_local_typedefs = (7, 0, 0) -darwin_clang_version_warn_potentially_evaluated = (7, 0, 0) -clang_version_warn_unused_local_typedefs = (3, 6, 0) -clang_version_warn_potentially_evaluated = (3, 6, 0) - -# Get the information out of the NS-3 configuration file. -config_file_exists = False -(config_file_exists, modules_enabled, examples_enabled, tests_enabled) = read_config_file() - -sys.path.insert(0, os.path.abspath('waf-tools')) -try: - import cflags # override the build profiles from waf -finally: - sys.path.pop(0) - -cflags.profiles = { - # profile name: [optimization_level, warnings_level, debug_level] - 'debug': [0, 2, 3], - 'optimized': [3, 2, 1], - 'release': [3, 2, 0], - } -cflags.default_profile = 'debug' - -Configure.autoconfig = 0 - -# the following two variables are used by the target "waf dist" -with open("VERSION", "rt") as f: - VERSION = f.read().strip() -APPNAME = 'ns' - -wutils.VERSION = VERSION.replace(".", "-") -wutils.APPNAME = APPNAME - -# we don't use VNUM anymore (see bug #1327 for details) -wutils.VNUM = None - -# these variables are mandatory ('/' are converted automatically) -top = '.' -out = 'build' - -def load_env(): - bld_cls = getattr(Utils.g_module, 'build_context', Utils.Context) - bld_ctx = bld_cls() - bld_ctx.load_dirs(os.path.abspath(os.path.join (srcdir,'..')), - os.path.abspath(os.path.join (srcdir,'..', blddir))) - bld_ctx.load_envs() - env = bld_ctx.get_env() - return env - -def get_files(base_dir): - retval = [] - reference=os.path.dirname(base_dir) - for root, dirs, files in os.walk(base_dir): - if root.find('.hg') != -1: - continue - for file in files: - if file.find('.hg') != -1: - continue - fullname = os.path.join(root,file) - # we can't use os.path.relpath because it's new in python 2.6 - relname = fullname.replace(reference + '/','') - retval.append([fullname,relname]) - return retval - - -def dist_hook(): - import tarfile - shutil.rmtree("doc/html", True) - shutil.rmtree("doc/latex", True) - -# Print the sorted list of module names in columns. -def print_module_names(names): - """Print the list of module names in 3 columns.""" - for i, name in enumerate(sorted(names)): - if i % 3 == 2 or i == len(names) - 1: - print(name) - else: - print(name.ljust(25), end=' ') - -# return types of some APIs differ in Python 2/3 (type string vs class bytes) -# This method will decode('utf-8') a byte object in Python 3, -# and do nothing in Python 2 -def maybe_decode(input): - if sys.version_info < (3,): - return input - else: - try: - return input.decode('utf-8') - except: - sys.exc_clear() - return input - -def options(opt): - # options provided by the modules - opt.load('md5_tstamp') - opt.load('compiler_c') - opt.load('compiler_cxx') - opt.load('cflags') - opt.load('gnu_dirs') - opt.load('boost', tooldir=['waf-tools']) - - opt.add_option('--check-config', - help=('Print the current configuration.'), - action="store_true", default=False, - dest="check_config") - - opt.add_option('--cwd', - help=('Set the working directory for a program.'), - action="store", type="string", default=None, - dest='cwd_launch') - - opt.add_option('--enable-gcov', - help=('Enable code coverage analysis.' - ' WARNING: this option only has effect ' - 'with the configure command.'), - action="store_true", default=False, - dest='enable_gcov') - - opt.add_option('--no-task-lines', - help=("Don't print task lines, i.e. messages saying which tasks are being executed by WAF." - " Coupled with a single -v will cause WAF to output only the executed commands," - " just like 'make' does by default."), - action="store_true", default=False, - dest='no_task_lines') - - opt.add_option('--lcov-report', - help=('Generate a code coverage report ' - '(use this option after configuring with --enable-gcov and running a program)'), - action="store_true", default=False, - dest='lcov_report') - - opt.add_option('--lcov-zerocounters', - help=('Zero the lcov counters' - '(use this option before rerunning a program, when generating repeated lcov reports)'), - action="store_true", default=False, - dest='lcov_zerocounters') - - opt.add_option('--run', - help=('Run a locally built program; argument can be a program name,' - ' or a command starting with the program name.'), - type="string", default='', dest='run') - opt.add_option('--run-no-build', - help=('Run a locally built program without rebuilding the project; argument can be a program name,' - ' or a command starting with the program name.'), - type="string", default='', dest='run_no_build') - opt.add_option('--visualize', - help=('Modify --run arguments to enable the visualizer'), - action="store_true", default=False, dest='visualize') - opt.add_option('--command-template', - help=('Template of the command used to run the program given by --run;' - ' It should be a shell command string containing %s inside,' - ' which will be replaced by the actual program.'), - type="string", default=None, dest='command_template') - opt.add_option('--pyrun', - help=('Run a python program using locally built ns3 python module;' - ' argument is the path to the python program, optionally followed' - ' by command-line options that are passed to the program.'), - type="string", default='', dest='pyrun') - opt.add_option('--pyrun-no-build', - help=('Run a python program using locally built ns3 python module without rebuilding the project;' - ' argument is the path to the python program, optionally followed' - ' by command-line options that are passed to the program.'), - type="string", default='', dest='pyrun_no_build') - opt.add_option('--gdb', - help=('Change the default command template to run programs and unit tests with gdb'), - action="store_true", default=False, - dest='gdb') - opt.add_option('--valgrind', - help=('Change the default command template to run programs and unit tests with valgrind'), - action="store_true", default=False, - dest='valgrind') - opt.add_option('--shell', - help=('DEPRECATED (run ./waf shell)'), - action="store_true", default=False, - dest='shell') - opt.add_option('--enable-sudo', - help=('Use sudo to setup suid bits on ns3 executables.'), - dest='enable_sudo', action='store_true', - default=False) - opt.add_option('--enable-tests', - help=('Build the ns-3 tests.'), - dest='enable_tests', action='store_true', - default=False) - opt.add_option('--disable-tests', - help=('Do not build the ns-3 tests.'), - dest='disable_tests', action='store_true', - default=False) - opt.add_option('--enable-examples', - help=('Build the ns-3 examples.'), - dest='enable_examples', action='store_true', - default=False) - opt.add_option('--disable-examples', - help=('Do not build the ns-3 examples.'), - dest='disable_examples', action='store_true', - default=False) - opt.add_option('--check', - help=('DEPRECATED (run ./test.py)'), - default=False, dest='check', action="store_true") - opt.add_option('--enable-static', - help=('Compile NS-3 statically: works only on linux, without python'), - dest='enable_static', action='store_true', - default=False) - opt.add_option('--enable-mpi', - help=('Compile NS-3 with MPI and distributed simulation support'), - dest='enable_mpi', action='store_true', - default=False) - opt.add_option('--doxygen-no-build', - help=('Run doxygen to generate html documentation from source comments, ' - 'but do not wait for ns-3 to finish the full build.'), - action="store_true", default=False, - dest='doxygen_no_build') - opt.add_option('--docset', - help=('Create Docset, without building. This requires the docsetutil tool from Xcode 9.2 or earlier. See Bugzilla 2196 for more details.'), - action="store_true", default=False, - dest="docset_build") - opt.add_option('--enable-des-metrics', - help=('Log all events in a json file with the name of the executable (which must call CommandLine::Parse(argc, argv)'), - action="store_true", default=False, - dest='enable_desmetrics') - opt.add_option('--cxx-standard', - help=('Compile NS-3 with the given C++ standard'), - type='string', dest='cxx_standard') - opt.add_option('--enable-asserts', - help=('Enable the asserts regardless of the compile mode'), - action="store_true", default=False, - dest='enable_asserts') - opt.add_option('--enable-logs', - help=('Enable the logs regardless of the compile mode'), - action="store_true", default=False, - dest='enable_logs') - - # options provided in subdirectories - opt.recurse('src') - opt.recurse('bindings/python') - opt.recurse('src/internet') - opt.recurse('contrib') - -def _check_compilation_flag(conf, flag, mode='cxx', linkflags=None): - """ - Checks if the C++ compiler accepts a certain compilation flag or flags - flag: can be a string or a list of strings - """ - l = [] - if flag: - l.append(flag) - if isinstance(linkflags, list): - l.extend(linkflags) - else: - if linkflags: - l.append(linkflags) - if len(l) > 1: - flag_str = 'flags ' + ' '.join(l) - else: - flag_str = 'flag ' + ' '.join(l) - if len(flag_str) > 28: - flag_str = flag_str[:28] + "..." - - conf.start_msg('Checking for compilation %s support' % (flag_str,)) - env = conf.env.derive() - - retval = False - if mode == 'cc': - mode = 'c' - - if mode == 'cxx': - env.append_value('CXXFLAGS', flag) - else: - env.append_value('CFLAGS', flag) - - if linkflags is not None: - env.append_value("LINKFLAGS", linkflags) - - try: - retval = conf.check(compiler=mode, fragment='int main() { return 0; }', features='c', env=env) - except Errors.ConfigurationError: - ok = False - else: - ok = (retval == True) - conf.end_msg(ok) - return ok - - -def report_optional_feature(conf, name, caption, was_enabled, reason_not_enabled): - conf.env.append_value('NS3_OPTIONAL_FEATURES', [(name, caption, was_enabled, reason_not_enabled)]) - - -def check_optional_feature(conf, name): - for (name1, caption, was_enabled, reason_not_enabled) in conf.env.NS3_OPTIONAL_FEATURES: - if name1 == name: - return was_enabled - raise KeyError("Feature %r not declared yet" % (name,)) - - -# starting with waf 1.6, conf.check() becomes fatal by default if the -# test fails, this alternative method makes the test non-fatal, as it -# was in waf <= 1.5 -def _check_nonfatal(conf, *args, **kwargs): - try: - return conf.check(*args, **kwargs) - except conf.errors.ConfigurationError: - return None - -# Write a summary of optional features status -def print_config(env, phase='configure'): - if phase == 'configure': - profile = get_build_profile(env) - else: - profile = get_build_profile() - - print("---- Summary of optional NS-3 features:") - print("%-30s: %s%s%s" % ("Build profile", Logs.colors('GREEN'), - profile, Logs.colors('NORMAL'))) - bld = wutils.bld - print("%-30s: %s%s%s" % ("Build directory", Logs.colors('GREEN'), - Options.options.out, Logs.colors('NORMAL'))) - - - for (name, caption, was_enabled, reason_not_enabled) in sorted(env['NS3_OPTIONAL_FEATURES'], key=lambda s : s[1]): - if was_enabled: - status = 'enabled' - color = 'GREEN' - else: - status = 'not enabled (%s)' % reason_not_enabled - color = 'RED' - print("%-30s: %s%s%s" % (caption, Logs.colors(color), status, Logs.colors('NORMAL'))) - -# Checking for boost headers and libraries -# -# There are four cases: -# A. Only need headers, and they are required -# B. Also need compiled libraries, and they are required -# C. Only use headers, but they are not required -# D. Use compiled libraries, but they are not required -# -# A. If you only need includes there are just two steps: -# -# A1. Add this in your module wscript configure function: -# -# if not conf.require_boost_incs('my-module', 'my module caption'): -# return -# -# A2. Do step FINAL below. -# -# B. If you also need some compiled boost libraries there are -# three steps (instead of the above): -# -# B1. Declare the libraries you need by adding to your module wscript: -# -# REQUIRED_BOOST_LIBS = ['lib1', 'lib2'...] -# -# def required_boost_libs(conf): -# conf.env['REQUIRED_BOOST_LIBS'] += REQUIRED_BOOST_LIBS -# -# B2. Check that the libs are present in your module wscript configure function: -# -# if conf.missing_boost_libs('my-module', 'my module caption', REQUIRED_BOOST_LIBS): -# return -# -# B3. Do step FINAL below. -# -# Finally, -# -# FINAL. Add boost to your module wscript build function: -# -# # Assuming you have -# # module = bld.create_ns3_module('my-module') -# module.use.append('BOOST') -# -# If your use of boost is optional it's even simpler. -# -# C. For optional headers only, the two steps above are modified a little: -# -# C1. Add this to your module wscript configure function: -# -# conf.require_boost_incs('my-module', 'my module caption', required=False) -# # Continue with config, adjusting for missing boost -# -# C2. Modify step FINAL as follows -# -# if bld.env['INCLUDES_BOOST']: -# module.use.append('BOOST') -# -# D. For compiled boost libraries -# -# D1. Do B1 above to declare the libraries you would like to use -# -# D2. If you need to take action at configure time, -# add to your module wscript configure function: -# -# missing_boost_libs = conf.missing_boost_libs('my-module', 'my module caption', REQUIRED_BOOST_LIBS, required=False) -# # Continue with config, adjusting for missing boost libs -# -# At this point you can inspect missing_boost_libs to see -# what libs were found and do the right thing. -# See below for preprocessor symbols which will be available -# in your source files. -# -# D3. If any of your libraries are present add to your -# module wscript build function: -# -# missing_boost_libs = bld.missing_boost_libs('lib-opt', REQUIRED_BOOST_LIBS) -# # Continue with build, adjusting for missing boost libs -# -# At this point you can inspect missing_boost_libs to see -# what libs were found and do the right thing. -# -# In all cases you can test for boost in your code with -# -# #ifdef HAVE_BOOST -# -# Each boost compiled library will be indicated with a 'HAVE_BOOST_' -# preprocessor symbol, which you can test. For example, for the boost -# Signals2 library: -# -# #ifdef HAVE_BOOST_SIGNALS2 -# - -def require_boost_incs(conf, module, caption, required=True): - - conf.to_log('boost: %s wants incs, required: %s' % (module, required)) - if conf.env['INCLUDES_BOOST']: - conf.to_log('boost: %s: have boost' % module) - return True - elif not required: - conf.to_log('boost: %s: no boost, but not required' % module) - return False - else: - conf.to_log('boost: %s: no boost, but required' % module) - conf.report_optional_feature(module, caption, False, - "boost headers required but not found") - - # Add this module to the list of modules that won't be built - # if they are enabled. - conf.env['MODULES_NOT_BUILT'].append(module) - return False - -# Report any required boost libs which are missing -# Return values of truthy are bad; falsey is good: -# If all are present return False (non missing) -# If boost not present, or no libs return True -# If some libs present, return the list of missing libs -def conf_missing_boost_libs(conf, module, caption, libs, required= True): - conf.to_log('boost: %s wants %s, required: %s' % (module, libs, required)) - - if not conf.require_boost_incs(module, caption, required): - # No headers found, so the libs aren't there either - return libs - - missing_boost_libs = [lib for lib in libs if lib not in conf.boost_libs] - - if required and missing_boost_libs: - if not conf.env['LIB_BOOST']: - conf.to_log('boost: %s requires libs, but none found' % module) - conf.report_optional_feature(module, caption, False, - "No boost libraries were found") - else: - conf.to_log('boost: %s requires libs, but missing %s' % (module, missing_boost_libs)) - conf.report_optional_feature(module, caption, False, - "Required boost libraries not found, missing: %s" % missing_boost_libs) - - # Add this module to the list of modules that won't be built - # if they are enabled. - conf.env['MODULES_NOT_BUILT'].append(module) - return missing_boost_libs - - # Required libraries were found, or are not required - return missing_boost_libs - -def get_boost_libs(libs): - names = set() - for lib in libs: - if lib.startswith("boost_"): - lib = lib[6:] - if lib.endswith("-mt"): - lib = lib[:-3] - names.add(lib) - return names - -def configure_boost(conf): - conf.to_log('boost: loading conf') - conf.load('boost') - - # Find Boost libraries by modules - conf.to_log('boost: scanning for required libs') - conf.env['REQUIRED_BOOST_LIBS'] = [] - for modules_dir in ['src', 'contrib']: - conf.recurse (modules_dir, name="get_required_boost_libs", mandatory=False) - # Check for any required boost libraries - if conf.env['REQUIRED_BOOST_LIBS'] is not []: - conf.env['REQUIRED_BOOST_LIBS'] = list(set(conf.env['REQUIRED_BOOST_LIBS'])) - conf.to_log("boost: libs required: %s" % conf.env['REQUIRED_BOOST_LIBS']) - conf.check_boost(lib=' '.join (conf.env['REQUIRED_BOOST_LIBS']), mandatory=False, required=False) - if not conf.env['LIB_BOOST']: - conf.env['LIB_BOOST'] = [] - else: - # Check with no libs, so we find the includes - conf.check_boost(mandatory=False, required=False) - - conf.to_log('boost: checking if we should define HAVE_BOOST') - if conf.env['INCLUDES_BOOST']: - conf.to_log('boost: defining HAVE_BOOST') - conf.env.append_value ('CPPFLAGS', '-DHAVE_BOOST') - - # Some boost libraries may have been found. - # Add preprocessor symbols for them - conf.to_log('boost: checking which libs are present') - if conf.env['LIB_BOOST']: - conf.boost_libs = get_boost_libs(conf.env['LIB_BOOST']) - for lib in conf.boost_libs: - msg='boost: lib present: ' + lib - if lib in conf.env['REQUIRED_BOOST_LIBS']: - have = '-DHAVE_BOOST_' + lib.upper() - conf.to_log('%s, requested, adding %s' % (msg, have)) - conf.env.append_value('CPPFLAGS', have) - else: - conf.to_log('%s, not required, ignoring' % msg) - - boost_libs_missing = [lib for lib in conf.env['REQUIRED_BOOST_LIBS'] if lib not in conf.boost_libs] - for lib in boost_libs_missing: - conf.to_log('boost: lib missing: %s' % lib) - -def bld_missing_boost_libs (bld, module, libs): - missing_boost_libs = [lib for lib in libs if lib not in bld.boost_libs] - return missing_boost_libs - -def configure(conf): - # Waf does not work correctly if the absolute path contains whitespaces - if (re.search(r"\s", os.getcwd ())): - conf.fatal('Waf does not support whitespace in the path to current working directory: %s' % os.getcwd()) - - conf.load('relocation', tooldir=['waf-tools']) - - # attach some extra methods - conf.check_nonfatal = types.MethodType(_check_nonfatal, conf) - conf.check_compilation_flag = types.MethodType(_check_compilation_flag, conf) - conf.report_optional_feature = types.MethodType(report_optional_feature, conf) - conf.check_optional_feature = types.MethodType(check_optional_feature, conf) - conf.require_boost_incs = types.MethodType(require_boost_incs, conf) - conf.missing_boost_libs = types.MethodType(conf_missing_boost_libs, conf) - conf.boost_libs = set() - conf.env['NS3_OPTIONAL_FEATURES'] = [] - - conf.load('compiler_c') - cc_string = '.'.join(conf.env['CC_VERSION']) - conf.msg('Checking for cc version',cc_string,'GREEN') - conf.load('compiler_cxx') - conf.load('cflags', tooldir=['waf-tools']) - conf.load('command', tooldir=['waf-tools']) - conf.load('gnu_dirs') - conf.load('clang_compilation_database', tooldir=['waf-tools']) - - env = conf.env - - if Options.options.enable_gcov: - env['GCOV_ENABLED'] = True - env.append_value('CCFLAGS', '-fprofile-arcs') - env.append_value('CCFLAGS', '-ftest-coverage') - env.append_value('CXXFLAGS', '-fprofile-arcs') - env.append_value('CXXFLAGS', '-ftest-coverage') - env.append_value('LINKFLAGS', '-lgcov') - env.append_value('LINKFLAGS', '-coverage') - - if Options.options.build_profile == 'debug': - env.append_value('DEFINES', 'NS3_BUILD_PROFILE_DEBUG') - env.append_value('DEFINES', 'NS3_ASSERT_ENABLE') - env.append_value('DEFINES', 'NS3_LOG_ENABLE') - - if Options.options.build_profile == 'release': - env.append_value('DEFINES', 'NS3_BUILD_PROFILE_RELEASE') - - if Options.options.build_profile == 'optimized': - env.append_value('DEFINES', 'NS3_BUILD_PROFILE_OPTIMIZED') - - if Options.options.enable_logs: - env.append_unique('DEFINES', 'NS3_LOG_ENABLE') - if Options.options.enable_asserts: - env.append_unique('DEFINES', 'NS3_ASSERT_ENABLE') - - env['PLATFORM'] = sys.platform - env['BUILD_PROFILE'] = Options.options.build_profile - if Options.options.build_profile == "release": - env['BUILD_SUFFIX'] = '' - else: - env['BUILD_SUFFIX'] = '-'+Options.options.build_profile - - env['APPNAME'] = wutils.APPNAME - env['VERSION'] = wutils.VERSION - - if conf.env['CXX_NAME'] in ['gcc']: - if tuple(map(int, conf.env['CC_VERSION'])) < gcc_min_version: - conf.fatal('gcc version %s older than minimum supported version %s' % - ('.'.join(conf.env['CC_VERSION']), '.'.join(map(str, gcc_min_version)))) - - if conf.env['CXX_NAME'] in ['gcc', 'icc']: - env.append_value('CXXFLAGS', '-fno-semantic-interposition') - if Options.options.build_profile == 'release': - env.append_value('CXXFLAGS', '-fomit-frame-pointer') - if Options.options.build_profile == 'optimized': - if conf.check_compilation_flag('-march=native'): - env.append_value('CXXFLAGS', '-march=native') - env.append_value('CXXFLAGS', '-fstrict-overflow') - if conf.env['CXX_NAME'] in ['gcc']: - env.append_value('CXXFLAGS', '-Wstrict-overflow=2') - - if sys.platform == 'win32': - env.append_value("LINKFLAGS", "-Wl,--enable-runtime-pseudo-reloc") - elif sys.platform == 'cygwin': - env.append_value("LINKFLAGS", "-Wl,--enable-auto-import") - - cxx = env['CXX'] - cxx_check_libstdcxx = cxx + ['-print-file-name=libstdc++.so'] - p = subprocess.Popen(cxx_check_libstdcxx, stdout=subprocess.PIPE) - libstdcxx_output = maybe_decode(p.stdout.read().strip()) - libstdcxx_location = os.path.dirname(libstdcxx_output) - p.wait() - if libstdcxx_location: - conf.env.append_value('NS3_MODULE_PATH', libstdcxx_location) - - if Utils.unversioned_sys_platform() in ['linux']: - if conf.check_compilation_flag('-Wl,--soname=foo'): - env['WL_SONAME_SUPPORTED'] = True - - # bug 2181 on clang warning suppressions - if conf.env['CXX_NAME'] in ['clang']: - if Utils.unversioned_sys_platform() == 'darwin': - if tuple(map(int, conf.env['CC_VERSION'])) >= darwin_clang_version_warn_unused_local_typedefs: - env.append_value('CXXFLAGS', '-Wno-unused-local-typedefs') - - if tuple(map(int, conf.env['CC_VERSION'])) >= darwin_clang_version_warn_potentially_evaluated: - - env.append_value('CXXFLAGS', '-Wno-potentially-evaluated-expression') - - else: - if tuple(map(int, conf.env['CC_VERSION'])) >= clang_version_warn_unused_local_typedefs: - - env.append_value('CXXFLAGS', '-Wno-unused-local-typedefs') - - if tuple(map(int, conf.env['CC_VERSION'])) >= clang_version_warn_potentially_evaluated: - env.append_value('CXXFLAGS', '-Wno-potentially-evaluated-expression') - - env['ENABLE_STATIC_NS3'] = False - if Options.options.enable_static: - if Utils.unversioned_sys_platform() == 'darwin': - if conf.check_compilation_flag(flag=[], linkflags=['-Wl,-all_load']): - conf.report_optional_feature("static", "Static build", True, '') - env['ENABLE_STATIC_NS3'] = True - else: - conf.report_optional_feature("static", "Static build", False, - "Link flag -Wl,-all_load does not work") - else: - if conf.check_compilation_flag(flag=[], linkflags=['-Wl,--whole-archive,-Bstatic', '-Wl,-Bdynamic,--no-whole-archive']): - conf.report_optional_feature("static", "Static build", True, '') - env['ENABLE_STATIC_NS3'] = True - else: - conf.report_optional_feature("static", "Static build", False, - "Link flag -Wl,--whole-archive,-Bstatic does not work") - - # Checks if environment variable specifies the C++ language standard and/or - # if the user has specified the standard via the -cxx-standard argument - # to 'waf configure'. The following precedence and behavior is implemented: - # 1) if user does not specify anything, Waf will use the default standard - # configured for ns-3, which is configured below - # 2) if user specifies the '-cxx-standard' option, it will be used instead - # of the default. - # Example: ./waf configure --cxx-standard=-std=c++14 - # 3) if user specifies the C++ standard via the CXXFLAGS environment - # variable, it will be used instead of the default. - # Example: CXXFLAGS="-std=c++14" ./waf configure - # 4) if user specifies both the CXXFLAGS environment variable and the - # -cxx-standard argument, the latter will take precedence and a warning - # will be emitted in the configure output if there were conflicting - # standards between the two. - # Example: CXXFLAGS="-std=c++14" ./waf configure --cxx-standard=-std=c++17 - # (in the above scenario, Waf will use c++17 but warn about it) - # Note: If the C++ standard is not recognized, configuration will error exit - cxx_standard = "" - cxx_standard_env = "" - for flag in env['CXXFLAGS']: - if flag[:5] == "-std=": - cxx_standard_env = flag - - if not cxx_standard_env and Options.options.cxx_standard: - cxx_standard = Options.options.cxx_standard - env.append_value('CXXFLAGS', cxx_standard) - elif cxx_standard_env and not Options.options.cxx_standard: - cxx_standard = cxx_standard_env - # No need to change CXXFLAGS - elif cxx_standard_env and Options.options.cxx_standard and cxx_standard_env != Options.options.cxx_standard: - Logs.warn("user-specified --cxx-standard (" + - Options.options.cxx_standard + ") does not match the value in CXXFLAGS (" + cxx_standard_env + "); Waf will use the --cxx-standard value") - cxx_standard = Options.options.cxx_standard - env['CXXFLAGS'].remove(cxx_standard_env) - env.append_value('CXXFLAGS', cxx_standard) - elif cxx_standard_env and Options.options.cxx_standard and cxx_standard_env == Options.options.cxx_standard: - cxx_standard = Options.options.cxx_standard - # No need to change CXXFLAGS - elif not cxx_standard and not Options.options.cxx_standard: - cxx_standard = "-std=c++17" - env.append_value('CXXFLAGS', cxx_standard) - - if not conf.check_compilation_flag(cxx_standard): - raise Errors.ConfigurationError("Exiting because C++ standard value " + cxx_standard + " is not recognized") - - # Handle boost - configure_boost(conf) - - # Set this so that the lists won't be printed at the end of this - # configure command. - conf.env['PRINT_BUILT_MODULES_AT_END'] = False - - conf.env['MODULES_NOT_BUILT'] = [] - - conf.recurse('bindings/python') - - conf.recurse('src') - conf.recurse('contrib') - - # Set the list of enabled modules. - if Options.options.enable_modules: - # Use the modules explicitly enabled. - _enabled_mods = [] - _enabled_contrib_mods = [] - for mod in Options.options.enable_modules.split(','): - if mod in conf.env['NS3_MODULES'] and mod.startswith('ns3-'): - _enabled_mods.append(mod) - elif 'ns3-' + mod in conf.env['NS3_MODULES']: - _enabled_mods.append('ns3-' + mod) - elif mod in conf.env['NS3_CONTRIBUTED_MODULES'] and mod.startswith('ns3-'): - _enabled_contrib_mods.append(mod) - elif 'ns3-' + mod in conf.env['NS3_CONTRIBUTED_MODULES']: - _enabled_contrib_mods.append('ns3-' + mod) - conf.env['NS3_ENABLED_MODULES'] = _enabled_mods - conf.env['NS3_ENABLED_CONTRIBUTED_MODULES'] = _enabled_contrib_mods - - else: - # Use the enabled modules list from the ns3 configuration file. - if modules_enabled[0] == 'all_modules': - # Enable all modules if requested. - conf.env['NS3_ENABLED_MODULES'] = conf.env['NS3_MODULES'] - conf.env['NS3_ENABLED_CONTRIBUTED_MODULES'] = conf.env['NS3_CONTRIBUTED_MODULES'] - else: - # Enable the modules from the list. - _enabled_mods = [] - _enabled_contrib_mods = [] - for mod in modules_enabled: - if mod in conf.env['NS3_MODULES'] and mod.startswith('ns3-'): - _enabled_mods.append(mod) - elif 'ns3-' + mod in conf.env['NS3_MODULES']: - _enabled_mods.append('ns3-' + mod) - elif mod in conf.env['NS3_CONTRIBUTED_MODULES'] and mod.startswith('ns3-'): - _enabled_contrib_mods.append(mod) - elif 'ns3-' + mod in conf.env['NS3_CONTRIBUTED_MODULES']: - _enabled_contrib_mods.append('ns3-' + mod) - conf.env['NS3_ENABLED_MODULES'] = _enabled_mods - conf.env['NS3_ENABLED_CONTRIBUTED_MODULES'] = _enabled_contrib_mods - - # Add the template module to the list of enabled modules that - # should not be built if this is a static build on Darwin. They - # don't work there for the template module, and this is probably - # because the template module has no source files. - if conf.env['ENABLE_STATIC_NS3'] and sys.platform == 'darwin': - conf.env['MODULES_NOT_BUILT'].append('template') - - # Remove these modules from the list of enabled modules. - for not_built in conf.env['MODULES_NOT_BUILT']: - not_built_name = 'ns3-' + not_built - if not_built_name in conf.env['NS3_ENABLED_MODULES']: - conf.env['NS3_ENABLED_MODULES'].remove(not_built_name) - if not conf.env['NS3_ENABLED_MODULES']: - raise WafError('Exiting because the ' + not_built + ' module can not be built and it was the only one enabled.') - elif not_built_name in conf.env['NS3_ENABLED_CONTRIBUTED_MODULES']: - conf.env['NS3_ENABLED_CONTRIBUTED_MODULES'].remove(not_built_name) - - # for suid bits - try: - conf.find_program('sudo', var='SUDO') - except WafError: - pass - - why_not_sudo = "because we like it" - if Options.options.enable_sudo and conf.env['SUDO']: - env['ENABLE_SUDO'] = True - else: - env['ENABLE_SUDO'] = False - if Options.options.enable_sudo: - why_not_sudo = "program sudo not found" - else: - why_not_sudo = "option --enable-sudo not selected" - - conf.report_optional_feature("ENABLE_SUDO", "Use sudo to set suid bit", env['ENABLE_SUDO'], why_not_sudo) - - # Decide if tests will be built or not. - if Options.options.enable_tests: - # Tests were explicitly enabled. - env['ENABLE_TESTS'] = True - why_not_tests = "option --enable-tests selected" - elif Options.options.disable_tests: - # Tests were explicitly disabled. - env['ENABLE_TESTS'] = False - why_not_tests = "option --disable-tests selected" - else: - # Enable tests based on the ns3 configuration file. - env['ENABLE_TESTS'] = tests_enabled - if config_file_exists: - why_not_tests = "based on configuration file" - elif tests_enabled: - why_not_tests = "defaults to enabled" - else: - why_not_tests = "defaults to disabled" - - conf.report_optional_feature("ENABLE_TESTS", "Tests", env['ENABLE_TESTS'], why_not_tests) - - # Decide if examples will be built or not. - if Options.options.enable_examples: - # Examples were explicitly enabled. - env['ENABLE_EXAMPLES'] = True - why_not_examples = "option --enable-examples selected" - elif Options.options.disable_examples: - # Examples were explicitly disabled. - env['ENABLE_EXAMPLES'] = False - why_not_examples = "option --disable-examples selected" - else: - # Enable examples based on the ns3 configuration file. - env['ENABLE_EXAMPLES'] = examples_enabled - if config_file_exists: - why_not_examples = "based on configuration file" - elif examples_enabled: - why_not_examples = "defaults to enabled" - else: - why_not_examples = "defaults to disabled" - - conf.report_optional_feature("ENABLE_EXAMPLES", "Examples", env['ENABLE_EXAMPLES'], - why_not_examples) - try: - for dir in os.listdir('examples'): - if dir.startswith('.') or dir == 'CVS': - continue - conf.env.append_value('EXAMPLE_DIRECTORIES', dir) - except OSError: - return - - env['VALGRIND_FOUND'] = False - try: - conf.find_program('valgrind', var='VALGRIND') - env['VALGRIND_FOUND'] = True - except WafError: - pass - - # These flags are used for the implicitly dependent modules. - if env['ENABLE_STATIC_NS3']: - if sys.platform == 'darwin': - env.STLIB_MARKER = '-Wl,-all_load' - else: - env.STLIB_MARKER = '-Wl,--whole-archive,-Bstatic' - env.SHLIB_MARKER = '-Wl,-Bdynamic,--no-whole-archive' - - - have_gsl = conf.check_cfg(package='gsl', args=['--cflags', '--libs'], - uselib_store='GSL', mandatory=False) - conf.env['ENABLE_GSL'] = have_gsl - conf.report_optional_feature("GSL", "GNU Scientific Library (GSL)", - conf.env['ENABLE_GSL'], - "GSL not found") - - why_not_desmetrics = "defaults to disabled" - if Options.options.enable_desmetrics: - conf.env['ENABLE_DES_METRICS'] = True - env.append_value('DEFINES', 'ENABLE_DES_METRICS') - why_not_desmetrics = "option --enable-des-metrics selected" - conf.report_optional_feature("DES Metrics", "DES Metrics event collection", conf.env['ENABLE_DES_METRICS'], why_not_desmetrics) - - - # for compiling C code, copy over the CXX* flags - conf.env.append_value('CCFLAGS', conf.env['CXXFLAGS']) - - def add_gcc_flag(flag): - if env['COMPILER_CXX'] == 'g++' and 'CXXFLAGS' not in os.environ: - if conf.check_compilation_flag(flag, mode='cxx'): - env.append_value('CXXFLAGS', flag) - if env['COMPILER_CC'] == 'gcc' and 'CCFLAGS' not in os.environ: - if conf.check_compilation_flag(flag, mode='cc'): - env.append_value('CCFLAGS', flag) - - add_gcc_flag('-fstrict-aliasing') - add_gcc_flag('-Wstrict-aliasing') - - try: - conf.find_program('doxygen', var='DOXYGEN') - except WafError: - pass - - # append user defined flags after all our ones - for (confvar, envvar) in [['CCFLAGS', 'CCFLAGS_EXTRA'], - ['CXXFLAGS', 'CXXFLAGS_EXTRA'], - ['LINKFLAGS', 'LINKFLAGS_EXTRA'], - ['LINKFLAGS', 'LDFLAGS_EXTRA']]: - if envvar in os.environ: - value = shlex.split(os.environ[envvar]) - conf.env.append_value(confvar, value) - - print_config(env) - - -class SuidBuild_task(Task.Task): - """task that makes a binary Suid - """ - after = ['cxxprogram', 'cxxshlib', 'cxxstlib'] - def __init__(self, *args, **kwargs): - super(SuidBuild_task, self).__init__(*args, **kwargs) - self.m_display = 'build-suid' - try: - program_obj = wutils.find_program(self.generator.name, self.generator.env) - except ValueError as ex: - raise WafError(str(ex)) - program_node = program_obj.path.find_or_declare(program_obj.target) - self.filename = program_node.get_bld().abspath() - - - def run(self): - print('setting suid bit on executable ' + self.filename, file=sys.stderr) - if subprocess.Popen(['sudo', 'chown', 'root', self.filename]).wait(): - return 1 - if subprocess.Popen(['sudo', 'chmod', 'u+s', self.filename]).wait(): - return 1 - return 0 - - def runnable_status(self): - "RUN_ME SKIP_ME or ASK_LATER" - try: - st = os.stat(self.filename) - except OSError: - return Task.ASK_LATER - if st.st_uid == 0: - return Task.SKIP_ME - else: - return Task.RUN_ME - -def create_suid_program(bld, name): - grp = bld.current_group - bld.add_group() # this to make sure no two sudo tasks run at the same time - program = bld(features='cxx cxxprogram') - program.is_ns3_program = True - program.module_deps = list() - program.name = name - program.target = "%s%s-%s%s" % (wutils.APPNAME, wutils.VERSION, name, bld.env.BUILD_SUFFIX) - - if bld.env['ENABLE_SUDO']: - program.create_task("SuidBuild_task") - - bld.set_group(grp) - - return program - -def create_ns3_program(bld, name, dependencies=('core',)): - program = bld(features='cxx cxxprogram') - - program.is_ns3_program = True - program.name = name - program.target = "%s%s-%s%s" % (wutils.APPNAME, wutils.VERSION, name, bld.env.BUILD_SUFFIX) - # Each of the modules this program depends on has its own library. - program.ns3_module_dependencies = ['ns3-'+dep for dep in dependencies] - program.includes = Context.out_dir - #make a copy here to prevent additions to program.use from polluting program.ns3_module_dependencies - program.use = program.ns3_module_dependencies.copy() - if program.env['ENABLE_STATIC_NS3']: - if sys.platform == 'darwin': - program.env.STLIB_MARKER = '-Wl,-all_load' - else: - program.env.STLIB_MARKER = '-Wl,-Bstatic,--whole-archive' - program.env.SHLIB_MARKER = '-Wl,-Bdynamic,--no-whole-archive' - else: - if program.env.DEST_BINFMT == 'elf': - # All ELF platforms are impacted but only the gcc compiler has a flag to fix it. - if 'gcc' in (program.env.CXX_NAME, program.env.CC_NAME): - program.env.append_value ('SHLIB_MARKER', '-Wl,--no-as-needed') - - return program - -def register_ns3_script(bld, name, dependencies=('core',)): - ns3_module_dependencies = ['ns3-'+dep for dep in dependencies] - bld.env.append_value('NS3_SCRIPT_DEPENDENCIES', [(name, ns3_module_dependencies)]) - -def add_examples_programs(bld): - env = bld.env - if env['ENABLE_EXAMPLES']: - # Add a define, so this is testable from code - env.append_value('DEFINES', 'NS3_ENABLE_EXAMPLES') - - try: - for dir in os.listdir('examples'): - if dir.startswith('.') or dir == 'CVS': - continue - if os.path.isdir(os.path.join('examples', dir)): - bld.recurse(os.path.join('examples', dir)) - except OSError: - return - -def add_scratch_programs(bld): - all_modules = [mod[len("ns3-"):] for mod in bld.env['NS3_ENABLED_MODULES'] + bld.env['NS3_ENABLED_CONTRIBUTED_MODULES']] - - try: - for filename in os.listdir("scratch"): - if filename.startswith('.') or filename == 'CVS': - continue - if os.path.isdir(os.path.join("scratch", filename)): - obj = bld.create_ns3_program(filename, all_modules) - obj.path = obj.path.find_dir('scratch').find_dir(filename) - obj.source = obj.path.ant_glob('*.cc') - obj.target = filename - obj.name = obj.target - obj.install_path = None - elif filename.endswith(".cc"): - name = filename[:-len(".cc")] - obj = bld.create_ns3_program(name, all_modules) - obj.path = obj.path.find_dir('scratch') - obj.source = filename - obj.target = name - obj.name = obj.target - obj.install_path = None - except OSError: - return - -def _get_all_task_gen(self): - for group in self.groups: - for taskgen in group: - yield taskgen - - -# ok, so WAF does not provide an API to prevent an -# arbitrary taskgen from running; we have to muck around with -# WAF internal state, something that might stop working if -# WAF is upgraded... -def _exclude_taskgen(self, taskgen): - for group in self.groups: - for tg1 in group: - if tg1 is taskgen: - group.remove(tg1) - break - else: - continue - break - - -def _find_ns3_module(self, name): - for obj in _get_all_task_gen(self): - # disable the modules themselves - if hasattr(obj, "is_ns3_module") and obj.name == name: - return obj - raise KeyError(name) - -# Parse the waf lockfile generated by latest 'configure' operation -def get_build_profile(env=None): - if env: - return Options.options.build_profile - - lockfile = os.environ.get('WAFLOCK', '.lock-waf_%s_build' % sys.platform) - with open(lockfile, "r") as f: - for line in f: - if line.startswith("options ="): - _, val = line.split('=', 1) - for x in val.split(','): - optkey, optval = x.split(':') - if (optkey.lstrip() == '\'build_profile\''): - return str(optval.lstrip()).replace("'","") - - return "not found" - -def build(bld): - env = bld.env - - if Options.options.check_config: - print_config(env, 'build') - else: - if Options.options.check_profile: - profile = get_build_profile() - print("Build profile: %s" % profile) - - if Options.options.check_profile or Options.options.check_config: - raise SystemExit(0) - return - - # If --enabled-modules option was given, then print a warning - # message and exit this function. - if Options.options.enable_modules: - Logs.warn("No modules were built. Use waf configure --enable-modules to enable modules.") - return - - bld.env['NS3_MODULES_WITH_TEST_LIBRARIES'] = [] - bld.env['NS3_ENABLED_MODULE_TEST_LIBRARIES'] = [] - bld.env['NS3_SCRIPT_DEPENDENCIES'] = [] - bld.env['NS3_RUNNABLE_PROGRAMS'] = [] - bld.env['NS3_RUNNABLE_SCRIPTS'] = [] - - wutils.bld = bld - if Options.options.no_task_lines: - from waflib import Runner - def null_printout(s): - pass - Runner.printout = null_printout - - Options.cwd_launch = bld.path.abspath() - bld.create_ns3_program = types.MethodType(create_ns3_program, bld) - bld.register_ns3_script = types.MethodType(register_ns3_script, bld) - bld.create_suid_program = types.MethodType(create_suid_program, bld) - bld.__class__.all_task_gen = property(_get_all_task_gen) - bld.exclude_taskgen = types.MethodType(_exclude_taskgen, bld) - bld.find_ns3_module = types.MethodType(_find_ns3_module, bld) - bld.missing_boost_libs = types.MethodType(bld_missing_boost_libs, bld) - - # Clean documentation build directories; other cleaning happens later - if bld.cmd == 'clean': - _cleandocs() - - # Cache available boost lib names - bld.boost_libs = set() - if bld.env['LIB_BOOST']: - bld.boost_libs = get_boost_libs(bld.env['LIB_BOOST']) - - - # process subfolders from here - bld.recurse('src') - bld.recurse('contrib') - - # If modules have been enabled, then set lists of enabled modules - # and enabled module test libraries. - if env['NS3_ENABLED_MODULES'] or env['NS3_ENABLED_CONTRIBUTED_MODULES']: - - modules = env['NS3_ENABLED_MODULES'] - contribModules = env['NS3_ENABLED_CONTRIBUTED_MODULES'] - - # Find out about additional modules that need to be enabled - # due to dependency constraints. - changed = True - while changed: - changed = False - for module in modules + contribModules: - module_obj = bld.get_tgen_by_name(module) - if module_obj is None: - raise ValueError("module %s not found" % module) - # Each enabled module has its own library. - for dep in module_obj.use: - if not dep.startswith('ns3-'): - continue - if dep not in modules and dep not in contribModules: - if dep in env['NS3_MODULES']: - modules.append(dep) - changed = True - elif dep in env['NS3_CONTRIBUTED_MODULES']: - contribModules.append(dep) - changed = True - else: - Logs.error("Error: Cannot find dependency \'" + dep[4:] + "\' of module \'" - + module[4:] + "\'; check the module wscript for errors.") - raise SystemExit(1) - - env['NS3_ENABLED_MODULES'] = modules - - env['NS3_ENABLED_CONTRIBUTED_MODULES'] = contribModules - - # If tests are being built, then set the list of the enabled - # module test libraries. - if env['ENABLE_TESTS']: - for (mod, testlib) in bld.env['NS3_MODULES_WITH_TEST_LIBRARIES']: - if mod in bld.env['NS3_ENABLED_MODULES'] or mod in bld.env['NS3_ENABLED_CONTRIBUTED_MODULES']: - bld.env.append_value('NS3_ENABLED_MODULE_TEST_LIBRARIES', testlib) - - add_examples_programs(bld) - add_scratch_programs(bld) - - if env['NS3_ENABLED_MODULES'] or env['NS3_ENABLED_CONTRIBUTED_MODULES']: - modules = env['NS3_ENABLED_MODULES'] - contribModules = env['NS3_ENABLED_CONTRIBUTED_MODULES'] - - # Exclude the programs other misc task gens that depend on disabled modules - for obj in list(bld.all_task_gen): - - # check for ns3moduleheader_taskgen - if 'ns3moduleheader' in getattr(obj, "features", []): - if ("ns3-%s" % obj.module) not in modules and ("ns3-%s" % obj.module) not in contribModules: - obj.mode = 'remove' # tell it to remove headers instead of installing - - # check for programs - if hasattr(obj, 'ns3_module_dependencies'): - # this is an NS-3 program (bld.create_ns3_program) - program_built = True - for dep in obj.ns3_module_dependencies: - if dep not in modules and dep not in contribModules: # prog. depends on a module that isn't enabled? - bld.exclude_taskgen(obj) - program_built = False - break - - # Add this program to the list if all of its - # dependencies will be built. - if program_built: - object_name = "%s%s-%s%s" % (wutils.APPNAME, wutils.VERSION, - obj.name, bld.env.BUILD_SUFFIX) - - # Get the relative path to the program from the - # launch directory. - launch_dir = os.path.abspath(Context.launch_dir) - object_relative_path = os.path.join( - wutils.relpath(obj.path.get_bld().abspath(), launch_dir), - object_name) - - bld.env.append_value('NS3_RUNNABLE_PROGRAMS', object_relative_path) - - # disable the modules themselves - if hasattr(obj, "is_ns3_module") and obj.name not in modules and obj.name not in contribModules: - bld.exclude_taskgen(obj) # kill the module - - # disable the module test libraries - if hasattr(obj, "is_ns3_module_test_library"): - if not env['ENABLE_TESTS'] or ((obj.module_name not in modules) and (obj.module_name not in contribModules)) : - bld.exclude_taskgen(obj) # kill the module test library - - # disable the ns3header_taskgen - if 'ns3header' in getattr(obj, "features", []): - if ("ns3-%s" % obj.module) not in modules and ("ns3-%s" % obj.module) not in contribModules: - obj.mode = 'remove' # tell it to remove headers instead of installing - - # disable the ns3privateheader_taskgen - if 'ns3privateheader' in getattr(obj, "features", []): - if ("ns3-%s" % obj.module) not in modules and ("ns3-%s" % obj.module) not in contribModules: - - obj.mode = 'remove' # tell it to remove headers instead of installing - - # disable pcfile taskgens for disabled modules - if 'ns3pcfile' in getattr(obj, "features", []): - if obj.module not in bld.env.NS3_ENABLED_MODULES and obj.module not in bld.env.NS3_ENABLED_CONTRIBUTED_MODULES: - bld.exclude_taskgen(obj) - - # disable python bindings for disabled modules - if 'pybindgen' in obj.name: - if ("ns3-%s" % obj.module) not in modules and ("ns3-%s" % obj.module) not in contribModules: - bld.exclude_taskgen(obj) - if 'pyext' in getattr(obj, "features", []): - if ("ns3-%s" % obj.module) not in modules and ("ns3-%s" % obj.module) not in contribModules: - bld.exclude_taskgen(obj) - - - if env['NS3_ENABLED_MODULES']: - env['NS3_ENABLED_MODULES'] = list(modules) - - if env['NS3_ENABLED_CONTRIBUTED_MODULES']: - env['NS3_ENABLED_CONTRIBUTED_MODULES'] = list(contribModules) - - # Determine which scripts will be runnable. - for (script, dependencies) in bld.env['NS3_SCRIPT_DEPENDENCIES']: - script_runnable = True - for dep in dependencies: - if dep not in modules and dep not in contribModules: - script_runnable = False - break - - # Add this script to the list if all of its dependencies will - # be built. - if script_runnable: - bld.env.append_value('NS3_RUNNABLE_SCRIPTS', script) - - bld.recurse('bindings/python') - - # Process this subfolder here after the lists of enabled modules - # and module test libraries have been set. - bld.recurse('utils') - - # Set this so that the lists will be printed at the end of this - # build command. - bld.env['PRINT_BUILT_MODULES_AT_END'] = True - - # Do not print the modules built if build command was "clean" - if bld.cmd == 'clean': - bld.env['PRINT_BUILT_MODULES_AT_END'] = False - - if Options.options.run: - # Check that the requested program name is valid - program_name, dummy_program_argv = wutils.get_run_program(Options.options.run, wutils.get_command_template(env)) - - # When --run'ing a program, tell WAF to only build that program, - # nothing more; this greatly speeds up compilation when all you - # want to do is run a test program. - Options.options.targets += ',' + os.path.basename(program_name) - if getattr(Options.options, "visualize", False): - program_obj = wutils.find_program(program_name, bld.env) - program_obj.use.append('ns3-visualizer') - for gen in bld.all_task_gen: - if type(gen).__name__ in ['ns3header_taskgen', 'ns3privateheader_taskgen', 'ns3moduleheader_taskgen']: - gen.post() - - if Options.options.run or Options.options.pyrun: - bld.env['PRINT_BUILT_MODULES_AT_END'] = False - - if Options.options.doxygen_no_build: - _doxygen(bld, skip_pid=True) - raise SystemExit(0) - - if Options.options.run_no_build: - # Check that the requested program name is valid - program_name, dummy_program_argv = wutils.get_run_program(Options.options.run_no_build, wutils.get_command_template(bld.env)) - # Run the program - wutils.run_program(Options.options.run_no_build, bld.env, wutils.get_command_template(bld.env), visualize=Options.options.visualize) - raise SystemExit(0) - - if Options.options.pyrun_no_build: - wutils.run_python_program(Options.options.pyrun_no_build, bld.env, - visualize=Options.options.visualize) - raise SystemExit(0) - -def _cleandir(name): - try: - shutil.rmtree(name) - except: - pass - -def _cleandocs(): - _cleandir('doc/html') - _cleandir('doc/html-warn') - _cleandir('doc/manual/build') - _cleandir('doc/manual/source-temp') - _cleandir('doc/tutorial/build') - _cleandir('doc/models/build') - _cleandir('doc/models/source-temp') - _cleandir('doc/contributing/build') - -# 'distclean' typically only cleans out build/ directory -# Here we clean out any build or documentation artifacts not in build/ -def distclean(ctx): - _cleandocs() - # Now call waf's normal distclean - Scripting.distclean(ctx) - -def shutdown(ctx): - bld = wutils.bld - if wutils.bld is None: - return - env = bld.env - - # Only print the lists if a build was done. - if (env['PRINT_BUILT_MODULES_AT_END']): - - # Print the list of built modules. - print() - print('Modules built:') - names_without_prefix = [] - for name in env['NS3_ENABLED_MODULES'] + env['NS3_ENABLED_CONTRIBUTED_MODULES']: - name1 = name[len('ns3-'):] - if name not in env.MODULAR_BINDINGS_MODULES: - name1 += " (no Python)" - names_without_prefix.append(name1) - print_module_names(names_without_prefix) - print() - - # Print the list of enabled modules that were not built. - if env['MODULES_NOT_BUILT']: - print('Modules not built (see ns-3 tutorial for explanation):') - print_module_names(env['MODULES_NOT_BUILT']) - print() - - # Set this so that the lists won't be printed until the next - # build is done. - bld.env['PRINT_BUILT_MODULES_AT_END'] = False - - # Write the build status file. - build_status_file = os.path.join(bld.out_dir, 'build-status.py') - with open(build_status_file, 'w') as out: - out.write('#! /usr/bin/env python3\n') - out.write('\n') - out.write('# Programs that are runnable.\n') - out.write('ns3_runnable_programs = ' + str(env['NS3_RUNNABLE_PROGRAMS']) + '\n') - out.write('\n') - out.write('# Scripts that are runnable.\n') - out.write('ns3_runnable_scripts = ' + str(env['NS3_RUNNABLE_SCRIPTS']) + '\n') - out.write('\n') - - if Options.options.lcov_report: - lcov_report(bld) - - if Options.options.lcov_zerocounters: - lcov_zerocounters(bld) - - if Options.options.run: - wutils.run_program(Options.options.run, env, wutils.get_command_template(env), - visualize=Options.options.visualize) - raise SystemExit(0) - - if Options.options.pyrun: - wutils.run_python_program(Options.options.pyrun, env, - visualize=Options.options.visualize) - raise SystemExit(0) - - if Options.options.shell: - raise WafError("Please run `./waf shell' now, instead of `./waf --shell'") - - if Options.options.check: - raise WafError("Please run `./test.py' now, instead of `./waf --check'") - - check_shell(bld) - - - -class CheckContext(Context.Context): - """run the equivalent of the old ns-3 unit tests using test.py""" - cmd = 'check' - def execute(self): - # first we execute the build - bld = Context.create_context("build") - bld.options = Options.options # provided for convenience - bld.cmd = "build" - bld.execute() - - wutils.bld = bld - wutils.run_python_program("test.py -n -c core", bld.env) - -def check_shell(bld): - if ('NS3_MODULE_PATH' not in os.environ) or ('NS3_EXECUTABLE_PATH' not in os.environ): - return - env = bld.env - correct_modpath = os.pathsep.join(env['NS3_MODULE_PATH']) - found_modpath = os.environ['NS3_MODULE_PATH'] - correct_execpath = os.pathsep.join(env['NS3_EXECUTABLE_PATH']) - found_execpath = os.environ['NS3_EXECUTABLE_PATH'] - if (found_modpath != correct_modpath) or (correct_execpath != found_execpath): - msg = ("Detected shell (./waf shell) with incorrect configuration\n" - "=========================================================\n" - "Possible reasons for this problem:\n" - " 1. You switched to another ns-3 tree from inside this shell\n" - " 2. You switched ns-3 debug level (waf configure --debug)\n" - " 3. You modified the list of built ns-3 modules\n" - "You should correct this situation before running any program. Possible solutions:\n" - " 1. Exit this shell, and start a new one\n" - " 2. Run a new nested shell") - raise WafError(msg) - - -class Ns3ShellContext(Context.Context): - """run a shell with an environment suitably modified to run locally built programs""" - cmd = 'shell' - - def execute(self): - # first we execute the build - bld = Context.create_context("build") - bld.options = Options.options # provided for convenience - bld.cmd = "build" - bld.execute() - - # Set this so that the lists won't be printed when the user - # exits the shell. - bld.env['PRINT_BUILT_MODULES_AT_END'] = False - - if sys.platform == 'win32': - shell = os.environ.get("COMSPEC", "cmd.exe") - else: - shell = os.environ.get("SHELL", "/bin/sh") - - env = bld.env - os_env = { - 'NS3_MODULE_PATH': os.pathsep.join(env['NS3_MODULE_PATH']), - 'NS3_EXECUTABLE_PATH': os.pathsep.join(env['NS3_EXECUTABLE_PATH']), - } - wutils.run_argv([shell], env, os_env) - - -def _print_introspected_doxygen(bld): - env = wutils.bld.env - proc_env = wutils.get_proc_env() - try: - program_obj = wutils.find_program('print-introspected-doxygen', env) - except ValueError: - Logs.warn("print-introspected-doxygen does not exist") - raise SystemExit(1) - return - - prog = program_obj.path.find_or_declare(program_obj.target).get_bld().abspath() - - if not os.path.exists(prog): - Logs.error("print-introspected-doxygen has not been built yet." - " You need to build ns-3 at least once before " - "generating doxygen docs...") - raise SystemExit(1) - - Logs.info("Running print-introspected-doxygen") - - # Create a header file with the introspected information. - with open(os.path.join('doc', 'introspected-doxygen.h'), 'w') as doxygen_out: - if subprocess.Popen([prog], stdout=doxygen_out, env=proc_env).wait(): - raise SystemExit(1) - - # Create a text file with the introspected information. - with open(os.path.join('doc', 'ns3-object.txt'), 'w') as text_out: - if subprocess.Popen([prog, '--output-text'], stdout=text_out, env=proc_env).wait(): - raise SystemExit(1) - - # Gather the CommandLine doxy - # test.py appears not to create or keep the output directory - # if no real tests are run, so we just stuff all the - # .command-line output files into testpy-output/ - # NS_COMMANDLINE_INTROSPECTION=".." test.py -n --constrain=example - Logs.info("Running CommandLine introspection") - proc_env['NS_COMMANDLINE_INTROSPECTION'] = '..' - subprocess.run(["./test.py", "-n", "--constrain=example"], - env=proc_env, stdout=subprocess.DEVNULL) - - doxygen_out = os.path.join('doc', 'introspected-command-line.h') - try: - os.remove(doxygen_out) - except OSError as e: - pass - - with open(doxygen_out, 'w') as out_file: - lines=""" -/* This file is automatically generated by -CommandLine::PrintDoxygenUsage() from the CommandLine configuration -in various example programs. Do not edit this file! Edit the -CommandLine configuration in those files instead. -*/\n -""" - out_file.write(lines) - - with open(doxygen_out,'a') as outfile: - for in_file in glob.glob('testpy-output/*.command-line'): - with open(in_file,'r') as infile: - outfile.write(infile.read()) - -def _doxygen(bld, skip_pid=False): - env = wutils.bld.env - proc_env = wutils.get_proc_env() - - if not env['DOXYGEN']: - Logs.error("waf configure did not detect doxygen in the system -> cannot build api docs.") - raise SystemExit(1) - return - - if not skip_pid: - _print_introspected_doxygen(bld) - - _getVersion() - doxygen_config = os.path.join('doc', 'doxygen.conf') - if subprocess.Popen(env['DOXYGEN'] + [doxygen_config]).wait(): - Logs.error("Doxygen build returned an error.") - raise SystemExit(1) - -def _docset(bld): - # Get the doxygen config - doxyfile = os.path.join('doc', 'doxygen.conf') - Logs.info("docset: reading " + doxyfile) - with open(doxyfile, 'r') as doxygen_config: - doxygen_config_contents = doxygen_config.read() - - # Create the output directory - docset_path = os.path.join('doc', 'docset') - Logs.info("docset: checking for output directory " + docset_path) - if not os.path.exists(docset_path): - Logs.info("docset: creating output directory " + docset_path) - os.mkdir(docset_path) - - doxyfile = os.path.join('doc', 'doxygen.docset.conf') - with open(doxyfile, 'w') as doxygen_config: - Logs.info("docset: writing doxygen conf " + doxyfile) - doxygen_config.write(doxygen_config_contents) - doxygen_config.write( - """ - HAVE_DOT = NO - GENERATE_DOCSET = YES - DISABLE_INDEX = YES - SEARCHENGINE = NO - GENERATE_TREEVIEW = NO - OUTPUT_DIRECTORY=""" + docset_path + "\n" - ) - - # Run Doxygen manually, so as to avoid build - Logs.info("docset: running doxygen") - env = wutils.bld.env - _getVersion() - if subprocess.Popen(env['DOXYGEN'] + [doxyfile]).wait(): - Logs.error("Doxygen docset build returned an error.") - raise SystemExit(1) - - # Build docset - docset_path = os.path.join(docset_path, 'html') - Logs.info("docset: Running docset Make") - if subprocess.Popen(["make"], cwd=docset_path).wait(): - Logs.error("Docset make returned and error.") - raise SystemExit(1) - - # Additional steps from - # https://github.com/Kapeli/Dash-User-Contributions/tree/master/docsets/ns-3 - docset_out = os.path.join(docset_path, 'org.nsnam.ns3.docset') - icons = os.path.join('doc', 'ns3_html_theme', 'static') - shutil.copy(os.path.join(icons, 'ns-3-bars-16x16.png'), - os.path.join(docset_out, 'icon.png')) - shutil.copy(os.path.join(icons, 'ns-3-bars-32x32.png'), - os.path.join(docset_out, 'icon@x2.png')) - shutil.copy(os.path.join(docset_path, 'Info.plist'), - os.path.join(docset_out, 'Contents')) - shutil.move(docset_out, os.path.join('doc', 'ns-3.docset')) - - print("Docset built successfully.") - - -def _getVersion(): - """update the ns3_version.js file, when building documentation""" - - prog = "doc/ns3_html_theme/get_version.sh" - if subprocess.Popen([prog]).wait() : - Logs.error(prog + " returned an error") - raise SystemExit(1) - -class Ns3DoxygenContext(Context.Context): - """do a full build, generate the introspected doxygen and then the doxygen""" - cmd = 'doxygen' - def execute(self): - # first we execute the build - bld = Context.create_context("build") - bld.options = Options.options # provided for convenience - bld.cmd = "build" - bld.execute() - _doxygen(bld) - -class Ns3SphinxContext(Context.Context): - """build the Sphinx documentation: manual, tutorial, models, contributing""" - - cmd = 'sphinx' - - def sphinx_build(self, path): - print() - print("[waf] Building sphinx docs for " + path) - if subprocess.Popen(["make", "SPHINXOPTS=-N", "-k", - "html", "singlehtml", "latexpdf" ], - cwd=path).wait() : - Logs.error("Sphinx build of " + path + " returned an error.") - raise SystemExit(1) - - def execute(self): - _getVersion() - for sphinxdir in ["manual", "models", "tutorial", "contributing"] : - self.sphinx_build(os.path.join("doc", sphinxdir)) - - -class Ns3DocContext(Context.Context): - """build all the documentation: doxygen, manual, tutorial, models, contributing""" - - cmd = 'docs' - - def execute(self): - steps = ['doxygen', 'sphinx'] - Options.commands = steps + Options.commands - - -def lcov_report(bld): - env = bld.env - - if not env['GCOV_ENABLED']: - raise WafError("project not configured for code coverage;" - " reconfigure with --enable-gcov") - try: - subprocess.call(["lcov", "--help"], stdout=subprocess.DEVNULL) - except OSError as e: - if e.errno == os.errno.ENOENT: - raise WafError("Error: lcov program not found") - else: - raise - try: - subprocess.call(["genhtml", "--help"], stdout=subprocess.DEVNULL) - except OSError as e: - if e.errno == os.errno.ENOENT: - raise WafError("Error: genhtml program not found") - else: - raise - os.chdir(out) - try: - lcov_report_dir = 'lcov-report' - create_dir_command = "rm -rf " + lcov_report_dir - create_dir_command += " && mkdir " + lcov_report_dir + ";" - - if subprocess.Popen(create_dir_command, shell=True).wait(): - raise SystemExit(1) - - info_file = os.path.join(lcov_report_dir, 'report.info') - lcov_command = "lcov -c -d . -o " + info_file - lcov_command += " -b " + os.getcwd() - if subprocess.Popen(lcov_command, shell=True).wait(): - raise SystemExit(1) - - genhtml_command = "genhtml -o " + lcov_report_dir - genhtml_command += " " + info_file - if subprocess.Popen(genhtml_command, shell=True).wait(): - raise SystemExit(1) - finally: - os.chdir("..") - -def lcov_zerocounters(bld): - env = bld.env - - if not env['GCOV_ENABLED']: - raise WafError("project not configured for code coverage;" - " reconfigure with --enable-gcov") - try: - subprocess.call(["lcov", "--help"], stdout=subprocess.DEVNULL) - except OSError as e: - if e.errno == os.errno.ENOENT: - raise WafError("Error: lcov program not found") - else: - raise - - os.chdir(out) - lcov_clear_command = "lcov -d . --zerocounters" - if subprocess.Popen(lcov_clear_command, shell=True).wait(): - raise SystemExit(1) - os.chdir("..") diff --git a/wutils.py b/wutils.py deleted file mode 100644 index 7a4b19e19..000000000 --- a/wutils.py +++ /dev/null @@ -1,260 +0,0 @@ -import os -import os.path -import re -import sys -import subprocess -import shlex - -# WAF modules -from waflib import Options, Utils, Logs, TaskGen, Build, Context -from waflib.Errors import WafError - -# these are set from the main wscript file -APPNAME=None -VERSION=None -bld=None - - - -def get_command_template(env, arguments=()): - cmd = Options.options.command_template or '%s' - for arg in arguments: - cmd = cmd + " " + arg - return cmd - - -if hasattr(os.path, "relpath"): - relpath = os.path.relpath # since Python 2.6 -else: - def relpath(path, start=os.path.curdir): - """Return a relative version of a path""" - - if not path: - raise ValueError("no path specified") - - start_list = os.path.abspath(start).split(os.path.sep) - path_list = os.path.abspath(path).split(os.path.sep) - - # Work out how much of the filepath is shared by start and path. - i = len(os.path.commonprefix([start_list, path_list])) - - rel_list = [os.path.pardir] * (len(start_list)-i) + path_list[i:] - if not rel_list: - return os.path.curdir - return os.path.join(*rel_list) - - -def find_program(program_name, env): - launch_dir = os.path.abspath(Context.launch_dir) - #top_dir = os.path.abspath(Options.cwd_launch) - found_programs = [] - for obj in bld.all_task_gen: - if not getattr(obj, 'is_ns3_program', False): - continue - - ## filter out programs not in the subtree starting at the launch dir - if not (obj.path.abspath().startswith(launch_dir) - or obj.path.get_bld().abspath().startswith(launch_dir)): - continue - - name1 = obj.name - name2 = os.path.join(relpath(obj.path.abspath(), launch_dir), obj.name) - names = [name1, name2] - found_programs.extend(names) - if program_name in names: - return obj - raise ValueError("program '%s' not found; available programs are: %r" - % (program_name, found_programs)) - -def get_proc_env(os_env=None): - env = bld.env - if sys.platform == 'linux2' or sys.platform == 'linux': - pathvar = 'LD_LIBRARY_PATH' - elif sys.platform == 'darwin': - pathvar = 'DYLD_LIBRARY_PATH' - elif sys.platform == 'win32': - pathvar = 'PATH' - elif sys.platform == 'cygwin': - pathvar = 'PATH' - elif sys.platform.startswith('freebsd'): - pathvar = 'LD_LIBRARY_PATH' - else: - Logs.warn(("Don't know how to configure " - "dynamic library path for the platform %r;" - " assuming it's LD_LIBRARY_PATH.") % (sys.platform,)) - pathvar = 'LD_LIBRARY_PATH' - - proc_env = dict(os.environ) - if os_env is not None: - proc_env.update(os_env) - - if pathvar is not None: - if pathvar in proc_env: - proc_env[pathvar] = os.pathsep.join(list(env['NS3_MODULE_PATH']) + [proc_env[pathvar]]) - else: - proc_env[pathvar] = os.pathsep.join(list(env['NS3_MODULE_PATH'])) - - pymoddir = bld.path.find_dir('bindings/python').get_bld().abspath() - pyvizdir = bld.path.find_dir('src/visualizer').abspath() - if 'PYTHONPATH' in proc_env: - proc_env['PYTHONPATH'] = os.pathsep.join([pymoddir, pyvizdir] + [proc_env['PYTHONPATH']]) - else: - proc_env['PYTHONPATH'] = os.pathsep.join([pymoddir, pyvizdir]) - - if 'PATH' in proc_env: - proc_env['PATH'] = os.pathsep.join(list(env['NS3_EXECUTABLE_PATH']) + [proc_env['PATH']]) - else: - proc_env['PATH'] = os.pathsep.join(list(env['NS3_EXECUTABLE_PATH'])) - - return proc_env - -def run_argv(argv, env, os_env=None, cwd=None, force_no_valgrind=False): - proc_env = get_proc_env(os_env) - - if Options.options.valgrind and Options.options.command_template: - raise WafError("Options --command-template and --valgrind are conflicting") - if Options.options.gdb and Options.options.command_template: - raise WafError("Options --command-template and --gdb are conflicting") - if Options.options.gdb and Options.options.valgrind: - raise WafError("Options --valgrind and --gdb are conflicting") - - if Options.options.gdb: - argv = ["gdb", "--args"] + argv - proc = subprocess.Popen(argv, env=proc_env, cwd=cwd) - retval = proc.wait() - return retval - elif Options.options.valgrind and not force_no_valgrind: - if not env['VALGRIND']: - raise WafError("valgrind is not installed") - # Use the first program found in the env['VALGRIND'] list - argv = [env['VALGRIND'][0], "--leak-check=full", "--show-reachable=yes", "--error-exitcode=1"] + argv - proc = subprocess.Popen(argv, env=proc_env, cwd=cwd, stderr=subprocess.PIPE) - stderrdata = proc.communicate()[1] - stderrdata = stderrdata.decode('utf-8') - error = False - for line in stderrdata: - sys.stderr.write(line) - if "== LEAK SUMMARY" in line: - error = True - retval = proc.wait() - if retval == 0 and error: - retval = 1 - else: - try: - WindowsError - except NameError: - retval = subprocess.Popen(argv, env=proc_env, cwd=cwd).wait() - else: - try: - retval = subprocess.Popen(argv, env=proc_env, cwd=cwd).wait() - except WindowsError as ex: - raise WafError("Command %s raised exception %s" % (argv, ex)) - if retval: - signame = None - if retval < 0: # signal? - import signal - for name, val in vars(signal).items(): - if len(name) > 3 and name[:3] == 'SIG' and name[3] != '_': - if val == -retval: - signame = name - break - if signame: - raise WafError("Command %s terminated with signal %s." - " Run it under a debugger to get more information " - "(./waf --run --gdb\")." % (argv, signame)) - else: - raise WafError("Command %s exited with code %i" % (argv, retval)) - return retval - -def get_run_program(program_string, command_template=None): - """ - Return the program name and argv of the process that would be executed by - run_program(program_string, command_template). - """ - #print "get_run_program_argv(program_string=%r, command_template=%r)" % (program_string, command_template) - env = bld.env - - if command_template in (None, '%s'): - argv = shlex.split(program_string) - #print "%r ==shlex.split==> %r" % (program_string, argv) - program_name = argv[0] - - # if the script name ends with .cc - strip it - if program_name.endswith('.cc'): - program_name = program_name.rsplit('.', 1)[0] - - try: - program_obj = find_program(program_name, env) - except ValueError as ex: - raise WafError(str(ex)) - - program_node = program_obj.path.find_or_declare(program_obj.target) - #try: - # program_node = program_obj.path.find_build(ccroot.get_target_name(program_obj)) - #except AttributeError: - # raise Utils.WafError("%s does not appear to be a program" % (program_name,)) - - execvec = [program_node.abspath()] + argv[1:] - - else: - - program_name = program_string - - # if the script name ends with .cc - strip it - if program_name.endswith('.cc'): - program_name = program_name.rsplit('.', 1)[0] - - try: - program_obj = find_program(program_name, env) - except ValueError as ex: - raise WafError(str(ex)) - - program_node = program_obj.path.find_or_declare(program_obj.target) - #try: - # program_node = program_obj.path.find_build(ccroot.get_target_name(program_obj)) - #except AttributeError: - # raise Utils.WafError("%s does not appear to be a program" % (program_name,)) - - tmpl = command_template % (program_node.abspath(),) - execvec = shlex.split(tmpl.replace('\\', '\\\\')) - #print "%r ==shlex.split==> %r" % (command_template % (program_node.abspath(env),), execvec) - return program_name, execvec - -def run_program(program_string, env, command_template=None, cwd=None, visualize=False): - """ - if command_template is not None, then program_string == program - name and argv is given by command_template with %s replaced by the - full path to the program. Else, program_string is interpreted as - a shell command with first name being the program name. - """ - dummy_program_name, execvec = get_run_program(program_string, command_template) - if cwd is None: - if (Options.options.cwd_launch): - cwd = Options.options.cwd_launch - else: - cwd = Options.cwd_launch - if visualize: - execvec.append("--SimulatorImplementationType=ns3::VisualSimulatorImpl") - return run_argv(execvec, env, cwd=cwd) - - - -def run_python_program(program_string, env, visualize=False): - env = bld.env - execvec = shlex.split(program_string) - if (Options.options.cwd_launch): - cwd = Options.options.cwd_launch - else: - cwd = Options.cwd_launch - if visualize: - execvec.append("--SimulatorImplementationType=ns3::VisualSimulatorImpl") - return run_argv([env['PYTHON'][0]] + execvec, env, cwd=cwd) - - -def uniquify_list(seq): - """Remove duplicates while preserving order - From Dave Kirby http://www.peterbe.com/plog/uniqifiers-benchmark - """ - seen = set() - return [ x for x in seq if x not in seen and not seen.add(x)] -