Tutorial sa ns-3 network simulator. Kabanata 3

Tutorial sa ns-3 network simulator. Kabanata 3
kabanata 1,2

3 Pagsisimula
3.1 Pangkalahatang-ideya
3.2 Mga Kinakailangan
3.2.1 Pag-download ng ns-3 release bilang source archive
3.3 Pag-download ng ns-3 gamit ang Git
3.3.1 Naglo-load ng ns-3 gamit ang Bake
3.4 Assembly ns-3
3.4.1 Gusali gamit ang build.py
3.4.2 Pagbuo gamit ang Bake
3.4.3 Bumuo gamit ang Waf
3.5 Pagsubok sa ns-3
3.6 Pagpapatakbo ng script
3.6.1 Mga argumento ng command line
3.6.2 Pag-debug
3.6.3 Gumagana na direktoryo

Kabanata 3

Nagsisimula

Ang kabanatang ito ay inilaan upang ihanda ang mambabasa na magsimula sa isang computer na maaaring hindi pa nakapag-install ng ns-3. Sinasaklaw nito ang mga sinusuportahang platform, mga kinakailangan, kung paano makakuha ng ns-3, kung paano bumuo ng ns-3, at kung paano subukan ang iyong build at magpatakbo ng mga simpleng program.

3.1 Pangkalahatang-ideya

Ang ns-3 simulator ay binuo bilang isang sistema ng mga collaborative na software library. Sa panahon ng pagpupulong, ang code ng mga programa ng gumagamit ay naka-link sa mga aklatang ito. Ang C++ o Python programming language ay ginagamit para magsulat ng mga custom na programa.

Ang Ns-3 ay ibinahagi bilang source code, na nangangahulugan na ang target na sistema ay dapat magkaroon ng isang software development environment upang mabuo muna ang mga library at pagkatapos ay bumuo ng user program. Sa prinsipyo, ang ns-3 ay maaaring ipamahagi bilang mga handa na aklatan para sa isang partikular na sistema, at sa hinaharap maaari silang maipamahagi sa ganitong paraan. Ngunit sa ngayon maraming mga gumagamit ang aktwal na gumagawa ng kanilang trabaho sa pamamagitan ng pag-edit ng ns-3 mismo, kaya kapaki-pakinabang na magkaroon ng source code upang bumuo ng mga aklatan. Kung sinuman ang gustong gumawa ng mga yari na aklatan at mga pakete para sa mga operating system, mangyaring makipag-ugnayan sa mailing list ns-developer.

Susunod, titingnan natin ang tatlong paraan upang mag-download at bumuo ng ns-3. Ang una ay ang pag-download at pagbuo ng opisyal na paglabas mula sa pangunahing site. Ang pangalawa ay ang pagpili at pagpupulong ng mga kopya ng mga bersyon ng pag-unlad ng pangunahing pag-install ng ns-3. Ang pangatlo ay gumamit ng mga karagdagang tool sa pagbuo upang mag-load ng higit pang mga extension para sa ns-3. Susuriin namin ang bawat isa dahil ang mga tool ay bahagyang naiiba.

Maaaring magtaka ang mga nakaranasang gumagamit ng Linux kung bakit hindi ibinigay ang ns-3 bilang isang pakete tulad ng karamihan sa iba pang mga aklatan na gumagamit ng manager ng package? Bagama't may mga binary na pakete para sa iba't ibang mga distribusyon ng Linux (hal. Debian), karamihan sa mga gumagamit ay nagtatapos sa pag-edit ng mga aklatan at kailangang muling buuin ang ns-3 sa kanilang sarili, kaya ang pagkakaroon ng source code na magagamit ay madaling gamitin. Para sa kadahilanang ito, tututuon kami sa pag-install mula sa pinagmulan.

Para sa karamihan ng mga aplikasyon ns-3 karapatan ugat ay hindi kinakailangan, inirerekumenda na gumamit ng isang walang pribilehiyong user account.

3.2 Mga Kinakailangan

Ang buong hanay ng mga available na library ng ns-3 ay may bilang ng mga dependency sa mga third-party na aklatan, ngunit sa karamihan ng bahagi ay maaaring buuin at magamit ang ns-3 na may suporta para sa ilang karaniwang (madalas na naka-install bilang default) na mga bahagi: isang C++ compiler, Python, isang source code editor (halimbawa, kalakasan, emacs o Paglalaho) at, kung gagamitin ang mga repositoryo ng pag-unlad, mga sistema ng kontrol sa bersyon ng Git. Karamihan sa mga unang beses na user ay hindi na kailangang mag-alala kung ang kanilang configuration ay nag-uulat ng ilang ns-3 advanced na mga tampok na nawawala, ngunit para sa mga nais ng isang buong pag-install, ang proyekto ay nagbibigay ng isang wiki na may kasamang mga pahina na may maraming mga kapaki-pakinabang na tip at trick. Ang isang ganoong pahina ay ang pahina ng Pag-install, na may mga tagubilin sa pag-install para sa iba't ibang mga system, na makukuha sa: https://www.nsnam.org/wiki/Installation.

Ang seksyong Prerequisites ng wiki na ito ay nagpapaliwanag kung aling mga package ang kinakailangan upang suportahan ang mga karaniwang ns-3 na opsyon at nagbibigay din ng mga command na ginamit upang i-install ang mga ito sa mga karaniwang flavor ng Linux o macOS.

Maaari mong samantalahin ang pagkakataong ito upang galugarin ang pahina ng ns-3 wiki o ang pangunahing website: https://www.nsnam.org, dahil maraming impormasyon doon. Simula sa pinakabagong bersyon ng ns-3 (ns-3.29), ang mga sumusunod na tool ay kinakailangan upang patakbuhin ang ns-3:

Tool Package/Bersyon

  • C++ compiler
    clang++ o g++ (g++ bersyon 4.9 o mas mataas)
  • Sawa
    bersyon ng python2 >= 2.7.10, o bersyon ng python3 >=3.4
  • pumunta
    anumang pinakabagong bersyon (upang ma-access ang ns-3 sa GitLab.com)
  • alkitran
    anumang pinakabagong bersyon (para sa pag-unpack ng ns‑3 release)
  • bunzip2
    anumang pinakabagong bersyon (para sa pag-unpack ng ns‑3 release)

Upang suriin ang default na bersyon ng Python, i-type python -V. Para tingnan ang bersyon ng g++, i-type g++ -v. Kung ang anumang mga tool ay nawawala o masyadong luma, mangyaring sumangguni sa gabay sa pag-install sa pahina ng ns-3 wiki.

Mula ngayon, ipinapalagay namin na ang mambabasa ay nagpapatakbo ng Linux, MacOS, o isang Linux emulator, at mayroon nang hindi bababa sa mga tool sa itaas.

3.2.1 Pag-download ng ns-3 release bilang source archive

Ito ang kurso ng pagkilos para sa isang bagong user na gustong mag-download at mag-eksperimento sa pinakabagong release at mga bersyon ng package ng ns-3. Ang mga release ng ns-3 ay nai-publish bilang mga naka-compress na source archive, kung minsan ay tinatawag tarball. tarball ay isang espesyal na format ng archive ng software kung saan pinagsama-sama ang ilang mga file. Ang archive ay karaniwang naka-compress. ns-3 proseso ng boot sa pamamagitan ng tarball ay simple, kailangan mo lang pumili ng isang release, i-download at i-unpack ito.

Ipagpalagay natin na ikaw, bilang isang user, ay gustong bumuo ng ns-3 sa isang lokal na direktoryo na tinatawag lugar ng trabaho. Makakakuha ka ng gumaganang kopya ng release sa pamamagitan ng paglalagay ng sumusunod sa Linux console (siyempre papalitan ang naaangkop na mga numero ng bersyon)

$ 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 

Bigyang-pansin ang utility na ginamit sa itaas wget, na isang command line tool para sa pag-download ng mga bagay mula sa Internet. Kung hindi mo pa ito na-install, maaari mong gamitin ang iyong browser para dito.

Ang pagsunod sa mga hakbang na ito ay magdadala sa iyo sa ns-allinone-3.29 na direktoryo, doon mo makikita ang ilang mga file at direktoryo

$ 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

Handa ka na ngayong bumuo ng pangunahing pamamahagi ng ns-3 at maaari kang magpatuloy sa seksyon sa pagbuo ng ns-3.

3.3 Pag-download ng ns-3 gamit ang Git

Ang ns-3 code ay available sa Git repository sa GitLab.com sa https://gitlab.com/nsnam/. Grupo nsnam pinagsasama-sama ang iba't ibang mga repository na ginagamit ng isang open source na proyekto.

Ang pinakamadaling paraan upang simulan ang paggamit ng mga Git repository ay ang pag-fork o pag-clone ng kapaligiran ns-3-allinone. Ito ay isang hanay ng mga script na namamahala sa paglo-load at pagpupulong ng mga pinakakaraniwang ginagamit na ns-3 subsystem. Kung bago ka sa Git, ang mga terminong "fork" at "clone" ay maaaring hindi pamilyar sa iyo; kung gayon, inirerekumenda namin na i-clone mo lang (gumawa ng iyong sariling kopya) ang repositoryo na matatagpuan sa GitLab.com tulad nito:

$ cd 
$ mkdir workspace 
$ cd workspace 
$ git clone https://gitlab.com/nsnam/ns-3-allinone.git 
$ cd ns-3-allinone 

Sa yugtong ito, ang view ng iyong direktoryo ns-3-allinone bahagyang naiiba mula sa direktoryo ng archive ng release na inilarawan sa itaas. Dapat itong magmukhang ganito:

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

Mangyaring tandaan na mayroong isang script download.py, na karagdagang kukuha ng ns-3 at kasamang source code. Dito mayroon kang pagpipilian: alinman sa i-download ang pinakabagong ns-3 development snapshot:

$ python download.py

o mas gusto ang ns-3 release gamit ang flag -n para isaad ang release number:

$ python download.py -n ns-3.29

Pagkatapos ng hakbang na ito sa direktoryo ns-3-allinone ida-download ang mga karagdagang repositoryo ns-3, lutuin sa hurno, pybindgen ΠΈ netanim.

Nota
Sa isang makina na may malinis na Ubuntu16.04, kailangan kong baguhin ang utos dito: $ sudo python3 download.py -n ns-3.29 (mula dito ay mga tala ng tagasalin).

3.3.1 Naglo-load ng ns-3 gamit ang Bake

Ang dalawang pamamaraan sa itaas (source archive o repository ns-3-allinone sa pamamagitan ng Git) ay kapaki-pakinabang para sa pagkuha ng pinakasimpleng pag-install ng ns-3 na may maraming mga addon(pybindgen upang makabuo ng Python bindings at netanim para sa network animation). Ang ikatlong imbakan na ibinigay bilang default sa ns-3-allinone ay tinatawag lutuin sa hurno.

maghurno ay isang tool para sa coordinated na pagbuo ng software mula sa maraming repository, na binuo para sa proyekto ng ns-3. maghurno ay maaaring gamitin upang makakuha ng mga bersyon ng pag-unlad ng ns-3, gayundin sa pag-download at pagbuo ng mga extension ng base na bersyon ng pamamahagi ng ns-3, tulad ng kapaligiran Direktang Pagpapatupad ng Code, CradleNetwork Simulation Cradle, ang kakayahang lumikha ng mga bagong Python binding at iba't ibang ns-3 "apps".

