Files
unison/src/wscript

349 lines
12 KiB
Plaintext
Raw Normal View History

2007-05-07 12:01:51 +01:00
## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
import os, os.path
import shutil
import types
2008-12-29 13:28:54 +00:00
import warnings
2008-12-29 13:28:54 +00:00
import TaskGen
import Task
import Options
import Build
2009-04-13 23:10:37 +01:00
import Utils
import Constants
try:
set
except NameError:
from sets import Set as set # Python 2.3 fallback
all_modules = (
'core',
'network',
'contrib',
'internet-stack',
'propagation',
'devices/point-to-point',
2007-08-09 15:56:28 -07:00
'devices/csma',
2008-10-29 22:39:36 -07:00
'devices/emu',
2008-11-07 20:41:38 -08:00
'devices/bridge',
2009-01-27 12:36:46 -08:00
'devices/tap-bridge',
'devices/virtual-net-device',
2007-09-12 15:23:25 -07:00
'applications/onoff',
'applications/packet-sink',
'applications/udp-echo',
2010-12-16 20:24:14 -05:00
'applications/bulk-send',
2009-09-18 10:32:07 -04:00
'routing/nix-vector-routing',
'routing/olsr',
2007-08-03 09:29:57 -07:00
'routing/global-routing',
'routing/static-routing',
'routing/list-routing',
2009-11-18 13:01:17 +03:00
'routing/aodv',
2010-12-21 22:43:06 -08:00
'routing/dsdv',
2007-07-23 15:53:54 +02:00
'mobility',
'devices/wifi',
2008-03-13 14:24:45 -07:00
'helper',
'contrib/stats',
'applications/v4ping',
2010-06-24 14:35:29 -04:00
'devices/uan',
2011-01-31 10:13:32 +01:00
'spectrum',
2010-06-11 19:30:06 +02:00
'devices/mesh',
2009-03-24 18:36:49 +03:00
'devices/mesh/dot11s',
2009-06-17 14:28:09 +04:00
'devices/mesh/flame',
'applications/ping6',
'applications/radvd',
2009-09-27 23:51:23 -07:00
'test',
2010-01-29 15:01:07 -08:00
'test/perf',
2009-09-12 19:44:17 -07:00
'test/ns3tcp',
2010-04-12 21:42:53 -07:00
'test/nsctcp',
2009-09-12 19:44:17 -07:00
'test/ns3wifi',
2009-08-31 18:50:38 +01:00
'contrib/flow-monitor',
'applications/udp-client-server',
2010-03-07 20:49:47 +01:00
'devices/wimax',
2010-12-02 09:02:42 +01:00
'devices/lte',
2010-03-08 21:07:31 -05:00
'mpi',
2010-03-12 14:36:38 -05:00
'contrib/topology-read',
2010-07-07 21:54:32 -07:00
'contrib/energy',
'tools/visualizer',
)
2007-05-07 12:01:51 +01:00
def set_options(opt):
opt.sub_options('core')
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)
2009-01-27 20:26:34 -08:00
opt.add_option('--enable-modules',
help=("Build only these modules (and dependencies)"),
dest='enable_modules')
2007-05-07 12:01:51 +01:00
def configure(conf):
conf.sub_config('core')
2008-11-07 20:41:38 -08:00
conf.sub_config('devices/emu')
2009-01-27 12:36:46 -08:00
conf.sub_config('devices/tap-bridge')
conf.sub_config('contrib')
conf.sub_config('internet-stack')
2009-11-24 10:16:58 -05:00
conf.sub_config('helper')
2010-01-29 15:01:07 -08:00
conf.sub_config('test')
2007-05-07 12:01:51 +01:00
2008-12-29 13:28:54 +00:00
blddir = os.path.abspath(os.path.join(conf.blddir, conf.env.variant()))
conf.env.append_value('NS3_MODULE_PATH', blddir)
2008-12-29 13:28:54 +00:00
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]
def create_ns3_module(bld, name, dependencies=()):
module = bld.new_task_gen('cxx', 'cc')
2010-10-25 21:27:03 +01:00
module.is_ns3_module = True
module.name = 'ns3-' + name
module.target = module.name
module.add_objects = ['ns3-' + dep for dep in dependencies]
module.module_deps = list(dependencies)
if not module.env['ENABLE_STATIC_NS3']:
module.env.append_value('CXXFLAGS', module.env['shlib_CXXFLAGS'])
module.env.append_value('CCFLAGS', module.env['shlib_CXXFLAGS'])
elif module.env['CXX_NAME'] in ['gcc', 'icc'] and \
os.uname()[4] == 'x86_64' and \
module.env['ENABLE_PYTHON_BINDINGS']:
# enable that flag for static builds only on x86-64 platforms
# when gcc is present and only when we want python bindings
# (it's more efficient to not use this option if we can avoid it)
module.env.append_value('CXXFLAGS', '-mcmodel=large')
module.env.append_value('CCFLAGS', '-mcmodel=large')
module.env.append_value('CXXDEFINES', "NS3_MODULE_COMPILATION")
module.env.append_value('CCDEFINES', "NS3_MODULE_COMPILATION")
return module
2008-12-29 13:28:54 +00:00
def create_obj(bld, *args):
warnings.warn("(in %s) Use bld.new_task_gen(...) now, instead of bld.create_obj(...)" % str(bld.path),
DeprecationWarning, stacklevel=2)
return bld.new_task_gen(*args)
2007-05-07 12:01:51 +01:00
def build(bld):
bld.create_ns3_module = types.MethodType(create_ns3_module, bld)
2008-12-29 13:28:54 +00:00
bld.create_obj = types.MethodType(create_obj, bld)
bld.add_subdirs(list(all_modules))
for module in all_modules:
2008-12-29 13:28:54 +00:00
modheader = bld.new_task_gen('ns3moduleheader')
modheader.module = module.split('/')[-1]
2008-12-29 13:28:54 +00:00
class ns3header_taskgen(TaskGen.task_gen):
"""A set of NS-3 header files"""
2008-12-29 13:28:54 +00:00
COLOR = 'BLUE'
def __init__(self, *args, **kwargs):
super(ns3header_taskgen, self).__init__(*args, **kwargs)
self.install_path = None
self.sub_dir = None # if not None, header files will be published as ns3/sub_dir/file.h
self.module = None # module name
self.mode = 'install'
def apply(self):
if self.module is None:
2008-12-29 13:28:54 +00:00
raise Utils.WafError("'module' missing on ns3headers object %s" % self)
2009-04-13 23:10:37 +01:00
ns3_dir_node = self.bld.path.find_dir("ns3")
if self.sub_dir is not None:
ns3_dir_node = ns3_dir_node.find_dir(self.sub_dir)
for filename in set(self.to_list(self.source)):
2008-12-29 13:28:54 +00:00
src_node = self.path.find_resource(filename)
if src_node is None:
2008-12-29 13:28:54 +00:00
raise Utils.WafError("source ns3 header file %s not found" % (filename,))
dst_node = ns3_dir_node.find_or_declare(os.path.basename(filename))
assert dst_node is not None
2010-02-01 14:27:08 +00:00
task = self.create_task('ns3header', env=self.env)
task.mode = self.mode
if self.mode == 'install':
task.set_inputs([src_node])
task.set_outputs([dst_node])
else:
task.header_to_remove = dst_node
2008-12-29 13:28:54 +00:00
class ns3header_task(Task.Task):
2008-12-29 15:48:34 +00:00
before = 'cc cxx gen_ns3_module_header_task'
2008-12-29 13:28:54 +00:00
color = 'BLUE'
def __str__(self):
"string to display to the user"
env = self.env
src_str = ' '.join([a.nice_path(env) for a in self.inputs])
tgt_str = ' '.join([a.nice_path(env) for a in self.outputs])
if self.outputs: sep = ' -> '
else: sep = ''
if self.mode == 'remove':
return 'rm-ns3-header %s\n' % (self.header_to_remove.bldpath(self.env),)
return 'install-ns3-header: %s%s%s\n' % (src_str, sep, tgt_str)
def runnable_status(self):
if self.mode == 'remove':
if os.path.exists(self.header_to_remove.bldpath(self.env)):
return Constants.RUN_ME
else:
return Constants.SKIP_ME
else:
return super(ns3header_task, self).runnable_status()
2008-12-29 13:28:54 +00:00
def run(self):
if self.mode == 'install':
assert len(self.inputs) == len(self.outputs)
inputs = [node.srcpath(self.env) for node in self.inputs]
outputs = [node.bldpath(self.env) for node in self.outputs]
for src, dst in zip(inputs, outputs):
try:
os.chmod(dst, 0600)
except OSError:
pass
shutil.copy2(src, dst)
## make the headers in builddir read-only, to prevent
## accidental modification
os.chmod(dst, 0400)
return 0
else:
assert len(self.inputs) == 0
assert len(self.outputs) == 0
out_file_name = self.header_to_remove.bldpath(self.env)
2008-12-29 13:28:54 +00:00
try:
os.unlink(out_file_name)
except OSError, ex:
if ex.errno != 2:
raise
return 0
2008-12-29 13:28:54 +00:00
class gen_ns3_module_header_task(Task.Task):
before = 'cc cxx'
2008-12-29 15:48:34 +00:00
after = 'ns3header_task'
2008-12-29 13:28:54 +00:00
color = 'BLUE'
def runnable_status(self):
if self.mode == 'remove':
if os.path.exists(self.header_to_remove.bldpath(self.env)):
return Constants.RUN_ME
else:
return Constants.SKIP_ME
else:
return super(gen_ns3_module_header_task, self).runnable_status()
def __str__(self):
"string to display to the user"
env = self.env
src_str = ' '.join([a.nice_path(env) for a in self.inputs])
tgt_str = ' '.join([a.nice_path(env) for a in self.outputs])
if self.outputs: sep = ' -> '
else: sep = ''
if self.mode == 'remove':
return 'rm-module-header %s\n' % (self.header_to_remove.bldpath(self.env),)
return 'gen-module-header: %s%s%s\n' % (src_str, sep, tgt_str)
2008-12-29 13:28:54 +00:00
def run(self):
if self.mode == 'remove':
assert len(self.inputs) == 0
assert len(self.outputs) == 0
out_file_name = self.header_to_remove.bldpath(self.env)
try:
os.unlink(out_file_name)
except OSError, ex:
if ex.errno != 2:
raise
return 0
2008-12-29 13:28:54 +00:00
assert len(self.outputs) == 1
out_file_name = self.outputs[0].bldpath(self.env)
2008-12-29 13:28:54 +00:00
header_files = [os.path.basename(node.abspath(self.env)) for node in self.inputs]
outfile = file(out_file_name, "w")
2008-12-29 13:28:54 +00:00
header_files.sort()
print >> outfile, """
#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
2008-12-29 13:28:54 +00:00
""" % (self.module.upper().replace('-', '_'),)
2008-12-29 13:28:54 +00:00
# if self.module_deps:
# print >> outfile, "// Module dependencies:"
# for dep in self.module_deps:
# print >> outfile, "#include \"%s-module.h\"" % dep
2008-12-29 13:28:54 +00:00
print >> outfile
print >> outfile, "// Module headers:"
for header in header_files:
print >> outfile, "#include \"%s\"" % (header,)
2008-12-29 13:28:54 +00:00
print >> outfile, "#endif"
2008-12-29 13:28:54 +00:00
outfile.close()
return 0
def sig_explicit_deps(self):
2010-11-27 14:29:45 +00:00
self.m.update('\n'.join([node.abspath(self.env) for node in self.inputs]))
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"
2009-04-13 23:10:37 +01:00
m = Utils.md5()
m.update("ns-3-module-header-%s" % self.module)
self.uid = m.digest()
return self.uid
2008-12-29 13:28:54 +00:00
class ns3moduleheader_taskgen(TaskGen.task_gen):
"""
Generates a 'ns3/foo-module.h' header file that includes all
public ns3 headers of a certain module.
"""
2008-12-29 13:28:54 +00:00
COLOR = 'BLUE'
def __init__(self, *args, **kwargs):
super(ns3moduleheader_taskgen, self).__init__(*args, **kwargs)
self.mode = 'install'
def apply(self):
## get all of the ns3 headers
2009-04-13 23:10:37 +01:00
ns3_dir_node = self.bld.path.find_dir("ns3")
all_headers_inputs = []
found_the_module = False
2009-04-13 23:10:37 +01:00
for ns3headers in self.bld.all_task_gen:
if isinstance(ns3headers, ns3header_taskgen):
if ns3headers.module != self.module:
continue
found_the_module = True
for source in set(ns3headers.to_list(ns3headers.source)):
source = os.path.basename(source)
2008-12-29 13:28:54 +00:00
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:
2009-04-13 23:10:37 +01:00
raise Utils.WscriptError("error finding headers for module %s" % self.module)
if not all_headers_inputs:
return
2008-12-29 13:28:54 +00:00
all_headers_outputs = [ns3_dir_node.find_or_declare("%s-module.h" % self.module)]
2010-02-01 14:27:08 +00:00
task = self.create_task('gen_ns3_module_header', env=self.env)
task.module = self.module
task.mode = self.mode
if self.mode == 'install':
task.set_inputs(all_headers_inputs)
task.set_outputs(all_headers_outputs)
module_obj = self.bld.name_to_obj("ns3-" + self.module, self.env)
assert module_obj is not None, self.module
task.module_deps = module_obj.module_deps
else:
task.header_to_remove = all_headers_outputs[0]
def install(self):
pass