
3 Rozpoczęcie pracy
3.1 Przegląd
3.2 Wymagania wstępne
3.2.1 Pobieranie wersji ns-3 w postaci archiwum źródłowego
3.3 Pobieranie ns-3 za pomocą Git
3.3.1 Pobieranie ns-3 za pomocą Bake
3.4 Kompilacja ns-3
3.4.1 Kompilacja za pomocą build.py
3.4.2 Kompilacja za pomocą Bake
3.4.3 Kompilacja za pomocą Waf
3.5 Testowanie ns-3
3.6 Uruchamianie skryptu
3.6.1 Argumenty wiersza poleceń
3.6.2 Debugowanie
3.6.3 Katalog roboczy
Rozdział 3
Rozpoczęcie pracy
Rozdział ten ma na celu przygotowanie czytelnika do pracy z komputerem, na którym być może nigdy nie był zainstalowany ns-3. Wprowadzenie obejmuje obsługiwane platformy, wymagania wstępne, metody uzyskiwania ns-3, metody kompilacji ns-3 oraz sposoby weryfikacji kompilacji i uruchamiania prostych programów.
3.1 Przegląd
Symulator ns-3 został zbudowany jako system współpracujących bibliotek programowych. Podczas kompilacji kod programów użytkownika jest linkowany z tymi bibliotekami. Do pisania programów użytkownika używa się języków programowania C++ lub Python.
Ns-3 jest dystrybuowany w postaci kodu źródłowego, co oznacza, że docelowy system musi mieć środowisko programistyczne, aby najpierw skompilować biblioteki, a następnie zbudować program użytkownika. W zasadzie ns-3 może być dystrybuowany jako gotowe biblioteki dla określonego systemu, i w przyszłości mogą być dystrybuowane w ten sposób. Jednak obecnie wielu użytkowników faktycznie wykonuje swoją pracę, edytując sam ns-3, dlatego przydatne jest posiadanie kodu źródłowego do kompilacji bibliotek. Jeśli ktoś chciałby podjąć się pracy nad tworzeniem gotowych bibliotek i pakietów dla systemów operacyjnych, proszę skontaktować się z listą dyskusyjną. ns-developers.
Następnie omówimy trzy sposoby pobierania i kompilacji ns-3. Pierwszym jest pobranie i zbudowanie oficjalnej wersji z głównej strony. Drugim jest pobranie i skompilowanie deweloperskich wersji podstawowej instalacji ns-3. Trzecim jest użycie dodatkowych narzędzi do budowy w celu pobrania większej liczby rozszerzeń dla ns-3. Przejdziemy przez każdy z nich, ponieważ narzędzia różnią się nieco.
Z doświadczeniem użytkownicy systemu Linux mogą się zastanawiać, dlaczego ns‑3 nie jest dostarczany jako pakiet, jak większość innych bibliotek korzystających z menedżera pakietów. Mimo że istnieją pakiety binarne dla różnych dystrybucji systemu Linux (np. Debian), większość użytkowników ostatecznie edytuje biblioteki i musi samodzielnie kompilować ns‑3, dlatego dostępność kodu źródłowego jest wygodna. Z tego powodu skupimy się na instalacji z kodu źródłowego.
Dla większości zastosowań ns‑3 prawa root nie są wymagane, zaleca się używanie nieuprzywilejowanego konta użytkownika.
3.2 Wymagania wstępne
Cały zestaw dostępnych bibliotek ns‑3 ma szereg zależności od bibliotek zewnętrznych, ale w większości ns‑3 może być skompilowany i używany z wsparciem dla kilku popularnych (często instalowanych domyślnie) komponentów: kompilator C++, Python, edytor kodu źródłowego (np. vim, emacs lub Eclipse) oraz, jeśli używane są repozytoria deweloperskie, systemy kontroli wersji Git. Większość początkujących użytkowników nie musi się martwić, jeśli ich konfiguracja raportuje o pewnych brakujących dodatkowych funkcjach ns‑3, ale dla tych, którzy pragną pełnej instalacji, projekt ma wiki, która zawiera strony z wieloma przydatnymi wskazówkami i poradami. Jedną z takich stron jest strona "Instalacja" z instrukcjami dotyczącymi instalacji dla różnych systemów, dostępnych pod tym adresem: .
Sekcja „Wymagania wstępne” tej strony wiki wyjaśnia, jakie pakiety są wymagane do wsparcia ogólnych opcji ns‑3 i dostarcza komendy używane do ich instalacji w popularnych wersjach Linux lub macOS.
Możesz skorzystać z możliwości zapoznania się z wiki ns‑3 lub główną stroną internetową: , ponieważ tam znajduje się wiele informacji. Zaczynając od ostatniej wersji ns‑3 (ns‑3.29), do uruchomienia ns‑3 wymagane są następujące narzędzia:
Narzędzie Pakiet/wersja
- Kompilator C++
clang++ lub g++ (g++ wersja 4.9 lub wyższa) - Python
python2 wersja >= 2.7.10 lub python3 wersja >= 3.4 - Gitem
jakakolwiek najnowsza wersja (do uzyskania dostępu do ns‑3 na GitLab.com) - tar
jakakolwiek najnowsza wersja (do rozpakowania wydania ns‑3) - bunzip2
jakakolwiek najnowsza wersja (do rozpakowania wydania ns‑3)
Aby sprawdzić wersję Pythona zainstalowaną domyślnie, wpisz python -VAby sprawdzić wersję g++, wpisz g++ -v. Jeśli jakieś narzędzia są nieobecne lub zbyt stare, zapoznaj się z instrukcją instalacji na stronie wiki ns-3.
Od tego momentu zakładamy, że czytelnik pracuje w Linuxie, MacOS lub emulatorze środowiska Linux i ma przynajmniej wymienione wcześniej narzędzia.
3.2.1 Pobieranie wersji ns-3 w postaci archiwum źródłowego
To jest sposób działania nowego użytkownika, który chce pobrać i eksperymentować z najnowszymi wersjami wydania i pakietu ns-3. Wydania ns-3 publikowane są w postaci skompresowanych archiwów źródłowych, czasami nazywanych tarball. tarball — to specjalny format archiwum programowego, w którym wiele plików jest łączonych w jeden. Archiwum zazwyczaj jest skompresowane. Proces pobierania ns-3 przez tarball jest prosty, wystarczy wybrać wydanie, pobrać je i rozpakować.
Zakładając, że jako użytkownik chcesz skompilować ns-3 w lokalnym katalogu o nazwie workspace, możesz uzyskać roboczą kopię wydania, wpisując w konsoli Linux następujące komendy (oczywiście zastępując odpowiednie numery wersji)
$ 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 Zauważ używaną powyżej narzędzie . Wersje ICU są nieistotne., które jest narzędziem wiersza poleceń do pobierania obiektów z Internetu. Jeśli go nie zainstalowałeś, możesz użyć do tego przeglądarki.
Podążając tymi krokami, przejdziesz do katalogu ns-allinone-3.29, gdzie powinieneś zobaczyć kilka plików i katalogów
$ 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.pyTeraz jesteś gotów skompilować podstawową dystrybucję ns-3 i możesz przejść do sekcji dotyczącej kompilacji ns-3.
3.3 Pobieranie ns-3 za pomocą Git
Kod ns-3 jest dostępny w repozytoriach Git na GitLab.com pod adresem . Grupa nsnam łączy różne repozytoria używane przez projekt z otwartym kodem źródłowym.
Najprostszym sposobem rozpoczęcia korzystania z repozytoriów Git jest zrobienie forka lub sklonowanie środowiska ns-3-allinone. To zestaw skryptów, który zarządza pobieraniem i kompilowaniem najczęściej używanych podsystemów ns-3. Jeśli jesteś nowy w Git, terminy 'fork' i 'klonowanie' mogą być ci obce; jeśli tak, zalecamy po prostu sklonowanie (stwórz swoją własną kopię) repozytorium znajdującego się na GitLab.com w ten sposób:
$ cd
$ mkdir workspace
$ cd workspace
$ git clone https://gitlab.com/nsnam/ns-3-allinone.git
$ cd ns-3-allinone Na tym etapie widok twojego katalogu ns-3-allinone nieco różni się od opisanej powyżej lokalizacji archiwum wydania. Powinna wyglądać mniej więcej tak:
$ ls
build.py constants.py download.py README util.pyZwróć uwagę na obecność skryptu download.py, który dodatkowo wyodrębni ns-3 oraz towarzyszący kod źródłowy. Tutaj masz do wyboru: możesz pobrać najnowszy zrzut rozwoju ns-3:
$ python download.pylub preferować wydanie ns-3, używając flagi -n do określenia numeru wydania:
$ python download.py -n ns-3.29Po tym kroku dodatkowe repozytoria ns-3-allinone zostaną pobrane do katalogu ns-3, bake, pybindgen i netanim.
Uwaga
Na maszynie z czystym Ubuntu 16.04 musiałem zmienić polecenie na następujące: $ sudo python3 download.py -n ns-3.29 (tutaj i dalej uwagi tłumacza).
3.3.1 Pobieranie ns-3 za pomocą Bake
Dwie wspomniane metody (archiwum kodu źródłowego lub repozytorium ns-3-allinone przez Git) są przydatne do uzyskania najprostszej instalacji ns-3 z wieloma dodatkami (pybindgen do generowania powiązań Python i netanim do animacji sieci). Trzecie repozytorium, dostarczane domyślnie w ns-3-allinone, nazywa się bake.
Bake — jest to narzędzie do skoordynowanej kompilacji oprogramowania z kilku repozytoriów, zaprojektowane dla projektu ns-3. Bake może być używane do uzyskania deweloperskich wersji ns-3, a także do pobierania i kompilacji rozszerzeń podstawowej wersji dystrybucji ns-3, takich jak środowisko Direct Code Execution, CradleNetwork Simulation Cradle, możliwość tworzenia nowych powiązań Python oraz różne "aplikacje" ns-3.
Uwaga
CradleNetwork Simulation Cradle — jest to framework, który pozwala na użycie rzeczywistych stosów sieciowych TCP/IP wewnątrz symulatora sieciowego.
Jeśli przewidujesz, że Twoja instalacja ns-3 powinna mieć rozwinięte lub dodatkowe funkcje, możesz podążać tą ścieżką instalacji.
W ostatnich wersjach ns-3 Bake został dodany w tar-wydaniu. Do wydania dołączono plik konfiguracyjny, który pozwala pobierać wersje oprogramowania aktualne na moment tworzenia wydania. To znaczy, na przykład, że wersja Bake, która jest dystrybuowana z wydaniem ns-3.29, może być używana do uzyskiwania komponentów dla tego wydania ns-3 lub wcześniejszych, ale nie może być używana do wyodrębniania komponentów dla późniejszych wydań (jeśli plik opisu pakietu bakeconf.xml nie został zaktualizowany).
Możesz również uzyskać najnowszą kopię bake, wpisując następujące polecenie w swoim terminalu Linux (pod warunkiem, że masz zainstalowanego Gita):
$ cd
$ mkdir workspace
$ cd workspace
$ git clone https://gitlab.com/nsnam/bake.gitPodczas wykonywania polecenia git powinieneś zobaczyć coś takiego:
Klonowanie do 'bake'...
remote: Obliczanie obiektów: 2086, zakończone.
remote: Liczenie obiektów: 100% (2086/2086), zakończone.
remote: Kompresowanie obiektów: 100% (649/649), zakończone.
remote: Łącznie 2086 (delta 1404), ponownie użyto 2078 (delta 1399)
Odbieranie obiektów: 100% (2086/2086), 2.68 MiB | 3.82 MiB/s, zakończone.
Rozwiązywanie delt: 100% (1404/1404), zakończone.Po zakończeniu polecenia clone powinieneś mieć katalog o nazwie bake, którego zawartość powinna wyglądać mniej więcej tak:
$ cd bake
$ ls
bake bakeconf.xml bake.py doc examples generate-binary.py test TODOZauważ, że pobrałeś kilka skryptów Pythona oraz moduł Pythona o nazwie bake i plik konfiguracyjny XML. Następnym krokiem będzie użycie tych skryptów do pobrania i zbudowania dystrybucji ns-3, którą wybierzesz. Dostępne są różne cele konfiguracji:
ns-3.29: moduł odpowiadający wersji wydania; pobierze komponenty podobne do wydania w archiwum tar;
ns-3-dev: podobny moduł, ale z użyciem kodu z gałęzi deweloperskiej;
ns-allinone-3.29: moduł, który zawiera inne dodatkowe funkcje, takie jak routowanie Click oraz Network Simulation Cradle, Openflow dla ns-3.
ns-3-allinone: podobnie jak wersja wydania modułu allinone, ale dla kodu deweloperskiego.
Uwaga
Click — modułowa architektura oprogramowania do tworzenia routerów.
Openflow — protokół zarządzania procesem przetwarzania danych przesyłanych w sieci przez routery i przełączniki, realizujący technologię sieci programowo-konfigurowanej.
Aktualny zrzut rozwoju (niewydany) ns-3 można znaleźć pod adresem:.
Deweloperzy starają się utrzymać te repozytoria w spójnym stanie roboczym, ale znajdują się one w fazie rozwoju i zawierają kod niewydany, dlatego jeśli nie planujesz korzystać z nowych funkcji, wybierz oficjalne wydanie.
Możesz znaleźć najnowszą wersję kodu, przeglądając listę repozytoriów lub przechodząc na stronę "ns-3 Releases": i klikając link do najnowszej wersji. W tym przykładzie kontynuujemy z ns-3.29.
Teraz, aby uzyskać potrzebne nam składniki ns-3, użyjemy narzędzia Bake. Powiedzmy trochę o tym, jak działa Bake.
Bake działa, pobierając źródła pakietów do katalogu source i instalując biblioteki w katalogu budowania. Bake można uruchomić, wskazując na plik binarny, ale jeśli chcesz uruchamiać Bake nie z katalogu, do którego został przeniesiony, warto dodać ścieżkę do bake twojej ścieżki (zmienna środowiskowa PATH), na przykład w następujący sposób (przykład dla powłoki Linux bash). Przejdź do katalogu „bake”, a następnie ustaw następujące zmienne środowiskowe:
$ export BAKE_HOME=`pwd`
$ export PATH=$PATH:$BAKE_HOME:$BAKE_HOME/build/bin
$ export PYTHONPATH=$PYTHONPATH:$BAKE_HOME:$BAKE_HOME/build/libTo umieści program bake.py w ścieżce powłoki, co pozwoli innym programom znajdować pliki wykonywalne i biblioteki stworzone przez bake. W niektórych przypadkach użycia bake, opisana powyżej konfiguracja PATH i PYTHONPATH nie jest wymagana, ale dla pełnej kompilacji ns‑3-allinone (z dodatkowymi pakietami) zwykle jest potrzebna.
Wejdź do katalogu roboczego i wpisz w konsoli następujące:
$ ./bake.py configure -e ns-3.29Następnie poprosimy Bake o sprawdzenie, czy mamy wystarczająco narzędzi do pobrania różnych komponentów. Wpisz:
$ ./bake.py checkPowinieneś zobaczyć coś takiego jak:
> Python - OK
> Kompilator GNU C++ - OK
> Mercurial - OK
> Git - OK
> Narzędzie Tar - OK
> Narzędzie do rozpakowywania - OK
> Make - OK
> cMake - OK
> Narzędzie patch - OK
> Szukana ścieżka narzędzi: /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin ...Szczególnie ważne są narzędzia do pobierania, takie jak Mercurial, CVS, Git i Bazaar, ponieważ pozwalają nam uzyskać kod. Na tym etapie zainstaluj brakujące narzędzia w sposób typowy dla twojego systemu (jeśli umiesz) lub poproś o pomoc swojego administratora systemu.
Następnie spróbuj pobrać oprogramowanie:
$ ./bake.py downloadwynikiem powinno być coś takiego jak:
>> Szukam zależności systemowych setuptools - OK
>> Szukam zależności systemowych libgoocanvas2 - OK
>> Szukam zależności systemowych gi-cairo - OK
>> Szukam zależności systemowych pygobject - OK
>> Szukam zależności systemowych pygraphviz - OK
>> Szukam zależności systemowych python-dev - OK
>> Szukam zależności systemowych qt - OK
>> Szukam zależności systemowych g++ - OK
>> Pobieram pybindgen-0.19.0.post4+ng823d8b2 (katalog docelowy: pybindgen) - OK
>> Pobieram netanim-3.108 - OK
>> Pobieram ns-3.29 - OKTo oznacza, że pobrano trzy źródła. Teraz przejdź do katalogu source i wpisz ls; powinieneś zobaczyć:
$ cd source
$ ls
netanim-3.108 ns-3.29 pybindgenTeraz jesteś gotowy, aby zbudować dystrybucję ns‑3.
3.4 Kompilacja ns-3
Podobnie jak w przypadku pobierania ns‑3, jest kilka sposobów na zbudowanie ns‑3. Najważniejsze, co chcemy podkreślić, to że ns‑3 jest budowany za pomocą narzędzia do budowy, zwanego Waf, opisanego poniżej. Większość użytkowników będzie pracować z Waf, ale istnieje kilka przydatnych skryptów, które pomogą Ci rozpocząć lub zorganizować bardziej złożone zestawienia. Dlatego zanim przeczytasz o Waf, spójrz na build.py i zestawieniu z bake.
3.4.1 Kompilacja za pomocą build.py
Uwaga! Ten krok budowy jest dostępny tylko z wersji archiwum źródłowego, uzyskanej w sposób opisany powyżej; a nie pobranej przez git lub bake.
Pracując z archiwum wydania tarball, w ns‑3‑allinone jest dostępny przydatny skrypt, który może uprościć budowę komponentów. Nazywa się build.py. Ten program dostosuje projekt do Ciebie w najbardziej użyteczny sposób. Należy jednak pamiętać, że bardziej złożone konfiguracje i praca z ns‑3 zwykle obejmują użycie własnego systemu budowy ns‑3, Waf, który zostanie przedstawiony później w tym przewodniku.
Jeśli pobrałeś za pomocą tarball, to w Twoim katalogu ~\/workspace powinien pojawić się katalog o nazwie coś w rodzaju ns-allinone-3.29. Wpisz następujące polecenie:
$ .\/build.py --enable-examples --enable-tests
Przy wywołaniu build.py zastosowaliśmy argumenty wiersza poleceń, aby zbudować przykłady i testy używane w tym przewodniku, które w ns‑3 domyślnie nie są budowane. Domyślnie program również buduje wszystkie dostępne moduły. Następnie, jeśli chcesz, możesz zbudować ns‑3 bez przykładów i testów lub wykluczyć moduły, które nie są potrzebne do Twojej pracy.
Zobaczysz wiele komunikatów o wyjściu kompilatora, wyświetlanych przez skrypt podczas budowy różnych załadowanych przez Ciebie części. Najpierw skrypt spróbuje zbudować animatora netanim, następnie generator powiązań pybindgen i na końcu ns‑3. Po zakończeniu procesu powinieneś zobaczyć następujące:
Waf: Leaving directory '\/path\/to\/workspace\/ns-allinone-3.29\/ns-3.29\/build'\n'build' finished successfully (6m25.032s) \n\nModules built:\nantenna aodv applications\nbrige buildings config-store\ncore csma csma-layout\ndsdv dsr energy \nfd-net-device flow-monitor internet\ninternet-apps lr-wpan lte\nmesh mobility mpi\nnetanim (no Python) network nix-vector-routing \nolsr point-to-point point-to-point-layout \npropagation sixlowpan spectrum \nstats tap-bridge test (no Python) \ntopology-read traffic-control uan \nvirtual-net-device visualizer wave \nwifi wimax \n\nModules not built (see ns-3 tutorial for explanation):\nbrite click openflow \nLeaving directory .\/ns-3.29W ostatnich trzech linijkach listingów widzimy komunikat o modułach, które nie zostały zbudowane:
Modules not built (see ns-3 tutorial for explanation):\nbrite clickTo tylko oznacza, że niektóre moduły ns-3, które zależą od zewnętrznych bibliotek, mogły nie zostać skompilowane lub że ich kompilacja nie jest wymagana dla tej konfiguracji. To nie oznacza, że symulator się nie skompilował lub skompilowane moduły będą działały nieprawidłowo.
3.4.2 Kompilacja za pomocą Bake
Jeśli powyżej do pobrania kodu źródłowego z repozytoriów projektu użyłeś bakes, możesz kontynuować jego użycie do kompilacji ns-3. Wpisz:
$ ./bake.py buildi powinieneś zobaczyć coś takiego:
>> Budowanie pybindgen-0.19.0.post4+ng823d8b2 - OK
>> Budowanie netanim-3.108 - OK
>> Budowanie ns-3.29 - OKWskazówka.: możesz również wykonać oba kroki jednocześnie, ładując i kompilując, wywołując „bake.py deploy”.
Podczas kompilacji wszystkich komponentów mogą wystąpić błędy, ale kompilacja będzie kontynuowana, jeśli komponent nie jest obowiązkowy. Na przykład, niedawny problem z przenośnością polegał na tym, że castxml może być kompilowany przez narzędzie bake nie na wszystkich platformach. W takim przypadku może pojawić się komunikat typu:
>> Budowanie castxml - Problem
> Problem: Opcjonalna zależność, moduł "castxml" nie powiódł się
Może to ograniczyć funkcjonalność finalnej kompilacji.
Jednak bake będzie kontynuować, ponieważ "castxml" nie jest istotną zależnością.
Więcej informacji można uzyskać, wywołując bake z opcją -v lub -vvv, aby uzyskać pełny tryb szczegółowy.Jednak castxml jest wymagany tylko wtedy, gdy chcesz stworzyć zaktualizowane powiązania Pythona. Dla większości użytkowników nie ma takiej potrzeby (przynajmniej do czasu, gdy nie zaczną zmieniać ns-3), więc takie ostrzeżenia można na razie bezpiecznie zignorować.
Jeśli wystąpi błąd, następne polecenie da ci wskazówki dotyczące brakujących zależności:
$ ./bake.py showZostaną wymienione różne zależności pakietów, które próbujesz skompilować.
3.4.3 Kompilacja za pomocą Waf
Do tego momentu, aby rozpocząć kompilację ns-3, użyliśmy albo skryptu build.py, albo narzędzia bake. Te narzędzia są przydatne do kompilacji ns-3 i utrzymania bibliotek. W rzeczywistości uruchamiają narzędzie kompilacji Waf z katalogu ns-3. Waf jest dystrybuowane razem z kodem źródłowym ns-3. Większość użytkowników do konfiguracji i kompilacji ns-3 szybko przechodzi do bezpośredniego użycia Waf. Więc aby kontynuować, proszę przejść do katalogu ns-3, który początkowo utworzyłeś.
Obecnie nie jest to ściśle wymagane, ale warto zrobić małe wprowadzenie i przyjrzeć się, jak wprowadzać zmiany w konfiguracji projektu. Prawdopodobnie najważniejszą zmianą konfiguracji, którą możesz wprowadzić, będzie stworzenie zoptymalizowanej wersji kodu. Domyślnie ustawiłeś swój projekt na budowanie wersji debug. Przyjrzyjmy się projektowi, aby stworzyć zoptymalizowaną wersję. Aby wyjaśnić Waf, że ma wykonać zoptymalizowane kompilacje, w tym przykłady i testy, musisz wykonać następujące polecenia:
$ ./waf clean
$ ./waf configure --build-profile=optimized --enable-examples --enable-testsTo uruchomi Waf poza lokalnym katalogiem (dla Twojej wygody). Pierwsze polecenie wykonuje czyszczenie poprzedniej kompilacji, które zazwyczaj nie jest ściśle konieczne, ale jest dobrym zwyczajem (zobacz także profile budowania poniżej); usunie wcześniej utworzone biblioteki i pliki obiektowe znajdujące się w katalogu build/. Kiedy projekt zostanie przekonfigurowany, a system budowania sprawdzi różne zależności, powinieneś zobaczyć wynik podobny do poniższego:
Ustawianie top na : /home/ns3user/workspace/bake/source/ns-3-dev
Ustawianie out na : /home/ns3user/workspace/bake/source/ns-3-dev/build
Sprawdzanie 'gcc' (kompilator C) : /usr/bin/gcc
Sprawdzanie wersji cc : 7.3.0
Sprawdzanie 'g++' (kompilator C++) : /usr/bin/g++
Sprawdzanie flagi kompilacji -march=native support : ok
Sprawdzanie flagi kompilacji -Wl,--soname=foo support : ok
Sprawdzanie flagi kompilacji -std=c++11 support : ok
Sprawdzanie, czy header boost jest dostępny : nagłówki nie znalezione, proszę, podaj argument --boost-includes (zobacz pomoc)
Sprawdzanie, czy header boost jest dostępny : nagłówki nie znalezione, proszę, podaj argument --boost-includes (zobacz pomoc)
Sprawdzanie programu 'python' : /usr/bin/python
Sprawdzanie wersji pythona >= 2.3 : 2.7.15 python-config : /usr/bin/python-config
Proszę o flagi pyembed '--cflags --libs --ldflags' : tak
Testowanie konfiguracji pyembed : tak
Proszę o flagi pyext '--cflags --libs --ldflags' : tak
Testowanie konfiguracji pyext : tak
Sprawdzanie flagi kompilacji -fvisibility=hidden support : ok
Sprawdzanie flagi kompilacji -Wno-array-bounds support : ok
Sprawdzanie lokalizacji pybindgen : ../pybindgen ,!(zgadnięte)
Sprawdzanie modułu pythona 'pybindgen' : 0.19.0. ,!post4+g823d8b2
Sprawdzanie wersji pybindgen : 0.19.0. ,!post4+g823d8b2
Sprawdzanie fragmentu kodu : tak
Sprawdzanie dla typów uint64_t i unsigned long ekwiwalentność : nie
Sprawdzanie fragmentu kodu : nie
Sprawdzanie dla typów uint64_t i unsigned long long ekwiwalentność : tak
Sprawdzanie dla apidef, które mogą być używane dla powiązań Pythona : gcc-LP64
Sprawdzanie wewnętrznego GCC cxxabi : zakończone
Sprawdzanie modułu pythona 'pygccxml' : nie znaleziono
Sprawdzanie lokalizacji click : nie znaleziono
Sprawdzanie programu 'pkg-config' : /usr/bin/pkg- ,!config
Sprawdzanie 'gtk+-3.0' : nie znaleziono
Sprawdzanie 'libxml-2.0' : tak
sprawdzanie uint128_t : nie znaleziono
sprawdzanie __uint128_t : tak
Sprawdzanie implementacji o wysokiej precyzji : 128-bitowa liczba całkowita ,!(domyślna)
Sprawdzanie nagłówka stdint.h : tak
Sprawdzanie nagłówka inttypes.h : tak
Sprawdzanie nagłówka sys/inttypes.h : nie znaleziono
Sprawdzanie nagłówka sys/types.h : tak
Sprawdzanie nagłówka sys/stat.h : tak
Sprawdzanie nagłówka dirent.h : tak
Sprawdzanie nagłówka stdlib.h : tak
Sprawdzanie nagłówka signal.h : tak
Sprawdzanie nagłówka pthread.h : tak
Sprawdzanie nagłówka stdint.h : tak
Sprawdzanie nagłówka inttypes.h : tak
Sprawdzanie nagłówka sys/inttypes.h : nie znaleziono
Sprawdzanie biblioteki rt : tak
Sprawdzanie nagłówka sys/ioctl.h : tak
Sprawdzanie nagłówka net/if.h : tak
Sprawdzanie nagłówka net/ethernet.h : tak
Sprawdzanie nagłówka linux/if_tun.h : tak
Sprawdzanie nagłówka netpacket/packet.h : tak
Sprawdzanie lokalizacji NSC : nie znaleziono
Sprawdzanie 'sqlite3' : nie znaleziono
Sprawdzanie nagłówka linux/if_tun.h : tak
Sprawdzanie modułu pythona 'gi' : 3.26.1
Sprawdzanie modułu pythona 'gi.repository.GObject' : ok
Sprawdzanie modułu pythona 'cairo' : ok
Sprawdzanie modułu pythona 'pygraphviz' : 1.4rc1
Sprawdzanie modułu pythona 'gi.repository.Gtk' : ok
Sprawdzanie modułu pythona 'gi.repository.Gdk' : ok
Sprawdzanie modułu pythona 'gi.repository.Pango' : ok
Sprawdzanie modułu pythona 'gi.repository.GooCanvas' : ok
Sprawdzanie programu 'sudo' : /usr/bin/sudo
Sprawdzanie programu 'valgrind' : nie znaleziono
Sprawdzanie 'gsl' : nie znaleziono python-config : nie znaleziono
Sprawdzanie flagi kompilacji -fstrict-aliasing support : ok
Sprawdzanie flagi kompilacji -fstrict-aliasing support : ok
Sprawdzanie flagi kompilacji -Wstrict-aliasing support : ok
Sprawdzanie flagi kompilacji -Wstrict-aliasing support : ok
Sprawdzanie programu 'doxygen' : /usr/bin/doxygen
---- Podsumowanie opcjonalnych funkcji ns-3:
Profil budowy : zoptymalizowany
Katalog budowy :
Integracja BRITE : nie włączona (BRITE nie włączone (zobacz opcję --with-,!brite))
Zbieranie metryk DES : nie włączone (domyślnie wyłączone)
Emulacja FdNetDevice : włączona
Przykłady : włączone
NetDevice deskryptor pliku : włączony
Biblioteka GNU Scientific (GSL) : nie włączona (GSL nie znaleziono)
Biblioteka Gcrypt : nie włączona
(nie znaleziono libgcrypt: możesz użyć ,!libgcrypt-config, aby znaleźć jej lokalizację.) GtkConfigStore : nie włączona (biblioteka 'gtk+-3.0 >= 3.0' nie znaleziono)
Wspieranie MPI : nie włączone (opcja --enable-mpi nie wybrana)
Integracja ns-3 Click : nie włączona (nsclick nie włączone (zobacz opcję --with-,!nsclick))
Integracja ns-3 OpenFlow : nie włączona (Wymagane biblioteki boost nie znalezione)
Kolebka Symulacji Sieciowej : nie włączona (NSC nie znaleziono (zobacz opcję --with-nsc))
PlanetLab FdNetDevice : nie włączona (system operacyjny PlanetLab nie wykryty ,!(zobacz opcję --force-planetlab)) Wizualizator PyViz : włączony
Wsparcie skanowania API Pythona : nie włączone (Brak modułu Pythona 'pygccxml')
Powiązania Pythona : włączone
Symulator Czasu Rzeczywistego : włączony
Dane wyjściowe statystyk SQlite : nie włączone (biblioteka 'sqlite3' nie znaleziona)
Most Tap : włączony
FdNetDevice Tap : włączony
Testy : włączone
Primitives wątkowe : włączone
Użyj sudo, aby ustawić bit suid : nie włączone (opcja --enable-sudo nie wybrana)
XmlIo : włączony
'configure' zakończone pomyślnie (6.387s)Zwróć uwagę na ostatnią część powyższego wpisu. Niektóre opcje ns‑3 nie są włączone domyślnie lub wymagają wsparcia ze strony systemu, aby działały poprawnie. Na przykład, aby włączyć XmlTo, potrzebna jest biblioteka libxml-2.0. Jeśli ta biblioteka nie została znaleziona, a odpowiednia funkcja ns‑3 nie byłaby włączona, wyświetlony zostanie komunikat. Zauważ także, że istnieje możliwość użycia polecenia sudo do ustawienia bitu suid 'ustawienie ID grupy podczas uruchamiania' dla niektórych programów. Domyślnie nie jest on włączony, dlatego ta funkcja jest wyświetlana jako 'nie włączona' ('not enabled'). Wreszcie, aby uzyskać listę włączonych opcji, użyj Waf z parametrem --check-config.
Teraz wróćmy i przełączmy się z powrotem na wersję debug, która zawiera przykłady i testy.
$ ./waf clean
$ ./waf configure --build-profile=debug --enable-examples --enable-testsSystem budowy jest teraz skonfigurowany, a ty możesz zbudować wersje debugowania programów ns‑3, po prostu wpisując:
$ ./wafNiech opisane powyżej kroki zmusiły cię do dwukrotnego zbudowania części systemu ns‑3, ale teraz wiesz, jak zmienić konfigurację i zbudować zoptymalizowany kod.
Aby sprawdzić, jaki profil jest aktywny dla danej konfiguracji projektu, istnieje polecenie:
$ ./waf --check-profile
Waf: Wchodzę do katalogu `/path/to/ns-3-allinone/ns-3.29/build`
Profil budowy: debugOmówiony powyżej scenariusz build.py obsługuje także argumenty --enable-examples i --enable-tests, ale innych opcji Waf nie obsługuje bezpośrednio. Na przykład, to nie zadziała:
$ ./build.py --disable-pythonreakcja będzie taka:
build.py: error: no such option: --disable-pythonJednak specjalny operator - - może być używany do przesyłania dodatkowych parametrów przez waf, więc zamiast wspomnianego powyżej zadziała następujące polecenie:
$ ./build.py -- --disable-pythonponieważ generuje podstawowe polecenie ./waf configure --disable-python. Oto kilka dodatkowych wskazówek dotyczących Waf.
Obsługa błędów kompilacji
Wydania ns-3 były testowane na najnowszych kompilatorach C++, dostępnych w momencie wydania na popularnych dystrybucjach Linux i MacOS. Jednak z biegiem czasu pojawiają się nowe dystrybucje z nowymi kompilatorami, które zazwyczaj są bardziej wymagające w kwestii ostrzeżeń. ns-3 konfiguruje swoją kompilację tak, aby traktować wszystkie ostrzeżenia jak błędy, dlatego czasami, jeśli korzystasz z starszej wersji w nowszym systemie, ostrzeżenie kompilatora może zatrzymać kompilację.
Na przykład, wcześniej wydano ns-3.28 dla Fedora 28, która zawierała nową główną wersję gcc (gcc-8). Kompilacja wydania ns-3.28 lub starszych wersji pod Fedora 28, z zainstalowanym Gtk2+, może spowodować taki błąd:
/usr/include/gtk-2.0/gtk/gtkfilechooserbutton.h:59:8: error: unnecessary parentheses ,!in declaration of ‘__gtk_reserved1’ [-Werror=parentheses] void (*__gtk_reserved1);W wydaniach, począwszy od ns-3.28.1, dostępna jest opcja rozwiązania tych problemów. Wyłącza ona ustawienie flagi „-Werror” w g++ i clang++. Jest to opcja „—disable-werror”, która powinna być stosowana podczas konfigurowania: Waf $ ./waf configure --disable-werror --enable-examples --enable-tests
Konfiguracja lub kompilacjaNiektóre polecenia mają sens tylko w fazie konfiguracji, a niektóre działają tylko w fazie kompilacji. Na przykład, jeśli chcesz korzystać z funkcji emulacji ns-3, możesz włączyć ustawienie bitu
suid Waf , jak opisano powyżej. Anuluje to polecenia etapu konfiguracji, dzięki czemu możesz zmienić konfigurację, używając następującego polecenia, które również uwzględnia przykłady i testy. $ ./waf configure --enable-sudo --enable-examples --enable-tests używając sudoJeśli to zrobisz,
uruchomi, aby zmienić programy tworzenia gniazd kodu emulacji do uruchamiania z uprawnieniami Waf dostępnych jest wiele innych opcji dla etapów konfiguracji i kompilacji. Aby zapoznać się z możliwościami, wpisz: sudo$ ./waf --help root. W Waf W następnej sekcji użyjemy niektórych opcji związanych z testowaniem.
Profile budowyJuż widzieliśmy, jak można skonfigurować
dla kompilacji
optimized Waf $ ./waf --build-profile=debug debug i Istnieje również pośredni profil budowy,:
jest synonimem--build-profile release. Opcja -d . Profil budowy zarządza wykorzystaniem rejestrowania, asercji i kluczy optymalizacji kompilatora: --profil-budowy. Profil budowy zarządza używaniem logowania, stwierdzeń (assertions) oraz kluczy optymalizacji kompilatora:

