首页 > 代码库 > NS3 让你的仿真脚本运行在你想要的位置

NS3 让你的仿真脚本运行在你想要的位置

需求:

仿真脚本一般放在scratch之下,但是随着仿真程序的增多,这个目录会变得越来越臃肿,于是产生建立子目录的想法.那么到底能不能建立子目录呢?在哪建立子目录更加合适呢?

解决方案:

直接看/ns3.20/wscript,这个文件夹我的理解是w:waf, script当然是脚本的意思,就是waf编译器会调用的仿真脚本.其中的一个片段:

def add_scratch_programs(bld):
    all_modules = [mod[len("ns3-"):] for mod in bld.env['NS3_ENABLED_MODULES']]
    for filename in os.listdir("scratch"):
        if filename.startswith('.') or filename == 'CVS':
	    continue
        if os.path.isdir(os.path.join("scratch", filename)):
            obj = bld.create_ns3_program(filename, all_modules)
            obj.path = obj.path.find_dir('scratch').find_dir(filename)
            obj.source = obj.path.ant_glob('*.cc')
            obj.target = filename
            obj.name = obj.target
            obj.install_path = None
        elif filename.endswith(".cc"):
            name = filename[:-len(".cc")]
            obj = bld.create_ns3_program(name, all_modules)
            obj.path = obj.path.find_dir('scratch')
            obj.source = filename
            obj.target = name
            obj.name = obj.target
            obj.install_path = None
程序注释:

不难看出,这个函数的功能是将scratch添加到编译的目录中,首先判断scratch下面的文件是文件夹还是目录,如果是.cc文件的话,就创建这个ns3的程序;如果是文件夹的话,直接以文件夹的名字创建ns3的程序,所以该子目录下的程序的名字应该和子文件夹的名字相同.这里的设计主要是为了将.cc和.h的文件放在一起,减少空间.


显然,如果我有很多.cc仿真脚本的时候,放在这里并不太合适,那么放在哪里呢? 不错,是examples文件夹. 请看下面一段程序:

def add_examples_programs(bld):
    env = bld.env
    if env['ENABLE_EXAMPLES']:
        for dir in os.listdir('examples'):
            if dir.startswith('.') or dir == 'CVS':
                continue
            if os.path.isdir(os.path.join('examples', dir)):
                bld.recurse(os.path.join('examples', dir))
程序注释:

这个是添加examples文件夹,如果该目录下的文件是文件夹的话,直接跳到该子目录下进行处理.再去它的子目录下看看wscript:

def build(bld):
    obj = bld.create_ns3_program('energy-model-example', ['core', 'mobility', 'wifi', 'energy', 'internet'])
    obj.source = 'energy-model-example.cc'
这里创建ns3的仿真程序.


我们类似创建目录,然后写个wscript就可以了.当然你还可以通过修改wscript,让你的编译更加自由.


附加,我的一次修改仿真脚本的经历:

有次运行程序, 忘记添加scratch目录了,比如直接运行first,但是运行的程序结果并不是我想要的,结果发现运行的是examples下面的子目录下面的.那么waf是怎么选择哪一个同名文件的呢,还是看wscript脚本:

def build(bld):

在上面这个函数中,有这样两句调用:

add_examples_programs(bld)
add_scratch_programs(bld)
发现examples文件夹下面的程序放在前面,试着调换这个顺序,再次运行就优先scratch下面的程序了.

参考:

我在谷歌ns3论坛上关于此问题的提问

waf的学习参考书waf book