src/wscript
author Gustavo J. A. M. Carneiro <gjcarneiro@gmail.com>
Thu, 24 May 2007 17:54:51 +0100
changeset 693 c8fc89076aa2
parent 672 184d5a505279
child 761 0ffbc9fa8ef0
permissions -rw-r--r--
WAF: cleanup the main wscript file by moving the definition of the ns3header object type into src/wscript

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

import os
import shutil

import Action
import Common
import Object
import Params


all_modules = [
    'core',
    'common',
    'simulator',
    'node',
    'internet-node',
    'devices/p2p',
    'applications',
    ]


def set_options(opt):
    opt.sub_options('simulator')
    
def configure(conf):
    conf.sub_config('core')
    conf.sub_config('simulator')


def build(bld):
    Object.register('ns3header', Ns3Header)
    Action.Action('ns3_headers', func=_ns3_headers_inst, color='BLUE')

    env = bld.env_of_name('default')
    for module in all_modules:
        node = bld.m_curdirnode.find_dir(module)
        node_path = node.abspath(env)
        env.append_value('NS3_MODULE_PATH', node_path)
    
    bld.add_subdirs(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.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")
        inputs = []
        outputs = []
        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
            inputs.append(src_node)
            outputs.append(dst_node)
        task = self.create_task('ns3_headers', self.env, 1)
        task.set_inputs(inputs)
        task.set_outputs(outputs)

    def install(self):
        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, self.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