ns-3 tinklo simuliatoriaus pamoka. 3 skyrius

ns-3 tinklo simuliatoriaus pamoka. 3 skyrius
1,2 skyrius

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: https://www.nsnam.org/wiki/Installation.

Š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ę: https://www.nsnam.org, nes ten daug informacijos. Pradedant nuo naujausios ns-3 versijos (ns-3.29), norint paleisti ns-3, reikalingi šie įrankiai:

Į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 https://gitlab.com/nsnam/. Grupė nsnam sujungia įvairias saugyklas, naudojamas atvirojo kodo projekte.

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:

  1. ns-3.29: modulis, atitinkantis laidą; jis atsisiųs komponentus, panašius į išleidimą tarball;

  2. ns-3-dev: panašus modulis, bet naudojant kodą iš kūrimo medžio;

  3. ns-alinonas-3.29: modulis, kuriame yra kitų papildomų funkcijų, pvz., paspaudimų maršruto parinkimas ir tinklo modeliavimo laikiklis, „Openflow“, skirta ns-3.

  4. 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:https://gitlab.com/nsnam/ns-3-dev.git.

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:https://www.nsnam.org/releases/ ir spustelėdami naujausios versijos nuorodą. Šiame pavyzdyje tęsime ns-3.29.

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

ns-3 tinklo simuliatoriaus pamoka. 3 skyrius

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

Tęsinys: 4 skyrius

Šaltinis: www.habr.com

Добавить комментарий