Εκμάθηση προσομοιωτή δικτύου ns-3. κεφάλαιο 3

Εκμάθηση προσομοιωτή δικτύου ns-3. κεφάλαιο 3
κεφάλαιο 1,2

3 Ξεκινώντας
3.1 Επισκόπηση
3.2 Προαπαιτούμενα
3.2.1 Λήψη της έκδοσης ns-3 ως αρχείο προέλευσης
3.3 Λήψη του ns-3 χρησιμοποιώντας το Git
3.3.1 Φόρτωση του ns-3 με το Bake
3.4 Συναρμολόγηση ns-3
3.4.1 Κτίριο με build.py
3.4.2 Κτίριο με Bake
3.4.3 Κατασκευή με Waf
3.5 Δοκιμή ns-3
3.6 Εκτέλεση του σεναρίου
3.6.1 Ορίσματα γραμμής εντολών
3.6.2 Εντοπισμός σφαλμάτων
3.6.3 Κατάλογος εργασίας

Κεφάλαιο 3

Ξεκινώντας

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

3.1 Επισκόπηση

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

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

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

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

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

3.2 Προαπαιτούμενα

Ολόκληρο το σύνολο των διαθέσιμων βιβλιοθηκών ns-3 έχει έναν αριθμό εξαρτήσεων από βιβλιοθήκες τρίτων, αλλά ως επί το πλείστον το ns-3 μπορεί να κατασκευαστεί και να χρησιμοποιηθεί με υποστήριξη για πολλά κοινά (συχνά εγκατεστημένα από προεπιλογή) στοιχεία: έναν μεταγλωττιστή C++, Python, ένας επεξεργαστής πηγαίου κώδικα (για παράδειγμα, ζωτικότης, emacs ή Έκλειψη) και, εάν χρησιμοποιούνται αποθετήρια ανάπτυξης, συστήματα ελέγχου έκδοσης Git. Οι περισσότεροι χρήστες για πρώτη φορά δεν θα χρειάζεται να ανησυχούν εάν η διαμόρφωσή τους αναφέρει ότι λείπουν ορισμένες προηγμένες λειτουργίες ns-3, αλλά για όσους θέλουν μια πλήρη εγκατάσταση, το έργο παρέχει ένα wiki που περιλαμβάνει σελίδες με πολλές χρήσιμες συμβουλές και κόλπα. Μια τέτοια σελίδα είναι η σελίδα εγκατάστασης, με οδηγίες εγκατάστασης για διάφορα συστήματα, διαθέσιμη στη διεύθυνση: https://www.nsnam.org/wiki/Installation.

Η ενότητα Προϋποθέσεις αυτού του wiki εξηγεί ποια πακέτα απαιτούνται για την υποστήριξη κοινών επιλογών ns-3 και παρέχει επίσης τις εντολές που χρησιμοποιούνται για την εγκατάστασή τους σε κοινές γεύσεις Linux ή macOS.

Μπορείτε να επωφεληθείτε από αυτήν την ευκαιρία για να εξερευνήσετε τη σελίδα wiki ns-3 ή τον κύριο ιστότοπο: https://www.nsnam.org, γιατί υπάρχουν πολλές πληροφορίες εκεί. Ξεκινώντας με την πιο πρόσφατη έκδοση του ns-3 (ns-3.29), απαιτούνται τα ακόλουθα εργαλεία για την εκτέλεση του ns-3:

Πακέτο εργαλείων/Έκδοση

  • C++ μεταγλωττιστής
    clang++ ή g++ (g++ έκδοση 4.9 ή νεότερη)
  • Python
    έκδοση python2 >= 2.7.10 ή έκδοση python3 >=3.4
  • Git
    οποιαδήποτε τελευταία έκδοση (για πρόσβαση στο ns-3 στο GitLab.com)
  • πίσσα
    οποιαδήποτε τελευταία έκδοση (για αποσυσκευασία έκδοσης ns‑3)
  • bunzip2
    οποιαδήποτε τελευταία έκδοση (για την αποσυσκευασία της έκδοσης ns-3)

