Handleiding voor de ns-3 netwerk simulator. Hoofdstuk 3

Handleiding voor de ns-3 netwerk simulator. Hoofdstuk 3
hoofdstukken 1,2

3 Aan de slag
3.1 Overzicht
3.2 Voorwaarden
3.2.1 Het downloaden van de ns-3 release in de vorm van een bronarchief
3.3 ns-3 downloaden met Git
3.3.1 ns-3 downloaden met Bake
3.4 ns-3 bouwen
3.4.1 Bouwen met build.py
3.4.2 Bouwen met Bake
3.4.3 Bouwen met Waf
3.5 ns-3 testen
3.6 Een script uitvoeren
3.6.1 Commandoregelargumenten
3.6.2 Foutopsporing
3.6.3 Werkdirectory

Hoofdstuk 3

Aan de slag

Dit hoofdstuk is bedoeld om de lezer voor te bereiden op het werken met een computer waarop ns-3 mogelijk nooit is geïnstalleerd. De behandeling omvat ondersteunde platforms, voorwaarden, manieren om ns-3 te verkrijgen, manieren om ns-3 te bouwen en manieren om uw build te verifiëren en eenvoudige programma's uit te voeren.

3.1 Overzicht

De ns-3 simulator is opgebouwd als een systeem van samenwerkende softwarebibliotheken. Bij het bouwen wordt de code van gebruikersprogramma's gelinkt aan deze bibliotheken. Voor het schrijven van gebruikersprogramma's worden de programmeertalen C++ of Python gebruikt.

Ns-3 wordt verspreid als broncode, wat betekent dat het doelsysteem een software-ontwikkelomgeving moet hebben om eerst de bibliotheken te bouwen en vervolgens het gebruikersprogramma te bouwen. In principe kan ns-3 worden verspreid als kant-en-klare bibliotheken voor specifieke systemen, en in de toekomst kunnen ze op die manier worden verspreid. Maar momenteel voeren veel gebruikers hun werk uit door de ns-3 zelf aan te passen, dus het is nuttig om de broncode te hebben voor het bouwen van bibliotheken. Als iemand zich zou willen inzetten voor het maken van kant-en-klare bibliotheken en pakketten voor besturingssystemen, neem dan contact op met de mailinglijst. ns-developers.

Hier bespreken we drie manieren om ns-3 te downloaden en te bouwen. De eerste is om de officiële release van de hoofdsite te downloaden en te bouwen. De tweede is om ontwikkelversies van de basisinstallatie van ns-3 te selecteren en te bouwen. De derde is het gebruik van aanvullende bouwtools om meer extensies voor ns-3 te downloaden. We zullen elk van deze methoden doornemen, aangezien de tools iets verschillen.

Ervaren Linux-gebruikers vragen zich misschien af waarom ns-3 niet als pakket wordt aangeboden, zoals de meeste andere bibliotheken die gebruikmaken van een pakketbeheerder. Hoewel er binaire pakketten zijn voor verschillende Linux-distributies (bijvoorbeeld Debian), bewerkt de meerderheid van de gebruikers uiteindelijk de bibliotheken en moet ns-3 zelf opnieuw worden opgebouwd, waardoor de beschikbaarheid van de broncode handig is. Om deze reden zullen we ons richten op installatie vanuit de broncode.

Voor de meeste toepassingen zijn de rechten van ns-3 root niet nodig, het wordt aanbevolen om een niet-bevoegde gebruikersaccount te gebruiken.

3.2 Voorwaarden

De volledige set beschikbare ns-3-bibliotheken heeft een aantal afhankelijkheden van externe bibliotheken, maar in grote lijnen kan ns-3 worden opgebouwd en gebruikt met ondersteuning voor verschillende gangbare (vaak standaard geïnstalleerde) componenten: C++-compiler, Python, broncode-editor (bijvoorbeeld, vim, emacs of Eclipse) en, als ontwikkelrepositories worden gebruikt, versiebewakingssystemen zoals Git. De meeste beginnende gebruikers hoeven zich geen zorgen te maken als hun configuratie enkele ontbrekende extra functies van ns-3 meldt, maar voor degenen die een volledige installatie willen, biedt het project een wiki met pagina's vol nuttige tips en aanwijzingen. Een van deze pagina's is de pagina 'Installatie' met instructies voor verschillende systemen, beschikbaar op: https://www.nsnam.org/wiki/Installation.

De sectie 'Vereisten' van deze wiki-pagina legt uit welke pakketten nodig zijn voor de ondersteuning van algemene ns-3-opties, evenals de commando's die worden gebruikt om deze te installeren op gangbare Linux- of macOS-varianten.

U kunt gebruikmaken van de mogelijkheid om de wiki-pagina van ns-3 of de hoofdwebsite te bekijken: https://www.nsnam.org, want daar is veel informatie te vinden. Vanaf de laatste versie van ns-3 (ns-3.29) zijn de volgende tools nodig om ns-3 te draaien:

Tool Pakket/versie

  • C++-compiler
    clang++ of g++ (g++ versie 4.9 of hoger)
  • Python
    python2 versie >= 2.7.10, of python3 versie >=3.4
  • Git
    elke recente versie (voor toegang tot ns-3 op GitLab.com)
  • tar
    elke recente versie (voor het uitpakken van de ns-3-release)
  • bunzip2
    elke recente versie (voor het uitpakken van de ns-3-release)

Om de standaard geïnstalleerde versies van Python te controleren, typt u python -V. Om de versie van g++ te controleren, typt u g++ -v. Als sommige tools ontbreken of verouderd zijn, raadpleeg dan de installatiehandleiding op de wiki-pagina van ns-3.

Vanaf dit moment gaan we ervan uit dat de lezer werkt in Linux, MacOS of een Linux-omgeving emulator, en tenminste de bovengenoemde tools heeft.

3.2.1 Het downloaden van de ns-3 release in de vorm van een bronarchief

