branch merge
This commit is contained in:
@@ -22,7 +22,7 @@ else:
|
||||
os.environ['PYTHONPATH'] = LOCAL_PYBINDGEN_PATH
|
||||
|
||||
## https://launchpad.net/pybindgen/
|
||||
REQUIRED_PYBINDGEN_VERSION = (0, 9, 0, 576)
|
||||
REQUIRED_PYBINDGEN_VERSION = (0, 9, 0, 577)
|
||||
REQUIRED_PYGCCXML_VERSION = (0, 9, 5)
|
||||
|
||||
|
||||
@@ -87,11 +87,15 @@ __version__ = %r
|
||||
def configure(conf):
|
||||
conf.env['ENABLE_PYTHON_BINDINGS'] = False
|
||||
if Params.g_options.python_disable:
|
||||
conf.report_optional_feature("python", "Python Bindings", False,
|
||||
"disabled by user request")
|
||||
return
|
||||
|
||||
conf.check_tool('misc')
|
||||
|
||||
if sys.platform == 'cygwin':
|
||||
conf.report_optional_feature("python", "Python Bindings", False,
|
||||
"unsupported platform 'cygwin'")
|
||||
warning("Python is not supported in CygWin environment. Try MingW instead.")
|
||||
return
|
||||
|
||||
@@ -100,7 +104,8 @@ def configure(conf):
|
||||
conf.check_tool('python')
|
||||
conf.check_python_version((2,3))
|
||||
conf.check_python_headers()
|
||||
except Configure.ConfigurationError:
|
||||
except Configure.ConfigurationError, ex:
|
||||
conf.report_optional_feature("python", "Python Bindings", False, str(ex))
|
||||
return
|
||||
|
||||
## Check for pybindgen
|
||||
@@ -112,6 +117,8 @@ def configure(conf):
|
||||
except Configure.ConfigurationError:
|
||||
warning("pybindgen missing")
|
||||
if not fetch_pybindgen(conf):
|
||||
conf.report_optional_feature("python", "Python Bindings", False,
|
||||
"PyBindGen missing and could not be retrieved")
|
||||
return
|
||||
else:
|
||||
out = subprocess.Popen([conf.env['PYTHON'], "-c",
|
||||
@@ -128,15 +135,20 @@ def configure(conf):
|
||||
(pybindgen_version_str,
|
||||
'.'.join([str(x) for x in REQUIRED_PYBINDGEN_VERSION])))
|
||||
if not fetch_pybindgen(conf):
|
||||
conf.report_optional_feature("python", "Python Bindings", False,
|
||||
"PyBindGen too old and newer version could not be retrieved")
|
||||
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 for pygccxml
|
||||
try:
|
||||
conf.check_python_module('pygccxml')
|
||||
except Configure.ConfigurationError:
|
||||
conf.report_optional_feature("pygccxml", "Python API Scanning Support", False,
|
||||
"Missing 'pygccxml' Python module")
|
||||
return
|
||||
|
||||
out = subprocess.Popen([conf.env['PYTHON'], "-c",
|
||||
@@ -152,6 +164,8 @@ def configure(conf):
|
||||
"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("pygccxml", "Python API Scanning Support", False,
|
||||
"pygccxml too old")
|
||||
return
|
||||
|
||||
|
||||
@@ -159,6 +173,8 @@ def configure(conf):
|
||||
gccxml = conf.find_program('gccxml', var='GCCXML')
|
||||
if not gccxml:
|
||||
warning("gccxml missing; automatic scanning of API definitions will not be possible")
|
||||
conf.report_optional_feature("pygccxml", "Python API Scanning Support", False,
|
||||
"gccxml missing")
|
||||
return
|
||||
|
||||
gccxml_version_line = os.popen(gccxml + " --version").readline().strip()
|
||||
@@ -168,10 +184,13 @@ def configure(conf):
|
||||
conf.check_message('gccxml', 'version', True, gccxml_version)
|
||||
if not gccxml_version_ok:
|
||||
warning("gccxml too old, need version >= 0.9; automatic scanning of API definitions will not be possible")
|
||||
conf.report_optional_feature("pygccxml", "Python API Scanning Support", False,
|
||||
"gccxml too old")
|
||||
return
|
||||
|
||||
## If we reached
|
||||
conf.env['ENABLE_PYTHON_SCANNING'] = True
|
||||
conf.report_optional_feature("pygccxml", "Python API Scanning Support", True, None)
|
||||
|
||||
|
||||
prio_headers = {
|
||||
|
||||
@@ -7,6 +7,10 @@ def configure(conf):
|
||||
e.define = 'SQLITE3'
|
||||
e.uselib = 'SQLITE3'
|
||||
conf.env['SQLITE_STATS'] = e.run()
|
||||
conf.report_optional_feature("SqliteDataOutput", "SQlite stats data output",
|
||||
conf.env['SQLITE_STATS'],
|
||||
"library 'sqlite3' not found")
|
||||
|
||||
|
||||
def build(bld):
|
||||
obj = bld.create_ns3_module('stats', ['node'])
|
||||
|
||||
@@ -6,6 +6,10 @@ def configure(conf):
|
||||
check.uselib = 'GTK_CONFIG_STORE'
|
||||
check.mandatory = False
|
||||
conf.env['ENABLE_GTK_CONFIG_STORE'] = check.run()
|
||||
conf.report_optional_feature("GtkConfigStore", "GtkConfigStore",
|
||||
conf.env['ENABLE_GTK_CONFIG_STORE'],
|
||||
"library 'gtk+-2.0 >= 2.12' not found")
|
||||
|
||||
conf.sub_config('stats')
|
||||
|
||||
def build(bld):
|
||||
|
||||
@@ -1,15 +1,29 @@
|
||||
## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
|
||||
import Params
|
||||
import Task
|
||||
import os
|
||||
|
||||
# Mercurial repository of the network simulation cradle
|
||||
NETWORK_SIMULATION_CRADLE_REPO = "https://secure.wand.net.nz/mercurial/nsc"
|
||||
|
||||
# directory that contains network simulation cradle source
|
||||
# note, this path is relative to the project root
|
||||
NSC_DIR = "nsc"
|
||||
|
||||
|
||||
def set_options(opt):
|
||||
opt.add_option('--nsc',
|
||||
help=('Enable Network Simulation Cradle to allow the use real-world network stacks'),
|
||||
action="store_true", default=False,
|
||||
dest='nsc')
|
||||
|
||||
|
||||
def nsc_fetch():
|
||||
def nsc_clone():
|
||||
print "Retrieving nsc from " + NETWORK_SIMULATION_CRADLE_REPO
|
||||
if os.system("hg version > /dev/null 2>&1") != 0:
|
||||
Params.fatal("Mercurial not installed, http fallback not yet implemented")
|
||||
if os.system("hg -q clone " + NETWORK_SIMULATION_CRADLE_REPO) != 0:
|
||||
if os.system("hg clone " + NETWORK_SIMULATION_CRADLE_REPO) != 0:
|
||||
Params.fatal("hg -q clone %s failed" % NETWORK_SIMULATION_CRADLE_REPO)
|
||||
|
||||
def nsc_update():
|
||||
@@ -17,7 +31,7 @@ def nsc_fetch():
|
||||
Params.warning("Mercurial not installed, not updating nsc source")
|
||||
|
||||
print "Pulling nsc updates from " + NETWORK_SIMULATION_CRADLE_REPO
|
||||
if os.system("cd nsc && hg -q pull %s && hg -q update" % NETWORK_SIMULATION_CRADLE_REPO) != 0:
|
||||
if os.system("cd nsc && hg pull %s && hg update" % NETWORK_SIMULATION_CRADLE_REPO) != 0:
|
||||
Params.warning("Updating nsc using mercurial failed")
|
||||
|
||||
if not os.path.exists("nsc"):
|
||||
@@ -37,6 +51,8 @@ def configure(conf):
|
||||
e.run()
|
||||
|
||||
if not Params.g_options.nsc:
|
||||
conf.report_optional_feature("nsc", "Network Simulation Cradle", False,
|
||||
"--nsc configure option not given")
|
||||
return
|
||||
|
||||
check_nsc_buildutils()
|
||||
@@ -55,9 +71,43 @@ def configure(conf):
|
||||
e.run()
|
||||
ok = True
|
||||
conf.check_message('NSC supported architecture', arch, ok)
|
||||
conf.report_optional_feature("nsc", "Network Simulation Cradle", ok,
|
||||
"architecture %r not supported" % arch)
|
||||
nsc_fetch()
|
||||
|
||||
|
||||
|
||||
class NscBuildTask(Task.TaskBase):
|
||||
"""task that builds nsc
|
||||
"""
|
||||
def __init__(self, builddir):
|
||||
self.m_display = 'build-nsc'
|
||||
self.prio = 1000 # build after the rest of ns-3
|
||||
self.builddir = builddir
|
||||
super(NscBuildTask, self).__init__()
|
||||
|
||||
def run(self):
|
||||
# XXX: Detect gcc major version(s) available to build supported stacks
|
||||
kernels = [['linux-2.6.18', 'linux2.6.18'],
|
||||
['linux-2.6.26', 'linux2.6.26']]
|
||||
for dir, name in kernels:
|
||||
soname = 'lib' + name + '.so'
|
||||
if not os.path.exists(os.path.join("..", NSC_DIR, dir, soname)):
|
||||
if os.system('cd ../%s && python scons.py %s' % (NSC_DIR, dir)) != 0:
|
||||
Params.fatal("Building NSC stack failed")
|
||||
builddir = self.builddir
|
||||
if not os.path.exists(builddir + '/nsc'):
|
||||
try:
|
||||
os.symlink('../../' + NSC_DIR, builddir + '/nsc')
|
||||
except:
|
||||
Params.fatal("Error linkink " + builddir + '/nsc')
|
||||
if not os.path.exists(builddir + '/' + soname):
|
||||
try:
|
||||
os.symlink('../../' + NSC_DIR + '/' + dir + '/' + soname, builddir + '/' + soname)
|
||||
except:
|
||||
Params.fatal("Error linking " + builddir + '/' + soname)
|
||||
|
||||
|
||||
def build(bld):
|
||||
obj = bld.create_ns3_module('internet-stack', ['node'])
|
||||
obj.source = [
|
||||
@@ -106,3 +156,6 @@ def build(bld):
|
||||
obj.source.append ('nsc-tcp-socket-factory-impl.cc')
|
||||
obj.source.append ('nsc-sysctl.cc')
|
||||
obj.uselib = 'DL'
|
||||
|
||||
builddir = os.path.abspath(os.path.join(bld.env()['NS3_BUILDDIR'], bld.env ().variant()))
|
||||
NscBuildTask(builddir)
|
||||
|
||||
49
wscript
49
wscript
@@ -55,13 +55,12 @@ REGRESSION_SUFFIX = "-ref-traces"
|
||||
#
|
||||
TRACEBALL_SUFFIX = ".tar.bz2"
|
||||
|
||||
# directory that contains network simulation cradle source
|
||||
NSC_DIR = "nsc"
|
||||
|
||||
def dist_hook():
|
||||
import tarfile
|
||||
shutil.rmtree("doc/html", True)
|
||||
shutil.rmtree("doc/latex", True)
|
||||
shutil.rmtree("nsc", True)
|
||||
|
||||
if not os.path.exists("bindings/python/pybindgen"):
|
||||
Params.fatal("Missing pybindgen checkout; run './waf configure --pybindgen-checkout' first.")
|
||||
@@ -167,14 +166,11 @@ def set_options(opt):
|
||||
help=('For regression testing, only run/generate the indicated regression tests, '
|
||||
'specified as a comma separated list of test names'),
|
||||
dest='regression_tests', type="string")
|
||||
opt.add_option('--nsc',
|
||||
help=('Enable Network Simulation Cradle to allow the use real-world network stacks'),
|
||||
action="store_true", default=False,
|
||||
dest='nsc')
|
||||
|
||||
# options provided in a script in a subdirectory named "src"
|
||||
opt.sub_options('src')
|
||||
opt.sub_options('bindings/python')
|
||||
opt.sub_options('src/internet-stack')
|
||||
|
||||
|
||||
def check_compilation_flag(conf, flag):
|
||||
@@ -197,8 +193,16 @@ def check_compilation_flag(conf, flag):
|
||||
if not ok: # if it doesn't accept, remove it again
|
||||
conf.env['CXXFLAGS'] = save_CXXFLAGS
|
||||
|
||||
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 configure(conf):
|
||||
|
||||
# attach some extra methods
|
||||
conf.check_compilation_flag = types.MethodType(check_compilation_flag, conf)
|
||||
conf.report_optional_feature = types.MethodType(report_optional_feature, conf)
|
||||
conf.env['NS3_OPTIONAL_FEATURES'] = []
|
||||
|
||||
conf.env['NS3_BUILDDIR'] = conf.m_blddir
|
||||
conf.check_tool('compiler_cxx')
|
||||
|
||||
@@ -271,6 +275,15 @@ def configure(conf):
|
||||
## we cannot run regression tests without diff
|
||||
conf.find_program('diff', var='DIFF')
|
||||
|
||||
# Write a summary of optional features status
|
||||
print "---- Summary of optional NS-3 features:"
|
||||
for (name, caption, was_enabled, reason_not_enabled) in conf.env['NS3_OPTIONAL_FEATURES']:
|
||||
if was_enabled:
|
||||
status = 'enabled'
|
||||
else:
|
||||
status = 'not enabled (%s)' % reason_not_enabled
|
||||
print "%-30s: %s" % (caption, status)
|
||||
|
||||
|
||||
def create_ns3_program(bld, name, dependencies=('simulator',)):
|
||||
program = bld.create_obj('cpp', 'program')
|
||||
@@ -311,28 +324,6 @@ def _exec_command_interact_win32(s):
|
||||
return stat >> 8
|
||||
|
||||
|
||||
def nsc_build(bld):
|
||||
# XXX: Detect gcc major version(s) available to build supported stacks
|
||||
kernels = [['linux-2.6.18', 'linux2.6.18'],
|
||||
['linux-2.6.26', 'linux2.6.26']]
|
||||
for dir,name in kernels:
|
||||
soname = 'lib' + name + '.so'
|
||||
tmp = NSC_DIR + '/' + dir +'/' + soname
|
||||
if not os.path.exists(tmp):
|
||||
if os.system('cd ' + NSC_DIR + ' && python scons.py ' + dir) != 0:
|
||||
Params.fatal("Building NSC stack failed")
|
||||
builddir = os.path.abspath(os.path.join(bld.env()['NS3_BUILDDIR'], bld.env ().variant()))
|
||||
if not os.path.exists(builddir + '/nsc'):
|
||||
try:
|
||||
os.symlink('../../' + NSC_DIR, builddir + '/nsc')
|
||||
except:
|
||||
Params.fatal("Error linkink " + builddir + '/nsc')
|
||||
if not os.path.exists(builddir + '/' + soname):
|
||||
try:
|
||||
os.symlink('../../' + NSC_DIR + '/' + dir + '/' + soname, builddir + '/' + soname)
|
||||
except:
|
||||
Params.fatal("Error linking " + builddir + '/' + soname)
|
||||
|
||||
def build(bld):
|
||||
if Params.g_options.no_task_lines:
|
||||
import Runner
|
||||
@@ -422,8 +413,6 @@ def build(bld):
|
||||
|
||||
bld.add_subdirs('bindings/python')
|
||||
|
||||
if env['NSC_ENABLED'] == 'yes':
|
||||
nsc_build(bld)
|
||||
|
||||
def get_command_template(*arguments):
|
||||
if Params.g_options.valgrind:
|
||||
|
||||
Reference in New Issue
Block a user