Για να ελέγξετε την προεπιλεγμένη έκδοση της Python, πληκτρολογήστε python -V. Για να ελέγξετε την έκδοση g++, πληκτρολογήστε g++ -v. Εάν λείπει κάποιο εργαλείο ή είναι πολύ παλιό, ανατρέξτε στον οδηγό εγκατάστασης στη σελίδα wiki ns-3.

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

3.2.1 Λήψη της έκδοσης ns-3 ως αρχείο προέλευσης

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

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

$ 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 

Δώστε προσοχή στο βοηθητικό πρόγραμμα που χρησιμοποιείται παραπάνω wget, το οποίο είναι ένα εργαλείο γραμμής εντολών για τη λήψη αντικειμένων από το Διαδίκτυο. Εάν δεν το έχετε εγκαταστήσει, μπορείτε να χρησιμοποιήσετε το πρόγραμμα περιήγησής σας για αυτό.

Ακολουθώντας αυτά τα βήματα θα μεταφερθείτε στον κατάλογο ns-allinone-3.29, εκεί θα πρέπει να δείτε πολλά αρχεία και καταλόγους

$ cd ns-allinone-3.29
$ ls
bake constants.py ns-3.29 README
build.py netanim-3.108 pybindgen-0.17.0.post58+ngcf00cc0 util.py

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

3.3 Λήψη του ns-3 χρησιμοποιώντας το Git

Ο κώδικας ns-3 είναι διαθέσιμος στα αποθετήρια Git στο GitLab.com στη διεύθυνση https://gitlab.com/nsnam/. Ομάδα nsnam συγκεντρώνει τα διάφορα αποθετήρια που χρησιμοποιούνται από ένα έργο ανοιχτού κώδικα.

Ο ευκολότερος τρόπος για να αρχίσετε να χρησιμοποιείτε τα αποθετήρια Git είναι να διαχωρίσετε ή να κλωνοποιήσετε το περιβάλλον ns-3-αλλινόνη. Αυτό είναι ένα σύνολο σεναρίων που διαχειρίζεται τη φόρτωση και τη συναρμολόγηση των πιο συχνά χρησιμοποιούμενων υποσυστημάτων ns-3. Εάν είστε νέοι στο Git, οι όροι "fork" και "κλώνος" μπορεί να είναι άγνωστοι σε εσάς. Εάν ναι, συνιστούμε να κλωνοποιήσετε απλώς (δημιουργήστε το δικό σας αντίγραφο) το αποθετήριο που βρίσκεται στο GitLab.com ως εξής:

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

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

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

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

$ python download.py

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

$ python download.py -n ns-3.29

Μετά από αυτό το βήμα στον κατάλογο ns-3-αλλινόνη θα γίνει λήψη επιπλέον αποθετηρίων ns-3, ψήστε, pybindgen и νετανίμ.

Σημείωση
Σε ένα μηχάνημα με καθαρό Ubuntu16.04, έπρεπε να αλλάξω την εντολή σε αυτό: $ sudo python3 download.py -n ns-3.29 (εφεξής σημειώσεις του μεταφραστή).

3.3.1 Φόρτωση του ns-3 με το Bake

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

Ψήνω είναι ένα εργαλείο για συντονισμένη κατασκευή λογισμικού από πολλαπλά αποθετήρια, που αναπτύχθηκε για το έργο ns-3. Ψήνω μπορεί να χρησιμοποιηθεί για την απόκτηση εκδόσεων ανάπτυξης του ns-3, καθώς και για λήψη και δημιουργία επεκτάσεων της βασικής έκδοσης της διανομής ns-3, όπως το περιβάλλον Άμεση εκτέλεση κώδικα, CradleNetwork Simulation Cradle, τη δυνατότητα δημιουργίας νέων δεσμών Python και διαφόρων ns-3 «εφαρμογών».

Σημείωση
Το CradleNetwork Simulation Cradle είναι ένα πλαίσιο που σας επιτρέπει να χρησιμοποιείτε πραγματικές στοίβες δικτύου TCP/IP μέσα σε έναν προσομοιωτή δικτύου.

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

