src/wscript
author Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
Sun, 09 Dec 2007 14:39:07 +0000
changeset 1880 0148d5911946
parent 1878 f947cd18f0bb
child 2178 763aa96fffd4
permissions -rw-r--r--
New waf snapshot; move the ns3 library back to the top build dir (the 'lib' was only a workaround for a waf problem); allow --enable-modules on a per build run basis.

## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-

import os, os.path
import shutil
import types

import Action
import Common
import Object
import Params


all_modules = (
    'core',
    'common',
    'simulator',
    'contrib',
    'node',
    'internet-node',
    'devices/point-to-point',
    'devices/csma',
    'applications/onoff',
    'applications/packet-sink',
    'applications/udp-echo',
    'routing/olsr',
    'routing/global-routing',
    'mobility',
    )

def set_options(opt):
    opt.sub_options('simulator')

    opt.add_option('--enable-rpath',
                   help=("Link programs with rpath"
                         " (normally not needed, see "
                         " --run and --shell; moreover, only works in some"
                         " specific platforms, such as Linux and Solaris)"),
                   action="store_true", dest='enable_rpath', default=False)

    opt.add_option('--enable-modules',
                   help=("Build only these modules (and dependencies)"),
                   dest='enable_modules')


def configure(conf):
    conf.sub_config('core')
    conf.sub_config('simulator')

    blddir = os.path.abspath(os.path.join(conf.m_blddir, conf.env.variant()))
    conf.env['NS3_MODULE_PATH'] = [blddir]
    if Params.g_options.enable_rpath:
        conf.env.append_value('RPATH', '-Wl,-rpath=%s' % (os.path.join(blddir),))

    ## Used to link the 'run-tests' program with all of ns-3 code
    conf.env['NS3_MODULES'] = ['ns3-' + module.split('/')[-1] for module in all_modules]


def create_ns3_module(bld, name, dependencies=()):
    module = bld.create_obj('cpp', 'objects')
    module.name = 'ns3-' + name
    module.target = module.name
    module.add_objects = ['ns3-' + dep for dep in dependencies]
    module.env.append_value('CXXFLAGS', module.env['shlib_CXXFLAGS'])
    return module
    

def build(bld):
    Object.register('ns3header', Ns3Header)
    Action.Action('ns3header', func=_ns3_headers_inst, color='BLUE')
    bld.create_ns3_module = types.MethodType(create_ns3_module, bld)
    
    bld.add_subdirs(list(all_modules))


class Ns3Header(Object.genobj):
    """A set of NS-3 header files"""
    def __init__(self, env=None):
        Object.genobj.__init__(self, 'other')
        self.inst_var = 'INCLUDEDIR'
        self.inst_dir = 'ns3'
        self.sub_dir = None # if not None, header files will be published as ns3/sub_dir/file.h
        self.env = env
        if not self.env:
            self.env = Params.g_build.m_allenvs['default']

    def apply(self):
        ns3_dir_node = Params.g_build.m_srcnode.find_dir("ns3")
        if self.sub_dir is not None:
            ns3_dir_node = ns3_dir_node.find_dir(self.sub_dir)
        for filename in self.to_list(self.source):
            src_node = self.path.find_source(filename)
            if src_node is None:
                Params.fatal("source ns3 header file %s not found" % (filename,))
            dst_node = ns3_dir_node.find_build(os.path.basename(filename))
            assert dst_node is not None
            task = self.create_task('ns3header', self.env, 1)
            task.set_inputs([src_node])
            task.set_outputs([dst_node])

    def install(self):
        if self.sub_dir is None:
            inst_dir = self.inst_dir
        else:
            inst_dir = os.path.join(self.inst_dir, self.sub_dir)
        for i in self.m_tasks:
            current = Params.g_build.m_curdirnode
            lst = map(lambda a: a.relpath_gen(current), i.m_outputs)
            Common.install_files(self.inst_var, inst_dir, lst)

def _ns3_headers_inst(task):
    assert len(task.m_inputs) == len(task.m_outputs)
    inputs = [node.srcpath(task.m_env) for node in task.m_inputs]
    outputs = [node.bldpath(task.m_env) for node in task.m_outputs]
    for src, dst in zip(inputs, outputs):
        try:
            os.chmod(dst, 0600)
        except OSError:
            pass
        shutil.copy2(src, dst)
        ## make the headers in builddir read-only, to prevent
        ## accidental modification
        os.chmod(dst, 0400)
    return 0