A Discrete-Event Network Simulator
Tutorial

Ξεκινώντας

Η ενότητα αυτή έχει στόχο να πάρει ένα χρήστη σε μια κατάσταση εργασίας ξεκινώντας με μια μηχανή που μπορεί να μην είχε ποτέ εγκαταστήσει τον ns-3. Καλύπτει υποστηριζόμενες πλατφόρμες, προϋποθέσεις, τους τρόπους να αποκτήσετε τον ns-3, τους τρόπους για να οικοδομήσετε τον ns-3, και τρόπους για να ελέγξετε την κατασκευή σας και να τρέξετε απλά προγράμματα.

Επισκόπηση

Ο ns-3 είναι χτισμένος ως ένα σύστημα βιβλιοθηκών λογισμικού που λειτουργούν μαζί. Τα προγράμματα χρηστών μπορούν να είναι γραμμένα τα οποία συνδέουν με (ή τις εισάγουν από) αυτές τις βιβλιοθήκες. Τα προγράμματα χρηστών γράφονται είτε σε C++ ή Python γλώσσες προγραμματισμού.

Ο ns-3 διανέμεται ως πηγαίος κώδικας, που σημαίνει ότι ο στόχος του συστήματος πρέπει να έχει ένα περιβάλλον ανάπτυξης λογισμικού για την κατασκευή αρχικά των βιβλιοθηκών, μετά χτίζετε το πρόγραμμα του χρήστη. Ο ns-3 θα μπορούσε αρχικά να διανέμεται ως προ-κατασκευασμένες βιβλιοθήκες για επιλεγμένα συστήματα, και στο μέλλον μπορεί να διανεμηθεί με αυτόν τον τρόπο, αλλά προς το παρόν, πολλοί χρήστες πραγματικά κάνουν τη δουλειά τους με την επεξεργασία του ns-3 όπως είναι, έτσι έχοντας τον πηγαίο κώδικα γύρω από την ανοικοδόμηση οι βιβλιοθήκες είναι χρήσιμες. Αν κάποιος θα ήθελε να αναλάβει την δουλειά προ-χτίζοντας βιβλιοθήκες και πακέτα για λειτουργικά συστήματα, παρακαλούμε επικοινωνήστε με τους NS-προγραμματιστές στην ενημερωτική λίστα.

Στη συνέχεια, θα δούμε δύο τρόπους για τη λήψη και την οικοδόμηση του ns-3. Το πρώτο είναι να κατεβάσετε και να οικοδομήσετε μια επίσημη έκδοση από την κύρια ιστοσελίδα. Το δεύτερο είναι να φέρετε και να οικοδομήσετε την ανάπτυξη αντιγράφων του ns-3. Θα δούμε δύο παραδείγματα καθώς τα εργαλεία που περιέχονται είναι λίγο διαφορετικά.

Κατεβάζοντας τον ns-3

Το σύστημα του ns-3 στο σύνολό του είναι ένα αρκετά πολύπλοκο σύστημα και έχει έναν αριθμό εξαρτήσεων από άλλες συνιστώσες. Μαζί με τα συστήματα που πιθανότατα θα ασχολείστε κάθε μέρα (η εργαλειοθήκη GNU, Mercurial, έναν επεξεργαστή κειμένου - editor) θα χρειαστεί να εξασφαλίσετε ότι είναι παρών στο σύστημά σας πριν προχωρήσετε μια σειρά από πρόσθετες βιβλιοθήκες. Ο ns-3 παρέχει μία wiki σελίδα που περιλαμβάνει σελίδες με πολλές χρήσιμες συμβουλές και υποδείξεις. Μια τέτοια σελίδα είναι η σελίδα «Εγκατάσταση», http://www.nsnam.org/wiki/Installation.

Η ενότητα “Προϋποθέσεις” αυτής της σελίδας του wiki εξηγεί ποια πακέτα απαιτούνται για την υποστήριξη κοινών επιλογών ns-3, και επίσης παρέχει τις εντολές που χρησιμοποιούνται για την εγκατάσταση των κοινών παραλλαγών του Linux. Οι χρήστες του Cygwin θα πρέπει να χρησιμοποιήσουν το πρόγραμμα εγκατάστασης Cygwin (αν είστε χρήστης Cygwin, το χρησιμοποιήσατε για να εγκαταστήστε Cygwin).

Μπορεί να θέλετε να εκμεταλλευτείτε αυτή την ευκαιρία για να εξερευνήσετε τον ns-3 στο wiki λίγο δεδομένου ότι υπάρχει πραγματικά μια πληθώρα πληροφοριών εκεί.

Από αυτό το σημείο προς τα εμπρός, πρόκειται να υποθέσουμε ότι ο αναγνώστης εργάζεται σε Linux ή σε ένα περιβάλλον εξομοίωσης Linux (Linux, Cygwin, κ.λπ.) και έχει εγκατεστημένη την GNU εργαλειοθήκη και έχει επαληθεύσει μαζί με τις προϋποθέσεις που αναφέρονται παραπάνω. Επίσης, πρόκειται να υποθέσουμε ότι έχετε το Mercurial και το Waf εγκατεστημένο και τρέχουν στο κυρίως σύστημα.

Ο ns-3 κώδικας είναι διαθέσιμος σε Mercurial αποθετήρια στον διακομιστή http://code.nsnam.org. Μπορείτε επίσης να κατεβάσετε μία tarball(συμπιεσμένη) έκδοση στο http://www.nsnam.org/release/, ή μπορείτε να εργαστείτε με τα αρχεία καταγραφής(αποθετήρια) χρησιμοποιώντας Mercurial. Σας προτείνουμε να χρησιμοποιείτε το Mercurial, εκτός αν υπάρχει ένας καλός λόγος για να μην τον χρησιμοποιήσετε. Δείτε το τέλος αυτής της ενότητας για οδηγίες σχετικά με το πώς να πάρετε μία συμπιεσμένη έκδοση.

Ο απλούστερος τρόπος για να ξεκινήσετε τη χρήση αποθετήρια του Mercurial είναι να χρησιμοποιήσετε το `` ns-3-allinone`` περιβάλλον. Πρόκειται για μια σειρά από σενάρια που διαχειρίζεται το κατέβασμα και την κατασκευή των διαφόρων υποσυστημάτων του ns-3 για σένα. Συνιστούμε να ξεκινήσετε την εργασία ns-3 σε αυτό το περιβάλλον.

