Падручнік па сімулятары сеткі ns-3. Кіраўнік 3

Падручнік па сімулятары сеткі ns-3. Кіраўнік 3
кіраўніка 1,2

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-developers.

Далей мы разгледзім тры спосабы загрузкі і зборкі ns‑3. Першы заключаецца ў тым, каб загрузіць і пабудаваць афіцыйны рэліз з асноўнага сайта. Другі - гэта адбор і зборка копій дэвелаперскіх версій базавай устаноўкі ns-3. Трэці - выкарыстанне дадатковых прылад зборкі для загрузкі большай колькасці пашырэнняў для ns-3. Мы пройдземся па кожным, бо інструменты крыху адрозніваюцца.

Дасведчаныя карыстачы Linux могуць задацца пытаннем, чаму ns‑3 не падаецца ў выглядзе пакета, як большасць іншых бібліятэк, выкарыстоўвалых мэнэджар пакетаў? Нягледзячы на ​​тое, што існуюць бінарныя пакеты для розных дыстрыбутываў Linux (напрыклад, Debian), большасць карыстачоў у канчатковым выніку рэдагуюць бібліятэкі і змушаны самі перазбіраць ns‑3, таму даступнасць зыходнага кода зручная. Па гэтай прычыне мы надамо ўвагу ўстаноўцы з зыходнага кода.

Для большасці ўжыванняў ns‑3 правы корань не патрэбныя, рэкамендуецца выкарыстоўваць непрывілеяваную уліковы запіс карыстальніка.

3.2 Папярэднія ўмовы

Увесь набор даступных бібліятэк ns‑3 мае шэраг залежнасцяў ад іншых бібліятэк, але па большай частцы ns‑3 можа быць сабраны і выкарыстоўвацца з падтрымкай некалькіх распаўсюджаных (часта ўсталяваных па змаўчанні) кампанентаў: кампілятар C++, Python, рэдактар ​​зыходнага кода (напрыклад, напор, Emacs або зацьменне) і, калі выкарыстоўваюцца рэпазітары распрацоўкі, сістэмы кантролю версій Git. Большасці пачаткоўцаў карыстачоў не трэба турбавацца, калі іх канфігурацыя паведамляе аб некаторых якія адсутнічаюць дадатковых функцыях ns‑3, але для тых, хто жадае поўнай усталёўкі, праект падае вікі, якая складаецца з старонкі са мноствам карысных парад і падказак. Адной з такіх старонак з'яўляецца старонка "Усталяванне" з інструкцыямі па ўстаноўцы для розныя сістэмы, даступныя па адрасе: https://www.nsnam.org/wiki/Installation.

Раздзел «Папярэднія ўмовы» гэтай вікі-старонкі тлумачыць, якія пакеты патрабуюцца для падтрымкі агульных опцый ns‑3, а таксама дае каманды, якія выкарыстоўваюцца для іх усталёўкі ў распаўсюджаных варыянтах Linux або macOS.

Вы можаце скарыстацца такой магчымасцю, як вывучэнне вікі-старонкі ns‑3 ці асноўнага вэб-сайта: https://www.nsnam.org, так як там шмат інфармацыі. Пачынальна з апошняй версіі ns‑3 (ns‑3.29), для запуску 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. Калі нейкія прылады адсутнічаюць ці занадта старыя, звернецеся да інструкцыі па ўсталёўцы на вікі-старонцы 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 па адрасе https://gitlab.com/nsnam/. Група нснам аб'ядноўвае розныя рэпазітары, якія выкарыстоўваюцца праектам з адкрытым зыходным кодам.

Самы просты спосаб пачаць выкарыстоўваць рэпазітары Git - гэта зрабіць форк або кланаваць асяроддзе ns‑3-allinone. Гэта набор скрыптоў, які кіруе загрузкай і зборкай найболей часта выкарыстоўваных падсістэм 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-allinone крыху адрозніваецца ад апісанай вышэй дырэкторыі з архівам рэлізу. Яна павінна выглядаць прыкладна так:

$ ls
build.py constants.py download.py README util.py

Звярніце ўвагу на наяўнасць скрыпту download.py, які дадаткова выме ns‑3 і спадарожны зыходны код. Тут у вас ёсць выбар: альбо загрузіць самы апошні снапшот распрацоўкі ns‑3:

$ python download.py

ці аддаць перавагу рэлізу ns‑3, выкарыстоўваючы сцяг -n для ўказання нумара рэлізу:

$ python download.py -n ns-3.29

Пасля гэтага кроку ў дырэкторыю ns‑3-allinone будуць загружаны дадатковыя рэпазітары ns‑3, печ, pybindgen и netanim.

