ns-3 ağ simülatörü eğitimi. Bölüm 3

ns-3 ağ simülatörü eğitimi. Bölüm 3
1,2. bölüm

3 Başlarken
3.1 Genel Bakış
3.2 Önkoşullar
3.2.1 ns-3 sürümünü kaynak arşiv olarak indirme
3.3 Git'i kullanarak ns-3'ü indirme
3.3.1 Bake kullanarak ns-3'ü yükleme
3.4 Montaj ns-3
3.4.1 build.py ile oluşturma
3.4.2 Fırında İnşa Etme
3.4.3 Waf ile Oluşturma
3.5 ns-3'ün test edilmesi
3.6 Komut dosyasını çalıştırma
3.6.1 Komut satırı argümanları
3.6.2 Hata Ayıklama
3.6.3 Çalışma dizini

Bölüm 3

Başlarken

Bu bölümün amacı, okuyucuyu, ns-3'ü hiç kurmamış olabilecek bir bilgisayara başlamaya hazırlamaktır. Desteklenen platformları, önkoşulları, ns-3'ün nasıl edinileceğini, ns-3'ün nasıl oluşturulacağını ve basit programlarınızı nasıl test edip çalıştıracağınızı kapsar.

3.1 Genel Bakış

Ns-3 simülatörü, işbirlikçi yazılım kitaplıklarından oluşan bir sistem olarak oluşturulmuştur. Montaj sırasında kullanıcı programlarının kodları bu kütüphanelere bağlanır. Özel programlar yazmak için C++ veya Python programlama dilleri kullanılır.

Ns-3 kaynak kodu olarak dağıtılır; bu, hedef sistemin önce kütüphaneleri ve ardından kullanıcı programını oluşturmak için bir yazılım geliştirme ortamına sahip olması gerektiği anlamına gelir. Prensip olarak ns-3 belirli bir sistem için hazır kütüphaneler halinde dağıtılabilir ve gelecekte de bu şekilde dağıtılabilir. Ancak günümüzde pek çok kullanıcı aslında işini ns-3'ün kendisini düzenleyerek yapıyor, bu nedenle kitaplıkları oluşturmak için kaynak koduna sahip olmak yararlı. İşletim sistemleri için hazır kütüphaneler ve paketler oluşturma işini üstlenmek isteyen biri varsa, lütfen e-posta listesiyle iletişime geçin. ns-geliştiricileri.

Daha sonra ns-3'ü indirip oluşturmanın üç yoluna bakacağız. Birincisi, resmi sürümü ana siteden indirip oluşturmaktır. İkincisi, temel ns-3 kurulumunun geliştirme versiyonlarının kopyalarının seçilmesi ve birleştirilmesidir. Üçüncüsü, ns-3 için daha fazla uzantı yüklemek üzere ek derleme araçları kullanmaktır. Araçlar biraz farklı olduğundan her birinin üzerinden geçeceğiz.

Deneyimli Linux kullanıcıları, ns-3'ün neden paket yöneticisi kullanan diğer kitaplıkların çoğu gibi bir paket olarak sağlanmadığını merak edebilirler. Her ne kadar çeşitli Linux dağıtımları için (örneğin Debian) ikili paketler mevcut olsa da, çoğu kullanıcı kitaplıkları düzenlemekle ve ns-3'ü kendileri yeniden oluşturmak zorunda kalıyor, bu nedenle kaynak kodunun mevcut olması kullanışlıdır. Bu nedenle kaynaktan kuruluma odaklanacağız.

Çoğu uygulama için ns-3 hakları kök gerekli değilse, ayrıcalığı olmayan bir kullanıcı hesabı kullanılması önerilir.

3.2 Önkoşullar

Mevcut ns-3 kitaplıklarının tamamı, üçüncü taraf kitaplıklara bir dizi bağımlılığa sahiptir, ancak çoğunlukla ns-3, birkaç ortak (genellikle varsayılan olarak yüklenir) bileşenlerin desteğiyle oluşturulabilir ve kullanılabilir: bir C++ derleyicisi, Bir kaynak kodu düzenleyicisi olan Python (örneğin, gayret, emacs veya Tutulma) ve geliştirme havuzları kullanılıyorsa Git sürüm kontrol sistemleri. İlk kez kullananların çoğu, yapılandırmalarında bazı ns-3 gelişmiş özelliklerinin eksik olduğunu bildirirse endişelenmelerine gerek kalmayacaktır, ancak tam kurulum isteyenler için proje, birçok yararlı ipucu ve püf noktası içeren sayfalar içeren bir wiki sağlar. Böyle bir sayfa, çeşitli sistemlere yönelik kurulum talimatlarını içeren Kurulum sayfasıdır: https://www.nsnam.org/wiki/Installation.

Bu wiki'nin Önkoşullar bölümü, ortak ns-3 seçeneklerini desteklemek için hangi paketlerin gerekli olduğunu açıklar ve ayrıca bunları Linux veya macOS'un ortak sürümlerine yüklemek için kullanılan komutları da sağlar.

