diff --git a/src/wscript b/src/wscript index afc207997..52bef2d17 100644 --- a/src/wscript +++ b/src/wscript @@ -95,12 +95,16 @@ def configure(conf): 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 @@ 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]) + 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 @@ def build(bld): 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 @@ class ns3header_task(Task.Task): if ex.errno != 2: raise return 0 - class gen_ns3_module_header_task(Task.Task):