3 Първи стъпки
3.1 Преглед
3.2 Предварителни условия
3.2.1 Изтегляне на изданието ns-3 като изходен архив
3.3 Изтегляне на ns-3 с помощта на Git
3.3.1 Зареждане на ns-3 с помощта на Bake
3.4 Монтаж ns-3
3.4.1 Изграждане с build.py
3.4.2 Изграждане с Bake
3.4.3 Създаване с Waf
3.5 Тестване на ns-3
3.6 Изпълнение на скрипта
3.6.1 Аргументи на командния ред
3.6.2 Отстраняване на грешки
3.6.3 Работна директория
Глава 3
Приготвяме се да започнем
Тази глава има за цел да подготви читателя да започне с компютър, който може никога да не е инсталирал ns-3. Той обхваща поддържаните платформи, предпоставки, как да получите ns-3, как да изградите ns-3 и как да тествате вашата компилация и стартиране на прости програми.
3.1 Преглед
Симулаторът ns-3 е изграден като система от софтуерни библиотеки за сътрудничество. По време на асемблирането кодът на потребителските програми се свързва с тези библиотеки. Езиците за програмиране C++ или Python се използват за писане на потребителски програми.
Ns-3 се разпространява като изходен код, което означава, че целевата система трябва да има среда за разработка на софтуер, за да се изградят първо библиотеките и след това потребителската програма. По принцип ns-3 могат да се разпространяват като готови библиотеки за конкретна система и в бъдеще може да се разпространяват по този начин. Но в днешно време много потребители всъщност вършат работата си, като редактират самия ns-3, така че е полезно да имате изходния код за изграждане на библиотеките. Ако някой желае да поеме работата по създаването на готови библиотеки и пакети за операционни системи, моля, свържете се с пощенския списък ns-разработчици.
След това ще разгледаме три начина за изтегляне и изграждане на ns-3. Първият е да изтеглите и изградите официалната версия от основния сайт. Вторият е изборът и сглобяването на копия на развойните версии на основната инсталация ns-3. Третото е да използвате допълнителни инструменти за изграждане, за да заредите повече разширения за ns-3. Ще разгледаме всеки от тях, тъй като инструментите са малко по-различни.
Опитните потребители на Linux може да се чудят защо ns-3 не се предоставя като пакет като повечето други библиотеки, които използват мениджър на пакети? Въпреки че има двоични пакети за различни Linux дистрибуции (напр. Debian), повечето потребители в крайна сметка редактират библиотеките и трябва сами да възстановят ns-3, така че наличието на изходния код е удобно. Поради тази причина ще се съсредоточим върху инсталирането от източника.
За повечето приложения ns-3 права корен не са необходими, препоръчително е да използвате непривилегирован потребителски акаунт.
3.2 Предварителни условия
Целият набор от налични ns-3 библиотеки има редица зависимости от библиотеки на трети страни, но в по-голямата си част ns-3 може да се изгради и използва с поддръжка на няколко общи (често инсталирани по подразбиране) компонента: C++ компилатор, Python, редактор на изходен код (напр. Vim, Emacs или Затъмнение) и, ако се използват хранилища за разработка, Git системи за контрол на версиите. Повечето потребители за първи път няма да се притесняват, ако конфигурацията им докладва, че липсват някои разширени функции на ns-3, но за тези, които искат пълна инсталация, проектът предоставя wiki, което включва страници с много полезни съвети и трикове. Една такава страница е страницата за инсталиране с инструкции за инсталиране за различни системи, достъпна на:
Разделът Предпоставки на тази wiki обяснява кои пакети са необходими за поддържане на общи опции за ns-3 и също така предоставя командите, използвани за инсталирането им в общи разновидности на Linux или macOS.
Можете да се възползвате от тази възможност, за да разгледате wiki страницата на ns-3 или основния уебсайт:
Пакет с инструменти/Версия
- C++ компилатор
clang++ или g++ (g++ версия 4.9 или по-нова) - Питон
python2 версия >= 2.7.10 или python3 версия >=3.4 - отивам
всяка последна версия (за достъп до ns-3 на GitLab.com) - катран
всяка най-нова версия (за разопаковане на версия ns‑3) - bunzip2
всяка последна версия (за разопаковане на изданието ns‑3)
За да проверите версията по подразбиране на Python, въведете python -V
. За да проверите версията на g++, въведете g++ -v
. Ако някои инструменти липсват или са твърде стари, моля, направете справка с ръководството за инсталиране на wiki страницата ns-3.
Отсега нататък приемаме, че четецът работи с Linux, MacOS или Linux емулатор и разполага поне с горните инструменти.
3.2.1 Изтегляне на изданието ns-3 като изходен архив
Това е курсът на действие за нов потребител, който иска да изтегли и експериментира с най-новата версия и пакетни версии на ns-3. Изданията ns-3 се публикуват като архиви с компресиран източник, понякога наричани тарбол. тарбол е специален софтуерен архивен формат, в който няколко файла се комбинират заедно. Архивът обикновено е компресиран. Процес на стартиране на ns-3 чрез тарбол е проста, просто трябва да изберете издание, да го изтеглите и разопаковате.
Да предположим, че вие, като потребител, искате да изградите ns-3 в локална директория, наречена работно пространство. Можете да получите работно копие на изданието, като въведете следното в конзолата на Linux (като замените съответните номера на версията, разбира се)
$ cd
$ mkdir workspace
$ cd workspace
$ wget https://www.nsnam.org/release/ns-allinone-3.29.tar.bz2
$ tar xjf ns-allinone-3.29.tar.bz2
Обърнете внимание на използваната по-горе програма Wget, който е инструмент от командния ред за изтегляне на обекти от Интернет. Ако не сте го инсталирали, можете да използвате браузъра си за това.
Следвайки тези стъпки, ще ви отведе до директорията ns-allinone-3.29, там трябва да видите няколко файла и директории
$ cd ns-allinone-3.29
$ ls
bake constants.py ns-3.29 README
build.py netanim-3.108 pybindgen-0.17.0.post58+ngcf00cc0 util.py
Вече сте готови да изградите базовата дистрибуция ns-3 и можете да преминете към раздела за изграждане на ns-3.
3.3 Изтегляне на ns-3 с помощта на Git
Кодът ns-3 е достъпен в Git хранилищата на GitLab.com на адрес
Най-лесният начин да започнете да използвате Git хранилища е да разклоните или клонирате средата ns-3-алинон. Това е набор от скриптове, които управляват зареждането и асемблирането на най-често използваните ns-3 подсистеми. Ако сте нов в Git, термините "форк" и "клонинг" може да са ви непознати; ако е така, препоръчваме ви просто да клонирате (направите свое собствено копие) хранилището, намиращо се на GitLab.com по следния начин:
$ cd
$ mkdir workspace
$ cd workspace
$ git clone https://gitlab.com/nsnam/ns-3-allinone.git
$ cd ns-3-allinone
На този етап изгледът на вашата директория ns-3-алинон малко по-различен от директорията за архивиране на версиите, описана по-горе. Трябва да изглежда нещо подобно:
$ ls
build.py constants.py download.py README util.py
Моля, имайте предвид, че има скрипт изтегляне.py, който допълнително ще извлече ns-3 и придружаващия го изходен код. Тук имате избор: или изтеглете най-новата моментна снимка на разработката на ns-3:
$ python download.py
или предпочитайте изданието ns-3, като използвате флага -n
за да посочите номера на изданието:
$ python download.py -n ns-3.29
След тази стъпка към директорията ns-3-алинон ще бъдат изтеглени допълнителни хранилища ns-3, пекат, pybindgen и нетаним.
Внимание
На машина с чист Ubuntu16.04 трябваше да променя командата на следното: $ sudo python3 download.py -n ns-3.29
(по-нататък бележки на преводача).
3.3.1 Зареждане на ns-3 с помощта на Bake
Горните два метода (изходен архив или хранилище ns-3-алинон чрез Git) са полезни за получаване на най-простата ns-3 инсталация с множество добавки (pybindgen за генериране на Python свързвания и нетаним за мрежова анимация). Третото хранилище, предоставено по подразбиране в ns-3-allinone, се извиква пекат.
пека е инструмент за координирано изграждане на софтуер от множество хранилища, разработен за проекта ns-3. пека може да се използва за получаване на версии за разработка на ns-3, както и за изтегляне и изграждане на разширения на базовата версия на разпространението ns-3, като например средата Директно изпълнение на код, CradleNetwork Симулационна люлка, възможността за създаване на нови обвързвания на Python и различни ns-3 „приложения“.
Внимание
CradleNetwork Simulation Cradle е рамка, която ви позволява да използвате реални TCP/IP мрежови стекове в мрежов симулатор.
Ако очаквате вашата инсталация ns-3 да има разширени или допълнителни функции, можете да следвате този път за инсталиране.
В най-новите версии на ns-3 пека беше добавен към изданието tar. Изданието включва конфигурационен файл, който ви позволява да изтеглите текущите версии на софтуера към момента на издаването. Такава е например версията пека, който се разпространява с версия ns-3.29, може да се използва за извличане на компоненти за тази версия на ns-3 или по-ранна, но не може да се използва за извличане на компоненти за по-късни версии (ако файлът с описание на пакета bakeconf.xml не е актуализиран).
Можете също да получите най-новото копие пекаткато въведете следната команда във вашата Linux конзола (при положение, че имате инсталиран Git):
$ cd
$ mkdir workspace
$ cd workspace
$ git clone https://gitlab.com/nsnam/bake.git
Когато изпълните командата git, трябва да видите нещо като следното:
Cloning into 'bake'...
remote: Enumerating objects: 2086, done.
remote: Counting objects: 100% (2086/2086), done.
remote: Compressing objects: 100% (649/649), done.
remote: Total 2086 (delta 1404), reused 2078 (delta 1399)
Receiving objects: 100% (2086/2086), 2.68 MiB | 3.82 MiB/s, done.
Resolving deltas: 100% (1404/1404), done.
След като командата приключи клонинг трябва да имате директория с име пекат, чието съдържание трябва да изглежда така:
$ cd bake
$ ls
bake bakeconf.xml bake.py doc examples generate-binary.py test TODO
Имайте предвид, че сте заредили няколко Python скрипта, Python модул с име пекат и XML конфигурационен файл. Следващата стъпка е да използвате тези скриптове, за да изтеглите и изградите ns-3 дистрибуцията по ваш избор. Налични са няколко цели за персонализиране:
-
ns-3.29: модул, съответстващ на изданието; ще изтегли компоненти, подобни на изданието в tarball;
-
ns-3-dev: подобен модул, но използващ код от дървото за разработка;
-
ns-алинон-3.29: Модул, който включва други допълнителни функции като маршрутизиране на щракване и люлка за мрежова симулация, Openflow за ns-3.
-
ns-3-алинон: подобно на версията за освобождаване на модула AllInOne, но за код за разработка.
Внимание
Кликнете — модулна софтуерна архитектура за създаване на рутери.
Openflow е протокол за управление на процеса на обработка на данни, предавани през мрежа за данни от рутери и комутатори, прилагайки софтуерно дефинирана мрежова технология.
Моментната снимка на текущата разработка (неиздавана) ns-3 може да бъде намерена на:
Разработчиците се опитват да поддържат тези хранилища в последователен работен ред, но те са в зоната за разработка и съдържат непубликуван код, така че ако не планирате да използвате нови функции, изберете официалната версия.
Можете да намерите най-новата версия на кода, като прегледате списъка с хранилища или като отидете на уеб страницата на ns-3 Releases:
Сега, за да получим компонентите ns-3, от които се нуждаем, ще използваме инструмента пека. Нека кажем няколко уводни думи за работата пека.
Bake работи, като зарежда източници на пакети в директория източник и инсталиране на библиотеките в директорията за изграждане. пека може да се стартира чрез препратка към двоичния файл, но ако искате да стартирате пека не от директорията, в която е изтеглен, препоръчително е да добавите пътя към пекат към вашия път (променлива на средата PATH), например както следва (пример за Linux bash shell). Отидете в директорията "bake" и след това задайте следните променливи на средата:
$ export BAKE_HOME=`pwd`
$ export PATH=$PATH:$BAKE_HOME:$BAKE_HOME/build/bin
$ export PYTHONPATH=$PYTHONPATH:$BAKE_HOME:$BAKE_HOME/build/lib
Това ще постави програмата bake.py към пътя на обвивката и ще позволи на други програми да намерят изпълнимите файлове и библиотеките, които е създал пекат. В някои случаи на употреба пекат, настройката PATH и PYTHONPATH, описана по-горе, не се изисква, но пълната компилация на ns-3-allinone (с допълнителни пакети) обикновено го изисква.
Отидете в работната си директория и въведете следното в конзолата:
$ ./bake.py configure -e ns-3.29
След това ще питаме пека проверете дали имаме достатъчно инструменти за зареждане на различните компоненти. Циферблат:
$ ./bake.py check
Трябва да видите нещо като следното:
> Python - OK
> GNU C++ compiler - OK
> Mercurial - OK
> Git - OK
> Tar tool - OK
> Unzip tool - OK
> Make - OK
> cMake - OK
> patch tool - OK
> Path searched for tools: /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin ...
По-специално, инструменти за качване като Mercurial, CVS, Git и Bazaar са от съществено значение в тази стъпка, тъй като ни позволяват да получим кода. На този етап инсталирайте липсващите инструменти по обичайния начин за вашата система (ако знаете как) или се свържете с вашия системен администратор за помощ.
След това опитайте да изтеглите софтуера:
$ ./bake.py download
резултатът трябва да е нещо като:
>> Searching for system dependency setuptools - OK
>> Searching for system dependency libgoocanvas2 - OK
>> Searching for system dependency gi-cairo - OK
>> Searching for system dependency pygobject - OK
>> Searching for system dependency pygraphviz - OK
>> Searching for system dependency python-dev - OK
>> Searching for system dependency qt - OK
>> Searching for system dependency g++ - OK
>> Downloading pybindgen-0.19.0.post4+ng823d8b2 (target directory:pybindgen) - OK
>> Downloading netanim-3.108 - OK
>> Downloading ns-3.29 - OK
Това ще означава, че са изтеглени три източника. Сега отидете в изходната директория и въведете ls; Трябва да видиш:
$ cd source
$ ls
netanim-3.108 ns-3.29 pybindgen
Сега сте готови да изградите дистрибуцията ns-3.
3.4 Монтаж ns-3
Както при изтеглянето на ns-3, има няколко начина за изграждане на ns-3. Основното нещо, което искаме да подчертаем е, че ns-3 е изграден с помощта на инструмент за изграждане, наречен Wafописани по-долу. Повечето потребители ще работят с Waf, но има няколко удобни скрипта, които да ви помогнат да започнете или да организирате по-сложни компилации. Така че, моля, преди да прочетете за Waf, погледни build.py и монтаж с пекат.
3.4.1 Изграждане с build.py
Внимание! Тази стъпка на изграждане е достъпна само от изходната архивна версия, получена, както е описано по-горе; и не е изтеглен чрез git или bake.
Когато работите с архив на версиите тарбол, Аз Н ns-3-алинон Има удобен скрипт, който може да улесни сглобяването на компонентите. Нарича се build.py. Тази програма ще настрои проекта за вас по най-полезния начин. Обърнете внимание обаче, че по-усъвършенстваната настройка и работа с ns-3 обикновено включва използването на собствената система за изграждане на ns-3, Waf, която ще бъде представена по-късно в този урок.
Ако сте изтеглили с помощта на тарбол, след това във вашата директория ~/работно пространство директория с име нещо като ns-алинон-3.29. Въведете следния:
$ ./build.py --enable-examples --enable-tests
При обаждане build.py Използвахме аргументи на командния ред, за да изградим примерите и тестовете, използвани в този урок, които не са изградени по подразбиране в ns-3. По подразбиране програмата изгражда и всички налични модули. След това, ако желаете, можете да изградите ns-3 без примери и тестове или да изключите модули, които не са необходими за вашата работа.
Ще видите много изходни съобщения на компилатора, показани от скрипта, докато изгражда различните части, които сте заредили. Първо скриптът ще се опита да създаде аниматора нетаним, след това генераторът на свързване pybindgen и накрая ns-3. Когато процесът приключи, трябва да видите следното:
Waf: Leaving directory '/path/to/workspace/ns-allinone-3.29/ns-3.29/build'
'build' finished successfully (6m25.032s)
Modules built:
antenna aodv applications
bridge buildings config-store
core csma csma-layout
dsdv dsr energy
fd-net-device flow-monitor internet
internet-apps lr-wpan lte
mesh mobility mpi
netanim (no Python) network nix-vector-routing
olsr point-to-point point-to-point-layout
propagation sixlowpan spectrum
stats tap-bridge test (no Python)
topology-read traffic-control uan
virtual-net-device visualizer wave
wifi wimax
Modules not built (see ns-3 tutorial for explanation):
brite click openflow
Leaving directory ./ns-3.29
В последните три реда на списъка виждаме съобщение за модули, които не са изградени:
Modules not built (see ns-3 tutorial for explanation):
brite click
Това просто означава, че някои модули ns-3, които зависят от външни библиотеки, може да не са изградени или че не е необходимо да бъдат изградени за тази конфигурация. Това не означава, че симулаторът не е сглобен или че сглобените модули няма да работят правилно.
3.4.2 Изграждане с Bake
Ако сте използвали bake по-горе, за да получите изходния код от хранилищата на проекта, можете да продължите да го използвате за изграждане на ns-3. Циферблат:
$ ./bake.py build
и трябва да видите нещо като:
>> Building pybindgen-0.19.0.post4+ng823d8b2 - OK
>> Building netanim-3.108 - OK
>> Building ns-3.29 - OK
помощ: Можете също така да извършите едновременно стъпките за изтегляне и изграждане, като извикате „bake.py deploy“.
Сглобяването на всички компоненти може да е неуспешно, но сглобяването ще продължи, ако компонент не е необходим. Например скорошен проблем с преносимостта беше това castxml може да се сглоби с инструмент пекат не на всички платформи. В този случай ще се появи съобщение като това:
>> Building castxml - Problem
> Problem: Optional dependency, module "castxml" failed
This may reduce the functionality of the final build.
However, bake will continue since "castxml" is not an essential dependency.
For more information call bake with -v or -vvv, for full verbose mode.
Но castxml необходим само ако искате да създадете актуализирани обвързвания на Python. За повечето потребители няма нужда от това (поне докато не сменят ns-3), така че подобни предупреждения могат спокойно да бъдат игнорирани засега.
Ако не успее, следната команда ще ви даде намек за липсващи зависимости:
$ ./bake.py show
Ще бъдат изброени различните зависимости на пакетите, които се опитвате да създадете.
3.4.3 Създаване с Waf
До този момент, за да започнем изграждането на ns-3, използвахме или скрипта build.py, или инструмент пекат. Тези инструменти са полезни за изграждане на ns-3 и поддържане на библиотеки. Всъщност, за изграждане те стартират инструмента за изграждане Waf от директория ns-3. Waf инсталиран с изходния код ns-3. Повечето потребители бързо преминават към директна употреба за конфигуриране и сглобяване на ns‑3 Waf. Така че, за да продължите, моля, отидете в директорията ns-3, която сте създали първоначално.
Това не е строго задължително в момента, но ще бъде полезно да се върнете малко назад и да видите как да направите промени в конфигурацията на проекта. Вероятно най-полезната промяна в конфигурацията, която можете да направите, е да създадете оптимизирана версия на кода. По подразбиране сте конфигурирали проекта си за изграждане на версия за отстраняване на грешки. Нека да разгледаме проект за създаване на оптимизирана компилация. За да обясните на Waf, че трябва да прави оптимизирани компилации, които включват примери и тестове, ще трябва да изпълните следните команди:
$ ./waf clean
$ ./waf configure --build-profile=optimized --enable-examples --enable-tests
Това ще стартира Waf извън локалната директория (за ваше удобство). Първата команда изчиства от предишната компилация, това обикновено не е строго необходимо, но е добра практика (вижте също профилите на компилация по-долу); това ще изтрие предварително създадени библиотеки и обектни файлове, намиращи се в директорията изграждане /. Когато проектът е преконфигуриран и системата за изграждане проверява различните зависимости, трябва да видите изход, подобен на следния:
Setting top to : /home/ns3user/workspace/bake/source/ns-3-dev
Setting out to : /home/ns3user/workspace/bake/source/ns-3-dev/build
Checking for 'gcc' (C compiler) : /usr/bin/gcc
Checking for cc version : 7.3.0
Checking for 'g++' (C++ compiler) : /usr/bin/g++
Checking for compilation flag -march=native support : ok
Checking for compilation flag -Wl,--soname=foo support : ok
Checking for compilation flag -std=c++11 support : ok
Checking boost includes : headers not found, please ,!provide a --boost-includes argument (see help)
Checking boost includes : headers not found, please ,!provide a --boost-includes argument (see help)
Checking for program 'python' : /usr/bin/python
Checking for python version >= 2.3 : 2.7.15 python-config : /usr/bin/python-config
Asking python-config for pyembed '--cflags --libs --ldflags' flags : yes
Testing pyembed configuration : yes
Asking python-config for pyext '--cflags --libs --ldflags' flags : yes
Testing pyext configuration : yes
Checking for compilation flag -fvisibility=hidden support : ok
Checking for compilation flag -Wno-array-bounds support : ok
Checking for pybindgen location : ../pybindgen ,!(guessed)
Checking for python module 'pybindgen' : 0.19.0. ,!post4+g823d8b2
Checking for pybindgen version : 0.19.0. ,!post4+g823d8b2
Checking for code snippet : yes
Checking for types uint64_t and unsigned long equivalence : no
Checking for code snippet : no
Checking for types uint64_t and unsigned long long equivalence : yes
Checking for the apidefs that can be used for Python bindings : gcc-LP64
Checking for internal GCC cxxabi : complete
Checking for python module 'pygccxml' : not found
Checking for click location : not found
Checking for program 'pkg-config' : /usr/bin/pkg- ,!config
Checking for 'gtk+-3.0' : not found
Checking for 'libxml-2.0' : yes
checking for uint128_t : not found
checking for __uint128_t : yes
Checking high precision implementation : 128-bit integer ,!(default)
Checking for header stdint.h : yes
Checking for header inttypes.h : yes
Checking for header sys/inttypes.h : not found
Checking for header sys/types.h : yes
Checking for header sys/stat.h : yes
Checking for header dirent.h : yes
Checking for header stdlib.h : yes
Checking for header signal.h : yes
Checking for header pthread.h : yes
Checking for header stdint.h : yes
Checking for header inttypes.h : yes
Checking for header sys/inttypes.h : not found
Checking for library rt : yes
Checking for header sys/ioctl.h : yes
Checking for header net/if.h : yes
Checking for header net/ethernet.h : yes
Checking for header linux/if_tun.h : yes
Checking for header netpacket/packet.h : yes
Checking for NSC location : not found
Checking for 'sqlite3' : not found
Checking for header linux/if_tun.h : yes
Checking for python module 'gi' : 3.26.1
Checking for python module 'gi.repository.GObject' : ok
Checking for python module 'cairo' : ok
Checking for python module 'pygraphviz' : 1.4rc1
Checking for python module 'gi.repository.Gtk' : ok
Checking for python module 'gi.repository.Gdk' : ok
Checking for python module 'gi.repository.Pango' : ok
Checking for python module 'gi.repository.GooCanvas' : ok
Checking for program 'sudo' : /usr/bin/sudo
Checking for program 'valgrind' : not found
Checking for 'gsl' : not found python-config : not found
Checking for compilation flag -fstrict-aliasing support : ok
Checking for compilation flag -fstrict-aliasing support : ok
Checking for compilation flag -Wstrict-aliasing support : ok
Checking for compilation flag -Wstrict-aliasing support : ok
Checking for program 'doxygen' : /usr/bin/doxygen
---- Summary of optional ns-3 features:
Build profile : optimized
Build directory :
BRITE Integration : not enabled (BRITE not enabled (see option --with- ,!brite))
DES Metrics event collection : not enabled (defaults to disabled)
Emulation FdNetDevice : enabled
Examples : enabled
File descriptor NetDevice : enabled
GNU Scientific Library (GSL) : not enabled (GSL not found)
Gcrypt library : not enabled
(libgcrypt not found: you can use ,!libgcrypt-config to find its location.) GtkConfigStore : not enabled (library 'gtk+-3.0 >= 3.0' not fou nd)
MPI Support : not enabled (option --enable-mpi not selected)
ns-3 Click Integration : not enabled (nsclick not enabled (see option --with- ,!nsclick))
ns-3 OpenFlow Integration : not enabled (Required boost libraries not found)
Network Simulation Cradle : not enabled (NSC not found (see option --with-nsc))
PlanetLab FdNetDevice : not enabled (PlanetLab operating system not detected ,!(see option --force-planetlab)) PyViz visualizer : enabled
Python API Scanning Support : not enabled (Missing 'pygccxml' Python module)
Python Bindings : enabled
Real Time Simulator : enabled
SQlite stats data output : not enabled (library 'sqlite3' not found)
Tap Bridge : enabled
Tap FdNetDevice : enabled
Tests : enabled
Threading Primitives : enabled
Use sudo to set suid bit : not enabled (option --enable-sudo not selected)
XmlIo : enabled
'configure' finished successfully (6.387s)
Моля, обърнете внимание на последната част от списъка по-горе. Някои опции на ns-3 не са активирани по подразбиране или изискват системна поддръжка, за да функционират правилно. Например, за да активирате XmlTo, библиотеката трябва да присъства в системата libxml-2.0. Ако тази библиотека не е намерена и съответната функция ns-3 не е активирана, ще се покаже съобщение. Също така имайте предвид, че е възможно да използвате командата Sudo за да зададете suid бита „задаване на идентификатор на група по време на изпълнение“ за определени програми. Не е активирана по подразбиране и затова тази функция се показва като „не е активирана“. И накрая, за да получите списък с активирани опции, използвайте Waf с параметър --check-config
.
Сега нека се върнем и да превключим обратно към компилацията за отстраняване на грешки, съдържаща примери и тестове.
$ ./waf clean
$ ./waf configure --build-profile=debug --enable-examples --enable-tests
Системата за изграждане вече е настроена и можете да създавате версии за отстраняване на грешки на ns-3 програми, като просто напишете:
$ ./waf
Стъпките по-горе може да са ви принудили да изградите част от системата ns-3 два пъти, но сега знаете как да промените конфигурацията и да изградите оптимизиран код.
За да проверите кой профил е активен за дадена конфигурация на проекта, има команда:
$ ./waf --check-profile
Waf: Entering directory `/path/to/ns-3-allinone/ns-3.29/build'
Build profile: debug
Горният сценарий build.py също подкрепя аргументи --enable-examples
и --enable-tests
, но други опции Waf не поддържа директно. Например, това няма да работи:
$ ./build.py --disable-python
реакцията ще бъде следната:
build.py: error: no such option: --disable-python
Въпреки това, специалният оператор - - може да се използва за предаване на допълнителни параметри чрез WAFтака че вместо горното ще работи следната команда:
$ ./build.py -- --disable-python
защото генерира основната команда ./waf configure --disable-python. Ето още няколко въвеждащи съвета за Waf.
Обработка на грешки при компилиране
Изданията на ns-3 са тествани на най-новите компилатори на C++, налични към момента на издаването на общи дистрибуции на Linux и MacOS. С течение на времето обаче се пускат нови дистрибуции с нови компилатори и тези по-нови компилатори са склонни да бъдат по-педантични относно предупрежденията. ns-3 конфигурира своята компилация да третира всички предупреждения като грешки, така че понякога, ако използвате по-стара версия на по-нова система, предупреждението на компилатора може да спре компилацията.
Например, преди това имаше издание на ns‑3.28 за Fedora 28, което включваше нова основна версия GCC (gcc-8). При изграждане на изданието ns-3.28 или по-ранни версии под Fedora 28, с инсталиран Gtk2+, ще възникне следната грешка:
/usr/include/gtk-2.0/gtk/gtkfilechooserbutton.h:59:8: error: unnecessary parentheses ,!in declaration of ‘__gtk_reserved1’ [-Werror=parentheses] void (*__gtk_reserved1);
В версии, започващи от ns‑3.28.1, in Waf налична е опция за решаване на тези проблеми. Той деактивира настройката на флага "-Werror" в g++ и clang++. Това е опцията "--disable-werror" и трябва да се приложи по време на конфигурацията:
$ ./waf configure --disable-werror --enable-examples --enable-tests
Конфигурирайте или сглобете
Някои команди Waf имат значение само във фазата на конфигуриране, а някои са валидни само във фазата на изграждане. Например, ако искате да използвате функциите за емулация на ns-3, можете да активирате битовата настройка SUID използване Sudo, както е описано по-горе. Това ще отмени командите на стъпката за конфигуриране и по този начин можете да промените конфигурацията, като използвате следната команда, която също включва примери и тестове.
$ ./waf configure --enable-sudo --enable-examples --enable-tests
Ако направите това Waf ще стартира Sudoза промяна на програмите за създаване на сокет за код за емулация, така че да се изпълняват с разрешения корен. В Waf Има много други налични опции за конфигурация и стъпки за изграждане. За да разгледате опциите си, въведете:
$ ./waf --help
В следващия раздел ще използваме някои опции, свързани с тестването.
Монтажни профили
Вече видяхме как можете да конфигурирате Waf за сглобки отстраняване на грешки и оптимизирани:
$ ./waf --build-profile=debug
Има и междинен монтажен профил, освободи. опция -d
е синоним на --build-profile
. Профилът на изграждане контролира използването на превключватели за регистриране, твърдения и оптимизация на компилатора:
Както можете да видите, регистрирането и твърденията са налични само в компилации за отстраняване на грешки. Препоръчителната практика е да разработите своя скрипт в режим на отстраняване на грешки, след което да извършите многократни стартирания (за статистика или промени на параметрите) в оптимизиран профил на компилация.
Ако имате код, който трябва да се изпълнява само в определени профили на компилация, използвайте макроса Code Wrapper:
NS_BUILD_DEBUG (std::cout << "Part of an output line..." << std::flush; timer.Start ,!()); DoLongInvolvedComputation ();
NS_BUILD_DEBUG (timer.Stop (); std::cout << "Done: " << timer << std::endl;)
По подразбиране, Waf поставя артефакти за изграждане в директорията за изграждане. Можете да посочите различна изходна директория, като използвате опцията - -out
, например:
$ ./waf configure --out=my-build-dir
Като комбинирате това с профили за изграждане, можете лесно да превключвате между различни опции за компилиране:
$ ./waf configure --build-profile=debug --out=build/debug
$ ./waf build
...
$ ./waf configure --build-profile=optimized --out=build/optimized
$ ./waf build
...
Което ви позволява да работите с множество асембли, без да се налага да пренаписвате най-новата асембли всеки път. Когато превключите към друг профил, Waf ще компилира само него, без да прекомпилира напълно всичко.
Когато превключвате профилите за изграждане по този начин, трябва да внимавате да давате едни и същи опции за конфигурация всеки път. Дефинирането на няколко променливи на средата ще ви помогне да избегнете грешки:
$ export NS3CONFIG="--enable-examples --enable-tests"
$ export NS3DEBUG="--build-profile=debug --out=build/debug"
$ export NS3OPT=="--build-profile=optimized --out=build/optimized"
$ ./waf configure $NS3CONFIG $NS3DEBUG
$ ./waf build
...
$ ./waf configure $NS3CONFIG $NS3OPT
$ ./waf build
Компилатори и флагове
В горните примери Waf за изграждане на ns-3 използва C++ компилатора от GCC ( g ++). Можете обаче да промените този, който използвате Waf C++ компилатор, чрез дефиниране на променливата на средата CXX. Например, за да използвате C++ компилатора Clang, clang++,
$ CXX="clang++" ./waf configure
$ ./waf build
По същия начин можете да конфигурирате Waf за използване на разпределена компилация с помощта на distcc:
$ CXX="distcc g++" ./waf configure
$ ./waf build
Повече информация за distcc и разпределената компилация можете да намерите на страницата на проекта в раздела Документация. За да добавите флагове на компилатора при конфигуриране на ns-3, използвайте променливата на средата CXXFLAGS_EXTRA.
Инсталация
Waf може да се използва за инсталиране на библиотеки на различни места в системата. По подразбиране компилираните библиотеки и изпълними файлове се намират в директорията изграждане на, и тъй като Waf знае местоположението на тези библиотеки и изпълними файлове, няма нужда да инсталирате библиотеките никъде другаде.
Ако потребителите предпочитат да инсталират извън директорията за изграждане, те могат да изпълнят командата ./waf инсталиране. Префиксът по подразбиране за инсталиране е / ЮЕсАр / местни, следователно ./waf инсталиране ще инсталира програми в / ЮЕсАр / местни / хамбар, библиотеки в / ЮЕсАр / местни / ИЪ и заглавни файлове в /usr/local/include. Правата на суперпотребител обикновено трябва да бъдат зададени с префикс по подразбиране, така че типичната команда би била sudo ./waf инсталирайте. Когато се стартира, Waf първо ще избере да използва споделените библиотеки в директорията за изграждане, след което ще потърси библиотеки по пътя към библиотеките, конфигурирани в локалната среда. Така че, когато инсталирате библиотеки на система, добра практика е да проверите дали се използват правилните библиотеки. Потребителите могат да изберат да инсталират с различен префикс, като подадат опцията по време на конфигурацията --prefix
, например:
./waf configure --prefix=/opt/local
Ако по-късно, след изграждането, потребителят въвежда командата за инсталиране ./waf
, ще се използва префиксът /опция/местен.
Отбор ./waf clean
трябва да се използва преди преконфигуриране на проекта, ако инсталацията ще използва Waf под различен префикс.
По този начин, за да използвате ns-3, няма нужда да се обаждате ./waf install
. Повечето потребители няма да имат нужда от тази команда, защото Waf ще вземе текущите библиотеки от директорията за изграждане, но някои потребители може да намерят това полезно, ако дейностите им включват работа с програми извън директорията ns-3.
Waf сингъл
На най-горното ниво на дървото на източника ns-3 има само един Waf скрипт. След като започнете работа, ще прекарате много време в директорията scratch/
или по-дълбоко вsrc/...
и в същото време трябва да бягате Waf. Можете просто да си спомните къде се намирате и да избягате Waf както следва:
$ ../../../waf ...
но това ще бъде досадно и податливо на грешки, така че има по-добри решения. Един често срещан начин е да използвате текстов редактор като напр Emacs или Vim, в който се отварят две терминални сесии, едната се използва за изграждане на ns-3, а втората се използва за редактиране на изходния код. Ако имате само тарбол, тогава променлива на средата може да помогне:
$ export NS3DIR="$PWD"
$ function waff { cd $NS3DIR && ./waf $* ; }
$ cd scratch
$ waff build
В директорията на модула може да е изкушаващо да добавите тривиален waf скрипт като exec ../../waf
. Моля те не прави това. Това е объркващо за начинаещите и, когато е направено лошо, води до трудни за откриване грешки при изграждането. Решенията, показани по-горе, са пътя, който трябва да се използва.
3.5 Тестване на ns-3
Можете да изпълните единичните тестове на дистрибуцията ns-3, като изпълните скрипта ./test.py:
$ ./test.py
Тези тестове се провеждат успоредно с Waf. В крайна сметка трябва да видите съобщение, което казва:
92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)
Това е важно съобщение за идентифициране на сривове, сривове или грешки на valgrind, което показва проблеми с кода или несъвместимост между инструменти и код.
Ще видите и крайния резултат от Waf и тестер, изпълняващ всеки тест, който ще изглежда по следния начин:
Waf: Entering directory `/path/to/workspace/ns-3-allinone/ns-3-dev/build'
Waf: Leaving directory `/path/to/workspace/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (1.799s)
Modules built:
aodv applications bridge
click config-store core
csma csma-layout dsdv
emu energy flow-monitor
internet lte mesh
mobility mpi netanim
network nix-vector-routing ns3tcp
ns3wifi olsr openflow
point-to-point point-to-point-layout propagation
spectrum stats tap-bridge
template test tools
topology-read uan virtual-net-device
visualizer wifi wimax
PASS: TestSuite ns3-wifi-interference
PASS: TestSuite histogram
...
PASS: TestSuite object
PASS: TestSuite random-number-generators
92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)
Тази команда обикновено се изпълнява от потребители, за да се провери бързо дали дистрибуцията ns-3 е изградена правилно. (Имайте предвид, че редът на редовете „PASS: ...“ може да е различен, това е нормално. Важното е, че обобщаващият ред в края на отчета показва, че всички тестове са преминали; няма тестове, които са се провалили или са се сбили.) И WafИ test.py ще паралелизира работата в наличните процесорни ядра на машината.
3.6 Изпълнение на скрипта
Обикновено изпълняваме скриптове под контрол Waf. Това позволява на системата за изграждане да гарантира, че пътищата на споделената библиотека са зададени правилно и че библиотеките са налични по време на изпълнение. За да стартирате програмата, просто използвайте Waf с параметър - -run
. Нека изпълним ns-3 еквивалента на повсеместната програма здравей святкато напишете следното:
$ ./waf --run hello-simulator
Waf първо ще провери дали програмата е изградена правилно и ще изгради, ако е необходимо. Тогава Waf ще изпълни програма, която произвежда следния изход.
Hello Simulator
Честито! Вече сте потребител на ns-3!
Какво трябва да направя, ако не виждам резултати?
Ако видите съобщения Wafкоето показва, че изграждането е завършило успешно, но не виждате резултата „Здравей симулатор“, тогава има възможност в секцията [Build-with-Waf] да сте превключили режима на изграждане на оптимизирани, но пропусна превключването обратно към режима отстраняване на грешки. Целият изход на конзолата, използван в този урок, използва специален компонент ns-3, който извършва регистриране и се използва за отпечатване на персонализирани съобщения към конзолата. Изходът от този компонент се дезактивира автоматично, когато се компилира оптимизиран код - той е "оптимизиран". Ако не виждате изхода „Hello Simulator“, въведете следното:
$ ./waf configure --build-profile=debug --enable-examples --enable-tests
за конфигуриране Waf за изграждане на версии за отстраняване на грешки на програми ns-3, които включват примери и тестове. След това трябва да възстановите текущата версия за отстраняване на грешки на кода, като напишете
$ ./waf
Сега, ако стартирате програмата здравей-симулатор, трябва да видите очаквания резултат.
3.6.1 Аргументи на командния ред
За да предадете аргументи на командния ред към програмата ns-3, използвайте следния модел:
$ ./waf --run <ns3-program> --command-template="%s <args>"
Сменете към името на вашата програма и към аргументите. Аргумент - -command-template
за Waf е по същество рецепта за изграждане на действителния команден ред Waf използвани за изпълнение на програмата. Waf проверява дали компилацията е завършена, задава пътищата на споделената библиотека, след това използва предоставения шаблон на командния ред и замества името на програмата за контейнера %s, за да извика изпълнимия файл. Ако намирате този синтаксис за сложен, има по-проста версия, която включва програмата ns-3 и нейните аргументи, оградени в единични кавички:
$ ./waf --run '<ns3-program> --arg1=value1 --arg2=value2 ...'
Друг особено полезен пример е селективното изпълнение на тестови пакети. Да приемем, че има тестов пакет, наречен mytest (всъщност няма). По-горе използвахме скрипта ./test.py, за да изпълним редица тестове паралелно, което многократно извиква тестовата програма тест-бегач. Обадете се тест-бегач директно за провеждане на един тест:
$ ./waf --run test-runner --command-template="%s --suite=mytest --verbose"
Аргументите ще бъдат предадени на програмата тест-бегач. Тъй като mytest не съществува, ще се генерира съобщение за грешка. За да отпечатате наличните опции за тестване, въведете:
$ ./waf --run test-runner --command-template="%s --help"
3.6.2 Отстраняване на грешки
За да стартирате ns-3 програми под друга помощна програма, като програма за отстраняване на грешки (напр. GDB) или инструмент за тестване на паметта (напр. valgrind), използвайте подобна форма - -command-template = "…"
. Например, за да стартирате в дебъгера GDB вашата програма hello-simulator ns-3 с аргументи:
$ ./waf --run=hello-simulator --command-template="gdb %s --args <args>"
Имайте предвид, че името на програмата ns-3 идва с аргумента - -run
, и помощната програма за управление (тук GDB) е първата лексема в аргумента - -command-template
. опция - -args
доклади GDBче останалата част от командния ред принадлежи на "долната" програма. (Някои версии GDB не разбирам варианта - -args
. В този случай премахнете аргументите на програмата от - -command-template
и използвайте набора от команди GDB аргументи.) Можем да комбинираме тази рецепта и предишната, за да изпълним теста под дебъгера:
$ ./waf --run test-runner --command-template="gdb %s --args --suite=mytest --verbose"
3.6.3 Работна директория
Waf трябва да се стартира от местоположението му в горната част на дървото ns-3. Тази папка става работната директория, където ще бъдат записани изходните файлове. Но какво ще стане, ако искате да запазите тези файлове извън дървото на източника на ns-3? Използвайте аргумент - -cwd
:
$ ./waf --cwd=...
Може да ви е по-удобно да получите изходните файлове във вашата работна директория. В този случай може да помогне следното непряко действие:
$ function waff {
CWD="$PWD"
cd $NS3DIR >/dev/null
./waf --cwd="$CWD" $*
cd - >/dev/null
}
Тази украса на предишната версия на командата запазва текущата работна директория, отива в директорията Wafи след това инструктира Waf за да промените работната директория обратно към текущата работна директория, запазена преди стартиране на програмата. Споменаваме отбора - -cwd
За пълнота повечето потребители просто стартират Waf от директорията от най-високо ниво и генерират изходни файлове там.
Източник: www.habr.com