Ns-3 wiki sayfasını veya ana web sitesini keşfetme fırsatından yararlanabilirsiniz: https://www.nsnam.orgçünkü orada çok fazla bilgi var. Ns-3'ün en son sürümünden (ns-3.29) başlayarak, ns-3'ü çalıştırmak için aşağıdaki araçlar gereklidir:

Araç Paketi/Sürüm

  • C++ derleyicisi
    clang++ veya g++ (g++ sürüm 4.9 veya üzeri)
  • Python
    python2 sürümü >= 2.7.10 veya python3 sürümü >=3.4
  • Git
    herhangi bir son sürüm (GitLab.com'da ns-3'e erişmek için)
  • katran
    herhangi bir son sürüm (ns-3 sürümünün paketini açmak için)
  • bunzip2
    herhangi bir son sürüm (ns-3 sürümünün paketini açmak için)

Python'un varsayılan sürümünü kontrol etmek için şunu yazın: python -V. G++ sürümünü kontrol etmek için şunu yazın: g++ -v. Herhangi bir araç eksik veya çok eskiyse lütfen ns-3 wiki sayfasındaki kurulum kılavuzuna bakın.

Artık okuyucunun Linux, MacOS veya Linux emülatörü çalıştırdığını ve en azından yukarıdaki araçlara sahip olduğunu varsayıyoruz.

3.2.1 ns-3 sürümünü kaynak arşiv olarak indirme

Bu, ns-3'ün en son sürümünü ve paket sürümlerini indirip denemek isteyen yeni bir kullanıcının uygulayacağı eylem planıdır. ns-3 sürümleri sıkıştırılmış kaynak arşivleri olarak yayınlanır. katran topu. katran topu birkaç dosyanın bir araya getirildiği özel bir yazılım arşiv formatıdır. Arşiv genellikle sıkıştırılmıştır. ns-3 önyükleme işlemi aracılığıyla katran topu çok basit, sadece bir sürüm seçmeniz, indirmeniz ve paketini açmanız yeterli.

Bir kullanıcı olarak ns-3'ü yerel bir dizinde oluşturmak istediğinizi varsayalım. çalışma alanı. Linux konsoluna aşağıdakini girerek sürümün çalışan bir kopyasını alabilirsiniz (tabii ki uygun sürüm numaralarını kullanarak)

$ 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 

Yukarıda kullanılan yardımcı programa dikkat edin wgetİnternetten nesneleri indirmek için kullanılan bir komut satırı aracıdır. Eğer yüklemediyseniz bunun için tarayıcınızı kullanabilirsiniz.

Bu adımları takip etmeniz sizi ns-allinone-3.29 dizinine götürecektir; burada birkaç dosya ve dizin görmelisiniz.

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

Artık ns-3 temel dağıtımını oluşturmaya hazırsınız ve ns-3 oluşturma bölümüne geçebilirsiniz.

3.3 Git'i kullanarak ns-3'ü indirme

Ns-3 kodu GitLab.com'daki Git depolarında mevcuttur: https://gitlab.com/nsnam/. grup nsnam açık kaynaklı bir proje tarafından kullanılan çeşitli depoları bir araya getirir.

Git depolarını kullanmaya başlamanın en kolay yolu ortamı çatallamak veya klonlamaktır ns-3-allinon. Bu, en sık kullanılan ns-3 alt sistemlerinin yüklenmesini ve birleştirilmesini yöneten bir dizi komut dosyasıdır. Git'te yeniyseniz "çatal" ve "klon" terimleri size tanıdık gelmeyebilir; eğer öyleyse, GitLab.com'da bulunan depoyu şu şekilde klonlamanızı (kendi kopyanızı oluşturmanızı) öneririz:

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

Bu aşamada dizininizin görünümü ns-3-allinon yukarıda açıklanan yayın arşivi dizininden biraz farklıdır. Bunun gibi bir şeye benzemeli:

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

Lütfen bir komut dosyası olduğunu unutmayın. indir.py, ayrıca ns-3'ü ve beraberindeki kaynak kodunu çıkaracaktır. Burada bir seçeneğiniz var: En son ns-3 geliştirme anlık görüntüsünü indirin:

$ python download.py

veya bayrağı kullanarak ns-3 sürümünü tercih edin -n sürüm numarasını belirtmek için:

$ python download.py -n ns-3.29

Bu adımdan sonra dizine ns-3-allinon ek depolar indirilecek ns-3, fırında, pybindgen и Netanim.

Dikkat
Temiz Ubuntu16.04'e sahip bir makinede komutu şu şekilde değiştirmem gerekiyordu: $ sudo python3 download.py -n ns-3.29 (bundan sonra çevirmenin notları olarak anılacaktır).

3.3.1 Bake kullanarak ns-3'ü yükleme

Yukarıdaki iki yöntem (kaynak arşivi veya depo) ns-3-allinon Git aracılığıyla) birden fazla eklentiyle en basit ns-3 kurulumunu elde etmek için kullanışlıdır(pybindgen Python bağlamaları oluşturmak ve Netanim ağ animasyonu için). Ns-3-allinone'da varsayılan olarak sağlanan üçüncü depoya denir fırında.

fırında pişirmek ns-3 projesi için geliştirilmiş, birden fazla depodan koordineli yazılım oluşturmaya yönelik bir araçtır. fırında pişirmek ns-3'ün geliştirme sürümlerini elde etmenin yanı sıra, ns-3 dağıtımının ortam gibi temel sürümünün uzantılarını indirmek ve oluşturmak için kullanılabilir Doğrudan Kod Yürütme, CradleNetwork Simülasyon Yuvası, yeni Python bağlamaları ve çeşitli ns-3 "uygulamaları" oluşturma yeteneği.

Dikkat
CradleNetwork Simülasyon Cradle, bir ağ simülatörü içinde gerçek TCP/IP ağ yığınlarını kullanmanıza olanak tanıyan bir çerçevedir.

Ns-3 kurulumunuzun gelişmiş veya ek özelliklere sahip olmasını bekliyorsanız bu kurulum yolunu takip edebilirsiniz.

En son ns-3 sürümlerinde fırında pişirmek tar sürümüne eklendi. Sürüm, yayınlandığı tarihteki mevcut yazılım sürümlerini indirmenize olanak tanıyan bir yapılandırma dosyası içerir. Bu, örneğin sürüm fırında pişirmekns-3.29 sürümüyle dağıtılan ns-3 veya daha eski bir sürüme ait bileşenleri almak için kullanılabilir, ancak daha sonraki sürümlere yönelik bileşenleri almak için kullanılamaz (paket açıklama dosyası varsa) bakconf.xml güncellenmedi).

Ayrıca en son kopyayı da alabilirsiniz fırındaLinux konsolunuza aşağıdaki komutu girerek (Git'in kurulu olduğunu varsayarak):

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

Git komutunu çalıştırdığınızda aşağıdakine benzer bir şey görmelisiniz:

Cloning into 'bake'...
remote: Enumerating objects: 2086, done. 
remote: Counting objects: 100% (2086/2086), done. 
remote: Compressing objects: 100% (649/649), done. 
remote: Total 2086 (delta 1404), reused 2078 (delta 1399) 
Receiving objects: 100% (2086/2086), 2.68 MiB | 3.82 MiB/s, done. 
Resolving deltas: 100% (1404/1404), done.

Komut tamamlandıktan sonra clone adında bir dizininiz olmalı fırında, içeriği şöyle görünmelidir:

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

Adlı bir Python modülü olan birkaç Python betiği yüklediğinizi unutmayın. fırında ve bir XML yapılandırma dosyası. Bir sonraki adım, seçtiğiniz ns-3 dağıtımını indirmek ve oluşturmak için bu komut dosyalarını kullanmaktır. Çeşitli özelleştirme hedefleri mevcuttur:

  1. ns-3.29: sürüme karşılık gelen modül; tarball'daki sürüme benzer bileşenleri indirecektir;

  2. ns-3-dev: benzer bir modül, ancak geliştirme ağacındaki kodu kullanıyor;

  3. ns-allinon-3.29: Tıklama yönlendirme ve Ağ Simülasyon Beşiği, ns-3 için Openflow gibi diğer ek özellikleri içeren bir modül.

  4. ns-3-allinon: modülün yayın sürümüne benzer allinone, ancak geliştirme kodu için.

Dikkat
Tıkla — yönlendiriciler oluşturmak için modüler yazılım mimarisi.

Openflow, yazılım tanımlı ağ teknolojisini uygulayan, yönlendiriciler ve anahtarlar tarafından bir veri ağı üzerinden iletilen verilerin işlenmesi sürecini yönetmeye yönelik bir protokoldür.

Mevcut geliştirme anlık görüntüsü (yayınlanmamış) ns-3 şu adreste bulunabilir:https://gitlab.com/nsnam/ns-3-dev.git.

Geliştiriciler bu depoları tutarlı bir çalışma düzeninde tutmaya çalışırlar, ancak bunlar geliştirme alanındadır ve yayınlanmamış kodlar içerir, bu nedenle yeni özellikleri kullanmayı planlamıyorsanız resmi sürümü seçin.

Kodun en son sürümünü, depo listesine göz atarak veya ns-3 Sürümleri web sayfasına giderek bulabilirsiniz:https://www.nsnam.org/releases/ ve en son sürüm bağlantısına tıklayın. Bu örnekte ns-3.29 ile devam edeceğiz.

Şimdi ihtiyacımız olan ns-3 bileşenlerini elde etmek için aracı kullanacağız fırında pişirmek. Çalışma hakkında birkaç giriş sözü söyleyelim fırında pişirmek.

Bake, paket kaynaklarını bir dizine yükleyerek çalışır kaynak ve kitaplıkların derleme dizinine kurulması. fırında pişirmek ikili dosyaya başvurarak çalıştırılabilir, ancak çalıştırmak istiyorsanız fırında pişirmek indirildiği dizinden değil, yolun eklenmesi tavsiye edilir fırında yolunuza (PATH ortam değişkeni), örneğin aşağıdaki gibi (Linux bash kabuğu örneği). "Bake" dizinine gidin ve ardından aşağıdaki ortam değişkenlerini ayarlayın:

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

Bu programı yerleştirecek bak.py kabuk yoluna gider ve diğer programların kendi oluşturduğu yürütülebilir dosyaları ve kitaplıkları bulmasına olanak tanır fırında. Bazı kullanım durumlarında fırında, yukarıda açıklanan PATH ve PYTHONPATH ayarı gerekli değildir, ancak tam bir ns-3-allinon yapısı (ek paketlerle birlikte) genellikle bunu gerektirir.

Çalışma dizininize gidin ve konsola aşağıdakini girin:

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

Sonra soracağız fırında pişirmek çeşitli bileşenleri yüklemek için yeterli aracımız olup olmadığını kontrol edin. Aramak:

$ ./bake.py check

Aşağıdakine benzer bir şey görmelisiniz:

> 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 ...

Özellikle Mercurial, CVS, Git ve Bazaar gibi yükleme araçları, kodu almamıza izin verdiği için bu adımda çok önemlidir. Bu noktada, eksik araçları sisteminiz için olağan şekilde (nasıl yapılacağını biliyorsanız) yükleyin veya yardım için sistem yöneticinize başvurun.

Daha sonra yazılımı indirmeyi deneyin:

$ ./bake.py download

sonuç şöyle bir şey olmalı:

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

Bu, üç kaynağın indirildiği anlamına gelecektir. Şimdi kaynak dizine gidin ve ls yazın; Görmelisin:

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

Artık ns-3 dağıtımını oluşturmaya hazırsınız.

3.4 Montaj ns-3

Ns-3'ü indirirken olduğu gibi, ns-3'ü oluşturmanın da birkaç yolu vardır. Vurgulamak istediğimiz asıl şey, ns-3'ün, adı verilen bir oluşturma aracı kullanılarak oluşturulduğudur. WAFAşağıda açıklanan. Çoğu kullanıcı birlikte çalışacak WAF, ancak başlamanıza veya daha karmaşık yapıları düzenlemenize yardımcı olacak birkaç kullanışlı komut dosyası vardır. Lütfen bu konuyu okumadan önce WAF, şuna baksana build.py ve ile montaj fırında.

3.4.1 build.py ile oluşturma

Uyarı! Bu oluşturma adımı yalnızca yukarıda açıklandığı gibi elde edilen kaynak arşiv sürümünden edinilebilir; ve git veya fırından indirilmedi.

Bir sürüm arşiviyle çalışırken katran topuIçinde ns-3-allinon Bileşenlerin montajını kolaylaştıracak kullanışlı bir komut dosyası vardır. Buna build.py denir. Bu program sizin için projeyi en kullanışlı şekilde kuracaktır. Ancak, ns-3 ile daha gelişmiş kurulum ve çalışmanın genellikle ns-3'ün kendi derleme sistemi olan Waf'ın kullanılmasını gerektirdiğini unutmayın; bu sistem, bu eğitimin ilerleyen kısımlarında tanıtılacaktır.

kullanarak indirdiyseniz katran topu, ardından dizininizde ~/çalışma alanı gibi bir adı olan bir dizin ns-allinon-3.29. Aşağıdakileri girin:

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

çağrıldığında build.py Bu eğitimde kullanılan ve ns-3'te varsayılan olarak oluşturulmayan örnekleri ve testleri oluşturmak için komut satırı bağımsız değişkenlerini kullandık. Varsayılan olarak program aynı zamanda mevcut tüm modülleri de oluşturur. Daha sonra dilerseniz örnekler ve testler olmadan ns-3'ü derleyebilir veya işiniz için gerekli olmayan modülleri hariç tutabilirsiniz.

Yüklediğiniz çeşitli parçaları oluştururken komut dosyası tarafından görüntülenen çok sayıda derleyici çıktı mesajı göreceksiniz. İlk önce senaryo animatörü oluşturmaya çalışacak Netanim, ardından bağlama oluşturucu pybindgen ve son olarak ns-3. İşlem tamamlandığında aşağıdakileri görmelisiniz:

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

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

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

Listenin son üç satırında oluşturulmamış modüllerle ilgili bir mesaj görüyoruz:

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

Bu, harici kitaplıklara bağımlı olan bazı ns-3 modüllerinin oluşturulmamış olabileceği veya bu yapılandırma için oluşturulmasının gerekmediği anlamına gelir. Bu, simülatörün monte edilmediği veya monte edilen modüllerin düzgün çalışmayacağı anlamına gelmez.

3.4.2 Fırında İnşa Etme

Proje depolarından kaynak kodunu almak için yukarıdaki fırında pişirmeyi kullandıysanız, bunu ns-3 oluşturmak için kullanmaya devam edebilirsiniz. Aramak:

$ ./bake.py build

ve şöyle bir şey görmelisiniz:

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

yardım: Ayrıca "bake.py konuşlandırmasını" çağırarak hem indirme hem de derleme adımlarını aynı anda gerçekleştirebilirsiniz.

Tüm bileşenlerin montajı başarısız olabilir ancak bir bileşen gerekmiyorsa montaj devam edecektir. Örneğin, yakın zamanda yaşanan bir taşınabilirlik sorunu şuydu: dökümxml aletle monte edilebilir fırında tüm platformlarda değil. Bu durumda şöyle bir mesaj görünecektir:

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

Ancak dökümxml yalnızca güncellenmiş Python bağlamaları oluşturmak istiyorsanız gereklidir. Çoğu kullanıcı için buna gerek yoktur (en azından ns-3 değişene kadar), dolayısıyla bu tür uyarılar şimdilik güvenle göz ardı edilebilir.

Başarısız olursa, aşağıdaki komut size eksik bağımlılıklar hakkında bir ipucu verecektir:

$ ./bake.py show

Oluşturmaya çalıştığınız paketlerin çeşitli bağımlılıkları listelenecektir.

3.4.3 Waf ile Oluşturma

Bu noktaya kadar ns-3'ü oluşturmaya başlamak için ya komut dosyasını kullandık build.py, veya araç fırında. Bu araçlar ns-3 oluşturmak ve kitaplıkları korumak için kullanışlıdır. Aslında inşa etmek için inşa aracını çalıştırıyorlar WAF ns-3 dizininden. WAF ns-3 kaynak koduyla yüklenir. Çoğu kullanıcı, ns-3'ü yapılandırmak ve birleştirmek için hızlı bir şekilde doğrudan kullanıma geçer WAF. Devam etmek için lütfen başlangıçta oluşturduğunuz ns-3 dizinine gidin.

Bu şu anda kesinlikle gerekli değildir, ancak biraz geriye giderek proje konfigürasyonunda nasıl değişiklik yapılacağını görmek faydalı olacaktır. Muhtemelen yapabileceğiniz en yararlı konfigürasyon değişikliği, kodun optimize edilmiş bir versiyonunu oluşturmaktır. Varsayılan olarak projenizi bir hata ayıklama sürümü oluşturacak şekilde yapılandırdınız. Optimize edilmiş bir yapı oluşturmak için bir projeye göz atalım. Waf'a örnekler ve testler içeren optimize edilmiş yapılar oluşturması gerektiğini açıklamak için aşağıdaki komutları çalıştırmanız gerekecektir:

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

Bu başlatılacak WAF yerel dizinin dışında (size kolaylık sağlamak için). İlk komut önceki yapıyı temizler; bu genellikle kesinlikle gerekli değildir, ancak iyi bir uygulamadır (ayrıca aşağıdaki yapı profillerine bakın); bu, dizinde bulunan önceden oluşturulmuş kitaplıkları ve nesne dosyalarını siler inşa etmek/. Proje yeniden yapılandırıldığında ve derleme sistemi çeşitli bağımlılıkları kontrol ettiğinde aşağıdakine benzer çıktı görmelisiniz:

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

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

Lütfen yukarıdaki listenin son kısmına dikkat edin. Bazı ns-3 seçenekleri varsayılan olarak etkin değildir veya düzgün çalışması için sistem desteği gerektirir. Örneğin XmlTo'yu etkinleştirmek için kütüphanenin sistemde mevcut olması gerekir libxml-2.0. Bu kitaplık bulunamazsa ve karşılık gelen ns-3 işlevi etkinleştirilmemişse bir mesaj görüntülenecektir. Ayrıca komutu kullanmanın mümkün olduğunu unutmayın. sudo belirli programlar için suid bitini "çalışma zamanında grup kimliğini ayarla" olarak ayarlamak için. Varsayılan olarak etkin değildir ve bu nedenle bu özellik "etkin değil" olarak görünür. Son olarak, etkin seçeneklerin bir listesini almak için şunu kullanın: WAF parametreli --check-config.

Şimdi geri dönüp örnekler ve testler içeren hata ayıklama yapısına geçelim.

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

Derleme sistemi artık ayarlanmıştır ve yalnızca şunu yazarak ns-3 programlarının hata ayıklama sürümlerini oluşturabilirsiniz:

$ ./waf

Yukarıdaki adımlar sizi ns-3 sisteminin bir bölümünü iki kez oluşturmaya zorlamış olabilir, ancak artık yapılandırmayı nasıl değiştireceğinizi ve optimize edilmiş kodu nasıl oluşturacağınızı biliyorsunuz.

Belirli bir proje konfigürasyonu için hangi profilin aktif olduğunu kontrol etmek için bir komut vardır:

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

Yukarıdaki senaryo build.py argümanları da destekliyor --enable-examples и --enable-tests, ancak diğer seçenekler WAF doğrudan desteklemez. Örneğin, bu işe yaramayacak:

$ ./build.py --disable-python

tepki şu şekilde olacaktır:

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

Ancak özel operatör - - ek parametrelerin iletilmesi için kullanılabilir. WAFbu nedenle yukarıdaki komut yerine aşağıdaki komut çalışacaktır:

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

çünkü ana komutu üretir ./waf yapılandırma --disable-python. İşte bu konuyla ilgili birkaç giriş ipucu daha: WAF.

Derleme hatalarını işleme

ns-3 sürümleri, yaygın Linux ve MacOS dağıtımlarında yayınlandığı sırada mevcut olan en son C++ derleyicileri üzerinde test edilmiştir. Ancak zamanla yeni derleyicilerle birlikte yeni dağıtımlar yayınlanır ve bu yeni derleyiciler uyarılar konusunda daha bilgili olma eğilimindedir. ns-3, yapısını tüm uyarıları hata olarak değerlendirecek şekilde yapılandırır; bu nedenle bazen daha yeni bir sistemde eski bir sürümü çalıştırıyorsanız, bir derleyici uyarısı derlemeyi durdurabilir.

Örneğin, daha önce Fedora 3.28 için yeni bir ana sürümü içeren ns‑28 sürümü yayınlanmıştı. gcc (gcc-8). Gtk3.28+ yüklüyken Fedora 28 altında ns-2 sürümünü veya önceki sürümleri oluştururken aşağıdaki hata ortaya çıkacaktır:

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

ns‑3.28.1'den başlayan sürümlerde, WAF bu sorunları çözmek için bir seçenek mevcuttur. G++ ve clang++'da "-Werror" bayrağının ayarlanmasını devre dışı bırakır. Bu "--disable-werror" seçeneğidir ve yapılandırma sırasında uygulanması gerekir:

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

Yapılandırın veya birleştirin

Bazı komutlar WAF yalnızca yapılandırma aşamasında anlamlıdır ve bazıları yalnızca oluşturma aşamasında geçerlidir. Örneğin ns-3 emülasyon özelliklerini kullanmak istiyorsanız bit ayarını etkinleştirebilirsiniz. suid kullanma sudo, yukarıda anlatıldığı gibi. Bu, yapılandırma adımı komutlarını geçersiz kılacaktır ve böylece örnekleri ve testleri de içeren aşağıdaki komutu kullanarak yapılandırmayı değiştirebilirsiniz.

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

Eğer bunu yaparsan WAF başlayacak sudoemülasyon kodu soketi oluşturma programlarını izinlerle çalışacak şekilde değiştirmek için kök. WAF Yapılandırma ve oluşturma adımları için başka birçok seçenek mevcuttur. Seçeneklerinizi keşfetmek için şunu girin:

$ ./waf --help

Bir sonraki bölümde testle ilgili bazı seçenekleri kullanacağız.

Montaj Profilleri

Nasıl yapılandırabileceğinizi zaten gördük WAF montajlar için ayıklamak и optimize:

$ ./waf --build-profile=debug

Ayrıca ara montaj profili de bulunmaktadır. serbest. Seçenek -d ile eş anlamlıdır --build-profile. Derleme profili, günlük kaydının, iddiaların ve derleyici optimizasyon anahtarlarının kullanımını denetler:

ns-3 ağ simülatörü eğitimi. Bölüm 3

Gördüğünüz gibi, günlüğe kaydetme ve iddialar yalnızca hata ayıklama yapılarında mevcuttur. Önerilen uygulama, komut dosyanızı hata ayıklama modunda geliştirmek, ardından optimize edilmiş bir derleme profilinde tekrarlanan çalıştırmalar (istatistikler veya parametre değişiklikleri için) gerçekleştirmektir.

Yalnızca belirli derleme profillerinde çalışması gereken kodunuz varsa Kod Sarmalayıcı Makrosunu kullanın:

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

Varsayılan olarak WAF Yapı yapıtlarını yapı dizinine yerleştirir. Seçeneği kullanarak farklı bir çıktı dizini belirtebilirsiniz - -outÖrneğin:

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

Bunu derleme profilleriyle birleştirerek farklı derleme seçenekleri arasında kolayca geçiş yapabilirsiniz:

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

Bu, her seferinde en son montajı yeniden yazmak zorunda kalmadan birden fazla montajla çalışmanıza olanak tanır. Başka bir profile geçtiğinizde, WAF her şeyi tamamen yeniden derlemeden yalnızca onu derleyecektir.

Yapı profillerini bu şekilde değiştirdiğinizde, her seferinde aynı yapılandırma seçeneklerini vermeye dikkat etmeniz gerekir. Birkaç ortam değişkeni tanımlamak hatalardan kaçınmanıza yardımcı olacaktır:

$ export NS3CONFIG="--enable-examples --enable-tests" 
$ export NS3DEBUG="--build-profile=debug --out=build/debug"
$ export NS3OPT=="--build-profile=optimized --out=build/optimized" 

$ ./waf configure $NS3CONFIG $NS3DEBUG
$ ./waf build 
... 
$ ./waf configure $NS3CONFIG $NS3OPT
$ ./waf build

Derleyiciler ve bayraklar

Yukarıdaki örneklerde WAF ns-3'ü oluşturmak için GCC'nin C++ derleyicisini kullanır ( g ++). Ancak kullandığınızı değiştirebilirsiniz WAF CXX ortam değişkenini tanımlayarak C++ derleyicisi. Örneğin, C++ derleyicisini kullanmak için Clang, clang++,

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

Aynı şekilde yapılandırabilirsiniz WAF kullanarak dağıtılmış derlemeyi kullanmak için bölge:

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

Distcc ve dağıtılmış derleme hakkında daha fazla bilgiyi proje sayfasında Belgeler bölümünde bulabilirsiniz. Ns-3'ü yapılandırırken derleyici bayrakları eklemek için CXXFLAGS_EXTRA ortam değişkenini kullanın.

Montaj

WAF Sistem üzerinde farklı yerlere kütüphanelerin kurulması için kullanılabilir. Varsayılan olarak derlenmiş kitaplıklar ve yürütülebilir dosyalar dizinde bulunur inşa etmekWaf bu kitaplıkların ve yürütülebilir dosyaların konumunu bildiğinden, kitaplıkları başka bir yere yüklemenize gerek yoktur.

Kullanıcılar derleme dizini dışında kurulum yapmayı tercih ederse komutu çalıştırabilirler. ./waf yükleme. Kurulum için varsayılan önek: / Yerel / usrBu yüzden ./waf yükleme programları yükleyeceğiz / Usr / local / bin, kütüphaneler / Usr / local / lib ve başlık dosyaları /usr/yerel/dahil. Süper kullanıcı haklarının genellikle varsayılan bir önekle ayarlanması gerekir, bu nedenle tipik bir komut şöyle olacaktır: sudo ./waf kurulumu. Waf başlatıldığında ilk olarak derleme dizinindeki paylaşılan kitaplıkları kullanmayı seçecek, ardından yerel ortamda yapılandırılmış kitaplıklara giden yol boyunca kitaplıkları arayacaktır. Dolayısıyla kütüphaneleri bir sisteme kurarken doğru kütüphanelerin kullanıldığını kontrol etmek iyi bir uygulamadır. Kullanıcılar konfigürasyon sırasında seçeneği ileterek farklı bir önekle kurulum yapmayı seçebilirler. --prefixÖrneğin:

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

Daha sonra derlemeden sonra kullanıcı kurulum komutunu girerse ./waf, önek kullanılacak /opt/yerel.

Ekip ./waf clean kurulum kullanacaksa projeyi yeniden yapılandırmadan önce kullanılmalıdır WAF farklı bir önek altında.

Böylece ns-3'ü kullanmak için aramanıza gerek kalmaz ./waf install. Çoğu kullanıcının bu komuta ihtiyacı olmayacak çünkü WAF geçerli kitaplıkları derleme dizininden alacaktır, ancak bazı kullanıcılar, etkinlikleri ns-3 dizini dışındaki programlarla çalışmayı içeriyorsa bunu yararlı bulabilir.

Waf tek

Ns-3 kaynak ağacının en üst seviyesinde yalnızca bir Waf betiği bulunur. Çalışmaya başladığınızda dizinde çok fazla zaman geçireceksiniz scratch/ ya da daha derinesrc/... ve aynı zamanda koşmak zorundayım WAF. Nerede olduğunu hatırlayıp koşabilirsin WAF следующим обрахом:

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

ancak bu sıkıcı ve hataya açık olacak, dolayısıyla daha iyi çözümler var. Yaygın bir yol, aşağıdaki gibi bir metin düzenleyici kullanmaktır: emacs veya gayretİki terminal oturumunun açıldığı, biri ns-3'ü oluşturmak için, ikincisi ise kaynak kodunu düzenlemek için kullanılır. Eğer sadece sahipsen katran topu, o zaman bir ortam değişkeni yardımcı olabilir:

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

$ cd scratch 
$ waff build

Modül dizinine aşağıdaki gibi önemsiz bir waf betiği eklemek cazip gelebilir exec ../../waf. Lütfen, bunu yapma. Bu, yeni başlayanlar için kafa karıştırıcıdır ve kötü uygulandığında, tespit edilmesi zor derleme hatalarına yol açar. Yukarıda gösterilen çözümler kullanılması gereken yoldur.

3.5 ns-3'ün test edilmesi

Komut dosyasını çalıştırarak ns-3 dağıtımının birim testlerini çalıştırabilirsiniz. ./test.py:

$ ./test.py

Bu testler paralel olarak gerçekleştirilir. WAF. Sonunda şunu söyleyen bir mesaj görmelisiniz:

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

Bu, valgrind çökmelerini, çökmelerini veya hatalarını tanımlamak, kodla ilgili sorunları veya araçlarla kod arasındaki uyumsuzluğu belirtmek için önemli bir mesajdır.

Ayrıca son çıktıyı da göreceksiniz. WAF ve her testi çalıştıran bir test cihazı, şuna benzer:

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

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

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

...

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

Bu komut genellikle kullanıcılar tarafından ns-3 dağıtımının doğru şekilde oluşturulduğunu hızlı bir şekilde doğrulamak için çalıştırılır. ("PASS: ..." satırlarının sırasının farklı olabileceğini unutmayın, bu normaldir. Önemli olan, raporun sonundaki özet satırının tüm testlerin geçtiğini, başarısız veya çöken testlerin olmadığını göstermesidir.) Ve WAFve test.py makinenin mevcut işlemci çekirdekleri arasında çalışmayı paralelleştirecektir.

3.6 Komut dosyasını çalıştırma

Genellikle komut dosyalarını kontrol altında çalıştırırız WAF. Bu, derleme sisteminin, paylaşılan kitaplık yollarının doğru şekilde ayarlandığından ve kitaplıkların çalışma zamanında kullanılabilir olduğundan emin olmasını sağlar. Programı çalıştırmak için basitçe şunu kullanın: WAF parametreli - -run. Her yerde bulunan programın ns-3 eşdeğerini çalıştıralım merhaba dünyaaşağıdakileri yazarak:

$ ./waf --run hello-simulator

Waf öncelikle programın doğru şekilde oluşturulduğunu kontrol edecek ve gerekiyorsa oluşturacaktır. Daha sonra WAF aşağıdaki çıktıyı üreten programı çalıştıracaktır.

Hello Simulator

Tebrikler! Artık bir ns-3 kullanıcısısınız!

Sonuçları göremezsem ne yapmalıyım?

Mesajları görürseniz WAFderlemenin başarıyla tamamlandığını gösteriyor ancak çıktıyı göremiyorsunuz "Merhaba Simülatör", o zaman [Waf ile Oluştur] bölümünde derleme modunuzu şu şekilde değiştirmiş olma ihtimaliniz vardır: optimize, ancak moda geri dönmeyi kaçırdım ayıklamak. Bu öğreticide kullanılan tüm konsol çıktıları, günlüğe kaydetme işlemini gerçekleştiren ve özel mesajları konsola yazdırmak için kullanılan özel bir ns-3 bileşeni kullanır. Optimize edilmiş kod derlendiğinde bu bileşenin çıktısı otomatik olarak devre dışı bırakılır - "optimize edilir". "Merhaba Simülatör" çıktısını görmüyorsanız aşağıdakini girin:

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

özelleştirmek WAF ns-3 programlarının örnekler ve testler içeren hata ayıklama sürümlerini oluşturmak. Daha sonra şunu yazarak kodun geçerli hata ayıklama sürümünü yeniden oluşturmalısınız:

$ ./waf

Şimdi programı çalıştırırsanız merhaba simülatörü, beklenen sonucu görmelisiniz.

3.6.1 Komut satırı argümanları

Komut satırı argümanlarını ns-3 programına iletmek için aşağıdaki modeli kullanın:

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

Yer değiştirmek programınızın adına ve argümanlara. Argüman - -command-template için WAF aslında gerçek komut satırını oluşturmak için bir reçetedir WAF programı yürütmek için kullanılır. Waf, derlemenin tamamlandığını kontrol eder, paylaşılan kitaplık yollarını ayarlar, ardından sağlanan komut satırı şablonunu kullanır ve yürütülebilir dosyayı çağırmak için %s yer tutucusunun yerine program adını koyar. Bu sözdizimini karmaşık buluyorsanız, ns-3 programını ve onun tek tırnak içine alınmış argümanlarını içeren daha basit bir sürümü vardır:

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

Özellikle yararlı olan bir diğer örnek ise test paketlerinin seçici olarak çalıştırılmasıdır. Diyelim ki mytest adında bir test paketi var (aslında yok). Yukarıda, test programını tekrar tekrar çağıran bir dizi testi paralel olarak çalıştırmak için ./test.py betiğini kullandık. test koşucusu. Arama test koşucusu doğrudan bir testi çalıştırmak için:

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

Argümanlar programa aktarılacak test koşucusu. Mytest mevcut olmadığından bir hata mesajı oluşturulacaktır. Mevcut test çalıştırıcısı seçeneklerini yazdırmak için şunu girin:

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

3.6.2 Hata Ayıklama

Ns-3 programlarını hata ayıklayıcı gibi başka bir yardımcı program altında çalıştırmak için (örneğin, gdb) veya bir bellek test aracı (örneğin, Valgrind), benzer bir form kullanın - -command-template = "…". Örneğin, hata ayıklayıcıda çalıştırmak için gdb argümanlarla hello-simulator ns-3 programınız:

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

Ns-3 program adının argümanla birlikte geldiğini unutmayın. - -runve yönetim yardımcı programı (burada gdb) argümandaki ilk belirteçtir - -command-template. Seçenek - -args raporlar gdbkomut satırının geri kalanının "alt" programa ait olduğu. (Bazı versiyonlar gdb seçeneği anlamıyorum - -args. Bu durumda program argümanlarını kaldırın. - -command-template ve komut setini kullanın gdb args.) Testi hata ayıklayıcı altında çalıştırmak için bu tarifi ve önceki tarifi birleştirebiliriz:

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

3.6.3 Çalışma dizini

Waf, ns-3 ağacının tepesindeki konumundan başlatılmalıdır. Bu klasör, çıktı dosyalarının yazılacağı çalışma dizini haline gelir. Peki ya bu dosyaları ns-3 kaynak ağacının dışında tutmak istiyorsanız? Argüman kullan - -cwd:

$ ./waf --cwd=...

Çıktı dosyalarını çalışma dizininize almayı daha uygun bulabilirsiniz. Bu durumda aşağıdaki dolaylı eylem yardımcı olabilir:

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

Komutun önceki sürümünün bu dekorasyonu mevcut çalışma dizinini korur, dizine gider WAFve sonra talimat verir WAF çalışma dizinini, programı başlatmadan önce kaydedilen geçerli çalışma dizinine geri döndürmek için. Takımdan bahsediyoruz - -cwd Tamlık sağlamak için, çoğu kullanıcı Waf'ı en üst düzey dizinden çalıştırır ve çıktı dosyalarını orada oluşturur.

Devamı: Bölüm 4

Kaynak: habr.com

Yorum ekle