
3 Einstieg in die Arbeit
3.1 Ăbersicht
3.2 Voraussetzungen
3.2.1 Herunterladen des ns-3 Releases als Quellarchiv
3.3 ns-3 mit Git herunterladen
3.3.1 ns-3 mit Bake herunterladen
3.4 ns-3 kompilieren
3.4.1 Kompilierung mit build.py
3.4.2 Kompilierung mit Bake
3.4.3 Kompilierung mit Waf
3.5 ns-3 testen
3.6 Skript ausfĂŒhren
3.6.1 Befehlszeilenargumente
3.6.2 Debugging
3.6.3 Arbeitsverzeichnis
Kapitel 3
Einstieg in die Arbeit
Dieses Kapitel soll den Leser darauf vorbereiten, mit einem Computer zu arbeiten, auf dem möglicherweise nie ns-3 installiert wurde. Die Darstellung umfasst unterstĂŒtzte Plattformen, Voraussetzungen, Methoden zum Erhalt von ns-3, Kompilierungsarten fĂŒr ns-3 und Möglichkeiten zur ĂberprĂŒfung Ihrer Kompilierung sowie zum AusfĂŒhren einfacher Programme.
3.1 Ăbersicht
Der Simulator ns-3 ist als System von zusammenarbeitenden Softwarebibliotheken aufgebaut. Bei der Kompilierung wird der Code benutzerdefinierter Programme mit diesen Bibliotheken verbunden. FĂŒr das Schreiben benutzerdefinierter Programme werden die Programmiersprachen C++ oder Python verwendet.
ns-3 wird als Quellcode verbreitet, das bedeutet, dass das Zielsystem eine Software-Entwicklungsumgebung benötigt, um zunĂ€chst die Bibliotheken zu kompilieren und dann das benutzerdefinierte Programm. GrundsĂ€tzlich kann ns-3 als vorgefertigte Bibliotheken fĂŒr ein spezifisches System vertrieben werden, und in Zukunft könnten sie auf diese Weise verteilt werden. Derzeit fĂŒhren jedoch viele Benutzer ihre Arbeiten durch, indem sie ns-3 selbst bearbeiten, daher ist es nĂŒtzlich, ĂŒber den Quellcode zur Kompilierung der Bibliotheken zu verfĂŒgen. Wer die Aufgabe ĂŒbernehmen möchte, vorgefertigte Bibliotheken und Pakete fĂŒr Betriebssysteme zu erstellen, wird gebeten, sich mit der Mailingliste in Verbindung zu setzen. ns-developers.
Wir werden drei Möglichkeiten betrachten, um ns-3 herunterzuladen und zu kompilieren. Die erste besteht darin, das offizielle Release von der Hauptseite herunterzuladen und zu bauen. Die zweite ist die Auswahl und Kompilierung von Entwicklungsvarianten der Grundinstallation von ns-3. Die dritte Verwendung zusĂ€tzlicher Kompilierungswerkzeuge, um mehr Erweiterungen fĂŒr ns-3 herunterzuladen. Wir werden jede dieser Methoden durchgehen, da sich die Werkzeuge etwas unterscheiden.
Erfahrene Linux-Benutzer fragen sich möglicherweise, warum ns-3 nicht als Paket bereitgestellt wird, wie die meisten anderen Bibliotheken, die Paketmanager verwenden. Obwohl es binĂ€re Pakete fĂŒr verschiedene Linux-Distributionen (z. B. Debian) gibt, bearbeiten die meisten Benutzer letztlich die Bibliotheken und mĂŒssen ns-3 selbst neu kompilieren, weshalb der Zugriff auf den Quellcode praktisch ist. Aus diesem Grund werden wir uns mit der Installation aus dem Quellcode befassen.
FĂŒr die meisten Anwendungen benötigt ns-3 keine speziellen Rechte, es wird empfohlen, ein nicht privilegiertes Benutzerkonto zu verwenden. root Der gesamte Satz an verfĂŒgbaren ns-3-Bibliotheken hat eine Reihe von AbhĂ€ngigkeiten von Drittanbieterbibliotheken, aber gröĂtenteils kann ns-3 mit UnterstĂŒtzung fĂŒr mehrere gĂ€ngige (hĂ€ufig standardmĂ€Ăig installierte) Komponenten kompiliert und verwendet werden: C++-Compiler, Python, Code-Editor (z. B.
3.2 Voraussetzungen
vim emacs, Eclipse oder ) und, wenn Entwicklungsspeicherorte verwendet werden, Versionskontrollsysteme wie Git. Die meisten neuen Benutzer mĂŒssen sich keine Sorgen machen, wenn ihre Konfiguration auf einige fehlende zusĂ€tzliche Funktionen von ns-3 hinweist, aber fĂŒr diejenigen, die eine vollstĂ€ndige Installation wĂŒnschen, stellt das Projekt ein Wiki bereit, das Seiten mit vielen nĂŒtzlichen Tipps und RatschlĂ€gen enthĂ€lt. Eine solche Seite ist die Seite "Installation" mit Installationsanweisungen fĂŒr verschiedene Systeme, die unter folgender Adresse verfĂŒgbar sind:Der Abschnitt "Voraussetzungen" auf dieser Wiki-Seite erklĂ€rt, welche Pakete erforderlich sind, um die allgemeinen Optionen von ns-3 zu unterstĂŒtzen, und bietet die Befehle zum Installieren dieser Pakete in gĂ€ngigen Linux- oder macOS-Varianten. .
Sie können die Möglichkeit nutzen, die ns-3-Wiki-Seite oder die Hauptwebsite zu erkunden:
, da dort viele Informationen vorhanden sind. Beginnend mit der letzten Version von ns-3 (ns-3.29) sind folgende Werkzeuge erforderlich, um ns-3 auszufĂŒhren: Werkzeug Paket/version
C++-Compiler
- clang++ oder g++ (g++ Version 4.9 oder höher)
python2 Version >= 2.7.10 oder python3 Version >=3.4 - Python
jede aktuelle Version (fĂŒr den Zugriff auf ns-3 auf GitLab.com) - Git
jede aktuelle Version (zum Entpacken der ns-3-Version) - tar
bunzip2 - jede aktuelle Version (zum Entpacken der ns-3-Version)
Um die standardmĂ€Ăig installierte Python-Version zu ĂŒberprĂŒfen, geben Sie ein:
python -V python -V. Um die Version von g++ zu ĂŒberprĂŒfen, geben Sie ein g++ -v. Wenn einige Werkzeuge fehlen oder zu alt sind, konsultieren Sie das Installationshandbuch auf der nsâ3-Wiki-Seite.
Ab diesem Punkt gehen wir davon aus, dass der Leser auf Linux, MacOS oder einem Linux-Emulator arbeitet und zumindest die oben genannten Werkzeuge hat.
3.2.1 Herunterladen des ns-3 Releases als Quellarchiv
Dies ist die Vorgehensweise fĂŒr einen neuen Benutzer, der die neuesten Release- und Paketversionen von nsâ3 herunterladen und ausprobieren möchte. Die nsâ3-Releases werden in Form von komprimierten Quellarchiven veröffentlicht, die manchmal als tarball. tarball bezeichnet werden â ein spezielles Format fĂŒr Softwarearchive, in dem mehrere Dateien zusammengefasst sind. Das Archiv ist normalerweise komprimiert. Der Download von nsâ3 ist tarball einfach, Sie mĂŒssen nur das Release auswĂ€hlen, es herunterladen und entpacken.
Angenommen, Sie möchten als Benutzer nsâ3 in einem lokalen Verzeichnis mit dem Namen workspace. Sie können eine Arbeitskopie des Releases erhalten, indem Sie in der Linux-Konsole Folgendes eingeben (natĂŒrlich ersetzen Sie die entsprechenden Versionsnummern)
$ 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 Beachten Sie das oben verwendete Hilfsprogramm wget, das ein Befehlszeilentool zum Herunterladen von Objekten aus dem Internet ist. Wenn Sie es nicht installiert haben, können Sie dafĂŒr auch den Browser verwenden.
Wenn Sie diesen Schritten folgen, gelangen Sie in das Verzeichnis ns-allinone-3.29, wo Sie mehrere Dateien und Verzeichnisse sehen sollten.
$ 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.pyJetzt sind Sie bereit, das Basisdistribution von nsâ3 zu erstellen, und können zum Abschnitt ĂŒber das Erstellen von nsâ3 wechseln.
3.3 ns-3 mit Git herunterladen
Der nsâ3-Code ist in den Git-Repositories auf GitLab.com unter folgender Adresse verfĂŒgbar . Die Gruppe nsnam vereint verschiedene Repositories, die im Open-Source-Projekt verwendet werden.
Der einfachste Weg, um mit den Git-Repositories zu beginnen, besteht darin, ein Fork zu erstellen oder das nsâ3-allinonezu klonen. Dies ist eine Sammlung von Skripten, die das Herunterladen und Erstellen der am hĂ€ufigsten verwendeten nsâ3-Subsysteme verwaltet. Wenn Sie neu bei Git sind, sind die Begriffe "Fork" und "Klonen" möglicherweise nicht vertraut; wenn dem so ist, empfehlen wir Ihnen einfach, das Repository auf GitLab.com zu klonen (eine eigene Kopie zu erstellen) folgendermaĂen:
$ cd
$ mkdir workspace
$ cd workspace
$ git clone https://gitlab.com/nsnam/ns-3-allinone.git
$ cd ns-3-allinone An diesem Punkt sehen Sie das Verzeichnis nsâ3-allinone unterscheidet sich geringfĂŒgig von dem oben beschriebenen Verzeichnis mit dem Release-Archiv. Es sollte ungefĂ€hr so aussehen:
$ ls
build.py constants.py download.py README util.pyAchten Sie auf das Vorhandensein des Skripts download.py, das zusÀtzlich ns-3 und den dazugehörigen Quellcode extrahiert. Hier haben Sie die Wahl: entweder die neueste Entwicklungs-Snapshot von ns-3 herunterzuladen:
$ python download.pyoder bevorzugen Sie das Release von ns-3, indem Sie das Flag -n verwenden, um die Release-Nummer anzugeben:
$ python download.py -n ns-3.29Nach diesem Schritt werden zusĂ€tzliche Repositories in das Verzeichnis nsâ3-allinone heruntergeladen: ns-3, bake, pybindgen und netanim.
Hinweis
Auf einer Maschine mit reinem Ubuntu 16.04 musste ich den Befehl wie folgt Ă€ndern: $ sudo python3 download.py -n ns-3.29 (hier und im Folgenden die Anmerkungen des Ăbersetzers).
3.3.1 ns-3 mit Bake herunterladen
Die beiden oben genannten Methoden (Archiv des Quellcodes oder Repository nsâ3-allinone ĂŒber Git) sind nĂŒtzlich, um eine möglichst einfache Installation von ns-3 mit einigen Add-ons zu erhalten (pybindgen zur Generierung von Python-Bindungen und netanim zur Animation von Netzwerken). Das dritte Repository, das standardmĂ€Ăig in ns-3-allinone bereitgestellt wird, heiĂt bake.
Bake â ein Werkzeug zur koordinierten Erstellung von Software aus mehreren Repositories, das fĂŒr das ns-3-Projekt entwickelt wurde. Bake kann verwendet werden, um Entwickler-Versionen von ns-3 zu erhalten sowie um Erweiterungen der Basisversion des ns-3-Distributionspakets herunterzuladen und zu bauen, wie z.B. die Umgebung Direct Code Execution, CradleNetwork Simulation Cradle, die Möglichkeit, neue Python-Bindungen zu erstellen, und verschiedene âAnwendungenâ von ns-3.
Hinweis
CradleNetwork Simulation Cradle ist ein Framework, das es ermöglicht, innerhalb des Netzwerksimulators echte Netzwerk-Stacks TCP/IP zu verwenden.
Wenn Sie annehmen, dass Ihre ns-3-Installation erweiterte oder zusÀtzliche Funktionen haben sollte, können Sie diesen Installationsweg folgen.
In den letzten Releases von ns-3 Bake wurde der tar-Release. Im Release ist eine Konfigurationsdatei enthalten, die es ermöglicht, die zum Zeitpunkt der Erstellung des Releases aktuellen Versionen der Software herunterzuladen. Das heiĂt, zum Beispiel die Version Bake, die mit dem Release von ns-3.29 herausgegeben wird, kann verwendet werden, um Komponenten fĂŒr dieses ns-3-Release oder frĂŒhere zu erhalten, darf jedoch nicht verwendet werden, um Komponenten fĂŒr spĂ€tere Releases zu extrahieren (es sei denn, die Paketbeschreibung bakeconf.xml wurde aktualisiert).
Sie können auch die aktuellste Kopie erhalten bake, indem Sie den folgenden Befehl in Ihre Linux-Konsole eingeben (vorausgesetzt, Sie haben Git installiert):
$ cd
$ mkdir workspace
$ cd workspace
$ git clone https://gitlab.com/nsnam/bake.gitWĂ€hrend der AusfĂŒhrung des Befehls git sollten Sie etwas Ăhnliches sehen:
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.Nach Abschluss des Befehls clone sollten Sie ein Verzeichnis mit dem Namen bakesehen, dessen Inhalt ungefÀhr so aussehen sollte:
$ cd bake
$ ls
bake bakeconf.xml bake.py doc examples generate-binary.py test TODOBitte beachten Sie, dass Sie mehrere Python-Skripte, ein Python-Modul namens bake und eine XML-Konfigurationsdatei heruntergeladen haben. Der nÀchste Schritt besteht darin, diese Skripte zu verwenden, um das ns-3-Paket Ihrer Wahl herunterzuladen und zu erstellen. Es gibt mehrere Konfigurationsziele:
ns-3.29: ein Modul, das der Veröffentlichung entspricht; es wird Komponenten herunterladen, die der Veröffentlichung im Tarball Àhnlich sind;
ns-3-dev: ein Àhnliches Modul, aber mit Code aus dem Entwicklungssystem;
ns-allinone-3.29: ein Modul, das zusĂ€tzliche Funktionen wie Click-Routing und Network Simulation Cradle, Openflow fĂŒr ns-3 beinhaltet.
nsâ3-allinone: Ă€hnlich der Release-Version des Moduls allinone, jedoch fĂŒr den Entwicklungscode.
Hinweis
Click â eine modulare Softwarearchitektur zur Erstellung von Routern.
Openflow ist ein Protokoll zur Verwaltung des Datenverarbeitungsprozesses, der Daten ĂŒber Netze von Routern und Switches ĂŒbertrĂ€gt, und implementiert die Technologie des softwarekonfigurierten Netzwerks.
Der aktuelle Entwicklungs-Snapshot (nicht veröffentlicht) von ns-3 ist zu finden unter:.
Die Entwickler bemĂŒhen sich, diese Repositories in einem konsistenten Arbeitszustand zu halten, aber sie befinden sich im Entwicklungsbereich und enthalten nicht veröffentlichten Code, daher sollten Sie, wenn Sie keine neuen Funktionen nutzen möchten, die offizielle Veröffentlichung wĂ€hlen.
Sie finden die neueste Version des Codes, indem Sie die Liste der Repositories durchsuchen oder auf die Webseite âns-3 Releasesâ gehen: und auf den Link zur neuesten Version klicken. In diesem Beispiel fahren wir mit ns-3.29 fort.
Um nun die notwendigen Komponenten von ns-3 zu erhalten, verwenden wir das Tool Bake. Lassen Sie uns ein paar einleitende Worte zur Funktionsweise sagen. Bake.
Bake funktioniert, indem es die Quellcodes der Pakete in das Verzeichnis source lĂ€dt und die Bibliotheken in das Build-Verzeichnis installiert. Bake kann gestartet werden, indem auf die BinĂ€rdatei verwiesen wird, aber wenn Sie möchten, dass Bake nicht aus dem Verzeichnis, in das er hochgeladen wurde, fĂŒgen Sie bitte den Pfad zu bake Ihrem Pfad (Umgebungsvariable PATH) hinzu, zum Beispiel wie folgt (Beispiel fĂŒr die Linux-Bash-Shell). Wechseln Sie in das Verzeichnis âbakeâ und setzen Sie dann die folgenden Umgebungsvariablen:
$ export BAKE_HOME=`pwd`
$ export PATH=$PATH:$BAKE_HOME:$BAKE_HOME/build/bin
$ export PYTHONPATH=$PYTHONPATH:$BAKE_HOME:$BAKE_HOME/build/libDies wird das Programm bake.py in den Shell-Pfad setzen und es anderen Programmen ermöglichen, die ausfĂŒhrbaren Dateien und Bibliotheken zu finden, die erstellt wurden bake. In einigen VerwendungsfĂ€llen ist die oben beschriebene Einrichtung von PATH und PYTHONPATH nicht erforderlich, aber fĂŒr eine vollstĂ€ndige Installation von ns-3-allinone (mit zusĂ€tzlichen Paketen) ist sie normalerweise notwendig. bakeGehen Sie in das Arbeitsverzeichnis und geben Sie in der Konsole Folgendes ein:
$ ./bake.py configure -e ns-3.29
Als NĂ€chstes werden wir Sie bitten, zu ĂŒberprĂŒfen, ob wir die benötigten Werkzeuge zum Herunterladen der verschiedenen Komponenten haben. Geben Sie ein:$ ./bake.py check Bake Sie sollten etwas sehen wie das Folgende:
> Python - OK
> GNU C++ Compiler - OK
> Mercurial - OK
> Git - OK
> Tar-Tool - OK
> Unzip-Tool - OK
> Make - OK
> cMake - OK
> Patch-Tool - OK
> Gesuchter Pfad fĂŒr Werkzeuge: /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin ...Insbesondere sind die Download-Tools wie Mercurial, CVS, Git und Bazaar in diesem Schritt entscheidend, da sie es uns ermöglichen, den Code zu erhalten. Stellen Sie in diesem Schritt sicher, dass Sie die fehlenden Werkzeuge auf die ĂŒbliche Weise fĂŒr Ihr System installieren (wenn Sie können) oder wenden Sie sich an Ihren Systemadministrator.
Versuchen Sie weiter, die Software herunterzuladen:$ ./bake.py download
Das Ergebnis sollte etwa so aussehen:
>> Suche nach SystemabhÀngigkeit setuptools - OK
>> Suche nach SystemabhÀngigkeit libgoocanvas2 - OK
>> Suche nach SystemabhÀngigkeit gi-cairo - OK
>> Suche nach SystemabhÀngigkeit pygobject - OK
>> Suche nach SystemabhÀngigkeit pygraphviz - OK
>> Suche nach SystemabhÀngigkeit python-dev - OK
>> Suche nach SystemabhÀngigkeit qt - OK
>> Suche nach SystemabhÀngigkeit g++ - OK
>> Herunterladen von pybindgen-0.19.0.post4+ng823d8b2 (Zieldirectory: pybindgen) - OK
>> Herunterladen von netanim-3.108 - OK
>> Herunterladen von ns-3.29 - OKDas wĂŒrde bedeuten, dass drei Quellpakete heruntergeladen wurden. Wechseln Sie nun in das Verzeichnis source und geben Sie ls ein; Sie sollten sehen:
$ cd source
$ ls
netanim-3.108 ns-3.29 pybindgenJetzt sind Sie bereit, die ns-3 Distribution zu erstellen.
Wie beim Herunterladen von ns-3 gibt es mehrere Möglichkeiten, ns-3 zu erstellen. Das Wichtigste ist, dass wir betonen möchten, dass ns-3 mit einem Werkzeug namensWaf
3.4 ns-3 kompilieren
, das unten beschrieben wird, erstellt wird. Die meisten Benutzer werden damit arbeiten. Waf, wie unten beschrieben. Die meisten Benutzer werden damit arbeiten. Waf, aber es gibt mehrere nĂŒtzliche Skripte, die Ihnen helfen können, zu beginnen oder komplexere Builds zu organisieren. Bitte lesen Sie daher zuerst ĂŒber Waf, schauen Sie sich build.py und das Builden mit bake.
3.4.1 Kompilierung mit build.py
Achtung! Dieser Build-Schritt ist nur aus der oben beschriebenen Version des Quellarchivs verfĂŒgbar; nicht aus dem ĂŒber git oder bake heruntergeladenen.
Beim Arbeiten mit dem Release-Archiv tarball, in nsâ3âallinone gibt es ein nĂŒtzliches Skript, das das Builden der Komponenten erleichtern kann. Es heiĂt build.py. Dieses Programm richtet das Projekt fĂŒr Sie auf die nĂŒtzlichste Weise ein. Beachten Sie jedoch, dass kompliziertere Einstellungen und die Arbeit mit nsâ3 in der Regel die Verwendung des eigenen Build-Systems von nsâ3, Waf, beinhalten, das spĂ€ter in diesem Handbuch vorgestellt wird.
Wenn Sie den Download mit tarball, sollte in Ihrem Verzeichnis ~\/workspace ein Verzeichnis mit einem Namen wie ns-allinone-3.29erstellt worden sein. Geben Sie Folgendes ein:
$ .\/build.py --enable-examples --enable-tests
Beim Aufruf von build.py haben wir Argumente fĂŒr die Befehlszeile verwendet, um die in diesem Handbuch verwendeten Beispiele und Tests zu bauen, die in nsâ3 standardmĂ€Ăig nicht kompiliert werden. StandardmĂ€Ăig erstellt das Programm auch alle verfĂŒgbaren Module. Sie können nsâ3 spĂ€ter ohne Beispiele und Tests oder Module, die Sie fĂŒr Ihre Arbeit nicht benötigen, bauen.
Sie werden viele Compiler-Ausgaben sehen, die vom Skript beim Kompilieren der verschiedenen von Ihnen heruntergeladenen Teile angezeigt werden. Zuerst versucht das Skript, den Animator zu kompilieren netanim, dann den Bindungs-Generator pybindgen und schlieĂlich nsâ3. Am Ende des Prozesses sollten Sie Folgendes sehen:
Waf: Verlasse das Verzeichnis '\/path\/to\/workspace\/ns-allinone-3.29\/ns-3.29\/build'\n'build' wurde erfolgreich abgeschlossen (6m25.032s) \n\nModule gebaut:\nantenne aodv anwendungen\nbrĂŒcke gebĂ€ude konfigurationsspeicher\nkern csma csma-layout\ndsdv dsr energie \nfd-net-device flussmonitor internet\ninternet-apps lr-wpan lte\nmesh mobilitĂ€t mpi\nnetanim (kein Python) netzwerk nix-vektor-routing \nolsr punkt-zu-punkt punkt-zu-punkt-layout \nverbreitung sixlowpan spektrum \nstatistiken tap-brĂŒcke test (kein Python) \ntopologie-lesen verkehrssteuerung uan \nvirtuelles-netzwerkgerĂ€t visualizer wellen \nwifi wimax \n\nNicht gebaute Module (siehe ns-3-Tutorial zur ErklĂ€rung):\nbrite click openflow \nVerlasse das Verzeichnis .\/ns-3.29In den letzten drei Zeilen des Listings sehen wir eine Meldung ĂŒber die Module, die nicht gebaut wurden:
Module nicht gebaut (siehe ns-3-Tutorial fĂŒr ErklĂ€rungen):
brite clickDas bedeutet einfach, dass einige nsâ3-Module, die von externen Bibliotheken abhĂ€ngen, möglicherweise nicht gebaut wurden, oder dass ihr Bau fĂŒr diese Konfiguration nicht erforderlich ist. Das bedeutet nicht, dass der Simulator nicht gebaut wurde oder dass die gebauten Module fehlerhaft arbeiten werden.
3.4.2 Kompilierung mit Bake
Wenn Sie oben zur Abrufung des Quellcodes aus den Projektrepositorys bake verwendet haben, können Sie es weiterhin zum Bauen von nsâ3 verwenden. Geben Sie ein:
$ .\/bake.py buildund Sie sollten etwas sehen wie:
>> Building pybindgen-0.19.0.post4+ng823d8b2 - OK
>> Building netanim-3.108 - OK
>> Building ns-3.29 - OKHinweis: Sie können auch beide Schritte, das Herunterladen und das Bauen, gleichzeitig ausfĂŒhren, indem Sie âbake.py deployâ aufrufen.
Beim Bau aller Komponenten können Fehler auftreten, aber der Bau wird fortgesetzt, wenn die Komponente nicht erforderlich ist. Zum Beispiel gab es ein aktuelles Portierproblem, das darin bestand, dass castxml von dem Werkzeug bake nicht auf allen Plattformen gebaut werden kann. In diesem Fall wird eine Nachricht ausgegeben wie:
>> Building castxml - Problem
> Problem: Optionale AbhÀngigkeit, Modul "castxml" fehlgeschlagen
Dies kann die FunktionalitÀt des Endbaus reduzieren.
Dennoch wird bake fortfahren, da "castxml" keine wesentliche AbhÀngigkeit ist.
FĂŒr weitere Informationen rufen Sie bake mit -v oder -vvv im vollen ausfĂŒhrlichen Modus auf.scheint castxml ist nur erforderlich, wenn Sie aktualisierte Python-Bindungen erstellen möchten. FĂŒr die meisten Benutzer ist das nicht notwendig (zumindest bis sie nsâ3 Ă€ndern), sodass solche Warnungen vorĂŒbergehend sicher ignoriert werden können.
Wenn ein Fehler auftritt, gibt Ihnen der folgende Befehl einen Hinweis auf fehlende AbhÀngigkeiten:
$ .\/bake.py showEs werden verschiedene PaketabhÀngigkeiten aufgelistet, die Sie zu bauen versuchen.
3.4.3 Kompilierung mit Waf
Bis zu diesem Zeitpunkt haben wir entweder das Script build.py, oder das Tool bake. Diese Werkzeuge sind nĂŒtzlich, um nsâ3 zu bauen und Bibliotheken zu verwalten. TatsĂ€chlich starten sie zum Bauen das Build-Werkzeug Waf aus dem Verzeichnis nsâ3. Waf wird zusammen mit dem Quellcode von nsâ3 installiert. Die meisten Benutzer wechseln schnell zu einer direkten Nutzung Waf. Bitte wechseln Sie also zum nsâ3-Verzeichnis, das Sie ursprĂŒnglich erstellt haben.
Zurzeit ist es nicht zwingend erforderlich, aber es wĂ€re nĂŒtzlich, einen kurzen Ausblick zu geben und zu zeigen, wie man Ănderungen an der Projektkonfiguration vornimmt. Wahrscheinlich ist die nĂŒtzlichste Ănderung der Konfiguration, die Sie vornehmen können, die Erstellung einer optimierten Version des Codes. StandardmĂ€Ăig haben Sie Ihr Projekt fĂŒr den Bau einer Debug-Version konfiguriert. Lassen Sie uns das Projekt fĂŒr die Erstellung einer optimierten Version betrachten. Um Waf zu erklĂ€ren, dass er optimierte Versionen mit Beispielen und Tests erstellen soll, mĂŒssen Sie die folgenden Befehle ausfĂŒhren:
$ ./waf clean
$ ./waf configure --build-profile=optimized --enable-examples --enable-testsDies wird Waf auĂerhalb des lokalen Verzeichnisses ausgefĂŒhrt (zu Ihrem Komfort). Der erste Befehl fĂŒhrt eine Bereinigung der vorherigen Builds durch, das ist normalerweise nicht zwingend notwendig, aber es ist eine gute Praxis (siehe auch die Build-Profile weiter unten); dies entfernt zuvor erstellte Bibliotheken und Objektdateien im Verzeichnis build/. Wenn das Projekt neu konfiguriert ist und das Build-System die verschiedenen AbhĂ€ngigkeiten ĂŒberprĂŒft, sollten Sie eine Ausgabe sehen, die etwa wie folgt aussieht:
Top gesetzt auf : /home/ns3user/workspace/bake/source/ns-3-dev
Ziel gesetzt auf : /home/ns3user/workspace/bake/source/ns-3-dev/build
ĂberprĂŒfe 'gcc' (C-Compiler) : /usr/bin/gcc
ĂberprĂŒfe cc Version : 7.3.0
ĂberprĂŒfe 'g++' (C++-Compiler) : /usr/bin/g++
ĂberprĂŒfe Kompilierungsflag -march=native UnterstĂŒtzung : ok
ĂberprĂŒfe Kompilierungsflag -Wl,--soname=foo UnterstĂŒtzung : ok
ĂberprĂŒfe Kompilierungsflag -std=c++11 UnterstĂŒtzung : ok
ĂberprĂŒfe Boost-Includes : Header nicht gefunden, bitte eine --boost-includes Argument angeben (siehe Hilfe)
ĂberprĂŒfe Boost-Includes : Header nicht gefunden, bitte eine --boost-includes Argument angeben (siehe Hilfe)
ĂberprĂŒfe Programm 'python' : /usr/bin/python
ĂberprĂŒfe Python-Version >= 2.3 : 2.7.15 python-config : /usr/bin/python-config
Frage python-config nach pyembed '--cflags --libs --ldflags' Flags : ja
Teste pyembed Konfiguration : ja
Frage python-config nach pyext '--cflags --libs --ldflags' Flags : ja
Teste pyext Konfiguration : ja
ĂberprĂŒfe Kompilierungsflag -fvisibility=hidden UnterstĂŒtzung : ok
ĂberprĂŒfe Kompilierungsflag -Wno-array-bounds UnterstĂŒtzung : ok
ĂberprĂŒfe pybindgen Standort : ../pybindgen ,!(geschĂ€tzt)
ĂberprĂŒfe Python-Modul 'pybindgen' : 0.19.0. ,!post4+g823d8b2
ĂberprĂŒfe pybindgen Version : 0.19.0. ,!post4+g823d8b2
ĂberprĂŒfe Code-Schnipsel : ja
ĂberprĂŒfe Typen uint64_t und unsigned long Ăquivalenz : nein
ĂberprĂŒfe Code-Schnipsel : nein
ĂberprĂŒfe Typen uint64_t und unsigned long long Ăquivalenz : ja
ĂberprĂŒfe die apidefs, die fĂŒr Python-Bindungen verwendet werden können : gcc-LP64
ĂberprĂŒfe internes GCC cxxabi : vollstĂ€ndig
ĂberprĂŒfe Python-Modul 'pygccxml' : nicht gefunden
ĂberprĂŒfe Klickstandort : nicht gefunden
ĂberprĂŒfe Programm 'pkg-config' : /usr/bin/pkg-config
ĂberprĂŒfe 'gtk+-3.0' : nicht gefunden
ĂberprĂŒfe 'libxml-2.0' : ja
ĂberprĂŒfe uint128_t : nicht gefunden
ĂberprĂŒfe __uint128_t : ja
ĂberprĂŒfe HochprĂ€zision-Implementierung : 128-Bit Ganzzahl ,!(Standard)
ĂberprĂŒfe Header stdint.h : ja
ĂberprĂŒfe Header inttypes.h : ja
ĂberprĂŒfe Header sys/inttypes.h : nicht gefunden
ĂberprĂŒfe Header sys/types.h : ja
ĂberprĂŒfe Header sys/stat.h : ja
ĂberprĂŒfe Header dirent.h : ja
ĂberprĂŒfe Header stdlib.h : ja
ĂberprĂŒfe Header signal.h : ja
ĂberprĂŒfe Header pthread.h : ja
ĂberprĂŒfe Header stdint.h : ja
ĂberprĂŒfe Header inttypes.h : ja
ĂberprĂŒfe Header sys/inttypes.h : nicht gefunden
ĂberprĂŒfe Bibliothek rt : ja
ĂberprĂŒfe Header sys/ioctl.h : ja
ĂberprĂŒfe Header net/if.h : ja
ĂberprĂŒfe Header net/ethernet.h : ja
ĂberprĂŒfe Header linux/if_tun.h : ja
ĂberprĂŒfe Header netpacket/packet.h : ja
ĂberprĂŒfe NSC Standort : nicht gefunden
ĂberprĂŒfe 'sqlite3' : nicht gefunden
ĂberprĂŒfe Header linux/if_tun.h : ja
ĂberprĂŒfe Python-Modul 'gi' : 3.26.1
ĂberprĂŒfe Python-Modul 'gi.repository.GObject' : ok
ĂberprĂŒfe Python-Modul 'cairo' : ok
ĂberprĂŒfe Python-Modul 'pygraphviz' : 1.4rc1
ĂberprĂŒfe Python-Modul 'gi.repository.Gtk' : ok
ĂberprĂŒfe Python-Modul 'gi.repository.Gdk' : ok
ĂberprĂŒfe Python-Modul 'gi.repository.Pango' : ok
ĂberprĂŒfe Python-Modul 'gi.repository.GooCanvas' : ok
ĂberprĂŒfe Programm 'sudo' : /usr/bin/sudo
ĂberprĂŒfe Programm 'valgrind' : nicht gefunden
ĂberprĂŒfe 'gsl' : nicht gefunden python-config : nicht gefunden
ĂberprĂŒfe Kompilierungsflag -fstrict-aliasing UnterstĂŒtzung : ok
ĂberprĂŒfe Kompilierungsflag -fstrict-aliasing UnterstĂŒtzung : ok
ĂberprĂŒfe Kompilierungsflag -Wstrict-aliasing UnterstĂŒtzung : ok
ĂberprĂŒfe Kompilierungsflag -Wstrict-aliasing UnterstĂŒtzung : ok
ĂberprĂŒfe Programm 'doxygen' : /usr/bin/doxygen
---- Zusammenfassung der optionalen ns-3 Funktionen:
Build-Profil : optimiert
Build-Verzeichnis :
BRITE-Integration : nicht aktiviert (BRITE nicht aktiviert (siehe Option --with-brite))
DES-Metriken-Ereignissammlung : nicht aktiviert (Standard ist deaktiviert)
Emulation FdNetDevice : aktiviert
Beispiele : aktiviert
Dateideskriptor NetDevice : aktiviert
GNU-Wissenschaftsbibliothek (GSL) : nicht aktiviert (GSL nicht gefunden)
Gcrypt-Bibliothek : nicht aktiviert
(libgcrypt nicht gefunden: Sie können ,!libgcrypt-config verwenden, um den Speicherort zu finden.) GtkConfigStore : nicht aktiviert (Bibliothek 'gtk+-3.0 >= 3.0' nicht gefunden)
MPI-UnterstĂŒtzung : nicht aktiviert (Option --enable-mpi nicht ausgewĂ€hlt)
ns-3 Click-Integration : nicht aktiviert (nsclick nicht aktiviert (siehe Option --with-nsclick))
ns-3 OpenFlow-Integration : nicht aktiviert (Erforderliche Boost-Bibliotheken nicht gefunden)
Netzwerksimulation wie Wiege : nicht aktiviert (NSC nicht gefunden (siehe Option --with-nsc))
PlanetLab FdNetDevice : nicht aktiviert (PlanetLab-Betriebssystem nicht erkannt ,!(siehe Option --force-planetlab)) PyViz-Visualizer : aktiviert
Python API-Scanning-UnterstĂŒtzung : nicht aktiviert (Fehlendes 'pygccxml' Python-Modul)
Python-Bindungen : aktiviert
Echtzeitsimulator : aktiviert
SQlite-Statistiken-Ausgabe : nicht aktiviert (Bibliothek 'sqlite3' nicht gefunden)
Tap-BrĂŒcke : aktiviert
Tap FdNetDevice : aktiviert
Tests : aktiviert
Threading-Primitiven : aktiviert
Verwenden Sie sudo, um das suid-Bit festzulegen : nicht aktiviert (Option --enable-sudo nicht ausgewÀhlt)
XmlIo : aktiviert
'configure' erfolgreich abgeschlossen (6.387s)Beachten Sie den letzten Teil des oben angegebenen Listings. Einige ns-3 Optionen sind standardmĂ€Ăig nicht aktiviert oder benötigen UnterstĂŒtzung vonseiten des Systems fĂŒr ein korrektes Funktionieren. Um zum Beispiel XmlTo zu aktivieren, muss die Bibliothek libxml-2.0im System vorhanden sein. Wenn diese Bibliothek nicht gefunden wurde und die entsprechende ns-3-Funktion nicht aktiviert wurde, wird eine Meldung angezeigt. AuĂerdem sollten Sie beachten, dass es möglich ist, den Befehl sudo zu verwenden, um das SUID-Bit âSetuid-Gruppen-ID zur Laufzeitâ fĂŒr bestimmte Programme zu setzen. Dies ist standardmĂ€Ăig nicht aktiviert, wodurch diese Funktion als ânicht aktiviertâ angezeigt wird. SchlieĂlich können Sie eine Liste der aktivierten Optionen mit Waf und dem Parameter --check-config.
anzeigen. Kommen wir nun zurĂŒck und wechseln zurĂŒck zur Debug-Build, die Beispiele und Tests enthĂ€lt.
$ ./waf clean
$ ./waf configure --build-profile=debug --enable-examples --enable-testsDas Build-System ist nun konfiguriert, und Sie können Debug-Versionen der ns-3-Programme einfach erstellen, indem Sie eintippen:
$ ./wafDie oben beschriebenen Schritte haben Sie möglicherweise dazu gebracht, einen Teil des ns-3 Systems zweimal zu erstellen, aber jetzt wissen Sie, wie Sie die Konfiguration Àndern und optimierten Code erstellen können.
Um zu ĂŒberprĂŒfen, welches Profil fĂŒr diese Projektkonfiguration aktiv ist, gibt es den Befehl:
$ ./waf --check-profile
Waf: Betritt das Verzeichnis `/path/to/ns-3-allinone/ns-3.29/build`
Build-Profil: debugDas oben betrachtete Szenario build.py unterstĂŒtzt auch die Argumente --enable-examples und --enable-tests, aber andere Optionen Waf unterstĂŒtzt es nicht direkt. Zum Beispiel wird dies nicht funktionieren:
$ ./build.py --disable-pythondie Ausgabe wird sein:
build.py: error: no such option: --disable-pythonDennoch kann der spezielle Operator -- verwendet werden, um zusĂ€tzliche Parameter ĂŒber wafzu ĂŒbermitteln. Daher wĂŒrde anstelle des oben genannten der folgende Befehl funktionieren:
$ ./build.py -- --disable-pythonda er den Hauptbefehl generiert ./waf configure âdisable-python. Hier sind noch einige einfĂŒhrende Tipps zur Waf.
Fehlerbehandlung beim Build
Die Releases von ns-3 wurden auf den neuesten C++-Compilern getestet, die zum Zeitpunkt der Veröffentlichung in gĂ€ngigen Linux- und MacOS-Distributionen verfĂŒgbar sind. Im Laufe der Zeit werden jedoch neue Distributionen mit neuen Compilern veröffentlicht, und diese neueren Compiler sind in der Regel strenger bezĂŒglich Warnungen. ns-3 konfiguriert seinen Build so, dass alle Warnungen als Fehler behandelt werden, daher kann es manchmal vorkommen, dass eine Warnung des Compilers den Build stoppt, wenn Sie eine Ă€ltere Version in einem neueren System verwenden.
Zum Beispiel gab es frĂŒher das Release ns-3.28 fĂŒr Fedora 28, das eine neue Hauptversion beinhaltete. gcc (gcc-8). Der Build des Releases ns-3.28 oder frĂŒherer Versionen unter Fedora 28 mit installiertem Gtk2+ fĂŒhrt zu folgendem Fehler:
/usr/include/gtk-2.0/gtk/gtkfilechooserbutton.h:59:8: error: unnecessary parentheses ,!in declaration of â__gtk_reserved1â [-Werror=parentheses] void (*__gtk_reserved1);In den Releases ab ns-3.28.1 ist Waf eine Option verfĂŒgbar, um diese Probleme zu beheben. Sie deaktiviert das Setzen des Flags â-Werrorâ in g++ und clang++. Diese Option heiĂt ââdisable-werrorâ und sollte wĂ€hrend der Konfiguration angewendet werden:
$ ./waf configure --disable-werror --enable-examples --enable-testsKonfigurieren oder Bauen
Einige Befehle Waf sind nur in der Konfigurationsphase sinnvoll, wĂ€hrend andere nur in der Build-Phase wirken. Beispielsweise, wenn Sie die Emulationsfunktionen von ns-3 verwenden möchten, können Sie das Bit suid verwendend, sudowie oben beschrieben. Dies wird die Befehle der Konfigurationsphase auĂer Kraft setzen, und somit können Sie die Konfiguration mit folgendem Befehl Ă€ndern, der ebenfalls Beispiele und Tests einbezieht.
$ ./waf configure --enable-sudo --enable-examples --enable-testsWenn Sie dies tun, Waf wird sudo, um die Emulationscode-Sockets fĂŒr den Betrieb mit Rechten zu Ă€ndern. root. In Waf Es gibt viele weitere Optionen fĂŒr die Konfigurations- und Build-Phasen. Um die Möglichkeiten zu erkunden, geben Sie ein:
$ ./waf --helpIm nÀchsten Abschnitt werden wir einige testbezogene Optionen verwenden.
Build-Profile
Wir haben bereits gesehen, wie man Waf fĂŒr Builds debug und optimiert:
$ ./waf --build-profile=debugEs gibt auch ein intermischliches Build-Profil, release. Die Option -d ist ein Synonym fĂŒr --build-profile. Das Build-Profil steuert die Verwendung von Protokollierung, Assertions und Compiler-OptimierungsschlĂŒsseln:

Wie Sie sehen können, sind Logging und Assertions nur in Debug-Builds verfĂŒgbar. Die empfohlene Vorgehensweise besteht darin, Ihr Skript im Debug-Modus zu entwickeln und dann wiederholte DurchlĂ€ufe (fĂŒr Statistiken oder zur Ăndern von Parametern) im optimierten Build-Profil auszufĂŒhren.
Wenn Sie Code haben, der nur in bestimmten Build-Profilen ausgefĂŒhrt werden soll, verwenden Sie das Code Wrapper Macro:
NS_BUILD_DEBUG (std::cout << "Teil einer Ausgabzeile..." << std::flush; timer.Start ,!()); DoLongInvolvedComputation ();
NS_BUILD_DEBUG (timer.Stop (); std::cout << "Fertig: " << timer << std::endl;)StandardmĂ€Ăig Waf legt die Build-Artefakte im Build-Verzeichnis ab. Sie können ein anderes Ausgabeverzeichnis mit der Option -âŻ-out, zum Beispiel:
$ .\/waf configure --out=my-build-dirIndem Sie dies mit Build-Profilen kombinieren, können Sie leicht zwischen verschiedenen Kompilierungsoptionen wechseln:
$ .\/waf configure --build-profile=debug --out=build\/debug
$ .\/waf build
...
$ .\/waf configure --build-profile=optimized --out=build\/optimized
$ .\/waf build
...Was Ihnen ermöglicht, mit mehreren Builds zu arbeiten, ohne jedes Mal den letzten Build neu zu schreiben. Wenn Sie auf ein anderes Profil umschalten, Waf wird nur dieses kompiliert, ohne eine vollstÀndige Rekompilierung von allem.
Wenn Sie auf diese Weise zwischen Build-Profilen wechseln, mĂŒssen Sie darauf achten, jedem Mal dieselben Konfigurationsparameter zu geben. Dabei kann Ihnen die Definition mehrerer Umgebungsvariablen helfen:
$ 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 buildCompiler und Flags
In den obigen Beispielen Waf verwendet nsâ3 den C++ Compiler aus GCC ( g++). Es ist jedoch möglich, den verwendeten Waf C++ Compiler zu Ă€ndern, indem Sie die Umgebungsvariable CXX definieren. Zum Beispiel, um den C++ Compiler Clang, clang++, zu verwenden,
$ CXX="clang++" .\/waf configure
$ .\/waf build Ăhnlich können Sie Waf so konfigurieren, dass die verteilte Kompilierung mit distcc:
$ CXX="distcc g++" .\/waf configure
$ .\/waf buildWeitere Informationen zu distcc und verteilter Kompilierung finden Sie auf der Projektseite im Abschnitt âDokumentationâ. Um beim Konfigurieren von nsâ3 Compiler-Flags hinzuzufĂŒgen, verwenden Sie die Umgebungsvariable CXXFLAGS_EXTRA.
Installation
Waf kann verwendet werden, um Bibliotheken an verschiedenen Stellen im System zu installieren. StandardmĂ€Ăig befinden sich die gesammelten Bibliotheken und ausfĂŒhrbaren Dateien im Verzeichnis build, und da Waf den Speicherort dieser Bibliotheken und ausfĂŒhrbaren Dateien kennt, ist es nicht notwendig, die Bibliotheken irgendwo anders zu installieren.
Wenn die Benutzer eine Installation auĂerhalb des Build-Verzeichnisses bevorzugen, können sie den Befehl ./waf installausfĂŒhren. StandardmĂ€Ăig ist das PrĂ€fix fĂŒr die Installation - /usr/local, daher ./waf install werden Programme in /usr/local/bin, Bibliotheken in /usr/local/lib und Header-Dateien in /usr/local/includeinstalliert. Superuser-Rechte sind normalerweise erforderlich, um mit dem StandardprĂ€fix zu installieren, daher lautet ein typischer Befehl sudo ./waf install. Beim AusfĂŒhren wird Waf zunĂ€chst die gemeinsamen Bibliotheken im Build-Verzeichnis bevorzugen, dann wird er die Bibliotheken gemÀà dem Bibliothekspfad suchen, der in der lokalen Umgebung konfiguriert ist. Daher ist es eine gute Praxis, sicherzustellen, dass die richtigen Bibliotheken verwendet werden, wenn Bibliotheken im System installiert werden. Benutzer können eine Installation mit einem anderen PrĂ€fix wĂ€hlen, indem sie wĂ€hrend der Konfiguration die Option --prefix, zum Beispiel:
./waf configure --prefix=/opt/localĂŒbergeben. Wenn der Benutzer spĂ€ter, nach dem Build, den Installationsbefehl eingibt ./waf, wird das PrĂ€fix verwendet /opt/local.
Team ./waf clean sollte vor einer Neukonfiguration des Projekts verwendet werden, wenn zur Installation Waf ein anderes PrÀfix verwendet wird.
Daher ist es nicht notwendig, nsâ3 zu starten. ./waf installDie meisten Benutzer benötigen diesen Befehl nicht, da Waf die aktuellen Bibliotheken aus dem Build-Verzeichnis ĂŒbernehmen wird, einige Benutzer könnten es jedoch als nĂŒtzlich empfinden, wenn ihre TĂ€tigkeit das Arbeiten mit Programmen auĂerhalb des nsâ3-Verzeichnisses umfasst.
Waf ist einheitlich
Auf der obersten Ebene des nsâ3-Quellbaum gibt es nur ein Waf-Skript. Wenn Sie anfangen, werden Sie viel Zeit im Verzeichnis scratch/ oder tiefer insrc/... verbringen , und dabei mĂŒssen Sie möglicherweise Wafstarten. Sie können sich einfach merken, wo Sie sind, und Waf folgendermaĂen ausfĂŒhren:
$ ../../../../waf ...aber das wird mĂŒhsam und fehleranfĂ€llig, deshalb gibt es bessere Lösungen. Eine gĂ€ngige Methode ist die Verwendung eines Texteditors, wie Eclipse oder emacs, in dem zwei Terminal-Sitzungen geöffnet werden, eine fĂŒr das Bauen von nsâ3 und die andere zum Bearbeiten des Quellcodes. Wenn Sie nur tarball, kann eine Umgebungsvariable helfen:
$ export NS3DIR="$PWD"
$ function waff { cd $NS3DIR && .\/waf $* ; }
$ cd scratch
$ waff buildIm Verzeichnis des Moduls könnte es verlockend erscheinen, ein triviales Waf-Skript nach dem Muster hinzuzufĂŒgen exec ..\/..\/waf. Bitte tun Sie das nicht. Es verwirrt AnfĂ€nger und kann bei fehlerhafter AusfĂŒhrung zu schwer auffindbaren Build-Fehlern fĂŒhren. Die oben gezeigten Lösungen sind der Weg, der eingeschlagen werden sollte.
3.5 ns-3 testen
Sie können die Modul-Tests der ns-3-Distribution ausfĂŒhren, indem Sie das Skript .\/test.py:
$ .\/test.pyDiese Tests werden parallel zu WafdurchgefĂŒhrt. Am Ende sollten Sie eine Meldung sehen, dass
92 von 92 Tests bestanden (92 bestanden, 0 fehlgeschlagen, 0 abgestĂŒrzt, 0 Valgrind-Fehler)Diese Meldung ist wichtig, um AbstĂŒrze, Fehler oder Valgrind-Fehler zu identifizieren und weist auf Probleme im Code oder auf InkompatibilitĂ€t zwischen den Tools und dem Code hin.
Sie werden auch die Zusammenfassungsausgabe von Waf und dem Tester sehen, der jeden Test ausfĂŒhrt, die ungefĂ€hr so aussieht:
Waf: Verzeichnis betreten `\/path\/to\/workspace\/ns-3-allinone\/ns-3-dev\/build'
Waf: Verzeichnis verlassen `\/path\/to\/workspace\/ns-3-allinone\/ns-3-dev\/build'
'build' wurde erfolgreich abgeschlossen (1.799s)
Gebautes Modul:
aodv Anwendungen BrĂŒcke
click config-store Kern
csma csma-layout dsdv
emu Energie FlussĂŒberwachung
Internet lte Mesh
MobilitÀt mpi netanim
Netzwerk nix-vector-routing ns3tcp
ns3wifi olsr openflow
punkt-zu-punkt punkt-zu-punkt-layout Ausbreitung
spektrum Statistiken tap-bridge
vorlage Test Werkzeuge
topologie-lesen uan virtuelle-netzwerkgerÀt
Visualizer wifi wimax
PASS: TestSuite ns3-wifi-interference
PASS: TestSuite histogram
...
PASS: TestSuite object
PASS: TestSuite random-number-generators
92 von 92 Tests bestanden (92 bestanden, 0 fehlgeschlagen, 0 abgestĂŒrzt, 0 Valgrind-Fehler)
Dieses Kommando wird normalerweise von Nutzern ausgefĂŒhrt, um schnell die Richtigkeit des Builds der ns-3-Distribution zu ĂŒberprĂŒfen. (Beachten Sie, dass die Reihenfolge der Zeilen âPASS: ...â variieren kann, das ist normal. Wichtig ist, dass in der letzten Zeile am Ende des Berichts alle Tests bestanden wurden; kein Test ist fehlgeschlagen oder abgestĂŒrzt.) Und Waf, und test.py werden die Arbeiten unter den verfĂŒgbaren Kernen der Maschine parallelisiert.
3.6 Skript ausfĂŒhren
Normalerweise fĂŒhren wir Skripte unter Kontrolle von Waf. Das ermöglicht dem Build-System sicherzustellen, dass die Pfade zur gemeinsamen Bibliothek korrekt gesetzt sind und dass die Bibliotheken wĂ€hrend der AusfĂŒhrung verfĂŒgbar sind. Um das Programm zu starten, verwenden Sie einfach Waf und dem Parameter -âŻ-run. Lassen Sie uns fĂŒr ns-3 das Ăquivalent des allgegenwĂ€rtigen Programms hello world, indem Sie Folgendes eingeben:
$ .\/waf --run hello-simulatorWaf wird zunĂ€chst ĂŒberprĂŒfen, ob das Programm richtig kompiliert wurde, und bei Bedarf die Kompilierung durchfĂŒhren. Dann Waf wird es das Programm ausfĂŒhren, das die folgende Ausgabe erzeugt.
Hello SimulatorHerzlichen GlĂŒckwunsch! Sie sind jetzt ein Benutzer von ns-3!
Was soll ich tun, wenn ich das Ergebnis nicht sehe?
Wenn Sie Nachrichten sehen, Waf, die darauf hinweisen, dass die Kompilierung erfolgreich abgeschlossen wurde, aber keine Ausgabe sehen âHello Simulatorâ, besteht die Möglichkeit, dass Sie im Abschnitt [Kompilierung-mit-Waf] Ihren Kompilierungsmodus auf optimiert, aber das ZurĂŒckschalten in den Modus debugvergessen haben. Alle Konsolenausgaben, die in diesem Handbuch verwendet werden, nutzen eine spezielle Komponente von ns-3, die die Protokollierung durchfĂŒhrt, und werden verwendet, um benutzerdefinierte Nachrichten in die Konsole zu drucken. Die Ausgabe dieser Komponente ist automatisch deaktiviert, wenn optimierter Code kompiliert wird â er ist âoptimiertâ. Wenn Sie die Ausgabe âHello Simulatorâ nicht sehen, geben Sie Folgendes ein:
$ ./waf configure --build-profile=debug --enable-examples --enable-testsum Waf die Kompilierung von Debug-Versionen der ns-3-Programme, die Beispiele und Tests enthalten, einzustellen. Dann mĂŒssen Sie die aktuelle Debug-Version des Codes erneut kompilieren, indem Sie
$ ./wafJetzt, wenn Sie das Programm hello-simulator, ausfĂŒhren, sollten Sie das erwartete Ergebnis sehen.
3.6.1 Befehlszeilenargumente
Um Befehlszeilenargumente an das ns-3-Programm zu ĂŒbergeben, verwenden Sie dieses Muster:
$ ./waf --run --command-template="%s "Ersetzen Sie durch den Namen Ihres Programms und durch die Argumente. Das Argument -âŻcommand-template fĂŒr Waf ist im Wesentlichen ein Rezept zur Erstellung der tatsĂ€chlichen Befehlszeile Waf die zur AusfĂŒhrung des Programms verwendet wird. Waf ĂŒberprĂŒft, ob die Kompilierung abgeschlossen ist, stellt die Pfade zur gemeinsamen Bibliothek ein und ruft dann die ausfĂŒhrbare Datei auf, indem es das bereitgestellte Befehlszeilenmuster verwendet und den Programmnamen anstelle des Platzhalters %s einfĂŒgt. Wenn Ihnen diese Syntax kompliziert erscheint, gibt es eine einfachere Variante, die das ns-3-Programm und seine Argumente in einfache AnfĂŒhrungszeichen einschlieĂt:
$ ./waf --run ' --arg1=value1 --arg2=value2 ...'Ein weiteres, besonders nĂŒtzliches Beispiel ist die selektive AusfĂŒhrung von Test-Suites. Angenommen, es gibt eine Testsuite (suite) mytest (die es tatsĂ€chlich nicht gibt). Zuvor haben wir das Skript ./test.py verwendet, um eine Reihe von Tests parallel auszufĂŒhren, das mehrfach die Testprogramm test-runneraufruft. test-runner direkt zur AusfĂŒhrung eines Tests:
$ ./waf --run test-runner --command-template="%s --suite=mytest --verbose"Die Argumente werden an das Programm ĂŒbergeben test-runner. Da mytest nicht existiert, wird eine Fehlermeldung generiert. Um die verfĂŒgbaren Parameter von test-runner anzuzeigen, geben Sie ein:
$ ./waf --run test-runner --command-template="%s --help"3.6.2 Debugging
Um ns-3-Programme unter einer anderen Utility wie einem Debugger (z. B. gdb) oder einem SpeicherĂŒberprĂŒfungstool (z. B. valgrind), verwenden Sie eine Ă€hnliche Form -âŻ-command-template = "âŠ". Zum Beispiel, um den Debugger zu starten gdb Ihr Programm hello-simulator ns-3 mit den Argumenten:
$ ./waf --run=hello-simulator --command-template="gdb %s --args "Beachten Sie, dass der Name des ns-3-Programms mit dem Argument kommt -âŻ-run, und die Kontroll-Utility (hier gdb) ist das erste Token im Argument -âŻcommand-template. Die Option -âŻ-args berichtet gdb, wobei der Rest der Befehlszeile zur âniedrigerenâ Anwendung gehört. (Einige Versionen gdb verstehen die Option nicht, -âŻ-args. In diesem Fall entfernen Sie die Programmargumente von -âŻcommand-template und verwenden Sie den Befehlssatz gdb args.) Wir können dieses Rezept mit dem vorherigen kombinieren, um einen Test im Debugger zu starten:
$ ./waf --run test-runner --command-template="gdb %s --args --suite=mytest --verbose"3.6.3 Arbeitsverzeichnis
Waf sollte aus seinem Standort im Wurzelverzeichnis des ns-3-Baums gestartet werden. Dieser Ordner wird zum Arbeitsverzeichnis, in dem die Ausgabedateien geschrieben werden. Aber was ist, wenn Sie diese Dateien auĂerhalb des ns-3-Quellbaums speichern möchten? Verwenden Sie das Argument -âŻ-cwd:
$ ./waf --cwd=...Es könnte fĂŒr Sie bequemer sein, die Ausgabedateien in Ihrem Arbeitsverzeichnis zu erhalten. In diesem Fall könnte eine solche indirekte Handlung hilfreich sein:
$ function waff {
CWD="$PWD"
cd $NS3DIR >/dev/null
./waf --cwd="$CWD" $*
cd - >/dev/null
}Diese Dekorierung der vorherigen Befehlszeile speichert das aktuelle Arbeitsverzeichnis, wechselt in das Verzeichnis Waf, und weist dann Waf an, das Arbeitsverzeichnis vor dem Start des aktuellen Programms wieder auf das gespeicherte zu Ă€ndern. Wir erwĂ€hnen den Befehl -âŻ-cwd , um der VollstĂ€ndigkeit willen, die meisten Benutzer starten Waf einfach aus dem obersten Verzeichnis und generieren dort die Ausgabedateien.
Quelle: habr.com