Μια πρακτική είναι να δημιουργήσετε ένα κατάλογο με το όνομα workspace στην αρχή κάποιου καταλόγου βάσει του οποίου μπορεί κανείς να κρατήσει τα τοπικά Mercurial αποθετήρια. Κάθε όνομα καταλόγου θα κάνει, αλλά υποθέτουμε ότι το workspace χρησιμοποιείται εδώ (σημειώστε: repos μπορεί επίσης να χρησιμοποιηθεί σε κάποια τεκμηρίωση ως ένα όνομα καταλόγου παράδειγμα).

Κατεβάζοντας τον ns-3 χρησιμοποιώντας Tarball

Ένα tarball είναι μία συγκεκριμένη μορφή λογισμικού αρχείο, όπου πολλαπλά αρχεία ομαδοποιούνται και το αρχείο ενδεχομένως να συμπιέζεται. Οι εκδόσεις λογισμικού του ns-3 παρέχονται μέσω ενός tarball - συμπιεσμένο αρχείο. Η διαδικασία για τη λήψη του ns-3 μέσω tarball είναι απλή: απλά πρέπει να επιλέξετε μία έκδοση, να το κατεβάσετε και να το αποσυμπιέσετε αυτό.

Ας υποθέσουμε ότι εσείς, ως χρήστης, επιθυμείτε να δημιουργήσετε τον ns-3 σε έναν τοπικό κατάλογο με την ονομασία workspace. Εάν έχετε υιοθετήσει την προσέγγιση του καταλόγου workspace, μπορείτε να πάρετε ένα αντίγραφο της έκδοσης, πληκτρολογώντας τα εξής στο κέλυφος του Linux σας (αντικαθιστάτε τους κατάλληλους αριθμούς έκδοσης, φυσικά):

$ cd
$ mkdir workspace
$ cd workspace
$ wget http://www.nsnam.org/release/ns-allinone-3.22.tar.bz2
$ tar xjf ns-allinone-3.22.tar.bz2

Εάν αλλάξετε μέσα στον κατάλογο ns-allinone-3.22 θα πρέπει να δείτε έναν αριθμό αρχείων:

$ ls
bake      constants.py   ns-3.22               README
build.py  netanim-3.105  pybindgen-0.16.0.886  util.py

Τώρα είστε έτοιμοι να οικοδομήσουμε τη διανομή της βάσης του ns-3.

Κατεβάζοντας τον ns-3 χρησιμοποιώντας Bake

Ο Bake είναι ένα εργαλείο για κατανεμημένη ολοκλήρωση και οικοδόμηση, που αναπτύχθηκε για το έργο του ns-3. Ο Bake μπορεί να χρησιμοποιηθεί για να φέρει αναπτυγμένες εκδόσεις στο λογισμικό του ns-3, και να κατεβάσετε και να οικοδομήσετε επεκτάσεις στη διανομή της βάσης του ns-3, όπως το περιβάλλον Εκτέλεσης Άμεση Κώδικα(Direct Code Execution environment), Δίκτυο Προσομοίωσης λίκνο(Network Simulation Cradle), την ικανότητα να δημιουργήσετε νέες συνδέσεις Python, και άλλα.

Σε πρόσφατες εκδόσεις ns-3, ο Bake έχει συμπεριληφθεί στο tarball της έκδοσης. Το αρχείο των ρυθμίσεων που περιλαμβάνονται στην επίσημη έκδοση θα επιτρέψει σε κάποιον να κατεβάσει οποιοδήποτε λογισμικό που ίσχυε κατά τη στιγμή της έκδοσης. Δηλαδή, για παράδειγμα, η έκδοση του Bake που διανέμεται με την έκδοση ns-3.22 μπορεί να χρησιμοποιηθεί για να φέρει τα συστατικά για αυτήν την έκδοση ns-3 ή και παλαιότερη, αλλά δεν μπορεί να χρησιμοποιηθεί για να φέρει τα συστατικά για νεότερες εκδόσεις (εκτός εάν το αρχείο bakeconf.xml είναι ενημερωμένο).

Μπορείτε επίσης να πάρετε το πιο πρόσφατο αντίγραφο του bake πληκτρολογώντας το παρακάτω στο κέλυφος του Linux σας (αν έχετε εγκαταστήσει το Mercurial)

$ cd
$ mkdir workspace
$ cd workspace
$ hg clone http://code.nsnam.org/bake

Καθώς η hg (Mercurial) εντολή εκτελείται, θα πρέπει να δείτε κάτι να εμφανίζεται σαν το ακόλουθο,:

...
destination directory: bake
requesting all changes
adding changesets
adding manifests
adding file changes
added 339 changesets with 796 changes to 63 files
updating to branch default
45 files updated, 0 files merged, 0 files removed, 0 files unresolved

Αφού ολοκληρωθεί η εντολή κλώνος, θα πρέπει να έχετε έναν κατάλογο που ονομάζεται bake, τα περιεχόμενα της οποίας θα πρέπει να δούμε κάτι σαν το παρακάτω

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

Σημειώστε ότι πραγματικά κατεβάσατε μερικά σενάρια Python και μία ενότητα Python που ονομάζεται bake. Το επόμενο βήμα είναι να χρησιμοποιηθούν αυτά τα σενάρια για να κατεβάσετε και να οικοδομήσετε την κατανομή του ns-3 της επιλογής σας.

Υπάρχουν μερικές ρυθμίσεις ακόμα:

  1. ns-3.22: η ενότητα που αντιστοιχεί στην έκδοση, θα κατεβάσει συστατικά παρόμοια με την έκδοση tarball.
  2. ns-3-dev: μια παρόμοια ενότητα, αλλά χρησιμοποιώντας τον κώδικα-δένδρο ανάπτυξης
  3. ns-allinone-3.22: η ενότητα που περιλαμβάνει άλλα προαιρετικά χαρακτηριστικά όπως την δρομολόγηση του κλικ, τον openflow ns-3, και Προσομοίωση Δικτύων λίκνο(Network Simulation Cradle)
  4. ns-3-allinone: παρόμοια με την επίσημη έκδοση του allinone, αλλά για την ανάπτυξη κώδικα.

