3 Komme i gang
3.1 Oversikt
3.2 Forutsetninger
3.2.1 Laste ned ns-3-utgivelsen som et kildearkiv
3.3 Laste ned ns-3 med Git
3.3.1 Laste ns-3 med Bake
3.4 Montering ns-3
3.4.1 Bygg med build.py
3.4.2 Bygging med bake
3.4.3 Bygg med Waf
3.5 Testing ns-3
3.6 Kjøre skriptet
3.6.1 Kommandolinjeargumenter
3.6.2 Feilsøking
3.6.3 Arbeidskatalog
Kapittel 3
Starter
Dette kapittelet er ment å forberede leseren til å begynne med en datamaskin som kanskje aldri har installert ns-3. Den dekker støttede plattformer, forutsetninger, hvordan du får tak i ns-3, hvordan du bygger ns-3, og hvordan du tester byggingen og kjører enkle programmer.
3.1 Oversikt
ns-3-simulatoren er bygget som et system av samarbeidende programvarebiblioteker. Under montering er koden til brukerprogrammer knyttet til disse bibliotekene. Programmeringsspråkene C++ eller Python brukes til å skrive tilpassede programmer.
Ns-3 distribueres som kildekode, noe som betyr at målsystemet må ha et programvareutviklingsmiljø for først å bygge bibliotekene og deretter bygge brukerprogrammet. I prinsippet vil ns-3 kunne distribueres som ferdige biblioteker for et bestemt system, og i fremtiden kan de distribueres på denne måten. Men i dag gjør mange brukere faktisk arbeidet sitt ved å redigere selve ns-3, så det er nyttig å ha kildekoden for å bygge bibliotekene. Hvis noen har lyst til å ta på seg arbeidet med å lage ferdige biblioteker og pakker for operativsystemer, ta kontakt med mailinglisten ns-utviklere.
Deretter skal vi se på tre måter å laste ned og bygge ns-3 på. Den første er å laste ned og bygge den offisielle utgivelsen fra hovedsiden. Den andre er valg og montering av kopier av utviklingsversjoner av den grunnleggende ns-3-installasjonen. Den tredje er å bruke ekstra byggeverktøy for å laste inn flere utvidelser for ns-3. Vi vil gå gjennom hver enkelt siden verktøyene er litt forskjellige.
Erfarne Linux-brukere lurer kanskje på hvorfor ns-3 ikke leveres som en pakke som de fleste andre biblioteker som bruker en pakkebehandling? Selv om det finnes binære pakker for ulike Linux-distribusjoner (f.eks. Debian), ender de fleste brukere opp med å redigere bibliotekene og må gjenoppbygge ns-3 selv, så det er praktisk å ha kildekoden tilgjengelig. Av denne grunn vil vi fokusere på å installere fra kilden.
For de fleste applikasjoner ns-3-rettigheter root ikke er nødvendig, anbefales det å bruke en uprivilegert brukerkonto.
3.2 Forutsetninger
Hele settet med tilgjengelige ns-3 biblioteker har en rekke avhengigheter av tredjeparts biblioteker, men for det meste kan ns-3 bygges og brukes med støtte for flere vanlige (ofte installert som standard) komponenter: en C++ kompilator, Python, en kildekoderedigerer (f.eks. vim, emacs eller Eclipse) og, hvis utviklingsrepositorier brukes, Git versjonskontrollsystemer. De fleste førstegangsbrukere trenger ikke å bekymre seg hvis konfigurasjonen deres rapporterer at noen ns-3 avanserte funksjoner mangler, men for de som ønsker en full installasjon, gir prosjektet en wiki som inneholder sider med mange nyttige tips og triks. En slik side er Installasjonssiden, med installasjonsinstruksjoner for ulike systemer, tilgjengelig på:
Forutsetningsdelen av denne wikien forklarer hvilke pakker som kreves for å støtte vanlige ns-3-alternativer, og gir også kommandoene som brukes til å installere dem på vanlige varianter av Linux eller macOS.
Du kan benytte deg av denne muligheten til å utforske ns-3 wiki-siden eller hovednettstedet:
Verktøypakke/versjon
- C++ kompilator
clang++ eller g++ (g++ versjon 4.9 eller høyere) - Python
python2 versjon >= 2.7.10, eller python3 versjon >=3.4 - gå
enhver nyeste versjon (for å få tilgang til ns-3 på GitLab.com) - tjære
enhver nyeste versjon (for utpakking av ns-3-utgivelsen) - bunzip2
enhver nyeste versjon (for utpakking av ns-3-versjonen)
For å sjekke standardversjonen av Python, skriv python -V
. For å sjekke g++-versjonen, skriv g++ -v
. Hvis noen verktøy mangler eller er for gamle, vennligst se installasjonsveiledningen på ns-3 wiki-siden.
Fra nå av antar vi at leseren kjører Linux, MacOS eller en Linux-emulator, og har minst verktøyene ovenfor.
3.2.1 Laste ned ns-3-utgivelsen som et kildearkiv
Dette er handlingsforløpet for en ny bruker som ønsker å laste ned og eksperimentere med den nyeste utgivelsen og pakkeversjonene av ns-3. ns-3-utgivelser publiseres som komprimerte kildearkiver, noen ganger kalt tarball. tarball er et spesielt programvarearkivformat der flere filer er kombinert sammen. Arkivet er vanligvis komprimert. ns-3 oppstartsprosess via tarball er enkelt, du trenger bare å velge en utgivelse, laste ned og pakke den ut.
La oss anta at du som bruker ønsker å bygge ns-3 i en lokal katalog kalt arbeidsområdet. Du kan få en arbeidskopi av utgivelsen ved å skrive inn følgende i Linux-konsollen (erstatte de riktige versjonsnumrene, selvfølgelig)
$ 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
Vær oppmerksom på verktøyet som brukes ovenfor wget, som er et kommandolinjeverktøy for nedlasting av objekter fra Internett. Hvis du ikke har installert det, kan du bruke nettleseren til dette.
Ved å følge disse trinnene vil du ta deg til ns-allinone-3.29-katalogen, der skal du se flere filer og kataloger
$ 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
Du er nå klar til å bygge ns-3 basisdistribusjonen og kan gå videre til delen om bygning ns-3.
3.3 Laste ned ns-3 med Git
ns-3-koden er tilgjengelig i Git-repositoriene på GitLab.com på
Den enkleste måten å begynne å bruke Git-depoter på er å dele eller klone miljøet ns-3-allinon. Dette er et sett med skript som styrer lasting og montering av de mest brukte ns-3-undersystemene. Hvis du er ny på Git, kan begrepene "gaffel" og "klone" være ukjente for deg; i så fall anbefaler vi at du ganske enkelt kloner (lag din egen kopi) depotet som ligger på GitLab.com slik:
$ cd
$ mkdir workspace
$ cd workspace
$ git clone https://gitlab.com/nsnam/ns-3-allinone.git
$ cd ns-3-allinone
På dette stadiet, visningen av katalogen din ns-3-allinon litt forskjellig fra utgivelsesarkivkatalogen beskrevet ovenfor. Det skal se omtrent slik ut:
$ ls
build.py constants.py download.py README util.py
Vær oppmerksom på at det er et skript download.py, som i tillegg vil trekke ut ns-3 og tilhørende kildekode. Her har du et valg: enten last ned det nyeste ns-3 utviklingsbildet:
$ python download.py
eller foretrekker ns-3-utgivelsen med flagget -n
for å angi utgivelsesnummeret:
$ python download.py -n ns-3.29
Etter dette trinnet til katalogen ns-3-allinon ytterligere depoter vil bli lastet ned ns-3, bake, pybindgen и netanim.
Note
På en maskin med ren Ubuntu16.04 trengte jeg å endre kommandoen til dette: $ sudo python3 download.py -n ns-3.29
(heretter oversetterens notater).
3.3.1 Laste ns-3 med Bake
De to ovennevnte metodene (kildearkiv eller depot ns-3-allinon via Git) er nyttige for å få den enkleste ns-3-installasjonen med flere tillegg(pybindgen å generere Python-bindinger og netanim for nettverksanimasjon). Det tredje depotet som leveres som standard i ns-3-allinone kalles bake.
Varsel er et verktøy for koordinert bygging av programvare fra flere depoter, utviklet for ns-3-prosjektet. Varsel kan brukes til å skaffe utviklingsversjoner av ns-3, samt til å laste ned og bygge utvidelser av basisversjonen av ns-3-distribusjonen, for eksempel miljøet Direkte kodeutførelse, CradleNetwork Simulation Cradle, muligheten til å lage nye Python-bindinger og forskjellige ns-3 "apper".
Note
CradleNetwork Simulation Cradle er et rammeverk som lar deg bruke ekte TCP/IP-nettverksstabler inne i en nettverkssimulator.
Hvis du forventer at ns-3-installasjonen din har avanserte eller tilleggsfunksjoner, kan du følge denne installasjonsveien.
I de siste ns-3-utgivelsene Varsel ble lagt til tjærefrigjøringen. Utgivelsen inkluderer en konfigurasjonsfil som lar deg laste ned gjeldende programvareversjoner på utgivelsestidspunktet. Det er for eksempel versjonen Varsel, som er distribuert med utgivelse ns-3.29, kan brukes til å hente komponenter for den utgivelsen av ns-3 eller tidligere, men kan ikke brukes til å hente komponenter for senere utgivelser (hvis pakkebeskrivelsesfilen bakeconf.xml ikke oppdatert).
Du kan også få det siste eksemplaret bakeved å skrive inn følgende kommando i Linux-konsollen (forutsatt at du har Git installert):
$ cd
$ mkdir workspace
$ cd workspace
$ git clone https://gitlab.com/nsnam/bake.git
Når du kjører git-kommandoen, bør du se noe sånt som følgende:
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.
Etter at kommandoen er fullført klone du bør ha en katalog som heter bake, hvis innhold skal se omtrent slik ut:
$ cd bake
$ ls
bake bakeconf.xml bake.py doc examples generate-binary.py test TODO
Merk at du har lastet inn flere Python-skript, en Python-modul kalt bake og en XML-konfigurasjonsfil. Det neste trinnet er å bruke disse skriptene til å laste ned og bygge ns-3-distribusjonen du ønsker. Flere tilpasningsmål er tilgjengelige:
-
ns-3.29: modul som tilsvarer utgivelsen; den vil laste ned komponenter som ligner på utgivelsen i tarballen;
-
ns-3-dev: en lignende modul, men bruker kode fra utviklingstreet;
-
ns-allinone-3.29: En modul som inkluderer andre tilleggsfunksjoner som klikkruting og Network Simulation Cradle, Openflow for ns-3.
-
ns-3-allinon: ligner på utgivelsesversjonen av modulen alt i et, men for utviklingskode.
Note
Klikk — modulær programvarearkitektur for å lage rutere.
Openflow er en protokoll for å administrere prosessen med å behandle data som overføres over et datanettverk av rutere og svitsjer, og implementere programvaredefinert nettverksteknologi.
Det nåværende øyeblikksbildet av utviklingen (ikke-utgitt) ns-3 kan finnes på:
Utviklerne prøver å holde disse depotene i en konsekvent fungerende stand, men de er i utviklingsområdet og inneholder uutgitt kode, så hvis du ikke planlegger å bruke nye funksjoner, velg den offisielle utgivelsen.
Du kan finne den nyeste versjonen av koden ved å bla gjennom listen over depoter, eller ved å gå til ns-3 Releases-nettsiden:
Nå, for å få ns-3-komponentene vi trenger, bruker vi verktøyet Varsel. La oss si noen innledende ord om arbeidet Varsel.
Bake fungerer ved å laste inn pakkekilder i en katalog kilde og installere bibliotekene i byggekatalogen. Varsel kan kjøres ved å referere til binæren, men hvis du vil kjøre Varsel ikke fra katalogen der den ble lastet ned, er det tilrådelig å legge til banen til bake til banen din (PATH miljøvariabel), for eksempel som følger (eksempel for Linux bash shell). Gå til "bake"-katalogen og still inn følgende miljøvariabler:
$ export BAKE_HOME=`pwd`
$ export PATH=$PATH:$BAKE_HOME:$BAKE_HOME/build/bin
$ export PYTHONPATH=$PYTHONPATH:$BAKE_HOME:$BAKE_HOME/build/lib
Dette vil plassere programmet bake.py til skallbanen og vil tillate andre programmer å finne de kjørbare filene og bibliotekene den opprettet bake. I noen brukstilfeller bake, PATH og PYTHONPATH-innstillingen beskrevet ovenfor er ikke nødvendig, men en komplett oppbygging av ns-3-allinone (med tilleggspakker) krever det vanligvis.
Gå til arbeidskatalogen din og skriv inn følgende i konsollen:
$ ./bake.py configure -e ns-3.29
Neste vil vi spørre Varsel sjekke om vi har nok verktøy til å laste de ulike komponentene. Slå:
$ ./bake.py check
Du bør se noe sånt som følgende:
> 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 ...
Spesielt er opplastingsverktøy som Mercurial, CVS, Git og Bazaar essensielle i dette trinnet da de lar oss få koden. På dette tidspunktet installerer du de manglende verktøyene på vanlig måte for systemet ditt (hvis du vet hvordan) eller kontakt systemadministratoren for å få hjelp.
Prøv deretter å laste ned programvaren:
$ ./bake.py download
resultatet bør være noe sånt som:
>> 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
Dette vil bety at tre kilder er lastet ned. Gå nå til kildekatalogen og skriv ls; Du bør se:
$ cd source
$ ls
netanim-3.108 ns-3.29 pybindgen
Nå er du klar til å bygge ns-3-distribusjonen.
3.4 Montering ns-3
Som med nedlasting av ns-3, er det flere måter å bygge ns-3 på. Det viktigste vi vil understreke er at ns-3 er bygget ved hjelp av et byggeverktøy kalt wafbeskrevet nedenfor. De fleste brukere vil jobbe med waf, men det er noen få nyttige skript som hjelper deg med å komme i gang eller organisere mer komplekse bygg. Så vær så snill, før du leser om waf, se på build.py og montering med bake.
3.4.1 Bygg med build.py
Advarsel! Dette byggetrinnet er kun tilgjengelig fra kildearkivversjonen hentet som beskrevet ovenfor; og ikke lastet ned via git eller bake.
Når du arbeider med et utgivelsesarkiv tarballI ns-3-allinon Det er et hendig skript som kan gjøre det enklere å sette sammen komponentene. Det heter build.py. Dette programmet vil sette opp prosjektet for deg på den mest nyttige måten. Vær imidlertid oppmerksom på at mer avansert oppsett og arbeid med ns-3 vanligvis innebærer bruk av ns-3s eget byggesystem, Waf, som vil bli introdusert senere i denne opplæringen.
Hvis du lastet ned ved hjelp av tarball, deretter i katalogen din ~/arbeidsområde en katalog med et navn noe sånt som ns-allinone-3.29. Skriv inn følgende:
$ ./build.py --enable-examples --enable-tests
Når du ringer build.py Vi brukte kommandolinjeargumenter for å bygge eksemplene og testene som ble brukt i denne opplæringen, som ikke er bygget som standard i ns-3. Som standard bygger programmet også alle tilgjengelige moduler. Deretter kan du, hvis du ønsker det, bygge ns-3 uten eksempler og tester, eller ekskludere moduler som ikke er nødvendige for arbeidet ditt.
Du vil se mange kompilatorutdatameldinger som vises av skriptet når det bygger de forskjellige delene du har lastet. Først vil manuset prøve å bygge animatøren netanim, deretter bindingsgeneratoren pybindgen og til slutt ns-3. Når prosessen er fullført, bør du se følgende:
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
I de tre siste linjene i listen ser vi en melding om moduler som ikke ble bygget:
Modules not built (see ns-3 tutorial for explanation):
brite click
Dette betyr ganske enkelt at noen ns-3-moduler som er avhengige av eksterne biblioteker kanskje ikke er bygget, eller at de ikke er pålagt å bygges for denne konfigurasjonen. Dette betyr ikke at simulatoren ikke er satt sammen eller at de sammensatte modulene ikke vil fungere riktig.
3.4.2 Bygging med bake
Hvis du brukte bake ovenfor for å hente kildekode fra prosjektlagrene, kan du fortsette å bruke den til å bygge ns-3. Slå:
$ ./bake.py build
og du bør se noe sånt som:
>> Building pybindgen-0.19.0.post4+ng823d8b2 - OK
>> Building netanim-3.108 - OK
>> Building ns-3.29 - OK
hjelpe: Du kan også gjøre både nedlastings- og byggetrinnene samtidig ved å ringe "bake.py deploy".
Montering av alle komponenter kan mislykkes, men monteringen vil fortsette hvis en komponent ikke er nødvendig. For eksempel var det et nylig portabilitetsproblem castxml kan settes sammen med verktøy bake ikke på alle plattformer. I dette tilfellet vil en melding som denne vises:
>> 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.
Men castxml bare nødvendig hvis du vil lage oppdaterte Python-bindinger. For de fleste brukere er det ikke behov for dette (i hvert fall før de endrer ns-3), så slike advarsler kan trygt ignoreres foreløpig.
Hvis det mislykkes, vil følgende kommando gi deg et hint om manglende avhengigheter:
$ ./bake.py show
De ulike avhengighetene til pakkene du prøver å bygge vil bli listet opp.
3.4.3 Bygg med Waf
Fram til dette punktet, for å begynne å bygge ns-3, brukte vi enten skriptet build.py, eller verktøy bake. Disse verktøyene er nyttige for å bygge ns-3 og vedlikeholde biblioteker. Faktisk kjører de byggeverktøyet for å bygge waf fra katalogen ns-3. waf installert med ns-3 kildekoden. De fleste brukere går raskt over til direkte bruk for å konfigurere og sette sammen ns-3 waf. Så for å fortsette, gå til ns-3-katalogen som du opprinnelig opprettet.
Dette er ikke strengt nødvendig for øyeblikket, men det vil være nyttig å gå tilbake litt og se hvordan du gjør endringer i prosjektkonfigurasjonen. Sannsynligvis den mest nyttige konfigurasjonsendringen du kan gjøre er å lage en optimalisert versjon av koden. Som standard har du konfigurert prosjektet til å bygge en feilsøkingsversjon. La oss ta en titt på et prosjekt for å lage en optimalisert konstruksjon. For å forklare til Waf at det bør lage optimaliserte bygg som inkluderer eksempler og tester, må du kjøre følgende kommandoer:
$ ./waf clean
$ ./waf configure --build-profile=optimized --enable-examples --enable-tests
Dette vil starte waf utenfor den lokale katalogen (for enkelhets skyld). Den første kommandoen rydder opp fra forrige bygg, dette er vanligvis ikke strengt nødvendig, men det er god praksis (se også byggeprofiler nedenfor); dette vil slette tidligere opprettede biblioteker og objektfiler som ligger i katalogen bygge/. Når prosjektet er rekonfigurert og byggesystemet sjekker de ulike avhengighetene, bør du se utdata som ligner på følgende:
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)
Vær oppmerksom på den siste delen av oppføringen ovenfor. Noen ns-3-alternativer er ikke aktivert som standard eller krever systemstøtte for å fungere skikkelig. For eksempel, for å aktivere XmlTo, må biblioteket være tilstede på systemet libxml-2.0. Hvis dette biblioteket ikke ble funnet og den tilsvarende ns-3-funksjonen ikke var aktivert, vil en melding vises. Merk også at det er mulig å bruke kommandoen sudo for å sette suid-biten "sett gruppe-ID ved kjøretid" for visse programmer. Den er ikke aktivert som standard, og derfor vises denne funksjonen som "ikke aktivert". Til slutt, for å få en liste over aktiverte alternativer, bruk waf med parameter --check-config
.
La oss nå gå tilbake og bytte tilbake til feilsøkingsbygget som inneholder eksempler og tester.
$ ./waf clean
$ ./waf configure --build-profile=debug --enable-examples --enable-tests
Byggesystemet er nå satt opp, og du kan bygge feilsøkingsversjoner av ns-3-programmer ved ganske enkelt å skrive:
$ ./waf
Trinnene ovenfor kan ha tvunget deg til å bygge en del av ns-3-systemet to ganger, men nå vet du hvordan du endrer konfigurasjonen og bygger optimalisert kode.
For å sjekke hvilken profil som er aktiv for en gitt prosjektkonfigurasjon, er det en kommando:
$ ./waf --check-profile
Waf: Entering directory `/path/to/ns-3-allinone/ns-3.29/build'
Build profile: debug
Scenarioet ovenfor build.py støtter også argumenter --enable-examples
и --enable-tests
, men andre alternativer waf den støtter ikke direkte. Dette vil for eksempel ikke fungere:
$ ./build.py --disable-python
reaksjonen vil være slik:
build.py: error: no such option: --disable-python
Den spesielle operatøren - - kan imidlertid brukes til å sende ytterligere parametere via WAFså i stedet for ovennevnte vil følgende kommando fungere:
$ ./build.py -- --disable-python
fordi den genererer hovedkommandoen ./waf configure --disable-python. Her er noen flere innledende tips om waf.
Håndtering av byggefeil
ns-3-utgivelser er testet på de nyeste C++-kompilatorene som er tilgjengelige på utgivelsestidspunktet på vanlige Linux- og MacOS-distribusjoner. Over tid blir imidlertid nye distribusjoner utgitt med nye kompilatorer, og disse nyere kompilatorene har en tendens til å være mer pedantiske når det gjelder advarsler. ns-3 konfigurerer bygget til å behandle alle advarsler som feil, så noen ganger hvis du kjører en eldre versjon på et nyere system, kan en kompilatoradvarsel stoppe byggingen.
For eksempel var det tidligere en utgivelse av ns-3.28 for Fedora 28, som inkluderte en ny hovedversjon gcc (gcc-8). Ved å bygge utgivelsen ns-3.28 eller tidligere versjoner under Fedora 28, med Gtk2+ installert, vil følgende feil oppstå:
/usr/include/gtk-2.0/gtk/gtkfilechooserbutton.h:59:8: error: unnecessary parentheses ,!in declaration of ‘__gtk_reserved1’ [-Werror=parentheses] void (*__gtk_reserved1);
I utgivelser som starter fra ns-3.28.1, i waf et alternativ er tilgjengelig for å løse disse problemene. Den deaktiverer innstilling av "-Werror"-flagget i g++ og clang++. Dette er alternativet "--disable-werror" og må brukes under konfigurasjonen:
$ ./waf configure --disable-werror --enable-examples --enable-tests
Konfigurer eller sett sammen
Noen kommandoer waf har mening kun i konfigurasjonsfasen, og noen er kun gyldige i byggefasen. Hvis du for eksempel vil bruke ns-3-emuleringsfunksjonene, kan du aktivere bitinnstillingen suid ved hjelp av sudo, som beskrevet ovenfor. Dette vil overstyre kommandoene for konfigurasjonstrinn, og dermed kan du endre konfigurasjonen ved å bruke følgende kommando, som også inkluderer eksempler og tester.
$ ./waf configure --enable-sudo --enable-examples --enable-tests
Hvis du gjør dette waf vil starte sudofor å endre programmer for opprettelse av emuleringskodesocket til å kjøre med tillatelser root. I waf Det er mange andre alternativer tilgjengelig for konfigurasjons- og byggetrinnene. For å utforske alternativene dine, skriv inn:
$ ./waf --help
I neste avsnitt vil vi bruke noen testrelaterte alternativer.
Monteringsprofiler
Vi har allerede sett hvordan du kan konfigurere waf for forsamlinger feilsøke и optimalisert:
$ ./waf --build-profile=debug
Det er også en mellomliggende monteringsprofil, slipp. Alternativ -d
er synonymt med --build-profile
. Byggprofilen kontrollerer bruken av brytere for logging, påstander og kompilatoroptimalisering:
Som du kan se, er logging og påstander bare tilgjengelig i feilsøkingsbygg. Den anbefalte praksisen er å utvikle skriptet i feilsøkingsmodus, og deretter utføre gjentatte kjøringer (for statistikk eller parameterendringer) i en optimalisert byggeprofil.
Hvis du har kode som bare skal kjøres i visse byggeprofiler, bruk kodebrytermakroen:
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;)
Misligholde, waf plasserer byggeartefakter i byggekatalogen. Du kan spesifisere en annen utdatakatalog ved å bruke alternativet - -out
, for eksempel:
$ ./waf configure --out=my-build-dir
Ved å kombinere dette med byggeprofiler kan du enkelt bytte mellom ulike kompileringsalternativer:
$ ./waf configure --build-profile=debug --out=build/debug
$ ./waf build
...
$ ./waf configure --build-profile=optimized --out=build/optimized
$ ./waf build
...
Som lar deg jobbe med flere sammenstillinger uten å måtte skrive om den siste sammenstillingen hver gang. Når du bytter til en annen profil, waf vil kompilere bare det, uten å fullstendig rekompilere alt.
Når du bytter byggeprofiler på denne måten, må du være forsiktig med å gi de samme konfigurasjonsalternativene hver gang. Å definere flere miljøvariabler vil hjelpe deg å unngå feil:
$ 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
Kompilatorer og flagg
I eksemplene ovenfor waf å bygge ns-3 bruker C++ kompilatoren fra GCC ( g ++). Du kan imidlertid endre den du bruker waf C++ kompilator, ved å definere CXX miljøvariabelen. For eksempel, for å bruke C++-kompilatoren Clang, clang++,
$ CXX="clang++" ./waf configure
$ ./waf build
På samme måte kan du konfigurere waf å bruke distribuert kompilering ved hjelp av distcc:
$ CXX="distcc g++" ./waf configure
$ ./waf build
Mer informasjon om distcc og distribuert kompilering finner du på prosjektsiden i dokumentasjonsdelen. For å legge til kompilatorflagg når du konfigurerer ns-3, bruk miljøvariabelen CXXFLAGS_EXTRA.
Installasjon
waf kan brukes til å installere biblioteker på forskjellige steder på systemet. Som standard er de kompilerte bibliotekene og kjørbare filene plassert i katalogen bygge, og siden Waf kjenner plasseringen til disse bibliotekene og kjørbare filene, er det ikke nødvendig å installere bibliotekene noe annet sted.
Hvis brukere foretrekker å installere utenfor byggekatalogen, kan de kjøre kommandoen ./waf installasjon. Standard prefiks for installasjon er / Usr / localSå ./waf installasjon vil installere programmer i / Usr / local / bin, biblioteker i / Usr / local / lib og header-filer i /usr/local/include. Superbrukerrettigheter må vanligvis settes med et standard prefiks, så en typisk kommando vil være det sudo ./waf installer. Ved lansering vil Waf først velge å bruke de delte bibliotekene i byggekatalogen, og deretter se etter biblioteker langs stien til bibliotekene som er konfigurert i det lokale miljøet. Så når du installerer biblioteker på et system, er det en god praksis å sjekke at de riktige bibliotekene blir brukt. Brukere kan velge å installere med et annet prefiks ved å overføre alternativet under konfigurasjonen --prefix
, for eksempel:
./waf configure --prefix=/opt/local
Hvis brukeren senere, etter byggingen, skriver inn installasjonskommandoen ./waf
, vil prefikset bli brukt / opt / lokal.
Lag ./waf clean
må brukes før du rekonfigurerer prosjektet hvis installasjonen vil bruke waf under et annet prefiks.
For å bruke ns-3 er det derfor ikke nødvendig å ringe ./waf install
. De fleste brukere trenger ikke denne kommandoen fordi waf henter de gjeldende bibliotekene fra build-katalogen, men noen brukere kan finne dette nyttig hvis aktivitetene deres involverer arbeid med programmer utenfor ns-3-katalogen.
Waf singel
På toppnivået i ns-3 kildetreet er det bare ett Waf-skript. Når du begynner å jobbe, vil du bruke mye tid i katalogen scratch/
eller dypere innsrc/...
og samtidig må løpe waf. Du kan bare huske hvor du er og løpe waf som følger:
$ ../../../waf ...
men dette vil være kjedelig og feilutsatt, så det finnes bedre løsninger. En vanlig måte er å bruke et tekstredigeringsprogram som f.eks emacs eller vim, der to terminalsesjoner åpnes, den ene brukes til å bygge ns-3, og den andre brukes til å redigere kildekoden. Hvis du bare har tarball, så kan en miljøvariabel hjelpe:
$ export NS3DIR="$PWD"
$ function waff { cd $NS3DIR && ./waf $* ; }
$ cd scratch
$ waff build
I modulkatalogen kan det være fristende å legge til et trivielt waf-skript som exec ../../waf
. Ikke gjør det er du snill. Dette er forvirrende for nybegynnere, og når det gjøres dårlig, fører det til byggefeil som er vanskelig å oppdage. Løsningene vist ovenfor er banen som bør brukes.
3.5 Testing ns-3
Du kan kjøre ns-3-distribusjonens enhetstester ved å kjøre skriptet ./test.py:
$ ./test.py
Disse testene kjøres parallelt med waf. Til slutt bør du se en melding som sier:
92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)
Dette er en viktig melding for å identifisere valgrind-krasj, krasj eller feil, som indikerer problemer med koden eller inkompatibilitet mellom verktøy og kode.
Du vil også se den endelige utgangen fra waf og en tester som kjører hver test, som vil se omtrent slik ut:
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)
Denne kommandoen kjøres vanligvis av brukere for raskt å bekrefte at ns-3-distribusjonen er riktig bygget. (Merk at rekkefølgen på "PASS: ..."-linjene kan være forskjellig, dette er normalt. Det som er viktig er at sammendragslinjen på slutten av rapporten viser at alle tester bestått; ingen tester mislyktes eller krasjet.) Og wafOg test.py vil parallellisere arbeidet på tvers av de tilgjengelige prosessorkjernene på maskinen.
3.6 Kjøre skriptet
Vi kjører vanligvis skript under kontroll waf. Dette gjør det mulig for byggesystemet å sikre at delte bibliotekstier er riktig angitt og at bibliotekene er tilgjengelige under kjøring. For å kjøre programmet, bruk ganske enkelt waf med parameter - -run
. La oss kjøre ns-3-ekvivalenten til det allestedsnærværende programmet hallo verdenved å skrive følgende:
$ ./waf --run hello-simulator
Waf vil først sjekke at programmet er riktig bygget og bygge om nødvendig. Deretter waf vil kjøre et program som produserer følgende utdata.
Hello Simulator
Gratulerer! Du er nå en ns-3 bruker!
Hva bør jeg gjøre hvis jeg ikke ser resultater?
Hvis du ser meldinger wafsom indikerer at byggingen ble fullført, men at du ikke ser utdataene "Hei Simulator", så er det en mulighet for at du byttet byggemodus til delen [Bygg-med-Waf] optimalisert, men savnet å bytte tilbake til modusen feilsøke. All konsollutdata som brukes i denne opplæringen bruker en spesiell ns-3-komponent som utfører logging og brukes til å skrive ut egendefinerte meldinger til konsollen. Utdata fra denne komponenten blir automatisk deaktivert når optimalisert kode kompileres - den er "optimalisert". Hvis du ikke ser "Hello Simulator"-utgangen, skriv inn følgende:
$ ./waf configure --build-profile=debug --enable-examples --enable-tests
å tilpasse waf å bygge feilsøkingsversjoner av ns-3-programmer, som inkluderer eksempler og tester. Du bør deretter gjenoppbygge den gjeldende feilsøkingsversjonen av koden ved å skrive
$ ./waf
Nå hvis du kjører programmet hei-simulator, bør du se det forventede resultatet.
3.6.1 Kommandolinjeargumenter
For å sende kommandolinjeargumenter til ns-3-programmet, bruk følgende mønster:
$ ./waf --run <ns3-program> --command-template="%s <args>"
Erstatte til navnet på programmet og til argumentene. Argument - -command-template
for waf er egentlig en oppskrift for å bygge selve kommandolinjen waf brukes til å kjøre programmet. Waf sjekker at byggingen er fullført, setter de delte bibliotekbanene, bruker deretter den medfølgende kommandolinjemalen og erstatter programnavnet med %s plassholderen for å kalle den kjørbare. Hvis du synes denne syntaksen er komplisert, er det en enklere versjon som involverer ns-3-programmet og dets argumenter omsluttet av enkle anførselstegn:
$ ./waf --run '<ns3-program> --arg1=value1 --arg2=value2 ...'
Et annet spesielt nyttig eksempel er å kjøre testsuiter selektivt. La oss anta at det er en testpakke kalt mytest (det er det faktisk ikke). Ovenfor brukte vi ./test.py-skriptet til å kjøre en rekke tester parallelt, som gjentatte ganger kaller testprogrammet testløper. Anrop testløper direkte for å kjøre én test:
$ ./waf --run test-runner --command-template="%s --suite=mytest --verbose"
Argumenter vil bli sendt til programmet testløper. Siden mytest ikke eksisterer, vil en feilmelding bli generert. For å skrive ut de tilgjengelige testløper-alternativene, skriv inn:
$ ./waf --run test-runner --command-template="%s --help"
3.6.2 Feilsøking
For å kjøre ns-3-programmer under et annet verktøy, for eksempel en debugger (f.eks. gdb) eller et minnetestverktøy (f.eks. valgrind), bruk en lignende form - -command-template = "…"
. For eksempel å kjøre i debuggeren gdb ditt hello-simulator ns-3-program med argumenter:
$ ./waf --run=hello-simulator --command-template="gdb %s --args <args>"
Merk at ns-3-programnavnet kommer med argumentet - -run
, og administrasjonsverktøyet (her gdb) er det første symbolet i argumentet - -command-template
. Alternativ - -args
rapporter gdbat resten av kommandolinjen tilhører det "nedre" programmet. (Noen versjoner gdb forstår ikke alternativet - -args
. I dette tilfellet fjerner du programargumentene fra - -command-template
og bruk kommandosettet gdb args.) Vi kan kombinere denne oppskriften og den forrige for å kjøre testen under feilsøkeren:
$ ./waf --run test-runner --command-template="gdb %s --args --suite=mytest --verbose"
3.6.3 Arbeidskatalog
Waf må skytes ut fra sin plassering på toppen av ns-3-treet. Denne mappen blir arbeidskatalogen der utdatafilene skal skrives. Men hva om du vil beholde disse filene utenfor ns-3-kildetreet? Bruk argument - -cwd
:
$ ./waf --cwd=...
Du kan finne det mer praktisk å få utdatafilene i arbeidskatalogen din. I dette tilfellet kan følgende indirekte handling hjelpe:
$ function waff {
CWD="$PWD"
cd $NS3DIR >/dev/null
./waf --cwd="$CWD" $*
cd - >/dev/null
}
Denne dekorasjonen av den forrige versjonen av kommandoen bevarer gjeldende arbeidskatalog, går til katalogen wafog instruerer deretter waf for å endre arbeidskatalogen tilbake til gjeldende arbeidskatalog som er lagret før du starter programmet. Vi nevner laget - -cwd
For fullstendighetens skyld kjører de fleste brukere ganske enkelt Waf fra toppnivåkatalogen og genererer utdatafiler der.
Kilde: www.habr.com