WAF: add a new --enable-modules configure option, to tell WAF to build only the specified set of ns-3 modules and its dependencies; programs depending on those modules are automatically excluded from the build.
authorGustavo J. A. M. Carneiro <gjc@inescporto.pt>
Tue, 20 Nov 2007 18:27:43 +0000
changeset 1858 68e1964c19e8
parent 1857 461e19fae49c
child 1859 7f78a53adb33
WAF: add a new --enable-modules configure option, to tell WAF to build only the specified set of ns-3 modules and its dependencies; programs depending on those modules are automatically excluded from the build.
lib/wscript
src/applications/onoff/wscript
src/wscript
tutorial/wscript
utils/wscript
wscript
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/wscript	Tue Nov 20 18:27:43 2007 +0000
@@ -0,0 +1,44 @@
+## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+import Object
+
+def build(bld):
+    env = bld.env_of_name('default')
+
+    if env['NS3_ENABLED_MODULES']:
+        modules = env['NS3_ENABLED_MODULES']
+        changed = True
+        while changed:
+            changed = False
+            for module in modules:
+                module_obj = Object.name_to_obj(module)
+                if module_obj is None:
+                    raise ValueError("module %s not found" % module)
+                for dep in module_obj.add_objects:
+                    if not dep.startswith('ns3-'):
+                        continue
+                    if dep not in modules:
+                        modules.append(dep)
+                        changed = True
+
+        ## remove objects that depend on modules not listed
+        for obj in list(Object.g_allobjs):
+            if hasattr(obj, 'ns3_module_dependencies'):
+                for dep in obj.ns3_module_dependencies:
+                    if dep not in modules:
+                        Object.g_allobjs.remove(obj)
+                        break
+            if obj.name in env['NS3_MODULES'] and obj.name not in modules:
+                Object.g_allobjs.remove(obj)
+
+
+
+    ## Create a single ns3 library containing all modules
+    lib = bld.create_obj('cpp', 'shlib')
+    lib.name = 'ns3'
+    lib.target = 'ns3'
+    if env['NS3_ENABLED_MODULES']:
+        lib.add_objects = list(modules)
+    else:
+        lib.add_objects = list(env['NS3_MODULES'])
+
+
--- a/src/applications/onoff/wscript	Fri Nov 16 08:47:17 2007 +0100
+++ b/src/applications/onoff/wscript	Tue Nov 20 18:27:43 2007 +0000
@@ -1,7 +1,7 @@
 ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
 
 def build(bld):
-    module = bld.create_ns3_module('onoff', ['core'])
+    module = bld.create_ns3_module('onoff', ['core', 'simulator', 'node'])
     module.source = [
         'onoff-application.cc',
         ]
--- a/src/wscript	Fri Nov 16 08:47:17 2007 +0100
+++ b/src/wscript	Tue Nov 20 18:27:43 2007 +0000
@@ -36,19 +36,28 @@
                          " 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'] = [os.path.join(blddir)]
+    conf.env['NS3_MODULE_PATH'] = [os.path.join(blddir, 'lib')]
     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]
 
+    if Params.g_options.enable_modules:
+        conf.env['NS3_ENABLED_MODULES'] = ['ns3-'+mod for mod in
+                                           Params.g_options.enable_modules.split(',')]
+
+
 def create_ns3_module(bld, name, dependencies=()):
     module = bld.create_obj('cpp', 'objects')
     module.name = 'ns3-' + name
--- a/tutorial/wscript	Fri Nov 16 08:47:17 2007 +0100
+++ b/tutorial/wscript	Tue Nov 20 18:27:43 2007 +0000
@@ -1,36 +1,36 @@
 ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
 
 def build(bld):
-    obj = bld.create_ns3_program('hello-simulator', ['core'])
+    obj = bld.create_ns3_program('hello-simulator', ['simulator'])
     obj.source = 'hello-simulator.cc'
 
-    obj = bld.create_ns3_program('tutorial-csma-echo', ['core'])
+    obj = bld.create_ns3_program('tutorial-csma-echo', ['internet-node', 'csma'])
     obj.source = 'tutorial-csma-echo.cc'
 
-    obj = bld.create_ns3_program('tutorial-csma-echo-ascii-trace', ['core'])
+    obj = bld.create_ns3_program('tutorial-csma-echo-ascii-trace', ['internet-node', 'csma'])
     obj.source = 'tutorial-csma-echo-ascii-trace.cc'
 