Στις τελευταίες εκδόσεις ns-3 Ψήνω προστέθηκε στην απελευθέρωση πίσσας. Η έκδοση περιλαμβάνει ένα αρχείο διαμόρφωσης που σας επιτρέπει να κάνετε λήψη των τρεχουσών εκδόσεων λογισμικού τη στιγμή της κυκλοφορίας. Αυτή είναι, για παράδειγμα, η έκδοση Ψήνω, το οποίο διανέμεται με την έκδοση ns-3.29, μπορεί να χρησιμοποιηθεί για την ανάκτηση στοιχείων για αυτήν την έκδοση του ns-3 ή προγενέστερη, αλλά δεν μπορεί να χρησιμοποιηθεί για την ανάκτηση στοιχείων για μεταγενέστερες εκδόσεις (αν το αρχείο περιγραφής πακέτου bakeconf.xml δεν ενημερώθηκε).

Μπορείτε επίσης να λάβετε το πιο πρόσφατο αντίγραφο ψήστεεισάγοντας την ακόλουθη εντολή στην κονσόλα Linux σας (υποθέτοντας ότι έχετε εγκαταστήσει το Git):

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

Όταν εκτελείτε την εντολή git, θα πρέπει να δείτε κάτι σαν το εξής:

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.

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

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

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

  1. ns-3.29: μονάδα που αντιστοιχεί στην απελευθέρωση. Θα κατεβάσει στοιχεία παρόμοια με την έκδοση στο tarball.

  2. ns-3-dev: μια παρόμοια ενότητα, αλλά χρησιμοποιώντας κώδικα από το δέντρο ανάπτυξης.

  3. ns-αλλινόνη-3.29: Μια λειτουργική μονάδα που περιλαμβάνει άλλες πρόσθετες δυνατότητες, όπως η δρομολόγηση κλικ και η βάση προσομοίωσης δικτύου, το Openflow για ns-3.

  4. ns-3-αλλινόνη: παρόμοια με την έκδοση έκδοσης της μονάδας όλα σε ένα, αλλά για τον κώδικα ανάπτυξης.

Σημείωση
Πατήστε — αρθρωτή αρχιτεκτονική λογισμικού για τη δημιουργία δρομολογητών.

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

Το τρέχον στιγμιότυπο ανάπτυξης (μη κυκλοφορία) ns-3 μπορεί να βρεθεί στη διεύθυνση:https://gitlab.com/nsnam/ns-3-dev.git.

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

Μπορείτε να βρείτε την πιο πρόσφατη έκδοση του κώδικα περιηγώντας τη λίστα των αποθετηρίων ή μεταβαίνοντας στην ιστοσελίδα ns-3 Releases:https://www.nsnam.org/releases/ και κάνοντας κλικ στον σύνδεσμο της πιο πρόσφατης έκδοσης. Σε αυτό το παράδειγμα θα συνεχίσουμε με το ns-3.29.

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

Το Bake λειτουργεί με τη φόρτωση πηγών πακέτων σε έναν κατάλογο πηγή και εγκατάσταση των βιβλιοθηκών στον κατάλογο κατασκευής. Ψήνω μπορεί να εκτελεστεί με αναφορά στο δυαδικό, αλλά αν θέλετε να τρέξετε Ψήνω όχι από τον κατάλογο στον οποίο έγινε λήψη, συνιστάται να προσθέσετε τη διαδρομή προς ψήστε στη διαδρομή σας (μεταβλητή περιβάλλοντος PATH), για παράδειγμα ως εξής (παράδειγμα για το Linux bash shell). Μεταβείτε στον κατάλογο "bake" και, στη συνέχεια, ορίστε τις ακόλουθες μεταβλητές περιβάλλοντος:

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

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

Μεταβείτε στον κατάλογο εργασίας σας και εισαγάγετε τα ακόλουθα στην κονσόλα:

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

Στη συνέχεια θα ρωτήσουμε Ψήνω ελέγξτε αν έχουμε αρκετά εργαλεία για να φορτώσουμε τα διάφορα εξαρτήματα. Καντράν:

$ ./bake.py check

Θα πρέπει να δείτε κάτι σαν το εξής:

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

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

