3 Darbo pradžia
3.1 Apžvalga
3.2 Būtinos sąlygos
3.2.1 ns-3 leidimo kaip šaltinio archyvo atsisiuntimas
3.3 ns-3 atsisiuntimas naudojant Git
3.3.1 ns-3 įkėlimas naudojant „Bake“.
3.4 Surinkimas ns-3
3.4.1 Pastatas su build.py
3.4.2 Statyba naudojant „Bake“.
3.4.3 Sukurti naudojant Waf
3.5 Testavimas ns-3
3.6 Scenarijaus vykdymas
3.6.1 Komandinės eilutės argumentai
3.6.2 Derinimas
3.6.3 Darbinis katalogas
3 skyrius
Pradžia
Šis skyrius skirtas paruošti skaitytoją pradėti nuo kompiuterio, kuriame galbūt niekada nebuvo įdiegtas ns-3. Ji apima palaikomas platformas, būtinas sąlygas, kaip gauti ns-3, kaip sukurti ns-3 ir kaip išbandyti savo kūrimą ir paleisti paprastas programas.
3.1 Apžvalga
ns-3 simuliatorius sukurtas kaip bendradarbiaujančių programinės įrangos bibliotekų sistema. Surinkimo metu vartotojo programų kodas yra susietas su šiomis bibliotekomis. C++ arba Python programavimo kalbos naudojamos tinkintoms programoms rašyti.
Ns-3 platinamas kaip šaltinio kodas, o tai reiškia, kad tikslinėje sistemoje turi būti programinės įrangos kūrimo aplinka, kad pirmiausia būtų sukurtos bibliotekos, o vėliau – vartotojo programa. Iš esmės ns-3 galėtų būti platinamos kaip paruoštos bibliotekos konkrečiai sistemai, o ateityje jos gali būti platinamos tokiu būdu. Tačiau šiais laikais daugelis vartotojų iš tikrųjų atlieka savo darbą redaguodami ns-3, todėl naudinga turėti šaltinio kodą bibliotekoms kurti. Jei kas nors norėtų imtis paruoštų bibliotekų ir paketų operacinėms sistemoms kūrimo, susisiekite su adresatų sąrašu ns kūrėjai.
Toliau apžvelgsime tris būdus, kaip atsisiųsti ir sukurti ns-3. Pirmasis yra atsisiųsti ir sukurti oficialų leidimą iš pagrindinės svetainės. Antrasis – pagrindinio ns-3 diegimo kūrimo versijų kopijų parinkimas ir surinkimas. Trečia – naudoti papildomus kūrimo įrankius, kad būtų galima įkelti daugiau ns-3 plėtinių. Išnagrinėsime kiekvieną, nes įrankiai šiek tiek skiriasi.
Patyrę Linux vartotojai gali stebėtis, kodėl ns-3 nepateikiamas kaip paketas, kaip ir dauguma kitų bibliotekų, naudojančių paketų tvarkyklę? Nors yra dvejetainių paketų, skirtų įvairiems Linux platinimams (pvz., Debian), dauguma vartotojų redaguoja bibliotekas ir patys turi perdaryti ns-3, todėl turėti šaltinio kodą yra patogu. Dėl šios priežasties daugiausia dėmesio skirsime diegimui iš šaltinio.
Daugeliui programų ns-3 teisės šaknis nereikia, rekomenduojama naudoti neprivilegijuotą vartotojo abonementą.
3.2 Būtinos sąlygos
Visas galimų ns-3 bibliotekų rinkinys turi nemažai priklausomybių nuo trečiųjų šalių bibliotekų, tačiau didžiąją dalį ns-3 galima sukurti ir naudoti su kelių bendrų (dažnai įdiegtų pagal numatytuosius nustatymus) komponentų palaikymu: C++ kompiliatorius, Python, šaltinio kodo redaktorius (pavyzdžiui, energija, emacs arba Užtemimas) ir, jei naudojamos kūrimo saugyklos, „Git“ versijų valdymo sistemos. Daugumai pirmą kartą besinaudojančių naudotojų nereikės jaudintis, jei jų konfigūracija praneša, kad trūksta kai kurių ns-3 išplėstinių funkcijų, tačiau tiems, kurie nori visiškai įdiegti, projektas pateikia wiki, kuriame yra puslapių su daug naudingų patarimų ir gudrybių. Vienas iš tokių puslapių yra Diegimo puslapis su įvairių sistemų diegimo instrukcijomis, kurias galima rasti adresu:
Šio wiki skiltyje Būtinos sąlygos paaiškinama, kokių paketų reikia norint palaikyti įprastas ns-3 parinktis, taip pat pateikiamos komandos, naudojamos joms įdiegti įprastose „Linux“ arba „MacOS“ versijose.
Galite pasinaudoti šia galimybe tyrinėti ns-3 wiki puslapį arba pagrindinę svetainę:
Įrankio paketas / versija
- C++ kompiliatorius
clang++ arba g++ („g++“ 4.9 ar naujesnė versija) - Pitonas
python2 versija >= 2.7.10 arba python3 versija >=3.4 - git
bet kokia naujausia versija (norint pasiekti ns-3 svetainėje GitLab.com) - degutas
bet kuri naujausia versija (skirta išpakuoti ns‑3 leidimą) - bunzip2
bet kokia naujausia versija (ns-3 leidimo išpakavimui)
Norėdami patikrinti numatytąją Python versiją, įveskite python -V
. Norėdami patikrinti g++ versiją, įveskite g++ -v
. Jei trūksta kokių nors įrankių arba jie yra per seni, žr. diegimo vadovą ns-3 wiki puslapyje.
Nuo šio momento darome prielaidą, kad skaitytuvas naudoja Linux, MacOS arba Linux emuliatorių ir turi bent jau aukščiau nurodytus įrankius.
3.2.1 ns-3 leidimo kaip šaltinio archyvo atsisiuntimas
Tai veiksmas, skirtas naujam vartotojui, norinčiam atsisiųsti ir eksperimentuoti su naujausiomis ns-3 versijomis ir paketo versijomis. ns-3 leidimai skelbiami kaip suspausto šaltinio archyvai, kartais vadinami tarbal. tarbal yra specialus programinės įrangos archyvo formatas, kuriame sujungiami keli failai. Archyvas paprastai yra suglaudintas. ns-3 įkrovos procesas per tarbal yra paprasta, jums tereikia pasirinkti leidimą, atsisiųsti ir išpakuoti.
Tarkime, kad jūs, kaip vartotojas, norite sukurti ns-3 vietiniame kataloge, vadinamame darbo sritis. Darbinę leidimo kopiją galite gauti „Linux“ konsolėje įvedę toliau nurodytus dalykus (žinoma, pakeisdami atitinkamus versijos numerius)
$ 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
Atkreipkite dėmesį į aukščiau naudotą įrankį wget, kuri yra komandų eilutės įrankis, skirtas objektams iš interneto atsisiųsti. Jei jo neįdiegėte, galite naudoti savo naršyklę.
Atlikę šiuos veiksmus pateksite į ns-allinone-3.29 katalogą, kuriame turėtumėte pamatyti kelis failus ir katalogus
$ 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
Dabar esate pasirengę sukurti ns-3 bazinį paskirstymą ir galite pereiti prie ns-3 kūrimo skyriaus.
3.3 ns-3 atsisiuntimas naudojant Git
Ns-3 kodą galima rasti Git saugyklose GitLab.com adresu
Lengviausias būdas pradėti naudoti „Git“ saugyklas yra šakotis arba klonuoti aplinką ns-3-alinonas. Tai scenarijų rinkinys, valdantis dažniausiai naudojamų ns-3 posistemių įkėlimą ir surinkimą. Jei Git naudojate pirmą kartą, terminai „šakė“ ir „klonas“ jums gali būti nepažįstami; jei taip, rekomenduojame tiesiog klonuoti (padaryti savo kopiją) saugyklą, esančią GitLab.com, taip:
$ cd
$ mkdir workspace
$ cd workspace
$ git clone https://gitlab.com/nsnam/ns-3-allinone.git
$ cd ns-3-allinone
Šiame etape jūsų katalogo vaizdas ns-3-alinonas šiek tiek skiriasi nuo anksčiau aprašyto leidimų archyvo katalogo. Tai turėtų atrodyti maždaug taip:
$ ls
build.py constants.py download.py README util.py
Atkreipkite dėmesį, kad yra scenarijus download.py, kuris papildomai išskirs ns-3 ir pridedamą šaltinio kodą. Čia galite pasirinkti: arba atsisiųskite naujausią ns-3 kūrimo momentinę kopiją:
$ python download.py
arba pirmenybę teikite ns-3 leidimui naudodami vėliavėlę -n
nurodyti išleidimo numerį:
$ python download.py -n ns-3.29
Po šio veiksmo į katalogą ns-3-alinonas bus atsisiųstos papildomos saugyklos ns-3, apkepas, pybindgen и netanimas.
Atkreipti dėmesį
Įrenginyje su švariu Ubuntu16.04 man reikėjo pakeisti komandą į šią: $ sudo python3 download.py -n ns-3.29
(toliau – vertėjo pastabos).
3.3.1 ns-3 įkėlimas naudojant „Bake“.
Pirmiau minėti du metodai (šaltinio archyvas arba saugykla ns-3-alinonas per Git) yra naudingi norint gauti paprasčiausią ns-3 diegimą su keliais priedais (pybindgen sukurti Python įrišimus ir netanimas tinklo animacijai). Iškviečiama trečioji saugykla, numatyta pagal nutylėjimą ns-3-allinone apkepas.
Kepkite yra įrankis suderintam programinės įrangos kūrimui iš kelių saugyklų, sukurtas ns-3 projektui. Kepkite gali būti naudojamas norint gauti ns-3 kūrimo versijas, taip pat atsisiųsti ir kurti bazinės ns-3 platinimo versijos plėtinius, pvz., aplinką. Tiesioginis kodo vykdymas, CradleNetwork modeliavimo lopšys, galimybė kurti naujus Python įrišimus ir įvairias ns-3 „programas“.
Atkreipti dėmesį
CradleNetwork Simulation Cradle yra sistema, leidžianti tinklo simuliatoriuje naudoti tikrus TCP/IP tinklo krūvas.
Jei tikitės, kad jūsų ns-3 diegimas turės išplėstinių arba papildomų funkcijų, galite sekti šiuo diegimo keliu.
Naujausiuose ns-3 leidimuose Kepkite buvo pridėta prie deguto išleidimo. Leidime yra konfigūracijos failas, leidžiantis atsisiųsti išleidimo metu galiojančias programinės įrangos versijas. Tai, pavyzdžiui, versija Kepkite, kuris platinamas kartu su ns-3.29 leidimu, gali būti naudojamas tos ns-3 ar senesnės leidimo komponentams nuskaityti, bet negali būti naudojamas vėlesnių leidimų komponentams nuskaityti (jei paketo aprašo failas bakeconf.xml neatnaujinta).
Taip pat galite gauti naujausią kopiją apkepasįvesdami šią komandą į savo „Linux“ konsolę (darant prielaidą, kad įdiegėte „Git“):
$ cd
$ mkdir workspace
$ cd workspace
$ git clone https://gitlab.com/nsnam/bake.git
Vykdydami komandą git, turėtumėte pamatyti kažką panašaus į šį:
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.
Kai komanda bus baigta klonuoti turėtumėte turėti katalogą pavadinimu apkepas, kurio turinys turėtų atrodyti maždaug taip:
$ cd bake
$ ls
bake bakeconf.xml bake.py doc examples generate-binary.py test TODO
Atminkite, kad įkėlėte kelis Python scenarijus, pavadintą Python moduliu apkepas ir XML konfigūracijos failą. Kitas žingsnis yra naudoti šiuos scenarijus, kad atsisiųstumėte ir sukurtumėte pasirinktą ns-3 platinimą. Galimi keli tinkinimo tikslai:
-
ns-3.29: modulis, atitinkantis laidą; jis atsisiųs komponentus, panašius į išleidimą tarball;
-
ns-3-dev: panašus modulis, bet naudojant kodą iš kūrimo medžio;
-
ns-alinonas-3.29: modulis, kuriame yra kitų papildomų funkcijų, pvz., paspaudimų maršruto parinkimas ir tinklo modeliavimo laikiklis, „Openflow“, skirta ns-3.
-
ns-3-alinonas: panašus į modulio išleidimo versiją viskas viename, bet kūrimo kodui.
Atkreipti dėmesį
Spauskite — modulinė programinės įrangos architektūra maršrutizatoriams kurti.
„Openflow“ – tai protokolas, skirtas valdyti duomenų tinkle maršrutizatorių ir komutatorių perduodamų duomenų apdorojimo procesą, įgyvendinant programinės įrangos apibrėžtą tinklo technologiją.
Dabartinę kūrimo momentinę kopiją (neišleista) ns-3 galite rasti adresu:
Kūrėjai stengiasi, kad šios saugyklos veiktų nuosekliai, tačiau jos yra kūrimo srityje ir jose yra neišleisto kodo, todėl jei neplanuojate naudoti naujų funkcijų, pasirinkite oficialų leidimą.
Naujausią kodo versiją galite rasti naršydami saugyklų sąrašą arba apsilankę ns-3 leidimų tinklalapyje:
Dabar, norėdami gauti mums reikalingus ns-3 komponentus, naudosime įrankį Kepkite. Pasakykime keletą įžanginių žodžių apie kūrinį Kepkite.
„Bake“ veikia įkeliant paketų šaltinius į katalogą Šaltinis ir diegti bibliotekas į kūrimo katalogą. Kepkite galima paleisti nurodant dvejetainį kodą, bet jei norite paleisti Kepkite ne iš katalogo, kuriame jis buvo atsisiųstas, patartina pridėti kelią į apkepas į jūsų kelią (PATH aplinkos kintamasis), pavyzdžiui, taip (Linux bash apvalkalo pavyzdys). Eikite į katalogą „bake“ ir nustatykite šiuos aplinkos kintamuosius:
$ export BAKE_HOME=`pwd`
$ export PATH=$PATH:$BAKE_HOME:$BAKE_HOME/build/bin
$ export PYTHONPATH=$PYTHONPATH:$BAKE_HOME:$BAKE_HOME/build/lib
Tai įdės programą kepti.py į apvalkalo kelią ir leis kitoms programoms rasti vykdomuosius failus ir bibliotekas, kurias ji sukūrė apkepas. Kai kuriais naudojimo atvejais apkepas, aukščiau aprašytas PATH ir PYTHONPATH nustatymas nereikalingas, tačiau paprastai to reikia norint sukurti visą ns-3-allinone (su papildomais paketais).
Eikite į savo darbo katalogą ir konsolėje įveskite:
$ ./bake.py configure -e ns-3.29
Toliau paklausime Kepkite patikrinkite, ar turime pakankamai įrankių įvairiems komponentams įkelti. Skambinkite:
$ ./bake.py check
Turėtumėte pamatyti kažką panašaus į šiuos dalykus:
> 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 ...
Šiame veiksme ypač svarbūs įkėlimo įrankiai, tokie kaip Mercurial, CVS, Git ir Bazaar, nes jie leidžia mums gauti kodą. Šiame etape įdiekite trūkstamus įrankius įprastu savo sistemai būdu (jei žinote, kaip tai padaryti) arba kreipkitės pagalbos į sistemos administratorių.
Tada pabandykite atsisiųsti programinę įrangą:
$ ./bake.py download
rezultatas turėtų būti maždaug toks:
>> 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
Tai reikš, kad buvo atsisiųsti trys šaltiniai. Dabar eikite į šaltinio katalogą ir įveskite ls; Turėtumėte pamatyti:
$ cd source
$ ls
netanim-3.108 ns-3.29 pybindgen
Dabar esate pasirengę sukurti ns-3 paskirstymą.
3.4 Surinkimas ns-3
Kaip ir atsisiunčiant ns-3, yra keletas ns-3 kūrimo būdų. Pagrindinis dalykas, kurį norime pabrėžti, yra tai, kad ns-3 yra sukurtas naudojant kūrimo įrankį, vadinamą Wafaprašyta toliau. Dauguma vartotojų dirbs su Waf, tačiau yra keletas patogių scenarijų, padėsiančių pradėti arba organizuoti sudėtingesnes versijas. Taigi, prašau, prieš skaitydami apie Waf, pažiūrėk į build.py ir surinkimas su apkepas.
3.4.1 Pastatas su build.py
Dėmesio! Šis kūrimo veiksmas pasiekiamas tik iš šaltinio archyvo versijos, gautos kaip aprašyta aukščiau; ir neatsisiųsta per git arba bake.
Dirbant su leidimų archyvu tarbalĮ ns-3-alinonas Yra patogus scenarijus, kuris gali palengvinti komponentų surinkimą. Tai vadinama build.py. Ši programa sukurs projektą jums naudingiausiu būdu. Tačiau atminkite, kad sudėtingesnė sąranka ir darbas su ns-3 paprastai apima pačios ns-3 kūrimo sistemos Waf naudojimą, kuri bus pristatyta vėliau šioje pamokoje.
Jei atsisiuntėte naudodami tarbal, tada į savo katalogą ~/darbo vieta katalogas su panašiu pavadinimu ns-alinonas-3.29. Įveskite:
$ ./build.py --enable-examples --enable-tests
Kai skambina build.py Naudojome komandinės eilutės argumentus, kad sukurtume šioje mokymo programoje naudojamus pavyzdžius ir testus, kurie pagal numatytuosius nustatymus nėra sukurti ns-3. Pagal numatytuosius nustatymus programa taip pat sukuria visus galimus modulius. Tada, jei norite, galite sukurti ns-3 be pavyzdžių ir testų arba neįtraukti modulių, kurie nereikalingi jūsų darbui.
Pamatysite daug kompiliatoriaus išvesties pranešimų, rodomų scenarijuje, kai jis kuria įvairias jūsų įkeltas dalis. Pirmiausia scenarijus bandys sukurti animatorių netanimas, tada įrišimo generatorius pybindgen ir galiausiai ns-3. Kai procesas bus baigtas, turėtumėte pamatyti šiuos dalykus:
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
Paskutinėse trijose sąrašo eilutėse matome pranešimą apie modulius, kurie nebuvo sukurti:
Modules not built (see ns-3 tutorial for explanation):
brite click
Tai tiesiog reiškia, kad kai kurie ns-3 moduliai, kurie priklauso nuo išorinių bibliotekų, gali būti nesukurti arba kad jų nereikia kurti šiai konfigūracijai. Tai nereiškia, kad simuliatorius nesurinktas arba kad surinkti moduliai neveiks tinkamai.
3.4.2 Statyba naudojant „Bake“.
Jei naudojote aukščiau esantį bake, norėdami gauti šaltinio kodą iš projekto saugyklų, galite ir toliau jį naudoti kurdami ns-3. Skambinkite:
$ ./bake.py build
ir turėtum pamatyti kažką panašaus:
>> Building pybindgen-0.19.0.post4+ng823d8b2 - OK
>> Building netanim-3.108 - OK
>> Building ns-3.29 - OK
Patarimas: Taip pat galite vienu metu atlikti atsisiuntimo ir kūrimo veiksmus, paskambinę „bake.py deploy“.
Visų komponentų surinkimas gali nepavykti, tačiau surinkimas bus tęsiamas, jei komponentas nereikalingas. Pavyzdžiui, neseniai kilo perkeliamumo problema castxml galima surinkti naudojant įrankį apkepas ne visose platformose. Tokiu atveju pasirodys toks pranešimas:
>> 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.
Bet castxml reikalingas tik tuo atveju, jei norite sukurti atnaujintus Python sąsajas. Daugumai vartotojų to nereikia (bent jau kol jie nepakeis ns-3), todėl kol kas į tokius įspėjimus galima drąsiai nekreipti dėmesio.
Jei nepavyks, ši komanda duos užuominą apie trūkstamas priklausomybes:
$ ./bake.py show
Bus išvardytos įvairios paketų, kuriuos bandote sukurti, priklausomybės.
3.4.3 Sukurti naudojant Waf
Iki šiol, norėdami pradėti kurti ns-3, naudojome arba scenarijų build.py, arba įrankis apkepas. Šie įrankiai naudingi kuriant ns-3 ir prižiūrint bibliotekas. Tiesą sakant, norėdami sukurti, jie naudoja kūrimo įrankį Waf iš katalogo ns-3. Waf įdiegta su ns-3 šaltinio kodu. Daugelis vartotojų greitai pereina prie tiesioginio naudojimo konfigūruodami ir surinkdami ns-3 Waf. Taigi, norėdami tęsti, eikite į ns-3 katalogą, kurį iš pradžių sukūrėte.
Šiuo metu tai nėra griežtai reikalaujama, tačiau bus naudinga šiek tiek atsitraukti ir pamatyti, kaip pakeisti projekto konfigūraciją. Tikriausiai naudingiausias konfigūracijos pakeitimas, kurį galite atlikti, yra sukurti optimizuotą kodo versiją. Pagal numatytuosius nustatymus sukonfigūravote projektą, kad sukurtumėte derinimo versiją. Pažvelkime į projektą, kaip sukurti optimizuotą konstrukciją. Norėdami paaiškinti Waf, kad ji turėtų sukurti optimizuotus kūrinius, apimančius pavyzdžius ir testus, turėsite paleisti šias komandas:
$ ./waf clean
$ ./waf configure --build-profile=optimized --enable-examples --enable-tests
Tai bus paleista Waf ne vietiniame kataloge (jūsų patogumui). Pirmoji komanda pašalina ankstesnę versiją, paprastai tai nėra griežtai būtina, tačiau tai yra gera praktika (taip pat žr. toliau pateiktus kūrimo profilius); tai ištrins anksčiau sukurtas bibliotekas ir objektų failus, esančius kataloge statyti /. Kai projektas sukonfigūruojamas iš naujo, o kūrimo sistema patikrina įvairias priklausomybes, turėtumėte matyti išvestį, panašią į toliau pateiktą:
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)
Atkreipkite dėmesį į paskutinę aukščiau esančio sąrašo dalį. Kai kurios ns-3 parinktys neįjungtos pagal numatytuosius nustatymus arba norint tinkamai veikti, reikalingas sistemos palaikymas. Pavyzdžiui, norint įjungti XmlTo, biblioteka turi būti sistemoje libxml-2.0. Jei ši biblioteka nerasta ir atitinkama ns-3 funkcija nebuvo įjungta, bus rodomas pranešimas. Taip pat atkreipkite dėmesį, kad galima naudoti komandą : sudo tam tikroms programoms nustatyti suid bitą „nustatyti grupės ID vykdymo metu“. Pagal numatytuosius nustatymus ji neįjungta, todėl ši funkcija rodoma kaip „neįjungta“. Galiausiai, norėdami gauti įjungtų parinkčių sąrašą, naudokite Waf su parametru --check-config
.
Dabar grįžkime prie derinimo versijos, kurioje yra pavyzdžių ir testų.
$ ./waf clean
$ ./waf configure --build-profile=debug --enable-examples --enable-tests
Dabar sukurta kūrimo sistema ir galite kurti ns-3 programų derinimo versijas tiesiog įvesdami:
$ ./waf
Aukščiau atlikti veiksmai galėjo priversti jus du kartus sukurti dalį ns-3 sistemos, bet dabar žinote, kaip pakeisti konfigūraciją ir sukurti optimizuotą kodą.
Norėdami patikrinti, kuris profilis yra aktyvus tam tikrai projekto konfigūracijai, yra komanda:
$ ./waf --check-profile
Waf: Entering directory `/path/to/ns-3-allinone/ns-3.29/build'
Build profile: debug
Aukščiau pateiktas scenarijus build.py taip pat palaiko argumentus --enable-examples
и --enable-tests
, bet kiti variantai Waf jis tiesiogiai nepalaiko. Pavyzdžiui, tai neveiks:
$ ./build.py --disable-python
reakcija bus tokia:
build.py: error: no such option: --disable-python
Tačiau specialus operatorius - - gali būti naudojamas papildomiems parametrams perduoti per WAFtaigi vietoj aukščiau nurodytos komandos veiks:
$ ./build.py -- --disable-python
nes ji generuoja pagrindinę komandą ./waf configure --disable-python. Štai keletas įvadinių patarimų apie Waf.
Konstravimo klaidų tvarkymas
ns-3 leidimai testuojami naudojant naujausius C++ kompiliatorius, esančius išleidimo metu įprastuose Linux ir MacOS platinimuose. Tačiau laikui bėgant išleidžiami nauji platinimai su naujais kompiliatoriais, o šie naujesni kompiliatoriai dažniausiai perspėja pedantiškiau. ns-3 sukonfigūruoja savo versiją, kad visi įspėjimai būtų traktuojami kaip klaidos, todėl kartais, jei naudojate senesnę versiją naujesnėje sistemoje, kompiliatoriaus įspėjimas gali sustabdyti kūrimą.
Pavyzdžiui, anksčiau buvo išleista ns‑3.28, skirta „Fedora 28“, į kurią buvo įtraukta nauja pagrindinė versija GCC (gcc-8). Kuriant ns-3.28 ar ankstesnes versijas pagal Fedora 28, kai įdiegta Gtk2+, atsiras ši klaida:
/usr/include/gtk-2.0/gtk/gtkfilechooserbutton.h:59:8: error: unnecessary parentheses ,!in declaration of ‘__gtk_reserved1’ [-Werror=parentheses] void (*__gtk_reserved1);
Leidimuose, pradedant nuo ns-3.28.1, in Waf yra galimybė išspręsti šias problemas. Jis neleidžia nustatyti vėliavėlės „-Werror“ g++ ir clang++. Tai parinktis „--disable-werror“ ir turi būti taikoma konfigūruojant:
$ ./waf configure --disable-werror --enable-examples --enable-tests
Konfigūruoti arba surinkti
Kai kurios komandos Waf turi reikšmę tik konfigūravimo fazėje, o kai kurios galioja tik kūrimo fazėje. Pavyzdžiui, jei norite naudoti ns-3 emuliacijos funkcijas, galite įjungti bitų nustatymą suid naudojant : sudo, kaip aprašyta aukščiau. Tai nepaisys konfigūracijos žingsnių komandų, todėl galite pakeisti konfigūraciją naudodami šią komandą, kuri taip pat apima pavyzdžius ir testus.
$ ./waf configure --enable-sudo --enable-examples --enable-tests
Jei tai padarysite Waf paleis : sudopakeisti emuliacijos kodo lizdų kūrimo programas, kad jos veiktų su leidimais šaknis. Į Waf Yra daug kitų konfigūravimo ir kūrimo žingsnių parinkčių. Norėdami ištirti savo parinktis, įveskite:
$ ./waf --help
Kitame skyriuje naudosime kai kurias su testavimu susijusias parinktis.
Surinkimo profiliai
Mes jau matėme, kaip galite konfigūruoti Waf surinkimams derinti и optimizuotas:
$ ./waf --build-profile=debug
Taip pat yra tarpinis surinkimo profilis, išlaisvinti. Variantas -d
yra sinonimas su --build-profile
. Kūrimo profilis valdo registravimo, tvirtinimų ir kompiliatoriaus optimizavimo jungiklių naudojimą:
Kaip matote, registravimas ir tvirtinimai pasiekiami tik derinimo versijose. Rekomenduojama scenarijų kurti derinimo režimu, tada pakartotinai paleisti (statistikai ar parametrų pakeitimams) optimizuotame kūrimo profilyje.
Jei turite kodą, kuris turėtų veikti tik tam tikruose kūrimo profiliuose, naudokite Code Wrapper makrokomandą:
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;)
Numatytas, Waf vietų kūrimo artefaktus kūrimo kataloge. Naudodami parinktį galite nurodyti kitą išvesties katalogą - -out
, pavyzdžiui:
$ ./waf configure --out=my-build-dir
Sujungę tai su kūrimo profiliais, galite lengvai perjungti skirtingas kompiliavimo parinktis:
$ ./waf configure --build-profile=debug --out=build/debug
$ ./waf build
...
$ ./waf configure --build-profile=optimized --out=build/optimized
$ ./waf build
...
Tai leidžia dirbti su keliais agregatais, kiekvieną kartą nereikalaujant perrašyti naujausio rinkinio. Kai persijungiate į kitą profilį, Waf kompiliuos tik jį, visiškai neperkompiliuodamas visko.
Kai perjungiate kūrimo profilius tokiu būdu, turite būti atsargūs, kad kiekvieną kartą pateiktumėte tas pačias konfigūracijos parinktis. Kelių aplinkos kintamųjų apibrėžimas padės išvengti klaidų:
$ 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
Kompiliatoriai ir vėliavėlės
Aukščiau pateiktuose pavyzdžiuose Waf ns-3 kūrimui naudojamas C++ kompiliatorius iš GCC ( g ++). Tačiau galite pakeisti naudojamą Waf C++ kompiliatorius, apibrėžiant CXX aplinkos kintamąjį. Pavyzdžiui, norėdami naudoti C++ kompiliatorių Clang, clang++,
$ CXX="clang++" ./waf configure
$ ./waf build
Taip pat galite konfigūruoti Waf naudoti paskirstytą kompiliaciją naudojant distcc:
$ CXX="distcc g++" ./waf configure
$ ./waf build
Daugiau informacijos apie distcc ir paskirstytą kompiliaciją rasite projekto puslapyje, skiltyje Dokumentacija. Norėdami pridėti kompiliatoriaus vėliavėles konfigūruodami ns-3, naudokite aplinkos kintamąjį CXXFLAGS_EXTRA.
Montavimas
Waf galima naudoti bibliotekoms diegti įvairiose sistemos vietose. Pagal numatytuosius nustatymus sudarytos bibliotekos ir vykdomieji failai yra kataloge statyti, o kadangi Waf žino šių bibliotekų ir vykdomųjų failų vietą, nereikia bibliotekų diegti niekur kitur.
Jei vartotojai nori įdiegti ne kūrimo kataloge, jie gali paleisti komandą ./waf įdiegti. Numatytasis diegimo priešdėlis yra / usr / localTaip ./waf įdiegti įdiegs programas / usr / local / bin, bibliotekose / usr / local / lib ir antraštės failus /usr/local/include. Supervartotojo teisės paprastai turi būti nustatytos naudojant numatytąjį priešdėlį, todėl įprasta komanda būtų tokia sudo ./waf įdiegti. Paleidus Waf pirmiausia pasirinks naudoti bendrinamas bibliotekas kūrimo kataloge, tada ieškos bibliotekų kelyje į vietinėje aplinkoje sukonfigūruotas bibliotekas. Taigi, diegiant bibliotekas sistemoje, gera praktika yra patikrinti, ar naudojamos tinkamos bibliotekos. Vartotojai gali pasirinkti įdiegti su kitu priešdėliu, konfigūruodami nurodydami parinktį --prefix
, pavyzdžiui:
./waf configure --prefix=/opt/local
Jei vėliau, po sukūrimo, vartotojas įveda diegimo komandą ./waf
, bus naudojamas priešdėlis /opt/local.
Komanda ./waf clean
turi būti naudojamas prieš perkonfigūruojant projektą, jei diegimas bus naudojamas Waf su kitu priešdėliu.
Taigi, norint naudoti ns-3, skambinti nereikia ./waf install
. Daugumai vartotojų šios komandos nereikės, nes Waf paims dabartines bibliotekas iš kūrimo katalogo, tačiau kai kuriems vartotojams tai gali būti naudinga, jei jų veikla yra susijusi su programomis, esančiomis ne ns-3 kataloge.
Waf singlas
Viršutiniame ns-3 šaltinio medžio lygyje yra tik vienas Waf scenarijus. Pradėję dirbti daug laiko praleisite kataloge scratch/
arba giliau įsrc/...
ir tuo pačiu turi bėgti Waf. Galite tiesiog prisiminti, kur esate, ir bėgti Waf taip:
$ ../../../waf ...
bet tai bus nuobodu ir bus daug klaidų, todėl yra geresnių sprendimų. Vienas įprastas būdas yra naudoti teksto rengyklę, pvz emacs arba energija, kuriame atidaromi du terminalo seansai, vienas naudojamas ns-3 kurti, o antrasis naudojamas šaltinio kodui redaguoti. Jei tik turi tarbal, tada aplinkos kintamasis gali padėti:
$ export NS3DIR="$PWD"
$ function waff { cd $NS3DIR && ./waf $* ; }
$ cd scratch
$ waff build
Modulio kataloge gali kilti pagunda pridėti trivialų waf scenarijų exec ../../waf
. Prašau, nedaryk to. Tai glumina naujokus ir, jei tai daroma blogai, gali atsirasti sunkiai aptinkamų kūrimo klaidų. Aukščiau pateikti sprendimai yra kelias, kurį reikia naudoti.
3.5 Testavimas ns-3
Galite paleisti ns-3 platinimo vienetų testus paleisdami scenarijų ./test.py:
$ ./test.py
Šie bandymai atliekami lygiagrečiai su Waf. Galų gale turėtumėte pamatyti pranešimą, kuriame sakoma:
92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)
Tai svarbus pranešimas, skirtas identifikuoti valgrindo gedimus, gedimus ar klaidas, nurodantis kodo problemas arba įrankių ir kodo nesuderinamumą.
Taip pat pamatysite galutinį išvestį iš Waf ir kiekvieną testą atliekantis testeris, kuris atrodys maždaug taip:
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)
Šią komandą paprastai vykdo vartotojai, norėdami greitai patikrinti, ar ns-3 paskirstymas sukurtas tinkamai. (Atkreipkite dėmesį, kad „PASS: ...“ eilučių tvarka gali skirtis, tai yra normalu. Svarbu tai, kad suvestinės eilutė ataskaitos pabaigoje rodo, kad visi testai buvo išlaikyti; nė vienas testas nepavyko ar sudužo.) Ir WafIr test.py lygiagretus darbas per turimus įrenginio procesoriaus branduolius.
3.6 Scenarijaus vykdymas
Paprastai vykdome kontroliuojamus scenarijus Waf. Tai leidžia kūrimo sistemai užtikrinti, kad bendrinamos bibliotekos keliai būtų nustatyti teisingai ir kad bibliotekos būtų pasiekiamos vykdymo metu. Norėdami paleisti programą, tiesiog naudokite Waf su parametru - -run
. Paleiskite visur esančios programos ns-3 atitikmenį hello worldįvesdami šiuos žodžius:
$ ./waf --run hello-simulator
„Waf“ pirmiausia patikrins, ar programa sukurta teisingai, ir prireikus sukurs. Tada Waf vykdys programą, kuri sukuria tokią išvestį.
Hello Simulator
Sveikiname! Dabar esate ns-3 vartotojas!
Ką daryti, jei nematau rezultatų?
Jei matote pranešimus Wafnurodant, kad kūrimas sėkmingai baigtas, bet nematote išvesties „Sveikas simuliatorius“, tada yra tikimybė, kad skiltyje [Build-with-Waf] perjungėte kūrimo režimą į optimizuotas, bet nepavyko perjungti atgal į režimą derinti. Visoje konsolės išvestyje, naudojamoje šioje pamokoje, naudojamas specialus ns-3 komponentas, kuris atlieka registravimą ir yra naudojamas pasirinktiniams pranešimams spausdinti į konsolę. Kompiliuojant optimizuotą kodą šio komponento išvestis automatiškai išjungiama – jis „optimizuojamas“. Jei nematote išvesties „Hello Simulator“, įveskite:
$ ./waf configure --build-profile=debug --enable-examples --enable-tests
pritaikyti Waf sukurti ns-3 programų derinimo versijas, kuriose yra pavyzdžių ir testų. Tada turėtumėte iš naujo sukurti dabartinę kodo derinimo versiją įvesdami
$ ./waf
Dabar, jei paleisite programą labas - simuliatorius, turėtumėte pamatyti laukiamą rezultatą.
3.6.1 Komandinės eilutės argumentai
Norėdami perduoti komandinės eilutės argumentus ns-3 programai, naudokite šį šabloną:
$ ./waf --run <ns3-program> --command-template="%s <args>"
Pakeiskite į savo programos pavadinimą ir argumentus. Argumentas - -command-template
už Waf iš esmės yra tikrosios komandinės eilutės kūrimo receptas Waf naudojamas programai vykdyti. Waf patikrina, ar kūrimas baigtas, nustato bendrinamos bibliotekos kelius, tada naudoja pateiktą komandų eilutės šabloną ir pakeičia programos pavadinimą %s vietos rezervuare, kad iškviestų vykdomąjį failą. Jei ši sintaksė jums atrodo sudėtinga, yra paprastesnė versija, apimanti ns-3 programą ir jos argumentus, įdėtus į kabutes:
$ ./waf --run '<ns3-program> --arg1=value1 --arg2=value2 ...'
Kitas ypač naudingas pavyzdys yra pasirinktinis bandymų rinkinių paleidimas. Tarkime, kad yra bandymų rinkinys, vadinamas mytest (iš tikrųjų jo nėra). Aukščiau mes naudojome scenarijų ./test.py, kad lygiagrečiai vykdytume daugybę testų, kurie pakartotinai iškviečia testavimo programą bandomasis bėgikas. Skambinti bandomasis bėgikas tiesiogiai atlikti vieną testą:
$ ./waf --run test-runner --command-template="%s --suite=mytest --verbose"
Argumentai bus perduoti programai bandomasis bėgikas. Kadangi mytest neegzistuoja, bus sugeneruotas klaidos pranešimas. Norėdami atspausdinti galimas bandomojo vykdytojo parinktis, įveskite:
$ ./waf --run test-runner --command-template="%s --help"
3.6.2 Derinimas
Norėdami paleisti ns-3 programas naudodami kitą programą, pvz., derintuvą (pvz., gdb) arba atminties tikrinimo įrankį (pvz., valgrind), naudokite panašią formą - -command-template = "…"
. Pavyzdžiui, paleisti derinimo priemonę gdb jūsų hello-simulator ns-3 programa su argumentais:
$ ./waf --run=hello-simulator --command-template="gdb %s --args <args>"
Atminkite, kad ns-3 programos pavadinimas pateikiamas kartu su argumentu - -run
ir valdymo įrankis (čia gdb) yra pirmasis argumento ženklas - -command-template
. Variantas - -args
ataskaitos gdbkad likusi komandų eilutės dalis priklauso „žemesnei“ programai. (Kai kurios versijos gdb nesuprantu varianto - -args
. Tokiu atveju pašalinkite programos argumentus iš - -command-template
ir naudokite komandų rinkinį gdb argumentuoja.) Galime derinti šį ir ankstesnį receptą, kad paleistume testą naudodami derintuvą:
$ ./waf --run test-runner --command-template="gdb %s --args --suite=mytest --verbose"
3.6.3 Darbinis katalogas
Waf turėtų būti paleistas iš jo vietos ns-3 medžio viršūnėje. Šis aplankas tampa darbo katalogu, kuriame bus rašomi išvesties failai. Bet ką daryti, jei norite, kad šie failai būtų už ns-3 šaltinio medžio? Naudokite argumentą - -cwd
:
$ ./waf --cwd=...
Jums gali būti patogiau gauti išvesties failus į savo darbo katalogą. Tokiu atveju gali padėti šie netiesioginiai veiksmai:
$ function waff {
CWD="$PWD"
cd $NS3DIR >/dev/null
./waf --cwd="$CWD" $*
cd - >/dev/null
}
Šis ankstesnės komandos versijos papuošimas išsaugo dabartinį darbo katalogą, eina į katalogą Wafo paskui liepia Waf Norėdami pakeisti darbo katalogą atgal į dabartinį darbo katalogą, išsaugotą prieš paleisdami programą. Mes minime komandą - -cwd
Siekiant išsamumo, dauguma vartotojų tiesiog paleidžia Waf iš aukščiausio lygio katalogo ir ten generuoja išvesties failus.
Šaltinis: www.habr.com