generate pkg-config files for installation.

This commit is contained in:
Mathieu Lacage
2011-04-11 15:19:44 +02:00
parent 857436b513
commit 27ef348db8

View File

@@ -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):