Заўвага
На машыне з чыстай Ubuntu16.04 мне запатрабавалася змяніць каманду да такога выгляду: $ sudo python3 download.py -n ns-3.29 (тут і далей нататкі перакладчыка).

3.3.1 Загрузка ns-3 з дапамогай Bake

Два вышэйзгаданыя метады (архіў зыходнікаў або рэпазітар ns‑3-allinone праз Git) карысныя для атрымання найболей простай усталёўкі ns‑3 з некалькімі аддонамі(pybindgen для генерацыі прывязак Python і netanim для аніміравання сеткі). Трэці рэпазітар, які прадстаўляецца па змаўчанні ў ns‑3-allinone, завецца печ.

выпякаць — гэта прылада для скаардынаванай зборкі праграмнага забеспячэння з некалькіх рэпазітароў, распрацаваны для праекту ns‑3. выпякаць можа выкарыстоўвацца для атрымання дэвелаперскіх версій ns‑3, а таксама для загрузкі і зборкі пашырэнняў базавай версіі дыстрыбутыва ns‑3, такіх як асяроддзе. Direct Code Execution, CradleNetwork Simulation Cradle, магчымасць стварэння новых прывязак 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 па вашаму выбару. Даступна некалькі мэтаў наладкі:

  1. ns‑3.29: модуль, які адпавядае рэлізу; ён будзе загружаць кампаненты, аналагічныя рэлізу ў tarball;

  2. ns‑3-dev: аналагічны модуль, але з выкарыстаннем кода з дрэва распрацоўкі;

  3. ns-allinone-3.29: модуль, які ўключае ў сябе іншыя дадатковыя функцыі, такія як Click маршрутызацыя і Network Simulation Cradle, Openflow для ns-3.

  4. ns‑3-allinone: аналагічна рэлізнай версіі модуля allinone, Але для кода распрацоўкі.

Заўвага
націсніце - модульная праграмная архітэктура для стварэння маршрутызатараў.

Openflow - пратакол кіравання працэсам апрацоўкі дадзеных, якія перадаюцца па сетцы перадачы дадзеных маршрутызатарамі і камутатарамі, які рэалізуе тэхналогію праграмна-канфігуруемай сеткі.

Бягучы снапшот распрацоўкі (нерэлізны) ns‑3 можна знайсці па адрасе:https://gitlab.com/nsnam/ns-3-dev.git.

Распрацоўнікі імкнуцца падтрымліваць гэтыя рэпазітары ва ўзгодненым працоўным стане, але яны знаходзяцца ў вобласці распрацоўкі і ў іх прысутнічае нярэлізны код, таму калі вы не плануеце выкарыстоўваць новыя функцыі то выбірайце афіцыйны рэліз.

Вы можаце знайсці апошнюю версію кода, прагледзеўшы спіс рэпазітароў, або перайшоўшы на вэб-старонку "ns‑3 Releases":https://www.nsnam.org/releases/ і націснуўшы на спасылку апошняй версіі. У гэтым прыкладзе мы працягнем з ns‑3.29.

Зараз, каб атрымаць патрэбныя нам складовыя часткі ns‑3, прымянім інструмент выпякаць. Скажам некалькі ўступных слоў аб працы выпякаць.

Bake працуе, загружаючы зыходнікі пакетаў у дырэкторыю крыніца і усталёўваючы бібліятэкі ў зборачную дырэкторыю. выпякаць можна запусціць, спасылаючыся на двайковы файл, але калі вы хочаце запускаць выпякаць не з дырэкторыі, у якую ён быў загружаны, пажадана дадаць шлях да печ у ваш шлях (пераменную асяроддзі PATH), напрыклад, наступным чынам (прыклад для абалонкі Linux bash). Перайдзіце ў дырэкторыю «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

Гэта будзе азначаць, што былі запампаваны тры зыходнікі. Цяпер перайдзіце ў дырэкторыю source і ўвядзіце 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‑allinone маецца зручны сцэнар, які можа спрасціць зборку кампанентаў. Ён называецца build.py. Гэтая праграма наладзіць праект для вас найболей карысным спосабам. Тым не менш, звярніце ўвагу, што больш складаныя наладкі і праца з ns‑3 звычайна ўключаюць выкарыстанне ўласнай сістэмы зборкі ns‑3, Waf, якая будзе прадстаўлена пазней у гэтым кіраўніцтве.

Калі вы зрабілі загрузку з дапамогай тарбол, то ў вашай дырэкторыі ~/workspace павінна з'явіцца дырэкторыя з імем нешта накшталт ns-allinone-3.29. Увядзіце наступнае:

$ ./build.py --enable-examples --enable-tests