Dit is de werkwijze voor een nieuwe gebruiker die de nieuwste release- en pakketversies van ns-3 wil downloaden en ermee wil experimenteren. De releases van ns-3 worden gepubliceerd als gecomprimeerde bronarchieven, soms aangeduid als tarball. tarball — dit is een speciaal formaat voor softwarearchieven waarin verschillende bestanden samen zijn gevoegd. Het archief is meestal gecomprimeerd. Het proces om ns-3 te downloaden via tarball is eenvoudig, je moet gewoon de release kiezen, deze downloaden en uitpakken.

Stel dat je als gebruiker ns-3 wilt bouwen in een lokale directory met de naam workspace. Je kunt een werkversie van de release krijgen door het volgende in de Linux-console in te voeren (natuurlijk de relevante versienummers vervangend)

$ 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 

Let op de hierboven gebruikte tool wget, dit is een commando-regeltool om objecten van het internet te downloaden. Als je deze niet hebt geïnstalleerd, kun je hiervoor een browser gebruiken.

Door deze stappen te volgen, navigeer je naar de directory ns-allinone-3.29, waar je verschillende bestanden en directories moet zien.

$ 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

Nu ben je klaar om de basisdistributie van ns-3 te bouwen en kun je verder gaan naar de sectie die aan het bouwen van ns-3 is gewijd.

3.3 ns-3 downloaden met Git

De code van ns-3 is beschikbaar in Git-repositories op GitLab.com op het adres https://gitlab.com/nsnam/. De groep nsnam verbindt verschillende repositories die door het open source-project worden gebruikt.

De makkelijkste manier om te beginnen met Git-repositories is door een fork te maken of de omgeving ns-3-allinone. Dit is een set scripts die het downloaden en bouwen van de meest gebruikte subsysteemns van ns-3 beheert. Als je nieuw bent met Git, zijn de termen "fork" en "klonen" misschien onbekend voor je; als dat zo is, raden we je aan gewoon te klonen (je eigen copie te maken) van de repository die op GitLab.com staat, als volgt:

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

Op dit punt zie je de structuur van je directory ns-3-allinone verschilt een beetje van de hierboven beschreven directory met de release-archieven. Het zou er ongeveer zo uit moeten zien:

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

Let op het bestaan van het script download.py, dat ns-3 en de bijbehorende broncode verder zal extraheren. Hier heeft u de keuze: ofwel de nieuwste ontwikkelingssnapshot van ns-3 downloaden:

$ python download.py

of de release van ns-3 verkiezen, waarbij de vlag wordt gebruikt -n om het versienummer aan te geven:

$ python download.py -n ns-3.29

Na deze stap zullen aanvullende repositories worden gedownload naar de directory ns-3-allinone Er zullen aanvullende repositories worden geladen ns-3, bake, pybindgen en netanim.

Opmerking
Op een schone Ubuntu 16.04 machine moest ik het commando aanpassen naar: $ sudo python3 download.py -n ns-3.29 (hier en verder notities van de vertaler).

3.3.1 ns-3 downloaden met Bake

De twee hierboven genoemde methoden (de archief met de bronbestanden of de repository ns-3-allinone via Git) zijn nuttig voor het verkrijgen van de eenvoudigste installatie van ns-3 met enkele add-ons (pybindgen voor het genereren van Python bindings en netanim voor netwerkanimatie). De derde repository die standaard in ns-3-allinone wordt meegeleverd, heet bake.

Bake — dit is een tool voor gecoördineerde softwarebouwwerken uit meerdere repositories, ontwikkeld voor het ns-3 project. Bake kan worden gebruikt om ontwikkelversies van ns-3 te verkrijgen, evenals om uitbreidingen van de basis release van ns-3 te downloaden en te bouwen, zoals de omgeving Direct Code Execution, CradleNetwork Simulation Cradle, de mogelijkheid om nieuwe Python bindings te maken en verschillende "applicaties" van ns-3.

Opmerking
CradleNetwork Simulation Cradle is een framework dat het mogelijk maakt om echte netwerkstacks TCP/IP binnen de netwerk simulator te gebruiken.

Als u denkt dat uw ns-3 installatie geavanceerde of extra functies moet hebben, kunt u deze installatieroute volgen.

In de laatste releases van ns-3 Bake is toegevoegd aan de tar-release. De release bevat een configuratiebestand dat het mogelijk maakt om actuele versies van de software op het moment van het maken van de release te downloaden. Dit betekent dat bijvoorbeeld de versie Bake, die wordt verspreid met de release van ns-3.29, kan worden gebruikt om componenten voor deze release van ns-3 of eerder te verkrijgen, maar kan niet worden gebruikt om componenten voor latere releases te extraheren (tenzij het pakket beschrijvingsbestand bakeconf.xml niet is bijgewerkt).

U kunt ook de meest actuele kopie verkrijgen bake, door het volgende commando in uw Linux-console in te voeren (op voorwaarde dat u Git heeft geïnstalleerd):

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

Bij het uitvoeren van de git-opdracht zou u iets soortgelijks moeten zien:

Cloning into 'bake'...
remote: Objecten tellen: 2086, voltooid. 
remote: Objecten tellen: 100% (2086/2086), voltooid. 
remote: Objecten comprimeren: 100% (649/649), voltooid. 
remote: Totaal 2086 (delta 1404), hergebruikt 2078 (delta 1399) 
Ontvangen objecten: 100% (2086/2086), 2.68 MiB | 3.82 MiB/s, voltooid. 
Deltas oplossen: 100% (1404/1404), voltooid.

Na het voltooien van de opdracht clone zou je een map moeten hebben met de naam bake, waarvan de inhoud er ongeveer zo uit zou moeten zien:

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

Houd er rekening mee dat u verschillende Python-scripts, een Python-module met de naam bake en een XML-configuratiebestand hebt gedownload. De volgende stap is het gebruik van deze scripts om de ns-3-distributie van uw keuze te downloaden en te bouwen. Er zijn verschillende configuratiedoelen beschikbaar:

  1. ns-3.29: een module die overeenkomt met de release; deze zal componenten downloaden die vergelijkbaar zijn met de release in de tarball;

  2. ns-3-dev: een vergelijkbare module, maar met gebruik van code uit de ontwikkeltak;

  3. ns-allinone-3.29: een module die andere extra functies bevat, zoals Click-routering en het Network Simulation Cradle, Openflow voor ns-3.

  4. ns-3-allinone: vergelijkbaar met de releaseversie van de module allinone, maar voor ontwikkelingscode.