-    obj = bld.create_ns3_program('tutorial-csma-echo-pcap-trace', ['core'])
+    obj = bld.create_ns3_program('tutorial-csma-echo-pcap-trace', ['internet-node', 'csma'])
     obj.source = 'tutorial-csma-echo-pcap-trace.cc'
 
-    obj = bld.create_ns3_program('tutorial-point-to-point', ['core'])
+    obj = bld.create_ns3_program('tutorial-point-to-point', ['internet-node', 'point-to-point'])
     obj.source = 'tutorial-point-to-point.cc'
 
-    obj = bld.create_ns3_program('tutorial-star', ['core'])
+    obj = bld.create_ns3_program('tutorial-star', ['internet-node', 'point-to-point'])
     obj.source = ['tutorial-star.cc',
                   'point-to-point-ipv4-topology.cc']
 
-    obj = bld.create_ns3_program('tutorial-star-routing', ['core'])
+    obj = bld.create_ns3_program('tutorial-star-routing', ['internet-node', 'point-to-point'])
     obj.source = ['tutorial-star-routing.cc',
                   'point-to-point-ipv4-topology.cc']
 
-    obj = bld.create_ns3_program('tutorial-linear-dumbbell', ['core'])
+    obj = bld.create_ns3_program('tutorial-linear-dumbbell', ['internet-node', 'point-to-point'])
     obj.source = 'tutorial-linear-dumbbell.cc'
 
-    obj = bld.create_ns3_program('testipv4', ['core'])
+    obj = bld.create_ns3_program('testipv4', ['node'])
     obj.source = ['testipv4.cc', 'ipv4-address-generator.cc']
 
-    obj = bld.create_ns3_program('tutorial-bus-network', ['core'])
+    obj = bld.create_ns3_program('tutorial-bus-network', ['internet-node'])
     obj.source = ['tutorial-bus-network.cc',
                   'ipv4-bus-network.cc',
                   'ipv4-address-generator.cc']
--- a/utils/wscript	Fri Nov 16 08:47:17 2007 +0100
+++ b/utils/wscript	Tue Nov 20 18:27:43 2007 +0000
@@ -12,7 +12,7 @@
 def build(bld):
     env = bld.env_of_name('default')
 
-    unit_tests = bld.create_ns3_program('run-tests')
+    unit_tests = bld.create_ns3_program('run-tests', ['common'])
     unit_tests.install_var  = 0 # do not install
     unit_tests.unit_test    = 1 # runs on 'waf check'
     unit_tests.source = 'run-tests.cc'
--- a/wscript	Fri Nov 16 08:47:17 2007 +0100
+++ b/wscript	Tue Nov 20 18:27:43 2007 +0000
@@ -150,6 +150,7 @@
     program.name = name
     program.target = program.name
     program.uselib_local = 'ns3'
+    program.ns3_module_dependencies = ['ns3-'+dep for dep in dependencies]
     return program
 
 
@@ -178,14 +179,10 @@
         raise SystemExit(0)
 
     # process subfolders from here
+    bld.add_subdirs('lib') # first subdirs are processed last by WAF
     bld.add_subdirs('src')
     bld.add_subdirs('samples utils examples tutorial')
 
-    ## Create a single ns3 library containing all modules
-    lib = bld.create_obj('cpp', 'shlib')
-    lib.name = 'ns3'
-    lib.target = 'ns3'
-    lib.add_objects = list(bld.env_of_name('default')['NS3_MODULES'])
 
 
 def shutdown():
@@ -214,11 +211,17 @@
     ## generate the trace sources list docs
     env = Params.g_build.env_of_name('default')
     proc_env = _get_proc_env()
-    prog = _find_program('print-introspected-doxygen', env).m_linktask.m_outputs[0].abspath(env)
-    out = open('doc/introspected-doxygen.h', 'w')
-    if subprocess.Popen([prog], stdout=out, env=proc_env).wait():
-        raise SystemExit(1)
-    out.close()
+    try:
+        prog = _find_program('print-introspected-doxygen', env).m_linktask.m_outputs[0].abspath(env)
+    except ValueError: # could happen if print-introspected-doxygen is
+                       # not built because of waf configure
+                       # --enable-modules=xxx
+        pass
+    else:
+        out = open('doc/introspected-doxygen.h', 'w')
+        if subprocess.Popen([prog], stdout=out, env=proc_env).wait():
+            raise SystemExit(1)
+        out.close()
 
     run_program('run-tests')