generate pkg-config files for installation.
This commit is contained in:
103
src/wscript
103
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):
|
||||
|
||||
Reference in New Issue
Block a user