Opmerking
Click — een modulaire softwarearchitectuur voor het bouwen van routers.

Openflow is een protocol voor het beheer van de verwerking van gegevens die door routers en switches in netwerken worden verzonden, en implementeert technologie voor programmatisch configureerbare netwerken.

De huidige ontwikkelsnapshot (niet-released) van ns-3 is te vinden op:https://gitlab.com/nsnam/ns-3-dev.git.

Ontwikkelaars proberen deze repositories in een consistente werkende toestand te houden, maar ze bevinden zich in de ontwikkelingsfase en bevatten niet-released code, dus als u geen nieuwe functies wilt gebruiken, kies dan de officiële release.

U kunt de laatste versie van de code vinden door de lijst van repositories te bekijken, of door naar de webpagina 'ns-3 Releases' te gaan:https://www.nsnam.org/releases/ en op de link naar de laatste versie te klikken. In dit voorbeeld gaan we verder met ns-3.29.

Om de benodigde elementen van ns-3 te krijgen, passen we het hulpmiddel toe Bake. Laten we een paar inleidende woorden zeggen over het gebruik van Bake.

Bake werkt door de bronnen van de pakketten in de map te downloaden source en de bibliotheken in de build-directory te installeren. Bake kan worden uitgevoerd door te verwijzen naar het uitvoerbare bestand, maar als u wilt uitvoeren Bake niet uit de directory waarin het is geüpload, het is aan te raden om het pad toe te voegen aan bake je pad (omgeving variabele PATH), bijvoorbeeld als volgt (voorbeeld voor de Linux bash shell). Ga naar de directory ‘bake’ en stel dan de volgende omgevingsvariabelen in:

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

Dit plaatst het programma bake.py in het shell-pad en stelt andere programma's in staat de uitvoerbare bestanden en bibliotheken te vinden die zijn gemaakt door bake. In sommige gevallen van gebruik bake, is de hierboven beschreven installatie van PATH en PYTHONPATH niet vereist, maar voor een volledige bouw van ns‑3-allinone (met extra pakketten) is dit meestal nodig.

Ga naar de werkomgeving en voer het volgende in de console in:

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

Vervolgens zullen we vragen Bake te controleren of we genoeg tools hebben om verschillende componenten te downloaden. Typ:

$ ./bake.py check

Je zou iets als het volgende moeten zien:

> Python - OK 
> GNU C++ compiler - OK 
> Mercurial - OK 
> Git - OK 
> Tar tool - OK 
> Unzip tool - OK 
> Make - OK 
> cMake - OK 
> patch tool - OK 
> Pad gezocht naar tools: /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin ...

Vooral downloadtools zoals Mercurial, CVS, Git en Bazaar zijn cruciaal in deze fase, omdat ze ons in staat stellen de code te verkrijgen. Installeer op dit punt de ontbrekende tools op de gebruikelijke manier voor jouw systeem (als je dat kunt) of vraag hulp aan je systeembeheerder.

Probeer vervolgens de software te downloaden:

$ ./bake.py download

het resultaat moet iets zijn als:

>> Zoeken naar systeemafhankelijkheid setuptools - OK 
>> Zoeken naar systeemafhankelijkheid libgoocanvas2 - OK 
>> Zoeken naar systeemafhankelijkheid gi-cairo - OK 
>> Zoeken naar systeemafhankelijkheid pygobject - OK 
>> Zoeken naar systeemafhankelijkheid pygraphviz - OK 
>> Zoeken naar systeemafhankelijkheid python-dev - OK 
>> Zoeken naar systeemafhankelijkheid qt - OK 
>> Zoeken naar systeemafhankelijkheid g++ - OK 
>> Downloaden pybindgen-0.19.0.post4+ng823d8b2 (doeldirectory:pybindgen) - OK 
>> Downloaden netanim-3.108 - OK 
>> Downloaden ns-3.29 - OK

Dit betekent dat er drie bronnen zijn gedownload. Ga nu naar de directory source en typ ls; je zou moeten zien:

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

Nu ben je klaar om de ns‑3-distributie te bouwen.

3.4 ns-3 bouwen

Net zoals bij het downloaden van ns‑3, zijn er verschillende manieren om ns‑3 te bouwen. Het belangrijkste is dat we willen benadrukken dat ns‑3 wordt gebouwd met behulp van een hulpmiddel dat Waf, zoals hieronder beschreven. De meeste gebruikers zullen werken met Waf, maar er zijn verschillende handige scripts die je kunnen helpen om aan de slag te gaan of complexere builds te organiseren. Lees daarom eerst over Wafbent geconfronteerd, kijk dan op build.py en de build met bake.

3.4.1 Bouwen met build.py

Let op! Deze build-stap is alleen beschikbaar van de bronarchiefversie die zoals hierboven beschreven is verkregen; en niet gedownload via git of bake.

Bij gebruik van het release-archief tarball, in ns‑3‑allinone is er een handig script dat het bouwen van componenten kan vereenvoudigen. Het heet build.py. Dit programma configureert het project op de meest nuttige manier voor jou. Houd er echter rekening mee dat complexere configuraties en werken met ns‑3 meestal het gebruik van het eigen build-systeem van ns‑3, Waf, vereisen, dat later in deze handleiding zal worden gepresenteerd.

Als je hebt gedownload met tarball, dan zou in jouw directory ~\/workspace een directory moeten verschijnen met een naam als ns-allinone-3.29. Voer het volgende in:

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

When calling build.py we hebben commandoregelargumenten toegepast om de in deze handleiding gebruikte voorbeelden en tests te bouwen, die standaard niet door ns‑3 worden gebouwd. Standaard bouwt het programma ook alle beschikbare modules. Daarna kun je eventueel ns‑3 zonder voorbeelden en tests bouwen of modules uitsluiten die niet nodig zijn voor jouw werk.

