บทช่วยสอนการจำลองเครือข่าย ns-3 บทที่ 3

บทช่วยสอนการจำลองเครือข่าย ns-3 บทที่ 3
บทที่ 1,2

3 การเริ่มต้นใช้งาน
3.1 ภาพรวม
3.2 ข้อกำหนดเบื้องต้น
3.2.1 การดาวน์โหลด ns-3 release เป็นไฟล์เก็บถาวรต้นทาง
3.3 ดาวน์โหลด ns-3 โดยใช้ Git
3.3.1 กำลังโหลด ns-3 โดยใช้ Bake
3.4 การประกอบ ns-3
3.4.1 การสร้างด้วย build.py
3.4.2 การสร้างด้วยการอบ
3.4.3 สร้างด้วย Waf
3.5 การทดสอบ ns-3
3.6 การรันสคริปต์
3.6.1 อาร์กิวเมนต์บรรทัดคำสั่ง
3.6.2 การดีบัก
3.6.3 ไดเร็กทอรีการทำงาน

3 บท

เริ่มต้นใช้งาน

บทนี้มีจุดมุ่งหมายเพื่อเตรียมผู้อ่านให้เริ่มต้นด้วยคอมพิวเตอร์ที่อาจไม่เคยติดตั้ง ns-3 โดยครอบคลุมถึงแพลตฟอร์มที่รองรับ ข้อกำหนดเบื้องต้น วิธีขอรับ ns-3 วิธีสร้าง ns-3 และวิธีการทดสอบการสร้างและรันโปรแกรมแบบง่ายของคุณ

3.1 ภาพรวม

เครื่องจำลอง ns-3 สร้างขึ้นเป็นระบบของไลบรารีซอฟต์แวร์ที่ทำงานร่วมกัน ในระหว่างการประกอบ รหัสของโปรแกรมผู้ใช้จะเชื่อมโยงกับไลบรารีเหล่านี้ ภาษาการเขียนโปรแกรม C++ หรือ Python ใช้สำหรับการเขียนโปรแกรมแบบกำหนดเอง

Ns-3 ได้รับการแจกจ่ายเป็นซอร์สโค้ด ซึ่งหมายความว่าระบบเป้าหมายจะต้องมีสภาพแวดล้อมการพัฒนาซอฟต์แวร์เพื่อสร้างไลบรารีก่อน จากนั้นจึงสร้างโปรแกรมผู้ใช้ โดยหลักการแล้ว ns-3 สามารถแจกจ่ายเป็นไลบรารีสำเร็จรูปสำหรับระบบเฉพาะได้ และในอนาคตอาจมีการแจกจ่ายในลักษณะนี้ แต่ปัจจุบันนี้ผู้ใช้จำนวนมากทำงานโดยการแก้ไข ns-3 เอง ดังนั้นจึงมีประโยชน์ที่จะมีซอร์สโค้ดในการสร้างไลบรารี หากใครต้องการรับงานสร้างไลบรารี่และแพ็คเกจสำเร็จรูปสำหรับระบบปฏิบัติการ กรุณาติดต่อ Mailing List ns-นักพัฒนา.

ต่อไป เราจะดูสามวิธีในการดาวน์โหลดและสร้าง ns-3 สิ่งแรกคือการดาวน์โหลดและสร้างรุ่นอย่างเป็นทางการจากเว็บไซต์หลัก ประการที่สองคือการเลือกและประกอบสำเนาของเวอร์ชันการพัฒนาของการติดตั้ง ns-3 พื้นฐาน ประการที่สามคือการใช้เครื่องมือสร้างเพิ่มเติมเพื่อโหลดส่วนขยายเพิ่มเติมสำหรับ ns-3 เราจะอธิบายแต่ละข้อเนื่องจากเครื่องมือมีความแตกต่างกันเล็กน้อย

ผู้ใช้ Linux ที่มีประสบการณ์อาจสงสัยว่าเหตุใด ns-3 จึงไม่จัดทำเป็นแพ็คเกจเหมือนกับไลบรารีอื่น ๆ ส่วนใหญ่ที่ใช้ตัวจัดการแพ็คเกจ แม้ว่าจะมีแพ็คเกจไบนารี่สำหรับ Linux ต่างๆ (เช่น Debian) ผู้ใช้ส่วนใหญ่มักจะต้องแก้ไขไลบรารี่และต้องสร้าง ns-3 ใหม่ด้วยตนเอง ดังนั้นการมีซอร์สโค้ดให้ใช้งานได้จึงสะดวก ด้วยเหตุนี้เราจะเน้นไปที่การติดตั้งจากแหล่งที่มา

สำหรับสิทธิ์การใช้งาน ns-3 ส่วนใหญ่ ราก ไม่จำเป็น ขอแนะนำให้ใช้บัญชีผู้ใช้ที่ไม่มีสิทธิ์

3.2 ข้อกำหนดเบื้องต้น

ไลบรารี ns-3 ที่พร้อมใช้งานทั้งชุดมีจำนวนการขึ้นต่อกันกับไลบรารีของบุคคลที่สาม แต่สำหรับส่วนใหญ่ ns-3 สามารถสร้างและใช้งานได้โดยมีการรองรับส่วนประกอบทั่วไปหลายอย่าง (มักติดตั้งโดยค่าเริ่มต้น) ได้แก่ คอมไพเลอร์ C++ Python โปรแกรมแก้ไขซอร์สโค้ด (เช่น เป็นกลุ่ม, emacs หรือ คราส) และหากใช้ที่เก็บการพัฒนา ระบบควบคุมเวอร์ชัน Git ผู้ใช้ครั้งแรกส่วนใหญ่จะไม่ต้องกังวลหากการกำหนดค่ารายงานว่ามีคุณลักษณะขั้นสูงของ ns-3 บางอย่างที่ขาดหายไป แต่สำหรับผู้ที่ต้องการการติดตั้งแบบสมบูรณ์ โปรเจ็กต์นี้มีวิกิซึ่งมีหน้าต่างๆ พร้อมด้วยคำแนะนำและเคล็ดลับที่เป็นประโยชน์มากมาย หน้าดังกล่าวหนึ่งหน้าคือหน้าการติดตั้งพร้อมคำแนะนำในการติดตั้งสำหรับระบบต่างๆ ดูได้ที่: https://www.nsnam.org/wiki/Installation.

ส่วนข้อกำหนดเบื้องต้นของวิกินี้จะอธิบายว่าแพ็คเกจใดบ้างที่จำเป็นเพื่อรองรับตัวเลือก ns-3 ทั่วไป และยังให้คำสั่งที่ใช้ในการติดตั้งบน Linux หรือ macOS เวอร์ชันทั่วไปด้วย

คุณสามารถใช้ประโยชน์จากโอกาสนี้ในการสำรวจหน้าวิกิ ns-3 หรือเว็บไซต์หลัก: https://www.nsnam.orgเพราะมีข้อมูลมากมายที่นั่น ตั้งแต่เวอร์ชันล่าสุดของ ns-3 (ns-3.29) เป็นต้นไป จำเป็นต้องมีเครื่องมือต่อไปนี้เพื่อรัน ns-3:

แพ็คเกจเครื่องมือ/เวอร์ชัน

  • คอมไพเลอร์ C++
    เสียงดังกราว++ หรือ g++ (g++ เวอร์ชัน 4.9 หรือสูงกว่า)
  • หลาม
    เวอร์ชัน python2 >= 2.7.10 หรือเวอร์ชัน python3 >=3.4
  • ไป
    เวอร์ชันล่าสุดใด ๆ (เพื่อเข้าถึง ns-3 บน GitLab.com)
  • น้ำมันดิน
    เวอร์ชันล่าสุดใดๆ (สำหรับการแกะรีลีส ns-3)
  • บันซิป2
    เวอร์ชันล่าสุดใดๆ (สำหรับการแกะรีลีส ns-3)

หากต้องการตรวจสอบเวอร์ชันเริ่มต้นของ Python ให้พิมพ์ python -V. หากต้องการตรวจสอบเวอร์ชัน g++ ให้พิมพ์ g++ -v. หากเครื่องมือใดหายไปหรือเก่าเกินไป โปรดดูคู่มือการติดตั้งในหน้าวิกิ ns-3

จากนี้ไป เราถือว่าผู้อ่านใช้ Linux, MacOS หรือโปรแกรมจำลอง Linux และมีเครื่องมือข้างต้นเป็นอย่างน้อย

3.2.1 การดาวน์โหลด ns-3 release เป็นไฟล์เก็บถาวรต้นทาง

นี่คือแนวทางปฏิบัติสำหรับผู้ใช้ใหม่ที่ต้องการดาวน์โหลดและทดลองใช้ ns-3 เวอร์ชันล่าสุดและแพ็คเกจ การเผยแพร่ ns-3 ได้รับการเผยแพร่เป็นไฟล์เก็บถาวรซอร์สที่ถูกบีบอัด ซึ่งบางครั้งเรียกว่า ทาร์บอล. ทาร์บอล เป็นรูปแบบไฟล์เก็บถาวรซอฟต์แวร์พิเศษที่รวมไฟล์หลายไฟล์เข้าด้วยกัน ไฟล์เก็บถาวรมักจะถูกบีบอัด กระบวนการบูต ns-3 ผ่านทาง ทาร์บอล ง่ายมาก คุณเพียงแค่ต้องเลือกรุ่น ดาวน์โหลด และแกะมันออก

สมมติว่าคุณในฐานะผู้ใช้ต้องการสร้าง ns-3 ในไดเร็กทอรีท้องถิ่นที่เรียกว่า พื้นที่ทำงาน. คุณสามารถรับสำเนาที่ใช้งานได้โดยการป้อนข้อมูลต่อไปนี้ลงในคอนโซล Linux (แน่นอนว่าจะต้องแทนที่หมายเลขเวอร์ชันที่เหมาะสม)

$ 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 

ให้ความสนใจกับยูทิลิตี้ที่ใช้ข้างต้น wgetซึ่งเป็นเครื่องมือบรรทัดคำสั่งสำหรับการดาวน์โหลดวัตถุจากอินเทอร์เน็ต หากคุณยังไม่ได้ติดตั้ง คุณสามารถใช้เบราว์เซอร์เพื่อดำเนินการนี้ได้

การทำตามขั้นตอนเหล่านี้จะนำคุณไปยังไดเร็กทอรี ns-allinone-3.29 ซึ่งคุณจะเห็นไฟล์และไดเร็กทอรีหลายรายการ

$ 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

ตอนนี้คุณพร้อมที่จะสร้างการกระจายฐาน ns-3 แล้วและสามารถไปยังส่วนที่เกี่ยวกับการสร้าง ns-3 ได้

3.3 ดาวน์โหลด ns-3 โดยใช้ Git

รหัส ns-3 มีอยู่ในที่เก็บ Git บน GitLab.com ที่ https://gitlab.com/nsnam/. กลุ่ม นสนัม รวบรวมที่เก็บข้อมูลต่าง ๆ ที่ใช้โดยโครงการโอเพ่นซอร์ส

วิธีที่ง่ายที่สุดในการเริ่มใช้ที่เก็บ Git คือการแยกหรือโคลนสภาพแวดล้อม ns-3-อัลลิโนน. นี่คือชุดสคริปต์ที่จัดการการโหลดและการประกอบระบบย่อย ns-3 ที่ใช้บ่อยที่สุด หากคุณยังใหม่กับ Git คำว่า "fork" และ "clone" อาจไม่คุ้นเคยสำหรับคุณ หากเป็นเช่นนั้น เราขอแนะนำให้คุณโคลน (สร้างสำเนาของคุณเอง) พื้นที่เก็บข้อมูลบน GitLab.com ดังนี้:

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

ในขั้นตอนนี้ มุมมองของไดเร็กทอรีของคุณ ns-3-อัลลิโนน แตกต่างจากไดเร็กทอรีเก็บถาวร release ที่อธิบายไว้ข้างต้นเล็กน้อย มันควรมีลักษณะดังนี้:

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

โปรดทราบว่ามีสคริปต์ ดาวน์โหลด.pyซึ่งจะแยก ns-3 และซอร์สโค้ดที่มาเพิ่มเติมเพิ่มเติม ที่นี่คุณมีทางเลือก: ดาวน์โหลดสแนปชอตการพัฒนา ns-3 ล่าสุด:

$ python download.py

หรือต้องการปล่อย ns-3 โดยใช้แฟล็ก -n เพื่อระบุหมายเลขรุ่น:

$ python download.py -n ns-3.29

หลังจากขั้นตอนนี้ไปที่ไดเร็กทอรี ns-3-อัลลิโนน ที่เก็บเพิ่มเติมจะถูกดาวน์โหลด ns-3, อบ, ไพบินเกน и เนทานิม.

หมายเหตุ
บนเครื่องที่สะอาด Ubuntu16.04 ฉันจำเป็นต้องเปลี่ยนคำสั่งเป็น: $ sudo python3 download.py -n ns-3.29 (ต่อไปนี้จะเรียกว่าบันทึกของผู้แปล)

3.3.1 กำลังโหลด ns-3 โดยใช้ Bake

สองวิธีข้างต้น (ไฟล์เก็บถาวรหรือแหล่งเก็บข้อมูลต้นทาง ns-3-อัลลิโนน ผ่าน Git) มีประโยชน์สำหรับการติดตั้ง ns-3 ที่ง่ายที่สุดพร้อมหลายส่วนเสริม (ไพบินเกน เพื่อสร้างการเชื่อมโยง Python และ เนทานิม สำหรับแอนิเมชั่นเครือข่าย) เรียกว่าพื้นที่เก็บข้อมูลที่สามที่ให้ไว้ตามค่าเริ่มต้นใน ns-3-allinone อบ.

อบ เป็นเครื่องมือสำหรับการสร้างซอฟต์แวร์แบบประสานงานจากแหล่งเก็บข้อมูลหลายแห่งที่พัฒนาขึ้นสำหรับโครงการ ns-3 อบ สามารถใช้เพื่อรับเวอร์ชันการพัฒนาของ ns-3 รวมถึงการดาวน์โหลดและสร้างส่วนขยายของเวอร์ชันพื้นฐานของการแจกจ่าย ns-3 เช่นสภาพแวดล้อม การดำเนินการโค้ดโดยตรง, CradleNetwork แท่นจำลองความสามารถในการสร้างการเชื่อมโยง Python ใหม่และ "แอป" ns-3 ต่างๆ

หมายเหตุ
CradleNetwork Simulation Cradle เป็นเฟรมเวิร์กที่ช่วยให้คุณสามารถใช้สแต็กเครือข่าย TCP/IP จริงภายในตัวจำลองเครือข่าย

หากคุณคาดว่าการติดตั้ง ns-3 ของคุณจะมีคุณสมบัติขั้นสูงหรือเพิ่มเติม คุณสามารถปฏิบัติตามเส้นทางการติดตั้งนี้ได้

ในการเปิดตัว ns-3 ล่าสุด อบ ถูกเพิ่มเข้าไปในรุ่น tar รุ่นนี้มีไฟล์การกำหนดค่าที่ให้คุณดาวน์โหลดซอฟต์แวร์เวอร์ชันปัจจุบัน ณ เวลาที่วางจำหน่าย นั่นคือตัวอย่างเช่นเวอร์ชัน อบซึ่งเผยแพร่ด้วย release ns-3.29 สามารถใช้เพื่อดึงส่วนประกอบสำหรับ ns-3 รุ่นนั้นหรือรุ่นก่อนหน้า แต่ไม่สามารถใช้เพื่อดึงส่วนประกอบสำหรับการเปิดตัวในภายหลัง (หากไฟล์คำอธิบายแพ็คเกจ bakeconf.xml ไม่ได้อัปเดต)

คุณยังสามารถรับสำเนาล่าสุดได้อีกด้วย อบโดยป้อนคำสั่งต่อไปนี้ลงในคอนโซล Linux ของคุณ (สมมติว่าคุณติดตั้ง Git แล้ว):

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

เมื่อคุณรันคำสั่ง git คุณควรเห็นสิ่งต่อไปนี้:

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.

หลังจากที่คำสั่งเสร็จสิ้น โคลน คุณควรมีไดเร็กทอรีชื่อ อบซึ่งเนื้อหาควรมีลักษณะดังนี้:

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

โปรดทราบว่าคุณได้โหลดสคริปต์ Python หลายตัว ซึ่งเป็นชื่อโมดูล Python อบ และไฟล์การกำหนดค่า XML ขั้นตอนต่อไปคือการใช้สคริปต์เหล่านี้เพื่อดาวน์โหลดและสร้างการกระจาย ns-3 ที่คุณเลือก มีเป้าหมายการปรับแต่งหลายประการ:

  1. ns-3.29: โมดูลที่สอดคล้องกับการเปิดตัว; มันจะดาวน์โหลดส่วนประกอบที่คล้ายกับการเปิดตัวใน tarball

  2. ns-3-dev: โมดูลที่คล้ายกัน แต่ใช้โค้ดจากแผนผังการพัฒนา

  3. ns-อัลลิโนน-3.29: โมดูลที่มีคุณสมบัติเพิ่มเติมอื่นๆ เช่น การกำหนดเส้นทางการคลิกและ Network Simulation Cradle, Openflow สำหรับ ns-3

  4. ns-3-อัลลิโนน: คล้ายกับเวอร์ชันวางจำหน่ายของโมดูล AllInOneแต่สำหรับโค้ดการพัฒนา

หมายเหตุ
คลิก — สถาปัตยกรรมซอฟต์แวร์แบบแยกส่วนสำหรับการสร้างเราเตอร์

Openflow เป็นโปรโตคอลสำหรับจัดการกระบวนการประมวลผลข้อมูลที่ส่งผ่านเครือข่ายข้อมูลที่ส่งโดยเราเตอร์และสวิตช์ โดยใช้เทคโนโลยีเครือข่ายที่กำหนดโดยซอฟต์แวร์

สามารถดูภาพรวมการพัฒนาปัจจุบัน (ไม่เผยแพร่) ns-3 ได้ที่:https://gitlab.com/nsnam/ns-3-dev.git.

นักพัฒนาพยายามที่จะเก็บที่เก็บข้อมูลเหล่านี้ไว้ในลำดับการทำงานที่สอดคล้องกัน แต่ในพื้นที่การพัฒนาและมีโค้ดที่ยังไม่เผยแพร่ ดังนั้น หากคุณไม่ได้วางแผนที่จะใช้คุณสมบัติใหม่ ให้เลือกรุ่นอย่างเป็นทางการ

คุณสามารถค้นหาโค้ดเวอร์ชันล่าสุดได้โดยการเรียกดูรายการพื้นที่เก็บข้อมูล หรือไปที่หน้าเว็บการเผยแพร่ ns-3:https://www.nsnam.org/releases/ และคลิกที่ลิงค์เวอร์ชันล่าสุด ในตัวอย่างนี้ เราจะดำเนินการต่อด้วย ns-3.29

ตอนนี้เพื่อให้ได้ส่วนประกอบ ns-3 ที่เราต้องการ เราจะใช้เครื่องมือนี้ อบ. สมมติว่าคำเบื้องต้นเกี่ยวกับงาน อบ.

Bake ทำงานโดยการโหลดแหล่งแพ็คเกจลงในไดเร็กทอรี แหล่ง และติดตั้งไลบรารีลงในไดเร็กทอรี build อบ สามารถรันได้โดยอ้างอิงไบนารี่แต่ถ้าคุณต้องการรัน อบ ไม่ใช่จากไดเร็กทอรีที่ดาวน์โหลดมาแนะนำให้เพิ่มพา ธ อบ ไปยังเส้นทางของคุณ (ตัวแปรสภาพแวดล้อม PATH) เช่นดังต่อไปนี้ (ตัวอย่างสำหรับ Linux bash shell) ไปที่ไดเร็กทอรี "bake" จากนั้นตั้งค่าตัวแปรสภาพแวดล้อมต่อไปนี้:

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

จะเป็นการวางโปรแกรม bake.py ไปยังเส้นทางของเชลล์และจะอนุญาตให้โปรแกรมอื่นค้นหาไฟล์ปฏิบัติการและไลบรารีที่โปรแกรมสร้างขึ้น อบ. ในบางกรณีการใช้งาน อบไม่จำเป็นต้องตั้งค่า PATH และ PYTHONPATH ที่อธิบายไว้ข้างต้น แต่โดยปกติแล้วการสร้าง ns-3-allinone ที่สมบูรณ์ (พร้อมแพ็คเกจเพิ่มเติม) จำเป็นต้องใช้

ไปที่ไดเร็กทอรีการทำงานของคุณและป้อนข้อมูลต่อไปนี้ในคอนโซล:

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

ต่อไปเราจะถาม อบ ตรวจสอบว่าเรามีเครื่องมือเพียงพอในการโหลดส่วนประกอบต่างๆ หรือไม่ กด:

$ ./bake.py check

คุณควรเห็นสิ่งต่อไปนี้:

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

โดยเฉพาะอย่างยิ่ง เครื่องมืออัปโหลด เช่น Mercurial, CVS, Git และ Bazaar มีความสำคัญในขั้นตอนนี้ เนื่องจากเครื่องมือเหล่านี้ช่วยให้เราสามารถรับโค้ดได้ ในขั้นตอนนี้ ให้ติดตั้งเครื่องมือที่ขาดหายไปตามปกติสำหรับระบบของคุณ (หากคุณทราบ) หรือติดต่อผู้ดูแลระบบเพื่อขอความช่วยเหลือ

ต่อไป ให้ลองดาวน์โหลดซอฟต์แวร์:

$ ./bake.py download

ผลลัพธ์ควรเป็นดังนี้:

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

นี่จะหมายความว่ามีการดาวน์โหลดแหล่งข้อมูลสามแหล่งแล้ว ตอนนี้ไปที่ไดเร็กทอรีต้นทางแล้วพิมพ์ ls; คุณควรเห็น:

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

ตอนนี้คุณพร้อมที่จะสร้างการกระจาย ns-3 แล้ว

3.4 การประกอบ ns-3

เช่นเดียวกับการดาวน์โหลด ns-3 มีหลายวิธีในการสร้าง ns-3 สิ่งสำคัญที่เราต้องการเน้นย้ำคือ ns-3 ถูกสร้างขึ้นโดยใช้เครื่องมือสร้างที่เรียกว่า Wafอธิบายไว้ด้านล่าง. ผู้ใช้ส่วนใหญ่จะใช้งานด้วย Wafแต่มีสคริปต์ที่มีประโยชน์สองสามสคริปต์ที่จะช่วยคุณเริ่มต้นหรือจัดระเบียบบิลด์ที่ซับซ้อนมากขึ้น ดังนั้นโปรดก่อนที่คุณจะอ่านเกี่ยวกับ Wafลองดูที่ build.py และประกอบด้วย อบ.

3.4.1 การสร้างด้วย build.py

คำเตือน! ขั้นตอนการสร้างนี้พร้อมใช้งานจากเวอร์ชันไฟล์เก็บถาวรต้นทางที่ได้รับตามที่อธิบายไว้ข้างต้นเท่านั้น และไม่ได้ดาวน์โหลดผ่าน git หรือ bake

เมื่อทำงานกับไฟล์เก็บถาวรการเผยแพร่ ทาร์บอลใน ns-3-อัลลิโนน มีสคริปต์ที่มีประโยชน์ที่สามารถทำให้การประกอบส่วนประกอบง่ายขึ้น เรียกว่า build.py โปรแกรมนี้จะจัดทำโครงการให้คุณอย่างมีประโยชน์ที่สุด อย่างไรก็ตาม โปรดทราบว่าการตั้งค่าขั้นสูงและการทำงานกับ ns-3 มักจะเกี่ยวข้องกับการใช้ระบบบิวด์ของ ns-3 นั่นคือ Waf ซึ่งจะแนะนำในภายหลังในบทช่วยสอนนี้

หากคุณดาวน์โหลดโดยใช้ ทาร์บอลจากนั้นในไดเร็กทอรีของคุณ ~/พื้นที่ทำงาน ไดเร็กทอรีที่มีชื่อคล้าย ns-อัลลิโนน-3.29. ป้อนต่อไปนี้:

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

เมื่อถูกเรียก build.py เราใช้อาร์กิวเมนต์บรรทัดคำสั่งเพื่อสร้างตัวอย่างและการทดสอบที่ใช้ในบทช่วยสอนนี้ ซึ่งไม่ได้สร้างขึ้นตามค่าเริ่มต้นใน ns-3 ตามค่าเริ่มต้น โปรแกรมจะสร้างโมดูลที่มีอยู่ทั้งหมดด้วย จากนั้น หากคุณต้องการ คุณสามารถสร้าง ns-3 โดยไม่มีตัวอย่างและการทดสอบ หรือยกเว้นโมดูลที่ไม่จำเป็นสำหรับงานของคุณ

คุณจะเห็นข้อความเอาท์พุตของคอมไพลเลอร์จำนวนมากที่แสดงโดยสคริปต์ในขณะที่สคริปต์สร้างส่วนต่างๆ ที่คุณโหลด ก่อนอื่นสคริปต์จะพยายามสร้างแอนิเมเตอร์ เนทานิมจากนั้นเครื่องกำเนิดการผูก ไพบินเกน และสุดท้าย ns-3 เมื่อกระบวนการเสร็จสมบูรณ์ คุณควรเห็นสิ่งต่อไปนี้:

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

ในสามบรรทัดสุดท้ายของรายการ เราเห็นข้อความเกี่ยวกับโมดูลที่ไม่ได้ถูกสร้างขึ้น:

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

ซึ่งหมายความว่าโมดูล ns-3 บางตัวที่ขึ้นอยู่กับไลบรารีภายนอกอาจไม่ได้ถูกสร้างขึ้น หรือไม่จำเป็นต้องสร้างโมดูลสำหรับการกำหนดค่านี้ นี่ไม่ได้หมายความว่าเครื่องจำลองไม่ได้ประกอบหรือโมดูลที่ประกอบแล้วทำงานไม่ถูกต้อง

3.4.2 การสร้างด้วยการอบ

หากคุณใช้ bake ด้านบนเพื่อรับซอร์สโค้ดจากที่เก็บโปรเจ็กต์ คุณสามารถใช้มันเพื่อสร้าง ns-3 ต่อไปได้ กด:

$ ./bake.py build

และคุณควรเห็นสิ่งที่ชอบ:

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

ช่วย: คุณสามารถทำทั้งขั้นตอนการดาวน์โหลดและสร้างพร้อมกันได้โดยการเรียก "bake.py ปรับใช้"

การประกอบส่วนประกอบทั้งหมดอาจล้มเหลว แต่การประกอบจะดำเนินต่อไปหากไม่จำเป็นต้องใช้ส่วนประกอบ ตัวอย่างเช่น ปัญหาเรื่องการพกพาเมื่อเร็วๆ นี้ก็คือ castxml สามารถประกอบได้ด้วยเครื่องมือ อบ ไม่ใช่ในทุกแพลตฟอร์ม ในกรณีนี้ ข้อความลักษณะนี้จะปรากฏขึ้น:

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

แต่ castxml จำเป็นเฉพาะในกรณีที่คุณต้องการสร้างการผูก Python ที่อัปเดตแล้ว สำหรับผู้ใช้ส่วนใหญ่ ไม่จำเป็นต้องมีสิ่งนี้ (อย่างน้อยก็จนกว่าพวกเขาจะเปลี่ยน ns-3) ดังนั้นจึงสามารถเพิกเฉยต่อคำเตือนดังกล่าวได้อย่างปลอดภัยในตอนนี้