Пры выкліку build.py мы прымянілі аргументы каманднага радка для таго, каб сабраць прыклады і тэсты, якія выкарыстоўваюцца ў гэтым кіраўніцтве, і якія ў ns‑3 па змаўчанні не збіраюцца. Па змаўчанні, праграма таксама будуе ўсе даступныя модулі. Потым, калі захочаце, Вы можаце сабраць ns‑3 без прыкладаў і тэстаў ці выключыць модулі, якія не патрэбныя для вашай працы.

Вы ўбачыце шмат выходных паведамленняў кампілятара, якія адлюстроўваюцца скрыптам пры зборцы розных загружаных вамі частак. Спачатку скрыпт паспрабуе сабраць аніматар. netanim, затым генератар прывязак 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«усталёўка ID групы падчас выканання» у вызначаных праграм. Ён па змаўчанні не ўключаны, і таму гэтая функцыя адлюстроўваецца як "не ўключана" ("not enabled"). Нарэшце, каб атрымаць спіс уключаных опцый, выкарыстоўвайце 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

Тым не менш, спецыяльны аператар - - можа выкарыстоўвацца для перадачы дадатковых параметраў праз вафля, таму замест вышэйзгаданага будзе працаваць наступная каманда:

$ ./build.py -- --disable-python

паколькі яна генеруе асноўную каманду ./waf configure -disable-python. Вось яшчэ некалькі ўступных парад аб Waf.

Апрацоўка памылак зборкі

Рэлізы ns‑3 пратэставаны на самых апошніх кампілятарах C++, даступных у момант рэлізу на распаўсюджаных дыстрыбутывах Linux і MacOS. Аднак, з часам, выпускаюцца новыя дыстрыбутывы з новымі кампілятарамі, і гэтыя навейшыя кампілятары, як правіла, больш педантычныя ў стаўленні папярэджанняў. ns‑3 наладжвае сваю зборку для апрацоўкі ўсіх папярэджанняў як памылак, таму часам, калі вы выкарыстоўваеце больш старую версію ў навейшай сістэме, папярэджанне кампілятара можа спыніць зборку.

