
3 Iniciando o trabalho
3.1 Visão geral
3.2 Pré-requisitos
3.2.1 Baixando a versão do ns-3 como um arquivo de origem compactado
3.3 Baixando o ns-3 usando Git
3.3.1 Baixando o ns-3 com Bake
3.4 Construindo o ns-3
3.4.1 Construindo com build.py
3.4.2 Construindo com Bake
3.4.3 Construindo com Waf
3.5 Testando o ns-3
3.6 Executando o script
3.6.1 Argumentos da linha de comando
3.6.2 Depuração
3.6.3 Diretório de trabalho
Capítulo 3
Iniciando o trabalho
Este capítulo tem o objetivo de preparar o leitor para começar a trabalhar a partir de um computador no qual o ns-3 pode nunca ter sido instalado. A exposição cobre as plataformas suportadas, os pré-requisitos, as maneiras de obter o ns-3, os métodos de construção do ns-3 e as formas de verificar sua construção e executar programas simples.
3.1 Visão geral
O simulador ns-3 é construído como um sistema de bibliotecas de software que interagem. Durante a construção, o código dos programas do usuário se vincula a essas bibliotecas. Para escrever programas personalizados, são utilizados as linguagens de programação C++ ou Python.
O ns-3 é distribuído em forma de código-fonte, o que significa que o sistema alvo deve ter um ambiente de desenvolvimento de software para primeiro compilar as bibliotecas e, em seguida, compilar o programa do usuário. Em princípio, o ns-3 pode ser distribuído como bibliotecas prontas para um sistema específico, e no futuro podem ser distribuídas dessa forma. Mas atualmente, muitos usuários realmente realizam seu trabalho editando o próprio ns-3, por isso é útil ter o código-fonte para construir bibliotecas. Se alguém estiver interessado em criar bibliotecas e pacotes prontos para sistemas operacionais, por favor, entre em contato com a lista de discussão. ns-developers.
A seguir, vamos considerar três maneiras de baixar e construir o ns-3. A primeira é baixar e construir a versão oficial a partir do site principal. A segunda é selecionar e construir cópias das versões de desenvolvimento da instalação base do ns-3. A terceira é usar ferramentas de construção adicionais para baixar mais extensões para o ns-3. Vamos cobrir cada uma delas, pois as ferramentas diferem um pouco.
Usuários experientes de Linux podem se perguntar por que o ns-3 não é fornecido como um pacote, como a maioria das outras bibliotecas que utilizam gerenciadores de pacotes. Embora existam pacotes binários para várias distribuições Linux (por exemplo, Debian), a maioria dos usuários acaba editando as bibliotecas e se vê obrigada a recompilar o ns-3, portanto, a disponibilização do código-fonte é conveniente. Por essa razão, vamos focar na instalação a partir do código-fonte.
Para a maioria das aplicações, ns-3 não requer privilégios, recomenda-se usar uma conta de usuário não privilegiada. root Todo o conjunto de bibliotecas disponíveis do ns-3 tem várias dependências de bibliotecas externas, mas, em sua maior parte, o ns-3 pode ser compilado e usado com suporte a vários componentes comuns (frequentemente instalados por padrão): compilador C++, Python, editor de código-fonte (por exemplo,
3.2 Pré-requisitos
) e, se repositórios de desenvolvimento forem utilizados, sistemas de controle de versão Git. A maioria dos usuários iniciantes não precisa se preocupar se sua configuração relata algumas funcionalidades extras do ns-3 ausentes, mas para aqueles que desejam uma instalação completa, o projeto fornece uma wiki que inclui páginas com muitas dicas e sugestões úteis. Uma dessas páginas é a página de "Instalação" com instruções de instalação para vários sistemas, acessíveis em: vim, emacs ou EclipseA seção "Pré-requisitos" desta página wiki explica quais pacotes são necessários para suportar opções gerais do ns-3, além de fornecer comandos usados para sua instalação nas distribuições Linux ou macOS mais comuns. .
Você pode aproveitar a oportunidade de explorar a página wiki do ns-3 ou o site principal:
, pois lá há muitas informações. A partir da versão mais recente do ns-3 (ns-3.29), as seguintes ferramentas são necessárias para executar o ns-3: Ferramenta Pacote/version
Compilador C++
- clang++ ou g++ (g++ versão 4.9 ou superior)
python2 versão >= 2.7.10, ou python3 versão >=3.4 - Python
qualquer versão recente (para acessar o ns-3 no GitLab.com) - Git
qualquer versão recente (para descompactar a versão do ns-3) - tar
bunzip2 - qualquer versão recente (para descompactar a versão do ns-3)
Para verificar a versão do Python instalada por padrão, digite
python -V . Para verificar a versão do g++, digite. Para verificar a versão do g++, digite g++ -v. Se algum dos ferramentas estiver ausente ou muito antiga, consulte o guia de instalação na página wiki do ns-3.
A partir deste momento, presumimos que o leitor está trabalhando em Linux, MacOS ou em um emulador de ambiente Linux, e possui pelo menos as ferramentas mencionadas acima.
3.2.1 Baixando a versão do ns-3 como um arquivo de origem compactado
Este é o procedimento para um novo usuário que deseja baixar e experimentar as últimas versões liberadas e de pacotes do ns-3. As versões do ns-3 são publicadas em forma de arquivos compactados de código-fonte, às vezes chamados de tarball. tarball — um formato especial de arquivo que agrupa vários arquivos juntos. O arquivo geralmente é comprimido. O processo de download do ns-3 através de tarball é simples, você apenas precisa escolher uma versão, baixar e descompactá-la.
Suponha que você, como usuário, deseja compilar o ns-3 em um diretório local chamado workspace. Você pode obter uma cópia de trabalho da versão digitando no console do Linux o seguinte (certamente, substituindo os números de versão apropriados)
$ 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 Observe a utilidade usada acima, wget, que é uma ferramenta de linha de comando para baixar objetos da Internet. Se você não a instalou, pode usar um navegador para isso.
Seguindo estas etapas, você irá para o diretório ns-allinone-3.29, onde deverá ver vários arquivos e diretórios
$ 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.pyAgora você está pronto para compilar a distribuição básica do ns-3 e pode prosseguir para a seção dedicada à compilação do ns-3.
3.3 Baixando o ns-3 usando Git
O código do ns-3 está disponível nos repositórios Git no GitLab.com em . O grupo nsnam reúne vários repositórios utilizados pelo projeto de código aberto.
A maneira mais simples de começar a usar os repositórios Git é fazer um fork ou clonar o ambiente ns-3-allinone. É um conjunto de scripts que gerencia o download e a compilação das subsistemas mais frequentemente usados do ns-3. Se você é novo no Git, os termos "fork" e "clone" podem ser desconhecidos para você; se for o caso, recomendamos que você apenas clone (crie sua própria cópia) o repositório disponível no GitLab.com, da seguinte maneira:
$ cd
$ mkdir workspace
$ cd workspace
$ git clone https://gitlab.com/nsnam/ns-3-allinone.git
$ cd ns-3-allinone Neste ponto, você verá seu diretório ns-3-allinone diferente do diretório descrito acima com o arquivo de release. Deve se parecer com isto:
$ ls
build.py constants.py download.py README util.pyObserve a presença do script download.py, que extrairá adicionalmente o ns‑3 e o código-fonte correspondente. Aqui você tem a opção: ou baixar o último snapshot de desenvolvimento do ns‑3:
$ python download.pyou preferir o release do ns‑3, utilizando a flag -n para especificar o número da release:
$ python download.py -n ns-3.29Após esta etapa, repositórios adicionais serão baixados para o diretório ns-3-allinone ns‑3 bake, pybindgen, netanim e Em uma máquina com Ubuntu 16.04 limpa, precisei alterar o comando para esta forma:.
Nota
$ sudo python3 download.py -n ns-3.29 (aqui e adiante, observações do tradutor). Os dois métodos mencionados acima (arquivo de código-fonte ou repositório
3.3.1 Baixando o ns-3 com Bake
via Git) são úteis para obter a instalação mais simples do ns‑3 com alguns addons ( ns-3-allinone para gerar bindings Python enetanim para a animação da rede). O terceiro repositório, fornecido por padrão no ns‑3-allinone, é chamado Em uma máquina com Ubuntu 16.04 limpa, precisei alterar o comando para esta forma: — é uma ferramenta para construir software coordenadamente a partir de vários repositórios, desenvolvida para o projeto ns‑3. pybindgen.
Assar pode ser usado para obter versões de desenvolvedor do ns‑3, assim como para baixar e compilar extensões da versão básica do distribuidor ns‑3, como o ambiente Assar Direct Code Execution CradleNetwork Simulation Cradle, , a capacidade de criar novas bindings Python e vários "aplicativos" do ns‑3.CradleNetwork Simulation Cradle — é um framework que permite usar pilhas de rede reais TCP / IP dentro do simulador de rede.
Nota
Se você supõe que sua instalação do ns‑3 deve ter funcionalidades estendidas ou adicionais, você pode seguir este caminho de instalação.
Nas versões mais recentes do ns‑3
foi adicionado no release tar. A release inclui um arquivo de configuração que permite baixar as versões de software mais atuais no momento da criação da release. Ou seja, por exemplo, a versão Assar , que é distribuída com a release ns‑3.29, pode ser usada para obter componentes para esta release do ns‑3 ou anteriores, mas não pode ser usada para extrair componentes para releases mais recentes (se o arquivo de descrição do pacote Assarbakeconf.xml não foi atualizado). Você também pode obter a cópia mais recente
, digitando o seguinte comando no seu console Linux (desde que você tenha o Git instalado): pybindgen, digitando o seguinte comando no seu console Linux (desde que o Git esteja instalado):
$ cd
$ mkdir workspace
$ cd workspace
$ git clone https://gitlab.com/nsnam/bake.gitAo executar o comando git, você deve ver algo semelhante ao seguinte:
Clonando para 'bake'...
remote: Enumerando objetos: 2086, concluído.
remote: Contando objetos: 100% (2086/2086), concluído.
remote: Compactando objetos: 100% (649/649), concluído.
remote: Total 2086 (delta 1404), reutilizado 2078 (delta 1399)
Recebendo objetos: 100% (2086/2086), 2.68 MiB | 3.82 MiB/s, concluído.
Resolvendo deltas: 100% (1404/1404), concluído.Após a conclusão do comando clone você deve ter um diretório chamado pybindgen, cujo conteúdo deve se parecer aproximadamente com isso:
$ cd bake
$ ls
bake bakeconf.xml bake.py doc examples generate-binary.py test TODOObserve que você baixou vários scripts Python, um módulo Python chamado pybindgen e um arquivo de configuração XML. O próximo passo será usar esses scripts para baixar e compilar a distribuição ns-3 de sua escolha. Várias opções de configuração estão disponíveis:
ns-3.29: módulo correspondente ao lançamento; ele irá baixar componentes semelhantes ao lançamento em um tarball;
ns-3-dev: módulo semelhante, mas utilizando código da árvore de desenvolvimento;
ns-allinone-3.29: módulo que inclui outras funcionalidades adicionais, como roteamento Click e Network Simulation Cradle, Openflow para ns-3.
ns-3-allinone: semelhante à versão de lançamento do módulo allinone, mas para código de desenvolvimento.
Nota
Click — arquitetura de software modular para criação de roteadores.
Openflow — protocolo de gerenciamento do processo de tratamento de dados que são transmitidos pela rede de dados através de roteadores e switches, implementando tecnologia de rede programável.
O snapshot atual de desenvolvimento (não lançado) do ns-3 pode ser encontrado em:.
Os desenvolvedores se esforçam para manter esses repositórios em um estado de funcionamento coerente, mas eles estão em uma área de desenvolvimento e contêm código não lançado, então, se você não planeja usar novos recursos, escolha o lançamento oficial.
Você pode encontrar a versão mais recente do código, verificando a lista de repositórios ou acessando a página da web "ns-3 Releases": e clicando no link da versão mais recente. Neste exemplo, continuaremos com ns-3.29.
Agora, para obter os componentes necessários do ns-3, aplicaremos a ferramenta Assar. Vamos dizer algumas palavras introdutórias sobre o funcionamento Assar.
Bake funciona baixando as fontes dos pacotes para o diretório source e instalando bibliotecas no diretório de construção. Assar pode ser executado referenciando o arquivo binário, mas se você quiser executar Assar não na diretório em que foi carregado, é desejável adicionar o caminho para pybindgen o seu caminho (variável de ambiente PATH), por exemplo, da seguinte maneira (exemplo para shell Linux bash). Navegue até o diretório 'bake' e, em seguida, defina as seguintes variáveis de ambiente:
$ export BAKE_HOME=`pwd`
$ export PATH=$PATH:$BAKE_HOME:$BAKE_HOME/build/bin
$ export PYTHONPATH=$PYTHONPATH:$BAKE_HOME:$BAKE_HOME/build/libIsso colocará o programa bake.py no caminho do shell e permitirá que outros programas encontrem os arquivos executáveis e bibliotecas que foram criados pybindgen. Em alguns casos de uso pybindgen, a configuração do PATH e PYTHONPATH acima não é necessária, mas para a compilação completa do ns-3-allinone (com pacotes adicionais) geralmente é necessária.
Vá para o diretório de trabalho e digite o seguinte no console:
$ ./bake.py configure -e ns-3.29Em seguida, vamos pedir para Assar verificar se temos as ferramentas necessárias para baixar vários componentes. Digite:
$ ./bake.py checkVocê deve ver algo como o seguinte:
> Python - OK
> Compilador GNU C++ - OK
> Mercurial - OK
> Git - OK
> Ferramenta Tar - OK
> Ferramenta Unzip - OK
> Make - OK
> cMake - OK
> ferramenta patch - OK
> Caminho pesquisado para ferramentas: /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin ...Em particular, ferramentas de download, como Mercurial, CVS, Git e Bazaar, são essenciais nesta etapa, pois nos permitem obter o código. Neste estágio, instale as ferramentas ausentes de maneira usual para o seu sistema (se souber) ou procure ajuda do seu administrador de sistema.
Em seguida, tente baixar o software:
$ ./bake.py downloado resultado deve ser algo como:
>> Procurando pela dependência do sistema setuptools - OK
>> Procurando pela dependência do sistema libgoocanvas2 - OK
>> Procurando pela dependência do sistema gi-cairo - OK
>> Procurando pela dependência do sistema pygobject - OK
>> Procurando pela dependência do sistema pygraphviz - OK
>> Procurando pela dependência do sistema python-dev - OK
>> Procurando pela dependência do sistema qt - OK
>> Procurando pela dependência do sistema g++ - OK
>> Baixando pybindgen-0.19.0.post4+ng823d8b2 (diretório de destino:pybindgen) - OK
>> Baixando netanim-3.108 - OK
>> Baixando ns-3.29 - OKIsso indicará que três fontes foram baixadas. Agora vá para o diretório source e digite ls; você deve ver:
$ cd source
$ ls
netanim-3.108 ns-3.29 pybindgenAgora você está pronto para compilar a distribuição do ns-3.
3.4 Construindo o ns-3
Assim como ao baixar o ns-3, existem várias maneiras de compilar o ns-3. Principalmente, queremos enfatizar que o ns-3 é compilado usando uma ferramenta de construção chamada Waf, descrita abaixo. A maioria dos usuários trabalhará com Waf, mas existem alguns scripts úteis que podem ajudá-lo a começar ou a organizar compilações mais complexas. Então, por favor, antes de ler sobre Waf, dê uma olhada no build.py e a compilação com pybindgen.
3.4.1 Construindo com build.py
Atenção! Este passo de compilação está disponível apenas a partir da versão do arquivo-fonte, obtida como descrito acima; e não baixada via git ou bake.
Ao trabalhar com o arquivo de lançamento tarball, neste teste de 2015 ns‑3‑allinone há um script útil que pode simplificar a compilação dos componentes. Ele se chama build.py. Este programa configurará o projeto para você da maneira mais útil. No entanto, observe que configurações mais complexas e o trabalho com ns‑3 geralmente envolvem o uso do próprio sistema de compilação do ns‑3, Waf, que será apresentado mais adiante neste guia.
Se você fez o download usando tarball, então no seu diretório ~\/workspace deve aparecer um diretório com um nome parecido com ns-allinone-3.29. Digite o seguinte:
$ .\/build.py --enable-examples --enable-tests
Ao chamar build.py aplicamos os argumentos da linha de comando para compilar os exemplos e testes usados neste guia, que por padrão não são compilados no ns‑3. Por padrão, o programa também compila todos os módulos disponíveis. Depois, se desejar, você pode compilar o ns‑3 sem exemplos e testes ou excluir módulos que não são necessários para o seu trabalho.
Você verá muitas mensagens de saída do compilador sendo exibidas pelo script durante a compilação das várias partes que você carregou. Primeiro, o script tentará compilar o animador Em uma máquina com Ubuntu 16.04 limpa, precisei alterar o comando para esta forma:, depois o gerador de bindings netanim e, por último, o ns‑3. Ao final do processo, você deve ver o seguinte:
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\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 (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.29Nas últimas três linhas da listagem, vemos a mensagem sobre os módulos que não foram compilados:
Modules not built (see ns-3 tutorial for explanation):\nbrite clickIsso apenas significa que alguns módulos do ns-3 que dependem de bibliotecas externas podem não ter sido compilados, ou que a compilação deles não é necessária para esta configuração. Isso não significa que o simulador não foi compilado ou que os módulos compilados funcionarão incorretamente.
3.4.2 Construindo com Bake
Se você usou o bake para obter o código-fonte dos repositórios do projeto, pode continuar a usá-lo para compilar o ns-3. Digite:
$ ./bake.py builde você deve ver algo como:
>> Compilando pybindgen-0.19.0.post4+ng823d8b2 - OK
>> Compilando netanim-3.108 - OK
>> Compilando ns-3.29 - OKDica: você também pode executar ambos os passos, download e compilação, chamando "bake.py deploy".
Durante a compilação de todos os componentes, podem ocorrer falhas, mas a compilação continuará se o componente não for essencial. Por exemplo, um problema recente de portabilidade foi que castxml pode ser compilado por uma ferramenta pybindgen em todas as plataformas. Nesse caso, aparecerá uma mensagem como:
>> Compilando castxml - Problema
> Problema: Dependência opcional, módulo "castxml" falhou
Isso pode reduzir a funcionalidade da compilação final.
No entanto, o bake continuará, já que "castxml" não é uma dependência essencial.
Para mais informações, chame o bake com -v ou -vvv, para o modo totalmente detalhado.No entanto castxml é necessário apenas se você quiser criar novas ligações Python. Para a maioria dos usuários, isso não é necessário (pelo menos até que eles comecem a modificar o ns-3), então esses avisos podem ser ignorados por enquanto.
Se ocorrer uma falha, o seguinte comando lhe dará uma dica sobre dependências ausentes:
$ ./bake.py showSerão listadas várias dependências de pacotes que você está tentando compilar.
3.4.3 Construindo com Waf
Até agora, para iniciar a compilação do ns-3, usamos o script build.py, ou a ferramenta pybindgen. Essas ferramentas são úteis para compilar o ns-3 e apoiar as bibliotecas. Na verdade, para compilar, elas iniciam a ferramenta de construção Waf do diretório do ns-3. Waf que é instalada junto com o código-fonte do ns-3. A maioria dos usuários rapidamente passa a usar diretamente Waf. Portanto, para continuar, por favor, vá para o diretório do ns-3 que você criou inicialmente.
Atualmente, isso não é estritamente necessário, mas será útil fazer uma pequena digressão e ver como fazer alterações na configuração do projeto. Provavelmente, a alteração de configuração mais útil que você pode fazer será criar uma versão otimizada do código. Por padrão, você configurou seu projeto para compilar uma versão de depuração. Vamos considerar o projeto para criar uma compilação otimizada. Para explicar ao Waf que ele deve produzir compilações otimizadas, incluindo exemplos e testes, você precisará executar os seguintes comandos:
$ ./waf clean
$ ./waf configure --build-profile=optimized --enable-examples --enable-testsIsto irá executar Waf fora do diretório local (para sua conveniência). O primeiro comando limpa a compilação anterior, normalmente não é estritamente necessário, mas é uma boa prática (veja também os perfis de compilação abaixo); isso removerá as bibliotecas e arquivos de objeto previamente criados que estão no diretório build/. Quando o projeto é reconfigurado e o sistema de compilação verifica várias dependências, você deve ver uma saída semelhante à seguinte:
Definindo o diretório superior para : /home/ns3user/workspace/bake/source/ns-3-dev
Definindo saída para : /home/ns3user/workspace/bake/source/ns-3-dev/build
Verificando 'gcc' (compilador C) : /usr/bin/gcc
Verificando a versão do cc : 7.3.0
Verificando 'g++' (compilador C++) : /usr/bin/g++
Verificando suporte à flag de compilação -march=native : ok
Verificando suporte à flag de compilação -Wl,--soname=foo : ok
Verificando suporte à flag de compilação -std=c++11 : ok
Verificando inclui do boost : cabeçalhos não encontrados, por favor, forneça um argumento --boost-includes (veja ajuda)
Verificando inclui do boost : cabeçalhos não encontrados, por favor, forneça um argumento --boost-includes (veja ajuda)
Verificando o programa 'python' : /usr/bin/python
Verificando versão do python >= 2.3 : 2.7.15 python-config : /usr/bin/python-config
Pedindo ao python-config por pyembed '--cflags --libs --ldflags' : sim
Testando configuração do pyembed : sim
Pedindo ao python-config por pyext '--cflags --libs --ldflags' : sim
Testando configuração do pyext : sim
Verificando suporte à flag de compilação -fvisibility=hidden : ok
Verificando suporte à flag de compilação -Wno-array-bounds : ok
Verificando localização do pybindgen : ../pybindgen ,!(adivinhado)
Verificando módulo python 'pybindgen' : 0.19.0. ,!post4+g823d8b2
Verificando versão do pybindgen : 0.19.0. ,!post4+g823d8b2
Verificando snippet de código : sim
Verificando equivalência entre tipos uint64_t e unsigned long : não
Verificando snippet de código : não
Verificando equivalência entre tipos uint64_t e unsigned long long : sim
Verificando os apidefs que podem ser usados para vinculações Python : gcc-LP64
Verificando internal GCC cxxabi : completo
Verificando módulo python 'pygccxml' : não encontrado
Verificando localização do click : não encontrado
Verificando programa 'pkg-config' : /usr/bin/pkg- ,!config
Verificando 'gtk+-3.0' : não encontrado
Verificando 'libxml-2.0' : sim
verificando uint128_t : não encontrado
verificando __uint128_t : sim
Verificando implementação de alta precisão : inteiro de 128 bits ,!(padrão)
Verificando cabeçalho stdint.h : sim
Verificando cabeçalho inttypes.h : sim
Verificando cabeçalho sys/inttypes.h : não encontrado
Verificando cabeçalho sys/types.h : sim
Verificando cabeçalho sys/stat.h : sim
Verificando cabeçalho dirent.h : sim
Verificando cabeçalho stdlib.h : sim
Verificando cabeçalho signal.h : sim
Verificando cabeçalho pthread.h : sim
Verificando cabeçalho stdint.h : sim
Verificando cabeçalho inttypes.h : sim
Verificando cabeçalho sys/inttypes.h : não encontrado
Verificando biblioteca rt : sim
Verificando cabeçalho sys/ioctl.h : sim
Verificando cabeçalho net/if.h : sim
Verificando cabeçalho net/ethernet.h : sim
Verificando cabeçalho linux/if_tun.h : sim
Verificando cabeçalho netpacket/packet.h : sim
Verificando localização do NSC : não encontrado
Verificando 'sqlite3' : não encontrado
Verificando cabeçalho linux/if_tun.h : sim
Verificando módulo python 'gi' : 3.26.1
Verificando módulo python 'gi.repository.GObject' : ok
Verificando módulo python 'cairo' : ok
Verificando módulo python 'pygraphviz' : 1.4rc1
Verificando módulo python 'gi.repository.Gtk' : ok
Verificando módulo python 'gi.repository.Gdk' : ok
Verificando módulo python 'gi.repository.Pango' : ok
Verificando módulo python 'gi.repository.GooCanvas' : ok
Verificando programa 'sudo' : /usr/bin/sudo
Verificando programa 'valgrind' : não encontrado
Verificando 'gsl' : não encontrado python-config : não encontrado
Verificando suporte à flag de compilação -fstrict-aliasing : ok
Verificando suporte à flag de compilação -fstrict-aliasing : ok
Verificando suporte à flag de compilação -Wstrict-aliasing : ok
Verificando suporte à flag de compilação -Wstrict-aliasing : ok
Verificando programa 'doxygen' : /usr/bin/doxygen
---- Resumo das características opcionais do ns-3:
Perfil de construção : otimizado
Diretório de construção :
Integração BRITE : não habilitada (BRITE não habilitado (veja a opção --with- ,!brite))
Coleta de métricas DES : não habilitada (padrões desativados)
Dispositivo FdNet de Emulação : habilitado
Exemplos : habilitado
Dispositivo NetDevice de descritor de arquivo : habilitado
Biblioteca Científica GNU (GSL) : não habilitada (GSL não encontrado)
Biblioteca Gcrypt : não habilitada
(libgcrypt não encontrado: você pode usar ,!libgcrypt-config para encontrar sua localização.) GtkConfigStore : não habilitada (biblioteca 'gtk+-3.0 >= 3.0' não encontrada)
Suporte MPI : não habilitado (opção --enable-mpi não selecionada)
Integração ns-3 Click : não habilitada (nsclick não habilitado (veja a opção --with- ,!nsclick))
Integração ns-3 OpenFlow : não habilitada (Bibliotecas boost necessárias não encontradas)
Berço de Simulação de Rede : não habilitada (NSC não encontrado (veja a opção --with-nsc))
Dispositivo FdNet de PlanetLab : não habilitada (sistema operacional PlanetLab não detectado ,!(veja a opção --force-planetlab)) Visualizador PyViz : habilitado
Suporte de Escaneamento da API Python : não habilitada (Módulo Python 'pygccxml' ausente)
Vinculações Python : habilitado
Simulador em Tempo Real : habilitado
Saída de dados estatísticos SQlite : não habilitada (biblioteca 'sqlite3' não encontrada)
Ponte Tap : habilitada
Dispositivo FdNet Tap : habilitado
Testes : habilitado
Primitivas de Threading : habilitado
Use sudo para definir o bit suid : não habilitada (opção --enable-sudo não selecionada)
XmlIo : habilitado
'configure' concluído com sucesso (6.387s)Preste atenção na última parte da listagem acima. Algumas opções do ns‑3 não estão incluídas por padrão ou requerem suporte do sistema para funcionar corretamente. Por exemplo, para ativar o XmlTo, a biblioteca libxml-2.0deve estar presente no sistema. Se essa biblioteca não for encontrada e a função correspondente do ns‑3 não estiver ativada, será exibida uma mensagem. Também observe que há a possibilidade de usar o comando sudo para definir o bit suid "definindo o ID do grupo em tempo de execução" em determinados programas. Ele não está ativado por padrão, e portanto, essa função é exibida como "não ativada". Finalmente, para obter uma lista de opções ativadas, utilize Waf com o parâmetro --check-config.
Agora vamos voltar e alternar para a compilação de depuração, que contém exemplos e testes.
$ ./waf clean
$ ./waf configure --build-profile=debug --enable-examples --enable-testsO sistema de construção agora está configurado, e você pode compilar versões de depuração dos programas ns‑3 apenas digitando:
$ ./wafEmbora os passos descritos acima tenham feito você compilar parte do sistema ns‑3 duas vezes, agora você sabe como alterar a configuração e construir código otimizado.
Para verificar qual perfil está ativo para a configuração do projeto, existe o comando:
$ ./waf --check-profile
Waf: Entrando no diretório `/path/to/ns-3-allinone/ns-3.29/build'
Perfil de construção: debugO cenário discutido acima build.py também suporta os argumentos --enable-examples e --enable-tests, mas outras opções Waf não são suportadas diretamente. Por exemplo, isso não funcionará:
$ ./build.py --disable-pythona resposta será:
build.py: erro: opção inexistente: --disable-pythonNo entanto, um operador especial -- pode ser usado para passar parâmetros adicionais através de waf, portanto, em vez do mencionado acima, o seguinte comando funcionará:
$ ./build.py -- --disable-pythonuma vez que ele gera o comando principal ./waf configure --disable-python. Aqui estão algumas dicas adicionais sobre Waf.
Tratamento de erros de construção
As versões do ns-3 foram testadas nas versões mais recentes dos compiladores C++ disponíveis no momento do lançamento em distribuições populares do Linux e MacOS. No entanto, com o tempo, novos lançamentos com novos compiladores são feitos, e esses compiladores mais novos geralmente são mais rigorosos em relação a avisos. O ns-3 configura sua construção para tratar todos os avisos como erros, portanto, às vezes, se você usar uma versão mais antiga em um sistema mais novo, um aviso do compilador pode interromper a construção.
Por exemplo, anteriormente houve o lançamento ns-3.28 para o Fedora 28, que incluía uma nova versão principal gcc (gcc-8). A construção da versão ns-3.28 ou versões anteriores para o Fedora 28, com Gtk2+ instalado, gerará o seguinte erro:
/usr/include/gtk-2.0/gtk/gtkfilechooserbutton.h:59:8: error: unnecessary parentheses ,!in declaration of ‘__gtk_reserved1’ [-Werror=parentheses] void (*__gtk_reserved1);Nas versões a partir do ns-3.28.1, Waf está disponível uma opção para resolver esses problemas. Ela desabilita a configuração do flag "-Werror" no g++ e clang++. Esta opção é "--disable-werror", que deve ser aplicada durante a configuração:
$ ./waf configure --disable-werror --enable-examples --enable-testsConfigurar ou construir
Alguns comandos Waf são significativos apenas na fase de configuração, enquanto outros funcionam apenas na fase de construção. Por exemplo, se você quiser usar as funções de emulação do ns-3, pode ativar a definição do bit suid usando sudo, como descrito acima. Isso cancelará os comandos da fase de configuração, e assim você poderá alterar a configuração usando o próximo comando, que também inclui exemplos e testes.
$ ./waf configure --enable-sudo --enable-examples --enable-testsSe você fizer isso, Waf executará sudo, para alterar os programas de criação de sockets do código de emulação para executar com permissões root. No Waf estão disponíveis várias outras opções para as fases de configuração e construção. Para explorar as opções, digite:
$ ./waf --helpNa próxima seção, usaremos algumas opções relacionadas a testes.
Perfis de construção
Já vimos como configurar Waf para construções debug e otimizadas:
$ ./waf --build-profile=debugTambém existe um perfil de construção intermediário, release. Opção -d que é sinônimo de --build-profile. O perfil de construção gerencia o uso de log, afirmações (assertions) e chaves de otimização do compilador:

Como pode ser visto, o registro e as declarações estão disponíveis apenas em compilações de depuração. A prática recomendada é desenvolver seu script em modo de depuração e, em seguida, executar rodadas repetidas (para estatísticas ou alterações de parâmetros) em um perfil de compilação otimizado.
Se você tiver código que deve ser executado apenas em perfis de compilação específicos, use o macro Code Wrapper Macro:
NS_BUILD_DEBUG (std::cout << "Parte de uma linha de saída..." << std::flush; timer.Start ,!()); DoLongInvolvedComputation ();
NS_BUILD_DEBUG (timer.Stop (); std::cout << "Concluído: " << timer << std::endl;)Por padrão, Waf coloca os artefatos de compilação no diretório de compilação. Você pode especificar outro diretório de saída usando a opção - -out, por exemplo:
$ ./waf configure --out=minha-build-dirCombinando isso com os perfis de compilação, você pode alternar facilmente entre diferentes opções de compilação:
$ ./waf configure --build-profile=debug --out=build/debug
$ ./waf build
...
$ ./waf configure --build-profile=optimized --out=build/optimized
$ ./waf build
...O que permite que você trabalhe com várias compilações sem reescrever cada vez a última compilação. Quando você alterna para outro perfil, Waf ele compilará apenas ele, sem precisar recompilar tudo novamente.
Quando você alterna perfis de compilação dessa forma, é necessário ter cuidado para sempre fornecer os mesmos parâmetros de configuração. Você pode evitar erros definindo várias variáveis de ambiente:
$ 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 buildCompiladores e flags
Nos exemplos acima Waf para compilar o ns-3 utiliza o compilador C++ do GCC ( — Necessário para compilar módulos, pois alguns deles são implementados na linguagem). No entanto, é possível alterar o compilador de C++ utilizado Waf definindo a variável de ambiente CXX. Por exemplo, para usar o compilador C++ Clang, clang++,
$ CXX="clang++" ./waf configure
$ ./waf build De forma semelhante, pode-se configurar Waf para usar compilação distribuída com distcc:
$ CXX="distcc g++" ./waf configure
$ ./waf buildPara mais informações sobre distcc e compilação distribuída, consulte a página do projeto na seção 'Documentação'. Para adicionar flags de compilador durante a configuração do ns-3, utilize a variável de ambiente CXXFLAGS_EXTRA.
Instalação
Waf pode ser usado para instalar bibliotecas em diferentes locais do sistema. Por padrão, as bibliotecas compiladas e os arquivos executáveis estão no diretório build, e como o Waf conhece a localização dessas bibliotecas e arquivos executáveis, não é necessário instalar as bibliotecas em outro lugar.
Se os usuários preferirem instalar fora do diretório de construção, eles podem executar o comando .\/waf install. Por padrão, o prefixo para a instalação é /usr/local, por isso .\/waf install instalará programas em /usr/local/bin, bibliotecas em /usr/local/lib e arquivos de cabeçalho em /usr/local/include. Os privilégios de superusuário geralmente são necessários para instalar com o prefixo padrão, portanto, o comando típico será sudo .\/waf install. Ao ser executado, o Waf primeiro prefere usar bibliotecas comuns no diretório de construção, depois procurará bibliotecas no caminho para bibliotecas configurado no ambiente local. Portanto, ao instalar bibliotecas no sistema, é uma boa prática verificar se as bibliotecas corretas estão sendo utilizadas. Os usuários podem optar por instalar com um prefixo diferente, passando durante a configuração a opção --prefix, por exemplo:
.\/waf configure --prefix=\/opt\/localSe posteriormente, após a construção, o usuário digitar o comando de instalação . /waf, será utilizado o prefixo /opt/local.
Time .\/waf clean deve ser usado antes da reconfiguração do projeto, se a instalação for feita com Waf um prefixo diferente.
Portanto, para usar o ns‑3, não há necessidade de chamar .\/waf install. A maioria dos usuários não precisará deste comando, pois Waf capturará as bibliotecas atuais do diretório de construção, mas alguns usuários podem achar isso útil, se suas atividades envolverem o trabalho com programas fora do diretório ns‑3.
Waf é único
No nível superior da árvore de código-fonte do ns‑3, existe apenas um script Waf. Ao começar a trabalhar, você passará muito tempo no diretório scratch\/ ou mais fundo, emsrc\/... e ao mesmo tempo precisará executar Waf. Você pode simplesmente lembrar onde está e executar Waf da seguinte forma:
$ ..\/..\/..\/waf ...mas isso será tedioso e propenso a erros, portanto, há soluções melhores. Um dos métodos comuns é usar um editor de texto, como emacs ou vim, onde duas sessões de terminal são abertas, uma é usada para compilar o ns‑3, e a outra para editar o código-fonte. Se você tiver apenas tarball, pode ajudar uma variável de ambiente:
$ export NS3DIR="$PWD"
$ function waff { cd $NS3DIR && .\/waf $* ; }
$ cd scratch
$ waff buildPode parecer tentador adicionar um script trivial waf no diretório do módulo como exemplo. exec ..\/..\/waf. Por favor, não faça isso. Isso confunde os novatos e, se feito de forma inadequada, leva a erros de compilação difíceis de detectar. As soluções mostradas acima são o caminho a seguir.
3.5 Testando o ns-3
Você pode executar testes de módulo da distribuição ns‑3 rodando o script .\/test.py:
$ .\/test.pyEsses testes são executados em paralelo com Waf. No final, você deve ver uma mensagem indicando que
92 de 92 testes passaram (92 passaram, 0 falharam, 0 travaram, 0 erros do valgrind)Esta é uma mensagem importante para identificar falhas, travamentos ou erros do valgrind, indicando problemas com o código ou incompatibilidade entre as ferramentas e o código.
Você também verá a saída final do Waf e do testador executando cada teste, que terá uma aparência semelhante a esta:
Waf: Entrando no diretório `\/caminho\/para\/workspace\/ns-3-allinone\/ns-3-dev\/build'
Waf: Saindo do diretório `\/caminho\/para\/workspace\/ns-3-allinone\/ns-3-dev\/build'
'build' finalizado com sucesso (1.799s)
Módulos construídos:
aodv aplicações bridge
click config-store core
csma csma-layout dsdv
emu energia monitoramento de fluxo
internet lte mesh
mobilidade mpi netanim
rede nix-vector-routing ns3tcp
ns3wifi olsr openflow
ponto-a-ponto ponto-a-ponto-layout propagação
spectrum stats tap-bridge
modelo teste ferramentas
topologia-lida uan dispositivo-rede-virtual
visualizador wifi wimax
PASS: TestSuite ns3-wifi-interference
PASS: TestSuite histogram
...
PASS: TestSuite object
PASS: TestSuite random-number-generators
92 de 92 testes passaram (92 passaram, 0 falharam, 0 travaram, 0 erros do valgrind)
Este comando é normalmente usado pelos usuários para uma verificação rápida da correção da compilação da distribuição ns‑3. (Observe que a ordem das linhas "PASS: ..." pode variar, isso é normal. O importante é que, na linha final do relatório, todos os testes passaram; nenhum teste falhou ou travou.) E Waf, quanto test.py serão paralelizados de acordo com os CPUs disponíveis da máquina.
3.6 Executando o script
Geralmente executamos os scripts sob a supervisão de Waf. Isso permite que o sistema de compilação garanta que os caminhos para a biblioteca compartilhada estejam configurados corretamente e que as bibliotecas estejam disponíveis em tempo de execução. Para executar o programa, basta usar Waf com o parâmetro - -run. Vamos executar para ns‑3 o equivalente ao onipresente programa hello world, digitando o seguinte:
$ .\/waf --run hello-simulatorO Waf primeiro verificará se o programa foi compilado corretamente e, se necessário, realizará a compilação. Em seguida, Waf executará o programa, que gerará a seguinte saída.
Hello SimulatorParabéns! Agora você é um usuário do ns‑3!
O que devo fazer se eu não ver o resultado?
Se você ver mensagens Waf, indicando que a compilação foi concluída com sucesso, mas não vê a saída «Hello Simulator», é provável que você tenha mudado seu modo de compilação na seção [Compilação-com-Waf] para otimizadas, mas esqueceu de reverter para o modo debug. Toda a saída do console usada neste guia utiliza um componente especial do ns‑3 que executa gravação de log e é aplicado para imprimir mensagens personalizadas no console. A saída desse componente é automaticamente desativada durante a compilação de código otimizado — ele é 'otimizado'. Se você não vir a saída de 'Hello Simulator', digite o seguinte:
$ .\/waf configure --build-profile=debug --enable-examples --enable-testspara configurar Waf a compilação de versões de depuração dos programas ns‑3, que incluem exemplos e testes. Em seguida, você deve recompilar a versão de depuração atual do código, digitando
$ ./wafAgora, se você executar o programa hello-simulator, você deve ver o resultado esperado.
3.6.1 Argumentos da linha de comando
Para passar argumentos de linha de comando para o programa ns‑3, use o seguinte modelo:
$ .\/waf --run --command-template="%s "Substitua pelo nome do seu programa e pelos argumentos. O argumento - -command-template para Waf é, essencialmente, uma receita para construir a linha de comando real Waf usada para executar o programa. O Waf verifica se a compilação foi concluída, define os caminhos para a biblioteca compartilhada e, em seguida, usando o modelo de linha de comando fornecido e substituindo o nome do programa pelo marcador %s, chama o arquivo executável. Se essa sintaxe parecer complicada, existe uma opção mais simples que envolve o programa ns‑3 e seus argumentos entre aspas simples:
$ .\/waf --run ' --arg1=value1 --arg2=value2 ...'Outro exemplo especialmente útil é a execução seletiva de conjuntos de testes. Vamos supor que exista um conjunto de testes (suite) mytest (na verdade, ele não existe). Acima, usamos o script .\/test.py para executar paralelamente toda uma série de testes, que chama repetidamente o programa de teste test-runner. Chamado test-runner diretamente para executar um teste:
$ ./waf --run test-runner --command-template="%s --suite=mytest --verbose"Os argumentos serão passados para o programa test-runner. Como mytest não existe, uma mensagem de erro será gerada. Para imprimir os parâmetros disponíveis do test-runner, digite:
$ ./waf --run test-runner --command-template="%s --help"3.6.2 Depuração
Para executar programas ns-3 sob outra utilidade, como um depurador (por exemplo, gdb) ou uma ferramenta de verificação de memória (por exemplo, valgrind), use uma forma semelhante - -command-template = "…". Por exemplo, para executar no depurador gdb seu programa hello-simulator ns-3 com os argumentos:
$ ./waf --run=hello-simulator --command-template="gdb %s --args "Observe que o nome do programa ns-3 vem com um argumento - -run, e a utilidade de gerenciamento (aqui gdb) é o primeiro token no argumento - -command-template. Opção - -args informa gdb, enquanto o resto da linha de comando pertence ao programa 'inferior'. (Algumas versões gdb não entendem a opção - -args. Nesse caso, remova os argumentos do programa de - -command-template e use o conjunto de comandos gdb args.) Podemos combinar esta receita e a anterior para executar um teste sob o depurador:
$ ./waf --run test-runner --command-template="gdb %s --args --suite=mytest --verbose"3.6.3 Diretório de trabalho
O Waf deve ser executado a partir de sua localização no topo da árvore ns-3. Esta pasta se torna o diretório de trabalho onde os arquivos de saída serão gravados. Mas o que fazer se você quiser manter esses arquivos fora da árvore de código-fonte ns-3? Use o argumento - -cwd:
$ ./waf --cwd=...Talvez seja mais conveniente para você obter arquivos de saída em seu diretório de trabalho. Nesse caso, uma ação indireta pode ajudar:
$ function waff {
CWD="$PWD"
cd $NS3DIR >/dev/null
./waf --cwd="$CWD" $*
cd - >/dev/null
}Essa decoração da versão anterior do comando mantém o diretório de trabalho atual, muda para o diretório Waf, e então instrui Waf a mudar o diretório de trabalho de volta para o salvo antes de executar o programa no diretório de trabalho atual. Mencionamos o comando - -cwd para completar a exposição, a maioria dos usuários simplesmente executa o Waf a partir do diretório de nível superior e gera os arquivos de saída lá.
Fonte: habr.com
