src/wscript
changeset 7016 eab6710a6346
parent 7006 16e179df944f
child 7021 ba5f71c6ef58
--- 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):