Nota
Ang CradleNetwork Simulation Cradle ay isang framework na nagbibigay-daan sa iyong gumamit ng totoong TCP/IP network stack sa loob ng isang network simulator.

Kung inaasahan mong ang iyong pag-install ng ns-3 ay may mga advanced o karagdagang mga tampok, maaari mong sundin ang landas ng pag-install na ito.

Sa pinakabagong ns-3 release maghurno ay idinagdag sa paglabas ng tar. Ang release ay may kasamang configuration file na nagbibigay-daan sa iyong i-download ang kasalukuyang mga bersyon ng software sa oras ng paglabas. Iyon ay, halimbawa, bersyon maghurno, na ibinahagi kasama ang release ns-3.29, ay maaaring gamitin upang kunin ang mga bahagi para sa release na iyon ng ns-3 o mas maaga, ngunit hindi maaaring gamitin upang kunin ang mga bahagi para sa mga susunod na release (kung ang file ng paglalarawan ng package bakeconf.xml hindi na-update).

Maaari mo ring makuha ang pinakabagong kopya lutuin sa hurnosa pamamagitan ng pagpasok ng sumusunod na command sa iyong Linux console (ipagpalagay na na-install mo ang Git):

$ cd 
$ mkdir workspace 
$ cd workspace 
$ git clone https://gitlab.com/nsnam/bake.git

Kapag pinatakbo mo ang git command, dapat mong makita ang isang bagay tulad ng sumusunod:

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.

Matapos makumpleto ang utos clone dapat mayroon kang isang direktoryo na pinangalanan lutuin sa hurno, ang mga nilalaman nito ay dapat magmukhang ganito:

$ cd bake
$ ls
bake bakeconf.xml bake.py doc examples generate-binary.py test TODO

Tandaan na nag-load ka ng ilang script ng Python, isang module ng Python na pinangalanan lutuin sa hurno at isang XML configuration file. Ang susunod na hakbang ay ang paggamit ng mga script na ito upang i-download at buuin ang pamamahagi ng ns-3 na iyong pinili. Available ang ilang mga target sa pagpapasadya:

  1. ns-3.29: module na naaayon sa release; ito ay magda-download ng mga bahagi na katulad ng paglabas sa tarball;

  2. ns-3-dev: isang katulad na module, ngunit gumagamit ng code mula sa development tree;

  3. ns-allinone-3.29: Isang module na may kasamang iba pang karagdagang feature gaya ng Click routing at Network Simulation Cradle, Openflow para sa ns-3.

  4. ns-3-allinone: katulad ng bersyon ng paglabas ng module lahat sa isa, ngunit para sa development code.

Nota
I-click ang β€” modular software architecture para sa paglikha ng mga router.

Ang Openflow ay isang protocol para sa pamamahala sa proseso ng pagproseso ng data na ipinadala sa isang network ng data ng mga router at switch, na nagpapatupad ng teknolohiya ng network na tinukoy ng software.

Ang kasalukuyang development snapshot (non-release) ns-3 ay matatagpuan sa:https://gitlab.com/nsnam/ns-3-dev.git.

Sinisikap ng mga developer na panatilihin ang mga repository na ito sa isang pare-parehong pagkakasunud-sunod ng pagtatrabaho, ngunit nasa development area ang mga ito at naglalaman ng hindi pa nailalabas na code, kaya kung hindi mo planong gumamit ng mga bagong feature, pagkatapos ay piliin ang opisyal na release.

Maaari mong mahanap ang pinakabagong bersyon ng code sa pamamagitan ng pag-browse sa listahan ng mga repository, o sa pamamagitan ng pagpunta sa ns-3 Releases web page:https://www.nsnam.org/releases/ at pag-click sa link ng pinakabagong bersyon. Sa halimbawang ito magpapatuloy tayo sa ns-3.29.

Ngayon, para makuha ang mga sangkap ng ns-3 na kailangan namin, gagamitin namin ang tool maghurno. Sabihin natin ang ilang panimulang salita tungkol sa gawain maghurno.

Gumagana ang bake sa pamamagitan ng pag-load ng mga source ng package sa isang direktoryo pinagmulan at pag-install ng mga aklatan sa direktoryo ng build. maghurno maaaring patakbuhin sa pamamagitan ng pagtukoy sa binary, ngunit kung gusto mong tumakbo maghurno hindi mula sa direktoryo kung saan ito na-download, ipinapayong idagdag ang landas sa lutuin sa hurno sa iyong landas (PATH environment variable), halimbawa tulad ng sumusunod (halimbawa para sa Linux bash shell). Pumunta sa direktoryo ng "bake" at pagkatapos ay itakda ang mga sumusunod na variable ng kapaligiran:

$ export BAKE_HOME=`pwd` 
$ export PATH=$PATH:$BAKE_HOME:$BAKE_HOME/build/bin 
$ export PYTHONPATH=$PYTHONPATH:$BAKE_HOME:$BAKE_HOME/build/lib

Ito ang maglalagay ng programa bake.py sa shell path at papayagan ang iba pang mga program na mahanap ang mga executable at library na nilikha nito lutuin sa hurno. Sa ilang mga kaso ng paggamit lutuin sa hurno, ang setting ng PATH at PYTHONPATH na inilarawan sa itaas ay hindi kinakailangan, ngunit ang kumpletong build ng ns-3-allinone (na may mga karagdagang pakete) ay karaniwang nangangailangan nito.