หากล้มเหลว คำสั่งต่อไปนี้จะให้คำแนะนำเกี่ยวกับการขึ้นต่อกันที่หายไป:

$ ./bake.py show

การขึ้นต่อกันต่างๆ ของแพ็คเกจที่คุณพยายามสร้างจะแสดงรายการไว้

3.4.3 สร้างด้วย Waf

จนถึงจุดนี้ เพื่อเริ่มสร้าง ns-3 เราใช้สคริปต์อย่างใดอย่างหนึ่ง build.pyหรือเครื่องมือ อบ. เครื่องมือเหล่านี้มีประโยชน์สำหรับการสร้าง ns-3 และการบำรุงรักษาไลบรารี ในความเป็นจริง ในการสร้าง พวกเขาเรียกใช้เครื่องมือสร้าง Waf จากไดเร็กทอรี ns-3 Waf ติดตั้งด้วยซอร์สโค้ด ns-3 ผู้ใช้ส่วนใหญ่รีบเปลี่ยนไปใช้โดยตรงเพื่อกำหนดค่าและประกอบ ns-3 Waf. เพื่อดำเนินการต่อ โปรดไปที่ไดเร็กทอรี ns-3 ที่คุณสร้างขึ้นตั้งแต่แรก

การดำเนินการนี้ไม่จำเป็นอย่างเคร่งครัดในขณะนี้ แต่จะมีประโยชน์หากย้อนรอยเล็กน้อยและดูวิธีเปลี่ยนแปลงการกำหนดค่าโปรเจ็กต์ การเปลี่ยนแปลงการกำหนดค่าที่มีประโยชน์ที่สุดที่คุณสามารถทำได้คือการสร้างโค้ดเวอร์ชันที่ปรับให้เหมาะสมที่สุด ตามค่าเริ่มต้น คุณได้กำหนดค่าโปรเจ็กต์ของคุณให้สร้างเวอร์ชันดีบักแล้ว มาดูโปรเจ็กต์เพื่อสร้างงานสร้างที่ปรับให้เหมาะสมกันดีกว่า เพื่ออธิบายให้ Waf ทราบว่าควรสร้างบิลด์ที่ได้รับการปรับปรุงซึ่งมีตัวอย่างและการทดสอบ คุณจะต้องเรียกใช้คำสั่งต่อไปนี้:

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

นี้จะเปิดตัว Waf นอกไดเรกทอรีท้องถิ่น (เพื่อความสะดวกของคุณ) คำสั่งแรกจะล้างข้อมูลจากบิลด์ก่อนหน้า ซึ่งโดยปกติจะไม่จำเป็นอย่างเคร่งครัด แต่เป็นแนวทางปฏิบัติที่ดี (ดูโปรไฟล์บิลด์ด้านล่าง) สิ่งนี้จะลบไลบรารีและไฟล์อ็อบเจ็กต์ที่สร้างไว้ก่อนหน้านี้ซึ่งอยู่ในไดเร็กทอรี สร้าง/. เมื่อโปรเจ็กต์ได้รับการกำหนดค่าใหม่และระบบบิลด์ตรวจสอบการขึ้นต่อกันต่างๆ คุณควรเห็นเอาต์พุตที่คล้ายกับต่อไปนี้:

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)

โปรดทราบส่วนสุดท้ายของรายการด้านบน ตัวเลือก ns-3 บางตัวไม่ได้เปิดใช้งานตามค่าเริ่มต้นหรือต้องการการสนับสนุนจากระบบเพื่อให้ทำงานได้อย่างถูกต้อง ตัวอย่างเช่น หากต้องการเปิดใช้งาน XmlTo ต้องมีไลบรารีอยู่บนระบบ libxml-2.0. หากไม่พบไลบรารีนี้และไม่ได้เปิดใช้งานฟังก์ชัน ns-3 ที่เกี่ยวข้อง ข้อความจะปรากฏขึ้น โปรดทราบว่าคุณสามารถใช้คำสั่งได้ sudo เพื่อตั้งค่า suid bit “set group ID at runtime” สำหรับบางโปรแกรม ไม่ได้เปิดใช้งานตามค่าเริ่มต้น ดังนั้นคุณลักษณะนี้จึงปรากฏเป็น "ไม่ได้เปิดใช้งาน" สุดท้าย หากต้องการรับรายการตัวเลือกที่เปิดใช้งาน ให้ใช้ Waf ด้วยพารามิเตอร์ --check-config.

ตอนนี้ให้ย้อนกลับไปและเปลี่ยนกลับไปใช้โครงสร้างการดีบักที่มีตัวอย่างและการทดสอบ

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

ขณะนี้ระบบบิลด์ได้รับการตั้งค่าแล้ว และคุณสามารถสร้างเวอร์ชันดีบักของโปรแกรม ns-3 ได้โดยเพียงพิมพ์:

$ ./waf

ขั้นตอนข้างต้นอาจบังคับให้คุณสร้างส่วนหนึ่งของระบบ ns-3 สองครั้ง แต่ตอนนี้คุณรู้วิธีเปลี่ยนการกำหนดค่าและสร้างโค้ดที่ปรับให้เหมาะสมแล้ว

หากต้องการตรวจสอบว่าโปรไฟล์ใดที่ใช้งานอยู่สำหรับการกำหนดค่าโปรเจ็กต์ที่กำหนด ให้ใช้คำสั่ง:

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

สถานการณ์ข้างต้น build.py ยังสนับสนุนข้อโต้แย้ง --enable-examples и --enable-testsแต่ตัวเลือกอื่น ๆ Waf มันไม่รองรับโดยตรง ตัวอย่างเช่น สิ่งนี้จะไม่ทำงาน:

$ ./build.py --disable-python

ปฏิกิริยาจะเป็นดังนี้:

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

อย่างไรก็ตาม สามารถใช้ตัวดำเนินการพิเศษ - - เพื่อส่งพารามิเตอร์เพิ่มเติมผ่านได้ WAFดังนั้นแทนที่จะใช้คำสั่งข้างต้น คำสั่งต่อไปนี้จะทำงานได้:

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

เพราะมันสร้างคำสั่งหลัก ./waf กำหนดค่า --disable-python. ต่อไปนี้เป็นเคล็ดลับเบื้องต้นเพิ่มเติมเกี่ยวกับ Waf.

การจัดการข้อผิดพลาดของบิลด์

การเผยแพร่ ns-3 ได้รับการทดสอบบนคอมไพเลอร์ C++ ล่าสุดที่มีให้บริการ ณ เวลาที่เผยแพร่บน Linux และ MacOS ทั่วไป อย่างไรก็ตาม เมื่อเวลาผ่านไป การแจกแจงใหม่จะถูกเผยแพร่พร้อมกับคอมไพเลอร์ใหม่ และคอมไพเลอร์รุ่นใหม่เหล่านี้มีแนวโน้มที่จะมีความรู้เกี่ยวกับคำเตือนมากกว่า ns-3 กำหนดค่า build ให้ถือว่าคำเตือนทั้งหมดเป็นข้อผิดพลาด ดังนั้นบางครั้งหากคุณใช้เวอร์ชันเก่าบนระบบที่ใหม่กว่า คำเตือนของคอมไพเลอร์อาจหยุดการสร้าง

ตัวอย่างเช่น ก่อนหน้านี้มีการเปิดตัว ns-3.28 สำหรับ Fedora 28 ซึ่งรวมถึงเวอร์ชันหลักใหม่ด้วย gcc (gcc-8). การสร้างรีลีส ns-3.28 หรือเวอร์ชันก่อนหน้าภายใต้ Fedora 28 ที่ติดตั้ง Gtk2+ ไว้ ข้อผิดพลาดต่อไปนี้จะเกิดขึ้น:

/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 ใน Waf มีตัวเลือกในการแก้ปัญหาเหล่านี้ ปิดใช้งานการตั้งค่าสถานะ "-Werror" ใน g++ และ clang++ นี่คือตัวเลือก "--disable-werror" และต้องใช้ระหว่างการกำหนดค่า:

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

กำหนดค่าหรือประกอบ

คำสั่งบางอย่าง Waf มีความหมายเฉพาะในขั้นตอนการกำหนดค่า และบางส่วนใช้ได้เฉพาะในขั้นตอนการสร้างเท่านั้น ตัวอย่างเช่น หากคุณต้องการใช้คุณสมบัติการจำลอง ns-3 คุณสามารถเปิดใช้งานการตั้งค่าบิตได้ suid โดยใช้ sudoตามที่อธิบายไว้ข้างต้น ซึ่งจะแทนที่คำสั่งขั้นตอนการกำหนดค่า และทำให้คุณสามารถเปลี่ยนการกำหนดค่าได้โดยใช้คำสั่งต่อไปนี้ ซึ่งรวมถึงตัวอย่างและการทดสอบด้วย

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

ถ้าคุณทำเช่นนี้ Waf จะเปิดตัว sudoเพื่อเปลี่ยนโปรแกรมสร้างซ็อกเก็ตโค้ดจำลองให้ทำงานโดยมีสิทธิ์ ราก. ใน Waf มีตัวเลือกอื่นๆ มากมายสำหรับการกำหนดค่าและขั้นตอนการสร้าง หากต้องการสำรวจตัวเลือกของคุณ ให้ป้อน:

$ ./waf --help

ในส่วนถัดไป เราจะใช้ตัวเลือกที่เกี่ยวข้องกับการทดสอบ

โปรไฟล์การประกอบ

เราได้เห็นแล้วว่าคุณสามารถกำหนดค่าได้อย่างไร Waf สำหรับการประกอบ การแก้ปัญหา и การปรับให้เหมาะสม:

$ ./waf --build-profile=debug

นอกจากนี้ยังมีโปรไฟล์การประกอบระดับกลาง ปล่อย. ตัวเลือก -d มีความหมายเหมือนกันกับ --build-profile. โปรไฟล์บิลด์ควบคุมการใช้การบันทึก การยืนยัน และสวิตช์การปรับให้เหมาะสมของคอมไพเลอร์:

บทช่วยสอนการจำลองเครือข่าย ns-3 บทที่ 3

อย่างที่คุณเห็น การบันทึกและการยืนยันจะมีอยู่ในรุ่นการแก้ไขข้อบกพร่องเท่านั้น แนวทางปฏิบัติที่แนะนำคือการพัฒนาสคริปต์ของคุณในโหมดแก้ไขข้อบกพร่อง จากนั้นดำเนินการรันซ้ำ (สำหรับสถิติหรือการเปลี่ยนแปลงพารามิเตอร์) ในโปรไฟล์บิลด์ที่ได้รับการปรับปรุงให้เหมาะสม

หากคุณมีโค้ดที่ควรรันในโปรไฟล์บิลด์บางโปรไฟล์เท่านั้น ให้ใช้มาโคร Code Wrapper:

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

ค่าเริ่มต้น, Waf สถานที่สร้างสิ่งประดิษฐ์ในไดเร็กทอรี build คุณสามารถระบุไดเร็กทอรีเอาต์พุตอื่นได้โดยใช้ตัวเลือก - -outตัวอย่างเช่น:

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

ด้วยการรวมสิ่งนี้เข้ากับโปรไฟล์บิลด์ คุณสามารถสลับระหว่างตัวเลือกการคอมไพล์ต่างๆ ได้อย่างง่ายดาย:

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

ซึ่งช่วยให้คุณทำงานกับแอสเซมบลีหลายตัวโดยไม่ต้องเขียนแอสเซมบลีล่าสุดในแต่ละครั้ง เมื่อคุณเปลี่ยนไปใช้โปรไฟล์อื่น Waf จะคอมไพล์เท่านั้นโดยไม่ต้องคอมไพล์ใหม่ทั้งหมด

เมื่อคุณสลับโปรไฟล์บิวด์ในลักษณะนี้ คุณจะต้องระมัดระวังในการให้ตัวเลือกการกำหนดค่าเดียวกันในแต่ละครั้ง การกำหนดตัวแปรสภาพแวดล้อมหลายรายการจะช่วยให้คุณหลีกเลี่ยงข้อผิดพลาด:

$ 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

คอมไพเลอร์และแฟล็ก

ในตัวอย่างข้างต้น Waf ในการสร้าง ns-3 ใช้คอมไพเลอร์ C++ จาก GCC ( g ++). อย่างไรก็ตาม คุณสามารถเปลี่ยนอันที่คุณใช้ได้ Waf คอมไพเลอร์ C++ โดยการกำหนดตัวแปรสภาพแวดล้อม CXX ตัวอย่างเช่นหากต้องการใช้คอมไพเลอร์ C++ Clang, clang++,

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

ในลักษณะเดียวกับที่คุณสามารถกำหนดค่าได้ Waf เพื่อใช้การรวบรวมแบบกระจายโดยใช้ discc:

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

ข้อมูลเพิ่มเติมเกี่ยวกับ distcc และการรวบรวมแบบกระจายสามารถพบได้ที่หน้าโครงการในส่วนเอกสารประกอบ หากต้องการเพิ่มแฟล็กคอมไพเลอร์เมื่อกำหนดค่า ns-3 ให้ใช้ตัวแปรสภาพแวดล้อม CXXFLAGS_EXTRA

การติดตั้ง

Waf สามารถใช้เพื่อติดตั้งไลบรารีในตำแหน่งต่าง ๆ บนระบบ ตามค่าเริ่มต้น ไลบรารีที่คอมไพล์และโปรแกรมปฏิบัติการจะอยู่ในไดเร็กทอรี สร้างและเนื่องจาก Waf รู้ตำแหน่งของไลบรารีและโปรแกรมปฏิบัติการเหล่านี้ จึงไม่จำเป็นต้องติดตั้งไลบรารีที่อื่น

หากผู้ใช้ต้องการติดตั้งนอกไดเร็กทอรี build ก็สามารถรันคำสั่งได้ ./waf ติดตั้ง. คำนำหน้าเริ่มต้นสำหรับการติดตั้งคือ / usr / localนั่นเป็นเหตุผล ./waf ติดตั้ง จะทำการติดตั้งโปรแกรมต่างๆ เข้าไป / usr / local / bin,ห้องสมุดใน / usr / local / lib และไฟล์ส่วนหัวใน /usr/local/include. โดยปกติแล้วสิทธิ์ของ Superuser จะต้องตั้งค่าด้วยคำนำหน้าเริ่มต้น ดังนั้นคำสั่งทั่วไปจึงควรเป็นเช่นนั้น ติดตั้ง sudo ./waf. เมื่อเปิดตัว Waf จะเลือกใช้ไลบรารีที่แชร์ในไดเร็กทอรี build ก่อน จากนั้นจึงค้นหาไลบรารีตามเส้นทางไปยังไลบรารีที่กำหนดค่าในสภาพแวดล้อมท้องถิ่น ดังนั้น เมื่อติดตั้งไลบรารีบนระบบ แนวทางปฏิบัติที่ดีในการตรวจสอบว่ามีการใช้ไลบรารีที่ถูกต้อง ผู้ใช้สามารถเลือกที่จะติดตั้งด้วยคำนำหน้าอื่นโดยส่งตัวเลือกระหว่างการกำหนดค่า --prefixตัวอย่างเช่น:

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

หากในภายหลัง หลังจาก build ผู้ใช้จะเข้าสู่คำสั่งการติดตั้ง ./wafจะใช้คำนำหน้า /เลือก/ท้องถิ่น.

ทีม ./waf clean ต้องใช้ก่อนที่จะกำหนดค่าโครงการใหม่หากจะใช้การติดตั้ง Waf ภายใต้คำนำหน้าอื่น

ดังนั้นการใช้ ns-3 จึงไม่จำเป็นต้องโทร ./waf install. ผู้ใช้ส่วนใหญ่จะไม่ต้องการคำสั่งนี้เพราะว่า Waf จะรับไลบรารีปัจจุบันจากไดเร็กทอรี build แต่ผู้ใช้บางคนอาจพบว่าสิ่งนี้มีประโยชน์หากกิจกรรมของพวกเขาเกี่ยวข้องกับการทำงานกับโปรแกรมนอกไดเร็กทอรี ns-3

วาฟโสด

ที่ระดับบนสุดของแผนผังซอร์ส ns-3 จะมีสคริปต์ Waf เพียงสคริปต์เดียว เมื่อคุณเริ่มทำงาน คุณจะใช้เวลาส่วนใหญ่ในไดเร็กทอรี scratch/ หรือลึกลงไปsrc/... และในขณะเดียวกันก็ต้องวิ่งด้วย Waf. คุณสามารถจำได้ว่าคุณอยู่ที่ไหนและวิ่งหนี Waf ดังต่อไปนี้:

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

แต่การดำเนินการนี้จะน่าเบื่อและเกิดข้อผิดพลาดได้ง่าย ดังนั้นจึงมีวิธีแก้ไขที่ดีกว่า วิธีหนึ่งที่พบบ่อยคือการใช้โปรแกรมแก้ไขข้อความ เช่น emacs หรือ เป็นกลุ่มซึ่งมีการเปิดเซสชันเทอร์มินัลสองเซสชัน เซสชันแรกใช้ในการสร้าง ns-3 และเซสชันที่สองใช้สำหรับแก้ไขซอร์สโค้ด หากคุณมีเท่านั้น ทาร์บอลดังนั้นตัวแปรสภาพแวดล้อมสามารถช่วยได้:

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

$ cd scratch 
$ waff build

ในไดเร็กทอรีโมดูล อาจเป็นการดึงดูดให้เพิ่มสคริปต์ waf เล็กน้อยเช่น exec ../../waf. กรุณาอย่าทำอย่างนั้น สิ่งนี้สร้างความสับสนสำหรับมือใหม่ และเมื่อทำได้ไม่ดี จะนำไปสู่ข้อผิดพลาดของบิลด์ที่ตรวจพบได้ยาก วิธีแก้ไขที่แสดงข้างต้นเป็นเส้นทางที่ควรใช้

3.5 การทดสอบ ns-3

คุณสามารถรันการทดสอบหน่วยของการแจกแจง ns-3 ได้โดยการรันสคริปต์ ./test.py:

$ ./test.py

การทดสอบเหล่านี้ทำควบคู่ไปกับ Waf. ในที่สุดคุณจะเห็นข้อความว่า:

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

นี่เป็นข้อความสำคัญสำหรับระบุการแครช การแครช หรือข้อผิดพลาดของ valgrind ซึ่งบ่งบอกถึงปัญหาเกี่ยวกับโค้ดหรือความไม่เข้ากันระหว่างเครื่องมือและโค้ด

คุณจะเห็นผลลัพธ์สุดท้ายจาก Waf และผู้ทดสอบที่ทำการทดสอบแต่ละครั้ง ซึ่งจะมีลักษณะดังนี้:

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)

โดยปกติคำสั่งนี้จะถูกเรียกใช้โดยผู้ใช้เพื่อตรวจสอบอย่างรวดเร็วว่าการแจกจ่าย ns-3 นั้นถูกสร้างขึ้นอย่างถูกต้องหรือไม่ (โปรดทราบว่าลำดับของบรรทัด "PASS: ..." อาจแตกต่างกัน ซึ่งเป็นเรื่องปกติ สิ่งสำคัญคือบรรทัดสรุปที่ส่วนท้ายของรายงานแสดงว่าการทดสอบทั้งหมดผ่านการทดสอบ ไม่มีการทดสอบใดล้มเหลวหรือล้มเหลว) และ Wafและ test.py จะทำการทำงานแบบขนานกับแกนประมวลผลที่มีอยู่ของเครื่อง

3.6 การรันสคริปต์

โดยปกติแล้วเราจะเรียกใช้สคริปต์ภายใต้การควบคุม Waf. ซึ่งช่วยให้ระบบบิลด์มั่นใจได้ว่าเส้นทางไลบรารีที่ใช้ร่วมกันได้รับการตั้งค่าอย่างถูกต้องและไลบรารีพร้อมใช้งานในขณะรันไทม์ หากต้องการรันโปรแกรม เพียงใช้ Waf ด้วยพารามิเตอร์ - -run. มารันโปรแกรมที่เทียบเท่ากับ ns-3 กัน hello โลกโดยพิมพ์ข้อความต่อไปนี้:

$ ./waf --run hello-simulator

Waf จะตรวจสอบก่อนว่าโปรแกรมถูกสร้างขึ้นอย่างถูกต้องและสร้างหากจำเป็น แล้ว Waf จะรันโปรแกรมที่สร้างเอาต์พุตต่อไปนี้

Hello Simulator

ยินดีด้วย! ตอนนี้คุณเป็นผู้ใช้ ns-3 แล้ว!

ฉันควรทำอย่างไรหากฉันไม่เห็นผล?

หากคุณเห็นข้อความ Wafบ่งชี้ว่าการสร้างเสร็จสมบูรณ์แล้ว แต่คุณไม่เห็นผลลัพธ์ "สวัสดีซิมูเลเตอร์"มีความเป็นไปได้ที่ในส่วน [Build-with-Waf] ที่คุณเปลี่ยนโหมดการสร้างของคุณไป การปรับให้เหมาะสมแต่พลาดการเปลี่ยนกลับเข้าสู่โหมด การแก้ปัญหา. เอาต์พุตคอนโซลทั้งหมดที่ใช้ในบทช่วยสอนนี้ใช้ส่วนประกอบ ns-3 พิเศษที่ทำการบันทึกและใช้ในการพิมพ์ข้อความแบบกำหนดเองไปยังคอนโซล เอาต์พุตจากส่วนประกอบนี้จะถูกปิดใช้งานโดยอัตโนมัติเมื่อมีการคอมไพล์โค้ดที่ปรับให้เหมาะสม - เป็น "ปรับให้เหมาะสม" หากคุณไม่เห็นเอาต์พุต "Hello Simulator" ให้ป้อนข้อมูลต่อไปนี้:

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

เพื่อกำหนดค่า Waf เพื่อสร้างเวอร์ชันดีบักของโปรแกรม ns-3 ซึ่งรวมถึงตัวอย่างและการทดสอบ จากนั้นคุณควรสร้างโค้ดเวอร์ชันดีบักปัจจุบันใหม่โดยการพิมพ์

$ ./waf

ตอนนี้ถ้าคุณรันโปรแกรม สวัสดี-จำลองคุณควรเห็นผลลัพธ์ที่คาดหวัง

3.6.1 อาร์กิวเมนต์บรรทัดคำสั่ง

หากต้องการส่งผ่านอาร์กิวเมนต์บรรทัดคำสั่งไปยังโปรแกรม ns-3 ให้ใช้รูปแบบต่อไปนี้:

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

แทนที่ ไปยังชื่อโปรแกรมของคุณและอาร์กิวเมนต์ การโต้แย้ง - -command-template สำหรับ Waf โดยพื้นฐานแล้วเป็นสูตรสำหรับการสร้างบรรทัดคำสั่งจริง Waf ใช้ในการรันโปรแกรม Waf ตรวจสอบว่าการสร้างเสร็จสมบูรณ์ กำหนดเส้นทางไลบรารีที่ใช้ร่วมกัน จากนั้นใช้เทมเพลตบรรทัดคำสั่งที่ให้มา และแทนที่ชื่อโปรแกรมสำหรับตัวยึดตำแหน่ง %s เพื่อเรียกใช้ไฟล์เรียกทำงาน หากคุณพบว่าไวยากรณ์นี้ซับซ้อน มีเวอร์ชันที่ง่ายกว่าซึ่งเกี่ยวข้องกับโปรแกรม ns-3 และอาร์กิวเมนต์ของโปรแกรมที่อยู่ในเครื่องหมายคำพูดเดี่ยว:

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

อีกตัวอย่างที่มีประโยชน์อย่างยิ่งคือการเลือกใช้ชุดทดสอบ สมมติว่ามีชุดทดสอบที่เรียกว่า mytest (อันที่จริงไม่มี) ด้านบนนี้ เราใช้สคริปต์ ./test.py เพื่อทำการทดสอบหลายชุดพร้อมกัน ซึ่งเรียกโปรแกรมทดสอบซ้ำๆ นักวิ่งทดสอบ. เรียก นักวิ่งทดสอบ โดยตรงเพื่อทำการทดสอบหนึ่งครั้ง:

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

อาร์กิวเมนต์จะถูกส่งไปยังโปรแกรม นักวิ่งทดสอบ. เนื่องจากไม่มี mytest ข้อความแสดงข้อผิดพลาดจึงถูกสร้างขึ้น หากต้องการพิมพ์ตัวเลือกนักวิ่งทดสอบที่มีอยู่ ให้ป้อน:

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

3.6.2 การดีบัก

เพื่อรันโปรแกรม ns-3 ภายใต้ยูทิลิตี้อื่น เช่น ดีบักเกอร์ (เช่น จีดีบี) หรือเครื่องมือทดสอบหน่วยความจำ (เช่น วาลกริน) ใช้แบบฟอร์มที่คล้ายกัน - -command-template = "…". ตัวอย่างเช่น เพื่อรันในดีบักเกอร์ จีดีบี โปรแกรม hello-simulator ns-3 ของคุณพร้อมข้อโต้แย้ง:

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

โปรดทราบว่าชื่อโปรแกรม ns-3 มาพร้อมกับอาร์กิวเมนต์ - -runและยูทิลิตี้การจัดการ (ที่นี่ จีดีบี) เป็นโทเค็นแรกในการโต้แย้ง - -command-template. ตัวเลือก - -args รายงาน จีดีบีส่วนที่เหลือของบรรทัดคำสั่งเป็นของโปรแกรม "ต่ำกว่า" (บางเวอร์ชั่น จีดีบี ไม่เข้าใจตัวเลือก - -args. ในกรณีนี้ ให้ลบอาร์กิวเมนต์ของโปรแกรมออกจาก - -command-template และใช้ชุดคำสั่ง จีดีบี args.) เราสามารถรวมสูตรนี้และสูตรก่อนหน้าเพื่อทำการทดสอบภายใต้ดีบักเกอร์:

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

3.6.3 ไดเร็กทอรีการทำงาน

Waf ควรเปิดตัวจากตำแหน่งที่ด้านบนของแผนผัง ns-3 โฟลเดอร์นี้จะกลายเป็นไดเร็กทอรีการทำงานที่จะเขียนไฟล์เอาต์พุต แต่ถ้าคุณต้องการเก็บไฟล์เหล่านี้ไว้นอกแผนผังซอร์ส ns-3 ล่ะ? ใช้อาร์กิวเมนต์ - -cwd:

$ ./waf --cwd=...

คุณอาจพบว่าการรับไฟล์เอาท์พุตในไดเร็กทอรีการทำงานของคุณสะดวกกว่า ในกรณีนี้ การกระทำทางอ้อมต่อไปนี้สามารถช่วยได้:

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

การตกแต่งคำสั่งเวอร์ชันก่อนหน้านี้จะรักษาไดเร็กทอรีการทำงานปัจจุบันและไปที่ไดเร็กทอรี Wafแล้วจึงสั่งสอน Waf เพื่อเปลี่ยนไดเร็กทอรีการทำงานกลับไปเป็นไดเร็กทอรีการทำงานปัจจุบันที่บันทึกไว้ก่อนเริ่มโปรแกรม เราพูดถึงทีม - -cwd เพื่อความสมบูรณ์ ผู้ใช้ส่วนใหญ่เพียงเรียกใช้ Waf จากไดเร็กทอรีระดับบนสุดและสร้างไฟล์เอาต์พุตที่นั่น

ต่อ: บทที่ 4

ที่มา: will.com

เพิ่มความคิดเห็น