Το τρέχον στιγμιότυπο ανάπτυξης (ακυκλοφόρητο) του ns-3 μπορεί να βρεθεί στο http://code.nsnam.org/ns-3-dev/. Οι προγραμματιστές προσπαθούν να κρατήσουν αυτά τα αποθετήρια με συνέπεια, εργάζοντας κομμάτια αλλά είναι σε μια περιοχή ανάπτυξης με ακυκλοφόρητο κώδικα προσωρινά, οπότε μπορεί να θέλετε να εξετάσετε την διαμονή σας με την επίσημη έκδοση, εφόσον δεν χρειάζεστε νεοεισαχθέν χαρακτηριστικά.

Μπορείτε να βρείτε την τελευταία έκδοση του κώδικα είτε με την επιθεώρηση της λίστας του χώρου αποθήκευσης ή πηγαίνοντας στην ιστοσελίδα “ns-3 Releases” και κάνοντας κλίκ στον σύνδεσμο της τελευταίας έκδοσης. Θα προχωρήσουμε σε αυτόν τον οδηγό με παράδειγμα τον ns-3.22.

Πάμε να χρησιμοποιήσουμε το εργαλείο bake για να χωρίσουμε τα διάφορα κομμάτια του ns-3 που θα χρησιμοποιείτε. Κατ ‘αρχάς, θα πούμε μία λέξη για το τρέξιμο του bake.

Ο bake λειτουργεί κατεβάζοντας πακέτα πηγαίου κώδικα σε έναν κατάλογο πηγή, και εγκαθηστώντας βιβλιοθήκες σε έναν κατάλογο κατασκευής. Ο bake μπορεί να τρέξει με την παραπομπή του δυαδικού, αλλά αν κάποιος επιλέξει να τρέξει τον bake από το εξωτερικό του καταλόγου απο το οποίο έγινε λήψη, είναι συμβουλή να τοποθετήσετε το bake στη διαδρομή(path) που ξέρετε, όπως ακολουθεί (Linux κέλυφος bash παράδειγμα). Πρώτον, να αλλάξετε μέσα στον κατάλογο ‘bake’, και στη συνέχεια ορίστε τις ακόλουθες μεταβλητές περιβάλλοντος:

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

Αυτό θα θέσει το πρόγραμμα bake.py στη διαδρομή του κελύφους, και θα επιτρέψει άλλα προγράμματα να τα βρείτε εκτελέσιμα και τις βιβλιοθήκες που έχουν δημιουργηθεί από το bake. Παρά το γεγονός ότι αρκετές περιπτώσεις το bake δεν απαιτείται η χρήση ρύθμιση της διαδρομής και PYTHONPATH όπως παραπάνω, η πλήρης έκδοση του ns-3-allinone (με τα προαιρετικά πακέτα) συνήθως χρειάζεται.

Μπείτε στο κατάλογο εργασίας και πληκτρολογήστε τα ακόλουθα στο κέλυφος

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

Στη συνέχεια, εμείς θα ζητήσουμε από το bake να ελέγξει αν έχουμε αρκετά εργαλεία για να κατεβάσουμε διάφορα συστατικά. Τύπος

$ ./bake.py check

Θα πρέπει να δείτε κάτι όπως παρακάτω,

> Python - OK
> GNU C++ compiler - OK
> Mercurial - OK
> CVS - OK
> GIT - OK
> Bazaar - OK
> Tar tool - OK
> Unzip tool - OK
> Unrar tool - is missing
> 7z  data compression utility - OK
> XZ data compression utility - OK
> Make - OK
> cMake - OK
> patch tool - OK
> autoreconf tool - OK

> Path searched for tools: /usr/lib64/qt-3.3/bin /usr/lib64/ccache
/usr/local/bin /bin /usr/bin /usr/local/sbin /usr/sbin /sbin
/home/tomh/bin bin

Ειδικότερα, λήψη εργαλείων όπως το Mercurial, CVS, GIT και Bazaar είναι οι κυριότερες ανησυχίες μας σε αυτό το σημείο, διότι μας επιτρέπουν να φέρουν τον κώδικα. Παρακαλώ εγκαταστήστε τα εργαλεία που λείπουν σε αυτό το στάδιο, με το συνήθη τρόπο για το σύστημά σας (αν είστε σε θέση), ή επικοινωνήστε με τον διαχειριστή του συστήματός σας, όπως απαιτείται για την εγκατάσταση αυτών των εργαλείων.

Μετά, προσπαθήστε να κατεβάσετε το λογισμικό

$ ./bake.py download

θα πρέπει να δώσει κάτι, όπως

>> Searching for system dependency pygoocanvas - OK
>> Searching for system dependency python-dev - OK
>> Searching for system dependency pygraphviz - OK
>> Downloading pybindgen-0.16.0.886 - OK
>> Searching for system dependency g++ - OK
>> Searching for system dependency qt4 - OK
>> Downloading netanim-3.105 - OK
>> Downloading ns-3.22 - OK

Απο τα ανωτέρω προκύπτει ότι οι τρείς πηγές έχουν ληφθεί. Ελέγξτε τώρα τον κατάλογο source και πληκτρολογείστε ls, πρέπει να φανεί

$ ls
netanim-3.105  ns-3.22  pybindgen-0.16.0.886

Είστε έτοιμη για την κατασκευή της διανομής του ns-3.

Χτίζοντας τον ns-3

Χτίζοντας με build.py

Δουλεύοντας απο μία έκδοση tarball, η πρώτη φορά που θα κατασκευάσετε την εργασία ns-3 μπορείτε να δημιουργήσετε χρησιμοποιώντας ένα εύχρηστο πρόγραμμα που θα βρείτε στον κατάλογο allinone. Αυτό το πρόγραμμα ονομάζεται build.py. Αυτό το πρόγραμμα θα πάρει την ρυθμισμένη εργασία για εσάς στο πιο χρήσιμο τρόπο. Ωστόσο, παρακαλούμε να σημειώσετε ότι πιο προηγμένες ρυθμίσεις και εργασίες με τον ns-3 τυπικά περιλαμβάνει τη χρήση του φυσικού συστήματος κατασκευής ns-3, Waf, στο οποίο θα εισαχθούμε αργότερα στον οδηγό αυτό.

