
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
