Tutorial simulator rangkaian ns-3. Bab 3

Tutorial simulator rangkaian ns-3. Bab 3
bab 1,2

3 Bermula
3.1 Gambaran Keseluruhan
3.2 Prasyarat
3.2.1 Memuat turun keluaran ns-3 sebagai arkib sumber
3.3 Memuat turun ns-3 menggunakan Git
3.3.1 Memuatkan ns-3 menggunakan Bakar
3.4 Perhimpunan ns-3
3.4.1 Membina dengan build.py
3.4.2 Membina dengan Bakar
3.4.3 Bina dengan Waf
3.5 Pengujian ns-3
3.6 Menjalankan skrip
3.6.1 Hujah baris arahan
3.6.2 Penyahpepijatan
3.6.3 Direktori kerja

Bab 3

Bermula

Bab ini bertujuan untuk menyediakan pembaca untuk memulakan dengan komputer yang mungkin tidak pernah memasang ns-3. Ia meliputi platform yang disokong, prasyarat, cara mendapatkan ns-3, cara membina ns-3, dan cara menguji binaan dan menjalankan program mudah anda.

3.1 Gambaran Keseluruhan

Simulator ns-3 dibina sebagai sistem perpustakaan perisian kolaboratif. Semasa pemasangan, kod program pengguna dipautkan dengan perpustakaan ini. Bahasa pengaturcaraan C++ atau Python digunakan untuk menulis atur cara tersuai.

Ns-3 diedarkan sebagai kod sumber, yang bermaksud bahawa sistem sasaran mesti mempunyai persekitaran pembangunan perisian untuk mula-mula membina perpustakaan dan kemudian membina program pengguna. Pada dasarnya, ns-3 boleh diedarkan sebagai perpustakaan siap sedia untuk sistem tertentu, dan pada masa hadapan ia boleh diedarkan dengan cara ini. Tetapi pada masa kini ramai pengguna sebenarnya melakukan kerja mereka dengan mengedit ns-3 itu sendiri, jadi adalah berguna untuk mempunyai kod sumber untuk membina perpustakaan. Jika sesiapa ingin mengambil kerja mencipta perpustakaan dan pakej siap sedia untuk sistem pengendalian, sila hubungi senarai mel ns-pemaju.

Seterusnya, kita akan melihat tiga cara untuk memuat turun dan membina ns-3. Yang pertama ialah memuat turun dan membina keluaran rasmi dari tapak utama. Yang kedua ialah pemilihan dan pemasangan salinan versi pembangunan pemasangan asas ns-3. Yang ketiga ialah menggunakan alat binaan tambahan untuk memuatkan lebih banyak sambungan untuk ns-3. Kami akan meneliti setiap satu kerana alatannya berbeza sedikit.

Pengguna Linux yang berpengalaman mungkin tertanya-tanya mengapa ns-3 tidak disediakan sebagai pakej seperti kebanyakan perpustakaan lain yang menggunakan pengurus pakej? Walaupun terdapat pakej binari untuk pelbagai pengedaran Linux (cth Debian), kebanyakan pengguna akhirnya mengedit perpustakaan dan terpaksa membina semula ns-3 sendiri, jadi mempunyai kod sumber yang tersedia adalah berguna. Atas sebab ini, kami akan menumpukan pada pemasangan daripada sumber.

Untuk kebanyakan aplikasi hak ns-3 akar tidak diperlukan, adalah disyorkan untuk menggunakan akaun pengguna yang tidak mempunyai hak istimewa.

3.2 Prasyarat

Seluruh set perpustakaan ns-3 yang tersedia mempunyai beberapa kebergantungan pada perpustakaan pihak ketiga, tetapi untuk sebahagian besar ns-3 boleh dibina dan digunakan dengan sokongan untuk beberapa komponen biasa (sering dipasang secara lalai): pengkompil C++, Python, editor kod sumber (contohnya, VIM, emacs atau Gerhana) dan, jika repositori pembangunan digunakan, sistem kawalan versi Git. Kebanyakan pengguna kali pertama tidak perlu risau jika konfigurasi mereka melaporkan beberapa ciri lanjutan ns-3 hilang, tetapi bagi mereka yang mahukan pemasangan penuh, projek ini menyediakan wiki yang merangkumi halaman dengan banyak petua dan helah berguna. Satu halaman sedemikian ialah halaman Pemasangan, dengan arahan pemasangan untuk pelbagai sistem, tersedia di: https://www.nsnam.org/wiki/Installation.

Bahagian Prasyarat wiki ini menerangkan pakej yang diperlukan untuk menyokong pilihan ns-3 biasa dan juga menyediakan arahan yang digunakan untuk memasangnya pada perisa biasa Linux atau macOS.

Anda boleh memanfaatkan peluang ini untuk meneroka halaman wiki ns-3 atau laman web utama: https://www.nsnam.org, kerana terdapat banyak maklumat di sana. Bermula dengan versi terkini ns-3 (ns-3.29), alatan berikut diperlukan untuk menjalankan ns-3:

Pakej Alat/Versi

  • Pengkompil C++
    clang++ atau g++ (g++ versi 4.9 atau lebih tinggi)
  • Python
    versi python2 >= 2.7.10, atau versi python3 >=3.4
  • Git
    mana-mana versi terkini (untuk mengakses ns-3 di GitLab.com)
  • tar
    mana-mana versi terkini (untuk membongkar keluaran ns‑3)
  • bunzip2
    mana-mana versi terkini (untuk membongkar keluaran ns‑3)

Untuk menyemak versi lalai Python, taip python -V. Untuk menyemak versi g++, taip g++ -v. Jika ada alat yang hilang atau terlalu lama, sila rujuk panduan pemasangan pada halaman wiki ns-3.

Mulai sekarang, kami menganggap bahawa pembaca menjalankan Linux, MacOS atau emulator Linux, dan mempunyai sekurang-kurangnya alatan di atas.

3.2.1 Memuat turun keluaran ns-3 sebagai arkib sumber

Ini ialah tindakan untuk pengguna baharu yang ingin memuat turun dan mencuba versi keluaran dan pakej terkini ns-3. Keluaran ns-3 diterbitkan sebagai arkib sumber termampat, kadangkala dipanggil bola tar. bola tar ialah format arkib perisian khas di mana beberapa fail digabungkan bersama. Arkib biasanya dimampatkan. proses but ns-3 melalui bola tar adalah mudah, anda hanya perlu memilih keluaran, memuat turun dan membongkarnya.

Mari kita anggap bahawa anda, sebagai pengguna, ingin membina ns-3 dalam direktori tempatan yang dipanggil ruang kerja. Anda boleh mendapatkan salinan keluaran yang berfungsi dengan memasukkan yang berikut ke dalam konsol Linux (menggantikan nombor versi yang sesuai, sudah tentu)

$ 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 

Beri perhatian kepada utiliti yang digunakan di atas wget, yang merupakan alat baris arahan untuk memuat turun objek daripada Internet. Jika anda belum memasangnya, anda boleh menggunakan penyemak imbas anda untuk ini.

Mengikuti langkah ini akan membawa anda ke direktori ns-allinone-3.29, di sana anda akan melihat beberapa fail dan direktori

$ 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

Anda kini bersedia untuk membina pengedaran asas ns-3 dan boleh beralih ke bahagian bangunan ns-3.

3.3 Memuat turun ns-3 menggunakan Git

Kod ns-3 tersedia dalam repositori Git di GitLab.com di https://gitlab.com/nsnam/. Kumpulan nsnam menghimpunkan pelbagai repositori yang digunakan oleh projek sumber terbuka.

Cara paling mudah untuk mula menggunakan repositori Git ialah dengan membuat garpu atau mengklon persekitaran ns-3-allinon. Ini ialah satu set skrip yang menguruskan pemuatan dan pemasangan subsistem ns-3 yang paling biasa digunakan. Jika anda baru menggunakan Git, istilah "garpu" dan "klon" mungkin asing bagi anda; jika ya, kami mengesyorkan anda hanya mengklon (membuat salinan anda sendiri) repositori yang terletak di GitLab.com seperti ini:

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

Pada peringkat ini, paparan direktori anda ns-3-allinon sedikit berbeza daripada direktori arkib keluaran yang diterangkan di atas. Ia sepatutnya kelihatan seperti ini:

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

Sila ambil perhatian bahawa terdapat skrip muat turun.py, yang juga akan mengekstrak ns-3 dan kod sumber yang disertakan. Di sini anda mempunyai pilihan: sama ada memuat turun gambar pembangunan ns-3 terkini:

$ python download.py

atau lebih suka keluaran ns-3 menggunakan bendera -n untuk menunjukkan nombor keluaran:

$ python download.py -n ns-3.29

Selepas langkah ini ke direktori ns-3-allinon repositori tambahan akan dimuat turun ns-3, bakar, pybindgen ΠΈ netanim.

Nota
Pada mesin dengan Ubuntu16.04 yang bersih, saya perlu menukar arahan kepada ini: $ sudo python3 download.py -n ns-3.29 (selepas ini nota penterjemah).

3.3.1 Memuatkan ns-3 menggunakan Bakar

Dua kaedah di atas (arkib sumber atau repositori ns-3-allinon melalui Git) berguna untuk mendapatkan pemasangan ns-3 yang paling mudah dengan berbilang tambahan (pybindgen untuk menjana pengikatan Python dan netanim untuk animasi rangkaian). Repositori ketiga yang disediakan secara lalai dalam ns-3-allinone dipanggil bakar.

Bakar ialah alat untuk membina perisian yang diselaraskan daripada pelbagai repositori, dibangunkan untuk projek ns-3. Bakar boleh digunakan untuk mendapatkan versi pembangunan ns-3, serta memuat turun dan membina sambungan versi asas pengedaran ns-3, seperti persekitaran Pelaksanaan Kod Langsung, Buaian Simulasi CradleNetwork, keupayaan untuk mencipta pengikatan Python baharu dan pelbagai "aplikasi" ns-3.

Nota
CradleNetwork Simulation Cradle ialah rangka kerja yang membolehkan anda menggunakan susunan rangkaian TCP/IP sebenar di dalam simulator rangkaian.

Jika anda menjangkakan pemasangan ns-3 anda mempunyai ciri lanjutan atau tambahan, anda boleh mengikuti laluan pemasangan ini.

Dalam keluaran ns-3 terkini Bakar telah ditambahkan pada pelepasan tar. Keluaran termasuk fail konfigurasi yang membolehkan anda memuat turun versi perisian semasa pada masa keluaran. Iaitu, sebagai contoh, versi Bakar, yang diedarkan dengan keluaran ns-3.29, boleh digunakan untuk mendapatkan semula komponen untuk keluaran ns-3 atau lebih awal, tetapi tidak boleh digunakan untuk mendapatkan semula komponen untuk keluaran kemudian (jika fail perihalan pakej bakeconf.xml tidak dikemas kini).

Anda juga boleh mendapatkan salinan terkini bakardengan memasukkan arahan berikut ke dalam konsol Linux anda (dengan andaian anda telah memasang Git):

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

Apabila anda menjalankan arahan git, anda akan melihat sesuatu seperti berikut:

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.

Selepas arahan selesai mengklon anda sepatutnya mempunyai direktori bernama bakar, yang kandungannya sepatutnya kelihatan seperti ini:

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

Ambil perhatian bahawa anda telah memuatkan beberapa skrip Python, sebuah modul Python bernama bakar dan fail konfigurasi XML. Langkah seterusnya ialah menggunakan skrip ini untuk memuat turun dan membina pengedaran ns-3 pilihan anda. Beberapa sasaran penyesuaian tersedia:

  1. ns-3.29: modul yang sepadan dengan keluaran; ia akan memuat turun komponen yang serupa dengan keluaran dalam tarball;

  2. ns-3-dev: modul yang serupa, tetapi menggunakan kod daripada pokok pembangunan;

  3. ns-allinone-3.29: Modul yang merangkumi ciri tambahan lain seperti penghalaan Klik dan Rangkaian Simulasi Cradle, Aliran Terbuka untuk ns-3.

  4. ns-3-allinon: serupa dengan versi keluaran modul allinone, tetapi untuk kod pembangunan.

Nota
Klik β€” seni bina perisian modular untuk mencipta penghala.

Openflow ialah protokol untuk menguruskan proses pemprosesan data yang dihantar melalui rangkaian data oleh penghala dan suis, melaksanakan teknologi rangkaian yang ditentukan perisian.

Gambar pembangunan semasa (bukan keluaran) ns-3 boleh didapati di:https://gitlab.com/nsnam/ns-3-dev.git.

Pembangun cuba mengekalkan repositori ini dalam susunan kerja yang konsisten, tetapi ia berada dalam kawasan pembangunan dan mengandungi kod yang belum dikeluarkan, jadi jika anda tidak bercadang untuk menggunakan ciri baharu, kemudian pilih keluaran rasmi.

Anda boleh mencari versi terbaharu kod dengan menyemak imbas senarai repositori, atau dengan pergi ke halaman web ns-3 Releases:https://www.nsnam.org/releases/ dan mengklik pada pautan versi terkini. Dalam contoh ini kita akan meneruskan dengan ns-3.29.

Sekarang, untuk mendapatkan komponen ns-3 yang kami perlukan, kami akan menggunakan alat tersebut Bakar. Mari sebutkan beberapa kata pengantar tentang kerja itu Bakar.

Bakar berfungsi dengan memuatkan sumber pakej ke dalam direktori sumber dan memasang perpustakaan ke dalam direktori binaan. Bakar boleh dijalankan dengan merujuk binari, tetapi jika anda ingin menjalankan Bakar bukan dari direktori di mana ia dimuat turun, adalah dinasihatkan untuk menambah laluan ke bakar ke laluan anda (pembolehubah persekitaran PATH), contohnya seperti berikut (contoh untuk Linux bash shell). Pergi ke direktori "bake" dan kemudian tetapkan pembolehubah persekitaran berikut:

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

Ini akan meletakkan program bake.py ke laluan shell dan akan membenarkan atur cara lain mencari boleh laku dan perpustakaan yang diciptanya bakar. Dalam beberapa kes penggunaan bakar, tetapan PATH dan PYTHONPATH yang diterangkan di atas tidak diperlukan, tetapi binaan lengkap ns-3-allinone (dengan pakej tambahan) biasanya memerlukannya.

Pergi ke direktori kerja anda dan masukkan yang berikut dalam konsol:

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

Seterusnya kami akan bertanya Bakar semak sama ada kita mempunyai alatan yang mencukupi untuk memuatkan pelbagai komponen. Dail:

$ ./bake.py check

Anda sepatutnya melihat sesuatu seperti berikut:

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

Khususnya, alat muat naik seperti Mercurial, CVS, Git dan Bazaar adalah penting dalam langkah ini kerana ia membolehkan kami mendapatkan kod tersebut. Pada ketika ini, pasang alat yang hilang dengan cara biasa untuk sistem anda (jika anda tahu caranya) atau hubungi pentadbir sistem anda untuk mendapatkan bantuan.

Seterusnya, cuba muat turun perisian:

$ ./bake.py download

hasilnya sepatutnya seperti:

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

Ini bermakna tiga sumber telah dimuat turun. Sekarang pergi ke direktori sumber dan taip ls; Awak patut lihat:

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

Kini anda sudah bersedia untuk membina pengedaran ns-3.

3.4 Perhimpunan ns-3

Seperti memuat turun ns-3, terdapat beberapa cara untuk membina ns-3. Perkara utama yang ingin kami tekankan ialah ns-3 dibina menggunakan alat bina yang dipanggil Wafterangkan di bawah. Kebanyakan pengguna akan bekerja dengannya Waf, tetapi terdapat beberapa skrip berguna untuk membantu anda memulakan atau mengatur binaan yang lebih kompleks. Jadi sila, sebelum anda membaca tentang Waf, lihatlah build.py dan perhimpunan dengan bakar.

3.4.1 Membina dengan build.py

Amaran! Langkah binaan ini hanya tersedia daripada versi arkib sumber yang diperoleh seperti yang diterangkan di atas; dan tidak dimuat turun melalui git atau bakar.

Apabila bekerja dengan arkib keluaran bola tarDalam ns-3-allinon Terdapat skrip berguna yang boleh memudahkan pemasangan komponen. Ia dipanggil build.py. Program ini akan menyediakan projek untuk anda dengan cara yang paling berguna. Walau bagaimanapun, ambil perhatian bahawa persediaan yang lebih maju dan berfungsi dengan ns-3 biasanya melibatkan penggunaan sistem binaan ns-3 sendiri, Waf, yang akan diperkenalkan kemudian dalam tutorial ini.

Jika anda memuat turun menggunakan bola tar, kemudian dalam direktori anda ~/ruang kerja direktori dengan nama seperti ns-allinone-3.29. Sila isikan:

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

Apabila memanggil build.py Kami menggunakan argumen baris arahan untuk membina contoh dan ujian yang digunakan dalam tutorial ini, yang tidak dibina secara lalai dalam ns-3. Secara lalai, program ini juga membina semua modul yang tersedia. Kemudian, jika anda mahu, anda boleh membina ns-3 tanpa contoh dan ujian, atau mengecualikan modul yang tidak diperlukan untuk kerja anda.

Anda akan melihat banyak mesej output pengkompil dipaparkan oleh skrip kerana ia membina pelbagai bahagian yang telah anda muatkan. Mula-mula skrip akan cuba membina animator netanim, kemudian penjana pengikat pybindgen dan akhirnya ns-3. Apabila proses selesai, anda akan melihat perkara berikut:

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

Dalam tiga baris terakhir penyenaraian kami melihat mesej tentang modul yang tidak dibina:

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

Ini bermakna beberapa modul ns-3 yang bergantung pada perpustakaan luaran mungkin belum dibina atau ia tidak perlu dibina untuk konfigurasi ini. Ini tidak bermakna bahawa simulator tidak dipasang atau modul yang dipasang tidak akan berfungsi dengan betul.

3.4.2 Membina dengan Bakar

Jika anda menggunakan bakar di atas untuk mendapatkan kod sumber daripada repositori projek, anda boleh terus menggunakannya untuk membina ns-3. Dail:

$ ./bake.py build

dan anda sepatutnya melihat sesuatu seperti:

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

Petua alat: Anda juga boleh melakukan kedua-dua langkah muat turun dan bina sekaligus dengan memanggil "bake.py deploy".

Memasang semua komponen mungkin gagal, tetapi pemasangan akan diteruskan jika komponen tidak diperlukan. Sebagai contoh, isu mudah alih baru-baru ini ialah castxml boleh dipasang dengan alat bakar bukan pada semua platform. Dalam kes ini, mesej seperti ini akan muncul:

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

Tetapi castxml hanya diperlukan jika anda ingin membuat pengikatan Python yang dikemas kini. Bagi kebanyakan pengguna tidak ada keperluan untuk ini (sekurang-kurangnya sehingga mereka menukar ns-3), jadi amaran sedemikian boleh diabaikan dengan selamat buat masa ini.

Jika gagal, arahan berikut akan memberi anda petunjuk tentang kebergantungan yang hilang:

$ ./bake.py show

Pelbagai kebergantungan pakej yang anda cuba bina akan disenaraikan.

3.4.3 Bina dengan Waf

Sehingga tahap ini, untuk mula membina ns-3, kami menggunakan sama ada skrip build.py, atau alat bakar. Alat ini berguna untuk membina ns-3 dan menyelenggara perpustakaan. Malah, untuk membina mereka menjalankan alat binaan Waf daripada direktori ns-3. Waf dipasang dengan kod sumber ns-3. Kebanyakan pengguna dengan cepat beralih ke penggunaan terus untuk mengkonfigurasi dan memasang ns‑3 Waf. Jadi, untuk meneruskan, sila pergi ke direktori ns-3 yang anda buat pada asalnya.

Ini tidak diperlukan sepenuhnya pada masa ini, tetapi ia berguna untuk mengundur sedikit dan melihat cara membuat perubahan pada konfigurasi projek. Mungkin perubahan konfigurasi paling berguna yang boleh anda lakukan ialah mencipta versi kod yang dioptimumkan. Secara lalai, anda telah mengkonfigurasi projek anda untuk membina versi nyahpepijat. Mari kita lihat projek untuk mencipta binaan yang dioptimumkan. Untuk menerangkan kepada Waf bahawa ia harus membuat binaan yang dioptimumkan yang merangkumi contoh dan ujian, anda perlu menjalankan arahan berikut:

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

Ini akan dilancarkan Waf di luar direktori tempatan (untuk kemudahan anda). Perintah pertama membersihkan daripada binaan sebelumnya, ini biasanya tidak begitu diperlukan, tetapi ia adalah amalan yang baik (juga lihat profil binaan di bawah); ini akan memadamkan perpustakaan dan fail objek yang dibuat sebelum ini yang terletak dalam direktori membina /. Apabila projek dikonfigurasikan semula dan sistem binaan menyemak pelbagai kebergantungan, anda akan melihat output yang serupa dengan yang berikut:

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)

Sila ambil perhatian bahagian terakhir penyenaraian di atas. Sesetengah pilihan ns-3 tidak didayakan secara lalai atau memerlukan sokongan sistem untuk berfungsi dengan betul. Contohnya, untuk mendayakan XmlTo, perpustakaan mesti ada pada sistem libxml-2.0. Jika perpustakaan ini tidak ditemui dan fungsi ns-3 yang sepadan tidak didayakan, mesej akan dipaparkan. Juga ambil perhatian bahawa adalah mungkin untuk menggunakan arahan sudo untuk menetapkan bit suid "menetapkan ID kumpulan pada masa jalan" untuk program tertentu. Ia tidak didayakan secara lalai dan oleh itu ciri ini muncul sebagai "tidak didayakan". Akhir sekali, untuk mendapatkan senarai pilihan yang didayakan, gunakan Waf dengan parameter --check-config.

Sekarang mari kita kembali dan beralih kembali kepada binaan nyahpepijat yang mengandungi contoh dan ujian.

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

Sistem binaan kini disediakan dan anda boleh membina versi nyahpepijat program ns-3 dengan hanya menaip:

$ ./waf

Langkah di atas mungkin telah memaksa anda membina sebahagian daripada sistem ns-3 dua kali, tetapi kini anda tahu cara menukar konfigurasi dan membina kod yang dioptimumkan.

Untuk menyemak profil mana yang aktif untuk konfigurasi projek tertentu, terdapat arahan:

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

Senario di atas build.py juga menyokong hujah --enable-examples ΠΈ --enable-tests, tetapi pilihan lain Waf ia tidak menyokong secara langsung. Sebagai contoh, ini tidak akan berfungsi:

$ ./build.py --disable-python

reaksi akan menjadi seperti ini:

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

Walau bagaimanapun, pengendali khas - - boleh digunakan untuk menghantar parameter tambahan melalui WAFjadi bukannya di atas arahan berikut akan berfungsi:

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

kerana ia menjana arahan utama ./waf configure --disable-python. Berikut adalah beberapa lagi petua pengenalan tentang Waf.

Mengendalikan ralat binaan

Keluaran ns-3 diuji pada pengkompil C++ terkini yang tersedia pada masa keluaran pada pengedaran Linux dan MacOS biasa. Walau bagaimanapun, dari masa ke masa, pengedaran baharu dikeluarkan dengan pengkompil baharu, dan penyusun baharu ini cenderung lebih bertele-tele tentang amaran. ns-3 mengkonfigurasi binaannya untuk menganggap semua amaran sebagai ralat, jadi kadangkala jika anda menjalankan versi lama pada sistem yang lebih baharu, amaran pengkompil mungkin menghentikan binaan.

Sebagai contoh, sebelum ini terdapat keluaran ns‑3.28 untuk Fedora 28, yang termasuk versi utama baharu gcc (gcc-8). Membina keluaran ns-3.28 atau versi terdahulu di bawah Fedora 28, dengan Gtk2+ dipasang, ralat berikut akan berlaku:

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

Dalam keluaran bermula dari ns‑3.28.1, dalam Waf pilihan tersedia untuk menyelesaikan masalah ini. Ia melumpuhkan tetapan bendera "-Werror" dalam g++ dan clang++. Ini ialah pilihan "--disable-werror" dan mesti digunakan semasa konfigurasi:

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

Konfigurasikan atau pasang

Beberapa arahan Waf mempunyai makna hanya dalam fasa konfigurasi, dan sesetengahnya hanya sah dalam fasa binaan. Contohnya, jika anda ingin menggunakan ciri emulasi ns-3, anda boleh mendayakan tetapan bit selatan menggunakan sudo, seperti yang diterangkan di atas. Ini akan mengatasi arahan langkah konfigurasi, dan dengan itu anda boleh menukar konfigurasi menggunakan arahan berikut, yang juga termasuk contoh dan ujian.

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

Jika anda melakukan ini Waf akan dilancarkan sudountuk menukar program penciptaan soket kod emulasi untuk dijalankan dengan kebenaran akar. Π’ Waf Terdapat banyak pilihan lain yang tersedia untuk langkah konfigurasi dan binaan. Untuk meneroka pilihan anda, masukkan:

$ ./waf --help

Dalam bahagian seterusnya kami akan menggunakan beberapa pilihan berkaitan ujian.

Profil Perhimpunan

Kami telah melihat bagaimana anda boleh mengkonfigurasi Waf untuk perhimpunan debug ΠΈ dioptimumkan:

$ ./waf --build-profile=debug

Terdapat juga profil pemasangan perantaraan, melepaskan. Pilihan -d adalah sinonim dengan --build-profile. Profil binaan mengawal penggunaan pengelogan, penegasan dan suis pengoptimuman pengkompil:

Tutorial simulator rangkaian ns-3. Bab 3

Seperti yang anda lihat, pengelogan dan penegasan hanya tersedia dalam binaan nyahpepijat. Amalan yang disyorkan ialah membangunkan skrip anda dalam mod nyahpepijat, kemudian melakukan larian berulang (untuk statistik atau perubahan parameter) dalam profil binaan yang dioptimumkan.

Jika anda mempunyai kod yang sepatutnya hanya dijalankan dalam profil binaan tertentu, gunakan Makro Pembungkus Kod:

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;)

lalai, Waf tempat membina artifak dalam direktori binaan. Anda boleh menentukan direktori output yang berbeza menggunakan pilihan -β€―-out, sebagai contoh:

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

Dengan menggabungkan ini dengan profil binaan, anda boleh bertukar dengan mudah antara pilihan kompilasi yang berbeza:

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

Yang membolehkan anda bekerja dengan berbilang pemasangan tanpa perlu menulis semula pemasangan terkini setiap kali. Apabila anda bertukar ke profil lain, Waf hanya akan menyusunnya, tanpa menyusun semula semuanya sepenuhnya.

Apabila anda menukar profil binaan dengan cara ini, anda perlu berhati-hati untuk memberikan pilihan konfigurasi yang sama setiap kali. Menentukan beberapa pembolehubah persekitaran akan membantu anda mengelakkan kesilapan:

$ 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

Penyusun dan bendera

Dalam contoh di atas Waf untuk membina ns-3 menggunakan pengkompil C++ daripada GCC ( g ++). Walau bagaimanapun, anda boleh menukar yang anda gunakan Waf Pengkompil C++, dengan mentakrifkan pembolehubah persekitaran CXX. Contohnya, untuk menggunakan pengkompil C++ Clang, clang++,

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

Dengan cara yang sama anda boleh mengkonfigurasi Waf untuk menggunakan kompilasi teragih menggunakan distcc:

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

Maklumat lanjut tentang distcc dan kompilasi diedarkan boleh didapati pada halaman projek dalam bahagian Dokumentasi. Untuk menambah bendera pengkompil semasa mengkonfigurasi ns-3, gunakan pembolehubah persekitaran CXXFLAGS_EXTRA.

Pemasangan

Waf boleh digunakan untuk memasang perpustakaan di tempat yang berbeza pada sistem. Secara lalai, perpustakaan yang disusun dan boleh laku terletak dalam direktori membina, dan memandangkan Waf mengetahui lokasi perpustakaan dan boleh laku ini, tidak perlu memasang perpustakaan di tempat lain.

Jika pengguna lebih suka memasang di luar direktori binaan, mereka boleh menjalankan arahan ./waf memasang. Awalan lalai untuk pemasangan ialah / usr / setempatJadi ./waf memasang akan memasang program dalam / usr / local / bin, perpustakaan di / Local / lib / usr dan fail pengepala masuk / usr / tempatan / termasuk. Hak pengguna super biasanya perlu ditetapkan dengan awalan lalai, jadi perintah biasa adalah sudo ./waf install. Apabila dilancarkan, Waf akan memilih untuk menggunakan perpustakaan kongsi dalam direktori binaan, kemudian mencari perpustakaan di sepanjang laluan ke perpustakaan yang dikonfigurasikan dalam persekitaran setempat. Jadi apabila memasang perpustakaan pada sistem, adalah amalan yang baik untuk memeriksa sama ada perpustakaan yang betul sedang digunakan. Pengguna boleh memilih untuk memasang dengan awalan yang berbeza dengan memberikan pilihan semasa konfigurasi --prefix, sebagai contoh:

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

Jika kemudian, selepas binaan, pengguna memasukkan arahan pemasangan ./waf, awalan akan digunakan /opt/local.

Pasukan ./waf clean mesti digunakan sebelum mengkonfigurasi semula projek jika pemasangan akan digunakan Waf di bawah awalan yang berbeza.

Oleh itu, untuk menggunakan ns-3 tidak perlu memanggil ./waf install. Kebanyakan pengguna tidak memerlukan arahan ini kerana Waf akan mengambil pustaka semasa daripada direktori binaan, tetapi sesetengah pengguna mungkin mendapati ini berguna jika aktiviti mereka melibatkan kerja dengan program di luar direktori ns-3.

Waf bujang

Di peringkat atas pepohon sumber ns-3, hanya terdapat satu skrip Waf. Sebaik sahaja anda mula bekerja, anda akan menghabiskan banyak masa dalam direktori scratch/ atau lebih dalamsrc/... dan pada masa yang sama perlu berlari Waf. Anda hanya boleh ingat di mana anda berada dan berlari Waf seperti berikut:

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

tetapi ini akan membosankan dan terdedah kepada ralat, jadi terdapat penyelesaian yang lebih baik. Satu cara biasa ialah menggunakan editor teks seperti emacs atau VIM, di mana dua sesi terminal dibuka, satu digunakan untuk membina ns-3, dan yang kedua digunakan untuk mengedit kod sumber. Jika anda hanya mempunyai bola tar, maka pembolehubah persekitaran boleh membantu:

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

$ cd scratch 
$ waff build

Dalam direktori modul mungkin menarik untuk menambah skrip waf remeh seperti exec ../../waf. Tolong, jangan buat begitu. Ini mengelirukan bagi pemula dan, apabila dilakukan dengan buruk, membawa kepada ralat binaan yang sukar dikesan. Penyelesaian yang ditunjukkan di atas adalah laluan yang harus digunakan.

3.5 Pengujian ns-3

Anda boleh menjalankan ujian unit pengedaran ns-3 dengan menjalankan skrip ./test.py:

$ ./test.py

Ujian ini dijalankan selari dengan Waf. Akhirnya anda akan melihat mesej yang mengatakan:

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

Ini ialah mesej penting untuk mengenal pasti ranap, ranap atau ralat valgrind, menunjukkan masalah dengan kod atau ketidakserasian antara alatan dan kod.

Anda juga akan melihat output akhir daripada Waf dan penguji menjalankan setiap ujian, yang akan kelihatan seperti ini:

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)

Perintah ini biasanya dijalankan oleh pengguna untuk mengesahkan dengan cepat bahawa pengedaran ns-3 dibina dengan betul. (Perhatikan bahawa susunan baris "LULUS: ..." mungkin berbeza, ini adalah perkara biasa. Apa yang penting ialah garis ringkasan pada penghujung laporan menunjukkan bahawa semua ujian lulus; tiada ujian gagal atau ranap.) Dan Wafdan test.py akan menyelaraskan kerja merentasi teras pemproses yang tersedia bagi mesin.

3.6 Menjalankan skrip

Kami biasanya menjalankan skrip di bawah kawalan Waf. Ini membolehkan sistem binaan memastikan laluan pustaka dikongsi ditetapkan dengan betul dan pustaka tersedia pada masa jalan. Untuk menjalankan program, hanya gunakan Waf dengan parameter -β€―-run. Mari jalankan ns-3 yang setara dengan program di mana-mana hello duniadengan menaip yang berikut:

$ ./waf --run hello-simulator

Waf akan menyemak terlebih dahulu sama ada program itu dibina dengan betul dan membina jika perlu. Kemudian Waf akan melaksanakan program yang menghasilkan output berikut.

Hello Simulator

tahniah! Anda kini pengguna ns-3!

Apakah yang perlu saya lakukan jika saya tidak melihat hasil?

Jika anda melihat mesej Wafmenunjukkan bahawa binaan berjaya disiapkan, tetapi anda tidak melihat outputnya "Hello Simulator", maka terdapat kemungkinan bahawa dalam bahagian [Build-with-Waf] anda menukar mod binaan anda kepada dioptimumkan, tetapi terlepas menukar kembali kepada mod debug. Semua output konsol yang digunakan dalam tutorial ini menggunakan komponen ns-3 khas yang melakukan pengelogan dan digunakan untuk mencetak mesej tersuai ke konsol. Output daripada komponen ini dilumpuhkan secara automatik apabila kod yang dioptimumkan disusun - ia "dioptimumkan". Jika anda tidak melihat output "Hello Simulator", masukkan yang berikut:

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

untuk menyesuaikan Waf untuk membina versi nyahpepijat program ns-3, yang termasuk contoh dan ujian. Anda kemudiannya harus membina semula versi nyahpepijat semasa kod dengan menaip

$ ./waf

Sekarang jika anda menjalankan program hello-simulator, anda sepatutnya melihat hasil yang dijangkakan.

3.6.1 Hujah baris arahan

Untuk menghantar argumen baris arahan kepada program ns-3, gunakan corak berikut:

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

Gantikan kepada nama program anda dan kepada hujah. Hujah -β€―-command-template untuk Waf pada asasnya adalah resipi untuk membina baris arahan sebenar Waf digunakan untuk melaksanakan program. Waf menyemak sama ada binaan telah selesai, menetapkan laluan perpustakaan kongsi, kemudian menggunakan templat baris arahan yang disediakan dan menggantikan nama program untuk pemegang tempat %s untuk memanggil boleh laku. Jika anda mendapati sintaks ini rumit, terdapat versi yang lebih mudah yang melibatkan program ns-3 dan hujahnya disertakan dalam petikan tunggal:

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

Satu lagi contoh yang sangat berguna ialah menjalankan suite ujian secara selektif. Mari kita anggap ada suite ujian yang dipanggil mytest (sebenarnya tidak ada). Di atas kami menggunakan skrip ./test.py untuk menjalankan beberapa ujian secara selari, yang berulang kali memanggil program ujian pelari ujian. Panggil pelari ujian terus untuk menjalankan satu ujian:

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

Hujah akan diserahkan kepada program pelari ujian. Memandangkan mytest tidak wujud, mesej ralat akan dihasilkan. Untuk mencetak pilihan pelari ujian yang tersedia, masukkan:

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

3.6.2 Penyahpepijatan

Untuk menjalankan program ns-3 di bawah utiliti lain, seperti penyahpepijat (contohnya, gdb) atau alat ujian ingatan (contohnya, valgrind), gunakan bentuk yang serupa -β€―-command-template = "…". Sebagai contoh, untuk menjalankan dalam penyahpepijat gdb program hello-simulator ns-3 anda dengan hujah:

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

Ambil perhatian bahawa nama program ns-3 disertakan dengan hujah -β€―-run, dan utiliti pengurusan (di sini gdb) ialah token pertama dalam hujah -β€―-command-template. Pilihan -β€―-args laporan gdbbahawa selebihnya baris arahan tergolong dalam program "rendah". (Beberapa versi gdb tidak faham pilihan -β€―-args. Dalam kes ini, keluarkan hujah program daripada -β€―-command-template dan gunakan set arahan gdb args.) Kita boleh menggabungkan resipi ini dan yang sebelumnya untuk menjalankan ujian di bawah penyahpepijat:

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

3.6.3 Direktori kerja

Waf harus dilancarkan dari lokasinya di bahagian atas pokok ns-3. Folder ini menjadi direktori kerja di mana fail output akan ditulis. Tetapi bagaimana jika anda ingin menyimpan fail ini di luar pepohon sumber ns-3? Gunakan hujah -β€―-cwd:

$ ./waf --cwd=...

Anda mungkin mendapati lebih mudah untuk mendapatkan fail output dalam direktori kerja anda. Dalam kes ini, tindakan tidak langsung berikut boleh membantu:

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

Hiasan versi arahan sebelumnya ini mengekalkan direktori kerja semasa, pergi ke direktori Wafdan kemudian memberi arahan Waf untuk menukar direktori kerja kembali kepada direktori kerja semasa yang disimpan sebelum memulakan program. Kami menyebut pasukan -β€―-cwd Untuk kesempurnaan, kebanyakan pengguna hanya menjalankan Waf dari direktori peringkat atas dan menjana fail output di sana.

Sambungan: Bab 4

Sumber: www.habr.com

Tambah komen