Αν έχετε κατεβάσει χρησιμοποιώντας ένα tarball θα πρέπει να έχετε έναν κατάλογο που ονομάζεται ns-allinone-3.22 κάτω από τον κατάλογο ~/workspace. Πληκτρολογήστε την ακόλουθη εντολή

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

Επειδή εργαζόμαστε με παραδείγματα και δοκιμές σε αυτόν τον οδηγό, και επειδή δεν έχουν κατασκευαστεί από προεπιλογή στον ns-3, τα ορίσματα για build.py λέει να τα κατασκευάσουμε για εμάς. Το πρόγραμμα, επίσης, αποτυγχάνει την οικοδόμηση όλων των διαθέσιμων ενοτήτων. Αργότερα, μπορείτε να χτίσετε τον ns-3 χωρίς παραδείγματα και δοκιμές, ή την εξάλειψη των ενοτήτων που δεν είναι απαραίτητα για την εργασία σας, εάν το επιθυμείτε.

Θα δείτε πολλά μηνύματα εξόδου τυπικού compiler να εμφανίζονται όσο το σενάριο κατασκευής χτίζει τα διάφορα κομμάτια που κατεβάσατε. Ενδεχομένως να δείτε το παρακάτω

Waf: Leaving directory `/path/to/workspace/ns-allinone-3.22/ns-3.22/build'
'build' finished successfully (6m25.032s)

Modules built:
antenna                   aodv                      applications
bridge                    buildings                 config-store
core                      csma                      csma-layout
dsdv                      dsr                       energy
fd-net-device             flow-monitor              internet
lr-wpan                   lte                       mesh
mobility                  mpi                       netanim (no Python)
network                   nix-vector-routing        olsr
point-to-point            point-to-point-layout     propagation
sixlowpan                 spectrum                  stats
tap-bridge                test (no Python)          topology-read
uan                       virtual-net-device        wave
wifi                      wimax

Modules not built (see ns-3 tutorial for explanation):
brite                     click                     openflow
visualizer

Leaving directory `./ns-3.22'

Όσον αφορά το τμήμα σχετικά με τις ενότητες δεν χτίστηκε

Modules not built (see ns-3 tutorial for explanation):
brite                     click                     openflow
visualizer

Αυτό σημαίνει απλά ότι κάποιες ενότητες του ns-3 που έχουν εξαρτήσεις σε εξωτερικές βιβλιοθήκες μπορεί να μην έχουν κατασκευαστεί, ή ότι η διαμόρφωση ζήτησε συγκεκριμένα να μην τις κατασκευάσει. Αυτό δεν σημαίνει ότι ο προσομοιωτής δεν έχτισε με επιτυχία ή ότι θα παρέχει λανθασμένα αποτελέσματα για τις ενότητες που αναφέρονται καθώς χτίζονται.

Χτίζοντας με Bake

Εάν χρησιμοποιείτε bake παραπάνω για να φέρετε τον πηγαίο κώδικα από τα αποθετήρια εργασιών, μπορείτε να συνεχίσετε να το χρησιμοποιήσετε για να οικοδομήσετε τον ns-3. Πληκτρολογήστε:

$ ./bake.py build

και θα πρέπει να δείτε

>> Building pybindgen-0.16.0.886 - OK
>> Building netanim-3.105 - OK
>> Building ns-3.22 - OK

Συμβουλή: Μπορείτε επίσης να εκτελέσετε δύο βήματα, να κατεβάσετε και να οικοδομήσετε καλώντας ‘bake.py deploy’.

Αν συμβαίνει να υπάρχει μια αποτυχία, παρακαλώ ρίξτε μια ματιά στα ακόλουθα, μπορεί να δώσει μια υπόδειξη ως προς τι λείπει:

$ ./bake.py show

Αυτό θα εμφανίσει τις διάφορες εξαρτήσεις των πακέτων που προσπαθούμε να οικοδομήσουμε.

Χτίζοντας με Waf

Μέχρι αυτό το σημείο, έχουμε χρησιμοποιήσει είτε το σενάριο build.py, ή το εργαλείο bake, για να ξεκινήσετε την οικοδόμηση του ns-3. Τα εργαλεία αυτά είναι χρήσιμα για την ανάπτυξη του ns-3 και την υποστήριξη βιβλιοθηκών, και καλούν μέσω του καταλόγου του ns-3 το εργαλείο Waf να κάνει την πραγματική οικοδόμηση. Οι περισσότεροι χρήστες κάνουν την μετάβαση γρήγορα χρησιμοποιώντας άμεσα τον Waf για να διαμορφώσουν και να οικοδομήσουμε τον ns-3. Έτσι, για να προχωρήσει, παρακαλούμε να αλλάξετε τον κατάλογο εργασίας σας με τον κατάλογο του ns-3 που έχετε αρχικά κατασκευάσει.

Δεν είναι απολύτως απαραίτητο σε αυτό το σημείο, αλλά θα είναι χρήσιμο να κάνουμε μια μικρή παράκαμψη και να δούμε πώς να κάνετε αλλαγές στη διαμόρφωση της εργασίας. Ίσως η πιο χρήσιμη αλλαγή ρυθμίσεων που μπορείτε να κάνετε θα είναι να οικοδομήσετε τη βελτιστοποιημένη έκδοση του κώδικα. Από προεπιλογή έχετε ρυθμίσει την εργασία σας να χτίσει την έκδοση εντοπισμού σφαλμάτων. Ας πούμε ότι θα φτιάξουμε μία βελτιστοποιημένη κατασκευή για την εργασία. Για να εξηγήσουμε στο Waf ότι θα πρέπει να βελτιστοποιηθούν οι εκδόσεις που περιλαμβάνουν τα παραδείγματα και τις δοκιμές, θα πρέπει να εκτελέσετε τις ακόλουθες εντολές

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

Αυτό τρέχει τον Waf έξω από τον τοπικό κατάλογο (το οποίο παρέχεται ως διευκόλυνση για εσάς). Η πρώτη εντολή για να καθαρίσετε την προηγούμενη κατασκευή δεν είναι απολύτως αναγκαία, αλλά είναι καλή πρακτική (αλλά δείτε παρακάτω Προφίλ Κατασκευών), θα καταργήσει τις προηγούμενες κατασκευασμένες βιβλιοθήκες και τα αρχεία αντικειμένων που βρέθηκαν στον κατάλογο build/. Όταν το έργο έχει αναδιαμορφωθεί και το σύστημα κατασκευής ελέγχει για διάφορες εξαρτήσεις, θα πρέπει να δείτε κάτι που μοιάζει με το παρακάτω

Setting top to                           : .
Setting out to                           : build
Checking for 'gcc' (c compiler)          : /usr/bin/gcc
Checking for cc version                  : 4.2.1
Checking for 'g++' (c++ compiler)        : /usr/bin/g++
Checking boost includes                  : 1_46_1
Checking boost libs                      : ok
Checking for boost linkage               : ok
Checking for click location              : not found
Checking for program pkg-config          : /sw/bin/pkg-config
Checking for 'gtk+-2.0' >= 2.12          : yes
Checking for 'libxml-2.0' >= 2.7         : yes
Checking for type uint128_t              : not found
Checking for type __uint128_t            : yes
Checking high precision implementation   : 128-bit integer (default)
Checking for header stdint.h             : yes
Checking for header inttypes.h           : yes
Checking for header sys/inttypes.h       : not found
Checking for header sys/types.h          : yes
Checking for header sys/stat.h           : yes
Checking for header dirent.h             : yes
Checking for header stdlib.h             : yes
Checking for header signal.h             : yes
Checking for header pthread.h            : yes
Checking for header stdint.h             : yes
Checking for header inttypes.h           : yes
Checking for header sys/inttypes.h       : not found
Checking for library rt                  : not found
Checking for header netpacket/packet.h   : not found
Checking for header sys/ioctl.h          : yes
Checking for header net/if.h             : not found
Checking for header net/ethernet.h       : yes
Checking for header linux/if_tun.h       : not found
Checking for header netpacket/packet.h   : not found
Checking for NSC location                : not found
Checking for 'mpic++'                    : yes
Checking for 'sqlite3'                   : yes
Checking for header linux/if_tun.h       : not found
Checking for program sudo                : /usr/bin/sudo
Checking for program valgrind            : /sw/bin/valgrind
Checking for 'gsl'                       : yes
Checking for compilation flag -Wno-error=deprecated-d... support : ok
Checking for compilation flag -Wno-error=deprecated-d... support : ok
Checking for compilation flag -fstrict-aliasing... support       : ok
Checking for compilation flag -fstrict-aliasing... support       : ok
Checking for compilation flag -Wstrict-aliasing... support       : ok
Checking for compilation flag -Wstrict-aliasing... support       : ok
Checking for program doxygen                                     : /usr/local/bin/doxygen
---- Summary of optional NS-3 features:
Build profile                 : debug
Build directory               : build
Python Bindings               : enabled
BRITE Integration             : not enabled (BRITE not enabled (see option --with-brite))
NS-3 Click Integration        : not enabled (nsclick not enabled (see option --with-nsclick))
GtkConfigStore                : enabled
XmlIo                         : enabled
Threading Primitives          : enabled
Real Time Simulator           : enabled (librt is not available)
Emulated Net Device           : enabled (<netpacket/packet.h> include not detected)
File descriptor NetDevice     : enabled
Tap FdNetDevice               : not enabled (needs linux/if_tun.h)
Emulation FdNetDevice         : not enabled (needs netpacket/packet.h)
PlanetLab FdNetDevice         : not enabled (PlanetLab operating system not detected (see option --force-planetlab))
Network Simulation Cradle     : not enabled (NSC not found (see option --with-nsc))
MPI Support                   : enabled
NS-3 OpenFlow Integration     : not enabled (Required boost libraries not found, missing: system, signals, filesystem)
SQlite stats data output      : enabled
Tap Bridge                    : not enabled (<linux/if_tun.h> include not detected)
PyViz visualizer              : enabled
Use sudo to set suid bit      : not enabled (option --enable-sudo not selected)
Build tests                   : enabled
Build examples                : enabled
GNU Scientific Library (GSL)  : enabled
'configure' finished successfully (1.944s)

Σημειώστε το τελευταίο μέρος της παραπάνω εξόδου. Μερικές επιλογές στον ns-3 δεν είναι ενεργοποιημένες από προεπιλογή ή απαιτούν υποστήριξη από το υποκείμενο σύστημα για να λειτουργήσει σωστά. Για παράδειγμα, για να ενεργοποιήσετε τον XmlTo, η βιβλιοθήκη LibXML-2.0 πρέπει να βρεθεί στο σύστημα. Αν δεν βρεθεί αυτή η βιβλιοθήκη, το αντίστοιχο χαρακτηριστικό του ns-3 δεν θα έπρεπε να ενεργοποιηθεί και ένα μήνυμα θα εμφανιστεί. Σημειώστε, επίσης, ότι υπάρχει ένα χαρακτηριστικό για να χρησιμοποιήσετε το πρόγραμμα sudo να ρυθμίσετε το suid κομμάτι ορισμένων προγραμμάτων. Αυτό δεν είναι ενεργοποιημένο από προεπιλογή και έτσι αυτό το χαρακτηριστικό αναφέρεται ως “όχι ενεργοποιημένο.”(“not enabled.”)

Τώρα συνεχίστε και επιστρέψετε στην κατασκευή εντοπισμού σφαλμάτων που περιλαμβάνει τα παραδείγματα και δοκιμές.

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

Το σύστημα κατασκευής είναι τώρα ρυθμισμένο και μπορείτε να χτίσετε τις debug εκδόσεις των προγραμμάτων ns-3 απλά πληκτρολογώντας:

$ ./waf

Εντάξει, συγγνώμη, σας έκανα να φτιάξετε το μέρος του συστήματος ns-3 δύο φορές, αλλά τώρα ξέρετε πώς να αλλάξετε τη διαμόρφωση και την κατασκευή για βελτιστοποιημένο κώδικα.

Το σενάριο build.py συζητήθηκε παραπάνω, υποστηρίζει επίσης τα --enable-examples και enable-tests ορίσματα, αλλά σε γενικές γραμμές, δεν υποστηρίζει άμεσα άλλες WAF επιλογές, για παράδειγμα, αυτό δεν θα λειτουργήσει:

$ ./build.py --disable-python

θα οδηγήσει σε

build.py: error: no such option: --disable-python