Στη συνέχεια, δοκιμάστε να κάνετε λήψη του λογισμικού:

$ ./bake.py download

το αποτέλεσμα θα πρέπει να είναι κάτι σαν:

>> Searching for system dependency setuptools - OK 
>> Searching for system dependency libgoocanvas2 - OK 
>> Searching for system dependency gi-cairo - OK 
>> Searching for system dependency pygobject - OK 
>> Searching for system dependency pygraphviz - OK 
>> Searching for system dependency python-dev - OK 
>> Searching for system dependency qt - OK 
>> Searching for system dependency g++ - OK 
>> Downloading pybindgen-0.19.0.post4+ng823d8b2 (target directory:pybindgen) - OK 
>> Downloading netanim-3.108 - OK 
>> Downloading ns-3.29 - OK

Αυτό σημαίνει ότι έχουν γίνει λήψη τριών πηγών. Τώρα μεταβείτε στον κατάλογο προέλευσης και πληκτρολογήστε ls. Πρέπει να δεις:

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

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

3.4 Συναρμολόγηση ns-3

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

3.4.1 Κτίριο με build.py

Προσοχή! Αυτό το βήμα δημιουργίας είναι διαθέσιμο μόνο από την έκδοση αρχείου προέλευσης που λαμβάνεται όπως περιγράφεται παραπάνω. και δεν γίνεται λήψη μέσω git ή bake.

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

Εάν κατεβάσατε χρησιμοποιώντας tarball, στη συνέχεια στον κατάλογό σας ~/χώρος εργασίας ένας κατάλογος με ένα όνομα κάτι σαν ns-αλλινόνη-3.29. Εισάγετε τα ακόλουθα:

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

Κατά την κλήση build.py Χρησιμοποιήσαμε ορίσματα γραμμής εντολών για να δημιουργήσουμε τα παραδείγματα και τις δοκιμές που χρησιμοποιούνται σε αυτό το σεμινάριο, τα οποία δεν έχουν κατασκευαστεί από προεπιλογή στο ns-3. Από προεπιλογή, το πρόγραμμα δημιουργεί επίσης όλες τις διαθέσιμες ενότητες. Στη συνέχεια, αν θέλετε, μπορείτε να δημιουργήσετε το ns-3 χωρίς παραδείγματα και δοκιμές ή να αποκλείσετε ενότητες που δεν χρειάζονται για την εργασία σας.

Θα δείτε πολλά μηνύματα εξόδου του μεταγλωττιστή που εμφανίζονται από το σενάριο καθώς δημιουργεί τα διάφορα μέρη που έχετε φορτώσει. Πρώτα το σενάριο θα προσπαθήσει να δημιουργήσει το animator νετανίμ, στη συνέχεια η γεννήτρια σύνδεσης pybindgen και τέλος ns-3. Όταν ολοκληρωθεί η διαδικασία, θα πρέπει να δείτε τα εξής:

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

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

Modules not built (see ns-3 tutorial for explanation):
brite                  click                    openflow 
Leaving directory ./ns-3.29

Στις τρεις τελευταίες γραμμές της καταχώρισης βλέπουμε ένα μήνυμα σχετικά με λειτουργικές μονάδες που δεν κατασκευάστηκαν:

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

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

3.4.2 Κτίριο με Bake

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

$ ./bake.py build

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

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

Συμβουλή: Μπορείτε επίσης να κάνετε ταυτόχρονα τα βήματα λήψης και δημιουργίας καλώντας το "bake.py deploy".

Η συναρμολόγηση όλων των εξαρτημάτων μπορεί να αποτύχει, αλλά η συναρμολόγηση θα συνεχιστεί εάν δεν απαιτείται εξάρτημα. Για παράδειγμα, ένα πρόσφατο ζήτημα φορητότητας ήταν αυτό castxml μπορεί να συναρμολογηθεί με εργαλείο ψήστε όχι σε όλες τις πλατφόρμες. Σε αυτήν την περίπτωση, θα εμφανιστεί ένα μήνυμα όπως αυτό:

>> Building castxml - Problem 
> Problem: Optional dependency, module "castxml" failed
This may reduce the functionality of the final build.
However, bake will continue since "castxml" is not an essential dependency.
For more information call bake with -v or -vvv, for full verbose mode.

