ns3 wscript: 自动寻找需编译的源文件

在ns3的编译体系中,每个module会包含一个名为wscript的python脚本来提供编译信息。例如,一个通过create-module.py创建的module中的wscript为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-

# def options(opt):
# pass

# def configure(conf):
# conf.check_nonfatal(header_name='stdint.h', define_name='HAVE_STDINT_H')

def build(bld):
module = bld.create_ns3_module('example-module', ['core'])
module.source = [
'model/example-module.cc',
'helper/example-module-helper.cc',
]

module_test = bld.create_ns3_module_test_library('example-module')
module_test.source = [
'test/example-module-test-suite.cc',
]

headers = bld(features='ns3header')
headers.module = 'example-module'
headers.source = [
'model/example-module.h',
'helper/example-module-helper.h',
]

if bld.env.ENABLE_EXAMPLES:
bld.recurse('examples')

# bld.ns3_python_bindings()

其中,module.source中包含需要编译的.cc源文件,而headers.source中包含对应的头文件。每次新建C++源代码文件时,都需要手动添加到这里的列表中。下面我给出一个自动从modulemodel, helper目录下搜索源文件的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-

import os


# def options(opt):
# pass

# def configure(conf):
# conf.check_nonfatal(header_name='stdint.h', define_name='HAVE_STDINT_H')

def _list_sources(bld, suffix):
root_dir = bld.path.abspath()
res = [
x for x in
[os.path.join("model", y) for y in os.listdir(os.path.join(root_dir, "model"))]
if x.endswith(suffix)
]
res += [
x for x in
[os.path.join("helper", y) for y in os.listdir(os.path.join(root_dir, "helper"))]
if x.endswith(suffix)
]
return res

def build(bld):
module = bld.create_ns3_module('example-module', ["core"])
module.source = _list_sources(bld, ".cc")

module_test = bld.create_ns3_module_test_library('example-module')
module_test.source = [
'test/mix-autonomy-test-suite.cc',
]

headers = bld(features='ns3header')
headers.module = 'example-module'
headers.source = _list_sources(bld, ".h")

if bld.env.ENABLE_EXAMPLES:
bld.recurse('examples')

# bld.ns3_python_bindings()

注意不要直接套用上面的范例文件,需要将"example-module"的名字改为你的module的名字