Je zult veel uitvoerberichten van de compiler zien die door het script worden weergegeven terwijl verschillende onderdelen die je hebt gedownload worden gebouwd. Eerst zal het script proberen de animator te bouwen netanim, daarna de binding generator pybindgen en ten slotte ns‑3. Aan het einde van het proces zou je het volgende moeten zien:

Waf: Leaving directory '\/path\/to\/workspace\/ns-allinone-3.29\/ns-3.29\/build'\n'build' finished successfully (6m25.032s) \n\nModules built:\nantenna                aodv                     applications\nbridge                 buildings                config-store\ncore                   csma                     csma-layout\ndsdv                   dsr                      energy \nfd-net-device          flow-monitor             internet\ninternet-apps          lr-wpan                  lte\nmesh                   mobility                 mpi\nnetanim (no Python)    network                  nix-vector-routing \nolsr                   point-to-point           point-to-point-layout \npropagation            sixlowpan                spectrum \nstats                  tap-bridge               test (no Python) \ntopology-read          traffic-control          uan \nvirtual-net-device     visualizer               wave \nwifi                   wimax \n\nModules not built (see ns-3 tutorial for explanation):\nbrite                  click                    openflow \nLeaving directory .\/ns-3.29

In de laatste drie regels van de listing zien we een bericht over de modules die niet zijn gebouwd:

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

Dit betekent gewoon dat sommige ns-3-modules die afhankelijk zijn van externe bibliotheken mogelijk niet zijn gebouwd, of dat hun bouw niet nodig is voor deze configuratie. Dit betekent niet dat de simulator niet is gebouwd of dat de gebouwde modules verkeerd zullen werken.

3.4.2 Bouwen met Bake

Als je hierboven bake hebt gebruikt om de broncode uit de projectrepositories te krijgen, kun je het blijven gebruiken voor het bouwen van ns-3. Typ:

$ ./bake.py build

en je zou iets moeten zien als:

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

Hint: je kunt ook beide stappen, downloaden en bouwen, tegelijk uitvoeren door "bake.py deploy" aan te roepen.

Bij het bouwen van alle componenten kunnen er fouten optreden, maar de bouw gaat door als de component niet essentieel is. Een recent probleem met de draagbaarheid was dat castxml kan worden gebouwd door een gereedschap bake niet op alle platforms. In dat geval verschijnt er een bericht als:

>> Building castxml - Probleem 
> Probleem: Optionele afhankelijkheid, module "castxml" is mislukt
Dit kan de functionaliteit van de uiteindelijke bouw verminderen.
Bake gaat echter door, omdat "castxml" geen essentiële afhankelijkheid is.
Voor meer informatie bel bake met -v of -vvv voor de volledige gedetailleerde modus.

deze unicorns vertellen ons dat slechts 20% van hen door één persoon is opgericht. Maar moet je dit getal in overweging nemen, wanneer elke miljard-dollar onderneming een uniek en onnavolgbaar verhaal is? Bovendien is een grote statistische steekproef altijd nauwkeuriger. De mythe is ontmaskerd. castxml is alleen nodig als je bijgewerkte Python-bindings wilt maken. Voor de meeste gebruikers is dit niet nodig (tenzij ze ns-3 willen wijzigen), dus dergelijke waarschuwingen kunnen voorlopig veilig worden genegeerd.

Als er een fout optreedt, geeft de volgende opdracht je aanwijzingen over ontbrekende afhankelijkheden:

$ ./bake.py show

Verschillende pakketafhankelijkheden die je probeert te bouwen, worden opgesomd.

3.4.3 Bouwen met Waf

Tot nu toe hebben we om de bouw van ns-3 te starten ofwel de script build.py, ofwel het gereedschap bake. Deze hulpmiddelen zijn nuttig voor het bouwen van ns-3 en het onderhouden van bibliotheken. In feite starten ze een bouwtool Waf uit de directory ns-3. Waf wordt meegeleverd met de broncode van ns-3. De meeste gebruikers kiezen snel voor een directe manier om ns-3 in te stellen en te bouwen. Waf. Dus ga alsjeblieft verder naar de ns-3 directory die je oorspronkelijk hebt aangemaakt.

Op dit moment is het strikt genomen niet verplicht, maar het kan nuttig zijn om kort stil te staan bij hoe je wijzigingen aanbrengt in de projectconfiguratie. Daarnaast zal de meest nuttige wijziging in de configuratie die je kunt aanbrengen, het maken van een geoptimaliseerde versie van de code zijn. Standaard heb je je project ingesteld om een debugversie te bouwen. Laten we het project bekijken voor het maken van een geoptimaliseerde build. Om Waf te instrueren dat het geoptimaliseerde builds moet maken, inclusief voorbeelden en tests, moet je de volgende commando's uitvoeren:

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

Dit zal Waf buiten de lokale directory draaien (voor jouw gemak). Het eerste commando voert een schoonmaak uit van de vorige build; dit is doorgaans niet strikt noodzakelijk, maar het is een goede praktijk (zie ook de buildprofielen hieronder); dit verwijdert eerder aangemaakte bibliotheken en objectbestanden die zich in de directory bevinden build/. Wanneer het project opnieuw is geconfigureerd en het buildsysteem verschillende afhankelijkheden controleert, zou je uitvoer moeten zien die lijkt op het volgende:

Instellen van top naar      : /home/ns3user/workspace/bake/source/ns-3-dev
Instellen van uit naar      : /home/ns3user/workspace/bake/source/ns-3-dev/build
Controleren op 'gcc' (C-compiler)        : /usr/bin/gcc
Controleren op cc-versie                : 7.3.0
Controleren op 'g++' (C++-compiler)      : /usr/bin/g++
Controleren op compilatie vlag -march=native ondersteuning : ok
Controleren op compilatie vlag -Wl,--soname=foo ondersteuning : ok
Controleren op compilatie vlag -std=c++11 ondersteuning       : ok
Controleren op boost-includes   : headers niet gevonden, geef alstublieft een --boost-includes argument (zie hulp)
Controleren op boost-includes   : headers niet gevonden, geef alstublieft een --boost-includes argument (zie hulp)
Controleren op programma 'python'            : /usr/bin/python
Controleren op python versie >= 2.3       : 2.7.15 python-config                                                                     : /usr/bin/python-config
Vragen aan python-config voor pyembed '--cflags --libs --ldflags' vlaggen : ja
Testen van pyembed configuratie                                      : ja
Vragen aan python-config voor pyext '--cflags --libs --ldflags' vlaggen   : ja
Testen van pyext configuratie                                        : ja

