
3 Začínáme
3.1 Přehled
3.2 Předpoklady
3.2.1 Stahování vydání ns-3 ve formě archivu zdrojového kódu
3.3 Stahování ns-3 pomocí Gitu
3.3.1 Stahování ns-3 pomocí Bake
3.4 Sestavení ns-3
3.4.1 Sestavení pomocí build.py
3.4.2 Sestavení pomocí Bake
3.4.3 Sestavení pomocí Waf
3.5 Testování ns-3
3.6 Spuštění skriptu
3.6.1 Argumenty příkazového řádku
3.6.2 Ladění
3.6.3 Pracovní adresář
Kapitola 3
Začínáme
Tato kapitola má připravit čtenáře na práci, začínající s počítačem, na který možná nikdy nebyl nainstalován ns-3. Text pokrývá podporované platformy, předpoklady, způsoby získání ns-3, způsoby sestavení ns-3 a způsoby ověření vaší sestavy a spuštění jednoduchých programů.
3.1 Přehled
Simulator ns-3 je postaven jako systém vzájemně spolupracujících softwarových knihoven. Při sestavování se kód uživatelských programů linkuje s těmito knihovnami. Pro psaní uživatelských programů se používají programovací jazyky C++ nebo Python.
Ns-3 je distribuován ve formě zdrojového kódu, což znamená, že cílový systém by měl mít vývojové prostředí softwaru, aby nejprve sestavil knihovny a poté sestavil uživatelský program. V zásadě může být ns-3 distribuován jako hotové knihovny pro konkrétní systém, a v budoucnu mohou být distribuovány tímto způsobem. Ale v současnosti mnoho uživatelů fakticky vykonává svou práci tím, že upravují samotný ns-3, takže je užitečné mít zdrojový kód pro sestavení knihoven. Pokud by někdo chtěl převzít zodpovědnost za vytvoření hotových knihoven a balíčků pro operační systémy, dejte nám prosím vědět prostřednictvím seznamu. ns-developers.
Dále se podíváme na tři způsoby, jak stáhnout a sestavit ns-3. První je stáhnout a sestavit oficiální vydání z hlavní stránky. Druhý je výběr a sestavení kopie vývojových verzí základní instalace ns-3. Třetí je použití dalších nástrojů pro sestavení pro stažení většího množství rozšíření pro ns-3. Projdeme si každý, protože nástroje se mírně liší.
Zkušení uživatelé Linuxu se mohou ptát, proč ns-3 není poskytován ve formě balíčku, jako většina ostatních knihoven používajících správce balíčků. Ačkoli existují binární balíčky pro různé distribuce Linuxu (například Debian), většina uživatelů nakonec upravuje knihovny a musí ns-3 znovu sestavit, proto je dostupnost zdrojového kódu výhodná. Z tohoto důvodu se zaměříme na instalaci ze zdrojového kódu.
Pro většinu aplikací ns-3 nejsou root potřeba práva, doporučuje se používat nepriviligovaný uživatelský účet.
3.2 Předpoklady
Celý soubor dostupných knihoven ns-3 má řadu závislostí na třetích knihovnách, ale po většinu času může být ns-3 sestaven a používán s podporou několika běžných (často předinstalovaných) komponent: compiler C++, Python, editor zdrojového kódu (například vim, emacs nebo Eclipse) a pokud jsou používány vývojové repozitáře, tak systém řízení verzí Git. Většina začínajících uživatelů se nemusí obávat, pokud jejich konfigurace hlásí některé chybějící volitelné funkce ns-3, ale pro ty, kteří chtějí kompletní instalaci, projekt nabízí wiki, která obsahuje stránky s množstvím užitečných rad a tipů. Jedna z těchto stránek je stránka „Instalace“ s pokyny pro instalaci pro různé systémy, dostupné na adrese: .
Sekce „Požadavky“ této wiki stránky vysvětluje, jaké balíčky jsou potřebné pro podporu obecných voleb ns-3, a také poskytuje příkazy, které se používají k jejich instalaci v běžných variantách Linuxu nebo macOS.
Můžete využít takovou možnost, jako je prozkoumání wiki stránky ns-3 nebo hlavní webové stránky: , protože tam je spousta informací. Od poslední verze ns-3 (ns-3.29) jsou pro spuštění ns-3 potřebné následující nástroje:
Nástroj Balíček/verze
- Kompilátor C++
clang++ nebo g++ (g++ verze 4.9 nebo vyšší) - CouchDB
python2 verze >= 2.7.10, nebo python3 verze >=3.4 - Git
jakákoli poslední verze (pro přístup k ns-3 na GitLab.com) - tar
jakákoli poslední verze (pro rozbalení vydání ns-3) - bunzip2
jakákoli čerstvá verze (pro rozbalení vydání ns-3)
Pro zkontrolování verze Pythonu nainstalované jako výchozí zadejte python -V. Chcete-li zkontrolovat verzi g++, zadejte g++ -v. Pokud nějaké nástroje chybí nebo jsou příliš staré, podívejte se na instalační příručku na wiki stránce ns-3.
Od této chvíle předpokládáme, že čtenář pracuje v Linuxu, MacOS nebo emulátoru linuxového prostředí a má alespoň výše zmíněné nástroje.
3.2.1 Stahování vydání ns-3 ve formě archivu zdrojového kódu
Toto je způsob, jakým nový uživatel může stáhnout a experimentovat s nejnovějšími vydáními a balíky ns-3. Vydání ns-3 jsou publikována jako komprimované archivy zdrojového kódu, někdy označované jako tarball. tarball — je to speciální formát programového archivu, ve kterém je několik souborů spojeno dohromady. Archiv je obvykle komprimovaný. Proces stahování ns-3 je tarball snadný, stačí si vybrat vydání, stáhnout ho a rozbalit.
Předpokládejme, že jako uživatel chcete sestavit ns-3 v místním adresáři s názvem workspace. Získáte pracovní kopii vydání zadáním následujícího příkazu v Linuxovém terminálu (samozřejmě nahraďte příslušné čísla verzí)
$ 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 Vezměte na vědomí použitý nástroj výše, wget, který je příkazovým řádkovým nástrojem pro stahování souborů z Internetu. Pokud jste ho nenainstalovali, můžete použít pro tento účel prohlížeč.
Následováním těchto kroků přejdete do adresáře ns-allinone-3.29, kde byste měli vidět několik souborů a adresářů
$ 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.pyNyní jste připraveni sestavit základní distribuci ns-3 a můžete přejít k části věnované sestavení ns-3.
3.3 Stahování ns-3 pomocí Gitu
Kód ns-3 je k dispozici v repozitářích Git na GitLab.com na adrese . Skupina nsnam spojuje různé repozitáře používané projektem s otevřeným zdrojovým kódem.
Nejjednodušší způsob, jak začít používat repozitáře Git, je udělat fork nebo klonovat prostředí ns-3-allinone. Je to sada skriptů, která spravuje stahování a sestavení nejčastěji používaných subsystémů ns-3. Pokud jste noví v Git, mohou vám být termíny "fork" a "klonování" neznámé; pokud je to tak, doporučujeme vám jednoduše klonovat (vytvořit si vlastní kopii) úložiště na GitLab.com následujícím způsobem:
$ cd
$ mkdir workspace
$ cd workspace
$ git clone https://gitlab.com/nsnam/ns-3-allinone.git
$ cd ns-3-allinone V tuto chvíli vidíte svou adresářovou strukturu ns-3-allinone mírně se liší od výše popsaného adresáře s archivy vydání. Měl by vypadat přibližně takto:
$ ls
build.py constants.py download.py README util.pyVšimněte si přítomnosti skriptu download.py, který navíc extrahuje ns‑3 a doprovodný zdrojový kód. Zde máte na výběr: buď stáhnout nejnovější vývojový snapshot ns‑3:
$ python download.pynebo preferovat verzi ns‑3 pomocí příznaku -n pro určení čísla verze:
$ python download.py -n ns-3.29Po tomto kroku budou do adresáře ns-3-allinone stahovány další repozitáře ns‑3, bake, pybindgen a netanim.
Poznámka
Na stroji s čistou Ubuntu16.04 jsem musel změnit příkaz na následující podobu: $ sudo python3 download.py -n ns-3.29 (dále v textu poznámky překladatele).
3.3.1 Stahování ns-3 pomocí Bake
Dva výše uvedené metody (archiv zdrojových kódů nebo repozitář ns-3-allinone přes Git) jsou užitečné pro získání nejsnazší instalace ns‑3 s několika doplňky (pybindgen pro generování vazeb Python a netanim pro animaci sítě). Třetí repozitář, který je ve výchozím nastavení dodáván v ns‑3-allinone, se nazývá bake.
Bake — nástroj pro koordinované sestavení softwaru z několika repozitářů, vyvinutý pro projekt ns‑3. Bake může být použit k získání vývojových verzí ns‑3, stejně jako k stahování a sestavování rozšíření základní verze distribuce ns‑3, jako je prostředí Direct Code Execution, CradleNetwork Simulation Cradle, možnost vytváření nových vazeb Python a různá "aplikace" ns‑3.
Poznámka
CradleNetwork Simulation Cradle — framework, který umožňuje využívat skutečné síťové zásobníky TCP/IP uvnitř síťového simulátoru.
Pokud předpokládáte, že vaše instalace ns‑3 by měla mít pokročilé nebo další funkce, můžete se vydat touto cestou instalace.
V posledních verzích ns‑3 Bake byl zařazen do tar-vydání. Do vydání je zahrnut konfigurační soubor, který umožňuje stahovat aktuální verze softwaru v době vytvoření vydání. To znamená, například, že verze Bake, která se distribuuje s vydáním ns‑3.29, může být použita k získání komponentů pro toto vydání ns‑3 nebo dříve, ale nemůže být použita k extrakci komponentů pro pozdější vydání (pokud soubor popisu balíčku bakeconf.xml není aktualizován).
Můžete také získat nejnovější kopii bake, zadáním následujícího příkazu do své konzoly Linux (za předpokladu, že máte nainstalován Git):
$ cd
$ mkdir workspace
$ cd workspace
$ git clone https://gitlab.com/nsnam/bake.gitPři spuštění příkazu git byste měli vidět něco jako následující:
Klonování do 'bake'...
remote: Počítání objektů: 100% (2086/2086), hotovo.
remote: Komprimování objektů: 100% (649/649), hotovo.
remote: Celkem 2086 (delta 1404), znovu použito 2078 (delta 1399)
Příjem objektů: 100% (2086/2086), 2.68 MiB | 3.82 MiB/s, hotovo.
Rozhodování delta: 100% (1404/1404), hotovo.Po dokončení příkazu clone by měla vzniknout složka s názvem bake, jejíž obsah by měl vypadat přibližně takto:
$ cd bake
$ ls
bake bakeconf.xml bake.py doc examples generate-binary.py test TODOVšimněte si, že jste stáhli několik skriptů Python, Python modul s názvem bake a soubor XML s konfigurací. Dalším krokem je použít tyto skripty k stažení a sestavení distribuce ns‑3 podle vašeho výběru. K dispozici je několik cílů nastavení:
ns‑3.29: modul odpovídající verzi; stáhne komponenty podobné verzi v tarballu;
ns‑3-dev: podobný modul, ale používající kód z vývojového stromu;
ns-allinone-3.29: modul, který zahrnuje další funkce, jako je Click routování a Network Simulation Cradle, Openflow pro ns-3.
ns-3-allinone: obdobný jako verze modulu allinone, ale pro vývojový kód.
Poznámka
Click — modulární softwarová architektura pro vytváření směrovačů.
Openflow je protokol řízení zpracování dat, které se přenášejí po síti směrovači a přepínači, realizující technologii softwarově konfigurovatelných sítí.
Aktuální vývojová snapshot (nerelizační) ns‑3 lze nalézt na adrese:.
Vývojáři se snaží udržovat tyto repozitáře v konzistentním pracovním stavu, ale nacházejí se v oblasti vývoje a obsahují nerelizační kód, takže pokud neplánujete používat nové funkce, vyberte oficiální verzi.
Poslední verzi kódu můžete najít prohlédnutím seznamu repozitářů nebo přechodem na webovou stránku „ns‑3 Releases“: a kliknutím na odkaz na poslední verzi. V tomto příkladu pokračujeme s ns‑3.29.
Nyní, abychom získali potřebné součásti ns‑3, použijeme nástroj Bake. Řekněme několik úvodních slov o tom, jak Bake.
Bake funguje, načítá zdrojové kódy balíčků do adresáře source a instaluje knihovny do vývojového adresáře. Bake může být spuštěn odkazem na spustitelný soubor, ale pokud chcete spouštět Bake ne z adresáře, do kterého byl nahrán, je nejlepší přidat cestu k bake vaší cestě (proměnné prostředí PATH), například následujícím způsobem (příklad pro shell Linux bash). Přejděte do adresáře „bake“ a nastavte následující proměnné prostředí:
$ export BAKE_HOME=`pwd`
$ export PATH=$PATH:$BAKE_HOME:$BAKE_HOME/build/bin
$ export PYTHONPATH=$PYTHONPATH:$BAKE_HOME:$BAKE_HOME/build/libTo umístí program bake.py do cesty shellu a umožní ostatním programům najít spustitelné soubory a knihovny, které vytvořil bake. V některých případech použití bake, popsané výše, nastavování PATH a PYTHONPATH není nutné, ale pro úplnou kompilaci ns-3-allinone (s dalšími balíčky) je obvykle potřeba.
Přejděte do pracovního adresáře a zadejte v terminálu následující:
$ ./bake.py configure -e ns-3.29Dále vás požádáme, Bake abyste zkontrolovali, zda máme dostatek nástrojů pro stažení různých komponent. Napište:
$ ./bake.py checkMěli byste vidět něco podobného:
> 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 ...Především, downloadovací nástroje jako Mercurial, CVS, Git a Bazaar jsou klíčové v tomto kroku, protože nám umožňují získat kód. V tomto kroku nainstalujte chybějící nástroje běžným způsobem pro váš systém (pokud to umíte) nebo požádejte svého systémového administrátora o pomoc.
Nyní zkuste stáhnout software:
$ ./bake.py downloadvýsledkem by mělo být něco jako:
>> 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 - OKTo by znamenalo, že byly staženy tři zdrojové kódy. Nyní přejděte do adresáře source a zadejte ls; měli byste vidět:
$ cd source
$ ls
netanim-3.108 ns-3.29 pybindgenNyní jste připraveni zkompilovat distribuci ns-3.
3.4 Sestavení ns-3
Podobně jako při stahování ns-3 existuje několik způsobů, jak zkompilovat ns-3. Hlavní věcí, kterou chceme zdůraznit, je, že ns-3 je sestrojen pomocí nástroje pro sestavení nazvaného Waf, popsaného níže. Většina uživatelů bude pracovat s Waf, ale existuje několik užitečných skriptů, které vám pomohou začít nebo uspořádat složitější sestavení. Proto prosím, než začnete číst o Wafdříve nesetkali, podívejte se na build.py a sestavení s bake.
3.4.1 Sestavení pomocí build.py
Pozor! Tento krok sestavení je k dispozici pouze z verze výchozího archivu, jak je uvedeno výše; nikoli stažené přes git nebo bake.
Při práci s výchozím archívem tarball, v ns‑3‑allinone existuje užitečný skript, který může zjednodušit sestavení komponent. Jmenuje se build.py. Tento program nastaví projekt pro vás nejpřínosnějším způsobem. Mějte však na paměti, že složitější nastavení a práce s ns‑3 obvykle zahrnují použití vlastní sestavovací soustavy ns‑3, Waf, která bude představena později v této příručce.
Pokud jste stáhli pomocí tarball, měla by se ve vaší složce ~\/workspace objevit složka s názvem něco jako ns-allinone-3.29. Zadejte následující:
$ .\/build.py --enable-examples --enable-tests
Při volání build.py použili jsme argumenty příkazového řádku, abychom sestavili příklady a testy používané v této příručce, které nejsou ve výchozím nastavení v ns‑3 sestavovány. Ve výchozím nastavení program také sestaví všechny dostupné moduly. Později, pokud budete chtít, můžete sestavit ns‑3 bez příkladů a testů nebo vyloučit moduly, které nejsou potřeba pro vaši práci.
Uvidíte mnoho výstupních zpráv překladače, které skript zobrazuje při sestavování různých částí, které jste stáhli. Nejprve se skript pokusí sestavit animátor netanim, potom generátor vazeb pybindgen a nakonec ns‑3. Po dokončení procesu byste měli vidět následující:
Waf: Opouští adresář '\/cesta\/k\/workspace\/ns-allinone-3.29\/ns-3.29\/build'\n'sestavení' bylo úspěšně dokončeno (6m25.032s) \n\nSestavené moduly:\nantenna aodv applications\nbridge 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 (bez Pythonu) network nix-vector-routing \nolsr point-to-point point-to-point-layout \npropagation sixlowpan spectrum \nstats tap-bridge test (bez Pythonu) \ntopology-read traffic-control uan \nvirtual-net-device visualizer wave \nwifi wimax \n\nModuly, které nebyly sestaveny (viz tutoriál ns-3 pro vysvětlení):\nbrite click openflow \nOpouští adresář .\/ns-3.29V posledních třech řádcích výpisu vidíme zprávu o modulech, které nebyly sestaveny:
Moduly, které nebyly sestaveny (viz tutoriál ns-3 pro vysvětlení):\nbrite clickTo pouze znamená, že některé moduly ns-3, které závisí na externích knihovnách, pravděpodobně nebyly sestaveny, nebo že pro tuto konfiguraci není jejich sestavení potřeba. Neznamená to, že by simulator nebyl sestaven nebo že by sestavené moduly pracovaly nesprávně.
3.4.2 Sestavení pomocí Bake
Pokud jste výše pro získání zdrojového kódu z repozitářů projektu použili bake, můžete ho nadále používat i pro sestavení ns-3. Zadejte:
$ ./bake.py builda měli byste vidět něco jako:
>> Building pybindgen-0.19.0.post4+ng823d8b2 - OK
>> Building netanim-3.108 - OK
>> Building ns-3.29 - OKNápověda: můžete také provést oba kroky současně, stažením a sestavením, vyzváním „bake.py deploy“.
Při sestavování všech komponentů mohou nastat chyby, ale sestavení bude pokračovat, pokud komponenta není nezbytná. Například nedávný problém s přenositelností spočíval v tom, že castxml může být sestaven nástrojem bake ne na všech platformách. V takovém případě se zobrazí zpráva podobná této:
>> Building castxml - Problem
> Problem: Volitelná závislost, modul "castxml" selhal
To může snížit funkčnost konečného sestavení.
Avšak, bake bude pokračovat, protože "castxml" není nezbytnou závislostí.
Pro více informací zavolejte bake s -v nebo -vvv pro plný podrobný režim.Nicméně castxml je nutný pouze v případě, že chcete vytvořit aktualizované vazby Pythonu. Pro většinu uživatelů to není potřeba (alespoň dokud nezačnou měnit ns-3), takže taková upozornění lze prozatím bezpečně ignorovat.
Pokud dojde k chybě, následující příkaz vám dá náznak o chybějících závislostech:
$ ./bake.py showBudou zde uvedeny různé závislosti balíčků, které se snažíte sestavit.
3.4.3 Sestavení pomocí Waf
Do této chvíle jsme pro zahájení sestavení ns-3 používali buď skript build.py, nebo nástroj bake. Tyto nástroje jsou užitečné pro sestavení ns-3 a podporu knihoven. Ve skutečnosti spouští nástroj pro sestavení Waf z adresáře ns-3. Waf instalovaný spolu se zdrojovým kódem ns-3. Většina uživatelů rychle přechází na přímé použití Waf. Takže prosím přejděte do adresáře ns-3, který jste původně vytvořili.
V tuto chvíli to není striktně nutné, ale bude užitečné udělat malou odbočku a podívat se na to, jak provádět změny v konfiguraci projektu. Nejpravděpodobnějším užitečným změnou konfigurace, kterou můžete provést, je vytvoření optimalizované verze kódu. Ve výchozím nastavení jste svůj projekt nakonfigurovali na sestavení verze pro ladění. Podívejme se na projekt pro vytvoření optimalizované sestavy. Abychom Waf vysvětlili, že má vytvořit optimalizované sestavy zahrnující příklady a testy, budete muset provést následující příkazy:
$ .\/waf clean
$ .\/waf configure --build-profile=optimized --enable-examples --enable-testsTo spustí Waf mimo lokální adresář (pro vaše pohodlí). První příkaz provádí vyčištění od předchozího sestavení, obvykle to není striktně nutné, ale je to dobrá praxe (viz profily sestavení níže); tento příkaz odstrání dříve vytvořené knihovny a objektové soubory nacházející se v adresáři build\/. Jakmile je projekt převeden na nový systém a systém sestavení provádí kontrolu různých závislostí, měli byste vidět výstup podobný následujícímu:
Nastavení vrchního adresáře na: /home/ns3user/workspace/bake/source/ns-3-dev
Nastavení výstupního adresáře na: /home/ns3user/workspace/bake/source/ns-3-dev/build
Kontrola programu 'gcc' (C kompilátor): /usr/bin/gcc
Kontrola verze cc: 7.3.0
Kontrola programu 'g++' (C++ kompilátor): /usr/bin/g++
Kontrola příznaku kompilace -march=native: podpora: ano
Kontrola příznaku kompilace -Wl,--soname=foo: podpora: ano
Kontrola příznaku kompilace -std=c++11: podpora: ano
Kontrola zahrnutí Boost: hlavičkové soubory nebyly nalezeny, prosím, zadejte argument --boost-includes (viz nápověda)
Kontrola zahrnutí Boost: hlavičkové soubory nebyly nalezeny, prosím, zadejte argument --boost-includes (viz nápověda)
Kontrola programu 'python': /usr/bin/python
Kontrola verze python >= 2.3: 2.7.15 python-config: /usr/bin/python-config
Dotazování python-config pro pyembed '--cflags --libs --ldflags' příznaky: ano
Testování konfigurace pyembed: ano
Dotazování python-config pro pyext '--cflags --libs --ldflags' příznaky: ano
Testování konfigurace pyext: ano
Kontrola příznaku kompilace -fvisibility=hidden: podpora: ano
Kontrola příznaku kompilace -Wno-array-bounds: podpora: ano
Kontrola umístění pybindgen: ../pybindgen, (odhadnuto)
Kontrola modulu python 'pybindgen': 0.19.0, !post4+g823d8b2
Kontrola verze pybindgen: 0.19.0, !post4+g823d8b2
Kontrola kusu kódu: ano
Kontrola ekvivalence typů uint64_t a unsigned long: ne
Kontrola kusu kódu: ne
Kontrola ekvivalence typů uint64_t a unsigned long long: ano
Kontrola apidef, které lze použít pro Python vazby: gcc-LP64
Kontrola interní GCC cxxabi: kompletní
Kontrola modulu python 'pygccxml': nenalezeno
Kontrola umístění click: nenalezeno
Kontrola programu 'pkg-config': /usr/bin/pkg-, !config
Kontrola 'gtk+-3.0': nenalezeno
Kontrola 'libxml-2.0': ano
Kontrola uint128_t: nenalezeno
Kontrola __uint128_t: ano
Kontrola implementace vysoké přesnosti: 128-bitové celé číslo, !(výchozí)
Kontrola hlavičkového souboru stdint.h: ano
Kontrola hlavičkového souboru inttypes.h: ano
Kontrola hlavičkového souboru sys/inttypes.h: nebyl nalezen
Kontrola hlavičkového souboru sys/types.h: ano
Kontrola hlavičkového souboru sys/stat.h: ano
Kontrola hlavičkového souboru dirent.h: ano
Kontrola hlavičkového souboru stdlib.h: ano
Kontrola hlavičkového souboru signal.h: ano
Kontrola hlavičkového souboru pthread.h: ano
Kontrola hlavičkového souboru stdint.h: ano
Kontrola hlavičkového souboru inttypes.h: ano
Kontrola hlavičkového souboru sys/inttypes.h: nebyl nalezen
Kontrola knihovny rt: ano
Kontrola hlavičkového souboru sys/ioctl.h: ano
Kontrola hlavičkového souboru net/if.h: ano
Kontrola hlavičkového souboru net/ethernet.h: ano
Kontrola hlavičkového souboru linux/if_tun.h: ano
Kontrola hlavičkového souboru netpacket/packet.h: ano
Kontrola umístění NSC: nenalezeno
Kontrola 'sqlite3': nenalezeno
Kontrola hlavičkového souboru linux/if_tun.h: ano
Kontrola modulu python 'gi': 3.26.1
Kontrola modulu python 'gi.repository.GObject': ano
Kontrola modulu python 'cairo': ano
Kontrola modulu python 'pygraphviz': 1.4rc1
Kontrola modulu python 'gi.repository.Gtk': ano
Kontrola modulu python 'gi.repository.Gdk': ano
Kontrola modulu python 'gi.repository.Pango': ano
Kontrola modulu python 'gi.repository.GooCanvas': ano
Kontrola programu 'sudo': /usr/bin/sudo
Kontrola programu 'valgrind': nenalezeno
Kontrola 'gsl': nenalezeno python-config: nenalezeno
Kontrola příznaku kompilace -fstrict-aliasing: podpora: ano
Kontrola příznaku kompilace -fstrict-aliasing: podpora: ano
Kontrola příznaku kompilace -Wstrict-aliasing: podpora: ano
Kontrola příznaku kompilace -Wstrict-aliasing: podpora: ano
Kontrola programu 'doxygen': /usr/bin/doxygen
---- Shrnutí volitelných funkcí ns-3:
Profil sestavení: optimalizováno
Adresář sestavení:
Integrace BRITE: není povolena (BRITE není povoleno (viz možnost --with-, !brite))
Sbírání metrik DES událostí: není povoleno (výchozí je vypnuto)
Emulace FdNetDevice: povoleno
Příklady: povoleno
Souborový popisovač NetDevice: povoleno
GNU Scientific Library (GSL): není povoleno (GSL nebyl nalezen)
Knihovna Gcrypt: není povolena (libgcrypt nebyl nalezen: můžete použít !libgcrypt-config pro nalezení jejího umístění.)
GtkConfigStore: není povolena (knihovna 'gtk+-3.0 >= 3.0' nebyla nalezena)
Podpora MPI: není povolena (možnost --enable-mpi nebyla vybrána)
Integrace ns-3 Click: není povolena (nsclick není povoleno (viz možnost --with-, !nsclick))
Integrace ns-3 OpenFlow: není povolena (Požadovány knihovny Boost nebyly nalezeny)
Network Simulation Cradle: není povolena (NSC nebyl nalezen (viz možnost --with-nsc))
PlanetLab FdNetDevice: není povolena (Operační systém PlanetLab nebyl detekován, !(viz možnost --force-planetlab))
Vizualizátor PyViz: povoleno
Podpora pro skenování Python API: není povolena (chybějící 'pygccxml' modul Python)
Python vazby: povoleno
Reálný časový simulátor: povoleno
Výstup statistických dat SQlite: není povolen (knihovna 'sqlite3' nebyla nalezena)
Tap Bridge: povoleno
Tap FdNetDevice: povoleno
Testy: povoleno
Primitiva pro vlákna: povoleno
Použijte sudo pro nastavení bitu suid: není povoleno (možnost --enable-sudo nebyla vybrána)
XmlIo: povoleno
'configure' úspěšně dokončeno (6.387s)Všimněte si poslední části výše uvedeného výpisu. Některé možnosti ns-3 nejsou ve výchozím nastavení zahrnuty nebo vyžadují podporu ze strany systému pro správnou funkci. Například pro povolení XmlTo musí být v systému přítomna knihovna libxml-2.0. Pokud tato knihovna nebyla nalezena a odpovídající funkce ns-3 nebyla povolena, zobrazí se zpráva. Dále si povšimněte, že existuje možnost použít příkaz sudo k nastavení bitu suid „nastavení ID skupiny během běhu“ u určitých programů. Ve výchozím nastavení není povoleno, a proto se tato funkce zobrazuje jako „není povolena“ („not enabled“). Nakonec, pro získání seznamu povolených možností použijte Waf s parametrem --check-config.
Nyní se vraťme a přepněme se zpět na ladicí sestavení obsahující příklady a testy.
$ ./waf clean
$ ./waf configure --build-profile=debug --enable-examples --enable-testsSystém sestavení je nyní nakonfigurován, a můžete sestavit ladicí verze programů ns-3 jednoduše zadáním:
$ ./wafI když výše popsané kroky způsobily, že jste museli sestavit část systému ns-3 dvakrát, nyní víte, jak změnit konfiguraci a sestavit optimalizovaný kód.
Pro kontrolu, který profil je aktivní pro tuto konfiguraci projektu, existuje příkaz:
$ ./waf --check-profile
Waf: Vstoupil do adresáře `/path/to/ns-3-allinone/ns-3.29/build`
Profil sestavení: debugRozebíraný scénář build.py rovněž podporuje argumenty --enable-examples a --enable-tests, ale jiné možnosti Waf nepodporuje přímo. Například to nebude fungovat:
$ ./build.py --disable-pythonreakce bude následující:
build.py: error: no such option: --disable-pythonNicméně, speciální operátor -- může být použit k předání dalších parametrů prostřednictvím waf, takže místo výše uvedeného bude fungovat následující příkaz:
$ ./build.py -- --disable-pythonprotože generuje hlavní příkaz ./waf configure —disable-python. Zde je několik dalších úvodních rad o Waf.
Zpracování chyb během sestavení
Verze ns‑3 byly testovány na nejnovějších verzích C++ kompilátorů dostupných při vydání na běžných distribucích Linuxu a MacOS. S časem však vycházejí nové distribuce s novými kompilátory, které jsou obvykle přísnější co se týče varování. Ns‑3 konfiguruje svou sestavu tak, aby považovala všechna varování za chyby, a proto někdy, pokud používáte starší verzi v novějším systému, může varování kompilátoru zastavit sestavení.
Například dříve byla vydána verze ns‑3.28 pro Fedora 28, která obsahovala novou hlavní verzi gcc (gcc-8). Sestavení verze ns‑3.28 nebo starších verzí pod Fedora 28 s nainstalovaným Gtk2+ vyvolá tuto chybu:
/usr/include/gtk-2.0/gtk/gtkfilechooserbutton.h:59:8: error: unnecessary parentheses ,!in declaration of ‘__gtk_reserved1’ [-Werror=parentheses] void (*__gtk_reserved1);Ve verzích od ns‑3.28.1 je Waf k dispozici možnost pro vyřešení těchto problémů. Ta vypíná nastavování příznaku „-Werror“ v g++ a clang++. Tato možnost „—disable-werror“ by měla být použita během konfigurace:
$ .\/waf configure --disable-werror --enable-examples --enable-testsKonfigurace nebo sestavení
Některé příkazy Waf mají význam pouze ve fázi konfigurace, zatímco některé fungují pouze ve fázi sestavení. Například, pokud chcete použít funkce emulace ns‑3, můžete zahrnout nastavení bitu suid použitím sudo, jak bylo popsáno výše. To zruší příkazy fáze konfigurace, a tak můžete změnit konfiguraci pomocí následujícího příkazu, který také zahrnuje příklady a testy.
$ .\/waf configure --enable-sudo --enable-examples --enable-testsPokud to uděláte, Waf spustí sudo, abyste změnili programy pro vytváření soketů emulace tak, aby se spouštěly s právy root. V Waf k dispozici je mnoho dalších možností pro fáze konfigurace a sestavení. Chcete-li prozkoumat možnosti, zadejte:
$ .\/waf --helpV následující sekci budeme používat některé možnosti související s testováním.
Profily sestavení
Ukázali jsme si, jak lze nakonfigurovat Waf pro sestavy debug a optimized:
$ .\/waf --build-profile=debugK dispozici je také mezilehlý profil sestavení, release. Možnost -d je synonymem --build-profile. Profil sestavení řídí využívání protokolování, asertací a optimalizačních klíčů kompilátoru:

Jak můžete vidět, sledování a asertace jsou dostupné pouze v ladících sestaveních. Doporučená praxe spočívá v návrhu vašeho skriptu v ladicím režimu, poté provádění opakovaných běhů (pro statistiku nebo změnu parametrů) v optimalizovaném profilu sestavení.
Pokud máte kód, který by se měl vykonávat pouze v určitých profilech sestavení, použijte makro Code Wrapper Macro:
NS_BUILD_DEBUG (std::cout << "Část výstupního řetězce..." << std::flush; timer.Start ,!()); DoLongInvolvedComputation ();
NS_BUILD_DEBUG (timer.Stop (); std::cout << "Hotovo: " << timer << std::endl;)Ve výchozím nastavení, Waf umístí artefakty sestavení do adresáře pro sestavení. Můžete zadat jiný výstupní adresář pomocí možnosti - -out, například:
$ . /waf configure --out=my-build-dirKombinací toho s profily sestavení můžete snadno přepínat mezi různými parametry kompilace:
$ . /waf configure --build-profile=debug --out=build/debug
$ . /waf build
...
$ . /waf configure --build-profile=optimized --out=build/optimized
$ . /waf build
...Co vám umožňuje pracovat s několika sestaveními, aniž byste každý čas přepisovali poslední sestavení. Když přepínáte na jiný profil, Waf bude kompilovat pouze jeho, bez úplné rekompilace všeho.
Když takto přepínáte profily sestavení, je třeba dbát na to, abyste pokaždé zadali stejné konfigurační parametry. Můžete se vyhnout chybám definováním několika proměnných prostředí:
$ 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 buildKompilátory a vlajky
Ve výše uvedených příkladech Waf pro sestavení ns‑3 využívá C++ kompilátor z GCC ( g++). Přesto lze změnit používaný Waf C++ kompilátor nastavením proměnné prostředí CXX. Například k použití C++ kompilátoru Clang, clang++,
$ CXX="clang++" . /waf configure
$ . /waf build Podobně lze nastavit Waf pro použití distribuované kompilace pomocí distcc:
$ CXX="distcc g++" . /waf configure
$ . /waf buildPodrobnější informace o distcc a distribuované kompilaci naleznete na stránce projektu v sekci 'Dokumentace'. Chcete-li při konfiguraci ns‑3 přidat vlajky kompilátoru, použijte proměnnou prostředí CXXFLAGS_EXTRA.
Instalace
Waf může být použita k instalaci knihoven na různá místa systému. Ve výchozím nastavení se shromážděné knihovny a spustitelné soubory nacházejí v adresáři build, a jelikož Waf zná umístění těchto knihoven a spustitelných souborů, není potřeba instalovat knihovny nikam jinam.
Pokud uživatelé dávají přednost instalaci mimo adresář sestavení, mohou provést příkaz .\/waf install. Ve výchozím nastavení je prefix pro instalaci — /usr/local, proto .\/waf install bude instalovat programy do /usr/local/bin, knihovny do /usr/local/lib a hlavičkové soubory do /usr/local/include. Práva superuživatele jsou obvykle potřebná k instalaci s výchozím prefixem, takže typický příkaz bude sudo .\/waf install. Při spuštění Waf nejprve upřednostňuje používání sdílených knihoven v adresáři sestavení, poté vyhledává knihovny podle cesty k knihovnám nastaveným v lokálním prostředí. Při instalaci knihoven do systému je proto dobrou praxí zkontrolovat, že se používají správné knihovny. Uživatelé si mohou vybrat instalaci s jiným prefixem předáním volby během konfigurace --prefix, například:
.\/waf configure --prefix=\/opt\/localPokud později, po sestavení, uživatel zadá příkaz instalace . /waf, bude použit prefix /opt/local.
Tým .\/waf clean by měla být použita před přeconfigurováním projektu, pokud bude instalace probíhat Waf pod jiným prefixem.
Takže pro použití ns‑3 není potřeba vyvolávat .\/waf install. Většině uživatelů tento příkaz nebude potřeba, protože Waf přijme aktuální knihovny z adresáře sestavení, ale někteří uživatelé mohou zjistit, že je to užitečné, pokud jejich činnost zahrnuje práci s programy mimo adresář ns‑3.
Waf je jedinečný
Na nejvyšší úrovni stromu zdrojového kódu ns‑3 existuje pouze jeden Waf skript. Jakmile začnete pracovat, strávíte hodně času v adresáři scratch\/ nebo hlouběji, vsrc\/... a přitom budete mít potřebu spouštět Waf. Můžete si jednoduše pamatovat, kde jste, a spustit Waf následujícím způsobem:
$ ..\/..\/..\/waf ...ale to bude únavné a náchylné k chybám, proto existují lepší řešení. Jedním z běžných způsobů je použití textového editoru, jako je emacs nebo vim, kde se otevírají dvě terminálové relace, jedna se používá k sestavení ns‑3, a druhá k úpravě zdrojového kódu. Pokud máte pouze tarball, pak může pomoci proměnná prostředí:
$ export NS3DIR="$PWD"
$ function waff { cd $NS3DIR && ./waf $* ; }
$ cd scratch
$ waff buildV adresáři modulu se může zdát lákavé přidat triviální skript waf podle vzoru exec ../..waf. Prosím, nedělejte to. Může to zmást nováčky a špatným provedením to vede k těžko zjistitelným chybám při sestavení. Řešení uvedená výše jsou cestou, kterou bychom měli následovat.
3.5 Testování ns-3
Můžete provést modulární testy distribuce ns-3 spuštěním skriptu ./test.py:
$ ./test.pyTyto testy se provádí paralelně s Waf. Nakonec byste měli vidět zprávu, že
92 z 92 testů prošlo (92 prošlo, 0 selhalo, 0 havarovalo, 0 chyby valgrind)Toto je důležitá zpráva, která pomáhá odhalit selhání, havárie nebo chyby valgrind, ukazuje na problémy s kódem nebo nekompatibilitu mezi nástroji a kódem.
Také uvidíte konečný výstup od Waf a testera, který provádí každý test, který bude vypadat přibližně takto:
Waf: Vstup do adresáře `/path/to/workspace/ns-3-allinone/ns-3-dev/build'
Waf: Opouští adresář `/path/to/workspace/ns-3-allinone/ns-3-dev/build'
'built' dokončeno úspěšně (1.799s)
Sestavené moduly:
aodv aplikace most
click config-store jádro
csma csma-layout dsdv
emu energie monitorování toku
internet lte mesh
mobilita mpi netanim
síť nix-vector-routing ns3tcp
ns3wifi olsr openflow
point-to-point point-to-point-layout propagace
spektrum statistiky tap-bridge
template test nástroje
topologie-přečíst uan virtuální-net-device
vizualizátor wifi wimax
PASS: TestSuite ns3-wifi-interference
PASS: TestSuite histogram
...
PASS: TestSuite object
PASS: TestSuite random-number-generators
92 z 92 testů prošlo (92 prošlo, 0 selhalo, 0 havarovalo, 0 chyby valgrind)
Tento příkaz obvykle spouštějí uživatelé pro rychlé ověření správnosti sestavení distribuce ns-3. (Všimněte si, že pořadí řádků „PASS: …“ se může lišit, což je v pořádku. Důležité je, že v závěrečném řádku na konci zprávy prošly všechny testy; žádný test neskončil neúspěšně nebo havaroval.) A Waf, a test.py se rozdělí mezi dostupné jádra procesoru stroje.
3.6 Spuštění skriptu
Obvykle spouštíme skripty pod kontrolou Waf. To umožňuje systému sestavení zajistit, že cesty k sdílené knihovně jsou správně nastavena a že knihovny jsou k dispozici během provádění. Chcete-li spustit program, jednoduše použijte Waf s parametrem - run. Spustíme pro ns-3 ekvivalent všeobecného programu hello world, napsáním následujícího:
$ ./waf --run hello-simulatorWaf nejprve zkontroluje, zda byla aplikace správně sestavena, a pokud je to nutné, provede sestavení. Poté Waf provede program, který vyprodukuje následující výstup.
Hello SimulatorGratulujeme! Nyní jste uživatel ns‑3!
Co mám dělat, pokud nevidím výsledek?
Pokud vidíte zprávy Waf, které naznačují, že sestavení bylo úspěšně dokončeno, ale nevidíte výstup „Hello Simulator“, je pravděpodobné, že jste v sekci [Sestavení-s-Waf] změnili svůj režim sestavování na optimized, ale zapomněli jste přepnout zpět do režimu debug. Všechny výstupy z konzole, které jsou použity v této příručce, využívají speciální komponent ns‑3, který provádí zaznamenávání, a to se používá k tisku uživatelských zpráv do konzole. Výstupy z této komponenty jsou automaticky zakázány při kompilaci optimalizovaného kódu — je „optimalizován“. Pokud nevidíte výstup „Hello Simulator“, zadejte následující:
$ .\/waf configure --build-profile=debug --enable-examples --enable-testspro konfiguraci Waf pro sestavení ladících verzí programů ns‑3, které zahrnují příklady a testy. Poté byste měli znovu sestavit aktuální laděnou verzi kódu zadáním
$ ./wafNyní, pokud spustíte program hello-simulator, měli byste vidět očekávaný výstup.
3.6.1 Argumenty příkazového řádku
Pro předání argumentů příkazového řádku do programu ns‑3 použijte následující šablonu:
$ .\/waf --run --command-template="%s "Nahraďte názvem vašeho programu a argumenty. Argument - -command-template pro Waf je v podstatě receptem pro sestavení skutečného příkazového řádku Waf používaného k provedení programu. Waf kontroluje, že sestavení bylo dokončeno, nastavuje cesty k sdílené knihovně, a poté pomocí poskytnuté šablony příkazového řádku a nahrazením názvu programu za zástupný symbol %s spustí spustitelný soubor. Pokud vám tento syntaxe připadá složitý, existuje jednodušší varianta, která zahrnuje program ns‑3 a jeho argumenty uzavřené v jednoduchých uvozovkách:
$ .\/waf --run ' --arg1=value1 --arg2=value2 ...'Dalším, zvlášť užitečným příkladem je selektivní spuštění sad testů. Předpokládejme, že existuje testovací sada (suite) mytest (ve skutečnosti neexistuje). Výše jsme použili skript .\/test.py k paralelnímu spuštění celé řady testů, který opakovaně vyvolává testovací program test-runner. Vyvolání test-runner přímo pro provedení jednoho testu:
$ ./waf --run test-runner --command-template="%s --suite=mytest --verbose"Argumenty budou předány programu test-runner. Protože mytest neexistuje, bude generována chybová zpráva. Chcete-li vytisknout dostupné parametry test-runner, zadejte:
$ ./waf --run test-runner --command-template="%s --help"3.6.2 Ladění
Pro spuštění programů ns-3 pod jiným nástrojem, jako je debugger (např., gdb) nebo nástroj pro kontrolu paměti (např., valgrind), použijte podobný formát - -command-template = "…". Například pro spuštění ve debuggeru gdb vašeho programu hello-simulator ns-3 s argumenty:
$ ./waf --run=hello-simulator --command-template="gdb %s --args "Všimněte si, že název programu ns-3 jde s argumentem - run, a nástroj pro správu (tady gdb) je prvním tokenem v argumentu - -command-template. Možnost - -args uvádí gdb, což znamená, že zbytek příkazového řádku patří "nižšímu" programu. (Některé verze gdb nepoznávají možnost - -args. V tomto případě odeberte argumenty programu z - -command-template a použijte sadu příkazů gdb args.) Můžeme zkombinovat tento recept a předchozí pro spuštění testu pod debuggerem:
$ ./waf --run test-runner --command-template="gdb %s --args --suite=mytest --verbose"3.6.3 Pracovní adresář
Waf by měl být spuštěn z jeho umístění na vrcholu stromu ns-3. Tato složka se stává pracovními adresáři, kde budou zapisovány výstupní soubory. Ale co dělat, pokud chcete tyto soubory uchovávat mimo strom zdrojového kódu ns-3? Použijte argument - -cwd:
$ ./waf --cwd=...Možná by pro vás bylo pohodlnější získávat výstupní soubory ve vaší pracovní složce. V takovém případě může pomoci taková nepřímá akce:
$ function waff {
CWD="$PWD"
cd $NS3DIR >/dev/null
./waf --cwd="$CWD" $*
cd - >/dev/null
}Takové dekorování předchozí verze příkazu zachovává aktuální pracovní adresář, přechází do adresáře Waf, a potom instruuje Waf pro změnu pracovního adresáře zpět do uloženého před spuštěním programu aktuálního pracovního adresáře. Zmiňujeme příkaz - -cwd pro dokonalost výkladu, většina uživatelů prostě spouští Waf z adresáře na nejvyšší úrovni a tam generují výstupní soubory.
Zdroj: habr.com