Pumunta sa iyong gumaganang direktoryo at ilagay ang sumusunod sa console:

$ ./bake.py configure -e ns-3.29

Sunod na itatanong natin maghurno suriin kung mayroon kaming sapat na mga tool upang i-load ang iba't ibang mga bahagi. I-dial:

$ ./bake.py check

Dapat mong makita ang isang bagay tulad ng sumusunod:

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

Sa partikular, ang mga tool sa pag-upload gaya ng Mercurial, CVS, Git at Bazaar ay mahalaga sa hakbang na ito dahil pinapayagan kami nitong makuha ang code. Sa puntong ito, i-install ang mga nawawalang tool sa karaniwang paraan para sa iyong system (kung alam mo kung paano) o makipag-ugnayan sa iyong system administrator para sa tulong.

Susunod, subukang i-download ang software:

$ ./bake.py download

ang resulta ay dapat na tulad ng:

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

Nangangahulugan ito na tatlong pinagmumulan ang na-download. Pumunta ngayon sa direktoryo ng pinagmulan at i-type ang ls; Dapat mong makita:

$ cd source 
$ ls
netanim-3.108 ns-3.29 pybindgen

Ngayon ay handa ka nang buuin ang pamamahagi ng ns-3.

3.4 Assembly ns-3

Tulad ng pag-download ng ns-3, mayroong ilang mga paraan upang bumuo ng ns-3. Ang pangunahing bagay na gusto naming bigyang-diin ay ang ns-3 ay binuo gamit ang build tool na tinatawag Wafinilarawan sa ibaba. Karamihan sa mga gumagamit ay gagana sa Waf, ngunit may ilang madaling gamitin na script upang matulungan kang magsimula o mag-ayos ng mas kumplikadong mga build. Kaya please, bago mo basahin ang tungkol Waf, tingnan mo build.py at pagpupulong na may lutuin sa hurno.

3.4.1 Gusali gamit ang build.py

Warning! Ang hakbang sa pagbuo na ito ay magagamit lamang mula sa pinagmulang bersyon ng archive na nakuha tulad ng inilarawan sa itaas; at hindi na-download sa pamamagitan ng git o bake.

Kapag nagtatrabaho sa isang release archive tarballsa ns-3-allinone Mayroong isang madaling gamitin na script na maaaring gawing mas madali ang pag-assemble ng mga bahagi. Ito ay tinatawag na build.py. Ise-set up ng program na ito ang proyekto para sa iyo sa pinakakapaki-pakinabang na paraan. Gayunpaman, tandaan na ang mas advanced na pag-setup at pagtatrabaho sa ns-3 ay kadalasang nagsasangkot ng paggamit ng sariling build system ng ns-3, Waf, na ipapakilala sa ibang pagkakataon sa tutorial na ito.

Kung nag-download ka gamit ang tarball, pagkatapos ay sa iyong direktoryo ~/workspace isang direktoryo na may katulad na pangalan ns-allinone-3.29. Ipasok ang sumusunod:

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

Kapag tumatawag build.py Gumamit kami ng mga argumento ng command line upang buuin ang mga halimbawa at pagsubok na ginamit sa tutorial na ito, na hindi binuo bilang default sa ns-3. Bilang default, binubuo rin ng program ang lahat ng magagamit na mga module. Pagkatapos, kung gusto mo, maaari kang bumuo ng ns-3 nang walang mga halimbawa at pagsubok, o ibukod ang mga module na hindi kailangan para sa iyong trabaho.

Makakakita ka ng maraming mga mensahe ng output ng compiler na ipinapakita ng script habang binubuo nito ang iba't ibang bahagi na iyong na-load. Una susubukan ng script na buuin ang animator netanim, pagkatapos ay ang nagbubuklod na generator pybindgen at sa wakas ns-3. Kapag kumpleto na ang proseso, dapat mong makita ang sumusunod:

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

Sa huling tatlong linya ng listahan, nakikita namin ang isang mensahe tungkol sa mga module na hindi ginawa:

Modules not built (see ns-3 tutorial for explanation):
brite                     click

Nangangahulugan lamang ito na ang ilang ns-3 modules na umaasa sa mga panlabas na aklatan ay maaaring hindi pa naitayo, o na hindi sila kinakailangang itayo para sa pagsasaayos na ito. Hindi ito nangangahulugan na ang simulator ay hindi naka-assemble o ang mga naka-assemble na module ay hindi gagana nang tama.

3.4.2 Pagbuo gamit ang Bake

Kung ginamit mo ang bake sa itaas upang makakuha ng source code mula sa mga repositoryo ng proyekto, maaari mo itong patuloy na gamitin upang bumuo ng ns-3. I-dial:

$ ./bake.py build

at dapat mong makita ang isang bagay tulad ng:

>> Building pybindgen-0.19.0.post4+ng823d8b2 - OK 
>> Building netanim-3.108 - OK 
>> Building ns-3.29 - OK

Tooltip: Maaari mo ring gawin ang parehong pag-download at pagbuo ng mga hakbang nang sabay-sabay sa pamamagitan ng pagtawag sa "bake.py deploy".

Maaaring mabigo ang pag-assemble ng lahat ng mga bahagi, ngunit magpapatuloy ang pagpupulong kung hindi kinakailangan ang isang bahagi. Halimbawa, ang isang kamakailang isyu sa portability ay iyon castxml maaaring tipunin sa pamamagitan ng tool lutuin sa hurno hindi sa lahat ng platform. Sa kasong ito, lilitaw ang isang mensahe tulad nito:

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

Pero castxml kailangan lang kung gusto mong gumawa ng updated na Python bindings. Para sa karamihan ng mga gumagamit ay hindi na kailangan para dito (kahit na hanggang sa baguhin nila ang ns-3), kaya ang mga ganitong babala ay maaaring ligtas na balewalain sa ngayon.

Kung nabigo ito, ang sumusunod na utos ay magbibigay sa iyo ng pahiwatig tungkol sa mga nawawalang dependencies:

$ ./bake.py show

Ililista ang iba't ibang dependency ng mga pakete na sinusubukan mong buuin.

3.4.3 Bumuo gamit ang Waf

Hanggang sa puntong ito, upang simulan ang pagbuo ng ns-3, ginamit namin ang alinman sa script build.py, o kasangkapan lutuin sa hurno. Ang mga tool na ito ay kapaki-pakinabang para sa pagbuo ng ns-3 at pagpapanatili ng mga aklatan. Sa katunayan, upang bumuo ay pinapatakbo nila ang tool ng build Waf mula sa direktoryo ns-3. Waf naka-install gamit ang ns-3 source code. Karamihan sa mga user ay mabilis na lumipat sa direktang paggamit upang i-configure at i-assemble ang ns‑3 Waf. Kaya, upang magpatuloy, mangyaring pumunta sa direktoryo ng ns-3 na orihinal mong nilikha.

Hindi ito mahigpit na kinakailangan sa ngayon, ngunit magiging kapaki-pakinabang na i-backtrack nang kaunti at makita kung paano gumawa ng mga pagbabago sa configuration ng proyekto. Marahil ang pinakakapaki-pakinabang na pagbabago sa configuration na maaari mong gawin ay ang gumawa ng isang na-optimize na bersyon ng code. Bilang default, na-configure mo ang iyong proyekto upang bumuo ng bersyon ng debug. Tingnan natin ang isang proyekto upang lumikha ng isang na-optimize na build. Para ipaliwanag kay Waf na dapat itong gumawa ng mga na-optimize na build na may kasamang mga halimbawa at pagsubok, kakailanganin mong patakbuhin ang mga sumusunod na command:

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

Ilulunsad ito Waf sa labas ng lokal na direktoryo (para sa iyong kaginhawahan). Ang unang utos ay naglilinis mula sa nakaraang build, ito ay karaniwang hindi mahigpit na kinakailangan, ngunit ito ay mahusay na kasanayan (tingnan din ang mga profile ng build sa ibaba); tatanggalin nito ang mga naunang nilikhang aklatan at object file na matatagpuan sa direktoryo magtayo/. Kapag na-reconfigure ang proyekto at sinusuri ng build system ang iba't ibang dependencies, dapat mong makita ang output na katulad ng sumusunod:

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)

Pakitandaan ang huling bahagi ng listahan sa itaas. Ang ilang mga opsyon sa ns-3 ay hindi pinagana bilang default o nangangailangan ng suporta sa system upang gumana nang maayos. Halimbawa, upang paganahin ang XmlTo, dapat na naroroon ang library sa system libxml-2.0. Kung ang library na ito ay hindi natagpuan at ang kaukulang ns-3 function ay hindi pinagana, isang mensahe ang ipapakita. Tandaan din na posibleng gamitin ang command sudo upang itakda ang suid bit na "itakda ang group ID sa runtime" para sa ilang partikular na programa. Hindi ito pinagana bilang default at samakatuwid ang tampok na ito ay lilitaw bilang "hindi pinagana". Panghuli, para makakuha ng listahan ng mga pinaganang opsyon, gamitin Waf may parameter --check-config.

Ngayon, bumalik tayo at bumalik sa debug build na naglalaman ng mga halimbawa at pagsubok.

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

Naka-set up na ngayon ang build system at maaari kang bumuo ng mga bersyon ng debug ng mga ns-3 program sa pamamagitan lamang ng pag-type:

$ ./waf

Ang mga hakbang sa itaas ay maaaring pinilit kang bumuo ng bahagi ng ns-3 system nang dalawang beses, ngunit ngayon alam mo na kung paano baguhin ang configuration at bumuo ng na-optimize na code.

Upang suriin kung aling profile ang aktibo para sa isang partikular na pagsasaayos ng proyekto, mayroong isang utos:

$ ./waf --check-profile 
Waf: Entering directory `/path/to/ns-3-allinone/ns-3.29/build' 
Build profile: debug

Ang senaryo sa itaas build.py sumusuporta rin sa mga argumento --enable-examples ΠΈ --enable-tests, ngunit iba pang mga pagpipilian Waf hindi ito direktang sumusuporta. Halimbawa, hindi ito gagana:

$ ./build.py --disable-python

ang magiging reaksyon ay ganito:

build.py: error: no such option: --disable-python

Gayunpaman, ang espesyal na operator - - ay maaaring gamitin upang ipasa ang mga karagdagang parameter sa pamamagitan ng wafkaya sa halip na sa itaas ay gagana ang sumusunod na utos:

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

dahil ito ay bumubuo ng pangunahing utos ./waf configure --disable-python. Narito ang ilang higit pang panimulang tip tungkol sa Waf.

Pangangasiwa sa mga error sa build

Ang mga release ng ns-3 ay nasubok sa mga pinakabagong C++ compiler na available sa oras ng paglabas sa mga karaniwang pamamahagi ng Linux at MacOS. Gayunpaman, sa paglipas ng panahon, ang mga bagong distribusyon ay inilabas na may mga bagong compiler, at ang mga mas bagong compiler na ito ay malamang na maging mas magulo tungkol sa mga babala. Kino-configure ng ns-3 ang build nito upang ituring ang lahat ng babala bilang mga error, kaya minsan kung nagpapatakbo ka ng mas lumang bersyon sa mas bagong system, maaaring ihinto ng babala ng compiler ang build.

Halimbawa, nagkaroon dati ng release ng ns‑3.28 para sa Fedora 28, na may kasamang bagong pangunahing bersyon gcc (gcc-8). Pagbuo ng release ns-3.28 o mas naunang mga bersyon sa ilalim ng Fedora 28, na may naka-install na Gtk2+, ang sumusunod na error ay magaganap:

/usr/include/gtk-2.0/gtk/gtkfilechooserbutton.h:59:8: error: unnecessary parentheses ,!in declaration of β€˜__gtk_reserved1’ [-Werror=parentheses] void (*__gtk_reserved1);

Sa mga release simula sa ns‑3.28.1, in Waf may magagamit na opsyon para malutas ang mga problemang ito. Hindi nito pinapagana ang pagtatakda ng flag na "-Werror" sa g++ at clang++. Ito ang opsyong "--disable-werror" at dapat ilapat sa panahon ng pagsasaayos:

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

I-configure o i-assemble

Ilang utos Waf may kahulugan lamang sa bahagi ng pagsasaayos, at ang ilan ay wasto lamang sa yugto ng pagbuo. Halimbawa, kung gusto mong gamitin ang mga feature ng ns-3 emulation, maaari mong paganahin ang setting ng bit Timog gamit sudo, tulad ng inilarawan sa itaas. I-override nito ang mga utos ng hakbang sa pagsasaayos, at sa gayon ay maaari mong baguhin ang pagsasaayos gamit ang sumusunod na utos, na kinabibilangan din ng mga halimbawa at pagsubok.

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

Kung gagawin mo ito Waf ilulunsad sudoupang baguhin ang mga programa ng paggawa ng emulation code socket upang tumakbo nang may mga pahintulot ugat. Sa Waf Mayroong maraming iba pang mga opsyon na magagamit para sa pagsasaayos at mga hakbang sa pagbuo. Upang tuklasin ang iyong mga opsyon, ilagay ang:

$ ./waf --help

Sa susunod na seksyon ay gagamit kami ng ilang mga opsyon na nauugnay sa pagsubok.

Mga Profile ng Assembly

Nakita na namin kung paano mo i-configure Waf para sa mga pagtitipon mag-alis ng mga insekto ΠΈ optimized:

$ ./waf --build-profile=debug

Mayroon ding intermediate assembly profile, pakawalan. Pagpipilian -d ay kasingkahulugan ng --build-profile. Kinokontrol ng build profile ang paggamit ng logging, assertions, at compiler optimization switch:

Tutorial sa ns-3 network simulator. Kabanata 3

Gaya ng nakikita mo, ang pag-log at assertion ay magagamit lamang sa mga debug build. Ang inirerekomendang kasanayan ay i-develop ang iyong script sa debug mode, pagkatapos ay magsagawa ng mga paulit-ulit na pagpapatakbo (para sa mga istatistika o pagbabago ng parameter) sa isang na-optimize na profile ng build.

Kung mayroon kang code na dapat lang tumakbo sa ilang partikular na build profile, gamitin ang 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;)

Default, Waf naglalagay ng mga artifact sa build directory. Maaari kang tumukoy ng ibang direktoryo ng output gamit ang opsyon -β€―-out, halimbawa:

$ ./waf configure --out=my-build-dir

Sa pamamagitan ng pagsasama nito sa mga build profile, madali kang makakalipat sa pagitan ng iba't ibang opsyon sa compilation:

$ ./waf configure --build-profile=debug --out=build/debug
$ ./waf build
... 
$ ./waf configure --build-profile=optimized --out=build/optimized 
$ ./waf build
...

Na nagbibigay-daan sa iyo upang gumana sa maraming mga pagtitipon nang hindi kinakailangang muling isulat ang pinakabagong pagpupulong sa bawat oras. Kapag lumipat ka sa ibang profile, Waf ay i-compile lamang ito, nang hindi ganap na muling pinagsama-sama ang lahat.

Kapag lumipat ka ng mga profile ng build sa paraang ito, kailangan mong maging maingat na magbigay ng parehong mga opsyon sa configuration sa bawat pagkakataon. Ang pagtukoy sa ilang mga variable ng kapaligiran ay makakatulong sa iyong maiwasan ang mga pagkakamali:

$ 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

Compiler at flag

Sa mga halimbawa sa itaas Waf upang bumuo ng ns-3 ay gumagamit ng C++ compiler mula sa GCC ( g ++). Gayunpaman, maaari mong baguhin ang iyong ginagamit Waf C++ compiler, sa pamamagitan ng pagtukoy sa CXX environment variable. Halimbawa, para gamitin ang C++ compiler Clang, clang++,

$ CXX="clang++" ./waf configure 
$ ./waf build 

Sa parehong paraan maaari mong i-configure Waf gamitin ang distributed compilation gamit ang distcc:

$ CXX="distcc g++" ./waf configure 
$ ./waf build

Higit pang impormasyon tungkol sa distcc at distributed compilation ay makikita sa page ng proyekto sa seksyong Documentation. Upang magdagdag ng mga flag ng compiler kapag kino-configure ang ns-3, gamitin ang variable na environment na CXXFLAGS_EXTRA.

Instalasyon

Waf ay maaaring gamitin upang mag-install ng mga aklatan sa iba't ibang lugar sa system. Bilang default, ang mga pinagsama-samang aklatan at mga executable ay matatagpuan sa direktoryo magtayo, at dahil alam ni Waf ang lokasyon ng mga library at executable na ito, hindi na kailangang i-install ang mga library kahit saan pa.

Kung mas gusto ng mga user na mag-install sa labas ng build directory, maaari nilang patakbuhin ang command ./waf install. Ang default na prefix para sa pag-install ay / usr / lokalKaya ./waf install ay mag-i-install ng mga programa sa / usr / local / bin, mga aklatan sa / usr / local / lib at mga file ng header sa /usr/local/include. Karaniwang kailangang itakda ang mga karapatan ng superuser na may default na prefix, kaya magiging isang tipikal na command sudo ./waf install. Kapag inilunsad, pipiliin muna ni Waf na gamitin ang mga nakabahaging aklatan sa direktoryo ng build, pagkatapos ay maghanap ng mga aklatan sa daan patungo sa mga aklatan na na-configure sa lokal na kapaligiran. Kaya kapag nag-i-install ng mga aklatan sa isang system, isang magandang kasanayan na suriin kung ang mga tamang aklatan ay ginagamit. Maaaring piliin ng mga user na mag-install gamit ang ibang prefix sa pamamagitan ng pagpasa sa opsyon sa panahon ng configuration --prefix, halimbawa:

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

Kung sa ibang pagkakataon, pagkatapos ng build, ipinasok ng user ang command sa pag-install ./waf, gagamitin ang prefix /opt/local.

Koponan ./waf clean dapat gamitin bago muling i-configure ang proyekto kung gagamitin ang pag-install Waf sa ilalim ng ibang prefix.

Kaya, upang magamit ang ns-3 ay hindi na kailangang tumawag ./waf install. Karamihan sa mga gumagamit ay hindi kakailanganin ang utos na ito dahil Waf kukunin ang kasalukuyang mga aklatan mula sa direktoryo ng build, ngunit maaaring makita ng ilang user na ito ay kapaki-pakinabang kung ang kanilang mga aktibidad ay kasangkot sa pagtatrabaho sa mga programa sa labas ng direktoryo ng ns-3.

Waf single

Sa tuktok na antas ng puno ng pinagmulan ng ns-3, mayroon lamang isang Waf script. Kapag nagsimula kang magtrabaho, gumugugol ka ng maraming oras sa direktoryo scratch/ o mas malalim sasrc/... at sa parehong oras ay kailangang tumakbo Waf. Maaalala mo lang kung nasaan ka at tumakbo Waf tulad ng sumusunod:

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

ngunit ito ay nakakapagod at madaling kapitan ng pagkakamali, kaya mayroong mas mahusay na mga solusyon. Ang isang karaniwang paraan ay ang paggamit ng text editor tulad ng emacs o kalakasan, kung saan ang dalawang terminal session ay binuksan, ang isa ay ginagamit upang bumuo ng ns-3, at ang pangalawa ay ginagamit upang i-edit ang source code. Kung meron ka lang tarball, pagkatapos ay makakatulong ang isang environment variable:

$ export NS3DIR="$PWD" 
$ function waff { cd $NS3DIR && ./waf $* ; } 

$ cd scratch 
$ waff build

Sa direktoryo ng module ay maaaring nakakaakit na magdagdag ng isang walang kuwentang waf script tulad ng exec ../../waf. Pakiusap, huwag gawin iyon. Ito ay nakalilito para sa mga baguhan at, kapag nagawa nang hindi maganda, humahantong sa mahirap matukoy na mga error sa pagbuo. Ang mga solusyon na ipinakita sa itaas ay ang landas na dapat gamitin.

3.5 Pagsubok sa ns-3

Maaari mong patakbuhin ang mga pagsubok sa yunit ng pamamahagi ng ns-3 sa pamamagitan ng pagpapatakbo ng script ./test.py:

$ ./test.py

Ang mga pagsubok na ito ay pinapatakbo nang magkatulad sa Waf. Sa kalaunan, makikita mo ang isang mensahe na nagsasabing:

92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)

Ito ay isang mahalagang mensahe para sa pagtukoy ng mga pag-crash, pag-crash o error ng valgrind, na nagpapahiwatig ng mga problema sa code o hindi pagkakatugma sa pagitan ng mga tool at code.

Makikita mo rin ang huling output mula sa Waf at isang tester na nagpapatakbo ng bawat pagsubok, na magiging ganito ang hitsura:

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)

Ang utos na ito ay karaniwang pinapatakbo ng mga user upang mabilis na ma-verify na ang pamamahagi ng ns-3 ay binuo nang tama. (Tandaan na ang pagkakasunud-sunod ng "PASS: ..." na mga linya ay maaaring iba, ito ay normal. Ang mahalaga ay ang buod na linya sa dulo ng ulat ay nagpapakita na ang lahat ng mga pagsubok ay pumasa; walang mga pagsubok na nabigo o nag-crash.) At WafAt test.py ay magkakaparallelize ang trabaho sa lahat ng magagamit na mga core ng processor ng makina.

3.6 Pagpapatakbo ng script

Karaniwan kaming nagpapatakbo ng mga script sa ilalim ng kontrol Waf. Nagbibigay-daan ito sa build system na matiyak na ang mga shared library path ay naitakda nang tama at ang mga library ay available sa runtime. Upang patakbuhin ang programa, gamitin lamang Waf may parameter -β€―-run. Patakbuhin natin ang katumbas ng ns-3 ng ubiquitous program kumusta mundosa pamamagitan ng pag-type ng sumusunod:

$ ./waf --run hello-simulator

Susuriin muna ni Waf kung tama ang pagkakagawa ng programa at kung kinakailangan. Pagkatapos Waf ay magpapatupad ng isang programa na gumagawa ng sumusunod na output.

Hello Simulator

Binabati kita! Isa ka na ngayong ns-3 user!

Ano ang dapat kong gawin kung hindi ko makita ang mga resulta?

Kung makakita ka ng mga mensahe Wafna nagpapahiwatig na matagumpay na nakumpleto ang build, ngunit hindi mo nakikita ang output "Hello Simulator", pagkatapos ay may posibilidad na sa seksyong [Build-with-Waf] inilipat mo ang iyong build mode sa optimized, ngunit napalampas na lumipat pabalik sa mode mag-alis ng mga insekto. Ang lahat ng output ng console na ginamit sa tutorial na ito ay gumagamit ng isang espesyal na bahagi ng ns-3 na nagsasagawa ng pag-log at ginagamit upang mag-print ng mga custom na mensahe sa console. Ang output mula sa bahaging ito ay awtomatikong hindi pinagana kapag ang na-optimize na code ay pinagsama-sama - ito ay "na-optimize". Kung hindi mo nakikita ang "Hello Simulator" na output, ilagay ang sumusunod:

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

upang i-configure Waf upang bumuo ng mga bersyon ng debug ng mga ns-3 program, na kinabibilangan ng mga halimbawa at pagsubok. Dapat mong muling buuin ang kasalukuyang bersyon ng pag-debug ng code sa pamamagitan ng pag-type

$ ./waf

Ngayon kung patakbuhin mo ang programa hello-simulator, dapat mong makita ang inaasahang resulta.

3.6.1 Mga argumento ng command line

Upang ipasa ang mga argumento ng command line sa ns-3 program, gamitin ang sumusunod na pattern:

$ ./waf --run <ns3-program> --command-template="%s <args>"

Palitan sa pangalan ng iyong programa at sa mga argumento. Pangangatwiran -β€―-command-template para sa Waf ay mahalagang isang recipe para sa pagbuo ng aktwal na command line Waf ginamit upang maisagawa ang programa. Tinitingnan ni Waf kung kumpleto na ang build, itinatakda ang mga path ng shared library, pagkatapos ay ginagamit ang ibinigay na template ng command line at pinapalitan ang pangalan ng program para sa placeholder ng %s para tawagan ang executable. Kung nakita mong kumplikado ang syntax na ito, mayroong isang mas simpleng bersyon na kinasasangkutan ng ns-3 program at ang mga argumento nito na nakapaloob sa mga solong quote:

$ ./waf --run '<ns3-program> --arg1=value1 --arg2=value2 ...'

Ang isa pang partikular na kapaki-pakinabang na halimbawa ay ang pagpapatakbo ng mga test suite nang pili. Ipagpalagay natin na mayroong test suite na tinatawag na mytest (sa katunayan ay wala). Sa itaas ay ginamit namin ang ./test.py script upang magpatakbo ng ilang pagsubok nang magkatulad, na paulit-ulit na tumatawag sa test program test-runner. Tumawag test-runner direkta upang magpatakbo ng isang pagsubok:

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

Ang mga argumento ay ipapasa sa programa test-runner. Dahil walang mytest, bubuo ng mensahe ng error. Upang i-print ang mga available na opsyon sa test-runner, ilagay ang:

$ ./waf --run test-runner --command-template="%s --help"

3.6.2 Pag-debug

Upang magpatakbo ng mga programang ns-3 sa ilalim ng isa pang utility, tulad ng isang debugger (halimbawa, gdb) o isang memory test tool (halimbawa, valgrind), gumamit ng katulad na anyo -β€―-command-template = "…". Halimbawa, upang tumakbo sa debugger gdb ang iyong hello-simulator ns-3 program na may mga argumento:

$ ./waf --run=hello-simulator --command-template="gdb %s --args <args>"

Tandaan na ang pangalan ng programa ng ns-3 ay kasama ng argumento -β€―-run, at ang utility sa pamamahala (dito gdb) ay ang unang token sa argumento -β€―-command-template. Pagpipilian -β€―-args mga ulat gdbna ang natitirang bahagi ng command line ay kabilang sa "lower" program. (Ilang bersyon gdb hindi maintindihan ang opsyon -β€―-args. Sa kasong ito, alisin ang mga argumento ng programa mula sa -β€―-command-template at gamitin ang command set gdb mga pagtatalo.) Maaari naming pagsamahin ang recipe na ito at ang nauna para patakbuhin ang pagsubok sa ilalim ng debugger:

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

3.6.3 Gumagana na direktoryo

Ang Waf ay dapat ilunsad mula sa lokasyon nito sa tuktok ng puno ng ns-3. Ang folder na ito ay nagiging gumaganang direktoryo kung saan isusulat ang mga output file. Ngunit paano kung gusto mong panatilihin ang mga file na ito sa labas ng ns-3 source tree? Gumamit ng argumento -β€―-cwd:

$ ./waf --cwd=...

Maaari mong makitang mas maginhawang makuha ang mga output file sa iyong gumaganang direktoryo. Sa kasong ito, makakatulong ang sumusunod na hindi direktang aksyon:

$ function waff {
CWD="$PWD" 
cd $NS3DIR >/dev/null 
./waf --cwd="$CWD" $*
cd - >/dev/null 
}

Ang palamuti na ito ng nakaraang bersyon ng utos ay nagpapanatili ng kasalukuyang gumaganang direktoryo, napupunta sa direktoryo Wafat saka nagtuturo Waf upang baguhin ang gumaganang direktoryo pabalik sa kasalukuyang gumaganang direktoryo na naka-save bago simulan ang programa. Binabanggit namin ang koponan -β€―-cwd Para sa pagiging kumpleto, pinapatakbo lang ng karamihan sa mga user ang Waf mula sa top-level na direktoryo at bumubuo ng mga output file doon.

Ipinagpatuloy: Kabanata 4

Pinagmulan: www.habr.com

Magdagdag ng komento