Αλλά castxml χρειάζεται μόνο εάν θέλετε να δημιουργήσετε ενημερωμένες δεσμεύσεις Python. Για τους περισσότερους χρήστες δεν χρειάζεται κάτι τέτοιο (τουλάχιστον μέχρι να αλλάξουν το ns-3), επομένως τέτοιες προειδοποιήσεις μπορούν να αγνοηθούν με ασφάλεια προς το παρόν.

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

$ ./bake.py show

Θα παρατίθενται οι διάφορες εξαρτήσεις των πακέτων που προσπαθείτε να δημιουργήσετε.

3.4.3 Κατασκευή με Waf

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

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

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

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

Setting top to      : /home/ns3user/workspace/bake/source/ns-3-dev
Setting out to      : /home/ns3user/workspace/bake/source/ns-3-dev/build
Checking for 'gcc' (C compiler)        : /usr/bin/gcc 
Checking for cc version                : 7.3.0 
Checking for 'g++' (C++ compiler)      : /usr/bin/g++ 
Checking for compilation flag -march=native support : ok 
Checking for compilation flag -Wl,--soname=foo support : ok 
Checking for compilation flag -std=c++11 support       : ok 
Checking boost includes   : headers not found, please ,!provide a --boost-includes argument (see help) 
Checking boost includes   : headers not found, please ,!provide a --boost-includes argument (see help) 
Checking for program 'python'            : /usr/bin/python 
Checking for python version >= 2.3       : 2.7.15 python-config                                                                     : /usr/bin/python-config
Asking python-config for pyembed '--cflags --libs --ldflags' flags : yes
Testing pyembed configuration                                      : yes
Asking python-config for pyext '--cflags --libs --ldflags' flags   : yes
Testing pyext configuration                                        : yes