Ωστόσο, ο ειδικός φορέας -- μπορεί να χρησιμοποιηθεί για να περάσουν επιπλέον επιλογές μέσω του WAF, έτσι ώστε αντί των ανωτέρω, τα ακόλουθα θα λειτουργήσουν:

$ ./build.py -- --disable-python

δεδομένου ότι δημιουργεί τη βασική εντολή ./waf configure --disable-python.

Εδώ είναι λίγο περισσότερες εισαγωγικές συμβουλές για τον Waf.

Ρύθμιση(Διαμόρφωση) εναντίον Κατασκευής

Μερικές εντολές του Waf έχουν νόημα μόνο κατά τη διάρκεια της φάσης της παραμετροποίησης και κάποιες εντολές ισχύουν κατά τη φάση της κατασκευής. Για παράδειγμα, αν θέλετε να χρησιμοποιήσετε τις λειτουργίες της εξομοίωσης του ns-3, ίσως πρέπει να ενεργοποιήσετε αυτήν την ρύθμιση του κομματιού suid χρησιμοποιώντας την εντολή sudo, όπως περιγράφεται παραπάνω. Αυτό αποδεικνύεται ότι είναι μια εντολή διαμόρφωσης χρόνου, και έτσι θα μπορείτε να αναμορφώσετε χρησιμοποιώντας την ακόλουθη εντολή, που περιλαμβάνει επίσης τα παραδείγματα και δοκιμές.

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

Αν το κάνετε αυτό, το Waf θα έχει εκκινήσει το sudo για να αλλάξει τα προγράμματα (socket creator) του κώδικα εξομοίωσης να εκτελούνται ως root.

Υπάρχουν πολλές άλλες ρυθμίσεις- και χρόνο-κατασκευής που διατίθεται σε Waf. Για να διερευνήσετε αυτές τις επιλογές, πληκτρολογήστε

$ ./waf --help

Θα χρησιμοποιήσουμε κάποιες από τις εντολές δοκιμών που σχετίζονται με την επόμενη ενότητα.

Προφίλ Κατασκευών

Μόλις είδαμε πως μπορούμε να ρυθμίσουμε τον Waf για debug ή optimized κατασκευές

$ ./waf --build-profile=debug

Υπάρχει επίσης ένα ενδιάμεσο προφίλ κατασκευής, release. `` -d`` είναι ένα συνώνυμο για `` –build-profile``.

Από προεπιλογή ο Waf βάζει τα αντικείμενα κατασκευής στον κατάλογο build. Μπορείτε να καθορίσετε ένα διαφορετικό κατάλογο εξόδου με την επιλογή --out, π.χ.

$ ./waf configure --out=foo

Συνδυάζοντας αυτό με τα προφίλ κατασκευών σας επιτρέπει να πραγματοποιήσετε εναλλαγή μεταξύ των διαφόρων επιλογών μεταγλώττισης σε ένα καθαρό τρόπο

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

Αυτό σας επιτρέπει να εργάζεστε με πολλαπλές κατασκευές και όχι πάντα αντικαθιστώντας την τελευταία έκδοση. Όταν αλλάζετε, ο Waf θα μεταγλωττίζει μόνο ό,τι έχει, αντί να κάνει μεταγλώττιση πάλι.

Όταν κάνετε εναλλαγή προφίλ κατασκευής όπως αυτό, θα πρέπει να είστε προσεκτικοί για να δώσει τις ίδιες παραμέτρους διαμόρφωσης κάθε φορά. Μπορεί να είναι βολικό να καθορίσει κάποιες μεταβλητές περιβάλλοντος για να σας βοηθήσει να αποφύγετε τα λάθη

$ 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

Μεταγλωττιστές

Στα παραπάνω παραδείγματα, ο Waf χρησιμοποιεί τον μεταγλωττιστή GCC C++, g++, για την οικοδομή του ns-3. Ωστόσο, είναι δυνατόν να αλλάξει τον μεταγλωττιστή του C++ που χρησιμοποιείται από τον Waf με την μεταβλητή περιβάλλοντος CXX. Για παράδειγμα, για να χρησιμοποιήσετε τον μεταγλωττιστή Clang C++, clang++,

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

Κάποιος μπορεί επίσης να εγκαταστήσει τον Waf κάνοντας κατανεμημένη συλλογή με distcc με παρόμοιο τρόπο

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

Περισσότερες πληροφορίες για το distcc και διανέμονται σύνταξη μπορείτε να βρήτε σε αυτή την σελίδα του έργου σύμφωνα με το τμήμα του οδηγού αυτού.

Εγκατάσταση

Ο Waf μπορεί να χρησιμοποιηθεί για την εγκατάσταση βιβλιοθηκών σε διάφορα σημεία του συστήματος. Η προεπιλεγμένη θέση όπου οι βιβλιοθήκες και τα εκτελέσιμα είναι χτισμένα είναι ο κατάλογος build, και επειδή ο Waf γνωρίζει τη θέση των βιβλιοθηκών αυτών και τα εκτελέσιμα, δεν είναι απαραίτητο να εγκαταστήσετε τις βιβλιοθήκες και αλλού.

Εάν οι χρήστες επιλέγουν να εγκαταστήσουν πράγματα έξω από το κατάλογο κατασκευής, οι χρήστες μπορούν να εκδώσουν την εντολή ./waf install. Από προεπιλογή, το πρόθεμα για την εγκατάσταση είναι / usr / local, έτσι ./waf install θα εγκαταστήσει προγράμματα σε / usr / local / bin, βιβλιοθήκες σε / usr / local / lib, και τους τίτλους σε / usr / local / include. Τα προνόμια υπερχρήστη συνήθως απαιτούνται για την εγκατάσταση στο προεπιλεγμένο πρόθεμα, οπότε η τυπική εντολή θα είναι sudo ./waf install. Όταν τα προγράμματα που εκτελούνται με τον Waf, ο Waf πρώτα θα προτιμά να χρησιμοποιεί κοινές βιβλιοθήκες στον κατάλογο κατασκευής, μετά θα κοιτάξουμε για τις βιβλιοθήκες στη ρύθμιση διαδρομή βιβλιοθήκης στο τοπικό περιβάλλον. Έτσι, κατά την εγκατάσταση των βιβλιοθηκών για το σύστημα, είναι καλή πρακτική να ελέγξετε ότι οι προβλεπόμενες βιβλιοθήκες έχουν χρησιμοποιηθεί.

