需求:
仿真脚本一般放在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