البرنامج التعليمي لمحاكاة الشبكة ns-3 الفصل 3

البرنامج التعليمي لمحاكاة الشبكة ns-3 الفصل 3
الفصل 1,2

3 البدء
3.1 نظرة عامة
3.2 المتطلبات الأساسية
3.2.1 تنزيل الإصدار ns-3 كأرشيف مصدر
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 نفسه، لذلك من المفيد أن يكون لديك كود المصدر لبناء المكتبات. إذا كان أي شخص يرغب في القيام بأعمال إنشاء مكتبات وحزم جاهزة لأنظمة التشغيل، يرجى الاتصال بالقائمة البريدية NS- المطورين.

بعد ذلك، سنلقي نظرة على ثلاث طرق لتنزيل وبناء ns-3. الأول هو تنزيل الإصدار الرسمي وإنشاءه من الموقع الرئيسي. والثاني هو اختيار وتجميع نسخ الإصدارات التطويرية للتثبيت الأساسي ns-3. والثالث هو استخدام أدوات بناء إضافية لتحميل المزيد من الملحقات لـ ns-3. سنستعرض كل واحدة منها نظرًا لاختلاف الأدوات قليلاً.

قد يتساءل مستخدمو Linux ذوو الخبرة عن سبب عدم توفير ns-3 كحزمة مثل معظم المكتبات الأخرى التي تستخدم مدير الحزم؟ على الرغم من وجود حزم ثنائية لتوزيعات Linux المختلفة (مثل Debian)، إلا أن معظم المستخدمين ينتهي بهم الأمر إلى تحرير المكتبات ويضطرون إلى إعادة بناء ns-3 بأنفسهم، لذا فإن توفر كود المصدر أمر سهل. لهذا السبب، سنركز على التثبيت من المصدر.

بالنسبة لمعظم التطبيقات حقوق NS-3 جذر ليست هناك حاجة إليها، فمن المستحسن استخدام حساب مستخدم لا يتمتع بأي امتيازات.

3.2 المتطلبات الأساسية

تحتوي المجموعة الكاملة من مكتبات ns-3 المتوفرة على عدد من التبعيات على مكتبات الطرف الثالث، ولكن في الغالب يمكن إنشاء ns-3 واستخدامه مع دعم العديد من المكونات الشائعة (غالبًا ما يتم تثبيتها افتراضيًا): مترجم C++، بايثون، محرر التعليمات البرمجية المصدر (على سبيل المثال، همة, ايماكس أو كسوف) وفي حالة استخدام مستودعات التطوير، أنظمة التحكم في إصدار Git. لن يحتاج معظم المستخدمين لأول مرة إلى القلق إذا أبلغت إعداداتهم عن فقدان بعض ميزات ns-3 المتقدمة، ولكن بالنسبة لأولئك الذين يريدون التثبيت الكامل، يوفر المشروع موقع wiki يتضمن صفحات تحتوي على الكثير من النصائح والحيل المفيدة. إحدى هذه الصفحات هي صفحة التثبيت، التي تحتوي على تعليمات التثبيت لمختلف الأنظمة، وهي متاحة على: https://www.nsnam.org/wiki/Installation.

يشرح قسم المتطلبات الأساسية في هذا الويكي الحزم المطلوبة لدعم خيارات ns-3 الشائعة ويوفر أيضًا الأوامر المستخدمة لتثبيتها على النكهات الشائعة لنظام التشغيل Linux أو macOS.

يمكنك الاستفادة من هذه الفرصة لاستكشاف صفحة wiki ns-3 أو الموقع الرئيسي: https://www.nsnam.org، لأن هناك الكثير من المعلومات هناك. بدءًا من الإصدار الأحدث من ns-3 (ns-3.29)، يلزم توفر الأدوات التالية لتشغيل ns-3:

حزمة الأداة/الإصدار

  • مترجم C++
    clang++ أو g++ (g++ الإصدار 4.9 أو أعلى)
  • بايثون
    إصدار python2 >= 2.7.10، أو إصدار python3 >=3.4
  • بوابة
    أي إصدار أحدث (للوصول إلى ns-3 على GitLab.com)
  • قطران
    أي إصدار أحدث (لتفريغ إصدار ns‑3)
  • بونزيب 2
    أي إصدار أحدث (لتفريغ إصدار ns‑3)

للتحقق من الإصدار الافتراضي من بايثون، اكتب python -V. للتحقق من إصدار g++، اكتب g++ -v. إذا كانت هناك أية أدوات مفقودة أو قديمة جدًا، فيرجى الرجوع إلى دليل التثبيت الموجود على صفحة ns-3 wiki.

من الآن فصاعدا، نفترض أن القارئ يعمل بنظام التشغيل Linux أو MacOS أو محاكي Linux، ولديه على الأقل الأدوات المذكورة أعلاه.

3.2.1 تنزيل الإصدار ns-3 كأرشيف مصدر

هذا هو مسار العمل للمستخدم الجديد الذي يريد تنزيل أحدث إصدار وإصدارات الحزمة من ns-3 وتجربتها. يتم نشر إصدارات ns-3 كمحفوظات مصدر مضغوطة، تسمى أحيانًا ns-XNUMX تاربال. تاربال هو تنسيق خاص لأرشيف البرامج يتم من خلاله دمج عدة ملفات معًا. عادة ما يتم ضغط الأرشيف. عملية التمهيد 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 

انتبه إلى الأداة المساعدة المستخدمة أعلاه مجلد مشترك، وهي أداة سطر أوامر لتنزيل الكائنات من الإنترنت. إذا لم تقم بتثبيته، يمكنك استخدام المتصفح الخاص بك لهذا الغرض.

باتباع هذه الخطوات سينقلك إلى الدليل 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-allinone. هذه مجموعة من البرامج النصية التي تدير التحميل والتجميع للأنظمة الفرعية 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-allinone يختلف قليلاً عن دليل أرشيف الإصدار الموضح أعلاه. يجب أن يبدو مثل هذا:

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

يرجى ملاحظة أن هناك برنامج نصي download.py، والذي سيستخرج بالإضافة إلى ذلك ns-3 وكود المصدر المصاحب له. هنا لديك خيار: إما تنزيل أحدث لقطة تطوير ns-3:

$ python download.py

أو تفضل إصدار ns-3 باستخدام العلم -n للإشارة إلى رقم الإصدار:

$ python download.py -n ns-3.29

بعد هذه الخطوة إلى الدليل ns-3-allinone سيتم تنزيل مستودعات إضافية نس-3, خبز, pybindgen и netanim.

لاحظ
على جهاز يعمل بنظام Ubuntu16.04 النظيف، كنت بحاجة إلى تغيير الأمر إلى هذا: $ sudo python3 download.py -n ns-3.29 (فيما يلي ملاحظات المترجم).

3.3.1 تحميل ns-3 باستخدام Bake

الطريقتان أعلاه (أرشيف المصدر أو المستودع ns-3-allinone عبر Git) مفيدة للحصول على أبسط تثبيت ns-3 مع إضافات متعددة (pybindgen لإنشاء روابط بايثون و netanim للرسوم المتحركة على الشبكة). يُطلق على المستودع الثالث الذي يتم توفيره افتراضيًا في ns-3-allinone خبز.

خبز هي أداة للبناء المنسق للبرامج من مستودعات متعددة، تم تطويرها لمشروع NS-3. خبز يمكن استخدامها للحصول على إصدارات تطوير ns-3، وكذلك لتنزيل وبناء امتدادات الإصدار الأساسي لتوزيع ns-3، مثل البيئة تنفيذ التعليمات البرمجية المباشرة, CradleNetwork محاكاة المهد، والقدرة على إنشاء روابط Python جديدة ومختلف "تطبيقات" ns-3.

لاحظ
CradleNetwork Simulation Cradle هو إطار عمل يسمح لك باستخدام مكدسات شبكة TCP/IP الحقيقية داخل جهاز محاكاة الشبكة.

إذا كنت تتوقع أن يشتمل تثبيت ns-3 على ميزات متقدمة أو إضافية، فيمكنك اتباع مسار التثبيت هذا.

في أحدث إصدارات NS-3 خبز تمت إضافته إلى إصدار القطران. يتضمن الإصدار ملف تكوين يسمح لك بتنزيل إصدارات البرنامج الحالية في وقت الإصدار. وهذا هو، على سبيل المثال، الإصدار خبز، والذي تم توزيعه مع الإصدار 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

لاحظ أنك قمت بتحميل العديد من نصوص بايثون، وهي وحدة بايثون اسمها خبز وملف تكوين XML. الخطوة التالية هي استخدام هذه البرامج النصية لتنزيل وإنشاء توزيعة ns-3 التي تختارها. تتوفر العديد من أهداف التخصيص:

  1. نس-3.29: الوحدة المقابلة للإصدار؛ سيتم تنزيل مكونات مشابهة للإصدار الموجود في كرة القطران؛

  2. ns-3-dev: وحدة مماثلة، ولكن باستخدام التعليمات البرمجية من شجرة التطوير؛

  3. NS- ألينون 3.29: وحدة تتضمن ميزات إضافية أخرى مثل Click routing وNetwork Simulation Cradle وOpenflow for ns-3.

  4. ns-3-allinone: مشابه لنسخة إصدار الوحدة 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 عن طريق تحميل مصادر الحزمة في الدليل مصدر وتثبيت المكتبات في دليل البناء. خبز يمكن تشغيله من خلال الرجوع إلى الملف الثنائي، ولكن إذا كنت تريد تشغيله خبز ليس من الدليل الذي تم تنزيله فيه، فمن المستحسن إضافة المسار إليه خبز إلى المسار الخاص بك (متغير بيئة PATH)، على سبيل المثال كما يلي (مثال لـ Linux bash Shell). انتقل إلى دليل "الخبز" ثم قم بتعيين متغيرات البيئة التالية:

$ 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

تحذير! خطوة البناء هذه متاحة فقط من إصدار الأرشيف المصدر الذي تم الحصول عليه كما هو موضح أعلاه؛ ولا يتم تنزيله عبر بوابة أو خبز.

عند العمل مع أرشيف الإصدار تاربالفي ns-3-allinone يوجد برنامج نصي مفيد يمكن أن يجعل تجميع المكونات أسهل. يطلق عليه build.py. سيقوم هذا البرنامج بإعداد المشروع لك بالطريقة الأكثر فائدة. ومع ذلك، لاحظ أن الإعداد والعمل الأكثر تقدمًا مع ns-3 يتضمن عادةً استخدام نظام البناء الخاص بـ ns-3، Waf، والذي سيتم تقديمه لاحقًا في هذا البرنامج التعليمي.

إذا قمت بالتنزيل باستخدام تاربال، ثم في الدليل الخاص بك ~ / مساحة العمل دليل باسم شيء من هذا القبيل NS- ألينون 3.29. أدخل التالي:

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

عند الاتصال build.py لقد استخدمنا وسيطات سطر الأوامر لبناء الأمثلة والاختبارات المستخدمة في هذا البرنامج التعليمي، والتي لم يتم إنشاؤها افتراضيًا في ns-3. افتراضيًا، يقوم البرنامج أيضًا ببناء كافة الوحدات المتوفرة. وبعد ذلك، إذا كنت ترغب في ذلك، يمكنك إنشاء ns-3 بدون أمثلة واختبارات، أو استبعاد الوحدات غير الضرورية لعملك.

ستشاهد الكثير من رسائل إخراج المترجم معروضة بواسطة البرنامج النصي أثناء قيامه ببناء الأجزاء المختلفة التي قمت بتحميلها. أولاً سيحاول البرنامج النصي إنشاء الرسوم المتحركة netanim، ثم مولد الربط pybindgen وأخيرا 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 Publish".

قد يفشل تجميع كافة المكونات، لكن التجميع سيستمر إذا لم يكن أحد المكونات مطلوبًا. على سبيل المثال، كانت مشكلة قابلية النقل الأخيرة هي ذلك com.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.