Controleren op compilatie vlag -fvisibility=hidden ondersteuning          : ok
Controleren op compilatie vlag -Wno-array-bounds ondersteuning            : ok
Controleren op pybindgen locatie          : ../pybindgen ,!(geraden)
Controleren op python module 'pybindgen'   : 0.19.0. ,!post4+g823d8b2
Controleren op pybindgen versie           : 0.19.0. ,!post4+g823d8b2
Controleren op codefragment                : ja
Controleren op types uint64_t en unsigned long equivalentie : nee
Controleren op codefragment                                 : nee
Controleren op types uint64_t en unsigned long long equivalentie     : ja
Controleren op de apidefs die voor Python bindings kunnen worden gebruikt                       : gcc-LP64
Controleren op interne GCC cxxabi         : compleet
Controleren op python module 'pygccxml'    : niet gevonden
Controleren op click locatie              : niet gevonden
Controleren op programma 'pkg-config'        : /usr/bin/pkg- ,!config
Controleren op 'gtk+-3.0'                  : niet gevonden
Controleren op 'libxml-2.0'                : ja
Controleren op uint128_t                   : niet gevonden
Controleren op __uint128_t                 : ja
Controleren op hoge precisie implementatie   : 128-bits geheel getal ,!(standaard)
Controleren op header stdint.h             : ja
Controleren op header inttypes.h           : ja
Controleren op header sys/inttypes.h       : niet gevonden
Controleren op header sys/types.h          : ja
Controleren op header sys/stat.h           : ja
Controleren op header dirent.h             : ja
Controleren op header stdlib.h             : ja
Controleren op header signal.h             : ja
Controleren op header pthread.h            : ja
Controleren op header stdint.h             : ja
Controleren op header inttypes.h           : ja
Controleren op header sys/inttypes.h       : niet gevonden
Controleren op bibliotheek rt                  : ja
Controleren op header sys/ioctl.h          : ja
Controleren op header net/if.h             : ja
Controleren op header net/ethernet.h       : ja
Controleren op header linux/if_tun.h       : ja
Controleren op header netpacket/packet.h   : ja
Controleren op NSC locatie                : niet gevonden
Controleren op 'sqlite3'                   : niet gevonden
Controleren op header linux/if_tun.h       : ja
Controleren op python module 'gi'          : 3.26.1
Controleren op python module 'gi.repository.GObject'      : ok
Controleren op python module 'cairo'                      : ok
Controleren op python module 'pygraphviz'                 : 1.4rc1
Controleren op python module 'gi.repository.Gtk'          : ok
Controleren op python module 'gi.repository.Gdk'          : ok
Controleren op python module 'gi.repository.Pango'        : ok
Controleren op python module 'gi.repository.GooCanvas'    : ok
Controleren op programma 'sudo'                             : /usr/bin/sudo
Controleren op programma 'valgrind'                         : niet gevonden
Controleren op 'gsl' : niet gevonden python-config            : niet gevonden
Controleren op compilatie vlag -fstrict-aliasing ondersteuning : ok
Controleren op compilatie vlag -fstrict-aliasing ondersteuning : ok
Controleren op compilatie vlag -Wstrict-aliasing ondersteuning : ok
Controleren op compilatie vlag -Wstrict-aliasing ondersteuning : ok
Controleren op programma 'doxygen'                          : /usr/bin/doxygen
---- Samenvatting van optionele ns-3 functies:
Buildprofiel : geoptimaliseerd
Bouwdirectory : 
BRITE-integratie : niet ingeschakeld (BRITE niet ingeschakeld (zie optie --with-,!brite))
DES-metrics evenementverzameling : niet ingeschakeld (standaard uitgeschakeld)
Emulatie FdNetDevice        : ingeschakeld
Voorbeelden                     : ingeschakeld
Bestanddescriptor NetDevice    : ingeschakeld
GNU Wetenschappelijke Bibliotheek (GSL) : niet ingeschakeld (GSL niet gevonden)
Gcrypt-bibliotheek               : niet ingeschakeld
(libgcrypt niet gevonden: u kunt ,!libgcrypt-config gebruiken om de locatie te vinden.) GtkConfigStore               : niet ingeschakeld (bibliotheek 'gtk+-3.0 >= 3.0' niet gevonden)
MPI-ondersteuning                  : niet ingeschakeld (optie --enable-mpi niet geselecteerd)
ns-3 Click-integratie       : niet ingeschakeld (nsclick niet ingeschakeld (zie optie --with-,!nsclick))
ns-3 OpenFlow-integratie   : niet ingeschakeld (Vereiste boost-bibliotheken niet gevonden)
Network Simulation Cradle    : niet ingeschakeld (NSC niet gevonden (zie optie --with-nsc))
PlanetLab FdNetDevice         : niet ingeschakeld (PlanetLab besturingssysteem niet gedetecteerd ,!(zie optie --force-planetlab)) PyViz visualizer : ingeschakeld
Python API Scanning-ondersteuning   : niet ingeschakeld (Ontbrekende 'pygccxml' Python-module)
Python-bindings : ingeschakeld
Realtime Simulator           : ingeschakeld
SQlite stats data-uitvoer      : niet ingeschakeld (bibliotheek 'sqlite3' niet gevonden)
Tap Bridge                    : ingeschakeld
Tap FdNetDevice               : ingeschakeld
Tests                         : ingeschakeld
Threading Primitives          : ingeschakeld
Gebruik sudo om suid-bit in te stellen   : niet ingeschakeld (optie --enable-sudo niet geselecteerd)
XmlIo                         : ingeschakeld
'configure' is succesvol afgerond (6.387s)

Let op de laatste sectie van de bovenstaande lijst. Sommige ns-3 opties zijn standaard niet ingeschakeld of vereisen systeemondersteuning voor correcte werking. Bijvoorbeeld, om XmlTo in te schakelen, moet de bibliotheek aanwezig zijn in het systeem. libxml-2.0. Als deze bibliotheek niet is gevonden en de overeenkomstige ns-3 functie niet is ingeschakeld, zal een foutmelding worden weergegeven. Let ook op dat de opdracht beschikbaar is om het suid-bit "set user/group ID during execution" van bepaalde programma's in te stellen. Dit is standaard niet ingeschakeld, waardoor deze functie als "niet ingeschakeld" wordt weergegeven. Tot slot, om de ingeschakelde opties te bekijken, gebruikt u sudo --check-config Waf met de parameter Laten we nu terugkeren naar de debug-build, die voorbeelden en tests bevat..

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

Het build-systeem is nu geconfigureerd en je kunt de debug-versies van de ns-3 programma's bouwen door gewoon in te voeren:

Hoewel de bovengenoemde stappen je misschien hebben gedwongen om een deel van het ns-3 systeem twee keer te bouwen, weet je nu hoe je de configuratie kunt wijzigen en geoptimaliseerde code kunt bouwen.

$ ./waf

Om te controleren welke profiel actief is voor deze projectconfiguratie, is er de opdracht:

$ .\/waf --check-profile Waf: Directory `\/path\/to\/ns-3-allinone\/ns-3.29\/build' binnen gegaan Build profiel: debug

Het hierboven besproken scenario

ondersteunt ook de argumenten build.py --enable-examples --enable-tests en , maar andere optiesondersteunt hij niet rechtstreeks. Bijvoorbeeld, dit zal niet werken: Waf $ .\/build.py --disable-python

de reactie zal zijn:

build.py: error: geen optie: --disable-python

Desondanks kan de speciale operator - - worden gebruikt om extra parameters door te geven via

, daarom zal de volgende opdracht in plaats van het bovenstaande werken: waf$ .\/build.py -- --disable-python

aangezien deze de hoofdopdracht genereert

.\/waf configure —disable-python . Hier zijn nog enkele introductietips overFoutafhandeling bij het bouwen Waf.

Fouten bij het bouwen verwerken

De releases van ns-3 zijn getest op de meest recente C++-compilers die beschikbaar waren op de gebruikelijke Linux- en MacOS-distributies op het moment van release. Echter, na verloop van tijd worden er nieuwe distributies met nieuwe compilers uitgebracht en deze nieuwere compilers zijn doorgaans strikter met waarschuwingen. Ns-3 configureert zijn build om alle waarschuwingen als fouten te behandelen, zodat soms, als je een oudere versie op een nieuwere systeem gebruikt, een compilerwaarschuwing de build kan stopzetten.

Bijvoorbeeld, eerder was er een release van ns-3.28 voor Fedora 28, die een nieuwe hoofdversie bevatte gcc (gcc-8). De build van ns-3.28 of eerdere versies op Fedora 28, met Gtk2+ geïnstalleerd, zal de volgende fout veroorzaken:

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

In releases vanaf ns-3.28.1 is er Waf een optie beschikbaar om deze problemen op te lossen. Dit schakelt de instelling van de '-Werror'-vlag uit in g++ en clang++. Deze optie is '--disable-werror', en moet tijdens de configuratie toegepast worden:

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

Configureren of bouwen

Sommige commando's Waf zijn alleen zinvol in de configuratiefase, terwijl andere alleen in de bouwfase werken. Bijvoorbeeld, als je de emulatiefuncties van ns-3 wilt gebruiken, kun je de bitinstelling suid met behulp van sudo, zoals eerder beschreven. Dit zal de configuratiefase-opdrachten intrekken, zodat je de configuratie kunt wijzigen met behulp van het volgende commando, dat ook voorbeelden en tests opneemt.

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

Als je dit doet, Waf zal het sudo, om de socket creatieprogramma's voor de emulatiecode te wijzigen zodat deze met rechten rootwordt een tabel met wijzigingen en instructies voor de overgang naar de nieuwe configuratie gegeven. Voor meer informatie, zie Waf er zijn vele andere opties beschikbaar voor de configuratie- en bouwfases. Om de opties te verkennen, typ:

$ ./waf --help

In het volgende gedeelte zullen we enkele opties gebruiken die verband houden met testen.

Bouwprofielen

We hebben al gezien hoe we kunnen configureren Waf voor builds debug en geoptimaliseerd:

$ ./waf --build-profile=debug

Er is ook een tussenliggend bouwprofiel, release. Optie -d is een synoniem voor --build-profile. Het bouwprofiel beheert het gebruik van logging, assertions en compileroptimalisatie-instellingen:

Handleiding voor de ns-3 netwerk simulator. Hoofdstuk 3

Zoals te zien is, zijn logging en assertions alleen beschikbaar in debug builds. De aanbevolen praktijk is om uw script in de debugmodus te ontwikkelen en vervolgens meerdere runs uit te voeren (voor statistieken of om parameters te wijzigen) in de geoptimaliseerde build-profiel.

Als u code heeft die alleen in bepaalde build-profielen moet worden uitgevoerd, gebruik dan de Code Wrapper Macro:

NS_BUILD_DEBUG (std::cout << "Deel van een uitvoerregel..." << std::flush; timer.Start ,!()); DoLongInvolvedComputation ();
NS_BUILD_DEBUG (timer.Stop (); std::cout << "Klaar: " << timer << std::endl;)

Standaard, Waf plaatst de build-artifacten in de build-directory. U kunt een andere uitvoermap opgeven met behulp van de optie - -out, bijvoorbeeld:

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

Door dit te combineren met build-profielen kunt u eenvoudig schakelen tussen verschillende compilatie-instellingen:

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

Dit stelt u in staat om met meerdere builds te werken zonder elke keer de laatste build opnieuw te schrijven. Wanneer u overschakelt naar een ander profiel, Waf zal het alleen die compileren, zonder de volledige hercompilatie van alles.

Wanneer u op deze manier overschakelt tussen build-profielen, moet u erop letten dat u elke keer dezelfde configuratieparameters opgeeft. Het definiëren van meerdere omgevingsvariabelen helpt om fouten te voorkomen:

$ 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

Compilers en flags

In de bovenstaande voorbeelden Waf voor het bouwen van ns‑3 wordt de C++ compiler van GCC gebruikt ( g++). U kunt echter de gebruikte Waf C++ compiler wijzigen door de omgevingsvariabele CXX te definiëren. Bijvoorbeeld, om de C++-compiler Clang te gebruiken, clang++,

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

Op dezelfde manier kunt u configureren Waf om gedistribueerde compilatie te gebruiken met distcc:

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

Voor meer gedetailleerde informatie over distcc en gedistribueerde compilatie, raadpleeg de projectpagina onder 'Documentatie'. Gebruik de omgevingsvariabele CXXFLAGS_EXTRA om compilerflags toe te voegen tijdens het configureren van ns‑3.

Installatie

Waf kan worden gebruikt voor het installeren van bibliotheken op verschillende locaties in het systeem. Standaard bevinden de gebouwde bibliotheken en uitvoerbare bestanden zich in de directory build, en aangezien Waf de locatie van deze bibliotheken en uitvoerbare bestanden kent, is het niet nodig om bibliotheken ergens anders te installeren.

Als gebruikers de voorkeur geven aan installatie buiten de build-directory, kunnen ze het commando uitvoeren .\/waf install. Standaard is het prefix voor installatie — /usr/local, daarom .\/waf install zal programma's installeren in /usr/local/bin, bibliotheken in /usr/local/lib en header bestanden in /usr/local/include. Superuser-rechten zijn meestal nodig om te installeren met het standaardprefix, dus het typische commando zou zijn sudo .\/waf install. Bij het uitvoeren, zal Waf eerst de voorkeur geven aan het gebruik van gedeelde bibliotheken in de build-directory, daarna zal het bibliotheken zoeken via het bibliotheekpad dat is ingesteld in de lokale omgeving. Daarom is het bij het installeren van bibliotheken in het systeem een goede praktijk om te controleren of de juiste bibliotheken worden gebruikt. Gebruikers kunnen ervoor kiezen om te installeren met een ander prefix door de optie tijdens configuratie door te geven --prefix, bijvoorbeeld:

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

Als later, na de bouw, de gebruiker het installatiecommando invoert .\/waf, zal het prefix /opt/local.

Opdracht .\/waf clean moet worden gebruikt voordat het project opnieuw wordt ingesteld, als voor installatie Waf met een ander prefix.

Dus, om ns‑3 te gebruiken, is het niet nodig om aan te roepen .\/waf install. De meeste gebruikers hebben deze opdracht niet nodig, omdat Waf de huidige bibliotheken uit de build-directory oppakt, maar sommige gebruikers kunnen het nuttig vinden als hun activiteiten het werken met programma's buiten de ns‑3-directory omvatten.

Waf is uniek

Op het hoogste niveau van de broncodeboom van ns‑3 bestaat er maar één Waf-script. Zodra je begint te werken, zul je veel tijd doorbrengen in de directory scratch\/ of dieper, insrc\/... en daarbij de noodzaak hebben om uit te voeren Waf. Je kunt gewoon onthouden waar je bent en uitvoeren Waf het als volgt:

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

maar dat kan vermoeiend en foutgevoelig zijn, dus er zijn betere oplossingen. Een van de gebruikelijke manieren is het gebruik van een teksteditor, zoals emacs of vim, waarin twee terminalsessies worden geopend, één voor het bouwen van ns‑3 en de andere voor het bewerken van de broncode. Als je alleen maar tarball, dan kan een omgevingsvariabele helpen:

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

$ cd scratch 
$ waff build

In de module directory kan het verleidelijk zijn om een triviaal waf-script zoals dit toe te voegen exec ../../waf. Doe dit alsjeblieft niet. Dit verwart nieuwkomers en leidt tot moeilijk te opsporen bouwfouten als het slecht wordt uitgevoerd. De bovenstaande oplossingen zijn de juiste weg om te volgen.

3.5 ns-3 testen

U kunt de moduletests van de ns-3-distributie uitvoeren door het script ./test.py:

$ ./test.py

Deze tests worden parallel uitgevoerd met Waf. Uiteindelijk zou u een melding moeten zien dat

92 van de 92 tests geslaagd (92 geslaagd, 0 gefaald, 0 gecrasht, 0 valgrind fouten)

Dit is een belangrijke melding voor het identificeren van storingen, crashes of valgrind-fouten en wijst op problemen met de code of incompatibiliteit tussen tools en de code.

U zult ook de samenvattende uitvoer van Waf en de tester die elke test uitvoert, zien verschijnen, die er ongeveer als volgt uit zal zien:

Waf: De directory ` /path/to/workspace/ns-3-allinone/ns-3-dev/build binnen gegaan 
Waf: De directory ` /path/to/workspace/ns-3-allinone/ns-3-dev/build verlaten 
'build' is succesvol voltooid (1.799s) 

Modules gebouwd:
aodv           toepassingen          brug
klik          config-opslag          kern
csma           csma-indeling           dsdv
emu            energie                flow-monitor
internet       lte                   mesh
mobiliteit       mpi                   netanim
netwerk        nix-vector-routing    ns3tcp
ns3wifi        olsr                  openflow
point-to-point point-to-point-indeling propagatie
spectrum       statistieken          tap-brug
template       test                  tools
topologie-lezen  uan                   virtueel-netwerk-apparaat
visualizer     wifi                  wimax

PASS: TestSuite ns3-wifi-interference
PASS: TestSuite histogram 

...

PASS: TestSuite object
PASS: TestSuite random-number-generators
92 van de 92 tests geslaagd (92 geslaagd, 0 gefaald, 0 gecrasht, 0 valgrind fouten)

Deze opdracht wordt meestal door gebruikers uitgevoerd om een snelle controle van de bouw van de ns-3-distributie te verifiëren. (Let op: de volgorde van de regels 'PASS: …' kan verschillen, dat is normaal. Het belangrijkste is dat alle controles aan het einde van het rapport geslaagd zijn; geen enkele test is mislukt of gecrasht.) En Waf, en test.py zal het werk parallel uitvoeren over de beschikbare CPU-kernen van de machine.

3.6 Een script uitvoeren

Meestal draaien we scripts onder toezicht van Waf. Dit stelt het build-systeem in staat om te garanderen dat de paden naar de gedeelde bibliotheek correct zijn ingesteld en dat bibliotheken beschikbaar zijn tijdens uitvoering. Om het programma uit te voeren, gebruikt u gewoon Waf met de parameter - -run. Laten we voor ns-3 het equivalent van het alomtegenwoordige programma uitvoeren Hallo wereld, door het volgende in te voeren:

$ ./waf --run hello-simulator

Waf zal eerst controleren of het programma correct is gebouwd en zo nodig de bouw uitvoeren. Daarna Waf zal het programma uitvoeren dat de volgende uitvoer genereert.

Hello Simulator

Gefeliciteerd! Nu bent u een gebruiker van ns-3!

Wat moet ik doen als ik geen resultaat zie?

Als u berichten ziet Waf, die aangeven dat de bouw succesvol is voltooid, maar u geen uitvoer ziet «Hello Simulator», dan is de kans groot dat u in het gedeelte [Bouwen met Waf] uw bouwmodus heeft gewijzigd naar geoptimaliseerd, maar vergeten bent om terug te schakelen naar de modus debug. De hele console-uitvoer die in deze handleiding wordt gebruikt, maakt gebruik van een speciale component van ns-3 die logboekregistratie uitvoert, en is bedoeld voor het afdrukken van gebruikersberichten naar de console. Het uitvoer van deze component is automatisch uitgeschakeld bij het compileren van geoptimaliseerde code — het is 'geoptimaliseerd'. Als u geen uitvoer van 'Hello Simulator' ziet, voer dan het volgende in:

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

om in te stellen Waf voor het bouwen van de debugversies van ns-3-programma's die voorbeelden en tests bevatten. Vervolgens moet u de relevante debugversie van de code opnieuw bouwen door in te voeren

$ ./waf

Nu, als u het programma hello-simulator, zou u het verwachte resultaat moeten zien.

3.6.1 Commandoregelargumenten

Om commandoregelargumenten aan het ns-3-programma door te geven, gebruikt u de volgende indeling:

$ .\/waf --run  --command-template="%s "

Vervang door de naam van uw programma en door de argumenten. Het argument - -command-template voor Waf is in wezen een recept voor het bouwen van de feitelijke commandoregel Waf gebruikt om het programma uit te voeren. Waf controleert of de build is voltooid, stelt paden naar de gedeelde bibliotheek in en roept vervolgens de uitvoerbare bestand aan met behulp van de gegeven commandoregelindeling, waarbij de naam van het programma wordt vervangen door de placeholder %s. Als deze syntaxis u ingewikkeld lijkt, is er een eenvoudigere optie die het ns-3-programma en zijn argumenten tussen enkele aanhalingstekens plaatst:

$ .\/waf --run ' --arg1=value1 --arg2=value2 ...'

Een ander, bijzonder nuttig voorbeeld is het selectief uitvoeren van testsets. Laten we aannemen dat er een testset (suite) mytest bestaat (die er in werkelijkheid niet is). Eerder hebben we het script .\/test.py gebruikt om een reeks tests parallel uit te voeren, dat herhaaldelijk het testprogramma test-runneraanroept. test-runner direct voor het uitvoeren van een enkele test:

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

De argumenten worden aan het programma doorgegeven test-runner. Aangezien mytest niet bestaat, zal er een foutmelding worden gegenereerd. Om de beschikbare parameters voor test-runner te bekijken, voert u in:

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

3.6.2 Foutopsporing

Voor het uitvoeren van ns-3 programma's met een andere tool, zoals een debugger (bijvoorbeeld gdb) of een geheugencontroletool (bijvoorbeeld valgrind), gebruik een vergelijkbare vorm - -command-template = "…". Bijvoorbeeld, om te starten in de debugger gdb je programma hello-simulator ns-3 met argumenten:

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

Let op, de naam van het ns-3 programma komt met een argument - -run, en de beheertool (hier gdb) is het eerste token in het argument - -command-template. Optie - -args meldt gdb, wat betekent dat de rest van de opdrachtregel behoort tot het 'lichtere' programma. (Sommige versies gdb begrijpen de optie niet - -args. In dat geval verwijdert u de programma-argumenten uit - -command-template en gebruikt een set van commando's gdb args.) We kunnen dit recept en het vorige combineren om een test onder de debugger uit te voeren:

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

3.6.3 Werkdirectory

Waf moet worden uitgevoerd vanuit zijn locatie aan de bovenkant van de ns-3 boom. Deze map wordt de werkdirectory waaruit de uitvoerbestanden worden geschreven. Maar wat te doen als u deze bestanden buiten de broncodeboom van ns-3 wilt behouden? Gebruik het argument - -cwd:

$ . /waf --cwd=...

Misschien wilt u de uitvoerbestanden liever in uw werkdirectory ontvangen. In dat geval kan een dergelijke indirecte actie helpen:

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

Deze decoratie van de vorige versie van het commando bewaart de huidige werkdirectory, gaat naar de directory Waf, en instrueert vervolgens Waf om de werkdirectory terug te veranderen naar de opgeslagen huidige werkdirectory voordat het programma wordt gestart. We noemen het commando - -cwd voor de volledigheid; de meeste gebruikers starten Waf gewoon vanuit de bovenliggende map en genereren daar de uitvoerbestanden.

Vervolg: hoofdstuk 4

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster