--- a/src/wscript Sun Apr 10 19:11:22 2011 +0200
+++ b/src/wscript Mon Apr 11 15:19:44 2011 +0200
@@ -95,12 +95,16 @@
conf.env['NS3_MODULES'] = ['ns3-' + module.split('/')[-1] for module in all_modules]
-def create_ns3_module(bld, name, dependencies=()):
+def create_ns3_module(bld, name, dependencies=(), test=False):
# Create a separate library for this module.
if bld.env['ENABLE_STATIC_NS3']:
module = bld.new_task_gen('cxx', 'cstaticlib')
else:
module = bld.new_task_gen('cxx', 'cshlib')
+ if not test:
+ pcfile = bld.new_task_gen('ns3pcfile')
+ pcfile.module = module
+
module.is_ns3_module = True
module.name = 'ns3-' + name
# Add the proper path to the module's name.
@@ -136,7 +140,7 @@
# 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])
+ library = bld.create_ns3_module(library_name, [name], test = True)
# Modify attributes for the test library that are different from a
# normal module.
@@ -276,6 +280,100 @@
modheader = bld.new_task_gen('ns3moduleheader')
modheader.module = module.split('/')[-1]
+class ns3pcfile_task(Task.Task):
+ after = 'cc cxx'
+ def __str__(self):
+ "string to display to the user"
+ tgt_str = ' '.join([a.nice_path(self.env) for a in self.outputs])
+ return 'pcfile: %s\n' % (tgt_str)
+ def runnable_status(self):
+ return super(ns3pcfile_task, self).runnable_status()
+ def _self_libs(self, env, name, libdir):
+ if env['ENABLE_STATIC_NS3']:
+ path_st = 'STATICLIBPATH_ST'
+ lib_st = 'STATICLIB_ST'
+ lib_marker = 'STATICLIB_MARKER'
+ else:
+ path_st = 'LIBPATH_ST'
+ lib_st = 'LIB_ST'
+ lib_marker = 'SHLIB_MARKER'
+ return [env[path_st] % libdir,
+ env[lib_marker],
+ env[lib_st] % name]
+ 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):
+ defines = self.env['CCDEFINES_%s' % dep] + self.env['CXXDEFINES_%s' % dep]
+ return [self.env['CCDEFINES_ST'] % define for define in self.env['CCDEFINES_%s' % dep]] + \
+ [self.env['CXXDEFINES_ST'] % define for define in self.env['CXXDEFINES_%s' % dep]]
+ def _includes(self, dep):
+ includes = self.env['CPPPATH_%s' % dep]
+ return [self.env['CPPPATH_ST'] % include for include in includes]
+
+ def _generate_pcfile(self, name, use, uselib_local, prefix, outfilename):
+ outfile = open(outfilename, 'w')
+ includedir = os.path.join(prefix, 'include')
+ libdir = os.path.join(prefix, 'lib')
+ libs = self._self_libs(self.env, name, '%{libdir}')
+ for dep in use:
+ libs = libs + self._lib(self.env, dep)
+ for dep in uselib_local:
+ libs = libs + [self.env['LIB_ST'] % dep]
+ cflags = [self.env['CPPPATH_ST'] % '${includedir}']
+ for dep in use:
+ cflags = cflags + self._cflags(dep) + self._cxxflags(dep) + \
+ self._defines(dep) + self._includes(dep)
+ print >> outfile, """
+prefix=%s
+libdir=%s
+includedir=%s
+
+Name: lib%s
+Description: ns-3 module %s
+Version: devel
+Libs: %s
+Cflags: %s
+""" % (prefix, libdir, includedir,
+ name, name, ' '.join(libs), ' '.join(cflags))
+ outfile.close()
+
+ def run(self):
+ output_filename = self.outputs[0].bldpath(self.env)
+ self._generate_pcfile(self.module.name, self.module.uselib,
+ self.module.uselib_local,
+ self.env['PREFIX'], output_filename)
+
+class ns3pcfile_taskgen(TaskGen.task_gen):
+ def __init__(self, *args, **kwargs):
+ super(ns3pcfile_taskgen, self).__init__(*args, **kwargs)
+ def apply(self):
+ output_filename = os.path.join('pkgconfig', 'lib%s.pc' % self.module.name)
+ output_node = self.bld.path.find_or_declare(output_filename)
+ task = self.create_task('ns3pcfile', env=self.env)
+ self.bld.install_files(os.path.join('${PREFIX}', 'lib', 'pkgconfig'),
+ output_filename)
+ task.set_outputs([output_node])
+ task.module = self.module
+
class ns3header_taskgen(TaskGen.task_gen):
"""A set of NS-3 header files"""
@@ -359,7 +457,6 @@
if ex.errno != 2:
raise
return 0
-
class gen_ns3_module_header_task(Task.Task):