لكن com.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، يجب أن تكون المكتبة موجودة على النظام ليبكسمل-2.0. إذا لم يتم العثور على هذه المكتبة ولم يتم تمكين وظيفة ns-3 المقابلة، فسيتم عرض رسالة. لاحظ أيضًا أنه من الممكن استخدام الأمر سودو لتعيين البت suid "تعيين معرف المجموعة في وقت التشغيل" لبرامج معينة. لا يتم تمكينها افتراضيًا، وبالتالي تظهر هذه الميزة على أنها "غير ممكّنة". وأخيرًا، للحصول على قائمة بالخيارات الممكّنة، استخدم 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 بتكوين بنيته للتعامل مع كافة التحذيرات كأخطاء، لذلك في بعض الأحيان إذا كنت تقوم بتشغيل إصدار أقدم على نظام أحدث، فقد يؤدي تحذير المترجم إلى إيقاف البناء.

على سبيل المثال، كان هناك سابقًا إصدار ns-3.28 لـ Fedora 28، والذي تضمن إصدارًا رئيسيًا جديدًا دول مجلس التعاون الخليجي (مجلس التعاون الخليجي 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 استخدام سودو، كما هو موضح أعلاه. سيؤدي هذا إلى تجاوز أوامر خطوة التكوين، وبالتالي يمكنك تغيير التكوين باستخدام الأمر التالي، والذي يتضمن أيضًا أمثلة واختبارات.

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

إذا قمت بذلك WAF ستطلق سودولتغيير برامج إنشاء مأخذ توصيل التعليمات البرمجية للتشغيل مع الأذونات جذر. في WAF هناك العديد من الخيارات الأخرى المتاحة لخطوات التكوين والبناء. لاستكشاف خياراتك، أدخل:

$ ./waf --help

في القسم التالي سوف نستخدم بعض الخيارات المتعلقة بالاختبار.

ملفات تعريف التجميع

لقد رأينا بالفعل كيف يمكنك تكوين WAF للجمعيات تصحيح и الأمثل:

$ ./waf --build-profile=debug

يوجد أيضًا ملف تعريف تجميع وسيط، الافراج عن. خيار -d مرادف لـ --build-profile. يتحكم ملف تعريف البناء في استخدام التسجيل والتأكيدات ومفاتيح تحسين المترجم:

البرنامج التعليمي لمحاكاة الشبكة ns-3 الفصل 3

كما ترون، التسجيل والتأكيدات متاحة فقط في إصدارات تصحيح الأخطاء. الممارسة الموصى بها هي تطوير البرنامج النصي الخاص بك في وضع التصحيح، ثم إجراء عمليات تشغيل متكررة (للإحصائيات أو تغييرات المعلمات) في ملف تعريف بناء محسّن.

إذا كان لديك تعليمات برمجية يجب تشغيلها فقط في ملفات تعريف بناء معينة، فاستخدم Code Wrapper Macro:

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 أماكن بناء القطع الأثرية في دليل البناء. يمكنك تحديد دليل إخراج مختلف باستخدام الخيار - -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++ من دول مجلس التعاون الخليجي ( ز ++). ومع ذلك، يمكنك تغيير النوع الذي تستخدمه WAF مترجم C++، من خلال تحديد متغير البيئة CXX. على سبيل المثال، لاستخدام مترجم C++ Clang، clang++،

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

بنفس الطريقة يمكنك تكوين WAF لاستخدام التجميع الموزع باستخدام com.distcc:

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

يمكن العثور على مزيد من المعلومات حول distcc والتجميع الموزع على صفحة المشروع في قسم الوثائق. لإضافة إشارات برنامج التحويل البرمجي عند تكوين ns-3، استخدم متغير البيئة CXXFLAGS_EXTRA.

تركيب

WAF يمكن استخدامها لتثبيت المكتبات في أماكن مختلفة على النظام. بشكل افتراضي، توجد المكتبات المترجمة والملفات التنفيذية في الدليل نساعدك في بناءوبما أن Waf يعرف موقع هذه المكتبات والملفات التنفيذية، فلا داعي لتثبيت المكتبات في أي مكان آخر.

إذا كان المستخدمون يفضلون التثبيت خارج دليل البناء، فيمكنهم تشغيل الأمر ./waf تثبيت. البادئة الافتراضية للتثبيت هي / البيرة / المحليةهكذا ./waf تثبيت سيتم تثبيت البرامج في / البيرة / المحلية / بن، المكتبات في / البيرة / المحلية / ليب وملفات الرأس في / usr / local / include. عادةً ما تحتاج حقوق المستخدم المتميز إلى تعيينها باستخدام بادئة افتراضية، لذلك سيكون الأمر النموذجي هو ذلك تثبيت سودو ./waf. عند إطلاقه، سيختار Waf أولاً استخدام المكتبات المشتركة في دليل البناء، ثم يبحث عن المكتبات على طول المسار المؤدي إلى المكتبات التي تم تكوينها في البيئة المحلية. لذلك، عند تثبيت المكتبات على النظام، من الممارسات الجيدة التحقق من استخدام المكتبات الصحيحة. يمكن للمستخدمين اختيار التثبيت ببادئة مختلفة عن طريق تمرير الخيار أثناء التكوين --prefixعلى سبيل المثال:

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

إذا قام المستخدم لاحقًا، بعد الإنشاء، بإدخال أمر التثبيت ./waf، سيتم استخدام البادئة / اختيار / محلي.

فريق ./waf clean يجب استخدامه قبل إعادة تكوين المشروع إذا كان سيتم استخدام التثبيت WAF تحت بادئة مختلفة.

وبالتالي، لاستخدام ns-3 ليست هناك حاجة للاتصال ./waf install. لن يحتاج معظم المستخدمين إلى هذا الأمر لأنه WAF سيلتقط المكتبات الحالية من دليل البناء، ولكن قد يجد بعض المستخدمين هذا مفيدًا إذا كانت أنشطتهم تتضمن العمل مع برامج خارج دليل ns-3.

واف مفردة

في المستوى العلوي من شجرة المصدر ns-3، يوجد نص Waf واحد فقط. بمجرد البدء في العمل، سوف تقضي الكثير من الوقت في الدليل scratch/ أو أعمق فيهsrc/... وفي نفس الوقت يجب أن تعمل WAF. يمكنك فقط أن تتذكر مكانك والهرب WAF على النحو التالي:

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

ولكن هذا سيكون مملاً وعرضة للخطأ، لذلك هناك حلول أفضل. إحدى الطرق الشائعة هي استخدام محرر نصوص مثل ايماكس أو همة، حيث يتم فتح جلستين طرفيتين، واحدة تستخدم لبناء 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 بشكل صحيح. (لاحظ أن ترتيب أسطر "الاجتياز: ..." قد يكون مختلفًا، وهذا أمر طبيعي. المهم هو أن سطر الملخص الموجود في نهاية التقرير يوضح أن جميع الاختبارات قد تم اجتيازها، ولم تفشل أي اختبارات أو تعطلت.) و WAFو test.py سوف توازي العمل عبر مراكز المعالج المتاحة للجهاز.

3.6 تشغيل البرنامج النصي

نقوم عادةً بتشغيل البرامج النصية تحت السيطرة WAF. يتيح ذلك لنظام الإنشاء التأكد من تعيين مسارات المكتبة المشتركة بشكل صحيح وأن المكتبات متاحة في وقت التشغيل. لتشغيل البرنامج، ما عليك سوى استخدام WAF مع المعلمة - -run. لنقم بتشغيل ما يعادل ns-3 للبرنامج واسع الانتشار مرحبا العالموذلك بكتابة ما يلي:

$ ./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 واستخدم مجموعة الأوامر جدب وسائط.) يمكننا الجمع بين هذه الوصفة والوصفة السابقة لإجراء الاختبار تحت مصحح الأخطاء:

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

المصدر: www.habr.com

إضافة تعليق