Jak widać, rejestrowanie i asercje są dostępne tylko w wersjach debugujących. Zaleca się rozwijanie skryptu w trybie debugowania, a następnie wykonywanie powtórnych biegów (dla statystyk lub zmiany parametrów) w zoptymalizowanym profilu kompilacji.
Jeśli masz kod, który ma być wykonywany tylko w określonych profilach kompilacji, użyj makra Code Wrapper Macro:
NS_BUILD_DEBUG (std::cout << "Część linii wyjściowej..." << std::flush; timer.Start ,!()); DoLongInvolvedComputation ();
NS_BUILD_DEBUG (timer.Stop (); std::cout << "Zrobione: " << timer << std::endl;)Domyślnie, Waf umieszcza artefakty budowy w katalogu budowy. Możesz określić inny katalog wyjściowy za pomocą opcji - -out, na przykład:
$ ./waf configure --out=my-build-dirŁącząc to z profilami budowy, możesz łatwo przełączać się między różnymi parametrami kompilacji:
$ ./waf configure --build-profile=debug --out=build/debug
$ ./waf build
...
$ ./waf configure --build-profile=optimized --out=build/optimized
$ ./waf build
...Co pozwala na pracę z wieloma kompilacjami, bez konieczności ciągłego przepisywania ostatniej kompilacji. Kiedy przełączasz się na inny profil, Waf będzie kompilować tylko ten, bez pełnej rekompilacji wszystkiego.
Kiedy w ten sposób przełączasz profile budowy, musisz zadbać o to, aby każdorazowo podawać te same parametry konfiguracji. Uniknięcie błędów pomoże w zdefiniowaniu kilku zmiennych środowiskowych:
$ 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 buildKompilatory i flagi
W podanych powyżej przykładach Waf do budowy ns-3 używa kompilatora C++ z GCC ( g++). Można jednak zmienić używany Waf kompilator C++, definiując zmienną środowiskową CXX. Na przykład, aby użyć kompilatora C++ Clang, clang++,
$ CXX="clang++" ./waf configure
$ ./waf build Podobnie można skonfigurować Waf do używania rozproszonej kompilacji za pomocą distcc:
$ CXX="distcc g++" ./waf configure
$ ./waf buildBardziej szczegółowe informacje na temat distcc i rozproszonej kompilacji można znaleźć na stronie projektu w sekcji „Dokumentacja”. Aby podczas konfigurowania ns-3 dodać flagi kompilatora, użyj zmiennej środowiskowej CXXFLAGS_EXTRA.
Instalacja
Waf może być używana do instalacji bibliotek w różnych miejscach systemu. Domyślnie zbudowane biblioteki i pliki wykonywalne znajdują się w katalogu build, a ponieważ Waf zna lokalizację tych bibliotek i plików wykonywalnych, nie ma potrzeby instalowania bibliotek gdzie indziej.
Jeśli użytkownicy preferują instalację poza katalogiem budowy, mogą wykonać polecenie .\/waf install. Domyślnie prefiksem dla instalacji jest /usr/local, więc .\/waf install będzie instalował programy w /usr/local/bin, biblioteki w /usr/local/lib i pliki nagłówkowe w /usr/local/include. Uprawnienia superużytkownika są zazwyczaj wymagane do instalacji z domyślnym prefiksem, dlatego typowe polecenie będzie brzmiało sudo .\/waf install. Przy uruchomieniu Waf najpierw spróbuje użyć wspólnych bibliotek w katalogu budowy, a następnie będzie szukać bibliotek w ścieżce do bibliotek ustawionej w lokalnym otoczeniu. Dlatego podczas instalacji bibliotek w systemie dobrą praktyką jest sprawdzenie, czy używane są właściwe biblioteki. Użytkownicy mogą wybrać instalację z innym prefiksem, przekazując podczas konfiguracji opcję --prefix, na przykład:
.\/waf configure --prefix=\/opt\/localJeśli później, po zbudowaniu, użytkownik wpisze polecenie instalacji .\/waf, będzie użyty prefiks /opt/local.
Zespół .\/waf clean powinno być używane przed ponownym ustawieniem projektu, jeśli do instalacji będzie używany Waf z innym prefiksem.
W ten sposób, aby korzystać z ns‑3, nie ma potrzeby wywoływania .\/waf install. Większość użytkowników nie będzie potrzebować tej komendy, ponieważ Waf złapie aktualne biblioteki z katalogu budowy, ale niektórzy użytkownicy mogą uznać to za przydatne, jeśli ich działania obejmują pracę z programami poza katalogiem ns‑3.
Waf jest jednolity
Na najwyższym poziomie drzewa źródłowego ns‑3 istnieje tylko jeden skrypt Waf. Zaczynając pracę, spędzisz dużo czasu w katalogu scratch\/ lub głębiej, wsrc\/... i w tym czasie może być konieczne uruchomienie Waf. Możesz po prostu pamiętać, gdzie jesteś, i uruchomić Waf w następujący sposób:
$ ..\/..\/..\/waf ..., ale to będzie nużące i podatne na błędy, dlatego istnieją lepsze rozwiązania. Jednym z powszechnych sposobów jest użycie edytora tekstu, takiego jak emacs lub vim, w którym otwierane są dwie sesje terminalowe, jedna używana do budowy ns‑3, a druga do edytowania kodu źródłowego. Jeśli masz tylko tarball, może pomóc zmienna środowiskowa:
$ export NS3DIR="$PWD"
$ function waff { cd $NS3DIR && .\/waf $* ; }
$ cd scratch
$ waff buildW katalogu modułu może być kuszące dodanie trywialnego skryptu waf jako wzór exec ..\/..\/waf. Proszę, nie rób tego. To wprowadza w błąd nowicjuszy, a przy złej realizacji prowadzi do trudnych do wykrycia błędów kompilacji. Rozwiązania przedstawione powyżej to droga, którą należy podążać.
3.5 Testowanie ns-3
Możesz wykonać testy modułowe dystrybucji ns‑3, uruchamiając skrypt .\/test.py:
$ .\/test.pyTe testy są wykonywane równolegle z Waf. Ostatecznie powinieneś zobaczyć komunikat, że
92 z 92 testów przeszło (92 zaliczone, 0 niezaliczone, 0 zawiodło, 0 błędów valgrind)To ważny komunikat do wykrywania awarii, zawieszeń lub błędów valgrind, wskazuje na problemy z kodem lub niekompatybilność między narzędziami a kodem.
Zobaczysz również końcowy wynik z Waf i testera wykonującego każdy test, który będzie wyglądać mniej więcej tak:
Waf: Wchodzenie do katalogu `\/path\/to\/workspace\/ns-3-allinone\/ns-3-dev\/build'
Waf: Opuszczanie katalogu `\/path\/to\/workspace\/ns-3-allinone\/ns-3-dev\/build'
'build' zakończone pomyślnie (1.799s)
Zbudowane moduły:
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 z 92 testów przeszło (92 zaliczone, 0 niezaliczone, 0 zawiodło, 0 błędów valgrind)
Ta komenda zwykle jest uruchamiana przez użytkowników w celu szybkiej weryfikacji poprawności budowy dystrybucji ns‑3. (Zauważ, że kolejność wierszy „PASS: ...” może się różnić, co jest w porządku. Ważne jest, aby w końcowej linii raportu wszystkie testy przeszły; żaden test nie zakończył się niepowodzeniem ani nie zawiódł.) I Waf, i test.py będą rozdzielać pracę po dostępnych rdzeniach procesora maszyny.
3.6 Uruchamianie skryptu
Zwykle uruchamiamy skrypty pod kontrolą Waf. Pozwala to systemowi budowania zagwarantować, że ścieżki do wspólnej biblioteki są ustawione poprawnie i biblioteki są dostępne w czasie wykonywania. Aby uruchomić program, po prostu użyj Waf z parametrem - run. Uruchomimy dla ns‑3 odpowiednik powszechnego programu hello world, wpisując następujące:
$ .\/waf --run hello-simulatorWaf najpierw sprawdzi, czy program został poprawnie zbudowany, a w razie potrzeby wykona budowę. Następnie Waf wykona program, który wygeneruje następujący wynik.
Hello SimulatorGratulacje! Teraz jesteś użytkownikiem ns‑3!
Co zrobić, jeśli nie widzę wyników?
Jeśli widzisz komunikaty Waf, wskazujące, że budowanie zostało pomyślnie zakończone, ale nie widzisz wyników «Hello Simulator», istnieje prawdopodobieństwo, że w sekcji [Budowanie z Waf] przełączyłeś tryb budowy na Istnieje również pośredni profil budowy,, ale nie wykonałeś powrotnego przełączenia do trybu debug. Cały wynik konsoli używany w tym przewodniku wykorzystuje specjalny komponent ns‑3, który wykonuje zapis logów i został zastosowany do drukowania komunikatów użytkownika w konsoli. Wyjście z tego komponentu jest automatycznie wyłączone podczas kompilacji kodu zoptymalizowanego — jest "optymalizowane". Jeśli nie widzisz wyniku „Hello Simulator”, wpisz następujące polecenie:
$ .\/waf configure --build-profile=debug --enable-examples --enable-testsaby skonfigurować Waf budowę wersji debugowych programów ns‑3, które zawierają przykłady i testy. Następnie musisz ponownie zbudować aktualną wersję debugową kodu, wpisując
$ ./wafTeraz, jeśli uruchomisz program hello-simulator, powinieneś zobaczyć oczekiwany wynik.
3.6.1 Argumenty wiersza poleceń
Aby przekazać argumenty wiersza poleceń do programu ns‑3, użyj takiego szablonu:
$ .\/waf --run --command-template="%s "Zastąp nazwą swojego programu oraz argumentami. Argument - -command-template do Waf to w zasadzie przepis na stworzenie rzeczywistej linii poleceń Waf używanej do wykonania programu. Waf sprawdza, czy budowanie zostało zakończone, ustawia ścieżki do wspólnej biblioteki, a następnie, używając dostarczonego szablonu linii poleceń i podstawiając nazwę programu zamiast symbolu zastępczego %s, wywołuje plik wykonywalny. Jeśli ten składnik wydaje się skomplikowany, istnieje prostsza wersja, która obejmuje program ns‑3 i jego argumenty, ujęte w pojedyncze cudzysłowy:
$ .\/waf --run ' --arg1=value1 --arg2=value2 ...'Innym, szczególnie przydatnym, przykładem jest wybiórcze uruchamianie zestawów testowych. Załóżmy, że istnieje zestaw testowy (suite) mytest (w rzeczywistości go nie ma). Wcześniej użyliśmy skryptu .\/test.py do równoległego uruchamiania całej serii testów, który wielokrotnie wywołuje program testowy test-runner. Wywołanie test-runner bezpośrednio do wykonania jednego testu:
$ ./waf --run test-runner --command-template="%s --suite=mytest --verbose"Argumenty będą przekazane do programu test-runner. Ponieważ mytest nie istnieje, zostanie wygenerowana wiadomość o błędzie. Aby wydrukować dostępne opcje test-runnera, wpisz:
$ ./waf --run test-runner --command-template="%s --help"3.6.2 Debugowanie
Aby uruchomić programy ns-3 pod kontrolą innego narzędzia, takiego jak debugger (na przykład gdb) lub narzędzie do sprawdzania pamięci (na przykład valgrind), użyj podobnej formy - -command-template = "…". Na przykład, aby uruchomić debuggerem gdb twój program hello-simulator ns-3 z argumentami:
$ ./waf --run=hello-simulator --command-template="gdb %s --args "Zauważ, że nazwa programu ns-3 jest podawana z argumentem - run, a narzędzie zarządzające (tutaj gdb) jest pierwszym tokenem w argumencie - -command-template. Opcja - -args donosi gdb, co oznacza, że pozostała część linii poleceń należy do „niższego” programu. (Niektóre wersje gdb nie rozumieją opcji - -args. W takim przypadku usuń argumenty programu z - -command-template i użyj zestawu poleceń gdb args.) Możemy połączyć ten przepis z poprzednim, aby uruchomić test w debuggerze:
$ ./waf --run test-runner --command-template="gdb %s --args --suite=mytest --verbose"3.6.3 Katalog roboczy
Waf powinien być uruchamiany z jego lokalizacji na górze drzewa ns-3. Ten folder staje się katalogiem roboczym, do którego będą zapisywane pliki wyjściowe. Ale co zrobić, jeśli chcesz zapisać te pliki poza drzewem źródłowym ns-3? Użyj argumentu - -cwd:
$ ./waf --cwd=...Może będzie wygodniej uzyskiwać pliki wyjściowe w twoim katalogu roboczym. W takim przypadku może pomóc takie pośrednie działanie:
$ function waff {
CWD="$PWD"
cd $NS3DIR >/dev/null
./waf --cwd="$CWD" $*
cd - >/dev/null
}Tego typu dekoracja poprzedniej wersji komendy zachowuje bieżący katalog roboczy, przechodzi do katalogu Waf, a następnie instruuje Waf do zmiany katalogu roboczego z powrotem na zapisany przed uruchomieniem programu bieżący katalog roboczy. Wspominamy o poleceniu - -cwd dla pełności przedstawienia, większość użytkowników po prostu uruchamia Waf z katalogu głównego i tam generuje pliki wyjściowe.
Źródło: habr.com