Напрыклад, раней быў рэліз ns‑3.28 для Fedora 28, якая ўключала новую мажорную версію. НКУ (гкк-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, у Waf даступная опцыя для вырашэння гэтых праблем. Яна адключае ўстаноўку сцяга "-Werror" у g++ і clang++. Гэта опцыя «—disable-werror», яна павінна прымяняцца падчас канфігуравання:

$ ./waf configure --disable-werror --enable-examples --enable-tests

Канфігураваць ці збіраць

Некаторыя каманды Waf маюць сэнс толькі ў фазе канфігуравання, а некаторыя дзейнічаюць толькі ў фазе зборкі. Напрыклад, калі вы жадаеце выкарыстаць функцыі эмуляцыі ns‑3, то можаце ўлучыць усталёўку біта суд выкарыстоўваючы Sudo, як апісана вышэй. Гэта адменіць каманды этапу канфігурацыі, і такім чынам вы зможаце змяніць канфігурацыю выкарыстоўваючы наступную каманду, якая таксама ўключае ў сябе прыклады і тэсты.

$ ./waf configure --enable-sudo --enable-examples --enable-tests

Калі вы зробіце гэта, Waf запусціць Sudo, Каб змяніць праграмы стварэння сокетаў кода эмуляцыі для запуску з правамі корань. У Waf даступна мноства іншых опцый для этапаў канфігурацыі і зборкі. Каб вывучыць варыянты, увядзіце:

$ ./waf --help

У наступным раздзеле мы будзем выкарыстоўваць некаторыя опцыі, звязаныя з тэсціраваннем.

Профілі зборкі

Мы ўжо бачылі, як можна наладзіць Waf для зборак адладжваць и аптымізаваны:

$ ./waf --build-profile=debug

Таксама ёсць прамежкавы профіль зборкі, вызваліць. Опцыя -d з'яўляецца сінонімам --build-profile. Профіль зборкі кіруе выкарыстаннем часопісавання, сцвярджэнняў (assertions) і ключоў аптымізацыі кампілятара:

Падручнік па сімулятары сеткі ns-3. Кіраўнік 3

Як можна бачыць, часопісаванне і сцвярджэнні даступныя толькі ў адладкавых зборках. Рэкамендуемы практыка заключаецца ў распрацоўцы вашага сцэнара ў рэжыме адладкі, затым выкананне паўторныя прагонаў (для статыстыкі або змены параметраў) у аптымізаваным профілі зборкі.

Калі ў вас ёсць код, які павінен выконвацца толькі ў вызначаных профілях зборкі, выкарыстоўвайце макрас Code Wrapper Macro:

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. Напрыклад, каб выкарыстоўваць З++ кампілятар 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 усталяваць. Па змаўчанні прэфікс для ўстаноўкі / USR / мясцовыя, таму ./waf усталяваць будзе ўсталёўваць праграмы ў / USR / мясцовыя / бен, бібліятэкі ў / USR / мясцовыя / Бібліятэка і загалоўкавыя файлы ў /usr/local/include. Правы суперкарыстача звычайна неабходна ўсталёўваць з прэфіксам па змаўчанні, таму тыповая каманда будзе sudo ./waf install. Пры запуску, Waf спачатку аддасць перавагу выкарыстоўваць агульныя бібліятэкі ў дырэкторыі зборкі, затым будзе шукаць бібліятэкі па шляху да бібліятэкам, настроеным у лакальным асяроддзі. Так што пры ўсталёўцы бібліятэк у сістэму добрая практыка -праверыць, што выкарыстоўваюцца патрэбныя бібліятэкі. Карыстальнікі могуць абраць усталёўку з іншым прэфіксам, перадаўшы падчас канфігуравання опцыю --prefix, Напрыклад:

./waf configure --prefix=/opt/local

Калі пазней, пасля зборкі, карыстач увядзе каманду ўсталёўкі ./waf, будзе выкарыстаны прэфікс /opt/local.

Каманда ./waf clean павінна выкарыстоўвацца да пераналадкі праекта, калі для ўстаноўкі будзе выкарыстоўвацца Waf пад іншым прэфіксам.

Такім чынам, для выкарыстання ns‑3 няма неабходнасці выклікаць ./waf install. Большасці карыстальнікаў гэтая каманда не спатрэбіцца, паколькі Waf падхопіць бягучыя бібліятэкі з дырэкторыі зборкі, але некаторыя карыстачы могуць знайсці гэта карысным, калі іх дзейнасць уключае ў сябе працу з праграмамі па-за дырэкторыяй ns‑3.

Waf адзіны

На верхнім узроўні дрэва зыходнага кода ns‑3 існуе толькі адзін Waf-скрыпт. Пачаўшы працаваць, вы будзеце праводзіць шмат часу ў дырэкторыі scratch/ ці глыбей, уsrc/... і пры гэтым мець неабходнасць запускаць Waf. Вы можаце проста памятаць, дзе вы, і запусціць Waf наступным чынам:

$ ../../../waf ...

але гэта будзе стомна і схільна да памылак, таму ёсць лепшыя рашэнні. Адным з распаўсюджаных спосабаў з'яўляецца выкарыстанне тэкставага рэдактара, такога як Emacs або напор, у якім адчыняюцца дзве тэрмінальных сесіі, адна выкарыстоўваецца для зборкі 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, якія паказваюць, што зборка была паспяхова завершана, але не бачыце выснову "Hello Simulator", гэта значыць верагоднасць, што вы ў раздзеле [Зборка-з-Waf] пераключылі свой рэжым зборкі на аптымізаваны, але прапусцілі зваротнае пераключэнне ў рэжым адладжваць. Уся выснова кансолі, выкарыстоўваны ў гэтым кіраўніцтве, выкарыстае адмысловы кампанент ns‑3, які выконвае запіс лога, і ўжываецца для друку карыстацкіх паведамленняў у кансоль. Выснова з гэтага кампанента аўтаматычна адключаны пры кампіляцыі аптымізаванага кода – ён «аптымізаваны». Калі вы не бачыце выснову "Hello Simulator", увядзіце наступнае:

$ ./waf configure --build-profile=debug --enable-examples --enable-tests

каб наладзіць Waf на зборку адладкавых версій праграм ns-3, якія ўключаюць прыклады і тэсты. Затым Вы павінны перасабраць актуальную адладкавую версію кода, набраўшы

$ ./waf

Цяпер, калі вы запусціце праграму hello-simulator, Вы павінны ўбачыць чаканы вынік.

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 ...'

Іншым, асабліва карысным, прыкладам з'яўляецца выбарачны запуск набораў тэстаў. Давайце выкажам здагадку, што існуе тэставы набор (suite) mytest (насамрэч яго няма). Вышэй мы выкарыстоўвалі скрыпт ./test.py для паралельнага запуску цэлага шэрагу тэстаў, які шматкроць выклікае праграму тэставання test-runner. Выклік test-runner напрамую для выканання аднаго тэсту:

$ ./waf --run test-runner --command-template="%s --suite=mytest --verbose"

Аргументы будуць перададзены праграме test-runner. Паколькі mytest не існуе, будзе генеравацца паведамленне аб памылцы. Каб надрукаваць даступныя параметры test-runner увядзіце:

$ ./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 з дырэкторыі верхняга ўзроўня і тамака генеруюць файлы выходных дадзеных.

Працяг: раздзел 4

Крыніца: habr.com

Дадаць каментар