Οι χρήστες μπορούν να επιλέξουν να εγκαταστήσουν σε ένα διαφορετικό πρόθεμα με το πέρασμα την επιλογή --prefix σε συγκεκριμένο χρόνο, όπως:

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

Αν αργότερα, μετά την κατασκευή ο χρήστης εκδίδει την εντολή ./waf install, το πρόθεμα / opt / local θα χρησιμοποιηθεί.

Η εντολή ./waf clean πρέπει να χρησιμοποιείται πριν από την αναμόρφωση του έργου, εάν το Waf θα χρησιμοποιηθεί για να εγκαταστήσει πράγματα σε ένα διαφορετικό πρόθεμα.

Εν ολίγοις, δεν είναι απαραίτητο να καλέσετε ./waf install για να χρησιμοποιήσετε τον ns-3. Οι περισσότεροι χρήστες δεν θα χρειαστούν αυτήν την εντολή αφού ο Waf θα πάρει τις σημερινές βιβλιοθήκες από τον κατάλογο build, αλλά μερικοί χρήστες μπορεί να το βρούν χρήσιμο εάν η χρήση τους περιλαμβάνει εργασία με προγράμματα εκτός από τον κατάλογο του ns-3.

Ένας Waf

Υπάρχει μόνο ένα σενάριο Waf, στο ανώτατο επίπεδο του δέντρου πηγαίου κώδικα ns-3. Καθώς εργάζεστε, μπορείτε να βρείτε τον εαυτό σας να ξοδέψει πολύ χρόνο σε scratch/, ή βαθιά στο src /..., και να χρειαστεί να επικαλεστείτε τον Waf. Θα μπορούσατε απλά να θυμάστε πού είστε, και να επικαλέσετε τον Waf όπως αυτό

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

αλλά αυτό είναι κουραστικό και επιρρεπή σε λάθη, και υπάρχουν καλύτερες λύσεις.

Εάν έχετε το πλήρη αποθετήριο ns-3 αυτό το μικρό διαμάντι είναι μια αρχή

$ cd $(hg root) && ./waf ...

Ακόμα καλύτερα είναι να το ορίσετε ως συνάρτηση κέλυφος

$ function waff { cd $(hg root) && ./waf $* ; }

$ waff build

Εάν έχετε μόνο το tarball αρχείο, μια μεταβλητή περιβάλλοντος μπορεί να βοηθήσει

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

$ cd scratch
$ waff build

Θα μπορούσε να είναι δελεαστικό σε μια μονάδα καταλόγου για να προσθέσετε ένα ασήμαντο σενάριο waf κατά μήκος των γραμμών του exec ../../waf. Παρακαλώ μην το κάνετε. Είναι σύγχυση για τους νεοφερμένους, και όταν γίνει ανεπαρκώς οδηγεί σε λεπτά σφάλματα κατασκευής. Οι παραπάνω λύσεις είναι ο τρόπος να πάει καλά.

Κάνοντας τέστ στον ns-3

Μπορείτε να εκτελέσετε τη μονάδα των δοκιμών της διανομής του ns-3 εκτελώντας το σενάριο ./test.py -c core

$ ./test.py -c core

Οι δοκιμές αυτές έχουν παράλληλη πορεία με τον Waf. Θα πρέπει τελικά να δείτε μια έκθεση λέγοντας ότι

92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)

Αυτό είναι σημαντικό μήνυμα.

Θα δείτε επίσης την περίληψη εξόδου από τον Waf και τη δοκιμή του δρομέα εκτέλεσης κάθε δοκιμής, η οποία θα εξετάσει πραγματικά κάτι σαν

Waf: Entering directory `/path/to/workspace/ns-3-allinone/ns-3-dev/build'
Waf: Leaving directory `/path/to/workspace/ns-3-allinone/ns-3-dev/build'
'build' finished successfully (1.799s)

Modules built:
aodv                      applications              bridge
click                     config-store              core
csma                      csma-layout               dsdv
emu                       energy                    flow-monitor
internet                  lte                       mesh
mobility                  mpi                       netanim
network                   nix-vector-routing        ns3tcp
ns3wifi                   olsr                      openflow
point-to-point            point-to-point-layout     propagation
spectrum                  stats                     tap-bridge
template                  test                      tools
topology-read             uan                       virtual-net-device
visualizer                wifi                      wimax

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

...

PASS: TestSuite object
PASS: TestSuite random-number-generators
92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)

Αυτή η εντολή τυπικά τρέχει από τους χρήστες για την γρήγορη επαλήθευση ότι μια διανομή ns-3 έχει χτιστεί σωστά. (Σημειώστε τη σειρά των PASS: ... μπορεί να διαφέρουν, το οποίο είναι εντάξει. Αυτό που είναι σημαντικό είναι ότι η συνοπτική γραμμή στο τέλος ότι όλες οι δοκιμές πέρασαν, καμία δεν απέτυχε ή συνετρίβη.)

Τρέχοντας ένα Σενάριο

Εμείς συνήθως τρέχουμε σενάρια υπό τον έλεγχο του Waf. Αυτό επιτρέπει στο σύστημα κατασκευής να εξασφαλίσει ότι οι κοινές διαδρομές βιβλιοθήκης είναι σωστά ρυθμισμένες και ότι οι βιβλιοθήκες είναι διαθέσιμες κατά το χρόνο εκτέλεσης. Για να εκτελέσετε ένα πρόγραμμα, απλά χρησιμοποιήστε την επιλογή --run του Waf. Ας τρέξουμε τον ns-3 αντίστοιχο του πανταχού πρόγραμματος Hello World, πληκτρολογώντας τα εξής

$ ./waf --run hello-simulator

Ο Waf ελέγχει πρώτα για να βεβαιωθεί ότι το πρόγραμμα έχει χτιστεί σωστά και εκτελεί μια συγκέντρωση, εάν απαιτείται. Ο Waf εκτελεί τότε το πρόγραμμα, το οποίο παράγει την ακόλουθη έξοδο.

Hello Simulator

Συγχαρητήρια! Τώρα είστε χρήστης του ns-3!

Τι μπορώ να κάνω αν δεν βλέπω την έξοδο;

Αν δείτε τα μηνύματα του Waf υποδεικνύοντας ότι η κατασκευή ολοκληρώθηκε με επιτυχία, αλλά δεν βλέπετε την έξοδο “Hello Simulator”, οι πιθανότητες είναι ότι έχετε αλλάξει την λειτουργία κατασκευής σας στο optimized στο Χτίζοντας με Waf τμήμα, αλλά έχετε ξεχάσει την αλλαγή πίσω στη λειτουργία debug. Όλοι οι έξοδοι της κονσόλας που χρησιμοποιούνται σε αυτό τον οδηγό, χρησιμοποιούν ένα ειδικό συστατικό καταγραφής ns-3 που είναι χρήσιμο για την εκτύπωση μηνυμάτων του χρήστη στην κονσόλα. Η έξοδος από το συστατικό αυτό είναι απενεργοποιημένη αυτόματα κατά τη μεταγλώττιση του βελτιστοποιημένου κώδικα – αυτό είναι “optimized out.” Εάν δεν μπορείτε να δείτε την έξοδο “Hello Simulator», πληκτρολογήστε τα ακόλουθα

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

για να πούμε στον Waf να χτίσει τις εκδόσεις debug απο τα προγράμματα του ns-3 που περιλαμβάνει τα παραδείγματα και τις δοκιμές(τεστ). Θα πρέπει ακόμα να οικοδομήσουμε την πραγματική debug έκδοση του κώδικα πληκτρολογώντας

$ ./waf

Τώρα, αν εκτελέσετε το πρόγραμμα hello-simulator, θα πρέπει να δείτε την αναμενόμενη εξαγωγή.

Τα Ορίσματα του Προγράμματος

Για να τροφοδοτήσει τα ορίσματα της γραμμής εντολών για ένα πρόγραμμα ns-3 χρησιμοποιήστε αυτό το μοτίβο

$ ./waf --run <ns3-program> --command-template="%s <args>"

Αντικαταστήστε το όνομα του προγράμματος σας για <ns3-program>, και τα ορίσματα για <args>. Το όρισμα --command-template στο Waf είναι βασικά μια συνταγή για την κατασκευή της πραγματικής γραμμής εντολών Waf που θα πρέπει να χρησιμοποιήσετε για να εκτελέσει το πρόγραμμα. Ο Waf ελέγχει ότι η κατασκευή έχει ολοκληρωθεί, θέτει τους κοινούς διαδρόμους(paths), μετά επικαλείται το εκτελέσιμο χρησιμοποιώντας το παρεχόμενο πρότυπο της γραμμής εντολών, εισάγοντας το όνομα του προγράμματος για την θέση %s. (Ομολογώ ότι αυτό είναι λίγο περίεργο, αλλά αυτός είναι ο τρόπος. Patches ευπρόσδεκτα!)

Ένα άλλο ιδιαίτερα χρήσιμο παράδειγμα είναι να εκτελέσετε μια σουίτα δοκιμής από μόνη της. Ας υποθέσουμε ότι υπάρχει ένα τέστ mytest σουίτα (δεν υπάρχει). Πάνω, χρησιμοποιήσαμε το σενάριο . / test.py για να εκτελέσει μια αρμαθιά από δοκιμές(τέστ) παράλληλα, κατ ‘επανάληψη επίκληση του πραγματικού προγράμματος δοκιμών, test-runner. Για να επικαλεστείτε το test-runner άμεσα για μία μόνο δοκιμή

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

Αυτό περνά τα ορίσματα για το test-runner. Από τη στιγμή που το mytest δεν υπάρχει, ένα μήνυμα σφάλματος θα δημιουργηθεί. Για να εκτυπώσετε τις διαθέσιμες επιλογές test-runner

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

Εντοπισμός Σφαλμάτων

Για να εκτελέσετε τα ns-3 προγράμματα υπό τον έλεγχο μιας άλλης κοινής ωφέλειας, όπως ένα πρόγραμμα εντοπισμού σφαλμάτων (π.χ. gdb) ή ελεγκτή μνήμης (π.χ. valgrind), μπορείτε να χρησιμοποιήσετε μια παρόμοια μορφή --command-template = "...".

Για παράδειγμα, για να εκτελέσετε το ns-3 πρόγραμμα hello-simulator με τα ορίσματα <args> κάτω από τον εντοπισμό σφαλμάτων gdb

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

Παρατηρήστε ότι το όνομα του προγράμματος ns-3 πηγαίνει με το όρισμα --run, και το βοηθητικό πρόγραμμα ελέγχου (εδώ gdb) είναι το πρώτο συμβολικό στο όρισμα --commmand-template. Το --args λέει στο gdb ότι το υπόλοιπο της γραμμής εντολών ανήκει στην «κατώτερο» πρόγραμμα. (Ορισμένοι gdb δεν καταλαβαίνουν το χαρακτηριστικό --args. Σε αυτήν την περίπτωση, παραλείψτε τους ορισμούς του προγράμματος από την --command-template, και να χρησιμοποιήσετε το gdb εντολή set args.)

Μπορούμε να συνδυάσουμε αυτή τη συνταγή και το προηγούμενο για να εκτελέσετε μια δοκιμή σύμφωνα με το πρόγραμμα εντοπισμού σφαλμάτων

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

Κατάλογος Εργασίας

Ο Waf χρειάζεται να τρέχει από την τοποθεσία του στην κορυφή του δέντρου του ns-3. Αυτό γίνεται ο κατάλογος εργασίας όπου θα γραφτούν τα αρχεία εξόδου. Τι γίνεται όμως αν θέλετε να διατηρήσετε αυτές τις ouf στο δέντρο ns-3 πηγαίου κώδικα; Χρησιμοποιήστε το `` –cwd`` επιχείρημα

$ ./waf --cwd=...

Μπορεί να είναι πιο βολικό να ξεκινήσετε με τον κατάλογο εργασίας σας όπου θέλετε τα αρχεία εξόδου, οπότε μπορεί να βοηθήσει το παρακάτω

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

Αυτό το στολίδι της προηγούμενης έκδοσης αποθηκεύει τον τρέχοντα κατάλογο εργασίας, cd στον κατάλογο Waf, και μετά δίνει εντολή στο Waf να αλλάξει τον κατάλογο εργασίας πίσω στον αποθηκευμένο τρέχοντα κατάλογο εργασίας πριν από την εκτέλεση του προγράμματος.