Checking for compilation flag -fvisibility=hidden support          : ok 
Checking for compilation flag -Wno-array-bounds support            : ok 
Checking for pybindgen location          : ../pybindgen ,!(guessed) 
Checking for python module 'pybindgen'   : 0.19.0. ,!post4+g823d8b2 
Checking for pybindgen version           : 0.19.0. ,!post4+g823d8b2 
Checking for code snippet                : yes 
Checking for types uint64_t and unsigned long equivalence : no 
Checking for code snippet                                 : no 
Checking for types uint64_t and unsigned long long equivalence     : yes 
Checking for the apidefs that can be used for Python bindings                       : gcc-LP64 
Checking for internal GCC cxxabi         : complete 
Checking for python module 'pygccxml'    : not found 
Checking for click location              : not found 
Checking for program 'pkg-config'        : /usr/bin/pkg- ,!config 
Checking for 'gtk+-3.0'                  : not found 
Checking for 'libxml-2.0'                : yes 
checking for uint128_t                   : not found 
checking for __uint128_t                 : yes 
Checking high precision implementation   : 128-bit integer ,!(default) 
Checking for header stdint.h             : yes 
Checking for header inttypes.h           : yes 
Checking for header sys/inttypes.h       : not found 
Checking for header sys/types.h          : yes 
Checking for header sys/stat.h           : yes 
Checking for header dirent.h             : yes 
Checking for header stdlib.h             : yes 
Checking for header signal.h             : yes 
Checking for header pthread.h            : yes 
Checking for header stdint.h             : yes 
Checking for header inttypes.h           : yes 
Checking for header sys/inttypes.h       : not found
Checking for library rt                  : yes 
Checking for header sys/ioctl.h          : yes 
Checking for header net/if.h             : yes 
Checking for header net/ethernet.h       : yes 
Checking for header linux/if_tun.h       : yes 
Checking for header netpacket/packet.h   : yes 
Checking for NSC location                : not found 
Checking for 'sqlite3'                   : not found 
Checking for header linux/if_tun.h       : yes 
Checking for python module 'gi'          : 3.26.1 
Checking for python module 'gi.repository.GObject'      : ok 
Checking for python module 'cairo'                      : ok 
Checking for python module 'pygraphviz'                 : 1.4rc1 
Checking for python module 'gi.repository.Gtk'          : ok 
Checking for python module 'gi.repository.Gdk'          : ok 
Checking for python module 'gi.repository.Pango'        : ok 
Checking for python module 'gi.repository.GooCanvas'    : ok 
Checking for program 'sudo'                             : /usr/bin/sudo 
Checking for program 'valgrind'                         : not found 
Checking for 'gsl' : not found python-config            : not found 
Checking for compilation flag -fstrict-aliasing support : ok 
Checking for compilation flag -fstrict-aliasing support : ok 
Checking for compilation flag -Wstrict-aliasing support : ok 
Checking for compilation flag -Wstrict-aliasing support : ok 
Checking for program 'doxygen'                          : /usr/bin/doxygen
---- Summary of optional ns-3 features:
Build profile : optimized
Build directory : 
BRITE Integration : not enabled (BRITE not enabled (see option --with- ,!brite)) 
DES Metrics event collection : not enabled (defaults to disabled) 
Emulation FdNetDevice        : enabled 
Examples                     : enabled 
File descriptor NetDevice    : enabled 
GNU Scientific Library (GSL) : not enabled (GSL not found) 
Gcrypt library               : not enabled
(libgcrypt not found: you can use ,!libgcrypt-config to find its location.) GtkConfigStore               : not enabled (library 'gtk+-3.0 >= 3.0' not fou   nd)
MPI Support                  : not enabled (option --enable-mpi not selected)
ns-3 Click Integration       : not enabled (nsclick not enabled (see option --with- ,!nsclick))
ns-3 OpenFlow Integration   : not enabled (Required boost libraries not found) 
Network Simulation Cradle    : not enabled (NSC not found (see option --with-nsc))
PlanetLab FdNetDevice         : not enabled (PlanetLab operating system not detected ,!(see option --force-planetlab)) PyViz visualizer : enabled 
Python API Scanning Support   : not enabled (Missing 'pygccxml' Python module)
Python Bindings : enabled 
Real Time Simulator           : enabled 
SQlite stats data output      : not enabled (library 'sqlite3' not found)
Tap Bridge                    : enabled 
Tap FdNetDevice               : enabled
Tests                         : enabled 
Threading Primitives          : enabled 
Use sudo to set suid bit   : not enabled (option --enable-sudo not selected)
XmlIo                         : enabled
'configure' finished successfully (6.387s)

Παρακαλώ σημειώστε το τελευταίο μέρος της παραπάνω λίστας. Ορισμένες επιλογές ns-3 δεν είναι ενεργοποιημένες από προεπιλογή ή απαιτούν υποστήριξη συστήματος για να λειτουργήσουν σωστά. Για παράδειγμα, για να ενεργοποιήσετε το XmlTo, η βιβλιοθήκη πρέπει να υπάρχει στο σύστημα libxml-2.0. Εάν αυτή η βιβλιοθήκη δεν βρέθηκε και η αντίστοιχη λειτουργία ns-3 δεν ήταν ενεργοποιημένη, θα εμφανιστεί ένα μήνυμα. Σημειώστε επίσης ότι είναι δυνατή η χρήση της εντολής sudo για να ορίσετε το suid bit "ορισμός αναγνωριστικού ομάδας κατά το χρόνο εκτέλεσης" για ορισμένα προγράμματα. Δεν είναι ενεργοποιημένη από προεπιλογή και επομένως αυτή η δυνατότητα εμφανίζεται ως "μη ενεργοποιημένη". Τέλος, για να λάβετε μια λίστα με ενεργοποιημένες επιλογές, χρησιμοποιήστε βάφ με παράμετρο --check-config.

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

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

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

$ ./waf

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

Για να ελέγξετε ποιο προφίλ είναι ενεργό για μια δεδομένη διαμόρφωση έργου, υπάρχει μια εντολή:

$ ./waf --check-profile 
Waf: Entering directory `/path/to/ns-3-allinone/ns-3.29/build' 
Build profile: debug

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

$ ./build.py --disable-python

η αντίδραση θα είναι η εξής:

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

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

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

γιατί δημιουργεί την κύρια εντολή ./waf configure --disable-python. Ακολουθούν μερικές ακόμη εισαγωγικές συμβουλές σχετικά με βάφ.

Χειρισμός σφαλμάτων κατασκευής

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

Για παράδειγμα, υπήρχε προηγουμένως μια κυκλοφορία του ns-3.28 για το Fedora 28, η οποία περιελάμβανε μια νέα κύρια έκδοση gcc (gcc-8). Κατά τη δημιουργία της έκδοσης ns-3.28 ή παλαιότερων εκδόσεων στο Fedora 28, με εγκατεστημένο το Gtk2+, θα παρουσιαστεί το ακόλουθο σφάλμα:

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

Σε εκδόσεις που ξεκινούν από ns‑3.28.1, σε βάφ είναι διαθέσιμη μια επιλογή για την επίλυση αυτών των προβλημάτων. Απενεργοποιεί τη ρύθμιση της σημαίας "-Λάθος" σε g++ και clang++. Αυτή είναι η επιλογή "--disable-error" και πρέπει να εφαρμοστεί κατά τη διαμόρφωση:

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

Διαμόρφωση ή συναρμολόγηση

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

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

Αν το κάνετε αυτό βάφ θα ξεκινήσει sudoγια να αλλάξετε τα προγράμματα δημιουργίας υποδοχών κώδικα εξομοίωσης ώστε να εκτελούνται με δικαιώματα ρίζα. Σε βάφ Υπάρχουν πολλές άλλες διαθέσιμες επιλογές για τα βήματα διαμόρφωσης και κατασκευής. Για να εξερευνήσετε τις επιλογές σας, εισαγάγετε:

$ ./waf --help

Στην επόμενη ενότητα θα χρησιμοποιήσουμε ορισμένες επιλογές που σχετίζονται με τη δοκιμή.

Προφίλ συναρμολόγησης

Έχουμε ήδη δει πώς μπορείτε να ρυθμίσετε τις παραμέτρους βάφ για συνελεύσεις debug и βελτιστοποιημένη:

$ ./waf --build-profile=debug

Υπάρχει επίσης ένα ενδιάμεσο προφίλ συναρμολόγησης, απελευθερώνουν. Επιλογή -d είναι συνώνυμο με --build-profile. Το προφίλ κατασκευής ελέγχει τη χρήση των διακοπτών καταγραφής, ισχυρισμών και βελτιστοποίησης μεταγλωττιστή:

Εκμάθηση προσομοιωτή δικτύου ns-3. κεφάλαιο 3

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

Εάν έχετε κώδικα που πρέπει να εκτελείται μόνο σε συγκεκριμένα προφίλ έκδοσης, χρησιμοποιήστε τη Μακροεντολή Code Wrapper:

NS_BUILD_DEBUG (std::cout << "Part of an output line..." << std::flush; timer.Start ,!()); DoLongInvolvedComputation ();
NS_BUILD_DEBUG (timer.Stop (); std::cout << "Done: " << timer << std::endl;)

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

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

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

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

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

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

$ 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

Μεταγλωττιστές και σημαίες

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

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

Με τον ίδιο τρόπο μπορείτε να διαμορφώσετε βάφ για χρήση κατανεμημένης μεταγλώττισης χρησιμοποιώντας distcc:

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

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

Εγκατάσταση

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

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

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

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

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

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

Waf single

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

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

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

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

$ cd scratch 
$ waff build

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

3.5 Δοκιμή ns-3

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

$ ./test.py

Αυτές οι δοκιμές εκτελούνται παράλληλα με βάφ. Τελικά θα πρέπει να δείτε ένα μήνυμα που λέει:

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

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

Θα δείτε επίσης την τελική έξοδο από βάφ και ένας ελεγκτής που εκτελεί κάθε δοκιμή, η οποία θα μοιάζει κάπως έτσι:

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: ..." μπορεί να είναι διαφορετική, αυτό είναι φυσιολογικό. Αυτό που είναι σημαντικό είναι ότι η γραμμή σύνοψης στο τέλος της αναφοράς δείχνει ότι όλες οι δοκιμές πέρασαν, κανένα τεστ δεν απέτυχε ή συνετρίβη.) Και βάφΚαι test.py θα παραλληλίσει την εργασία στους διαθέσιμους πυρήνες επεξεργαστή του μηχανήματος.

3.6 Εκτέλεση του σεναρίου

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

$ ./waf --run hello-simulator

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

Hello Simulator

Συγχαρητήρια! Είστε πλέον χρήστης ns-3!

Τι πρέπει να κάνω εάν δεν δω αποτελέσματα;

Αν δείτε μηνύματα βάφυποδεικνύοντας ότι η κατασκευή ολοκληρώθηκε με επιτυχία, αλλά δεν βλέπετε την έξοδο "Hello Simulator", τότε υπάρχει πιθανότητα στην ενότητα [Build-with-Waf] να έχετε αλλάξει τη λειτουργία δόμησής σας σε βελτιστοποιημένη, αλλά έχασε την επιστροφή στη λειτουργία debug. Όλη η έξοδος της κονσόλας που χρησιμοποιείται σε αυτό το σεμινάριο χρησιμοποιεί ένα ειδικό στοιχείο ns-3 που εκτελεί καταγραφή και χρησιμοποιείται για την εκτύπωση προσαρμοσμένων μηνυμάτων στην κονσόλα. Η έξοδος από αυτό το στοιχείο απενεργοποιείται αυτόματα όταν μεταγλωττίζεται ο βελτιστοποιημένος κώδικας - είναι "βελτιστοποιημένος". Εάν δεν βλέπετε την έξοδο "Hello Simulator", εισαγάγετε τα εξής:

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

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

$ ./waf

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

3.6.1 Ορίσματα γραμμής εντολών

Για να μεταβιβάσετε ορίσματα γραμμής εντολών στο πρόγραμμα ns-3, χρησιμοποιήστε το ακόλουθο μοτίβο:

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

Αντικαθιστώ στο όνομα του προγράμματός σας και στα επιχειρήματα. Διαφωνία - -command-template για βάφ είναι ουσιαστικά μια συνταγή για τη δημιουργία της πραγματικής γραμμής εντολών βάφ χρησιμοποιείται για την εκτέλεση του προγράμματος. Το Waf ελέγχει ότι η κατασκευή έχει ολοκληρωθεί, ορίζει τις διαδρομές της κοινόχρηστης βιβλιοθήκης και, στη συνέχεια, χρησιμοποιεί το παρεχόμενο πρότυπο γραμμής εντολών και αντικαθιστά το όνομα του προγράμματος για το σύμβολο κράτησης θέσης %s για να καλέσει το εκτελέσιμο αρχείο. Εάν βρίσκετε αυτή τη σύνταξη περίπλοκη, υπάρχει μια απλούστερη έκδοση που περιλαμβάνει το πρόγραμμα ns-3 και τα ορίσματά του που περικλείονται σε μονά εισαγωγικά:

$ ./waf --run '<ns3-program> --arg1=value1 --arg2=value2 ...'

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

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

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

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

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

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

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

Σημειώστε ότι το όνομα του προγράμματος ns-3 συνοδεύεται από το όρισμα - -run, και το βοηθητικό πρόγραμμα διαχείρισης (εδώ gdb) είναι το πρώτο διακριτικό στο επιχείρημα - -command-template. Επιλογή - -args εκθέσεις gdbότι η υπόλοιπη γραμμή εντολών ανήκει στο «κάτω» πρόγραμμα. (Κάποιες εκδόσεις gdb δεν καταλαβαίνω την επιλογή - -args. Σε αυτήν την περίπτωση, καταργήστε τα ορίσματα του προγράμματος από - -command-template και χρησιμοποιήστε το σύνολο εντολών gdb args.) Μπορούμε να συνδυάσουμε αυτήν τη συνταγή και την προηγούμενη για να εκτελέσουμε τη δοκιμή κάτω από το πρόγραμμα εντοπισμού σφαλμάτων:

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

3.6.3 Κατάλογος εργασίας

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

$ ./waf --cwd=...

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

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

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

Συνέχεια: Κεφάλαιο 4

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο